@nlabs/lex 1.46.2 → 1.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/LexConfig.js +20 -0
- package/__mocks__/boxen.js +7 -0
- package/__mocks__/build.js +16 -0
- package/__mocks__/chalk.js +23 -0
- package/__mocks__/compile.js +8 -0
- package/__mocks__/execa.js +21 -0
- package/__mocks__/ora.js +17 -0
- package/__mocks__/versions.js +12 -0
- package/dist/LexConfig.js +72 -14
- package/dist/commands/ai/ai.js +303 -0
- package/dist/commands/ai/index.js +7 -0
- package/dist/commands/build/build.js +350 -0
- package/dist/commands/clean/clean.js +31 -0
- package/dist/commands/compile/compile.js +195 -0
- package/dist/commands/config/config.js +43 -0
- package/dist/commands/copy/copy.js +38 -0
- package/dist/commands/create/create.js +124 -0
- package/dist/commands/dev/dev.js +70 -0
- package/dist/commands/init/init.js +93 -0
- package/dist/commands/link/link.js +15 -0
- package/dist/commands/lint/lint.js +656 -0
- package/dist/commands/migrate/migrate.js +37 -0
- package/dist/commands/publish/publish.js +104 -0
- package/dist/commands/test/test.js +327 -0
- package/dist/commands/update/update.js +62 -0
- package/dist/commands/upgrade/upgrade.js +47 -0
- package/dist/commands/versions/versions.js +41 -0
- package/dist/create/changelog.js +3 -3
- package/dist/index.js +35 -0
- package/dist/jest.config.lex.d.ts +2 -0
- package/dist/lex.js +25 -22
- package/dist/types.js +1 -0
- package/dist/utils/aiService.js +290 -0
- package/dist/utils/app.js +3 -3
- package/dist/utils/file.js +1 -1
- package/dist/utils/log.js +2 -1
- package/dist/utils/reactShim.js +3 -3
- package/dist/webpack.config.d.ts +2 -0
- package/eslint.config.js +10 -0
- package/index.cjs +20 -0
- package/jest.config.cjs +31 -27
- package/jest.config.lex.js +90 -38
- package/jest.setup.js +5 -0
- package/lex.config.js +50 -0
- package/package.json +69 -52
- package/{.postcssrc.js → postcss.config.js} +21 -9
- package/tsconfig.json +2 -1
- package/webpack.config.js +27 -11
- package/dist/commands/build.js +0 -265
- package/dist/commands/bulid.test.js +0 -317
- package/dist/commands/clean.js +0 -31
- package/dist/commands/clean.test.js +0 -63
- package/dist/commands/compile.js +0 -195
- package/dist/commands/compile.test.js +0 -93
- package/dist/commands/config.js +0 -43
- package/dist/commands/copy.js +0 -38
- package/dist/commands/create.js +0 -120
- package/dist/commands/dev.js +0 -70
- package/dist/commands/init.js +0 -93
- package/dist/commands/link.js +0 -15
- package/dist/commands/lint.js +0 -179
- package/dist/commands/migrate.js +0 -37
- package/dist/commands/publish.js +0 -104
- package/dist/commands/test.js +0 -190
- package/dist/commands/update.js +0 -64
- package/dist/commands/upgrade.js +0 -47
- package/dist/commands/versions.js +0 -41
- package/dist/commands/versions.test.js +0 -49
- package/dist/lint.js +0 -11
- package/jest.setup.ts +0 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { LexConfig } from "../../LexConfig.js";
|
|
3
|
+
import { createSpinner, getPackageJson, removeConflictModules, removeModules } from "../../utils/app.js";
|
|
4
|
+
import { log } from "../../utils/log.js";
|
|
5
|
+
const migrate = async (cmd, callback = process.exit) => {
|
|
6
|
+
const { cliName = "Lex", packageManager: cmdPackageManager, quiet } = cmd;
|
|
7
|
+
const cwd = process.cwd();
|
|
8
|
+
const spinner = createSpinner(quiet);
|
|
9
|
+
spinner.start("Removing node modules...");
|
|
10
|
+
await removeModules();
|
|
11
|
+
const { packageManager: configPackageManager } = LexConfig.config;
|
|
12
|
+
const packageManager = cmdPackageManager || configPackageManager;
|
|
13
|
+
const packagePath = `${cwd}/package.json`;
|
|
14
|
+
const appPackage = getPackageJson(packagePath);
|
|
15
|
+
const { dependencies = {}, devDependencies = {} } = appPackage;
|
|
16
|
+
appPackage.dependencies = removeConflictModules(dependencies);
|
|
17
|
+
appPackage.devDependencies = removeConflictModules(devDependencies);
|
|
18
|
+
try {
|
|
19
|
+
await execa(packageManager, ["install"], {
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
stdio: "inherit"
|
|
22
|
+
});
|
|
23
|
+
spinner.succeed("Successfully migrated app!");
|
|
24
|
+
callback(0);
|
|
25
|
+
return 0;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
log(`
|
|
28
|
+
${cliName} Error: ${error.message}`, "error", quiet);
|
|
29
|
+
spinner.fail("Failed to remove modules.");
|
|
30
|
+
callback(1);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
export {
|
|
35
|
+
migrate
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL21pZ3JhdGUvbWlncmF0ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIGdldFBhY2thZ2VKc29uLCByZW1vdmVDb25mbGljdE1vZHVsZXMsIHJlbW92ZU1vZHVsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhY2thZ2VNYW5hZ2VyPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE1pZ3JhdGVDYWxsYmFjayA9IHR5cGVvZiBwcm9jZXNzLmV4aXQ7XG5cbmV4cG9ydCBjb25zdCBtaWdyYXRlID0gYXN5bmMgKGNtZDogTWlncmF0ZU9wdGlvbnMsIGNhbGxiYWNrOiBNaWdyYXRlQ2FsbGJhY2sgPSBwcm9jZXNzLmV4aXQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBwYWNrYWdlTWFuYWdlcjogY21kUGFja2FnZU1hbmFnZXIsIHF1aWV0fSA9IGNtZDtcblxuICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gLy8gRGlzcGxheSBtZXNzYWdlXG4gIC8vIGxvZyhgJHtjbGlOYW1lfSBjb3B5aW5nIFwiJHt0b31cIi4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIC8vIFNwaW5uZXJcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuICBzcGlubmVyLnN0YXJ0KCdSZW1vdmluZyBub2RlIG1vZHVsZXMuLi4nKTtcblxuICAvLyBSZW1vdmUgbm9kZV9tb2R1bGVzXG4gIGF3YWl0IHJlbW92ZU1vZHVsZXMoKTtcblxuICBjb25zdCB7cGFja2FnZU1hbmFnZXI6IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyfSA9IExleENvbmZpZy5jb25maWc7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyOiBzdHJpbmcgPSBjbWRQYWNrYWdlTWFuYWdlciB8fCBjb25maWdQYWNrYWdlTWFuYWdlcjtcbiAgY29uc3QgcGFja2FnZVBhdGg6IHN0cmluZyA9IGAke2N3ZH0vcGFja2FnZS5qc29uYDtcbiAgY29uc3QgYXBwUGFja2FnZSA9IGdldFBhY2thZ2VKc29uKHBhY2thZ2VQYXRoKTtcbiAgY29uc3Qge2RlcGVuZGVuY2llcyA9IHt9LCBkZXZEZXBlbmRlbmNpZXMgPSB7fX0gPSBhcHBQYWNrYWdlO1xuXG4gIC8vIFJlbW92ZSBFU0J1aWxkLCBKZXN0IGFuZCBXZWJwYWNrIGZyb20gYXBwIHNpbmNlIGl0IHdpbGwgY29uZmxpY3RcbiAgYXBwUGFja2FnZS5kZXBlbmRlbmNpZXMgPSByZW1vdmVDb25mbGljdE1vZHVsZXMoZGVwZW5kZW5jaWVzKTtcbiAgYXBwUGFja2FnZS5kZXZEZXBlbmRlbmNpZXMgPSByZW1vdmVDb25mbGljdE1vZHVsZXMoZGV2RGVwZW5kZW5jaWVzKTtcblxuICAvLyBJbnN0YWxsIG5ldyBsaXN0IG9mIHBhY2thZ2VzXG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY2EocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86ICdpbmhlcml0J1xuICAgIH0pO1xuXG4gICAgLy8gU3RvcCBsb2FkZXJcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBtaWdyYXRlZCBhcHAhJyk7XG5cbiAgICAvLyBLaWxsIHByb2Nlc3NcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZVxuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIC8vIFN0b3Agc3Bpbm5lclxuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHJlbW92ZSBtb2R1bGVzLicpO1xuXG4gICAgLy8gS2lsbCBwcm9jZXNzXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxhQUFZO0FBRXBCLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEsZUFBZSxnQkFBZ0IsdUJBQXVCLHFCQUFvQjtBQUNsRixTQUFRLFdBQVU7QUFVWCxNQUFNLFVBQVUsT0FBTyxLQUFxQixXQUE0QixRQUFRLFNBQTBCO0FBQy9HLFFBQU0sRUFBQyxVQUFVLE9BQU8sZ0JBQWdCLG1CQUFtQixNQUFLLElBQUk7QUFFcEUsUUFBTSxNQUFjLFFBQVEsSUFBSTtBQU1oQyxRQUFNLFVBQVUsY0FBYyxLQUFLO0FBQ25DLFVBQVEsTUFBTSwwQkFBMEI7QUFHeEMsUUFBTSxjQUFjO0FBRXBCLFFBQU0sRUFBQyxnQkFBZ0IscUJBQW9CLElBQUksVUFBVTtBQUN6RCxRQUFNLGlCQUF5QixxQkFBcUI7QUFDcEQsUUFBTSxjQUFzQixHQUFHLEdBQUc7QUFDbEMsUUFBTSxhQUFhLGVBQWUsV0FBVztBQUM3QyxRQUFNLEVBQUMsZUFBZSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsRUFBQyxJQUFJO0FBR2xELGFBQVcsZUFBZSxzQkFBc0IsWUFBWTtBQUM1RCxhQUFXLGtCQUFrQixzQkFBc0IsZUFBZTtBQUdsRSxNQUFJO0FBQ0YsVUFBTSxNQUFNLGdCQUFnQixDQUFDLFNBQVMsR0FBRztBQUFBLE1BQ3ZDLFVBQVU7QUFBQSxNQUNWLE9BQU87QUFBQSxJQUNULENBQUM7QUFHRCxZQUFRLFFBQVEsNEJBQTRCO0FBRzVDLGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNULFNBQVEsT0FBTztBQUViLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFHMUQsWUFBUSxLQUFLLDJCQUEyQjtBQUd4QyxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import semver from "semver";
|
|
3
|
+
import { LexConfig } from "../../LexConfig.js";
|
|
4
|
+
import { createSpinner, getPackageJson, setPackageJson } from "../../utils/app.js";
|
|
5
|
+
import { log } from "../../utils/log.js";
|
|
6
|
+
const publish = async (cmd, callback = process.exit) => {
|
|
7
|
+
const { bump, cliName = "Lex", newVersion, otp, packageManager: cmdPackageManager, private: accessPrivate, tag, quiet } = cmd;
|
|
8
|
+
log(`${cliName} publishing npm module...`, "info", quiet);
|
|
9
|
+
const spinner = createSpinner(quiet);
|
|
10
|
+
await LexConfig.parseConfig(cmd);
|
|
11
|
+
const { packageManager: configPackageManager } = LexConfig.config;
|
|
12
|
+
const packageManager = cmdPackageManager || configPackageManager;
|
|
13
|
+
const publishOptions = ["publish"];
|
|
14
|
+
if (accessPrivate) {
|
|
15
|
+
publishOptions.push("--access", "restricted");
|
|
16
|
+
}
|
|
17
|
+
if (otp) {
|
|
18
|
+
publishOptions.push("--otp", otp);
|
|
19
|
+
}
|
|
20
|
+
if (tag) {
|
|
21
|
+
publishOptions.push("--tag", tag);
|
|
22
|
+
}
|
|
23
|
+
let nextVersion;
|
|
24
|
+
const packagePath = `${process.cwd()}/package.json`;
|
|
25
|
+
let packageJson;
|
|
26
|
+
let packageName;
|
|
27
|
+
let prevVersion;
|
|
28
|
+
try {
|
|
29
|
+
packageJson = getPackageJson(packagePath);
|
|
30
|
+
packageName = packageJson.name;
|
|
31
|
+
prevVersion = packageJson.version;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
log(`
|
|
34
|
+
${cliName} Error: The file, ${packagePath}, was not found or is malformed.
|
|
35
|
+
`, "error", quiet);
|
|
36
|
+
log(error.message, "error");
|
|
37
|
+
callback(1);
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
if (newVersion) {
|
|
41
|
+
nextVersion = newVersion;
|
|
42
|
+
} else if (bump) {
|
|
43
|
+
const formatBump = bump.toString().trim().toLowerCase();
|
|
44
|
+
if (formatBump) {
|
|
45
|
+
const validReleases = ["major", "minor", "patch"];
|
|
46
|
+
const validPreReleases = ["alpha", "beta", "rc"];
|
|
47
|
+
const packageVersion = semver.coerce(prevVersion);
|
|
48
|
+
if (!semver.valid(packageVersion)) {
|
|
49
|
+
log(`
|
|
50
|
+
${cliName} Error: Version is invalid in package.json`, "error", quiet);
|
|
51
|
+
callback(1);
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
if (validReleases.includes(formatBump)) {
|
|
55
|
+
nextVersion = semver.inc(packageVersion, formatBump);
|
|
56
|
+
} else if (validPreReleases.includes(formatBump)) {
|
|
57
|
+
nextVersion = semver.inc(packageVersion, "prerelease", formatBump);
|
|
58
|
+
} else {
|
|
59
|
+
log(`
|
|
60
|
+
${cliName} Error: Bump type is invalid. please make sure it is one of the following: ${validReleases.join(", ")}, ${validPreReleases.join(", ")}`, "error", quiet);
|
|
61
|
+
callback(1);
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
log(`
|
|
66
|
+
${cliName} Error: Bump type is missing.`, "error", quiet);
|
|
67
|
+
callback(1);
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (nextVersion && packageManager === "yarn") {
|
|
72
|
+
publishOptions.push("--new-version", nextVersion);
|
|
73
|
+
} else if (nextVersion && packageJson) {
|
|
74
|
+
try {
|
|
75
|
+
setPackageJson({ ...packageJson, version: nextVersion }, packagePath);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
log(`
|
|
78
|
+
${cliName} Error: The file, ${packagePath}, was not found or is malformed. ${error.message}`, "error", quiet);
|
|
79
|
+
callback(1);
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
nextVersion = prevVersion;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
await execa(packageManager, publishOptions, {
|
|
87
|
+
encoding: "utf8",
|
|
88
|
+
stdio: "inherit"
|
|
89
|
+
});
|
|
90
|
+
spinner.succeed(`Successfully published npm package: ${packageName}!`);
|
|
91
|
+
callback(0);
|
|
92
|
+
return 0;
|
|
93
|
+
} catch (error) {
|
|
94
|
+
log(`
|
|
95
|
+
${cliName} Error: ${error.message}`, "error", quiet);
|
|
96
|
+
spinner.fail("Publishing to npm has failed.");
|
|
97
|
+
callback(1);
|
|
98
|
+
return 1;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
export {
|
|
102
|
+
publish
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3B1Ymxpc2gvcHVibGlzaC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCBzZW12ZXIsIHtSZWxlYXNlVHlwZX0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIGdldFBhY2thZ2VKc29uLCBzZXRQYWNrYWdlSnNvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1Ymxpc2hPcHRpb25zIHtcbiAgcmVhZG9ubHkgYnVtcD86IHN0cmluZztcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmV3VmVyc2lvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgb3RwPzogc3RyaW5nO1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpdmF0ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQdWJsaXNoQ2FsbGJhY2sgPSB0eXBlb2YgcHJvY2Vzcy5leGl0O1xuXG5leHBvcnQgY29uc3QgcHVibGlzaCA9IGFzeW5jIChjbWQ6IFB1Ymxpc2hPcHRpb25zLCBjYWxsYmFjazogUHVibGlzaENhbGxiYWNrID0gcHJvY2Vzcy5leGl0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge2J1bXAsIGNsaU5hbWUgPSAnTGV4JywgbmV3VmVyc2lvbiwgb3RwLCBwYWNrYWdlTWFuYWdlcjogY21kUGFja2FnZU1hbmFnZXIsIHByaXZhdGU6IGFjY2Vzc1ByaXZhdGUsIHRhZywgcXVpZXR9ID0gY21kO1xuICBsb2coYCR7Y2xpTmFtZX0gcHVibGlzaGluZyBucG0gbW9kdWxlLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgLy8gU3Bpbm5lclxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgLy8gR2V0IGN1c3RvbSBjb25maWd1cmF0aW9uXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtwYWNrYWdlTWFuYWdlcjogY29uZmlnUGFja2FnZU1hbmFnZXJ9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3QgcGFja2FnZU1hbmFnZXI6IHN0cmluZyA9IGNtZFBhY2thZ2VNYW5hZ2VyIHx8IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyO1xuICBjb25zdCBwdWJsaXNoT3B0aW9uczogc3RyaW5nW10gPSBbJ3B1Ymxpc2gnXTtcblxuICBpZihhY2Nlc3NQcml2YXRlKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS1hY2Nlc3MnLCAncmVzdHJpY3RlZCcpO1xuICB9XG5cbiAgaWYob3RwKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS1vdHAnLCBvdHApO1xuICB9XG5cbiAgaWYodGFnKSB7XG4gICAgcHVibGlzaE9wdGlvbnMucHVzaCgnLS10YWcnLCB0YWcpO1xuICB9XG5cbiAgLy8gR2V0IG5leHQgdmVyc2lvbiBudW1iZXJcbiAgbGV0IG5leHRWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnN0IHBhY2thZ2VQYXRoOiBzdHJpbmcgPSBgJHtwcm9jZXNzLmN3ZCgpfS9wYWNrYWdlLmpzb25gO1xuICBsZXQgcGFja2FnZUpzb247XG4gIGxldCBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBsZXQgcHJldlZlcnNpb246IHN0cmluZztcblxuICAvLyBJZiBub3QgdXNpbmcgeWFybiwgd2UnbGwgdXNlIG5wbSBhbmQgbWFudWFsbHkgdXBkYXRlIHRoZSB2ZXJzaW9uIG51bWJlclxuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gZ2V0UGFja2FnZUpzb24ocGFja2FnZVBhdGgpO1xuICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZUpzb24ubmFtZTtcbiAgICBwcmV2VmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb247XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFRoZSBmaWxlLCAke3BhY2thZ2VQYXRofSwgd2FzIG5vdCBmb3VuZCBvciBpcyBtYWxmb3JtZWQuXFxuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZyhlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgaWYobmV3VmVyc2lvbikge1xuICAgIC8vIElmIHVzaW5nIGEgc3BlY2lmaWMgdmVyc2lvbiwgd2UgZG9uJ3QgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG5leHQgYnVtcFxuICAgIG5leHRWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSBlbHNlIGlmKGJ1bXApIHtcbiAgICAvLyBEZXRlcm1pbmUgbmV4dCB2ZXJzaW9uXG4gICAgY29uc3QgZm9ybWF0QnVtcCA9IGJ1bXAudG9TdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZihmb3JtYXRCdW1wKSB7XG4gICAgICBjb25zdCB2YWxpZFJlbGVhc2VzOiBzdHJpbmdbXSA9IFsnbWFqb3InLCAnbWlub3InLCAncGF0Y2gnXTtcbiAgICAgIGNvbnN0IHZhbGlkUHJlUmVsZWFzZXM6IHN0cmluZ1tdID0gWydhbHBoYScsICdiZXRhJywgJ3JjJ107XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24gaXMgdmFsaWRcbiAgICAgIGNvbnN0IHBhY2thZ2VWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShwcmV2VmVyc2lvbik7XG5cbiAgICAgIGlmKCFzZW12ZXIudmFsaWQocGFja2FnZVZlcnNpb24pKSB7XG4gICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogVmVyc2lvbiBpcyBpbnZhbGlkIGluIHBhY2thZ2UuanNvbmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZih2YWxpZFJlbGVhc2VzLmluY2x1ZGVzKGZvcm1hdEJ1bXApKSB7XG4gICAgICAgIG5leHRWZXJzaW9uID0gc2VtdmVyLmluYyhwYWNrYWdlVmVyc2lvbiwgZm9ybWF0QnVtcCBhcyBSZWxlYXNlVHlwZSk7XG4gICAgICB9IGVsc2UgaWYodmFsaWRQcmVSZWxlYXNlcy5pbmNsdWRlcyhmb3JtYXRCdW1wKSkge1xuICAgICAgICBuZXh0VmVyc2lvbiA9IHNlbXZlci5pbmMocGFja2FnZVZlcnNpb24sICdwcmVyZWxlYXNlJywgZm9ybWF0QnVtcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEJ1bXAgdHlwZSBpcyBpbnZhbGlkLiBwbGVhc2UgbWFrZSBzdXJlIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3ZhbGlkUmVsZWFzZXMuam9pbignLCAnKX0sICR7dmFsaWRQcmVSZWxlYXNlcy5qb2luKCcsICcpfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEJ1bXAgdHlwZSBpcyBtaXNzaW5nLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYobmV4dFZlcnNpb24gJiYgcGFja2FnZU1hbmFnZXIgPT09ICd5YXJuJykge1xuICAgIHB1Ymxpc2hPcHRpb25zLnB1c2goJy0tbmV3LXZlcnNpb24nLCBuZXh0VmVyc2lvbik7XG4gIH0gZWxzZSBpZihuZXh0VmVyc2lvbiAmJiBwYWNrYWdlSnNvbikge1xuICAgIHRyeSB7XG4gICAgICAvLyBTYXZlIHVwZGF0ZWQgdmVyc2lvblxuICAgICAgc2V0UGFja2FnZUpzb24oey4uLnBhY2thZ2VKc29uLCB2ZXJzaW9uOiBuZXh0VmVyc2lvbn0sIHBhY2thZ2VQYXRoKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFRoZSBmaWxlLCAke3BhY2thZ2VQYXRofSwgd2FzIG5vdCBmb3VuZCBvciBpcyBtYWxmb3JtZWQuICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0VmVyc2lvbiA9IHByZXZWZXJzaW9uO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjYShwYWNrYWdlTWFuYWdlciwgcHVibGlzaE9wdGlvbnMsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgfSk7XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQgbnBtIHBhY2thZ2U6ICR7cGFja2FnZU5hbWV9IWApO1xuXG4gICAgLy8gS2lsbCBwcm9jZXNzXG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAvLyBTdG9wIHNwaW5uZXJcbiAgICBzcGlubmVyLmZhaWwoJ1B1Ymxpc2hpbmcgdG8gbnBtIGhhcyBmYWlsZWQuJyk7XG5cbiAgICAvLyBLaWxsIHByb2Nlc3NcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLGFBQVk7QUFDcEIsT0FBTyxZQUEyQjtBQUVsQyxTQUFRLGlCQUFnQjtBQUN4QixTQUFRLGVBQWUsZ0JBQWdCLHNCQUFxQjtBQUM1RCxTQUFRLFdBQVU7QUFlWCxNQUFNLFVBQVUsT0FBTyxLQUFxQixXQUE0QixRQUFRLFNBQTBCO0FBQy9HLFFBQU0sRUFBQyxNQUFNLFVBQVUsT0FBTyxZQUFZLEtBQUssZ0JBQWdCLG1CQUFtQixTQUFTLGVBQWUsS0FBSyxNQUFLLElBQUk7QUFDeEgsTUFBSSxHQUFHLE9BQU8sNkJBQTZCLFFBQVEsS0FBSztBQUd4RCxRQUFNLFVBQVUsY0FBYyxLQUFLO0FBR25DLFFBQU0sVUFBVSxZQUFZLEdBQUc7QUFFL0IsUUFBTSxFQUFDLGdCQUFnQixxQkFBb0IsSUFBSSxVQUFVO0FBQ3pELFFBQU0saUJBQXlCLHFCQUFxQjtBQUNwRCxRQUFNLGlCQUEyQixDQUFDLFNBQVM7QUFFM0MsTUFBRyxlQUFlO0FBQ2hCLG1CQUFlLEtBQUssWUFBWSxZQUFZO0FBQUEsRUFDOUM7QUFFQSxNQUFHLEtBQUs7QUFDTixtQkFBZSxLQUFLLFNBQVMsR0FBRztBQUFBLEVBQ2xDO0FBRUEsTUFBRyxLQUFLO0FBQ04sbUJBQWUsS0FBSyxTQUFTLEdBQUc7QUFBQSxFQUNsQztBQUdBLE1BQUk7QUFDSixRQUFNLGNBQXNCLEdBQUcsUUFBUSxJQUFJLENBQUM7QUFDNUMsTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBR0osTUFBSTtBQUNGLGtCQUFjLGVB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
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { sync as globSync } from "glob";
|
|
4
|
+
import { resolve as pathResolve } from "path";
|
|
5
|
+
import { URL } from "url";
|
|
6
|
+
import { LexConfig } from "../../LexConfig.js";
|
|
7
|
+
import { createSpinner } from "../../utils/app.js";
|
|
8
|
+
import { relativeNodePath } from "../../utils/file.js";
|
|
9
|
+
import { log } from "../../utils/log.js";
|
|
10
|
+
import { aiFunction } from "../ai/ai.js";
|
|
11
|
+
const getTestFilePatterns = (testPathPattern) => {
|
|
12
|
+
const defaultPatterns = ["**/*.test.*", "**/*.spec.*"];
|
|
13
|
+
if (!testPathPattern) {
|
|
14
|
+
return defaultPatterns;
|
|
15
|
+
}
|
|
16
|
+
return [testPathPattern];
|
|
17
|
+
};
|
|
18
|
+
const findUncoveredSourceFiles = () => {
|
|
19
|
+
const sourceFiles = globSync("src/**/*.{ts,tsx,js,jsx}", {
|
|
20
|
+
cwd: process.cwd(),
|
|
21
|
+
ignore: ["**/node_modules/**", "**/dist/**", "**/*.test.*", "**/*.spec.*"]
|
|
22
|
+
});
|
|
23
|
+
const testFiles = globSync("**/*.{test,spec}.{ts,tsx,js,jsx}", {
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
ignore: ["**/node_modules/**", "**/dist/**"]
|
|
26
|
+
});
|
|
27
|
+
return sourceFiles.filter((sourceFile) => {
|
|
28
|
+
const baseName = sourceFile.replace(/\.[^/.]+$/, "");
|
|
29
|
+
return !testFiles.some((testFile) => testFile.includes(baseName));
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const processTestResults = (outputFile) => {
|
|
33
|
+
if (!outputFile) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const content = readFileSync(outputFile, "utf-8");
|
|
38
|
+
return JSON.parse(content);
|
|
39
|
+
} catch (_error) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const test = async (options, args, callback = process.exit) => {
|
|
44
|
+
const {
|
|
45
|
+
analyze = false,
|
|
46
|
+
aiAnalyze = false,
|
|
47
|
+
aiDebug = false,
|
|
48
|
+
aiGenerate = false,
|
|
49
|
+
bail,
|
|
50
|
+
changedFilesWithAncestor,
|
|
51
|
+
changedSince,
|
|
52
|
+
ci,
|
|
53
|
+
cliName = "Lex",
|
|
54
|
+
collectCoverageFrom,
|
|
55
|
+
colors,
|
|
56
|
+
config,
|
|
57
|
+
debug = false,
|
|
58
|
+
debugTests = false,
|
|
59
|
+
detectOpenHandles,
|
|
60
|
+
env,
|
|
61
|
+
errorOnDeprecated,
|
|
62
|
+
expand,
|
|
63
|
+
forceExit,
|
|
64
|
+
generate = false,
|
|
65
|
+
json,
|
|
66
|
+
lastCommit,
|
|
67
|
+
listTests,
|
|
68
|
+
logHeapUsage,
|
|
69
|
+
maxWorkers,
|
|
70
|
+
noStackTrace,
|
|
71
|
+
notify,
|
|
72
|
+
onlyChanged,
|
|
73
|
+
outputFile,
|
|
74
|
+
passWithNoTests,
|
|
75
|
+
quiet,
|
|
76
|
+
removeCache,
|
|
77
|
+
runInBand,
|
|
78
|
+
setup,
|
|
79
|
+
showConfig,
|
|
80
|
+
silent,
|
|
81
|
+
testLocationInResults,
|
|
82
|
+
testNamePattern,
|
|
83
|
+
testPathPattern,
|
|
84
|
+
update,
|
|
85
|
+
useStderr,
|
|
86
|
+
verbose,
|
|
87
|
+
watch,
|
|
88
|
+
watchAll
|
|
89
|
+
} = options;
|
|
90
|
+
const useGenerate = generate || aiGenerate;
|
|
91
|
+
const useAnalyze = analyze || aiAnalyze;
|
|
92
|
+
const useDebug = debugTests || aiDebug;
|
|
93
|
+
log(`${cliName} testing...`, "info", quiet);
|
|
94
|
+
const spinner = createSpinner(quiet);
|
|
95
|
+
await LexConfig.parseConfig(options);
|
|
96
|
+
const { useTypescript } = LexConfig.config;
|
|
97
|
+
if (useTypescript) {
|
|
98
|
+
LexConfig.checkTypescriptConfig();
|
|
99
|
+
}
|
|
100
|
+
if (useGenerate) {
|
|
101
|
+
spinner.start("AI is analyzing code to generate test cases...");
|
|
102
|
+
try {
|
|
103
|
+
const uncoveredFiles = findUncoveredSourceFiles();
|
|
104
|
+
if (uncoveredFiles.length > 0) {
|
|
105
|
+
const targetFile = uncoveredFiles[0];
|
|
106
|
+
await aiFunction({
|
|
107
|
+
prompt: `Generate Jest unit tests for this file: ${targetFile}
|
|
108
|
+
|
|
109
|
+
${readFileSync(targetFile, "utf-8")}
|
|
110
|
+
|
|
111
|
+
Please create comprehensive tests that cover the main functionality. Include test fixtures and mocks where necessary.`,
|
|
112
|
+
task: "test",
|
|
113
|
+
file: targetFile,
|
|
114
|
+
context: true,
|
|
115
|
+
quiet
|
|
116
|
+
});
|
|
117
|
+
spinner.succeed(`AI test generation suggestions provided for ${targetFile}`);
|
|
118
|
+
} else {
|
|
119
|
+
spinner.succeed("All source files appear to have corresponding test files");
|
|
120
|
+
}
|
|
121
|
+
} catch (aiError) {
|
|
122
|
+
spinner.fail("Could not generate AI test suggestions");
|
|
123
|
+
if (!quiet) {
|
|
124
|
+
console.error("AI test generation error:", aiError);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const dirName = new URL(".", import.meta.url).pathname;
|
|
129
|
+
const dirPath = pathResolve(dirName, "../../..");
|
|
130
|
+
const jestPath = relativeNodePath("jest-cli/bin/jest.js", dirPath);
|
|
131
|
+
const jestConfigFile = config || pathResolve(dirName, "../../../jest.config.lex.js");
|
|
132
|
+
const jestSetupFile = setup || "";
|
|
133
|
+
const jestOptions = ["--no-cache"];
|
|
134
|
+
jestOptions.push("--config", jestConfigFile);
|
|
135
|
+
if (bail) {
|
|
136
|
+
jestOptions.push("--bail");
|
|
137
|
+
}
|
|
138
|
+
if (changedFilesWithAncestor) {
|
|
139
|
+
jestOptions.push("--changedFilesWithAncestor");
|
|
140
|
+
}
|
|
141
|
+
if (changedSince) {
|
|
142
|
+
jestOptions.push("--changedSince");
|
|
143
|
+
}
|
|
144
|
+
if (ci) {
|
|
145
|
+
jestOptions.push("--ci");
|
|
146
|
+
}
|
|
147
|
+
if (collectCoverageFrom) {
|
|
148
|
+
jestOptions.push("--collectCoverageFrom", collectCoverageFrom);
|
|
149
|
+
}
|
|
150
|
+
if (colors) {
|
|
151
|
+
jestOptions.push("--colors");
|
|
152
|
+
}
|
|
153
|
+
if (debug) {
|
|
154
|
+
jestOptions.push("--debug");
|
|
155
|
+
}
|
|
156
|
+
if (detectOpenHandles) {
|
|
157
|
+
jestOptions.push("--detectOpenHandles");
|
|
158
|
+
}
|
|
159
|
+
if (env) {
|
|
160
|
+
jestOptions.push("--env");
|
|
161
|
+
}
|
|
162
|
+
if (errorOnDeprecated) {
|
|
163
|
+
jestOptions.push("--errorOnDeprecated");
|
|
164
|
+
}
|
|
165
|
+
if (expand) {
|
|
166
|
+
jestOptions.push("--expand");
|
|
167
|
+
}
|
|
168
|
+
if (forceExit) {
|
|
169
|
+
jestOptions.push("--forceExit");
|
|
170
|
+
}
|
|
171
|
+
if (json) {
|
|
172
|
+
jestOptions.push("--json");
|
|
173
|
+
}
|
|
174
|
+
if (lastCommit) {
|
|
175
|
+
jestOptions.push("--lastCommit");
|
|
176
|
+
}
|
|
177
|
+
if (listTests) {
|
|
178
|
+
jestOptions.push("--listTests");
|
|
179
|
+
}
|
|
180
|
+
if (logHeapUsage) {
|
|
181
|
+
jestOptions.push("--logHeapUsage");
|
|
182
|
+
}
|
|
183
|
+
if (maxWorkers) {
|
|
184
|
+
jestOptions.push("--maxWorkers", maxWorkers);
|
|
185
|
+
}
|
|
186
|
+
if (noStackTrace) {
|
|
187
|
+
jestOptions.push("--noStackTrace");
|
|
188
|
+
}
|
|
189
|
+
if (notify) {
|
|
190
|
+
jestOptions.push("--notify");
|
|
191
|
+
}
|
|
192
|
+
if (onlyChanged) {
|
|
193
|
+
jestOptions.push("--onlyChanged");
|
|
194
|
+
}
|
|
195
|
+
let tempOutputFile = outputFile;
|
|
196
|
+
if ((useAnalyze || useDebug) && !outputFile) {
|
|
197
|
+
tempOutputFile = ".lex-test-results.json";
|
|
198
|
+
jestOptions.push("--json", "--outputFile", tempOutputFile);
|
|
199
|
+
} else if (outputFile) {
|
|
200
|
+
jestOptions.push("--outputFile", outputFile);
|
|
201
|
+
}
|
|
202
|
+
if (passWithNoTests) {
|
|
203
|
+
jestOptions.push("--passWithNoTests");
|
|
204
|
+
}
|
|
205
|
+
if (runInBand) {
|
|
206
|
+
jestOptions.push("--runInBand");
|
|
207
|
+
}
|
|
208
|
+
if (showConfig) {
|
|
209
|
+
jestOptions.push("--showConfig");
|
|
210
|
+
}
|
|
211
|
+
if (silent) {
|
|
212
|
+
jestOptions.push("--silent");
|
|
213
|
+
}
|
|
214
|
+
if (testLocationInResults) {
|
|
215
|
+
jestOptions.push("--testLocationInResults");
|
|
216
|
+
}
|
|
217
|
+
if (testNamePattern) {
|
|
218
|
+
jestOptions.push("--testNamePattern", testNamePattern);
|
|
219
|
+
}
|
|
220
|
+
if (testPathPattern) {
|
|
221
|
+
jestOptions.push("--testPathPattern", testPathPattern);
|
|
222
|
+
}
|
|
223
|
+
if (useStderr) {
|
|
224
|
+
jestOptions.push("--useStderr");
|
|
225
|
+
}
|
|
226
|
+
if (verbose) {
|
|
227
|
+
jestOptions.push("--verbose");
|
|
228
|
+
}
|
|
229
|
+
if (watchAll) {
|
|
230
|
+
jestOptions.push("--watchAll");
|
|
231
|
+
}
|
|
232
|
+
if (removeCache) {
|
|
233
|
+
jestOptions.push("--no-cache");
|
|
234
|
+
}
|
|
235
|
+
if (jestSetupFile !== "") {
|
|
236
|
+
const cwd = process.cwd();
|
|
237
|
+
jestOptions.push(`--setupFilesAfterEnv=${pathResolve(cwd, jestSetupFile)}`);
|
|
238
|
+
}
|
|
239
|
+
if (update) {
|
|
240
|
+
jestOptions.push("--updateSnapshot");
|
|
241
|
+
}
|
|
242
|
+
if (watch) {
|
|
243
|
+
jestOptions.push("--watch", watch);
|
|
244
|
+
}
|
|
245
|
+
if (args) {
|
|
246
|
+
jestOptions.push(...args);
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
await execa(jestPath, jestOptions, {
|
|
250
|
+
encoding: "utf8",
|
|
251
|
+
stdio: "inherit"
|
|
252
|
+
});
|
|
253
|
+
spinner.succeed("Testing completed!");
|
|
254
|
+
if (useAnalyze) {
|
|
255
|
+
spinner.start("AI is analyzing test coverage and suggesting improvements...");
|
|
256
|
+
try {
|
|
257
|
+
const testResults = processTestResults(tempOutputFile);
|
|
258
|
+
const filePatterns = getTestFilePatterns(testPathPattern);
|
|
259
|
+
await aiFunction({
|
|
260
|
+
prompt: `Analyze these Jest test results and suggest test coverage improvements:
|
|
261
|
+
|
|
262
|
+
${JSON.stringify(testResults, null, 2)}
|
|
263
|
+
|
|
264
|
+
Test patterns: ${filePatterns.join(", ")}
|
|
265
|
+
|
|
266
|
+
Please provide:
|
|
267
|
+
1. Analysis of current coverage gaps
|
|
268
|
+
2. Suggestions for improving test cases
|
|
269
|
+
3. Recommendations for additional integration test scenarios
|
|
270
|
+
4. Best practices for increasing test effectiveness`,
|
|
271
|
+
task: "optimize",
|
|
272
|
+
context: true,
|
|
273
|
+
quiet
|
|
274
|
+
});
|
|
275
|
+
spinner.succeed("AI test analysis complete");
|
|
276
|
+
} catch (aiError) {
|
|
277
|
+
spinner.fail("Could not generate AI test analysis");
|
|
278
|
+
if (!quiet) {
|
|
279
|
+
console.error("AI analysis error:", aiError);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
callback(0);
|
|
284
|
+
return 0;
|
|
285
|
+
} catch (error) {
|
|
286
|
+
log(`
|
|
287
|
+
${cliName} Error: Check for unit test errors and/or coverage.`, "error", quiet);
|
|
288
|
+
spinner.fail("Testing failed!");
|
|
289
|
+
if (useDebug) {
|
|
290
|
+
spinner.start("AI is analyzing test failures...");
|
|
291
|
+
try {
|
|
292
|
+
const testResults = processTestResults(tempOutputFile);
|
|
293
|
+
await aiFunction({
|
|
294
|
+
prompt: `Debug these failed Jest tests and suggest fixes:
|
|
295
|
+
|
|
296
|
+
${JSON.stringify(error.message, null, 2)}
|
|
297
|
+
|
|
298
|
+
Test results: ${JSON.stringify(testResults, null, 2)}
|
|
299
|
+
|
|
300
|
+
Please provide:
|
|
301
|
+
1. Analysis of why the tests are failing
|
|
302
|
+
2. Specific suggestions to fix each failing test
|
|
303
|
+
3. Any potential issues with test fixtures or mocks
|
|
304
|
+
4. Code examples for solutions`,
|
|
305
|
+
task: "help",
|
|
306
|
+
context: true,
|
|
307
|
+
quiet
|
|
308
|
+
});
|
|
309
|
+
spinner.succeed("AI debugging assistance complete");
|
|
310
|
+
} catch (aiError) {
|
|
311
|
+
spinner.fail("Could not generate AI debugging assistance");
|
|
312
|
+
if (!quiet) {
|
|
313
|
+
console.error("AI debugging error:", aiError);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
callback(1);
|
|
318
|
+
return 1;
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
var test_default = test;
|
|
322
|
+
export {
|
|
323
|
+
test_default as default,
|
|
324
|
+
getTestFilePatterns,
|
|
325
|
+
test
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Rlc3QvdGVzdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7VVJMfSBmcm9tICd1cmwnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVsYXRpdmVOb2RlUGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi4vYWkvYWkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgYW5hbHl6ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBhaUdlbmVyYXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYWlBbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYmFpbD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNoYW5nZWRGaWxlc1dpdGhBbmNlc3Rvcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNoYW5nZWRTaW5jZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY2k/OiBib29sZWFuO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xsZWN0Q292ZXJhZ2VGcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcnM/OiBib29sZWFuO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGVidWdUZXN0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRldGVjdE9wZW5IYW5kbGVzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nO1xuICByZWFkb25seSBlcnJvck9uRGVwcmVjYXRlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV4cGFuZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZvcmNlRXhpdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGdlbmVyYXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkganNvbj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxhc3RDb21taXQ/OiBib29sZWFuO1xuICByZWFkb25seSBsaXN0VGVzdHM/OiBib29sZWFuO1xuICByZWFkb25seSBsb2dIZWFwVXNhZ2U/OiBib29sZWFuO1xuICByZWFkb25seSBtYXhXb3JrZXJzPzogc3RyaW5nO1xuICByZWFkb25seSBub1N0YWNrVHJhY2U/OiBib29sZWFuO1xuICByZWFkb25seSBub3RpZnk/OiBib29sZWFuO1xuICByZWFkb25seSBvbmx5Q2hhbmdlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG91dHB1dEZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3NXaXRoTm9UZXN0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlQ2FjaGU/OiBib29sZWFuO1xuICByZWFkb25seSBydW5JbkJhbmQ/OiBib29sZWFuO1xuICByZWFkb25seSBzZXR1cD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvd0NvbmZpZz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNpbGVudD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3RMb2NhdGlvbkluUmVzdWx0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3ROYW1lUGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVzdFBhdGhQYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSB1cGRhdGU/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VTdGRlcnI/OiBib29sZWFuO1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgd2F0Y2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdhdGNoQWxsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgVGVzdENhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuZXhwb3J0IGNvbnN0IGdldFRlc3RGaWxlUGF0dGVybnMgPSAodGVzdFBhdGhQYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkZWZhdWx0UGF0dGVybnMgPSBbJyoqLyoudGVzdC4qJywgJyoqLyouc3BlYy4qJ107XG5cbiAgaWYoIXRlc3RQYXRoUGF0dGVybikge1xuICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnM7XG4gIH1cblxuICByZXR1cm4gW3Rlc3RQYXRoUGF0dGVybl07XG59O1xuXG5jb25zdCBmaW5kVW5jb3ZlcmVkU291cmNlRmlsZXMgPSAoKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzb3VyY2VGaWxlcyA9IGdsb2JTeW5jKCdzcmMvKiovKi57dHMsdHN4LGpzLGpzeH0nLCB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi8qLnRlc3QuKicsICcqKi8qLnNwZWMuKiddXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RGaWxlcyA9IGdsb2JTeW5jKCcqKi8qLnt0ZXN0LHNwZWN9Lnt0cyx0c3gsanMsanN4fScsIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJ11cbiAgfSk7XG5cbiAgLy8gU2ltcGxlIGhldXJpc3RpYyB0byBmaW5kIHNvdXJjZSBmaWxlcyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdGVzdCBmaWxlc1xuICByZXR1cm4gc291cmNlRmlsZXMuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBzb3VyY2VGaWxlLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG4gICAgcmV0dXJuICF0ZXN0RmlsZXMuc29tZSgodGVzdEZpbGUpID0+IHRlc3RGaWxlLmluY2x1ZGVzKGJhc2VOYW1lKSk7XG4gIH0pO1xufTtcblxuY29uc3QgcHJvY2Vzc1Rlc3RSZXN1bHRzID0gKG91dHB1dEZpbGU/OiBzdHJpbmcpOiBhbnkgPT4ge1xuICBpZighb3V0cHV0RmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKG91dHB1dEZpbGUsICd1dGYtOCcpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoKF9lcnJvcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdGVzdCA9IGFzeW5jIChvcHRpb25zOiBUZXN0T3B0aW9ucywgYXJnczogc3RyaW5nW10sIGNhbGxiYWNrOiBUZXN0Q2FsbGJhY2sgPSBwcm9jZXNzLmV4aXQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgYW5hbHl6ZSA9IGZhbHNlLFxuICAgIGFpQW5hbHl6ZSA9IGZhbHNlLFxuICAgIGFpRGVidWcgPSBmYWxzZSxcbiAgICBhaUdlbmVyYXRlID0gZmFsc2UsXG4gICAgYmFpbCxcbiAgICBjaGFuZ2VkRmlsZXNXaXRoQW5jZXN0b3IsXG4gICAgY2hhbmdlZFNpbmNlLFxuICAgIGNpLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb2xsZWN0Q292ZXJhZ2VGcm9tLFxuICAgIGNvbG9ycyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBkZWJ1Z1Rlc3RzID0gZmFsc2UsXG4gICAgZGV0ZWN0T3BlbkhhbmRsZXMsXG4gICAgZW52LFxuICAgIGVycm9yT25EZXByZWNhdGVkLFxuICAgIGV4cGFuZCxcbiAgICBmb3JjZUV4aXQsXG4gICAgZ2VuZXJhdGUgPSBmYWxzZSxcbiAgICBqc29uLFxuICAgIGxhc3RDb21taXQsXG4gICAgbGlzdFRlc3RzLFxuICAgIGxvZ0hlYXBVc2FnZSxcbiAgICBtYXhXb3JrZXJzLFxuICAgIG5vU3RhY2tUcmFjZSxcbiAgICBub3RpZnksXG4gICAgb25seUNoYW5nZWQsXG4gICAgb3V0cHV0RmlsZSxcbiAgICBwYXNzV2l0aE5vVGVzdHMsXG4gICAgcXVpZXQsXG4gICAgcmVtb3ZlQ2FjaGUsXG4gICAgcnVuSW5CYW5kLFxuICAgIHNldHVwLFxuICAgIHNob3dDb25maWcsXG4gICAgc2lsZW50LFxuICAgIHRlc3RMb2NhdGlvbkluUmVzdWx0cyxcbiAgICB0ZXN0TmFtZVBhdHRlcm4sXG4gICAgdGVzdFBhdGhQYXR0ZXJuLFxuICAgIHVwZGF0ZSxcbiAgICB1c2VTdGRlcnIsXG4gICAgdmVyYm9zZSxcbiAgICB3YXRjaCxcbiAgICB3YXRjaEFsbFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCB1c2VHZW5lcmF0ZSA9IGdlbmVyYXRlIHx8IGFpR2VuZXJhdGU7XG4gIGNvbnN0IHVzZUFuYWx5emUgPSBhbmFseXplIHx8IGFpQW5hbHl6ZTtcbiAgY29uc3QgdXNlRGVidWcgPSBkZWJ1Z1Rlc3RzIHx8IGFpRGVidWc7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHRlc3RpbmcuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHt1c2VUeXBlc2NyaXB0fSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIExleENvbmZpZy5jaGVja1R5cGVzY3JpcHRDb25maWcoKTtcbiAgfVxuXG4gIGlmKHVzZUdlbmVyYXRlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIGNvZGUgdG8gZ2VuZXJhdGUgdGVzdCBjYXNlcy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVuY292ZXJlZEZpbGVzID0gZmluZFVuY292ZXJlZFNvdXJjZUZpbGVzKCk7XG5cbiAgICAgIGlmKHVuY292ZXJlZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RmlsZSA9IHVuY292ZXJlZEZpbGVzWzBdO1xuXG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYEdlbmVyYXRlIEplc3QgdW5pdCB0ZXN0cyBmb3IgdGhpcyBmaWxlOiAke3RhcmdldEZpbGV9XFxuXFxuJHtyZWFkRmlsZVN5bmModGFyZ2V0RmlsZSwgJ3V0Zi04Jyl9XFxuXFxuUGxlYXNlIGNyZWF0ZSBjb21wcmVoZW5zaXZlIHRlc3RzIHRoYXQgY292ZXIgdGhlIG1haW4gZnVuY3Rpb25hbGl0eS4gSW5jbHVkZSB0ZXN0IGZpeHR1cmVzIGFuZCBtb2NrcyB3aGVyZSBuZWNlc3NhcnkuYCxcbiAgICAgICAgICB0YXNrOiAndGVzdCcsXG4gICAgICAgICAgZmlsZTogdGFyZ2V0RmlsZSxcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHF1aWV0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgQUkgdGVzdCBnZW5lcmF0aW9uIHN1Z2dlc3Rpb25zIHByb3ZpZGVkIGZvciAke3RhcmdldEZpbGV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FsbCBzb3VyY2UgZmlsZXMgYXBwZWFyIHRvIGhhdmUgY29ycmVzcG9uZGluZyB0ZXN0IGZpbGVzJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSB0ZXN0IHN1Z2dlc3Rpb25zJyk7XG4gICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQUkgdGVzdCBnZW5lcmF0aW9uIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpck5hbWUgPSBuZXcgVVJMKCcuJywgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZTtcbiAgY29uc3QgZGlyUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uLy4uJyk7XG4gIGNvbnN0IGplc3RQYXRoOiBzdHJpbmcgPSByZWxhdGl2ZU5vZGVQYXRoKCdqZXN0LWNsaS9iaW4vamVzdC5qcycsIGRpclBhdGgpO1xuICBjb25zdCBqZXN0Q29uZmlnRmlsZTogc3RyaW5nID0gY29uZmlnIHx8IHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi8uLi9qZXN0LmNvbmZpZy5sZXguanMnKTtcbiAgY29uc3QgamVzdFNldHVwRmlsZTogc3RyaW5nID0gc2V0dXAgfHwgJyc7XG4gIGNvbnN0IGplc3RPcHRpb25zOiBzdHJpbmdbXSA9IFsnLS1uby1jYWNoZSddO1xuXG4gIGplc3RPcHRpb25zLnB1c2goJy0tY29uZmlnJywgamVzdENvbmZpZ0ZpbGUpO1xuXG4gIGlmKGJhaWwpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWJhaWwnKTtcbiAgfVxuXG4gIGlmKGNoYW5nZWRGaWxlc1dpdGhBbmNlc3Rvcikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yJyk7XG4gIH1cblxuICBpZihjaGFuZ2VkU2luY2UpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNoYW5nZWRTaW5jZScpO1xuICB9XG5cbiAgaWYoY2kpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNpJyk7XG4gIH1cblxuICBpZihjb2xsZWN0Q292ZXJhZ2VGcm9tKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1jb2xsZWN0Q292ZXJhZ2VGcm9tJywgY29sbGVjdENvdmVyYWdlRnJvbSk7XG4gIH1cblxuICBpZihjb2xvcnMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNvbG9ycycpO1xuICB9XG5cbiAgaWYoZGVidWcpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWRlYnVnJyk7XG4gIH1cblxuICBpZihkZXRlY3RPcGVuSGFuZGxlcykge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZGV0ZWN0T3BlbkhhbmRsZXMnKTtcbiAgfVxuXG4gIGlmKGVudikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZW52Jyk7XG4gIH1cblxuICBpZihlcnJvck9uRGVwcmVjYXRlZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZXJyb3JPbkRlcHJlY2F0ZWQnKTtcbiAgfVxuXG4gIGlmKGV4cGFuZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZXhwYW5kJyk7XG4gIH1cblxuICBpZihmb3JjZUV4aXQpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWZvcmNlRXhpdCcpO1xuICB9XG5cbiAgaWYoanNvbikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tanNvbicpO1xuICB9XG5cbiAgaWYobGFzdENvbW1pdCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tbGFzdENvbW1pdCcpO1xuICB9XG5cbiAgaWYobGlzdFRlc3RzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1saXN0VGVzdHMnKTtcbiAgfVxuXG4gIGlmKGxvZ0hlYXBVc2FnZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tbG9nSGVhcFVzYWdlJyk7XG4gIH1cblxuICBpZihtYXhXb3JrZXJzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1tYXhXb3JrZXJzJywgbWF4V29ya2Vycyk7XG4gIH1cblxuICBpZihub1N0YWNrVHJhY2UpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW5vU3RhY2tUcmFjZScpO1xuICB9XG5cbiAgaWYobm90aWZ5KSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1ub3RpZnknKTtcbiAgfVxuXG4gIGlmKG9ubHlDaGFuZ2VkKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1vbmx5Q2hhbmdlZCcpO1xuICB9XG5cbiAgbGV0IHRlbXBPdXRwdXRGaWxlID0gb3V0cHV0RmlsZTtcblxuICBpZigodXNlQW5hbHl6ZSB8fCB1c2VEZWJ1ZykgJiYgIW91dHB1dEZpbGUpIHtcbiAgICB0ZW1wT3V0cHV0RmlsZSA9ICcubGV4LXRlc3QtcmVzdWx0cy5qc29uJztcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWpzb24nLCAnLS1vdXRwdXRGaWxlJywgdGVtcE91dHB1dEZpbGUpO1xuICB9IGVsc2UgaWYob3V0cHV0RmlsZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tb3V0cHV0RmlsZScsIG91dHB1dEZpbGUpO1xuICB9XG5cbiAgaWYocGFzc1dpdGhOb1Rlc3RzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1wYXNzV2l0aE5vVGVzdHMnKTtcbiAgfVxuXG4gIGlmKHJ1bkluQmFuZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tcnVuSW5CYW5kJyk7XG4gIH1cblxuICBpZihzaG93Q29uZmlnKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1zaG93Q29uZmlnJyk7XG4gIH1cblxuICBpZihzaWxlbnQpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXNpbGVudCcpO1xuICB9XG5cbiAgaWYodGVzdExvY2F0aW9uSW5SZXN1bHRzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS10ZXN0TG9jYXRpb25JblJlc3VsdHMnKTtcbiAgfVxuXG4gIGlmKHRlc3ROYW1lUGF0dGVybikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdGVzdE5hbWVQYXR0ZXJuJywgdGVzdE5hbWVQYXR0ZXJuKTtcbiAgfVxuXG4gIGlmKHRlc3RQYXRoUGF0dGVybikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdGVzdFBhdGhQYXR0ZXJuJywgdGVzdFBhdGhQYXR0ZXJuKTtcbiAgfVxuXG4gIGlmKHVzZVN0ZGVycikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdXNlU3RkZXJyJyk7XG4gIH1cblxuICBpZih2ZXJib3NlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS12ZXJib3NlJyk7XG4gIH1cblxuICBpZih3YXRjaEFsbCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0td2F0Y2hBbGwnKTtcbiAgfVxuXG4gIGlmKHJlbW92ZUNhY2hlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1uby1jYWNoZScpO1xuICB9XG5cbiAgaWYoamVzdFNldHVwRmlsZSAhPT0gJycpIHtcbiAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG4gICAgamVzdE9wdGlvbnMucHVzaChgLS1zZXR1cEZpbGVzQWZ0ZXJFbnY9JHtwYXRoUmVzb2x2ZShjd2QsIGplc3RTZXR1cEZpbGUpfWApO1xuICB9XG5cbiAgaWYodXBkYXRlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS11cGRhdGVTbmFwc2hvdCcpO1xuICB9XG5cbiAgaWYod2F0Y2gpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXdhdGNoJywgd2F0Y2gpO1xuICB9XG5cbiAgaWYoYXJncykge1xuICAgIGplc3RPcHRpb25zLnB1c2goLi4uYXJncyk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNhKGplc3RQYXRoLCBqZXN0T3B0aW9ucywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICB9KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnVGVzdGluZyBjb21wbGV0ZWQhJyk7XG5cbiAgICBpZih1c2VBbmFseXplKSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGVzdCBjb3ZlcmFnZSBhbmQgc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlUGF0dGVybnMgPSBnZXRUZXN0RmlsZVBhdHRlcm5zKHRlc3RQYXRoUGF0dGVybik7XG5cbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgcHJvbXB0OiBgQW5hbHl6ZSB0aGVzZSBKZXN0IHRlc3QgcmVzdWx0cyBhbmQgc3VnZ2VzdCB0ZXN0IGNvdmVyYWdlIGltcHJvdmVtZW50czpcbiAgICAgICAgICBcbiR7SlNPTi5zdHJpbmdpZnkodGVzdFJlc3VsdHMsIG51bGwsIDIpfVxuXG5UZXN0IHBhdHRlcm5zOiAke2ZpbGVQYXR0ZXJucy5qb2luKCcsICcpfVxuXG5QbGVhc2UgcHJvdmlkZTpcbjEuIEFuYWx5c2lzIG9mIGN1cnJlbnQgY292ZXJhZ2UgZ2Fwc1xuMi4gU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0ZXN0IGNhc2VzXG4zLiBSZWNvbW1lbmRhdGlvbnMgZm9yIGFkZGl0aW9uYWwgaW50ZWdyYXRpb24gdGVzdCBzY2VuYXJpb3NcbjQuIEJlc3QgcHJhY3RpY2VzIGZvciBpbmNyZWFzaW5nIHRlc3QgZWZmZWN0aXZlbmVzc2AsXG4gICAgICAgICAgdGFzazogJ29wdGltaXplJyxcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHF1aWV0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgdGVzdCBhbmFseXNpcyBjb21wbGV0ZScpO1xuICAgICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnQ291bGQgbm90IGdlbmVyYXRlIEFJIHRlc3QgYW5hbHlzaXMnKTtcbiAgICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2hlY2sgZm9yIHVuaXQgdGVzdCBlcnJvcnMgYW5kL29yIGNvdmVyYWdlLmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnVGVzdGluZyBmYWlsZWQhJyk7XG5cbiAgICBpZih1c2VEZWJ1Zykge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRlc3QgZmFpbHVyZXMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuXG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYERlYnVnIHRoZXNlIGZhaWxlZCBKZXN0IHRlc3RzIGFuZCBzdWdnZXN0IGZpeGVzOlxuICAgICAgICAgIFxuJHtKU09OLnN0cmluZ2lmeShlcnJvci5tZXNzYWdlLCBudWxsLCAyKX1cblxuVGVzdCByZXN1bHRzOiAke0pTT04uc3RyaW5naWZ5KHRlc3RSZXN1bHRzLCBudWxsLCAyKX1cblxuUGxlYXNlIHByb3ZpZGU6XG4xLiBBbmFseXNpcyBvZiB3aHkgdGhlIHRlc3RzIGFyZSBmYWlsaW5nXG4yLiBTcGVjaWZpYyBzdWdnZXN0aW9ucyB0byBmaXggZWFjaCBmYWlsaW5nIHRlc3RcbjMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggdGVzdCBmaXh0dXJlcyBvciBtb2Nrc1xuNC4gQ29kZSBleGFtcGxlcyBmb3Igc29sdXRpb25zYCxcbiAgICAgICAgICB0YXNrOiAnaGVscCcsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGRlYnVnZ2luZyBhc3Npc3RhbmNlIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgZGVidWdnaW5nIGFzc2lzdGFuY2UnKTtcbiAgICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgZGVidWdnaW5nIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRlc3Q7Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsb0JBQW1CO0FBQzNCLFNBQVEsUUFBUSxnQkFBZTtBQUMvQixTQUFRLFdBQVcsbUJBQWtCO0FBQ3JDLFNBQVEsV0FBVTtBQUVsQixTQUFRLGlCQUFnQjtBQUN4QixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLHdCQUF1QjtBQUMvQixTQUFRLFdBQVU7QUFDbEIsU0FBUSxrQkFBaUI7QUFtRGxCLE1BQU0sc0JBQXNCLENBQUMsb0JBQXVDO0FBQ3pFLFFBQU0sa0JBQWtCLENBQUMsZUFBZSxhQUFhO0FBRXJELE1BQUcsQ0FBQyxpQkFBaUI7QUFDbkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLENBQUMsZUFBZTtBQUN6QjtBQUVBLE1BQU0sMkJBQTJCLE1BQWdCO0FBQy9DLFFBQU0sY0FBYyxTQUFTLDRCQUE0QjtBQUFBLElBQ3ZELEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDakIsUUFB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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { resolve as pathResolve } from "path";
|
|
3
|
+
import { LexConfig } from "../../LexConfig.js";
|
|
4
|
+
import { createSpinner } from "../../utils/app.js";
|
|
5
|
+
import { log } from "../../utils/log.js";
|
|
6
|
+
const update = async (cmd, callback = process.exit) => {
|
|
7
|
+
const { cliName = "Lex", packageManager: cmdPackageManager, quiet, registry } = cmd;
|
|
8
|
+
log(`${cliName} updating packages...`, "info", quiet);
|
|
9
|
+
const spinner = createSpinner(quiet);
|
|
10
|
+
await LexConfig.parseConfig(cmd);
|
|
11
|
+
const { packageManager: configPackageManager } = LexConfig.config;
|
|
12
|
+
const packageManager = cmdPackageManager || configPackageManager || "npm";
|
|
13
|
+
const isNpm = packageManager === "npm";
|
|
14
|
+
const updateApp = isNpm ? "npx" : "yarn";
|
|
15
|
+
const dirName = new URL(".", import.meta.url).pathname;
|
|
16
|
+
const dirPath = pathResolve(dirName, "../..");
|
|
17
|
+
const updateOptions = isNpm ? [
|
|
18
|
+
"npm-check-updates",
|
|
19
|
+
"--concurrency",
|
|
20
|
+
"10",
|
|
21
|
+
"--packageManager",
|
|
22
|
+
packageManager,
|
|
23
|
+
"--pre",
|
|
24
|
+
"0",
|
|
25
|
+
"--target",
|
|
26
|
+
"latest",
|
|
27
|
+
...cmd.interactive ? ["--interactive"] : [],
|
|
28
|
+
"--upgrade"
|
|
29
|
+
] : [cmd.interactive ? "upgrade-interactive" : "upgrade", "--latest"];
|
|
30
|
+
if (registry) {
|
|
31
|
+
updateOptions.push("--registry", registry);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await execa(updateApp, updateOptions, {
|
|
35
|
+
encoding: "utf8",
|
|
36
|
+
stdio: "inherit"
|
|
37
|
+
});
|
|
38
|
+
if (isNpm) {
|
|
39
|
+
await execa("npm", ["i", "--force"], {
|
|
40
|
+
encoding: "utf8",
|
|
41
|
+
stdio: "inherit"
|
|
42
|
+
});
|
|
43
|
+
await execa("npm", ["audit", "fix"], {
|
|
44
|
+
encoding: "utf8",
|
|
45
|
+
stdio: "inherit"
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
spinner.succeed("Successfully updated packages!");
|
|
49
|
+
callback(0);
|
|
50
|
+
return 0;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
log(`
|
|
53
|
+
${cliName} Error: ${error.message}`, "error", quiet);
|
|
54
|
+
spinner.fail("Failed to updated packages.");
|
|
55
|
+
callback(1);
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
update
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3VwZGF0ZS91cGRhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU9wdGlvbnMge1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpbnRlcmFjdGl2ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhY2thZ2VNYW5hZ2VyPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBVcGRhdGVDYWxsYmFjayA9IHR5cGVvZiBwcm9jZXNzLmV4aXQ7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGUgPSBhc3luYyAoY21kOiBVcGRhdGVPcHRpb25zLCBjYWxsYmFjazogVXBkYXRlQ2FsbGJhY2sgPSBwcm9jZXNzLmV4aXQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBwYWNrYWdlTWFuYWdlcjogY21kUGFja2FnZU1hbmFnZXIsIHF1aWV0LCByZWdpc3RyeX0gPSBjbWQ7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHVwZGF0aW5nIHBhY2thZ2VzLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtwYWNrYWdlTWFuYWdlcjogY29uZmlnUGFja2FnZU1hbmFnZXJ9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3QgcGFja2FnZU1hbmFnZXI6IHN0cmluZyA9IGNtZFBhY2thZ2VNYW5hZ2VyIHx8IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyIHx8ICducG0nO1xuICBjb25zdCBpc05wbTogYm9vbGVhbiA9IHBhY2thZ2VNYW5hZ2VyID09PSAnbnBtJztcbiAgY29uc3QgdXBkYXRlQXBwOiBzdHJpbmcgPSBpc05wbSA/ICducHgnIDogJ3lhcm4nO1xuICBjb25zdCBkaXJOYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWU7XG4gIGNvbnN0IGRpclBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLicpO1xuICBcbiAgY29uc3QgdXBkYXRlT3B0aW9uczogc3RyaW5nW10gPSBpc05wbVxuICAgID8gW1xuICAgICAgJ25wbS1jaGVjay11cGRhdGVzJyxcbiAgICAgICctLWNvbmN1cnJlbmN5JywgJzEwJyxcbiAgICAgICctLXBhY2thZ2VNYW5hZ2VyJywgcGFja2FnZU1hbmFnZXIsXG4gICAgICAnLS1wcmUnLCAnMCcsXG4gICAgICAnLS10YXJnZXQnLCAnbGF0ZXN0JyxcbiAgICAgIC4uLihjbWQuaW50ZXJhY3RpdmUgPyBbJy0taW50ZXJhY3RpdmUnXSA6IFtdKSxcbiAgICAgICctLXVwZ3JhZGUnXG4gICAgXVxuICAgIDogW2NtZC5pbnRlcmFjdGl2ZSA/ICd1cGdyYWRlLWludGVyYWN0aXZlJyA6ICd1cGdyYWRlJywgJy0tbGF0ZXN0J107XG5cbiAgaWYocmVnaXN0cnkpIHtcbiAgICB1cGRhdGVPcHRpb25zLnB1c2goJy0tcmVnaXN0cnknLCByZWdpc3RyeSk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNhKHVwZGF0ZUFwcCwgdXBkYXRlT3B0aW9ucywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICB9KTtcblxuICAgIGlmKGlzTnBtKSB7XG4gICAgICBhd2FpdCBleGVjYSgnbnBtJywgWydpJywgJy0tZm9yY2UnXSwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZXhlY2EoJ25wbScsIFsnYXVkaXQnLCAnZml4J10sIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgc3RkaW86ICdpbmhlcml0J1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdTdWNjZXNzZnVsbHkgdXBkYXRlZCBwYWNrYWdlcyEnKTtcblxuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gdXBkYXRlZCBwYWNrYWdlcy4nKTtcblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsYUFBWTtBQUNwQixTQUFRLFdBQVcsbUJBQWtCO0FBRXJDLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEsV0FBVTtBQVlYLE1BQU0sU0FBUyxPQUFPLEtBQW9CLFdBQTJCLFFBQVEsU0FBMEI7QUFDNUcsUUFBTSxFQUFDLFVBQVUsT0FBTyxnQkFBZ0IsbUJBQW1CLE9BQU8sU0FBUSxJQUFJO0FBRTlFLE1BQUksR0FBRyxPQUFPLHlCQUF5QixRQUFRLEtBQUs7QUFFcEQsUUFBTSxVQUFVLGNBQWMsS0FBSztBQUVuQyxRQUFNLFVBQVUsWUFBWSxHQUFHO0FBRS9CLFFBQU0sRUFBQyxnQkFBZ0IscUJBQW9CLElBQUksVUFBVTtBQUN6RCxRQUFNLGlCQUF5QixxQkFBcUIsd0JBQXdCO0FBQzVFLFFBQU0sUUFBaUIsbUJBQW1CO0FBQzFDLFFBQU0sWUFBb0IsUUFBUSxRQUFRO0FBQzFDLFFBQU0sVUFBVSxJQUFJLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRTtBQUM5QyxRQUFNLFVBQWtCLFlBQVksU0FBUyxPQUFPO0FBRXBELFFBQU0sZ0JBQTBCLFFBQzVCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUFpQjtBQUFBLElBQ2pCO0FBQUEsSUFBb0I7QUFBQSxJQUNwQjtBQUFBLElBQVM7QUFBQSxJQUNUO0FBQUEsSUFBWTtBQUFBLElBQ1osR0FBSSxJQUFJLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQztBQUFBLElBQzNDO0FBQUEsRUFDRixJQUNFLENBQUMsSUFBSSxjQUFjLHdCQUF3QixXQUFXLFVBQVU7QUFFcEUsTUFBRyxVQUFVO0FBQ1gsa0JBQWMsS0FBSyxjQUFjLFFBQVE7QUFBQSxFQUMzQztBQUVBLE1BQUk7QUFDRixVQUFNLE1BQU0sV0FBVyxlQUFlO0FBQUEsTUFDcEMsVUFBVTtBQUFBLE1BQ1YsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUVELFFBQUcsT0FBTztBQUNSLFlBQU0sTUFBTSxPQUFPLENBQUMsS0FBSyxTQUFTLEdBQUc7QUFBQSxRQUNuQyxVQUFVO0FBQUEsUUFDVixPQUFPO0FBQUEsTUFDVCxDQUFDO0FBRUQsWUFBTSxNQUFNLE9BQU8sQ0FBQyxTQUFTLEtBQUssR0FBRztBQUFBLFFBQ25DLFVBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNIO0FBRUEsWUFBUSxRQUFRLGdDQUFnQztBQUVoRCxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVCxTQUFRLE9BQU87QUFDYixRQUFJO0FBQUEsRUFBSyxPQUFPLFdBQVcsTUFBTSxPQUFPLElBQUksU0FBUyxLQUFLO0FBRTFELFlBQVEsS0FBSyw2QkFBNkI7QUFFMUMsYUFBUyxDQUFDO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { compareVersions } from "compare-versions";
|
|
2
|
+
import { execa } from "execa";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import latestVersion from "latest-version";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { LexConfig } from "../../LexConfig.js";
|
|
7
|
+
import { createSpinner } from "../../utils/app.js";
|
|
8
|
+
import { log } from "../../utils/log.js";
|
|
9
|
+
import { parseVersion } from "../versions/versions.js";
|
|
10
|
+
const packagePath = fileURLToPath(new URL("../../../package.json", import.meta.url));
|
|
11
|
+
const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
12
|
+
const upgrade = async (cmd, callback = process.exit) => {
|
|
13
|
+
const { cliName = "Lex", cliPackage = "@nlabs/lex", quiet } = cmd;
|
|
14
|
+
log(`Upgrading ${cliName}...`, "info", quiet);
|
|
15
|
+
const spinner = createSpinner(quiet);
|
|
16
|
+
await LexConfig.parseConfig(cmd);
|
|
17
|
+
return latestVersion("@nlabs/lex").then(async (latest) => {
|
|
18
|
+
const current = parseVersion(packageJson.version);
|
|
19
|
+
const versionDiff = compareVersions(latest, current);
|
|
20
|
+
if (versionDiff === 0) {
|
|
21
|
+
log(`
|
|
22
|
+
Currently up-to-date. Version ${latest} is the latest.`, "note", quiet);
|
|
23
|
+
callback(0);
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
log(`
|
|
27
|
+
Currently out of date. Upgrading from version ${current} to ${latest}...`, "note", quiet);
|
|
28
|
+
const upgradeOptions = ["install", "-g", `${cliPackage}@latest`];
|
|
29
|
+
await execa("npm", upgradeOptions, {
|
|
30
|
+
encoding: "utf8",
|
|
31
|
+
stdio: "inherit"
|
|
32
|
+
});
|
|
33
|
+
spinner.succeed(`Successfully updated ${cliName}!`);
|
|
34
|
+
callback(0);
|
|
35
|
+
return 0;
|
|
36
|
+
}).catch((error) => {
|
|
37
|
+
log(`
|
|
38
|
+
${cliName} Error: ${error.message}`, "error", quiet);
|
|
39
|
+
spinner.fail("Failed to updated packages.");
|
|
40
|
+
callback(1);
|
|
41
|
+
return 1;
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
export {
|
|
45
|
+
upgrade
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3VwZ3JhZGUvdXBncmFkZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y29tcGFyZVZlcnNpb25zfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQgbGF0ZXN0VmVyc2lvbiBmcm9tICdsYXRlc3QtdmVyc2lvbic7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge3BhcnNlVmVyc2lvbn0gZnJvbSAnLi4vdmVyc2lvbnMvdmVyc2lvbnMuanMnO1xuXG5jb25zdCBwYWNrYWdlUGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLi4vLi4vLi4vcGFja2FnZS5qc29uJywgaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhY2thZ2VQYXRoLCAndXRmOCcpKTtcblxuZXhwb3J0IGludGVyZmFjZSBVcGdyYWRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsaVBhY2thZ2U/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgVXBncmFkZUNhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuZXhwb3J0IGNvbnN0IHVwZ3JhZGUgPSBhc3luYyAoY21kOiBVcGdyYWRlT3B0aW9ucywgY2FsbGJhY2s6IFVwZ3JhZGVDYWxsYmFjayA9IHByb2Nlc3MuZXhpdCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGNsaVBhY2thZ2UgPSAnQG5sYWJzL2xleCcsIHF1aWV0fSA9IGNtZDtcblxuICAvLyBEaXNwbGF5IHN0YXR1c1xuICBsb2coYFVwZ3JhZGluZyAke2NsaU5hbWV9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgLy8gU3Bpbm5lclxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgLy8gR2V0IGN1c3RvbSBjb25maWd1cmF0aW9uXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIHJldHVybiBsYXRlc3RWZXJzaW9uKCdAbmxhYnMvbGV4JylcbiAgICAudGhlbihhc3luYyAobGF0ZXN0OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IHN0cmluZyA9IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbi52ZXJzaW9uKTtcbiAgICAgIGNvbnN0IHZlcnNpb25EaWZmOiBudW1iZXIgPSBjb21wYXJlVmVyc2lvbnMobGF0ZXN0LCBjdXJyZW50KTtcblxuICAgICAgaWYodmVyc2lvbkRpZmYgPT09IDApIHtcbiAgICAgICAgbG9nKGBcXG5DdXJyZW50bHkgdXAtdG8tZGF0ZS4gVmVyc2lvbiAke2xhdGVzdH0gaXMgdGhlIGxhdGVzdC5gLCAnbm90ZScsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMCk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBsb2coYFxcbkN1cnJlbnRseSBvdXQgb2YgZGF0ZS4gVXBncmFkaW5nIGZyb20gdmVyc2lvbiAke2N1cnJlbnR9IHRvICR7bGF0ZXN0fS4uLmAsICdub3RlJywgcXVpZXQpO1xuXG4gICAgICBjb25zdCB1cGdyYWRlT3B0aW9uczogc3RyaW5nW10gPSBbJ2luc3RhbGwnLCAnLWcnLCBgJHtjbGlQYWNrYWdlfUBsYXRlc3RgXTtcblxuICAgICAgYXdhaXQgZXhlY2EoJ25wbScsIHVwZ3JhZGVPcHRpb25zLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdG9wIGxvYWRlclxuICAgICAgc3Bpbm5lci5zdWNjZWVkKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCAke2NsaU5hbWV9IWApO1xuXG4gICAgICAvLyBTdG9wIHByb2Nlc3NcbiAgICAgIGNhbGxiYWNrKDApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgLy8gU3RvcCBzcGlubmVyXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byB1cGRhdGVkIHBhY2thZ2VzLicpO1xuXG4gICAgICAvLyBLaWxsIHByb2Nlc3NcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSk7XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsdUJBQXNCO0FBQzlCLFNBQVEsYUFBWTtBQUNwQixTQUFRLG9CQUFtQjtBQUMzQixPQUFPLG1CQUFtQjtBQUMxQixTQUFRLHFCQUFvQjtBQUU1QixTQUFRLGlCQUFnQjtBQUN4QixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLFdBQVU7QUFDbEIsU0FBUSxvQkFBbUI7QUFFM0IsTUFBTSxjQUFjLGNBQWMsSUFBSSxJQUFJLHlCQUF5QixZQUFZLEdBQUcsQ0FBQztBQUNuRixNQUFNLGNBQWMsS0FBSyxNQUFNLGFBQWEsYUFBYSxNQUFNLENBQUM7QUFVekQsTUFBTSxVQUFVLE9BQU8sS0FBcUIsV0FBNEIsUUFBUSxTQUEwQjtBQUMvRyxRQUFNLEVBQUMsVUFBVSxPQUFPLGFBQWEsY0FBYyxNQUFLLElBQUk7QUFHNUQsTUFBSSxhQUFhLE9BQU8sT0FBTyxRQUFRLEtBQUs7QUFHNUMsUUFBTSxVQUFVLGNBQWMsS0FBSztBQUduQyxRQUFNLFVBQVUsWUFBWSxHQUFHO0FBRS9CLFNBQU8sY0FBYyxZQUFZLEVBQzlCLEtBQUssT0FBTyxXQUFtQjtBQUM5QixVQUFNLFVBQWtCLGFBQWEsWUFBWSxPQUFPO0FBQ3hELFVBQU0sY0FBc0IsZ0JBQWdCLFFBQVEsT0FBTztBQUUzRCxRQUFHLGdCQUFnQixHQUFHO0FBQ3BCLFVBQUk7QUFBQSxnQ0FBbUMsTUFBTSxtQkFBbUIsUUFBUSxLQUFLO0FBQzdFLGVBQVMsQ0FBQztBQUNWLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSTtBQUFBLGdEQUFtRCxPQUFPLE9BQU8sTUFBTSxPQUFPLFFBQVEsS0FBSztBQUUvRixVQUFNLGlCQUEyQixDQUFDLFdBQVcsTUFBTSxHQUFHLFVBQVUsU0FBUztBQUV6RSxVQUFNLE1BQU0sT0FBTyxnQkFBZ0I7QUFBQSxNQUNqQyxVQUFVO0FBQUEsTUFDVixPQUFPO0FBQUEsSUFDVCxDQUFDO0FBR0QsWUFBUSxRQUFRLHdCQUF3QixPQUFPLEdBQUc7QUFHbEQsYUFBUyxDQUFDO0FBQ1YsV0FBTztBQUFBLEVBQ1QsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxVQUFVO0FBRWhCLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFHMUQsWUFBUSxLQUFLLDZCQUE2QjtBQUcxQyxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0w7IiwKICAibmFtZXMiOiBbXQp9Cg==
|