Skip to content

Commit 1fe2f2d

Browse files
committed
fix(cli): enhance version retrieval for yarn and improve test structure
1 parent 3b6cff6 commit 1fe2f2d

File tree

3 files changed

+95
-74
lines changed

3 files changed

+95
-74
lines changed

packages/tools/kolibri-cli/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
"restart": "pnpm reset && pnpm start",
3131
"unused": "knip",
3232
"watch": "nodemon --ignore package.json src/index.ts migrate --ignore-uncommitted-changes --test-tasks test",
33-
"test": "pnpm test:unit",
34-
"test:unit": "TS_NODE_PROJECT=tsconfig.test.json mocha --require ts-node/register test/**/*.ts"
33+
"test": "pnpm test:unit",
34+
"test:unit": "TS_NODE_PROJECT=tsconfig.test.json mocha --require ts-node/register test/**/*.ts"
3535
},
3636
"type": "commonjs",
3737
"dependencies": {

packages/tools/kolibri-cli/src/info/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ import { PackageJson } from '../types';
88
// Function to get the binary version
99
const getBinaryVersion = (command: string): string => {
1010
try {
11+
// For yarn, use a temporary directory to prevent package.json modification
12+
// Yarn with Corepack automatically adds packageManager field when executed
13+
if (command === 'yarn') {
14+
const originalCwd = process.cwd();
15+
const tmpDir = os.tmpdir();
16+
process.chdir(tmpDir);
17+
try {
18+
return execSync(`${command} --version`, { encoding: 'utf8' }).trim();
19+
} finally {
20+
process.chdir(originalCwd);
21+
}
22+
}
23+
1124
return execSync(`${command} --version`, { encoding: 'utf8' }).trim();
1225
} catch {
1326
return 'N/A';

packages/tools/kolibri-cli/test/cli-interface.spec.ts

Lines changed: 80 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -10,87 +10,95 @@ import { getRemoveMode, setRemoveMode } from '../src/migrate/shares/reuse';
1010
import { TaskRunner } from '../src/migrate/runner/task-runner';
1111

1212
describe('CLI interface', () => {
13-
it('runs generate-scss command', () => {
14-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
15-
const cwd = process.cwd();
16-
process.chdir(tmpDir);
13+
it('runs generate-scss command', () => {
14+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
15+
const cwd = process.cwd();
16+
process.chdir(tmpDir);
1717

18-
const typedBem = require('typed-bem/scss');
19-
const original = typedBem.generateBemScssFile;
20-
const calls: string[] = [];
21-
typedBem.generateBemScssFile = (_: unknown, name: string) => { calls.push(name); };
18+
const typedBem = require('typed-bem/scss');
19+
const original = typedBem.generateBemScssFile;
20+
const calls: string[] = [];
21+
typedBem.generateBemScssFile = (_: unknown, name: string) => {
22+
calls.push(name);
23+
};
2224

23-
const program = new Command();
24-
generateScss(program);
25-
program.parse(['node', 'cli', 'generate-scss']);
25+
const program = new Command();
26+
generateScss(program);
27+
program.parse(['node', 'cli', 'generate-scss']);
2628

27-
typedBem.generateBemScssFile = original;
28-
process.chdir(cwd);
29+
typedBem.generateBemScssFile = original;
30+
process.chdir(cwd);
2931

30-
assert.deepStrictEqual(calls, ['alert', 'icon']);
31-
});
32+
assert.deepStrictEqual(calls, ['alert', 'icon']);
33+
});
3234

33-
it('runs info command', () => {
34-
const program = new Command();
35-
info(program);
36-
let output = '';
37-
const original = console.log;
38-
console.log = (str: string) => { output += str; };
39-
program.parse(['node', 'cli', 'info']);
40-
console.log = original;
41-
assert.ok(output.includes('Operating System'));
42-
});
35+
it('runs info command', () => {
36+
const program = new Command();
37+
info(program);
38+
let output = '';
39+
const original = console.log;
40+
console.log = (str: string) => {
41+
output += str;
42+
};
43+
program.parse(['node', 'cli', 'info']);
44+
console.log = original;
45+
assert.ok(output.includes('Operating System'));
46+
});
4347

44-
it('runs migrate command with options', () => {
45-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
46-
fs.writeFileSync(
47-
path.join(tmpDir, 'package.json'),
48-
JSON.stringify({ dependencies: { '@public-ui/components': '0.0.0' }, devDependencies: { '@public-ui/kolibri-cli': '0.0.0' } }),
49-
);
50-
fs.writeFileSync(path.join(tmpDir, 'pnpm-lock.yaml'), '');
51-
const cwd = process.cwd();
52-
process.chdir(tmpDir);
48+
it('runs migrate command with options', () => {
49+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
50+
fs.writeFileSync(
51+
path.join(tmpDir, 'package.json'),
52+
JSON.stringify({ dependencies: { '@public-ui/components': '0.0.0' }, devDependencies: { '@public-ui/kolibri-cli': '0.0.0' } }),
53+
);
54+
fs.writeFileSync(path.join(tmpDir, 'pnpm-lock.yaml'), '');
55+
const cwd = process.cwd();
5356

54-
55-
const childProc = require('child_process');
56-
const execOrig = childProc.exec;
57-
(childProc as any).exec = (_: string, cb: (err: null, out: string) => void) => cb(null, '');
57+
try {
58+
process.chdir(tmpDir);
5859

59-
let runCalled = false;
60-
const runOrig = TaskRunner.prototype.run;
61-
TaskRunner.prototype.run = function () {
62-
runCalled = true;
63-
};
64-
const getStatusOrig = TaskRunner.prototype.getStatus;
65-
TaskRunner.prototype.getStatus = () => ({ total: 0, done: 0, pending: 0, nextVersion: '0.0.0', config: { migrate: { tasks: {} } } });
66-
const getPendingOrig = TaskRunner.prototype.getPendingMinVersion;
67-
TaskRunner.prototype.getPendingMinVersion = () => '0.0.0';
60+
const childProc = require('child_process');
61+
const execOrig = childProc.exec;
62+
(childProc as any).exec = (_: string, cb: (err: null, out: string) => void) => cb(null, '');
6863

69-
const program = new Command();
70-
migrate(program);
71-
program.parse([
72-
'node',
73-
'cli',
74-
'migrate',
75-
'.',
76-
'--ignore-uncommitted-changes',
77-
'--overwrite-current-version',
78-
'0.0.0',
79-
'--overwrite-target-version',
80-
'0.0.0',
81-
'--remove-mode',
82-
'delete',
83-
'--test-tasks',
84-
]);
64+
let runCalled = false;
65+
const runOrig = TaskRunner.prototype.run;
66+
TaskRunner.prototype.run = function () {
67+
runCalled = true;
68+
};
69+
const getStatusOrig = TaskRunner.prototype.getStatus;
70+
TaskRunner.prototype.getStatus = () => ({ total: 0, done: 0, pending: 0, nextVersion: '0.0.0', config: { migrate: { tasks: {} } } });
71+
const getPendingOrig = TaskRunner.prototype.getPendingMinVersion;
72+
TaskRunner.prototype.getPendingMinVersion = () => '0.0.0';
8573

86-
(childProc as any).exec = execOrig;
87-
TaskRunner.prototype.run = runOrig;
88-
TaskRunner.prototype.getStatus = getStatusOrig;
89-
TaskRunner.prototype.getPendingMinVersion = getPendingOrig;
90-
process.chdir(cwd);
74+
const program = new Command();
75+
migrate(program);
76+
program.parse([
77+
'node',
78+
'cli',
79+
'migrate',
80+
'.',
81+
'--ignore-uncommitted-changes',
82+
'--overwrite-current-version',
83+
'0.0.0',
84+
'--overwrite-target-version',
85+
'0.0.0',
86+
'--remove-mode',
87+
'delete',
88+
'--test-tasks',
89+
]);
9190

92-
assert.ok(runCalled);
93-
assert.equal(getRemoveMode(), 'delete');
94-
setRemoveMode('prefix');
95-
});
91+
(childProc as any).exec = execOrig;
92+
TaskRunner.prototype.run = runOrig;
93+
TaskRunner.prototype.getStatus = getStatusOrig;
94+
TaskRunner.prototype.getPendingMinVersion = getPendingOrig;
95+
96+
assert.ok(runCalled);
97+
assert.equal(getRemoveMode(), 'delete');
98+
setRemoveMode('prefix');
99+
} finally {
100+
// Always restore working directory
101+
process.chdir(cwd);
102+
}
103+
});
96104
});

0 commit comments

Comments
 (0)