@nlabs/lex 1.48.7 → 1.49.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/.storybook/main.ts +9 -2
- package/.vscode/settings.json +1 -6
- package/README.md +249 -0
- package/eslint.config.mjs +24 -0
- package/examples/lex.config.js +18 -8
- package/examples/serverless-example/README.md +109 -0
- package/examples/serverless-example/dist/handlers/echo.js +15 -0
- package/examples/serverless-example/dist/handlers/graphql.js +137 -0
- package/examples/serverless-example/dist/handlers/hello.js +15 -0
- package/examples/serverless-example/dist/handlers/test.js +17 -0
- package/examples/serverless-example/dist/handlers/websocket.js +14 -0
- package/examples/serverless-example/lex.config.mjs +74 -0
- package/jest.config.mjs +13 -12
- package/{dist → lib}/LexConfig.d.ts +7 -6
- package/lib/LexConfig.js +268 -0
- package/lib/commands/ai/ai.js +303 -0
- package/{dist → lib}/commands/build/build.d.ts +3 -0
- package/lib/commands/build/build.js +494 -0
- package/{dist → lib}/commands/clean/clean.js +1 -1
- package/lib/commands/compile/compile.js +241 -0
- package/lib/commands/copy/copy.js +38 -0
- package/{dist → lib}/commands/create/create.js +1 -1
- package/{dist → lib}/commands/dev/dev.d.ts +2 -0
- package/lib/commands/dev/dev.js +286 -0
- package/{dist → lib}/commands/init/init.js +1 -1
- package/lib/commands/lint/lint.js +993 -0
- package/{dist → lib}/commands/migrate/migrate.js +1 -1
- package/lib/commands/publish/publish.js +104 -0
- package/lib/commands/serverless/serverless.d.ts +17 -0
- package/lib/commands/serverless/serverless.js +662 -0
- package/lib/commands/storybook/storybook.js +249 -0
- package/lib/commands/test/test.js +428 -0
- package/lib/commands/update/update.js +128 -0
- package/{dist → lib}/create/changelog.js +1 -1
- package/{dist → lib}/index.d.ts +1 -0
- package/{dist → lib}/index.js +2 -1
- package/lib/lex.js +73 -0
- package/lib/utils/aiService.d.ts +9 -0
- package/lib/utils/aiService.js +299 -0
- package/{dist → lib}/utils/app.d.ts +3 -0
- package/lib/utils/app.js +296 -0
- package/{dist → lib}/utils/file.d.ts +7 -3
- package/lib/utils/file.js +229 -0
- package/lib/utils/translations.d.ts +1 -0
- package/lib/utils/translations.js +74 -0
- package/package.json +59 -53
- package/postcss.config.js +5 -3
- package/tsconfig.build.json +2 -2
- package/webpack.config.js +229 -39
- package/dist/LexConfig.js +0 -287
- package/dist/commands/ai/ai.js +0 -303
- package/dist/commands/build/build.js +0 -404
- package/dist/commands/compile/compile.js +0 -234
- package/dist/commands/copy/copy.js +0 -38
- package/dist/commands/dev/dev.js +0 -74
- package/dist/commands/lint/lint.js +0 -993
- package/dist/commands/publish/publish.js +0 -104
- package/dist/commands/storybook/storybook.js +0 -249
- package/dist/commands/test/test.js +0 -429
- package/dist/commands/update/update.js +0 -132
- package/dist/lex.js +0 -70
- package/dist/utils/aiService.d.ts +0 -9
- package/dist/utils/aiService.js +0 -299
- package/dist/utils/app.js +0 -267
- package/dist/utils/file.js +0 -185
- package/emptyModule.js +0 -0
- package/eslint.config.js +0 -3
- /package/{dist → lib}/Button.stories.d.ts +0 -0
- /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.js +0 -0
- /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
- /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.js +0 -0
- /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
- /package/{dist → lib}/commands/create/create.d.ts +0 -0
- /package/{dist → lib}/commands/init/init.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.js +0 -0
- /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
- /package/{dist → lib}/commands/lint/lint.d.ts +0 -0
- /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
- /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
- /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
- /package/{dist → lib}/commands/test/test.d.ts +0 -0
- /package/{dist → lib}/commands/update/update.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
- /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
- /package/{dist → lib}/commands/versions/versions.js +0 -0
- /package/{dist → lib}/create/changelog.d.ts +0 -0
- /package/{dist → lib}/lex.d.ts +0 -0
- /package/{dist → lib}/storybook/index.d.ts +0 -0
- /package/{dist → lib}/storybook/index.js +0 -0
- /package/{dist → lib}/test-react/index.d.ts +0 -0
- /package/{dist → lib}/test-react/index.js +0 -0
- /package/{dist → lib}/types.d.ts +0 -0
- /package/{dist → lib}/types.js +0 -0
- /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
- /package/{dist → lib}/utils/deepMerge.js +0 -0
- /package/{dist → lib}/utils/log.d.ts +0 -0
- /package/{dist → lib}/utils/log.js +0 -0
- /package/{dist → lib}/utils/reactShim.d.ts +0 -0
- /package/{dist → lib}/utils/reactShim.js +0 -0
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
import { execa } from "execa";
|
|
2
|
-
import { existsSync, readFileSync } from "fs";
|
|
3
|
-
import { sync as globSync } from "glob";
|
|
4
|
-
import { resolve as pathResolve } from "path";
|
|
5
|
-
import { LexConfig, getTypeScriptConfigPath } from "../../LexConfig.js";
|
|
6
|
-
import { createSpinner } from "../../utils/app.js";
|
|
7
|
-
import { getDirName, resolveBinaryPath } from "../../utils/file.js";
|
|
8
|
-
import { log } from "../../utils/log.js";
|
|
9
|
-
import { aiFunction } from "../ai/ai.js";
|
|
10
|
-
const detectESM = (cwd) => {
|
|
11
|
-
const packageJsonPath = pathResolve(cwd, "package.json");
|
|
12
|
-
if (existsSync(packageJsonPath)) {
|
|
13
|
-
try {
|
|
14
|
-
const packageJsonContent = readFileSync(packageJsonPath, "utf8");
|
|
15
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
16
|
-
return packageJson.type === "module";
|
|
17
|
-
} catch (_error) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
};
|
|
23
|
-
const getTestFilePatterns = (testPathPattern) => {
|
|
24
|
-
const defaultPatterns = ["**/*.test.*", "**/*.spec.*", "**/*.integration.*"];
|
|
25
|
-
if (!testPathPattern) {
|
|
26
|
-
return defaultPatterns;
|
|
27
|
-
}
|
|
28
|
-
return [testPathPattern];
|
|
29
|
-
};
|
|
30
|
-
const findUncoveredSourceFiles = () => {
|
|
31
|
-
const sourceFiles = globSync("src/**/*.{ts,tsx,js,jsx}", {
|
|
32
|
-
cwd: process.cwd(),
|
|
33
|
-
ignore: ["**/node_modules/**", "**/dist/**", "**/*.test.*", "**/*.spec.*"]
|
|
34
|
-
});
|
|
35
|
-
const testFiles = globSync("**/*.{test,spec}.{ts,tsx,js,jsx}", {
|
|
36
|
-
cwd: process.cwd(),
|
|
37
|
-
ignore: ["**/node_modules/**", "**/dist/**"]
|
|
38
|
-
});
|
|
39
|
-
return sourceFiles.filter((sourceFile) => {
|
|
40
|
-
const baseName = sourceFile.replace(/\.[^/.]+$/, "");
|
|
41
|
-
return !testFiles.some((testFile) => testFile.includes(baseName));
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
const processTestResults = (outputFile) => {
|
|
45
|
-
if (!outputFile) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const content = readFileSync(outputFile, "utf-8");
|
|
50
|
-
return JSON.parse(content);
|
|
51
|
-
} catch (_error) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const test = async (options, args, callback = process.exit) => {
|
|
56
|
-
const {
|
|
57
|
-
analyze = false,
|
|
58
|
-
aiAnalyze = false,
|
|
59
|
-
aiDebug = false,
|
|
60
|
-
aiGenerate = false,
|
|
61
|
-
bail,
|
|
62
|
-
changedFilesWithAncestor,
|
|
63
|
-
changedSince,
|
|
64
|
-
ci,
|
|
65
|
-
cliName = "Lex",
|
|
66
|
-
collectCoverageFrom,
|
|
67
|
-
colors,
|
|
68
|
-
config,
|
|
69
|
-
debug = false,
|
|
70
|
-
debugTests = false,
|
|
71
|
-
detectOpenHandles,
|
|
72
|
-
env,
|
|
73
|
-
errorOnDeprecated,
|
|
74
|
-
expand,
|
|
75
|
-
forceExit,
|
|
76
|
-
generate = false,
|
|
77
|
-
json,
|
|
78
|
-
lastCommit,
|
|
79
|
-
listTests,
|
|
80
|
-
logHeapUsage,
|
|
81
|
-
maxWorkers,
|
|
82
|
-
noStackTrace,
|
|
83
|
-
notify,
|
|
84
|
-
onlyChanged,
|
|
85
|
-
outputFile,
|
|
86
|
-
passWithNoTests,
|
|
87
|
-
quiet,
|
|
88
|
-
removeCache,
|
|
89
|
-
runInBand,
|
|
90
|
-
setup,
|
|
91
|
-
showConfig,
|
|
92
|
-
silent,
|
|
93
|
-
testLocationInResults,
|
|
94
|
-
testNamePattern,
|
|
95
|
-
testPathPattern,
|
|
96
|
-
update,
|
|
97
|
-
useStderr,
|
|
98
|
-
verbose,
|
|
99
|
-
watch,
|
|
100
|
-
watchAll
|
|
101
|
-
} = options;
|
|
102
|
-
const useGenerate = generate || aiGenerate;
|
|
103
|
-
const useAnalyze = analyze || aiAnalyze;
|
|
104
|
-
const useDebug = debugTests || aiDebug;
|
|
105
|
-
log(`${cliName} testing...`, "info", quiet);
|
|
106
|
-
const spinner = createSpinner(quiet);
|
|
107
|
-
await LexConfig.parseConfig(options);
|
|
108
|
-
const { useTypescript } = LexConfig.config;
|
|
109
|
-
if (useTypescript) {
|
|
110
|
-
const testConfigPath = getTypeScriptConfigPath("tsconfig.test.json");
|
|
111
|
-
if (existsSync(testConfigPath)) {
|
|
112
|
-
log("Using tsconfig.test.json for testing...", "info", quiet);
|
|
113
|
-
} else {
|
|
114
|
-
LexConfig.checkTestTypescriptConfig();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (useGenerate) {
|
|
118
|
-
spinner.start("AI is analyzing code to generate test cases...");
|
|
119
|
-
try {
|
|
120
|
-
const uncoveredFiles = findUncoveredSourceFiles();
|
|
121
|
-
if (uncoveredFiles.length > 0) {
|
|
122
|
-
const targetFile = uncoveredFiles[0];
|
|
123
|
-
await aiFunction({
|
|
124
|
-
prompt: `Generate Jest unit tests for this file: ${targetFile}
|
|
125
|
-
|
|
126
|
-
${readFileSync(targetFile, "utf-8")}
|
|
127
|
-
|
|
128
|
-
Please create comprehensive tests that cover the main functionality. Include test fixtures and mocks where necessary.`,
|
|
129
|
-
task: "test",
|
|
130
|
-
file: targetFile,
|
|
131
|
-
context: true,
|
|
132
|
-
quiet
|
|
133
|
-
});
|
|
134
|
-
spinner.succeed(`AI test generation suggestions provided for ${targetFile}`);
|
|
135
|
-
} else {
|
|
136
|
-
spinner.succeed("All source files appear to have corresponding test files");
|
|
137
|
-
}
|
|
138
|
-
} catch (aiError) {
|
|
139
|
-
spinner.fail("Could not generate AI test suggestions");
|
|
140
|
-
if (!quiet) {
|
|
141
|
-
console.error("AI test generation error:", aiError);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const dirName = getDirName();
|
|
146
|
-
const dirPath = pathResolve(dirName, "../..");
|
|
147
|
-
const projectJestBin = pathResolve(process.cwd(), "node_modules/.bin/jest");
|
|
148
|
-
let jestPath;
|
|
149
|
-
if (existsSync(projectJestBin)) {
|
|
150
|
-
jestPath = projectJestBin;
|
|
151
|
-
} else {
|
|
152
|
-
jestPath = resolveBinaryPath("jest");
|
|
153
|
-
}
|
|
154
|
-
if (!jestPath) {
|
|
155
|
-
log(`
|
|
156
|
-
${cliName} Error: Jest binary not found in Lex's node_modules or monorepo root`, "error", quiet);
|
|
157
|
-
log("Please reinstall Lex or check your installation.", "info", quiet);
|
|
158
|
-
return 1;
|
|
159
|
-
}
|
|
160
|
-
let jestConfigFile;
|
|
161
|
-
let projectJestConfig = null;
|
|
162
|
-
if (config) {
|
|
163
|
-
jestConfigFile = config;
|
|
164
|
-
} else {
|
|
165
|
-
const projectJestConfigPath = pathResolve(process.cwd(), "jest.config.js");
|
|
166
|
-
const projectJestConfigCjsPath = pathResolve(process.cwd(), "jest.config.cjs");
|
|
167
|
-
const projectJestConfigMjsPath = pathResolve(process.cwd(), "jest.config.mjs");
|
|
168
|
-
const projectJestConfigJsonPath = pathResolve(process.cwd(), "jest.config.json");
|
|
169
|
-
if (existsSync(projectJestConfigPath)) {
|
|
170
|
-
jestConfigFile = projectJestConfigPath;
|
|
171
|
-
if (debug) {
|
|
172
|
-
log(`Using project Jest config file: ${jestConfigFile}`, "info", quiet);
|
|
173
|
-
}
|
|
174
|
-
} else if (existsSync(projectJestConfigCjsPath)) {
|
|
175
|
-
jestConfigFile = projectJestConfigCjsPath;
|
|
176
|
-
if (debug) {
|
|
177
|
-
log(`Using project Jest config file (CJS): ${jestConfigFile}`, "info", quiet);
|
|
178
|
-
}
|
|
179
|
-
} else if (existsSync(projectJestConfigMjsPath)) {
|
|
180
|
-
jestConfigFile = projectJestConfigMjsPath;
|
|
181
|
-
if (debug) {
|
|
182
|
-
log(`Using project Jest config file (MJS): ${jestConfigFile}`, "info", quiet);
|
|
183
|
-
}
|
|
184
|
-
} else if (existsSync(projectJestConfigJsonPath)) {
|
|
185
|
-
jestConfigFile = projectJestConfigJsonPath;
|
|
186
|
-
if (debug) {
|
|
187
|
-
log(`Using project Jest config file (JSON): ${jestConfigFile}`, "info", quiet);
|
|
188
|
-
}
|
|
189
|
-
} else {
|
|
190
|
-
projectJestConfig = LexConfig.config.jest;
|
|
191
|
-
const lexDir = LexConfig.getLexDir();
|
|
192
|
-
const lexJestConfig = pathResolve(lexDir, "jest.config.mjs");
|
|
193
|
-
if (debug) {
|
|
194
|
-
log(`Looking for Jest config at: ${lexJestConfig}`, "info", quiet);
|
|
195
|
-
log(`File exists: ${existsSync(lexJestConfig)}`, "info", quiet);
|
|
196
|
-
}
|
|
197
|
-
if (existsSync(lexJestConfig)) {
|
|
198
|
-
jestConfigFile = lexJestConfig;
|
|
199
|
-
if (projectJestConfig && Object.keys(projectJestConfig).length > 0) {
|
|
200
|
-
if (debug) {
|
|
201
|
-
log(`Using Lex Jest config with project Jest config from lex.config.cjs: ${jestConfigFile}`, "info", quiet);
|
|
202
|
-
}
|
|
203
|
-
} else {
|
|
204
|
-
if (debug) {
|
|
205
|
-
log(`Using Lex Jest config (no project Jest config found): ${jestConfigFile}`, "info", quiet);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
} else {
|
|
209
|
-
if (debug) {
|
|
210
|
-
log("No Jest config found in project or Lex", "warn", quiet);
|
|
211
|
-
}
|
|
212
|
-
jestConfigFile = "";
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
const jestSetupFile = setup || pathResolve(process.cwd(), "jest.setup.js");
|
|
217
|
-
const jestOptions = ["--no-cache"];
|
|
218
|
-
const isESM = detectESM(process.cwd());
|
|
219
|
-
let nodeOptions = process.env.NODE_OPTIONS || "";
|
|
220
|
-
if (isESM) {
|
|
221
|
-
if (!nodeOptions.includes("--experimental-vm-modules")) {
|
|
222
|
-
nodeOptions = `${nodeOptions} --experimental-vm-modules`.trim();
|
|
223
|
-
}
|
|
224
|
-
log("ESM project detected, using --experimental-vm-modules in NODE_OPTIONS", "info", quiet);
|
|
225
|
-
}
|
|
226
|
-
if (jestConfigFile) {
|
|
227
|
-
jestOptions.push("--config", jestConfigFile);
|
|
228
|
-
}
|
|
229
|
-
if (bail) {
|
|
230
|
-
jestOptions.push("--bail");
|
|
231
|
-
}
|
|
232
|
-
if (changedFilesWithAncestor) {
|
|
233
|
-
jestOptions.push("--changedFilesWithAncestor");
|
|
234
|
-
}
|
|
235
|
-
if (changedSince) {
|
|
236
|
-
jestOptions.push("--changedSince");
|
|
237
|
-
}
|
|
238
|
-
if (ci) {
|
|
239
|
-
jestOptions.push("--ci");
|
|
240
|
-
}
|
|
241
|
-
if (collectCoverageFrom) {
|
|
242
|
-
jestOptions.push("--collectCoverageFrom", collectCoverageFrom);
|
|
243
|
-
}
|
|
244
|
-
if (colors) {
|
|
245
|
-
jestOptions.push("--colors");
|
|
246
|
-
}
|
|
247
|
-
if (debug) {
|
|
248
|
-
jestOptions.push("--debug");
|
|
249
|
-
}
|
|
250
|
-
if (detectOpenHandles) {
|
|
251
|
-
jestOptions.push("--detectOpenHandles");
|
|
252
|
-
}
|
|
253
|
-
if (env) {
|
|
254
|
-
jestOptions.push("--env");
|
|
255
|
-
}
|
|
256
|
-
if (errorOnDeprecated) {
|
|
257
|
-
jestOptions.push("--errorOnDeprecated");
|
|
258
|
-
}
|
|
259
|
-
if (expand) {
|
|
260
|
-
jestOptions.push("--expand");
|
|
261
|
-
}
|
|
262
|
-
if (forceExit) {
|
|
263
|
-
jestOptions.push("--forceExit");
|
|
264
|
-
}
|
|
265
|
-
if (json) {
|
|
266
|
-
jestOptions.push("--json");
|
|
267
|
-
}
|
|
268
|
-
if (lastCommit) {
|
|
269
|
-
jestOptions.push("--lastCommit");
|
|
270
|
-
}
|
|
271
|
-
if (listTests) {
|
|
272
|
-
jestOptions.push("--listTests");
|
|
273
|
-
}
|
|
274
|
-
if (logHeapUsage) {
|
|
275
|
-
jestOptions.push("--logHeapUsage");
|
|
276
|
-
}
|
|
277
|
-
if (maxWorkers) {
|
|
278
|
-
jestOptions.push("--maxWorkers", maxWorkers);
|
|
279
|
-
}
|
|
280
|
-
if (noStackTrace) {
|
|
281
|
-
jestOptions.push("--noStackTrace");
|
|
282
|
-
}
|
|
283
|
-
if (notify) {
|
|
284
|
-
jestOptions.push("--notify");
|
|
285
|
-
}
|
|
286
|
-
if (onlyChanged) {
|
|
287
|
-
jestOptions.push("--onlyChanged");
|
|
288
|
-
}
|
|
289
|
-
let tempOutputFile = outputFile;
|
|
290
|
-
if ((useAnalyze || useDebug) && !outputFile) {
|
|
291
|
-
tempOutputFile = ".lex-test-results.json";
|
|
292
|
-
jestOptions.push("--json", "--outputFile", tempOutputFile);
|
|
293
|
-
} else if (outputFile) {
|
|
294
|
-
jestOptions.push("--outputFile", outputFile);
|
|
295
|
-
}
|
|
296
|
-
if (passWithNoTests) {
|
|
297
|
-
jestOptions.push("--passWithNoTests");
|
|
298
|
-
}
|
|
299
|
-
if (runInBand) {
|
|
300
|
-
jestOptions.push("--runInBand");
|
|
301
|
-
}
|
|
302
|
-
if (showConfig) {
|
|
303
|
-
jestOptions.push("--showConfig");
|
|
304
|
-
}
|
|
305
|
-
if (silent) {
|
|
306
|
-
jestOptions.push("--silent");
|
|
307
|
-
}
|
|
308
|
-
if (testLocationInResults) {
|
|
309
|
-
jestOptions.push("--testLocationInResults");
|
|
310
|
-
}
|
|
311
|
-
if (testNamePattern) {
|
|
312
|
-
jestOptions.push("--testNamePattern", testNamePattern);
|
|
313
|
-
}
|
|
314
|
-
if (testPathPattern) {
|
|
315
|
-
jestOptions.push("--testPathPattern", testPathPattern);
|
|
316
|
-
}
|
|
317
|
-
if (useStderr) {
|
|
318
|
-
jestOptions.push("--useStderr");
|
|
319
|
-
}
|
|
320
|
-
if (verbose) {
|
|
321
|
-
jestOptions.push("--verbose");
|
|
322
|
-
}
|
|
323
|
-
if (watchAll) {
|
|
324
|
-
jestOptions.push("--watchAll");
|
|
325
|
-
}
|
|
326
|
-
if (removeCache) {
|
|
327
|
-
jestOptions.push("--no-cache");
|
|
328
|
-
}
|
|
329
|
-
if (jestSetupFile && existsSync(jestSetupFile)) {
|
|
330
|
-
jestOptions.push(`--setupFilesAfterEnv=${jestSetupFile}`);
|
|
331
|
-
}
|
|
332
|
-
if (update) {
|
|
333
|
-
jestOptions.push("--updateSnapshot");
|
|
334
|
-
}
|
|
335
|
-
if (watch) {
|
|
336
|
-
jestOptions.push("--watch", watch);
|
|
337
|
-
}
|
|
338
|
-
if (args) {
|
|
339
|
-
jestOptions.push(...args);
|
|
340
|
-
}
|
|
341
|
-
if (debug) {
|
|
342
|
-
log(`Jest options: ${jestOptions.join(" ")}`, "info", quiet);
|
|
343
|
-
log(`NODE_OPTIONS: ${nodeOptions}`, "info", quiet);
|
|
344
|
-
}
|
|
345
|
-
try {
|
|
346
|
-
const env2 = {
|
|
347
|
-
...process.env,
|
|
348
|
-
NODE_OPTIONS: nodeOptions
|
|
349
|
-
};
|
|
350
|
-
await execa(jestPath, jestOptions, {
|
|
351
|
-
encoding: "utf8",
|
|
352
|
-
stdio: "inherit",
|
|
353
|
-
env: env2
|
|
354
|
-
});
|
|
355
|
-
spinner.succeed("Testing completed!");
|
|
356
|
-
if (useAnalyze) {
|
|
357
|
-
spinner.start("AI is analyzing test coverage and suggesting improvements...");
|
|
358
|
-
try {
|
|
359
|
-
const testResults = processTestResults(tempOutputFile);
|
|
360
|
-
const filePatterns = getTestFilePatterns(testPathPattern);
|
|
361
|
-
await aiFunction({
|
|
362
|
-
prompt: `Analyze these Jest test results and suggest test coverage improvements:
|
|
363
|
-
|
|
364
|
-
${JSON.stringify(testResults, null, 2)}
|
|
365
|
-
|
|
366
|
-
Test patterns: ${filePatterns.join(", ")}
|
|
367
|
-
|
|
368
|
-
Please provide:
|
|
369
|
-
1. Analysis of current coverage gaps
|
|
370
|
-
2. Suggestions for improving test cases
|
|
371
|
-
3. Recommendations for additional integration test scenarios
|
|
372
|
-
4. Best practices for increasing test effectiveness`,
|
|
373
|
-
task: "optimize",
|
|
374
|
-
context: true,
|
|
375
|
-
quiet
|
|
376
|
-
});
|
|
377
|
-
spinner.succeed("AI test analysis complete");
|
|
378
|
-
} catch (aiError) {
|
|
379
|
-
spinner.fail("Could not generate AI test analysis");
|
|
380
|
-
if (!quiet) {
|
|
381
|
-
console.error("AI analysis error:", aiError);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
callback(0);
|
|
386
|
-
return 0;
|
|
387
|
-
} catch (error) {
|
|
388
|
-
log(`
|
|
389
|
-
${cliName} Error: Check for unit test errors and/or coverage.`, "error", quiet);
|
|
390
|
-
spinner.fail("Testing failed!");
|
|
391
|
-
if (useDebug) {
|
|
392
|
-
spinner.start("AI is analyzing test failures...");
|
|
393
|
-
try {
|
|
394
|
-
const testResults = processTestResults(tempOutputFile);
|
|
395
|
-
await aiFunction({
|
|
396
|
-
prompt: `Debug these failed Jest tests and suggest fixes:
|
|
397
|
-
|
|
398
|
-
${JSON.stringify(error.message, null, 2)}
|
|
399
|
-
|
|
400
|
-
Test results: ${JSON.stringify(testResults, null, 2)}
|
|
401
|
-
|
|
402
|
-
Please provide:
|
|
403
|
-
1. Analysis of why the tests are failing
|
|
404
|
-
2. Specific suggestions to fix each failing test
|
|
405
|
-
3. Any potential issues with test fixtures or mocks
|
|
406
|
-
4. Code examples for solutions`,
|
|
407
|
-
task: "help",
|
|
408
|
-
context: true,
|
|
409
|
-
quiet
|
|
410
|
-
});
|
|
411
|
-
spinner.succeed("AI debugging assistance complete");
|
|
412
|
-
} catch (aiError) {
|
|
413
|
-
spinner.fail("Could not generate AI debugging assistance");
|
|
414
|
-
if (!quiet) {
|
|
415
|
-
console.error("AI debugging error:", aiError);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
callback(1);
|
|
420
|
-
return 1;
|
|
421
|
-
}
|
|
422
|
-
};
|
|
423
|
-
var test_default = test;
|
|
424
|
-
export {
|
|
425
|
-
test_default as default,
|
|
426
|
-
getTestFilePatterns,
|
|
427
|
-
test
|
|
428
|
-
};
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Rlc3QvdGVzdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRofSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtnZXREaXJOYW1lLCByZXNvbHZlQmluYXJ5UGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi4vYWkvYWkuanMnO1xuXG5jb25zdCBkZXRlY3RFU00gPSAoY3dkOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aFJlc29sdmUoY3dkLCAncGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYWlEZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpR2VuZXJhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBhaUFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBiYWlsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZFNpbmNlPzogc3RyaW5nO1xuICByZWFkb25seSBjaT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbGxlY3RDb3ZlcmFnZUZyb20/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbG9ycz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkZWJ1Z1Rlc3RzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGV0ZWN0T3BlbkhhbmRsZXM/OiBib29sZWFuO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVycm9yT25EZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXhwYW5kPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm9yY2VFeGl0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZ2VuZXJhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBqc29uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGFzdENvbW1pdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpc3RUZXN0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxvZ0hlYXBVc2FnZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1heFdvcmtlcnM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vU3RhY2tUcmFjZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5vdGlmeT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9ubHlDaGFuZ2VkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3V0cHV0RmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc1dpdGhOb1Rlc3RzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmVDYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJ1bkluQmFuZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNldHVwPzogc3RyaW5nO1xuICByZWFkb25seSBzaG93Q29uZmlnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2lsZW50PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdExvY2F0aW9uSW5SZXN1bHRzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdE5hbWVQYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXN0UGF0aFBhdHRlcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVwZGF0ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHVzZVN0ZGVycj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuICByZWFkb25seSB3YXRjaD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2F0Y2hBbGw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBUZXN0Q2FsbGJhY2sgPSB0eXBlb2YgcHJvY2Vzcy5leGl0O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVzdEZpbGVQYXR0ZXJucyA9ICh0ZXN0UGF0aFBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRQYXR0ZXJucyA9IFsnKiovKi50ZXN0LionLCAnKiovKi5zcGVjLionLCAnKiovKi5pbnRlZ3JhdGlvbi4qJ107XG5cbiAgaWYoIXRlc3RQYXRoUGF0dGVybikge1xuICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnM7XG4gIH1cblxuICByZXR1cm4gW3Rlc3RQYXRoUGF0dGVybl07XG59O1xuXG5jb25zdCBmaW5kVW5jb3ZlcmVkU291cmNlRmlsZXMgPSAoKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzb3VyY2VGaWxlcyA9IGdsb2JTeW5jKCdzcmMvKiovKi57dHMsdHN4LGpzLGpzeH0nLCB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi8qLnRlc3QuKicsICcqKi8qLnNwZWMuKiddXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RGaWxlcyA9IGdsb2JTeW5jKCcqKi8qLnt0ZXN0LHNwZWN9Lnt0cyx0c3gsanMsanN4fScsIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJ11cbiAgfSk7XG5cbiAgcmV0dXJuIHNvdXJjZUZpbGVzLmZpbHRlcigoc291cmNlRmlsZSkgPT4ge1xuICAgIGNvbnN0IGJhc2VOYW1lID0gc291cmNlRmlsZS5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgIHJldHVybiAhdGVzdEZpbGVzLnNvbWUoKHRlc3RGaWxlKSA9PiB0ZXN0RmlsZS5pbmNsdWRlcyhiYXNlTmFtZSkpO1xuICB9KTtcbn07XG5cbmNvbnN0IHByb2Nlc3NUZXN0UmVzdWx0cyA9IChvdXRwdXRGaWxlPzogc3RyaW5nKTogYW55ID0+IHtcbiAgaWYoIW91dHB1dEZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhvdXRwdXRGaWxlLCAndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRlc3QgPSBhc3luYyAob3B0aW9uczogVGVzdE9wdGlvbnMsIGFyZ3M6IHN0cmluZ1tdLCBjYWxsYmFjazogVGVzdENhbGxiYWNrID0gcHJvY2Vzcy5leGl0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGFuYWx5emUgPSBmYWxzZSxcbiAgICBhaUFuYWx5emUgPSBmYWxzZSxcbiAgICBhaURlYnVnID0gZmFsc2UsXG4gICAgYWlHZW5lcmF0ZSA9IGZhbHNlLFxuICAgIGJhaWwsXG4gICAgY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yLFxuICAgIGNoYW5nZWRTaW5jZSxcbiAgICBjaSxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29sbGVjdENvdmVyYWdlRnJvbSxcbiAgICBjb2xvcnMsXG4gICAgY29uZmlnLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgZGVidWdUZXN0cyA9IGZhbHNlLFxuICAgIGRldGVjdE9wZW5IYW5kbGVzLFxuICAgIGVudixcbiAgICBlcnJvck9uRGVwcmVjYXRlZCxcbiAgICBleHBhbmQsXG4gICAgZm9yY2VFeGl0LFxuICAgIGdlbmVyYXRlID0gZmFsc2UsXG4gICAganNvbixcbiAgICBsYXN0Q29tbWl0LFxuICAgIGxpc3RUZXN0cyxcbiAgICBsb2dIZWFwVXNhZ2UsXG4gICAgbWF4V29ya2VycyxcbiAgICBub1N0YWNrVHJhY2UsXG4gICAgbm90aWZ5LFxuICAgIG9ubHlDaGFuZ2VkLFxuICAgIG91dHB1dEZpbGUsXG4gICAgcGFzc1dpdGhOb1Rlc3RzLFxuICAgIHF1aWV0LFxuICAgIHJlbW92ZUNhY2hlLFxuICAgIHJ1bkluQmFuZCxcbiAgICBzZXR1cCxcbiAgICBzaG93Q29uZmlnLFxuICAgIHNpbGVudCxcbiAgICB0ZXN0TG9jYXRpb25JblJlc3VsdHMsXG4gICAgdGVzdE5hbWVQYXR0ZXJuLFxuICAgIHRlc3RQYXRoUGF0dGVybixcbiAgICB1cGRhdGUsXG4gICAgdXNlU3RkZXJyLFxuICAgIHZlcmJvc2UsXG4gICAgd2F0Y2gsXG4gICAgd2F0Y2hBbGxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdXNlR2VuZXJhdGUgPSBnZW5lcmF0ZSB8fCBhaUdlbmVyYXRlO1xuICBjb25zdCB1c2VBbmFseXplID0gYW5hbHl6ZSB8fCBhaUFuYWx5emU7XG4gIGNvbnN0IHVzZURlYnVnID0gZGVidWdUZXN0cyB8fCBhaURlYnVnO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSB0ZXN0aW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhvcHRpb25zKTtcblxuICBjb25zdCB7dXNlVHlwZXNjcmlwdH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBjb25zdCB0ZXN0Q29uZmlnUGF0aCA9IGdldFR5cGVTY3JpcHRDb25maWdQYXRoKCd0c2NvbmZpZy50ZXN0Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHRlc3RDb25maWdQYXRoKSkge1xuICAgICAgbG9nKCdVc2luZyB0c2NvbmZpZy50ZXN0Lmpzb24gZm9yIHRlc3RpbmcuLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgTGV4Q29uZmlnLmNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICBpZih1c2VHZW5lcmF0ZSkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0FJIGlzIGFuYWx5emluZyBjb2RlIHRvIGdlbmVyYXRlIHRlc3QgY2FzZXMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1bmNvdmVyZWRGaWxlcyA9IGZpbmRVbmNvdmVyZWRTb3VyY2VGaWxlcygpO1xuXG4gICAgICBpZih1bmNvdmVyZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSB1bmNvdmVyZWRGaWxlc1swXTtcblxuICAgICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgICBwcm9tcHQ6IGBHZW5lcmF0ZSBKZXN0IHVuaXQgdGVzdHMgZm9yIHRoaXMgZmlsZTogJHt0YXJnZXRGaWxlfVxcblxcbiR7cmVhZEZpbGVTeW5jKHRhcmdldEZpbGUsICd1dGYtOCcpfVxcblxcblBsZWFzZSBjcmVhdGUgY29tcHJlaGVuc2l2ZSB0ZXN0cyB0aGF0IGNvdmVyIHRoZSBtYWluIGZ1bmN0aW9uYWxpdHkuIEluY2x1ZGUgdGVzdCBmaXh0dXJlcyBhbmQgbW9ja3Mgd2hlcmUgbmVjZXNzYXJ5LmAsXG4gICAgICAgICAgdGFzazogJ3Rlc3QnLFxuICAgICAgICAgIGZpbGU6IHRhcmdldEZpbGUsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYEFJIHRlc3QgZ2VuZXJhdGlvbiBzdWdnZXN0aW9ucyBwcm92aWRlZCBmb3IgJHt0YXJnZXRGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBbGwgc291cmNlIGZpbGVzIGFwcGVhciB0byBoYXZlIGNvcnJlc3BvbmRpbmcgdGVzdCBmaWxlcycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgdGVzdCBzdWdnZXN0aW9ucycpO1xuICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIHRlc3QgZ2VuZXJhdGlvbiBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZSgpO1xuICBjb25zdCBkaXJQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4nKTtcblxuICBjb25zdCBwcm9qZWN0SmVzdEJpbiA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvLmJpbi9qZXN0Jyk7XG4gIGxldCBqZXN0UGF0aDogc3RyaW5nO1xuICBpZihleGlzdHNTeW5jKHByb2plY3RKZXN0QmluKSkge1xuICAgIGplc3RQYXRoID0gcHJvamVjdEplc3RCaW47XG4gIH0gZWxzZSB7XG4gICAgamVzdFBhdGggPSByZXNvbHZlQmluYXJ5UGF0aCgnamVzdCcpO1xuICB9XG5cbiAgaWYoIWplc3RQYXRoKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBKZXN0IGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzIG9yIG1vbm9yZXBvIHJvb3RgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgbG9nKCdQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIGluc3RhbGxhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCBqZXN0Q29uZmlnRmlsZTogc3RyaW5nO1xuICBsZXQgcHJvamVjdEplc3RDb25maWc6IGFueSA9IG51bGw7XG5cbiAgaWYoY29uZmlnKSB7XG4gICAgamVzdENvbmZpZ0ZpbGUgPSBjb25maWc7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvamVjdEplc3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2plc3QuY29uZmlnLmpzJyk7XG4gICAgY29uc3QgcHJvamVjdEplc3RDb25maWdDanNQYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2plc3QuY29uZmlnLmNqcycpO1xuICAgIGNvbnN0IHByb2plY3RKZXN0Q29uZmlnTWpzUGF0aCA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdqZXN0LmNvbmZpZy5tanMnKTtcbiAgICBjb25zdCBwcm9qZWN0SmVzdENvbmZpZ0pzb25QYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2plc3QuY29uZmlnLmpzb24nKTtcblxuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdEplc3RDb25maWdQYXRoKSkge1xuICAgICAgamVzdENvbmZpZ0ZpbGUgPSBwcm9qZWN0SmVzdENvbmZpZ1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIHByb2plY3QgSmVzdCBjb25maWcgZmlsZTogJHtqZXN0Q29uZmlnRmlsZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZXhpc3RzU3luYyhwcm9qZWN0SmVzdENvbmZpZ0Nqc1BhdGgpKSB7XG4gICAgICBqZXN0Q29uZmlnRmlsZSA9IHByb2plY3RKZXN0Q29uZmlnQ2pzUGF0aDtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgcHJvamVjdCBKZXN0IGNvbmZpZyBmaWxlIChDSlMpOiAke2plc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihleGlzdHNTeW5jKHByb2plY3RKZXN0Q29uZmlnTWpzUGF0aCkpIHtcbiAgICAgIGplc3RDb25maWdGaWxlID0gcHJvamVjdEplc3RDb25maWdNanNQYXRoO1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBVc2luZyBwcm9qZWN0IEplc3QgY29uZmlnIGZpbGUgKE1KUyk6ICR7amVzdENvbmZpZ0ZpbGV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGV4aXN0c1N5bmMocHJvamVjdEplc3RDb25maWdKc29uUGF0aCkpIHtcbiAgICAgIGplc3RDb25maWdGaWxlID0gcHJvamVjdEplc3RDb25maWdKc29uUGF0aDtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgcHJvamVjdCBKZXN0IGNvbmZpZyBmaWxlIChKU09OKTogJHtqZXN0Q29uZmlnRmlsZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gSmVzdCBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3RcbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBKZXN0IGNvbmZpZyBpbiBsZXguY29uZmlnLmNqc1xuICAgICAgcHJvamVjdEplc3RDb25maWcgPSBMZXhDb25maWcuY29uZmlnLmplc3Q7XG5cbiAgICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICAgIGNvbnN0IGxleEplc3RDb25maWcgPSBwYXRoUmVzb2x2ZShsZXhEaXIsICdqZXN0LmNvbmZpZy5tanMnKTtcblxuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBMb29raW5nIGZvciBKZXN0IGNvbmZpZyBhdDogJHtsZXhKZXN0Q29uZmlnfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYEZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMobGV4SmVzdENvbmZpZyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGlmKGV4aXN0c1N5bmMobGV4SmVzdENvbmZpZykpIHtcbiAgICAgICAgamVzdENvbmZpZ0ZpbGUgPSBsZXhKZXN0Q29uZmlnO1xuICAgICAgICBpZihwcm9qZWN0SmVzdENvbmZpZyAmJiBPYmplY3Qua2V5cyhwcm9qZWN0SmVzdENvbmZpZykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYFVzaW5nIExleCBKZXN0IGNvbmZpZyB3aXRoIHByb2plY3QgSmVzdCBjb25maWcgZnJvbSBsZXguY29uZmlnLmNqczogJHtqZXN0Q29uZmlnRmlsZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgTGV4IEplc3QgY29uZmlnIChubyBwcm9qZWN0IEplc3QgY29uZmlnIGZvdW5kKTogJHtqZXN0Q29uZmlnRmlsZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKCdObyBKZXN0IGNvbmZpZyBmb3VuZCBpbiBwcm9qZWN0IG9yIExleCcsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICAgIGplc3RDb25maWdGaWxlID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgamVzdFNldHVwRmlsZTogc3RyaW5nID0gc2V0dXAgfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2plc3Quc2V0dXAuanMnKTtcbiAgY29uc3QgamVzdE9wdGlvbnM6IHN0cmluZ1tdID0gWyctLW5vLWNhY2hlJ107XG5cbiAgY29uc3QgaXNFU00gPSBkZXRlY3RFU00ocHJvY2Vzcy5jd2QoKSk7XG4gIGxldCBub2RlT3B0aW9ucyA9IHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyB8fCAnJztcbiAgaWYoaXNFU00pIHtcbiAgICBpZighbm9kZU9wdGlvbnMuaW5jbHVkZXMoJy0tZXhwZXJpbWVudGFsLXZtLW1vZHVsZXMnKSkge1xuICAgICAgbm9kZU9wdGlvbnMgPSBgJHtub2RlT3B0aW9uc30gLS1leHBlcmltZW50YWwtdm0tbW9kdWxlc2AudHJpbSgpO1xuICAgIH1cbiAgICBsb2coJ0VTTSBwcm9qZWN0IGRldGVjdGVkLCB1c2luZyAtLWV4cGVyaW1lbnRhbC12bS1tb2R1bGVzIGluIE5PREVfT1BUSU9OUycsICdpbmZvJywgcXVpZXQpO1xuICB9XG5cbiAgaWYoamVzdENvbmZpZ0ZpbGUpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNvbmZpZycsIGplc3RDb25maWdGaWxlKTtcbiAgfVxuXG4gIGlmKGJhaWwpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWJhaWwnKTtcbiAgfVxuXG4gIGlmKGNoYW5nZWRGaWxlc1dpdGhBbmNlc3Rvcikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yJyk7XG4gIH1cblxuICBpZihjaGFuZ2VkU2luY2UpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNoYW5nZWRTaW5jZScpO1xuICB9XG5cbiAgaWYoY2kpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNpJyk7XG4gIH1cblxuICBpZihjb2xsZWN0Q292ZXJhZ2VGcm9tKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1jb2xsZWN0Q292ZXJhZ2VGcm9tJywgY29sbGVjdENvdmVyYWdlRnJvbSk7XG4gIH1cblxuICBpZihjb2xvcnMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNvbG9ycycpO1xuICB9XG5cbiAgaWYoZGVidWcpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWRlYnVnJyk7XG4gIH1cblxuICBpZihkZXRlY3RPcGVuSGFuZGxlcykge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZGV0ZWN0T3BlbkhhbmRsZXMnKTtcbiAgfVxuXG4gIGlmKGVudikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZW52Jyk7XG4gIH1cblxuICBpZihlcnJvck9uRGVwcmVjYXRlZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZXJyb3JPbkRlcHJlY2F0ZWQnKTtcbiAgfVxuXG4gIGlmKGV4cGFuZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZXhwYW5kJyk7XG4gIH1cblxuICBpZihmb3JjZUV4aXQpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWZvcmNlRXhpdCcpO1xuICB9XG5cbiAgaWYoanNvbikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tanNvbicpO1xuICB9XG5cbiAgaWYobGFzdENvbW1pdCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tbGFzdENvbW1pdCcpO1xuICB9XG5cbiAgaWYobGlzdFRlc3RzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1saXN0VGVzdHMnKTtcbiAgfVxuXG4gIGlmKGxvZ0hlYXBVc2FnZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tbG9nSGVhcFVzYWdlJyk7XG4gIH1cblxuICBpZihtYXhXb3JrZXJzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1tYXhXb3JrZXJzJywgbWF4V29ya2Vycyk7XG4gIH1cblxuICBpZihub1N0YWNrVHJhY2UpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW5vU3RhY2tUcmFjZScpO1xuICB9XG5cbiAgaWYobm90aWZ5KSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1ub3RpZnknKTtcbiAgfVxuXG4gIGlmKG9ubHlDaGFuZ2VkKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1vbmx5Q2hhbmdlZCcpO1xuICB9XG5cbiAgbGV0IHRlbXBPdXRwdXRGaWxlID0gb3V0cHV0RmlsZTtcblxuICBpZigodXNlQW5hbHl6ZSB8fCB1c2VEZWJ1ZykgJiYgIW91dHB1dEZpbGUpIHtcbiAgICB0ZW1wT3V0cHV0RmlsZSA9ICcubGV4LXRlc3QtcmVzdWx0cy5qc29uJztcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWpzb24nLCAnLS1vdXRwdXRGaWxlJywgdGVtcE91dHB1dEZpbGUpO1xuICB9IGVsc2UgaWYob3V0cHV0RmlsZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tb3V0cHV0RmlsZScsIG91dHB1dEZpbGUpO1xuICB9XG5cbiAgaWYocGFzc1dpdGhOb1Rlc3RzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1wYXNzV2l0aE5vVGVzdHMnKTtcbiAgfVxuXG4gIGlmKHJ1bkluQmFuZCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tcnVuSW5CYW5kJyk7XG4gIH1cblxuICBpZihzaG93Q29uZmlnKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1zaG93Q29uZmlnJyk7XG4gIH1cblxuICBpZihzaWxlbnQpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXNpbGVudCcpO1xuICB9XG5cbiAgaWYodGVzdExvY2F0aW9uSW5SZXN1bHRzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS10ZXN0TG9jYXRpb25JblJlc3VsdHMnKTtcbiAgfVxuXG4gIGlmKHRlc3ROYW1lUGF0dGVybikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdGVzdE5hbWVQYXR0ZXJuJywgdGVzdE5hbWVQYXR0ZXJuKTtcbiAgfVxuXG4gIGlmKHRlc3RQYXRoUGF0dGVybikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdGVzdFBhdGhQYXR0ZXJuJywgdGVzdFBhdGhQYXR0ZXJuKTtcbiAgfVxuXG4gIGlmKHVzZVN0ZGVycikge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tdXNlU3RkZXJyJyk7XG4gIH1cblxuICBpZih2ZXJib3NlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS12ZXJib3NlJyk7XG4gIH1cblxuICBpZih3YXRjaEFsbCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0td2F0Y2hBbGwnKTtcbiAgfVxuXG4gIGlmKHJlbW92ZUNhY2hlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1uby1jYWNoZScpO1xuICB9XG5cbiAgaWYoamVzdFNldHVwRmlsZSAmJiBleGlzdHNTeW5jKGplc3RTZXR1cEZpbGUpKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaChgLS1zZXR1cEZpbGVzQWZ0ZXJFbnY9JHtqZXN0U2V0dXBGaWxlfWApO1xuICB9XG5cbiAgaWYodXBkYXRlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS11cGRhdGVTbmFwc2hvdCcpO1xuICB9XG5cbiAgaWYod2F0Y2gpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXdhdGNoJywgd2F0Y2gpO1xuICB9XG5cbiAgaWYoYXJncykge1xuICAgIGplc3RPcHRpb25zLnB1c2goLi4uYXJncyk7XG4gIH1cblxuICBpZihkZWJ1Zykge1xuICAgIGxvZyhgSmVzdCBvcHRpb25zOiAke2plc3RPcHRpb25zLmpvaW4oJyAnKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYE5PREVfT1BUSU9OUzogJHtub2RlT3B0aW9uc31gLCAnaW5mbycsIHF1aWV0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBOT0RFX09QVElPTlM6IG5vZGVPcHRpb25zXG4gICAgfTtcblxuICAgIGF3YWl0IGV4ZWNhKGplc3RQYXRoLCBqZXN0T3B0aW9ucywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnZcbiAgICB9KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnVGVzdGluZyBjb21wbGV0ZWQhJyk7XG5cbiAgICBpZih1c2VBbmFseXplKSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGVzdCBjb3ZlcmFnZSBhbmQgc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlUGF0dGVybnMgPSBnZXRUZXN0RmlsZVBhdHRlcm5zKHRlc3RQYXRoUGF0dGVybik7XG5cbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgcHJvbXB0OiBgQW5hbHl6ZSB0aGVzZSBKZXN0IHRlc3QgcmVzdWx0cyBhbmQgc3VnZ2VzdCB0ZXN0IGNvdmVyYWdlIGltcHJvdmVtZW50czpcblxuJHtKU09OLnN0cmluZ2lmeSh0ZXN0UmVzdWx0cywgbnVsbCwgMil9XG5cblRlc3QgcGF0dGVybnM6ICR7ZmlsZVBhdHRlcm5zLmpvaW4oJywgJyl9XG5cblBsZWFzZSBwcm92aWRlOlxuMS4gQW5hbHlzaXMgb2YgY3VycmVudCBjb3ZlcmFnZSBnYXBzXG4yLiBTdWdnZXN0aW9ucyBmb3IgaW1wcm92aW5nIHRlc3QgY2FzZXNcbjMuIFJlY29tbWVuZGF0aW9ucyBmb3IgYWRkaXRpb25hbCBpbnRlZ3JhdGlvbiB0ZXN0IHNjZW5hcmlvc1xuNC4gQmVzdCBwcmFjdGljZXMgZm9yIGluY3JlYXNpbmcgdGVzdCBlZmZlY3RpdmVuZXNzYCxcbiAgICAgICAgICB0YXNrOiAnb3B0aW1pemUnLFxuICAgICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgICAgcXVpZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSB0ZXN0IGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgdGVzdCBhbmFseXNpcycpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhbmFseXNpcyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDaGVjayBmb3IgdW5pdCB0ZXN0IGVycm9ycyBhbmQvb3IgY292ZXJhZ2UuYCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgc3Bpbm5lci5mYWlsKCdUZXN0aW5nIGZhaWxlZCEnKTtcblxuICAgIGlmKHVzZURlYnVnKSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGVzdCBmYWlsdXJlcy4uLicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0cyA9IHByb2Nlc3NUZXN0UmVzdWx0cyh0ZW1wT3V0cHV0RmlsZSk7XG5cbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgcHJvbXB0OiBgRGVidWcgdGhlc2UgZmFpbGVkIEplc3QgdGVzdHMgYW5kIHN1Z2dlc3QgZml4ZXM6XG5cbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSwgbnVsbCwgMil9XG5cblRlc3QgcmVzdWx0czogJHtKU09OLnN0cmluZ2lmeSh0ZXN0UmVzdWx0cywgbnVsbCwgMil9XG5cblBsZWFzZSBwcm92aWRlOlxuMS4gQW5hbHlzaXMgb2Ygd2h5IHRoZSB0ZXN0cyBhcmUgZmFpbGluZ1xuMi4gU3BlY2lmaWMgc3VnZ2VzdGlvbnMgdG8gZml4IGVhY2ggZmFpbGluZyB0ZXN0XG4zLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHRlc3QgZml4dHVyZXMgb3IgbW9ja3NcbjQuIENvZGUgZXhhbXBsZXMgZm9yIHNvbHV0aW9uc2AsXG4gICAgICAgICAgdGFzazogJ2hlbHAnLFxuICAgICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgICAgcXVpZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBkZWJ1Z2dpbmcgYXNzaXN0YW5jZSBjb21wbGV0ZScpO1xuICAgICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnQ291bGQgbm90IGdlbmVyYXRlIEFJIGRlYnVnZ2luZyBhc3Npc3RhbmNlJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGRlYnVnZ2luZyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB0ZXN0OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsYUFBWTtBQUNwQixTQUFRLFlBQVksb0JBQW1C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
|
|
@@ -1,132 +0,0 @@
|
|
|
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 { getDirName } from "../../utils/file.js";
|
|
6
|
-
import { log } from "../../utils/log.js";
|
|
7
|
-
const update = async (cmd, callback = process.exit) => {
|
|
8
|
-
const { cliName = "Lex", packageManager: cmdPackageManager, quiet, registry } = cmd;
|
|
9
|
-
log(`${cliName} updating packages...`, "info", quiet);
|
|
10
|
-
const spinner = createSpinner(quiet);
|
|
11
|
-
await LexConfig.parseConfig(cmd);
|
|
12
|
-
const { packageManager: configPackageManager } = LexConfig.config;
|
|
13
|
-
const packageManager = cmdPackageManager || configPackageManager || "npm";
|
|
14
|
-
const isNpm = packageManager === "npm";
|
|
15
|
-
const dirName = getDirName();
|
|
16
|
-
const dirPath = pathResolve(dirName, "../..");
|
|
17
|
-
try {
|
|
18
|
-
if (isNpm) {
|
|
19
|
-
let ncuCommand;
|
|
20
|
-
let ncuArgs;
|
|
21
|
-
try {
|
|
22
|
-
ncuCommand = "npx";
|
|
23
|
-
ncuArgs = [
|
|
24
|
-
"npm-check-updates",
|
|
25
|
-
"--concurrency",
|
|
26
|
-
"10",
|
|
27
|
-
"--packageManager",
|
|
28
|
-
packageManager,
|
|
29
|
-
"--pre",
|
|
30
|
-
"0",
|
|
31
|
-
"--target",
|
|
32
|
-
"latest",
|
|
33
|
-
...cmd.interactive ? ["--interactive"] : [],
|
|
34
|
-
"--upgrade"
|
|
35
|
-
];
|
|
36
|
-
if (registry) {
|
|
37
|
-
ncuArgs.push("--registry", registry);
|
|
38
|
-
}
|
|
39
|
-
await execa(ncuCommand, ncuArgs, {
|
|
40
|
-
encoding: "utf8",
|
|
41
|
-
stdio: "inherit"
|
|
42
|
-
});
|
|
43
|
-
} catch (npxError) {
|
|
44
|
-
try {
|
|
45
|
-
ncuCommand = "npm-check-updates";
|
|
46
|
-
ncuArgs = [
|
|
47
|
-
"--concurrency",
|
|
48
|
-
"10",
|
|
49
|
-
"--packageManager",
|
|
50
|
-
packageManager,
|
|
51
|
-
"--pre",
|
|
52
|
-
"0",
|
|
53
|
-
"--target",
|
|
54
|
-
"latest",
|
|
55
|
-
...cmd.interactive ? ["--interactive"] : [],
|
|
56
|
-
"--upgrade"
|
|
57
|
-
];
|
|
58
|
-
if (registry) {
|
|
59
|
-
ncuArgs.push("--registry", registry);
|
|
60
|
-
}
|
|
61
|
-
await execa(ncuCommand, ncuArgs, {
|
|
62
|
-
encoding: "utf8",
|
|
63
|
-
stdio: "inherit"
|
|
64
|
-
});
|
|
65
|
-
} catch (ncuError) {
|
|
66
|
-
log("npm-check-updates not found. Installing it globally...", "info", quiet);
|
|
67
|
-
try {
|
|
68
|
-
await execa("npm", ["install", "-g", "npm-check-updates"], {
|
|
69
|
-
encoding: "utf8",
|
|
70
|
-
stdio: "inherit"
|
|
71
|
-
});
|
|
72
|
-
ncuCommand = "npm-check-updates";
|
|
73
|
-
ncuArgs = [
|
|
74
|
-
"--concurrency",
|
|
75
|
-
"10",
|
|
76
|
-
"--packageManager",
|
|
77
|
-
packageManager,
|
|
78
|
-
"--pre",
|
|
79
|
-
"0",
|
|
80
|
-
"--target",
|
|
81
|
-
"latest",
|
|
82
|
-
...cmd.interactive ? ["--interactive"] : [],
|
|
83
|
-
"--upgrade"
|
|
84
|
-
];
|
|
85
|
-
if (registry) {
|
|
86
|
-
ncuArgs.push("--registry", registry);
|
|
87
|
-
}
|
|
88
|
-
await execa(ncuCommand, ncuArgs, {
|
|
89
|
-
encoding: "utf8",
|
|
90
|
-
stdio: "inherit"
|
|
91
|
-
});
|
|
92
|
-
} catch (installError) {
|
|
93
|
-
log(`Failed to install or use npm-check-updates: ${installError.message}`, "error", quiet);
|
|
94
|
-
log("Please install npm-check-updates manually: npm install -g npm-check-updates", "info", quiet);
|
|
95
|
-
throw installError;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
await execa("npm", ["i", "--force"], {
|
|
100
|
-
encoding: "utf8",
|
|
101
|
-
stdio: "inherit"
|
|
102
|
-
});
|
|
103
|
-
await execa("npm", ["audit", "fix"], {
|
|
104
|
-
encoding: "utf8",
|
|
105
|
-
stdio: "inherit"
|
|
106
|
-
});
|
|
107
|
-
} else {
|
|
108
|
-
const updateApp = "yarn";
|
|
109
|
-
const updateOptions = [cmd.interactive ? "upgrade-interactive" : "upgrade", "--latest"];
|
|
110
|
-
if (registry) {
|
|
111
|
-
updateOptions.push("--registry", registry);
|
|
112
|
-
}
|
|
113
|
-
await execa(updateApp, updateOptions, {
|
|
114
|
-
encoding: "utf8",
|
|
115
|
-
stdio: "inherit"
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
spinner.succeed("Successfully updated packages!");
|
|
119
|
-
callback(0);
|
|
120
|
-
return 0;
|
|
121
|
-
} catch (error) {
|
|
122
|
-
log(`
|
|
123
|
-
${cliName} Error: ${error.message}`, "error", quiet);
|
|
124
|
-
spinner.fail("Failed to update packages.");
|
|
125
|
-
callback(1);
|
|
126
|
-
return 1;
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
export {
|
|
130
|
-
update
|
|
131
|
-
};
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3VwZGF0ZS91cGRhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7Z2V0RGlyTmFtZX0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaW50ZXJhY3RpdmU/OiBib29sZWFuO1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZWdpc3RyeT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVXBkYXRlQ2FsbGJhY2sgPSB0eXBlb2YgcHJvY2Vzcy5leGl0O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlID0gYXN5bmMgKGNtZDogVXBkYXRlT3B0aW9ucywgY2FsbGJhY2s6IFVwZGF0ZUNhbGxiYWNrID0gcHJvY2Vzcy5leGl0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgcGFja2FnZU1hbmFnZXI6IGNtZFBhY2thZ2VNYW5hZ2VyLCBxdWlldCwgcmVnaXN0cnl9ID0gY21kO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSB1cGRhdGluZyBwYWNrYWdlcy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7cGFja2FnZU1hbmFnZXI6IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyfSA9IExleENvbmZpZy5jb25maWc7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyOiBzdHJpbmcgPSBjbWRQYWNrYWdlTWFuYWdlciB8fCBjb25maWdQYWNrYWdlTWFuYWdlciB8fCAnbnBtJztcbiAgY29uc3QgaXNOcG06IGJvb2xlYW4gPSBwYWNrYWdlTWFuYWdlciA9PT0gJ25wbSc7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gIGNvbnN0IGRpclBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLicpO1xuXG4gIHRyeSB7XG4gICAgaWYoaXNOcG0pIHtcbiAgICAgIC8vIFRyeSB0byB1c2UgbnBtLWNoZWNrLXVwZGF0ZXMgd2l0aCBkaWZmZXJlbnQgYXBwcm9hY2hlc1xuICAgICAgbGV0IG5jdUNvbW1hbmQ6IHN0cmluZztcbiAgICAgIGxldCBuY3VBcmdzOiBzdHJpbmdbXTtcblxuICAgICAgLy8gRmlyc3QgdHJ5OiBVc2UgbnB4IHdpdGggbnBtLWNoZWNrLXVwZGF0ZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIG5jdUNvbW1hbmQgPSAnbnB4JztcbiAgICAgICAgbmN1QXJncyA9IFtcbiAgICAgICAgICAnbnBtLWNoZWNrLXVwZGF0ZXMnLFxuICAgICAgICAgICctLWNvbmN1cnJlbmN5JywgJzEwJyxcbiAgICAgICAgICAnLS1wYWNrYWdlTWFuYWdlcicsIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgICctLXByZScsICcwJyxcbiAgICAgICAgICAnLS10YXJnZXQnLCAnbGF0ZXN0JyxcbiAgICAgICAgICAuLi4oY21kLmludGVyYWN0aXZlID8gWyctLWludGVyYWN0aXZlJ10gOiBbXSksXG4gICAgICAgICAgJy0tdXBncmFkZSdcbiAgICAgICAgXTtcblxuICAgICAgICBpZihyZWdpc3RyeSkge1xuICAgICAgICAgIG5jdUFyZ3MucHVzaCgnLS1yZWdpc3RyeScsIHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGV4ZWNhKG5jdUNvbW1hbmQsIG5jdUFyZ3MsIHtcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKG5weEVycm9yKSB7XG4gICAgICAgIC8vIFNlY29uZCB0cnk6IFVzZSBucG0tY2hlY2stdXBkYXRlcyBkaXJlY3RseSAoaWYgaW5zdGFsbGVkIGdsb2JhbGx5KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIG5jdUNvbW1hbmQgPSAnbnBtLWNoZWNrLXVwZGF0ZXMnO1xuICAgICAgICAgIG5jdUFyZ3MgPSBbXG4gICAgICAgICAgICAnLS1jb25jdXJyZW5jeScsICcxMCcsXG4gICAgICAgICAgICAnLS1wYWNrYWdlTWFuYWdlcicsIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgICAgJy0tcHJlJywgJzAnLFxuICAgICAgICAgICAgJy0tdGFyZ2V0JywgJ2xhdGVzdCcsXG4gICAgICAgICAgICAuLi4oY21kLmludGVyYWN0aXZlID8gWyctLWludGVyYWN0aXZlJ10gOiBbXSksXG4gICAgICAgICAgICAnLS11cGdyYWRlJ1xuICAgICAgICAgIF07XG5cbiAgICAgICAgICBpZihyZWdpc3RyeSkge1xuICAgICAgICAgICAgbmN1QXJncy5wdXNoKCctLXJlZ2lzdHJ5JywgcmVnaXN0cnkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGV4ZWNhKG5jdUNvbW1hbmQsIG5jdUFyZ3MsIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gobmN1RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGlyZCB0cnk6IEluc3RhbGwgbnBtLWNoZWNrLXVwZGF0ZXMgZ2xvYmFsbHkgYW5kIHVzZSBpdFxuICAgICAgICAgIGxvZygnbnBtLWNoZWNrLXVwZGF0ZXMgbm90IGZvdW5kLiBJbnN0YWxsaW5nIGl0IGdsb2JhbGx5Li4uJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXhlY2EoJ25wbScsIFsnaW5zdGFsbCcsICctZycsICducG0tY2hlY2stdXBkYXRlcyddLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBuY3VDb21tYW5kID0gJ25wbS1jaGVjay11cGRhdGVzJztcbiAgICAgICAgICAgIG5jdUFyZ3MgPSBbXG4gICAgICAgICAgICAgICctLWNvbmN1cnJlbmN5JywgJzEwJyxcbiAgICAgICAgICAgICAgJy0tcGFja2FnZU1hbmFnZXInLCBwYWNrYWdlTWFuYWdlcixcbiAgICAgICAgICAgICAgJy0tcHJlJywgJzAnLFxuICAgICAgICAgICAgICAnLS10YXJnZXQnLCAnbGF0ZXN0JyxcbiAgICAgICAgICAgICAgLi4uKGNtZC5pbnRlcmFjdGl2ZSA/IFsnLS1pbnRlcmFjdGl2ZSddIDogW10pLFxuICAgICAgICAgICAgICAnLS11cGdyYWRlJ1xuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYocmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgbmN1QXJncy5wdXNoKCctLXJlZ2lzdHJ5JywgcmVnaXN0cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBleGVjYShuY3VDb21tYW5kLCBuY3VBcmdzLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2goaW5zdGFsbEVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEZhaWxlZCB0byBpbnN0YWxsIG9yIHVzZSBucG0tY2hlY2stdXBkYXRlczogJHtpbnN0YWxsRXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBsb2coJ1BsZWFzZSBpbnN0YWxsIG5wbS1jaGVjay11cGRhdGVzIG1hbnVhbGx5OiBucG0gaW5zdGFsbCAtZyBucG0tY2hlY2stdXBkYXRlcycsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgdGhyb3cgaW5zdGFsbEVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBzdWNjZXNzZnVsIHVwZGF0ZSwgcnVuIG5wbSBpbnN0YWxsIGFuZCBhdWRpdCBmaXhcbiAgICAgIGF3YWl0IGV4ZWNhKCducG0nLCBbJ2knLCAnLS1mb3JjZSddLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBleGVjYSgnbnBtJywgWydhdWRpdCcsICdmaXgnXSwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHlhcm5cbiAgICAgIGNvbnN0IHVwZGF0ZUFwcCA9ICd5YXJuJztcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW2NtZC5pbnRlcmFjdGl2ZSA/ICd1cGdyYWRlLWludGVyYWN0aXZlJyA6ICd1cGdyYWRlJywgJy0tbGF0ZXN0J107XG5cbiAgICAgIGlmKHJlZ2lzdHJ5KSB7XG4gICAgICAgIHVwZGF0ZU9wdGlvbnMucHVzaCgnLS1yZWdpc3RyeScsIHJlZ2lzdHJ5KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZXhlY2EodXBkYXRlQXBwLCB1cGRhdGVPcHRpb25zLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgcGFja2FnZXMhJyk7XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlcy4nKTtcblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsYUFBWTtBQUNwQixTQUFRLFdBQVcsbUJBQWtCO0FBRXJDLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEsa0JBQWlCO0FBQ3pCLFNBQVEsV0FBVTtBQVlYLE1BQU0sU0FBUyxPQUFPLEtBQW9CLFdBQTJCLFFBQVEsU0FBMEI7QUFDNUcsUUFBTSxFQUFDLFVBQVUsT0FBTyxnQkFBZ0IsbUJBQW1CLE9BQU8sU0FBUSxJQUFJO0FBRTlFLE1BQUksR0FBRyxPQUFPLHlCQUF5QixRQUFRLEtBQUs7QUFFcEQsUUFBTSxVQUFVLGNBQWMsS0FBSztBQUVuQyxRQUFNLFVBQVUsWUFBWSxHQUFHO0FBRS9CLFFBQU0sRUFBQyxnQkFBZ0IscUJBQW9CLElBQUksVUFBVTtBQUN6RCxRQUFNLGlCQUF5QixxQkFBcUIsd0JBQXdCO0FBQzVFLFFBQU0sUUFBaUIsbUJBQW1CO0FB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
|