@nlabs/lex 1.48.6 → 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.
Files changed (107) hide show
  1. package/.storybook/main.ts +9 -2
  2. package/.vscode/settings.json +1 -6
  3. package/README.md +276 -4
  4. package/eslint.config.mjs +24 -0
  5. package/examples/lex.config.js +18 -8
  6. package/examples/serverless-example/README.md +109 -0
  7. package/examples/serverless-example/dist/handlers/echo.js +15 -0
  8. package/examples/serverless-example/dist/handlers/graphql.js +137 -0
  9. package/examples/serverless-example/dist/handlers/hello.js +15 -0
  10. package/examples/serverless-example/dist/handlers/test.js +17 -0
  11. package/examples/serverless-example/dist/handlers/websocket.js +14 -0
  12. package/examples/serverless-example/lex.config.mjs +74 -0
  13. package/jest.config.mjs +13 -12
  14. package/{dist → lib}/LexConfig.d.ts +14 -6
  15. package/lib/LexConfig.js +268 -0
  16. package/lib/commands/ai/ai.js +303 -0
  17. package/{dist → lib}/commands/build/build.d.ts +3 -0
  18. package/lib/commands/build/build.js +494 -0
  19. package/{dist → lib}/commands/clean/clean.js +1 -1
  20. package/lib/commands/compile/compile.js +241 -0
  21. package/lib/commands/copy/copy.js +38 -0
  22. package/{dist → lib}/commands/create/create.js +1 -1
  23. package/{dist → lib}/commands/dev/dev.d.ts +2 -0
  24. package/lib/commands/dev/dev.js +286 -0
  25. package/{dist → lib}/commands/init/init.js +1 -1
  26. package/{dist → lib}/commands/lint/lint.d.ts +4 -1
  27. package/lib/commands/lint/lint.js +993 -0
  28. package/{dist → lib}/commands/migrate/migrate.js +1 -1
  29. package/lib/commands/publish/publish.js +104 -0
  30. package/lib/commands/serverless/serverless.d.ts +17 -0
  31. package/lib/commands/serverless/serverless.js +662 -0
  32. package/lib/commands/storybook/storybook.js +249 -0
  33. package/lib/commands/test/test.js +428 -0
  34. package/lib/commands/update/update.js +128 -0
  35. package/lib/commands/versions/versions.js +41 -0
  36. package/{dist → lib}/create/changelog.js +1 -1
  37. package/{dist → lib}/index.d.ts +2 -0
  38. package/{dist → lib}/index.js +3 -1
  39. package/lib/lex.js +73 -0
  40. package/lib/storybook/index.d.ts +5 -0
  41. package/lib/types.js +1 -0
  42. package/lib/utils/aiService.d.ts +9 -0
  43. package/lib/utils/aiService.js +299 -0
  44. package/{dist → lib}/utils/app.d.ts +3 -0
  45. package/lib/utils/app.js +296 -0
  46. package/lib/utils/deepMerge.js +26 -0
  47. package/{dist → lib}/utils/file.d.ts +7 -3
  48. package/lib/utils/file.js +229 -0
  49. package/lib/utils/translations.d.ts +1 -0
  50. package/lib/utils/translations.js +74 -0
  51. package/package.json +62 -50
  52. package/postcss.config.js +5 -3
  53. package/tsconfig.build.json +2 -2
  54. package/webpack.config.js +229 -39
  55. package/dist/LexConfig.js +0 -286
  56. package/dist/commands/ai/ai.js +0 -303
  57. package/dist/commands/build/build.js +0 -404
  58. package/dist/commands/compile/compile.js +0 -234
  59. package/dist/commands/copy/copy.js +0 -38
  60. package/dist/commands/dev/dev.js +0 -74
  61. package/dist/commands/lint/lint.js +0 -811
  62. package/dist/commands/publish/publish.js +0 -104
  63. package/dist/commands/storybook/storybook.js +0 -249
  64. package/dist/commands/test/test.js +0 -429
  65. package/dist/commands/update/update.js +0 -132
  66. package/dist/commands/versions/versions.js +0 -41
  67. package/dist/lex.js +0 -70
  68. package/dist/utils/aiService.d.ts +0 -9
  69. package/dist/utils/aiService.js +0 -299
  70. package/dist/utils/app.js +0 -267
  71. package/dist/utils/deepMerge.js +0 -24
  72. package/dist/utils/file.js +0 -185
  73. package/emptyModule.js +0 -0
  74. package/eslint.config.js +0 -7
  75. /package/{dist → lib}/Button.stories.d.ts +0 -0
  76. /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
  77. /package/{dist → lib}/commands/ai/index.d.ts +0 -0
  78. /package/{dist → lib}/commands/ai/index.js +0 -0
  79. /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
  80. /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
  81. /package/{dist → lib}/commands/config/config.d.ts +0 -0
  82. /package/{dist → lib}/commands/config/config.js +0 -0
  83. /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
  84. /package/{dist → lib}/commands/create/create.d.ts +0 -0
  85. /package/{dist → lib}/commands/init/init.d.ts +0 -0
  86. /package/{dist → lib}/commands/link/link.d.ts +0 -0
  87. /package/{dist → lib}/commands/link/link.js +0 -0
  88. /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
  89. /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
  90. /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
  91. /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
  92. /package/{dist → lib}/commands/test/test.d.ts +0 -0
  93. /package/{dist → lib}/commands/update/update.d.ts +0 -0
  94. /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
  95. /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
  96. /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
  97. /package/{dist → lib}/create/changelog.d.ts +0 -0
  98. /package/{dist → lib}/lex.d.ts +0 -0
  99. /package/{dist/types.js → lib/storybook/index.js} +0 -0
  100. /package/{dist → lib}/test-react/index.d.ts +0 -0
  101. /package/{dist → lib}/test-react/index.js +0 -0
  102. /package/{dist → lib}/types.d.ts +0 -0
  103. /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
  104. /package/{dist → lib}/utils/log.d.ts +0 -0
  105. /package/{dist → lib}/utils/log.js +0 -0
  106. /package/{dist → lib}/utils/reactShim.d.ts +0 -0
  107. /package/{dist → lib}/utils/reactShim.js +0 -0
@@ -1,41 +0,0 @@
1
- import { readFileSync } from "fs";
2
- import { getLexPackageJsonPath } from "../../utils/file.js";
3
- import { log } from "../../utils/log.js";
4
- const packagePath = getLexPackageJsonPath();
5
- const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
6
- const parseVersion = (packageVersion) => packageVersion?.replace(/\^/g, "");
7
- const packages = {
8
- esbuild: parseVersion(packageJson.dependencies.esbuild),
9
- jest: parseVersion(packageJson.dependencies.jest),
10
- lex: packageJson.version,
11
- typescript: parseVersion(packageJson.dependencies.typescript),
12
- webpack: parseVersion(packageJson.dependencies.webpack)
13
- };
14
- const jsonVersions = (lexPackages) => Object.keys(lexPackages).reduce((list, key) => {
15
- list[key] = packages[key];
16
- return list;
17
- }, {});
18
- const versions = (cmd, callback) => {
19
- if (cmd.json) {
20
- console.log(JSON.stringify(jsonVersions(packages)));
21
- } else {
22
- log("Versions:", "info", false);
23
- log(` Lex: ${packages.lex}`, "info", false);
24
- log(" ----------", "note", false);
25
- log(` ESBuild: ${packages.esbuild}`, "info", false);
26
- log(` Jest: ${packages.jest}`, "info", false);
27
- log(` Typescript: ${packages.typescript}`, "info", false);
28
- log(` Webpack: ${packages.webpack}`, "info", false);
29
- }
30
- if (callback) {
31
- callback(0);
32
- }
33
- return Promise.resolve(0);
34
- };
35
- export {
36
- jsonVersions,
37
- packages,
38
- parseVersion,
39
- versions
40
- };
41
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3ZlcnNpb25zL3ZlcnNpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHtnZXRMZXhQYWNrYWdlSnNvblBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IHBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhY2thZ2VQYXRoLCAndXRmOCcpKTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVmVyc2lvbiA9IChwYWNrYWdlVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHBhY2thZ2VWZXJzaW9uPy5yZXBsYWNlKC9cXF4vZywgJycpO1xuXG5leHBvcnQgY29uc3QgcGFja2FnZXMgPSB7XG4gIGVzYnVpbGQ6IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuZXNidWlsZCksXG4gIGplc3Q6IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuamVzdCksXG4gIGxleDogcGFja2FnZUpzb24udmVyc2lvbixcbiAgdHlwZXNjcmlwdDogcGFyc2VWZXJzaW9uKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcy50eXBlc2NyaXB0KSxcbiAgd2VicGFjazogcGFyc2VWZXJzaW9uKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcy53ZWJwYWNrKVxufTtcblxuZXhwb3J0IGNvbnN0IGpzb25WZXJzaW9ucyA9IChsZXhQYWNrYWdlcykgPT4gT2JqZWN0LmtleXMobGV4UGFja2FnZXMpLnJlZHVjZSgobGlzdCwga2V5KSA9PiB7XG4gIGxpc3Rba2V5XSA9IHBhY2thZ2VzW2tleV07XG4gIHJldHVybiBsaXN0O1xufSwge30pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25zQ21kIHtcbiAgcmVhZG9ubHkganNvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJzaW9ucyA9IChjbWQ6IFZlcnNpb25zQ21kLCBjYWxsYmFjazogKHN0YXR1czogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgaWYoY21kLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShqc29uVmVyc2lvbnMocGFja2FnZXMpKSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nKCdWZXJzaW9uczonLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coYCAgTGV4OiAke3BhY2thZ2VzLmxleH1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coJyAgLS0tLS0tLS0tLScsICdub3RlJywgZmFsc2UpO1xuICAgIGxvZyhgICBFU0J1aWxkOiAke3BhY2thZ2VzLmVzYnVpbGR9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgbG9nKGAgIEplc3Q6ICR7cGFja2FnZXMuamVzdH1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coYCAgVHlwZXNjcmlwdDogJHtwYWNrYWdlcy50eXBlc2NyaXB0fWAsICdpbmZvJywgZmFsc2UpO1xuICAgIGxvZyhgICBXZWJwYWNrOiAke3BhY2thZ2VzLndlYnBhY2t9YCwgJ2luZm8nLCBmYWxzZSk7XG4gIH1cblxuICBpZihjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKDApO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxvQkFBbUI7QUFFM0IsU0FBUSw2QkFBNEI7QUFDcEMsU0FBUSxXQUFVO0FBRWxCLE1BQU0sY0FBYyxzQkFBc0I7QUFDMUMsTUFBTSxjQUFjLEtBQUssTUFBTSxhQUFhLGFBQWEsTUFBTSxDQUFDO0FBRXpELE1BQU0sZUFBZSxDQUFDLG1CQUFtQyxnQkFBZ0IsUUFBUSxPQUFPLEVBQUU7QUFFMUYsTUFBTSxXQUFXO0FBQUEsRUFDdEIsU0FBUyxhQUFhLFlBQVksYUFBYSxPQUFPO0FBQUEsRUFDdEQsTUFBTSxhQUFhLFlBQVksYUFBYSxJQUFJO0FBQUEsRUFDaEQsS0FBSyxZQUFZO0FBQUEsRUFDakIsWUFBWSxhQUFhLFlBQVksYUFBYSxVQUFVO0FBQUEsRUFDNUQsU0FBUyxhQUFhLFlBQVksYUFBYSxPQUFPO0FBQ3hEO0FBRU8sTUFBTSxlQUFlLENBQUMsZ0JBQWdCLE9BQU8sS0FBSyxXQUFXLEVBQUUsT0FBTyxDQUFDLE1BQU0sUUFBUTtBQUMxRixPQUFLLEdBQUcsSUFBSSxTQUFTLEdBQUc7QUFDeEIsU0FBTztBQUNULEdBQUcsQ0FBQyxDQUFDO0FBTUUsTUFBTSxXQUFXLENBQUMsS0FBa0IsYUFBd0Q7QUFDakcsTUFBRyxJQUFJLE1BQU07QUFDWCxZQUFRLElBQUksS0FBSyxVQUFVLGFBQWEsUUFBUSxDQUFDLENBQUM7QUFBQSxFQUNwRCxPQUFPO0FBQ0wsUUFBSSxhQUFhLFFBQVEsS0FBSztBQUM5QixRQUFJLFVBQVUsU0FBUyxHQUFHLElBQUksUUFBUSxLQUFLO0FBQzNDLFFBQUksZ0JBQWdCLFFBQVEsS0FBSztBQUNqQyxRQUFJLGNBQWMsU0FBUyxPQUFPLElBQUksUUFBUSxLQUFLO0FBQ25ELFFBQUksV0FBVyxTQUFTLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDN0MsUUFBSSxpQkFBaUIsU0FBUyxVQUFVLElBQUksUUFBUSxLQUFLO0FBQ3pELFFBQUksY0FBYyxTQUFTLE9BQU8sSUFBSSxRQUFRLEtBQUs7QUFBQSxFQUNyRDtBQUVBLE1BQUcsVUFBVTtBQUNYLGFBQVMsQ0FBQztBQUFBLEVBQ1o7QUFFQSxTQUFPLFFBQVEsUUFBUSxDQUFDO0FBQzFCOyIsCiAgIm5hbWVzIjogW10KfQo=
package/dist/lex.js DELETED
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Option, program } from "commander";
3
- import { readFileSync } from "fs";
4
- import { createRequire } from "module";
5
- import { dirname, resolve } from "path";
6
- import { fileURLToPath } from "url";
7
- import { aiFunction } from "./commands/ai/ai.js";
8
- import { build } from "./commands/build/build.js";
9
- import { clean } from "./commands/clean/clean.js";
10
- import { compile } from "./commands/compile/compile.js";
11
- import { config } from "./commands/config/config.js";
12
- import { create } from "./commands/create/create.js";
13
- import { dev } from "./commands/dev/dev.js";
14
- import { init } from "./commands/init/init.js";
15
- import { linked } from "./commands/link/link.js";
16
- import { lint } from "./commands/lint/lint.js";
17
- import { migrate } from "./commands/migrate/migrate.js";
18
- import { publish } from "./commands/publish/publish.js";
19
- import { storybook } from "./commands/storybook/storybook.js";
20
- import { test } from "./commands/test/test.js";
21
- import { update } from "./commands/update/update.js";
22
- import { upgrade } from "./commands/upgrade/upgrade.js";
23
- import { versions } from "./commands/versions/versions.js";
24
- process.env.LEX_ROOT = dirname(fileURLToPath(import.meta.url));
25
- const lexNodeModules = resolve(dirname(fileURLToPath(import.meta.url)), "../node_modules");
26
- if (!process.env.NODE_PATH) {
27
- process.env.NODE_PATH = lexNodeModules;
28
- } else if (!process.env.NODE_PATH.split(":").includes(lexNodeModules)) {
29
- process.env.NODE_PATH += `:${lexNodeModules}`;
30
- }
31
- const require2 = createRequire(import.meta.url);
32
- require2("module").Module._initPaths();
33
- const packagePath = fileURLToPath(new URL("../package.json", import.meta.url));
34
- const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
35
- program.command("build").option("--assist", "Enable AI assistance for fixing build errors.", false).option("--analyze", "Enable AI analysis for build optimization suggestions or invoke webpack-bundle-analyzer plugin.", false).addOption(new Option("--bundler <n>", 'Bundler to use ("webpack" or "esbuild"). Default: "webpack".').choices(["webpack", "esbuild"]).default("webpack")).option("--config <path>", "Custom Webpack configuration file path (ie. webpack.config.js).").option("--configName <value...>", "Name of the configuration to use.").option("--defineProcessEnvNodeEnv <value>", "Sets process.env.NODE_ENV to the specified value. (Currently an alias for `--node-env`)").option("--devtool <value>", "A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).").option("--disableInterpret", "Disable interpret for loading the config file.", false).option("--entry <value...>", "A module that is loaded upon startup. Only the last one is exported.").option("--env <value>", "Environment passed to the configuration when it is a function.").option("--failOnWarnings", "Stop webpack-cli process with non-zero exit code on warnings from webpack", false).addOption(new Option("--format <value>", 'This sets the output format for the generated JavaScript files. Default: "cjs".').choices(["cjs", "esm"]).default("cjs")).option("--json <value>", "Prints result as JSON or store it in a file.").option("--lexConfig <path>", "Lex configuration file path (lex.config.js).").option("--merge", 'Merge two or more configurations using "webpack-merge".', false).addOption(new Option("--mode <type>", 'Webpack mode ("production" or "development"). Default: "development".').choices(["development", "production"]).default("development")).option("--name <value>", "Name of the configuration. Used when loading multiple configurations.").option("--noDevtool", 'Negative "devtool" option.', false).option("--noStats", 'Negative "stats" option.', false).option("--noTarget", 'Negative "target" option.', false).option("--noWatch", 'Negative "watch" option.', false).option("--noWatchOptionsStdin", 'Negative "watch-options-stdin" option.', false).option("--nodeEnv <value>", "Sets process.env.NODE_ENV to the specified value.").option("--outputPath <value>", "The output directory as **absolute path** (required).").option("--quiet", "No Lex notifications printed in the console.", false).option("--remove", "Removes all files from the output directory before compiling.", false).option("--sourcePath <path>", "Source path").option("--stats <value>", "Stats options object or preset name.").option("--static", "Creates static HTML files when building app.", false).option("--target <value>", "Environment to build for. Environment to build for. An array of environments to build for all of them when possible.").option("--typescript", "Transpile as Typescript.", false).option("--variables <n>", `Environment variables to set in "process.env". (ie. "{NODE_ENV: 'production'}").`).option("--watch", "Watch for changes.", false).option("--watchOptionsStdin", "Stop watching when stdin stream has ended.", false).action((cmd) => build(cmd, process.exit).then(() => {
36
- }));
37
- program.command("clean").option("--quiet", "No Lex notifications printed in the console.").option("--snapshots", 'Remove all "__snapshots__" directories.').action((cmd) => clean(cmd, process.exit).then(() => {
38
- }));
39
- program.command("config <type>").option("--quiet", "No Lex notifications printed in the console.").option("--json <path>", "Save output to json file.").action((type, cmd) => config(type, cmd, process.exit).then(() => {
40
- }));
41
- program.command("compile").option("--config <path>", "Transpiler configuration file path (ie. tsconfig.json).").option("--environment <n>", 'Target environment. "node" or "web". Default: "node".').option("--lexConfig <path>", "Custom Lex configuration file path (ie. lex.config.js).").option("--outputPath <path>", "Output path").option("--remove", "Removes all files from the output directory before compiling.").option("--sourcePath <path>", "Source path").option("--typescript", "Transpile as Typescript.").option("--quiet", "No Lex notifications printed in the console.").option("--watch", "Watches for changes and compiles.").action((cmd) => compile(cmd, process.exit).then(() => {
42
- }));
43
- program.command("create <type>").option("--outputFile <path>", "Output filename.").option("--outputName <n>", "Output name.").option("--quiet", "No Lex notifications printed in the console.").option("--typescript", "Create Typescript version.").action((type, cmd) => create(type, cmd, process.exit).then(() => {
44
- }));
45
- program.command("dev").option("--bundleAnalyzer", "Run bundle analyzer.").option("--config <path>", "Custom Webpack configuration file path (ie. webpack.config.js).").option("--lexConfig <path>", "Custom Lex configuration file path (ie. lex.config.js).").option("--open", "Automatically open dev server in a new browser window.").option("--outputPath <path>", "Output path").option("--quiet", "No Lex notifications printed in the console.").option("--remove", "Removes all files from the output directory before compiling.").option("--sourcePath <path>", "Source path").option("--typescript", "Transpile as Typescript.").option("--variables <n>", `Environment variables to set in "process.env". (ie. "{NODE_ENV: 'development'}").`).option("--watch", "Watch for changes.").action((cmd) => dev(cmd, process.exit).then(() => {
46
- }));
47
- program.command("init <appName> [packageName]").option("--install", "Install dependencies.").addOption(new Option("--package-manager <manager>", "Which package manager to use. Default: npm").choices(["npm", "yarn"]).default("npm")).option("--quiet", "No Lex notifications printed in the console.").option("--typescript", "Use a Typescript based app.").action((appName, packageName, cmd) => init(appName, packageName, cmd, process.exit).then(() => {
48
- }));
49
- program.command("linked").option("--quiet", "No Lex notifications printed in the console.").action((cmd) => linked(cmd, process.exit).then(() => {
50
- }));
51
- program.command("lint").option("--cache", "Only check changed files. Default: false.", false).option("--cacheLocation <path>", "Path to the cache file or directory.").option("--color", "Force enabling of color.", false).option("--config <path>", "Use this configuration, overriding .eslintrc.* config options if present. If not specified and no local config exists, Lex will use its default config.").option("--debug", "Output debugging information.", false).option("--envInfo", "Output execution environment information. Default: false.", false).option("--env <n>", "Specify environments.").option("--fix", "Apply AI fixes after built-in ESLint fixes (same as --fix).", false).option("--fixDryRun", "Automatically fix problems without saving the changes to the file system.", false).option("--fixType <type>", "Specify the types of fixes to apply (problem, suggestion, layout).").option("--format <n>", "Use a specific output format. Default: stylish.").option("--global <variables>", "Define global variables.").option("--ignorePath <path>", "Specify path of ignore file.").option("--ignorePattern <pattern>", "Pattern of files to ignore (in addition to those in .eslintignore).").option("--init", "Run config initialization wizard. Default: false.", false).option("--maxWarnings <num>", "Number of warnings to trigger nonzero exit code. Default: -1.").option("--noColor", "Force disabling of color.", false).option("--noEslintrc", "Disable use of configuration from .eslintrc.*.", false).option("--noIgnore", "Disable use of ignore files and patterns.", false).option("--noInlineConfig", "Prevent comments from changing config or rules.", false).option("--outputFile <path>", "Specify file to write report to.").option("--parser <n>", "Specify the parser to be used.").option("--parserOptions <options>", "Specify parser options.").option("--plugin <plugins>", "Specify plugins.").option("--printConfig <path>", "Print the configuration for the given file.").option("--quiet", "No Lex notifications printed in the console.", false).option("--reportUnusedDisableDirectives", "Adds reported errors for unused eslint-disable directives.", false).option("--resolvePluginsRelativeTo <path>", "A folder where plugins should be resolved from.").option("--rule <path>", "Specify rules.").option("--rulesdir <path>", "Use additional rules from this directory.").option("--stdin", "Lint code provided on <STDIN> - Default: false.", false).option("--stdinFilename <n>", "Specify filename to process STDIN as.").action((cmd) => lint(cmd, process.exit).then(() => {
52
- }));
53
- program.command("migrate").option("-q, --quiet", "No Lex notifications printed in the console.").action((cmd) => migrate(cmd, process.exit).then(() => {
54
- }));
55
- program.command("publish").addOption(new Option("--bump <type>", 'Increments the version. Types include: major, minor, patch, beta, alpha, rc. Default: "patch".').choices(["major", "minor", "patch", "beta", "alpha", "rc"]).default("patch")).option("--newVersion <versionNumber>", "Publish as a specific version.").option("--otp <code>", "Provide a two-factor code.").addOption(new Option("--package-manager <manager>", "Which package manager to use. Default: npm").choices(["npm", "yarn"]).default("npm")).option("--private", "Publishes the module as restricted.").option("--quiet", "No Lex notifications printed in the console.").option("--tag <tag>", "Registers the published package with the given tag.").action((cmd) => publish(cmd, process.exit).then(() => {
56
- }));
57
- program.command("storybook").option("--config <path>", "Custom Storybook configuration directory path (ie. .storybook).").option("--lexConfig <path>", "Custom Lex configuration file path (ie. lex.config.js).").option("--open", "Automatically open Storybook in a new browser window.").option("--port <number>", "Port number for the Storybook server.").option("--quiet", "No Lex notifications printed in the console.").option("--static", "Build a static Storybook site instead of starting dev server.").option("--variables <n>", `Environment variables to set in "process.env". (ie. "{STORYBOOK_THEME: 'dark'}").`).option("--verbose", "Show detailed webpack progress output.").action((cmd) => storybook(cmd, process.exit).then(() => {
58
- }));
59
- program.command("test").option("--analyze", "Use AI to analyze test coverage and suggest improvements.", false).option("--debugTests", "Use AI to debug test failures and suggest fixes.", false).option("--generate", "Use AI to generate test cases for untested code.", false).option("--bail", "Exit the test suite immediately upon the first failing test suite.").option("--changedFilesWithAncestor", "Runs tests related to the current changes and the changes made in the last commit.").option("--changedSince", "Runs tests related the changes since the provided branch.").option("--ci", "When this option is provided, Jest will assume it is running in a CI environment.").option("--clearCache", "Clear Jest cache.").option("--collectCoverageFrom <glob>", "A glob pattern relative to matching the files that coverage info needs to be collected from.").option("--colors", "Forces test results output highlighting even if stdout is not a TTY.").option("--config <path>", "Custom Jest configuration file path (ie. jest.config.js).").option("--debug", "Print debugging info about your Jest config.").option("--detectOpenHandles", "Attempt to collect and print open handles preventing Jest from exiting cleanly").option("--environment <n>", 'Target environment. "node" or "web". Default: "node".').option("--env", "The test environment used for all tests. This can point to any file or node module. Examples: jsdom, node or path/to/my-environment.js.").option("--errorOnDeprecated", "Make calling deprecated APIs throw helpful error messages.").option("--expand", "Use this flag to show full diffs and errors instead of a patch.").option("--forceExit", "Force Jest to exit after all tests have completed running.").option("--json", "Prints the test results in JSON.").option("--lastCommit", "Run all tests affected by file changes in the last commit made.").option("--lexConfig <path>", "Custom Lex configuration file path (ie. lex.config.js).").option("--listTests", "Lists all tests as JSON that Jest will run given the arguments, and exits.").option("--logHeapUsage", "Logs the heap usage after every test.").option("--maxWorkers <num>", "Specifies the maximum number of workers the worker-pool will spawn for running tests. ").option("--noStackTrace", "Disables stack trace in test results output.").option("--notify", "Activates notifications for test results.").option("--onlyChanged", "un based on which files have changed in the current repository. ").option("--outputFile <filename>", "Write test results to a file when the --json option is also specified.").option("--passWithNoTests", "Allows the test suite to pass when no files are found.").option("--quiet", "No Lex notifications printed in the console.").option("--runInBand", "Run all tests serially in the current process, rather than creating a worker pool of child processes that run tests.").option("--setup <path>", "Jest setup file path.").option("--showConfig", "Print your Jest config and then exits.").option("--silent", "Prevent tests from printing messages through the console.").option("--testLocationInResults", "Adds a location field to test results.").option("--testNamePattern <regex>", "Run only tests with a name that matches the regex. ").option("--testPathPattern <regex>", "A regexp pattern string that is matched against all tests paths before executing the test.").option("--typescript", "Transpile as Typescript.").option("--update", 'Update snapshots. Runs "jest --updateSnapshots"').option("--useStderr", "Divert all output to stderr.").option("--verbose", "Display individual test results with the test suite hierarchy.").option("--watch <path>", "Watch files for changes and rerun tests related to changed files.").option("--watchAll", "Watch files for changes and rerun all tests when something changes.").action((options, cmd) => test(options, cmd.args, process.exit).then(() => {
60
- }));
61
- program.command("update").option("--interactive", "Choose which packages to update.").addOption(new Option("--package-manager <manager>", "Which package manager to use. Default: npm").choices(["npm", "yarn"]).default("npm")).option("--quiet", "No Lex notifications printed in the console.").option("--registry", "Add a custom registry url.").action((cmd) => update(cmd, process.exit).then(() => {
62
- }));
63
- program.command("upgrade").addOption(new Option("--package-manager <manager>", "Which package manager to use. Default: npm").choices(["npm", "yarn"]).default("npm")).option("--quiet", "No Lex notifications printed in the console.").action((cmd) => upgrade(cmd, process.exit).then(() => {
64
- }));
65
- program.command("ai").option("--context", "Include project context in the AI prompt.", true).option("--file <path>", "Specific file to operate on.").option("--lexConfig <path>", "Custom Lex configuration file path (ie. lex.config.js).").option("--model <model>", "AI model to use. Default: gpt-4o.").option("--prompt <text>", "The prompt to send to the AI.").option("--quiet", "No Lex notifications printed in the console.").addOption(new Option("--task <task>", "Type of AI task to perform.").choices(["generate", "explain", "test", "optimize", "help"]).default("help")).action((cmd) => aiFunction(cmd).then(() => {
66
- }));
67
- program.command("versions").option("--json", "Print the version as a JSON object.").action((cmd) => versions(cmd, process.exit).then(() => {
68
- }));
69
- program.version(packageJson.version).parse(process.argv);
70
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2xleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7T3B0aW9uLCBwcm9ncmFtfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7Y3JlYXRlUmVxdWlyZX0gZnJvbSAnbW9kdWxlJztcbmltcG9ydCB7ZGlybmFtZSwgcmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi9jb21tYW5kcy9haS9haS5qcyc7XG5pbXBvcnQge2J1aWxkfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7Y2xlYW59IGZyb20gJy4vY29tbWFuZHMvY2xlYW4vY2xlYW4uanMnO1xuaW1wb3J0IHtjb21waWxlfSBmcm9tICcuL2NvbW1hbmRzL2NvbXBpbGUvY29tcGlsZS5qcyc7XG5pbXBvcnQge2NvbmZpZ30gZnJvbSAnLi9jb21tYW5kcy9jb25maWcvY29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS9jcmVhdGUuanMnO1xuaW1wb3J0IHtkZXZ9IGZyb20gJy4vY29tbWFuZHMvZGV2L2Rldi5qcyc7XG5pbXBvcnQge2luaXR9IGZyb20gJy4vY29tbWFuZHMvaW5pdC9pbml0LmpzJztcbmltcG9ydCB7bGlua2VkfSBmcm9tICcuL2NvbW1hbmRzL2xpbmsvbGluay5qcyc7XG5pbXBvcnQge2xpbnR9IGZyb20gJy4vY29tbWFuZHMvbGludC9saW50LmpzJztcbmltcG9ydCB7bWlncmF0ZX0gZnJvbSAnLi9jb21tYW5kcy9taWdyYXRlL21pZ3JhdGUuanMnO1xuaW1wb3J0IHtwdWJsaXNofSBmcm9tICcuL2NvbW1hbmRzL3B1Ymxpc2gvcHVibGlzaC5qcyc7XG5pbXBvcnQge3N0b3J5Ym9va30gZnJvbSAnLi9jb21tYW5kcy9zdG9yeWJvb2svc3Rvcnlib29rLmpzJztcbmltcG9ydCB7dGVzdH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0L3Rlc3QuanMnO1xuaW1wb3J0IHt1cGRhdGV9IGZyb20gJy4vY29tbWFuZHMvdXBkYXRlL3VwZGF0ZS5qcyc7XG5pbXBvcnQge3VwZ3JhZGV9IGZyb20gJy4vY29tbWFuZHMvdXBncmFkZS91cGdyYWRlLmpzJztcbmltcG9ydCB7dmVyc2lvbnN9IGZyb20gJy4vY29tbWFuZHMvdmVyc2lvbnMvdmVyc2lvbnMuanMnO1xuXG5wcm9jZXNzLmVudi5MRVhfUk9PVCA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuY29uc3QgbGV4Tm9kZU1vZHVsZXMgPSByZXNvbHZlKGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKSwgJy4uL25vZGVfbW9kdWxlcycpO1xuaWYoIXByb2Nlc3MuZW52Lk5PREVfUEFUSCkge1xuICBwcm9jZXNzLmVudi5OT0RFX1BBVEggPSBsZXhOb2RlTW9kdWxlcztcbn0gZWxzZSBpZighcHJvY2Vzcy5lbnYuTk9ERV9QQVRILnNwbGl0KCc6JykuaW5jbHVkZXMobGV4Tm9kZU1vZHVsZXMpKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfUEFUSCArPSBgOiR7bGV4Tm9kZU1vZHVsZXN9YDtcbn1cblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbnJlcXVpcmUoJ21vZHVsZScpLk1vZHVsZS5faW5pdFBhdGhzKCk7XG5cbmNvbnN0IHBhY2thZ2VQYXRoID0gZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuLi9wYWNrYWdlLmpzb24nLCBpbXBvcnQubWV0YS51cmwpKTtcbmNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGFja2FnZVBhdGgsICd1dGY4JykpO1xuXG5wcm9ncmFtLmNvbW1hbmQoJ2J1aWxkJylcbiAgLm9wdGlvbignLS1hc3Npc3QnLCAnRW5hYmxlIEFJIGFzc2lzdGFuY2UgZm9yIGZpeGluZyBidWlsZCBlcnJvcnMuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tYW5hbHl6ZScsICdFbmFibGUgQUkgYW5hbHlzaXMgZm9yIGJ1aWxkIG9wdGltaXphdGlvbiBzdWdnZXN0aW9ucyBvciBpbnZva2Ugd2VicGFjay1idW5kbGUtYW5hbHl6ZXIgcGx1Z2luLicsIGZhbHNlKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tYnVuZGxlciA8bj4nLCAnQnVuZGxlciB0byB1c2UgKFwid2VicGFja1wiIG9yIFwiZXNidWlsZFwiKS4gRGVmYXVsdDogXCJ3ZWJwYWNrXCIuJykuY2hvaWNlcyhbJ3dlYnBhY2snLCAnZXNidWlsZCddKS5kZWZhdWx0KCd3ZWJwYWNrJykpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdDdXN0b20gV2VicGFjayBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIHdlYnBhY2suY29uZmlnLmpzKS4nKVxuICAub3B0aW9uKCctLWNvbmZpZ05hbWUgPHZhbHVlLi4uPicsICdOYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIHVzZS4nKVxuICAub3B0aW9uKCctLWRlZmluZVByb2Nlc3NFbnZOb2RlRW52IDx2YWx1ZT4nLCAnU2V0cyBwcm9jZXNzLmVudi5OT0RFX0VOViB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiAoQ3VycmVudGx5IGFuIGFsaWFzIGZvciBgLS1ub2RlLWVudmApJylcbiAgLm9wdGlvbignLS1kZXZ0b29sIDx2YWx1ZT4nLCAnQSBkZXZlbG9wZXIgdG9vbCB0byBlbmhhbmNlIGRlYnVnZ2luZyAoZmFsc2UgfCBldmFsIHwgW2lubGluZS18aGlkZGVuLXxldmFsLV1bbm9zb3VyY2VzLV1bY2hlYXAtW21vZHVsZS1dXXNvdXJjZS1tYXApLicpXG4gIC5vcHRpb24oJy0tZGlzYWJsZUludGVycHJldCcsICdEaXNhYmxlIGludGVycHJldCBmb3IgbG9hZGluZyB0aGUgY29uZmlnIGZpbGUuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tZW50cnkgPHZhbHVlLi4uPicsICdBIG1vZHVsZSB0aGF0IGlzIGxvYWRlZCB1cG9uIHN0YXJ0dXAuIE9ubHkgdGhlIGxhc3Qgb25lIGlzIGV4cG9ydGVkLicpXG4gIC5vcHRpb24oJy0tZW52IDx2YWx1ZT4nLCAnRW52aXJvbm1lbnQgcGFzc2VkIHRvIHRoZSBjb25maWd1cmF0aW9uIHdoZW4gaXQgaXMgYSBmdW5jdGlvbi4nKVxuICAub3B0aW9uKCctLWZhaWxPbldhcm5pbmdzJywgJ1N0b3Agd2VicGFjay1jbGkgcHJvY2VzcyB3aXRoIG5vbi16ZXJvIGV4aXQgY29kZSBvbiB3YXJuaW5ncyBmcm9tIHdlYnBhY2snLCBmYWxzZSlcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWZvcm1hdCA8dmFsdWU+JywgJ1RoaXMgc2V0cyB0aGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0IGZpbGVzLiBEZWZhdWx0OiBcImNqc1wiLicpLmNob2ljZXMoWydjanMnLCAnZXNtJ10pLmRlZmF1bHQoJ2NqcycpKVxuICAub3B0aW9uKCctLWpzb24gPHZhbHVlPicsICdQcmludHMgcmVzdWx0IGFzIEpTT04gb3Igc3RvcmUgaXQgaW4gYSBmaWxlLicpXG4gIC5vcHRpb24oJy0tbGV4Q29uZmlnIDxwYXRoPicsICdMZXggY29uZmlndXJhdGlvbiBmaWxlIHBhdGggKGxleC5jb25maWcuanMpLicpXG4gIC5vcHRpb24oJy0tbWVyZ2UnLCAnTWVyZ2UgdHdvIG9yIG1vcmUgY29uZmlndXJhdGlvbnMgdXNpbmcgXCJ3ZWJwYWNrLW1lcmdlXCIuJywgZmFsc2UpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1tb2RlIDx0eXBlPicsICdXZWJwYWNrIG1vZGUgKFwicHJvZHVjdGlvblwiIG9yIFwiZGV2ZWxvcG1lbnRcIikuIERlZmF1bHQ6IFwiZGV2ZWxvcG1lbnRcIi4nKS5jaG9pY2VzKFsnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbiddKS5kZWZhdWx0KCdkZXZlbG9wbWVudCcpKVxuICAub3B0aW9uKCctLW5hbWUgPHZhbHVlPicsICdOYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uLiBVc2VkIHdoZW4gbG9hZGluZyBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy4nKVxuICAub3B0aW9uKCctLW5vRGV2dG9vbCcsICdOZWdhdGl2ZSBcImRldnRvb2xcIiBvcHRpb24uJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tbm9TdGF0cycsICdOZWdhdGl2ZSBcInN0YXRzXCIgb3B0aW9uLicsIGZhbHNlKVxuICAub3B0aW9uKCctLW5vVGFyZ2V0JywgJ05lZ2F0aXZlIFwidGFyZ2V0XCIgb3B0aW9uLicsIGZhbHNlKVxuICAub3B0aW9uKCctLW5vV2F0Y2gnLCAnTmVnYXRpdmUgXCJ3YXRjaFwiIG9wdGlvbi4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1ub1dhdGNoT3B0aW9uc1N0ZGluJywgJ05lZ2F0aXZlIFwid2F0Y2gtb3B0aW9ucy1zdGRpblwiIG9wdGlvbi4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1ub2RlRW52IDx2YWx1ZT4nLCAnU2V0cyBwcm9jZXNzLmVudi5OT0RFX0VOViB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLicpXG4gIC5vcHRpb24oJy0tb3V0cHV0UGF0aCA8dmFsdWU+JywgJ1RoZSBvdXRwdXQgZGlyZWN0b3J5IGFzICoqYWJzb2x1dGUgcGF0aCoqIChyZXF1aXJlZCkuJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicsIGZhbHNlKVxuICAub3B0aW9uKCctLXJlbW92ZScsICdSZW1vdmVzIGFsbCBmaWxlcyBmcm9tIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSBjb21waWxpbmcuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tc291cmNlUGF0aCA8cGF0aD4nLCAnU291cmNlIHBhdGgnKVxuICAub3B0aW9uKCctLXN0YXRzIDx2YWx1ZT4nLCAnU3RhdHMgb3B0aW9ucyBvYmplY3Qgb3IgcHJlc2V0IG5hbWUuJylcbiAgLm9wdGlvbignLS1zdGF0aWMnLCAnQ3JlYXRlcyBzdGF0aWMgSFRNTCBmaWxlcyB3aGVuIGJ1aWxkaW5nIGFwcC4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS10YXJnZXQgPHZhbHVlPicsICdFbnZpcm9ubWVudCB0byBidWlsZCBmb3IuIEVudmlyb25tZW50IHRvIGJ1aWxkIGZvci4gQW4gYXJyYXkgb2YgZW52aXJvbm1lbnRzIHRvIGJ1aWxkIGZvciBhbGwgb2YgdGhlbSB3aGVuIHBvc3NpYmxlLicpXG4gIC5vcHRpb24oJy0tdHlwZXNjcmlwdCcsICdUcmFuc3BpbGUgYXMgVHlwZXNjcmlwdC4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS12YXJpYWJsZXMgPG4+JywgJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgaW4gXCJwcm9jZXNzLmVudlwiLiAoaWUuIFwie05PREVfRU5WOiBcXCdwcm9kdWN0aW9uXFwnfVwiKS4nKVxuICAub3B0aW9uKCctLXdhdGNoJywgJ1dhdGNoIGZvciBjaGFuZ2VzLicsIGZhbHNlKVxuICAub3B0aW9uKCctLXdhdGNoT3B0aW9uc1N0ZGluJywgJ1N0b3Agd2F0Y2hpbmcgd2hlbiBzdGRpbiBzdHJlYW0gaGFzIGVuZGVkLicsIGZhbHNlKVxuICAuYWN0aW9uKChjbWQpID0+IGJ1aWxkKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnY2xlYW4nKVxuICAub3B0aW9uKCctLXF1aWV0JywgJ05vIExleCBub3RpZmljYXRpb25zIHByaW50ZWQgaW4gdGhlIGNvbnNvbGUuJylcbiAgLm9wdGlvbignLS1zbmFwc2hvdHMnLCAnUmVtb3ZlIGFsbCBcIl9fc25hcHNob3RzX19cIiBkaXJlY3Rvcmllcy4nKVxuICAuYWN0aW9uKChjbWQpID0+IGNsZWFuKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnY29uZmlnIDx0eXBlPicpXG4gIC5vcHRpb24oJy0tcXVpZXQnLCAnTm8gTGV4IG5vdGlmaWNhdGlvbnMgcHJpbnRlZCBpbiB0aGUgY29uc29sZS4nKVxuICAub3B0aW9uKCctLWpzb24gPHBhdGg+JywgJ1NhdmUgb3V0cHV0IHRvIGpzb24gZmlsZS4nKVxuICAuYWN0aW9uKCh0eXBlLCBjbWQpID0+IGNvbmZpZyh0eXBlLCBjbWQsIHByb2Nlc3MuZXhpdCkudGhlbigoKSA9PiB7fSkpO1xuXG5wcm9ncmFtLmNvbW1hbmQoJ2NvbXBpbGUnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnVHJhbnNwaWxlciBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIHRzY29uZmlnLmpzb24pLicpXG4gIC5vcHRpb24oJy0tZW52aXJvbm1lbnQgPG4+JywgJ1RhcmdldCBlbnZpcm9ubWVudC4gXCJub2RlXCIgb3IgXCJ3ZWJcIi4gRGVmYXVsdDogXCJub2RlXCIuJylcbiAgLm9wdGlvbignLS1sZXhDb25maWcgPHBhdGg+JywgJ0N1c3RvbSBMZXggY29uZmlndXJhdGlvbiBmaWxlIHBhdGggKGllLiBsZXguY29uZmlnLmpzKS4nKVxuICAub3B0aW9uKCctLW91dHB1dFBhdGggPHBhdGg+JywgJ091dHB1dCBwYXRoJylcbiAgLm9wdGlvbignLS1yZW1vdmUnLCAnUmVtb3ZlcyBhbGwgZmlsZXMgZnJvbSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBiZWZvcmUgY29tcGlsaW5nLicpXG4gIC5vcHRpb24oJy0tc291cmNlUGF0aCA8cGF0aD4nLCAnU291cmNlIHBhdGgnKVxuICAub3B0aW9uKCctLXR5cGVzY3JpcHQnLCAnVHJhbnNwaWxlIGFzIFR5cGVzY3JpcHQuJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicpXG4gIC5vcHRpb24oJy0td2F0Y2gnLCAnV2F0Y2hlcyBmb3IgY2hhbmdlcyBhbmQgY29tcGlsZXMuJylcbiAgLmFjdGlvbigoY21kKSA9PiBjb21waWxlKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnY3JlYXRlIDx0eXBlPicpXG4gIC5vcHRpb24oJy0tb3V0cHV0RmlsZSA8cGF0aD4nLCAnT3V0cHV0IGZpbGVuYW1lLicpXG4gIC5vcHRpb24oJy0tb3V0cHV0TmFtZSA8bj4nLCAnT3V0cHV0IG5hbWUuJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicpXG4gIC5vcHRpb24oJy0tdHlwZXNjcmlwdCcsICdDcmVhdGUgVHlwZXNjcmlwdCB2ZXJzaW9uLicpXG4gIC5hY3Rpb24oKHR5cGUsIGNtZCkgPT4gY3JlYXRlKHR5cGUsIGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnZGV2JylcbiAgLm9wdGlvbignLS1idW5kbGVBbmFseXplcicsICdSdW4gYnVuZGxlIGFuYWx5emVyLicpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdDdXN0b20gV2VicGFjayBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIHdlYnBhY2suY29uZmlnLmpzKS4nKVxuICAub3B0aW9uKCctLWxleENvbmZpZyA8cGF0aD4nLCAnQ3VzdG9tIExleCBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIGxleC5jb25maWcuanMpLicpXG4gIC5vcHRpb24oJy0tb3BlbicsICdBdXRvbWF0aWNhbGx5IG9wZW4gZGV2IHNlcnZlciBpbiBhIG5ldyBicm93c2VyIHdpbmRvdy4nKVxuICAub3B0aW9uKCctLW91dHB1dFBhdGggPHBhdGg+JywgJ091dHB1dCBwYXRoJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicpXG4gIC5vcHRpb24oJy0tcmVtb3ZlJywgJ1JlbW92ZXMgYWxsIGZpbGVzIGZyb20gdGhlIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIGNvbXBpbGluZy4nKVxuICAub3B0aW9uKCctLXNvdXJjZVBhdGggPHBhdGg+JywgJ1NvdXJjZSBwYXRoJylcbiAgLm9wdGlvbignLS10eXBlc2NyaXB0JywgJ1RyYW5zcGlsZSBhcyBUeXBlc2NyaXB0LicpXG4gIC5vcHRpb24oJy0tdmFyaWFibGVzIDxuPicsICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IGluIFwicHJvY2Vzcy5lbnZcIi4gKGllLiBcIntOT0RFX0VOVjogXFwnZGV2ZWxvcG1lbnRcXCd9XCIpLicpXG4gIC5vcHRpb24oJy0td2F0Y2gnLCAnV2F0Y2ggZm9yIGNoYW5nZXMuJylcbiAgLmFjdGlvbigoY21kKSA9PiBkZXYoY21kLCBwcm9jZXNzLmV4aXQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbS5jb21tYW5kKCdpbml0IDxhcHBOYW1lPiBbcGFja2FnZU5hbWVdJylcbiAgLm9wdGlvbignLS1pbnN0YWxsJywgJ0luc3RhbGwgZGVwZW5kZW5jaWVzLicpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1wYWNrYWdlLW1hbmFnZXIgPG1hbmFnZXI+JywgJ1doaWNoIHBhY2thZ2UgbWFuYWdlciB0byB1c2UuIERlZmF1bHQ6IG5wbScpLmNob2ljZXMoWyducG0nLCAneWFybiddKS5kZWZhdWx0KCducG0nKSlcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicpXG4gIC5vcHRpb24oJy0tdHlwZXNjcmlwdCcsICdVc2UgYSBUeXBlc2NyaXB0IGJhc2VkIGFwcC4nKVxuICAuYWN0aW9uKChhcHBOYW1lLCBwYWNrYWdlTmFtZSwgY21kKSA9PiBpbml0KGFwcE5hbWUsIHBhY2thZ2VOYW1lLCBjbWQsIHByb2Nlc3MuZXhpdCkudGhlbigoKSA9PiB7fSkpO1xuXG5wcm9ncmFtLmNvbW1hbmQoJ2xpbmtlZCcpXG4gIC5vcHRpb24oJy0tcXVpZXQnLCAnTm8gTGV4IG5vdGlmaWNhdGlvbnMgcHJpbnRlZCBpbiB0aGUgY29uc29sZS4nKVxuICAuYWN0aW9uKChjbWQpID0+IGxpbmtlZChjbWQsIHByb2Nlc3MuZXhpdCkudGhlbigoKSA9PiB7fSkpO1xuXG5wcm9ncmFtLmNvbW1hbmQoJ2xpbnQnKVxuICAub3B0aW9uKCctLWNhY2hlJywgJ09ubHkgY2hlY2sgY2hhbmdlZCBmaWxlcy4gRGVmYXVsdDogZmFsc2UuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tY2FjaGVMb2NhdGlvbiA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY2FjaGUgZmlsZSBvciBkaXJlY3RvcnkuJylcbiAgLm9wdGlvbignLS1jb2xvcicsICdGb3JjZSBlbmFibGluZyBvZiBjb2xvci4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1VzZSB0aGlzIGNvbmZpZ3VyYXRpb24sIG92ZXJyaWRpbmcgLmVzbGludHJjLiogY29uZmlnIG9wdGlvbnMgaWYgcHJlc2VudC4gSWYgbm90IHNwZWNpZmllZCBhbmQgbm8gbG9jYWwgY29uZmlnIGV4aXN0cywgTGV4IHdpbGwgdXNlIGl0cyBkZWZhdWx0IGNvbmZpZy4nKVxuICAub3B0aW9uKCctLWRlYnVnJywgJ091dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tZW52SW5mbycsICdPdXRwdXQgZXhlY3V0aW9uIGVudmlyb25tZW50IGluZm9ybWF0aW9uLiBEZWZhdWx0OiBmYWxzZS4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1lbnYgPG4+JywgJ1NwZWNpZnkgZW52aXJvbm1lbnRzLicpXG4gIC5vcHRpb24oJy0tZml4JywgJ0FwcGx5IEFJIGZpeGVzIGFmdGVyIGJ1aWx0LWluIEVTTGludCBmaXhlcyAoc2FtZSBhcyAtLWZpeCkuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tZml4RHJ5UnVuJywgJ0F1dG9tYXRpY2FsbHkgZml4IHByb2JsZW1zIHdpdGhvdXQgc2F2aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1maXhUeXBlIDx0eXBlPicsICdTcGVjaWZ5IHRoZSB0eXBlcyBvZiBmaXhlcyB0byBhcHBseSAocHJvYmxlbSwgc3VnZ2VzdGlvbiwgbGF5b3V0KS4nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8bj4nLCAnVXNlIGEgc3BlY2lmaWMgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdDogc3R5bGlzaC4nKVxuICAub3B0aW9uKCctLWdsb2JhbCA8dmFyaWFibGVzPicsICdEZWZpbmUgZ2xvYmFsIHZhcmlhYmxlcy4nKVxuICAub3B0aW9uKCctLWlnbm9yZVBhdGggPHBhdGg+JywgJ1NwZWNpZnkgcGF0aCBvZiBpZ25vcmUgZmlsZS4nKVxuICAub3B0aW9uKCctLWlnbm9yZVBhdHRlcm4gPHBhdHRlcm4+JywgJ1BhdHRlcm4gb2YgZmlsZXMgdG8gaWdub3JlIChpbiBhZGRpdGlvbiB0byB0aG9zZSBpbiAuZXNsaW50aWdub3JlKS4nKVxuICAub3B0aW9uKCctLWluaXQnLCAnUnVuIGNvbmZpZyBpbml0aWFsaXphdGlvbiB3aXphcmQuIERlZmF1bHQ6IGZhbHNlLicsIGZhbHNlKVxuICAub3B0aW9uKCctLW1heFdhcm5pbmdzIDxudW0+JywgJ051bWJlciBvZiB3YXJuaW5ncyB0byB0cmlnZ2VyIG5vbnplcm8gZXhpdCBjb2RlLiBEZWZhdWx0OiAtMS4nKVxuICAub3B0aW9uKCctLW5vQ29sb3InLCAnRm9yY2UgZGlzYWJsaW5nIG9mIGNvbG9yLicsIGZhbHNlKVxuICAub3B0aW9uKCctLW5vRXNsaW50cmMnLCAnRGlzYWJsZSB1c2Ugb2YgY29uZmlndXJhdGlvbiBmcm9tIC5lc2xpbnRyYy4qLicsIGZhbHNlKVxuICAub3B0aW9uKCctLW5vSWdub3JlJywgJ0Rpc2FibGUgdXNlIG9mIGlnbm9yZSBmaWxlcyBhbmQgcGF0dGVybnMuJywgZmFsc2UpXG4gIC5vcHRpb24oJy0tbm9JbmxpbmVDb25maWcnLCAnUHJldmVudCBjb21tZW50cyBmcm9tIGNoYW5naW5nIGNvbmZpZyBvciBydWxlcy4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1vdXRwdXRGaWxlIDxwYXRoPicsICdTcGVjaWZ5IGZpbGUgdG8gd3JpdGUgcmVwb3J0IHRvLicpXG4gIC5vcHRpb24oJy0tcGFyc2VyIDxuPicsICdTcGVjaWZ5IHRoZSBwYXJzZXIgdG8gYmUgdXNlZC4nKVxuICAub3B0aW9uKCctLXBhcnNlck9wdGlvbnMgPG9wdGlvbnM+JywgJ1NwZWNpZnkgcGFyc2VyIG9wdGlvbnMuJylcbiAgLm9wdGlvbignLS1wbHVnaW4gPHBsdWdpbnM+JywgJ1NwZWNpZnkgcGx1Z2lucy4nKVxuICAub3B0aW9uKCctLXByaW50Q29uZmlnIDxwYXRoPicsICdQcmludCB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGZpbGUuJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicsIGZhbHNlKVxuICAub3B0aW9uKCctLXJlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJywgJ0FkZHMgcmVwb3J0ZWQgZXJyb3JzIGZvciB1bnVzZWQgZXNsaW50LWRpc2FibGUgZGlyZWN0aXZlcy4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1yZXNvbHZlUGx1Z2luc1JlbGF0aXZlVG8gPHBhdGg+JywgJ0EgZm9sZGVyIHdoZXJlIHBsdWdpbnMgc2hvdWxkIGJlIHJlc29sdmVkIGZyb20uJylcbiAgLm9wdGlvbignLS1ydWxlIDxwYXRoPicsICdTcGVjaWZ5IHJ1bGVzLicpXG4gIC5vcHRpb24oJy0tcnVsZXNkaXIgPHBhdGg+JywgJ1VzZSBhZGRpdGlvbmFsIHJ1bGVzIGZyb20gdGhpcyBkaXJlY3RvcnkuJylcbiAgLm9wdGlvbignLS1zdGRpbicsICdMaW50IGNvZGUgcHJvdmlkZWQgb24gPFNURElOPiAtIERlZmF1bHQ6IGZhbHNlLicsIGZhbHNlKVxuICAub3B0aW9uKCctLXN0ZGluRmlsZW5hbWUgPG4+JywgJ1NwZWNpZnkgZmlsZW5hbWUgdG8gcHJvY2VzcyBTVERJTiBhcy4nKVxuICAuYWN0aW9uKChjbWQpID0+IGxpbnQoY21kLCBwcm9jZXNzLmV4aXQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbS5jb21tYW5kKCdtaWdyYXRlJylcbiAgLm9wdGlvbignLXEsIC0tcXVpZXQnLCAnTm8gTGV4IG5vdGlmaWNhdGlvbnMgcHJpbnRlZCBpbiB0aGUgY29uc29sZS4nKVxuICAuYWN0aW9uKChjbWQpID0+IG1pZ3JhdGUoY21kLCBwcm9jZXNzLmV4aXQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbS5jb21tYW5kKCdwdWJsaXNoJylcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWJ1bXAgPHR5cGU+JywgJ0luY3JlbWVudHMgdGhlIHZlcnNpb24uIFR5cGVzIGluY2x1ZGU6IG1ham9yLCBtaW5vciwgcGF0Y2gsIGJldGEsIGFscGhhLCByYy4gRGVmYXVsdDogXCJwYXRjaFwiLicpLmNob2ljZXMoWydtYWpvcicsICdtaW5vcicsICdwYXRjaCcsICdiZXRhJywgJ2FscGhhJywgJ3JjJ10pLmRlZmF1bHQoJ3BhdGNoJykpXG4gIC5vcHRpb24oJy0tbmV3VmVyc2lvbiA8dmVyc2lvbk51bWJlcj4nLCAnUHVibGlzaCBhcyBhIHNwZWNpZmljIHZlcnNpb24uJylcbiAgLm9wdGlvbignLS1vdHAgPGNvZGU+JywgJ1Byb3ZpZGUgYSB0d28tZmFjdG9yIGNvZGUuJylcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXBhY2thZ2UtbWFuYWdlciA8bWFuYWdlcj4nLCAnV2hpY2ggcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gRGVmYXVsdDogbnBtJykuY2hvaWNlcyhbJ25wbScsICd5YXJuJ10pLmRlZmF1bHQoJ25wbScpKVxuICAub3B0aW9uKCctLXByaXZhdGUnLCAnUHVibGlzaGVzIHRoZSBtb2R1bGUgYXMgcmVzdHJpY3RlZC4nKVxuICAub3B0aW9uKCctLXF1aWV0JywgJ05vIExleCBub3RpZmljYXRpb25zIHByaW50ZWQgaW4gdGhlIGNvbnNvbGUuJylcbiAgLm9wdGlvbignLS10YWcgPHRhZz4nLCAnUmVnaXN0ZXJzIHRoZSBwdWJsaXNoZWQgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiB0YWcuJylcbiAgLmFjdGlvbigoY21kKSA9PiBwdWJsaXNoKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnc3Rvcnlib29rJylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ0N1c3RvbSBTdG9yeWJvb2sgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgcGF0aCAoaWUuIC5zdG9yeWJvb2spLicpXG4gIC5vcHRpb24oJy0tbGV4Q29uZmlnIDxwYXRoPicsICdDdXN0b20gTGV4IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXRoIChpZS4gbGV4LmNvbmZpZy5qcykuJylcbiAgLm9wdGlvbignLS1vcGVuJywgJ0F1dG9tYXRpY2FsbHkgb3BlbiBTdG9yeWJvb2sgaW4gYSBuZXcgYnJvd3NlciB3aW5kb3cuJylcbiAgLm9wdGlvbignLS1wb3J0IDxudW1iZXI+JywgJ1BvcnQgbnVtYmVyIGZvciB0aGUgU3Rvcnlib29rIHNlcnZlci4nKVxuICAub3B0aW9uKCctLXF1aWV0JywgJ05vIExleCBub3RpZmljYXRpb25zIHByaW50ZWQgaW4gdGhlIGNvbnNvbGUuJylcbiAgLm9wdGlvbignLS1zdGF0aWMnLCAnQnVpbGQgYSBzdGF0aWMgU3Rvcnlib29rIHNpdGUgaW5zdGVhZCBvZiBzdGFydGluZyBkZXYgc2VydmVyLicpXG4gIC5vcHRpb24oJy0tdmFyaWFibGVzIDxuPicsICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IGluIFwicHJvY2Vzcy5lbnZcIi4gKGllLiBcIntTVE9SWUJPT0tfVEhFTUU6IFxcJ2RhcmtcXCd9XCIpLicpXG4gIC5vcHRpb24oJy0tdmVyYm9zZScsICdTaG93IGRldGFpbGVkIHdlYnBhY2sgcHJvZ3Jlc3Mgb3V0cHV0LicpXG4gIC5hY3Rpb24oKGNtZCkgPT4gc3Rvcnlib29rKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgndGVzdCcpXG4gIC5vcHRpb24oJy0tYW5hbHl6ZScsICdVc2UgQUkgdG8gYW5hbHl6ZSB0ZXN0IGNvdmVyYWdlIGFuZCBzdWdnZXN0IGltcHJvdmVtZW50cy4nLCBmYWxzZSlcbiAgLm9wdGlvbignLS1kZWJ1Z1Rlc3RzJywgJ1VzZSBBSSB0byBkZWJ1ZyB0ZXN0IGZhaWx1cmVzIGFuZCBzdWdnZXN0IGZpeGVzLicsIGZhbHNlKVxuICAub3B0aW9uKCctLWdlbmVyYXRlJywgJ1VzZSBBSSB0byBnZW5lcmF0ZSB0ZXN0IGNhc2VzIGZvciB1bnRlc3RlZCBjb2RlLicsIGZhbHNlKVxuICAub3B0aW9uKCctLWJhaWwnLCAnRXhpdCB0aGUgdGVzdCBzdWl0ZSBpbW1lZGlhdGVseSB1cG9uIHRoZSBmaXJzdCBmYWlsaW5nIHRlc3Qgc3VpdGUuJylcbiAgLm9wdGlvbignLS1jaGFuZ2VkRmlsZXNXaXRoQW5jZXN0b3InLCAnUnVucyB0ZXN0cyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IGNoYW5nZXMgYW5kIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3QgY29tbWl0LicpXG4gIC5vcHRpb24oJy0tY2hhbmdlZFNpbmNlJywgJ1J1bnMgdGVzdHMgcmVsYXRlZCB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgcHJvdmlkZWQgYnJhbmNoLicpXG4gIC5vcHRpb24oJy0tY2knLCAnV2hlbiB0aGlzIG9wdGlvbiBpcyBwcm92aWRlZCwgSmVzdCB3aWxsIGFzc3VtZSBpdCBpcyBydW5uaW5nIGluIGEgQ0kgZW52aXJvbm1lbnQuJylcbiAgLm9wdGlvbignLS1jbGVhckNhY2hlJywgJ0NsZWFyIEplc3QgY2FjaGUuJylcbiAgLm9wdGlvbignLS1jb2xsZWN0Q292ZXJhZ2VGcm9tIDxnbG9iPicsICdBIGdsb2IgcGF0dGVybiByZWxhdGl2ZSB0byBtYXRjaGluZyB0aGUgZmlsZXMgdGhhdCBjb3ZlcmFnZSBpbmZvIG5lZWRzIHRvIGJlIGNvbGxlY3RlZCBmcm9tLicpXG4gIC5vcHRpb24oJy0tY29sb3JzJywgJ0ZvcmNlcyB0ZXN0IHJlc3VsdHMgb3V0cHV0IGhpZ2hsaWdodGluZyBldmVuIGlmIHN0ZG91dCBpcyBub3QgYSBUVFkuJylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ0N1c3RvbSBKZXN0IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXRoIChpZS4gamVzdC5jb25maWcuanMpLicpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnUHJpbnQgZGVidWdnaW5nIGluZm8gYWJvdXQgeW91ciBKZXN0IGNvbmZpZy4nKVxuICAub3B0aW9uKCctLWRldGVjdE9wZW5IYW5kbGVzJywgJ0F0dGVtcHQgdG8gY29sbGVjdCBhbmQgcHJpbnQgb3BlbiBoYW5kbGVzIHByZXZlbnRpbmcgSmVzdCBmcm9tIGV4aXRpbmcgY2xlYW5seScpXG4gIC5vcHRpb24oJy0tZW52aXJvbm1lbnQgPG4+JywgJ1RhcmdldCBlbnZpcm9ubWVudC4gXCJub2RlXCIgb3IgXCJ3ZWJcIi4gRGVmYXVsdDogXCJub2RlXCIuJylcbiAgLm9wdGlvbignLS1lbnYnLCAnVGhlIHRlc3QgZW52aXJvbm1lbnQgdXNlZCBmb3IgYWxsIHRlc3RzLiBUaGlzIGNhbiBwb2ludCB0byBhbnkgZmlsZSBvciBub2RlIG1vZHVsZS4gRXhhbXBsZXM6IGpzZG9tLCBub2RlIG9yIHBhdGgvdG8vbXktZW52aXJvbm1lbnQuanMuJylcbiAgLm9wdGlvbignLS1lcnJvck9uRGVwcmVjYXRlZCcsICdNYWtlIGNhbGxpbmcgZGVwcmVjYXRlZCBBUElzIHRocm93IGhlbHBmdWwgZXJyb3IgbWVzc2FnZXMuJylcbiAgLm9wdGlvbignLS1leHBhbmQnLCAnVXNlIHRoaXMgZmxhZyB0byBzaG93IGZ1bGwgZGlmZnMgYW5kIGVycm9ycyBpbnN0ZWFkIG9mIGEgcGF0Y2guJylcbiAgLm9wdGlvbignLS1mb3JjZUV4aXQnLCAnRm9yY2UgSmVzdCB0byBleGl0IGFmdGVyIGFsbCB0ZXN0cyBoYXZlIGNvbXBsZXRlZCBydW5uaW5nLicpXG4gIC5vcHRpb24oJy0tanNvbicsICdQcmludHMgdGhlIHRlc3QgcmVzdWx0cyBpbiBKU09OLicpXG4gIC5vcHRpb24oJy0tbGFzdENvbW1pdCcsICdSdW4gYWxsIHRlc3RzIGFmZmVjdGVkIGJ5IGZpbGUgY2hhbmdlcyBpbiB0aGUgbGFzdCBjb21taXQgbWFkZS4nKVxuICAub3B0aW9uKCctLWxleENvbmZpZyA8cGF0aD4nLCAnQ3VzdG9tIExleCBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIGxleC5jb25maWcuanMpLicpXG4gIC5vcHRpb24oJy0tbGlzdFRlc3RzJywgJ0xpc3RzIGFsbCB0ZXN0cyBhcyBKU09OIHRoYXQgSmVzdCB3aWxsIHJ1biBnaXZlbiB0aGUgYXJndW1lbnRzLCBhbmQgZXhpdHMuJylcbiAgLm9wdGlvbignLS1sb2dIZWFwVXNhZ2UnLCAnTG9ncyB0aGUgaGVhcCB1c2FnZSBhZnRlciBldmVyeSB0ZXN0LicpXG4gIC5vcHRpb24oJy0tbWF4V29ya2VycyA8bnVtPicsICdTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmtlcnMgdGhlIHdvcmtlci1wb29sIHdpbGwgc3Bhd24gZm9yIHJ1bm5pbmcgdGVzdHMuICcpXG4gIC5vcHRpb24oJy0tbm9TdGFja1RyYWNlJywgJ0Rpc2FibGVzIHN0YWNrIHRyYWNlIGluIHRlc3QgcmVzdWx0cyBvdXRwdXQuJylcbiAgLm9wdGlvbignLS1ub3RpZnknLCAnQWN0aXZhdGVzIG5vdGlmaWNhdGlvbnMgZm9yIHRlc3QgcmVzdWx0cy4nKVxuICAub3B0aW9uKCctLW9ubHlDaGFuZ2VkJywgJ3VuIGJhc2VkIG9uIHdoaWNoIGZpbGVzIGhhdmUgY2hhbmdlZCBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LiAnKVxuICAub3B0aW9uKCctLW91dHB1dEZpbGUgPGZpbGVuYW1lPicsICdXcml0ZSB0ZXN0IHJlc3VsdHMgdG8gYSBmaWxlIHdoZW4gdGhlIC0tanNvbiBvcHRpb24gaXMgYWxzbyBzcGVjaWZpZWQuJylcbiAgLm9wdGlvbignLS1wYXNzV2l0aE5vVGVzdHMnLCAnQWxsb3dzIHRoZSB0ZXN0IHN1aXRlIHRvIHBhc3Mgd2hlbiBubyBmaWxlcyBhcmUgZm91bmQuJylcbiAgLm9wdGlvbignLS1xdWlldCcsICdObyBMZXggbm90aWZpY2F0aW9ucyBwcmludGVkIGluIHRoZSBjb25zb2xlLicpXG4gIC5vcHRpb24oJy0tcnVuSW5CYW5kJywgJ1J1biBhbGwgdGVzdHMgc2VyaWFsbHkgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcywgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSB3b3JrZXIgcG9vbCBvZiBjaGlsZCBwcm9jZXNzZXMgdGhhdCBydW4gdGVzdHMuJylcbiAgLm9wdGlvbignLS1zZXR1cCA8cGF0aD4nLCAnSmVzdCBzZXR1cCBmaWxlIHBhdGguJylcbiAgLm9wdGlvbignLS1zaG93Q29uZmlnJywgJ1ByaW50IHlvdXIgSmVzdCBjb25maWcgYW5kIHRoZW4gZXhpdHMuJylcbiAgLm9wdGlvbignLS1zaWxlbnQnLCAnUHJldmVudCB0ZXN0cyBmcm9tIHByaW50aW5nIG1lc3NhZ2VzIHRocm91Z2ggdGhlIGNvbnNvbGUuJylcbiAgLm9wdGlvbignLS10ZXN0TG9jYXRpb25JblJlc3VsdHMnLCAnQWRkcyBhIGxvY2F0aW9uIGZpZWxkIHRvIHRlc3QgcmVzdWx0cy4nKVxuICAub3B0aW9uKCctLXRlc3ROYW1lUGF0dGVybiA8cmVnZXg+JywgJ1J1biBvbmx5IHRlc3RzIHdpdGggYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXguICcpXG4gIC5vcHRpb24oJy0tdGVzdFBhdGhQYXR0ZXJuIDxyZWdleD4nLCAnQSByZWdleHAgcGF0dGVybiBzdHJpbmcgdGhhdCBpcyBtYXRjaGVkIGFnYWluc3QgYWxsIHRlc3RzIHBhdGhzIGJlZm9yZSBleGVjdXRpbmcgdGhlIHRlc3QuJylcbiAgLm9wdGlvbignLS10eXBlc2NyaXB0JywgJ1RyYW5zcGlsZSBhcyBUeXBlc2NyaXB0LicpXG4gIC5vcHRpb24oJy0tdXBkYXRlJywgJ1VwZGF0ZSBzbmFwc2hvdHMuIFJ1bnMgXCJqZXN0IC0tdXBkYXRlU25hcHNob3RzXCInKVxuICAub3B0aW9uKCctLXVzZVN0ZGVycicsICdEaXZlcnQgYWxsIG91dHB1dCB0byBzdGRlcnIuJylcbiAgLm9wdGlvbignLS12ZXJib3NlJywgJ0Rpc3BsYXkgaW5kaXZpZHVhbCB0ZXN0IHJlc3VsdHMgd2l0aCB0aGUgdGVzdCBzdWl0ZSBoaWVyYXJjaHkuJylcbiAgLm9wdGlvbignLS13YXRjaCA8cGF0aD4nLCAnV2F0Y2ggZmlsZXMgZm9yIGNoYW5nZXMgYW5kIHJlcnVuIHRlc3RzIHJlbGF0ZWQgdG8gY2hhbmdlZCBmaWxlcy4nKVxuICAub3B0aW9uKCctLXdhdGNoQWxsJywgJ1dhdGNoIGZpbGVzIGZvciBjaGFuZ2VzIGFuZCByZXJ1biBhbGwgdGVzdHMgd2hlbiBzb21ldGhpbmcgY2hhbmdlcy4nKVxuICAuYWN0aW9uKChvcHRpb25zLCBjbWQpID0+IHRlc3Qob3B0aW9ucywgY21kLmFyZ3MsIHByb2Nlc3MuZXhpdCkudGhlbigoKSA9PiB7fSkpO1xuXG5wcm9ncmFtLmNvbW1hbmQoJ3VwZGF0ZScpXG4gIC5vcHRpb24oJy0taW50ZXJhY3RpdmUnLCAnQ2hvb3NlIHdoaWNoIHBhY2thZ2VzIHRvIHVwZGF0ZS4nKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tcGFja2FnZS1tYW5hZ2VyIDxtYW5hZ2VyPicsICdXaGljaCBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlLiBEZWZhdWx0OiBucG0nKS5jaG9pY2VzKFsnbnBtJywgJ3lhcm4nXSkuZGVmYXVsdCgnbnBtJykpXG4gIC5vcHRpb24oJy0tcXVpZXQnLCAnTm8gTGV4IG5vdGlmaWNhdGlvbnMgcHJpbnRlZCBpbiB0aGUgY29uc29sZS4nKVxuICAub3B0aW9uKCctLXJlZ2lzdHJ5JywgJ0FkZCBhIGN1c3RvbSByZWdpc3RyeSB1cmwuJylcbiAgLmFjdGlvbigoY21kKSA9PiB1cGRhdGUoY21kLCBwcm9jZXNzLmV4aXQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbS5jb21tYW5kKCd1cGdyYWRlJylcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXBhY2thZ2UtbWFuYWdlciA8bWFuYWdlcj4nLCAnV2hpY2ggcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gRGVmYXVsdDogbnBtJykuY2hvaWNlcyhbJ25wbScsICd5YXJuJ10pLmRlZmF1bHQoJ25wbScpKVxuICAub3B0aW9uKCctLXF1aWV0JywgJ05vIExleCBub3RpZmljYXRpb25zIHByaW50ZWQgaW4gdGhlIGNvbnNvbGUuJylcbiAgLmFjdGlvbigoY21kKSA9PiB1cGdyYWRlKGNtZCwgcHJvY2Vzcy5leGl0KS50aGVuKCgpID0+IHt9KSk7XG5cbnByb2dyYW0uY29tbWFuZCgnYWknKVxuICAub3B0aW9uKCctLWNvbnRleHQnLCAnSW5jbHVkZSBwcm9qZWN0IGNvbnRleHQgaW4gdGhlIEFJIHByb21wdC4nLCB0cnVlKVxuICAub3B0aW9uKCctLWZpbGUgPHBhdGg+JywgJ1NwZWNpZmljIGZpbGUgdG8gb3BlcmF0ZSBvbi4nKVxuICAub3B0aW9uKCctLWxleENvbmZpZyA8cGF0aD4nLCAnQ3VzdG9tIExleCBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAoaWUuIGxleC5jb25maWcuanMpLicpXG4gIC5vcHRpb24oJy0tbW9kZWwgPG1vZGVsPicsICdBSSBtb2RlbCB0byB1c2UuIERlZmF1bHQ6IGdwdC00by4nKVxuICAub3B0aW9uKCctLXByb21wdCA8dGV4dD4nLCAnVGhlIHByb21wdCB0byBzZW5kIHRvIHRoZSBBSS4nKVxuICAub3B0aW9uKCctLXF1aWV0JywgJ05vIExleCBub3RpZmljYXRpb25zIHByaW50ZWQgaW4gdGhlIGNvbnNvbGUuJylcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRhc2sgPHRhc2s+JywgJ1R5cGUgb2YgQUkgdGFzayB0byBwZXJmb3JtLicpLmNob2ljZXMoWydnZW5lcmF0ZScsICdleHBsYWluJywgJ3Rlc3QnLCAnb3B0aW1pemUnLCAnaGVscCddKS5kZWZhdWx0KCdoZWxwJykpXG4gIC5hY3Rpb24oKGNtZCkgPT4gYWlGdW5jdGlvbihjbWQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbS5jb21tYW5kKCd2ZXJzaW9ucycpXG4gIC5vcHRpb24oJy0tanNvbicsICdQcmludCB0aGUgdmVyc2lvbiBhcyBhIEpTT04gb2JqZWN0LicpXG4gIC5hY3Rpb24oKGNtZCkgPT4gdmVyc2lvbnMoY21kLCBwcm9jZXNzLmV4aXQpLnRoZW4oKCkgPT4ge30pKTtcblxucHJvZ3JhbVxuICAudmVyc2lvbihwYWNrYWdlSnNvbi52ZXJzaW9uKVxuICAucGFyc2UocHJvY2Vzcy5hcmd2KTsiXSwKICAibWFwcGluZ3MiOiAiO0FBS0EsU0FBUSxRQUFRLGVBQWM7QUFDOUIsU0FBUSxvQkFBbUI7QUFDM0IsU0FBUSxxQkFBb0I7QUFDNUIsU0FBUSxTQUFTLGVBQWM7QUFDL0IsU0FBUSxxQkFBb0I7QUFFNUIsU0FBUSxrQkFBaUI7QUFDekIsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsYUFBWTtBQUNwQixTQUFRLGVBQWM7QUFDdEIsU0FBUSxjQUFhO0FBQ3JCLFNBQVEsY0FBYTtBQUNyQixTQUFRLFdBQVU7QUFDbEIsU0FBUSxZQUFXO0FBQ25CLFNBQVEsY0FBYTtBQUNyQixTQUFRLFlBQVc7QUFDbkIsU0FBUSxlQUFjO0FBQ3RCLFNBQVEsZUFBYztBQUN0QixTQUFRLGlCQUFnQjtBQUN4QixTQUFRLFlBQVc7QUFDbkIsU0FBUSxjQUFhO0FBQ3JCLFNBQVEsZUFBYztBQUN0QixT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
@@ -1,9 +0,0 @@
1
- import { AIConfig } from '../LexConfig.js';
2
- export declare const callCursorAI: (prompt: string, options: AIConfig) => Promise<string>;
3
- export declare const callOpenAIAI: (prompt: string, options: AIConfig) => Promise<string>;
4
- export declare const callAnthropicAI: (prompt: string, options: AIConfig) => Promise<string>;
5
- export declare const callCopilotAI: (prompt: string, options: AIConfig) => Promise<string>;
6
- export declare const promptForAIProvider: (quiet?: boolean) => Promise<"cursor" | "copilot" | "openai" | "anthropic" | "none">;
7
- export declare const promptForAPIKey: (provider: string, quiet?: boolean) => Promise<string>;
8
- export declare const getAIService: (provider: string, options: AIConfig) => (prompt: string, options: AIConfig) => Promise<string>;
9
- export declare const callAIService: (prompt: string, quiet?: boolean) => Promise<string>;
@@ -1,299 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "fs";
2
- import { resolve as pathResolve } from "path";
3
- import readline from "readline";
4
- import { LexConfig } from "../LexConfig.js";
5
- import { createSpinner } from "./app.js";
6
- import { log } from "./log.js";
7
- const callCursorAI = async (prompt, options) => {
8
- try {
9
- log("Using Cursor IDE for AI fixes...", "info");
10
- log("AI fix requested via Cursor IDE", "info");
11
- const taskMatch = prompt.match(/^(Generate code according to the following request|Explain the following code|Generate comprehensive unit tests|Analyze the following code|Provide guidance on the following development question):/);
12
- const task = taskMatch ? taskMatch[1] : "";
13
- const isGenerateTask = task.startsWith("Generate code");
14
- const questionMatch = prompt.match(/(?:Generate code according to the following request|Explain the following code|Generate comprehensive unit tests|Analyze the following code|Provide guidance on the following development question):\s*([\s\S]+?)(?:===CONTEXT===|$)/);
15
- const question = questionMatch ? questionMatch[1].trim() : prompt;
16
- if (question.toLowerCase().includes("how many files") && prompt.includes("Project structure:")) {
17
- const projectStructure = prompt.split("Project structure:")[1] || "";
18
- const files = projectStructure.trim().split("\n");
19
- return `Based on the project structure provided, there are ${files.length} files in the project.`;
20
- }
21
- if (isGenerateTask) {
22
- return `
23
- # Code Generation Request: "${question}"
24
-
25
- To generate code using Cursor's AI capabilities:
26
-
27
- 1. **Open your project in Cursor IDE** (https://cursor.sh)
28
- 2. Press **Cmd+L** (or Ctrl+L on Windows/Linux) to open the AI chat
29
- 3. Type your request: "${question}"
30
- 4. Cursor will generate the code directly in your editor
31
-
32
- The current CLI integration doesn't have direct access to Cursor's code generation capabilities.
33
-
34
- **Alternative options:**
35
-
36
- 1. **Use OpenAI or Anthropic directly:**
37
- Configure in your lex.config file:
38
- \`\`\`js
39
- export default {
40
- ai: {
41
- provider: 'openai',
42
- apiKey: process.env.OPENAI_API_KEY,
43
- model: 'gpt-4o'
44
- }
45
- }
46
- \`\`\`
47
-
48
- 2. **Use Cursor's command line tool:**
49
- Install: \`npm install -g @cursor/cli\`
50
- Run: \`cursor ai "${question}"\`
51
- `;
52
- }
53
- return `
54
- To use Cursor's AI capabilities for "${question}", you need to:
55
-
56
- 1. Open your project in Cursor IDE (https://cursor.sh)
57
- 2. Use Cursor's built-in AI features by pressing Cmd+K or Cmd+L
58
- 3. Or run the 'cursor' command directly from your terminal
59
-
60
- The current integration is limited and doesn't directly access Cursor's AI capabilities.
61
-
62
- For the best experience with AI code generation:
63
- - Use Cursor IDE directly
64
- - Or configure OpenAI or Anthropic as your provider in your lex.config file:
65
-
66
- \`\`\`js
67
- // lex.config.js (or lex.config.mjs, lex.config.cjs, etc.)
68
- export default {
69
- ai: {
70
- provider: 'openai', // or 'anthropic'
71
- apiKey: process.env.OPENAI_API_KEY, // or ANTHROPIC_API_KEY
72
- model: 'gpt-4o' // or 'claude-3-opus'
73
- }
74
- }
75
- \`\`\`
76
-
77
- Then set your API key as an environment variable:
78
- \`\`\`
79
- export OPENAI_API_KEY=your_key_here
80
- \`\`\`
81
- `;
82
- } catch (error) {
83
- throw new Error(`Cursor AI error: ${error.message}`);
84
- }
85
- };
86
- const callOpenAIAI = async (prompt, options) => {
87
- try {
88
- const apiKey = options.apiKey || process.env.OPENAI_API_KEY;
89
- if (!apiKey) {
90
- throw new Error("OpenAI API key is required. Set it in your lex.config file or as OPENAI_API_KEY environment variable.");
91
- }
92
- const response = await fetch("https://api.openai.com/v1/chat/completions", {
93
- body: JSON.stringify({
94
- max_tokens: options.maxTokens || 4e3,
95
- messages: [
96
- { content: "You are a helpful assistant that fixes ESLint errors in code.", role: "system" },
97
- { content: prompt, role: "user" }
98
- ],
99
- model: options.model || "gpt-4o",
100
- temperature: options.temperature || 0.1
101
- }),
102
- headers: {
103
- Authorization: `Bearer ${apiKey}`,
104
- "Content-Type": "application/json"
105
- },
106
- method: "POST"
107
- });
108
- if (!response.ok) {
109
- const error = await response.json();
110
- throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);
111
- }
112
- const data = await response.json();
113
- return data.choices[0].message.content;
114
- } catch (error) {
115
- throw new Error(`OpenAI AI error: ${error.message}`);
116
- }
117
- };
118
- const callAnthropicAI = async (prompt, options) => {
119
- try {
120
- const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;
121
- if (!apiKey) {
122
- throw new Error("Anthropic API key is required. Set it in your lex.config file or as ANTHROPIC_API_KEY environment variable.");
123
- }
124
- const response = await fetch("https://api.anthropic.com/v1/messages", {
125
- body: JSON.stringify({
126
- max_tokens: options.maxTokens || 4e3,
127
- messages: [
128
- { content: prompt, role: "user" }
129
- ],
130
- model: options.model || "claude-3-sonnet-20240229",
131
- temperature: options.temperature || 0.1
132
- }),
133
- headers: {
134
- "Content-Type": "application/json",
135
- "anthropic-version": "2023-06-01",
136
- "x-api-key": apiKey
137
- },
138
- method: "POST"
139
- });
140
- if (!response.ok) {
141
- const error = await response.json();
142
- throw new Error(`Anthropic API error: ${error.error?.message || response.statusText}`);
143
- }
144
- const data = await response.json();
145
- return data.content[0].text;
146
- } catch (error) {
147
- throw new Error(`Anthropic AI error: ${error.message}`);
148
- }
149
- };
150
- const callCopilotAI = async (prompt, options) => {
151
- try {
152
- log("GitHub Copilot AI fixes not directly supported. Using manual fix mode.", "info");
153
- return prompt;
154
- } catch (error) {
155
- throw new Error(`GitHub Copilot AI error: ${error.message}`);
156
- }
157
- };
158
- const promptForAIProvider = async (quiet = false) => {
159
- const rl = readline.createInterface({
160
- input: process.stdin,
161
- output: process.stdout
162
- });
163
- return new Promise((resolve) => {
164
- log("\nNo AI provider configured. Please choose an AI provider:", "info");
165
- log("1. Cursor IDE", "info");
166
- log("2. OpenAI", "info");
167
- log("3. Anthropic", "info");
168
- log("4. GitHub Copilot", "info");
169
- log("5. None (Skip AI features)", "info");
170
- rl.question("Enter your choice (1-5): ", (answer) => {
171
- rl.close();
172
- switch (answer) {
173
- case "1":
174
- resolve("cursor");
175
- break;
176
- case "2":
177
- resolve("openai");
178
- break;
179
- case "3":
180
- resolve("anthropic");
181
- break;
182
- case "4":
183
- resolve("copilot");
184
- break;
185
- default:
186
- resolve("none");
187
- }
188
- });
189
- });
190
- };
191
- const promptForAPIKey = async (provider, quiet = false) => {
192
- const rl = readline.createInterface({
193
- input: process.stdin,
194
- output: process.stdout
195
- });
196
- return new Promise((resolve) => {
197
- rl.question(`Please enter your ${provider} API key: `, (answer) => {
198
- rl.close();
199
- resolve(answer);
200
- });
201
- });
202
- };
203
- const getAIService = (provider, options) => {
204
- switch (provider) {
205
- case "cursor":
206
- return callCursorAI;
207
- case "openai":
208
- return callOpenAIAI;
209
- case "anthropic":
210
- return callAnthropicAI;
211
- case "copilot":
212
- return callCopilotAI;
213
- default:
214
- return async () => "No AI provider configured";
215
- }
216
- };
217
- const callAIService = async (prompt, quiet = false) => {
218
- const spinner = createSpinner(quiet);
219
- spinner.start("Calling AI service to fix code issues...");
220
- try {
221
- const aiConfig = LexConfig.config.ai || { provider: "none" };
222
- const isInCursorIDE = process.env.CURSOR_IDE === "true";
223
- if (isInCursorIDE && (aiConfig.provider === "none" || !aiConfig.provider)) {
224
- log("Detected Cursor IDE environment, using Cursor as AI provider", "info", quiet);
225
- aiConfig.provider = "cursor";
226
- }
227
- if (aiConfig.provider === "none") {
228
- const provider = await promptForAIProvider(quiet);
229
- if (provider === "none") {
230
- spinner.fail("AI features skipped");
231
- return "";
232
- }
233
- aiConfig.provider = provider;
234
- if (provider !== "cursor" && provider !== "copilot" && !process.env[`${provider.toUpperCase()}_API_KEY`]) {
235
- aiConfig.apiKey = await promptForAPIKey(provider, quiet);
236
- }
237
- LexConfig.config.ai = aiConfig;
238
- const configFormats = ["js", "mjs", "cjs", "ts", "json"];
239
- const configBaseName = "lex.config";
240
- let configPath = "";
241
- for (const format of configFormats) {
242
- const potentialPath = pathResolve(process.cwd(), `./${configBaseName}.${format}`);
243
- if (existsSync(potentialPath)) {
244
- configPath = potentialPath;
245
- break;
246
- }
247
- }
248
- if (configPath) {
249
- try {
250
- const configContent = readFileSync(configPath, "utf8");
251
- const updatedConfig = configContent.replace(
252
- /ai:.*?[,}]/s,
253
- `ai: { provider: '${aiConfig.provider}' },`
254
- );
255
- writeFileSync(configPath, updatedConfig);
256
- } catch (_error) {
257
- }
258
- }
259
- }
260
- let result = "";
261
- switch (aiConfig.provider) {
262
- case "cursor":
263
- result = await callCursorAI(prompt, aiConfig);
264
- log("Cursor IDE AI integration active", "info", quiet);
265
- break;
266
- case "openai":
267
- result = await callOpenAIAI(prompt, aiConfig);
268
- break;
269
- case "anthropic":
270
- result = await callAnthropicAI(prompt, aiConfig);
271
- break;
272
- case "copilot":
273
- result = await callCopilotAI(prompt, aiConfig);
274
- break;
275
- default:
276
- spinner.fail("No AI provider configured");
277
- return "";
278
- }
279
- spinner.succeed("AI code fixes generated successfully");
280
- return result;
281
- } catch (error) {
282
- spinner.fail(`AI service error: ${error.message}`);
283
- if (!quiet) {
284
- log(error, "error");
285
- }
286
- return "";
287
- }
288
- };
289
- export {
290
- callAIService,
291
- callAnthropicAI,
292
- callCopilotAI,
293
- callCursorAI,
294
- callOpenAIAI,
295
- getAIService,
296
- promptForAIProvider,
297
- promptForAPIKey
298
- };
299
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2FpU2VydmljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlYWRsaW5lIGZyb20gJ3JlYWRsaW5lJztcblxuaW1wb3J0IHtBSUNvbmZpZywgTGV4Q29uZmlnfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi9sb2cuanMnO1xuXG4vLyBDdXJzb3IgSURFIGludGVncmF0aW9uXG5leHBvcnQgY29uc3QgY2FsbEN1cnNvckFJID0gYXN5bmMgKHByb21wdDogc3RyaW5nLCBvcHRpb25zOiBBSUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gV2hlbiBydW5uaW5nIHdpdGhpbiBDdXJzb3IgSURFLCB3ZSBjYW4gd3JpdGUgdGhlIHByb21wdCB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgLy8gdGhhdCBDdXJzb3IgY2FuIHVzZSB0byBwcm92aWRlIEFJIGFzc2lzdGFuY2VcbiAgICBsb2coJ1VzaW5nIEN1cnNvciBJREUgZm9yIEFJIGZpeGVzLi4uJywgJ2luZm8nKTtcblxuICAgIC8vIEZvciBub3csIGp1c3QgbG9nIHRoZSBwcm9tcHQgYW5kIHJldHVybiBhIHBsYWNlaG9sZGVyXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCBDdXJzb3Igd291bGQgaGFuZGxlIHRoaXMgYXV0b21hdGljYWxseVxuICAgIGxvZygnQUkgZml4IHJlcXVlc3RlZCB2aWEgQ3Vyc29yIElERScsICdpbmZvJyk7XG5cbiAgICBjb25zdCB0YXNrTWF0Y2ggPSBwcm9tcHQubWF0Y2goL14oR2VuZXJhdGUgY29kZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyByZXF1ZXN0fEV4cGxhaW4gdGhlIGZvbGxvd2luZyBjb2RlfEdlbmVyYXRlIGNvbXByZWhlbnNpdmUgdW5pdCB0ZXN0c3xBbmFseXplIHRoZSBmb2xsb3dpbmcgY29kZXxQcm92aWRlIGd1aWRhbmNlIG9uIHRoZSBmb2xsb3dpbmcgZGV2ZWxvcG1lbnQgcXVlc3Rpb24pOi8pO1xuICAgIGNvbnN0IHRhc2sgPSB0YXNrTWF0Y2ggPyB0YXNrTWF0Y2hbMV0gOiAnJztcbiAgICBjb25zdCBpc0dlbmVyYXRlVGFzayA9IHRhc2suc3RhcnRzV2l0aCgnR2VuZXJhdGUgY29kZScpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25NYXRjaCA9IHByb21wdC5tYXRjaCgvKD86R2VuZXJhdGUgY29kZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyByZXF1ZXN0fEV4cGxhaW4gdGhlIGZvbGxvd2luZyBjb2RlfEdlbmVyYXRlIGNvbXByZWhlbnNpdmUgdW5pdCB0ZXN0c3xBbmFseXplIHRoZSBmb2xsb3dpbmcgY29kZXxQcm92aWRlIGd1aWRhbmNlIG9uIHRoZSBmb2xsb3dpbmcgZGV2ZWxvcG1lbnQgcXVlc3Rpb24pOlxccyooW1xcc1xcU10rPykoPzo9PT1DT05URVhUPT09fCQpLyk7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBxdWVzdGlvbk1hdGNoID8gcXVlc3Rpb25NYXRjaFsxXS50cmltKCkgOiBwcm9tcHQ7XG5cbiAgICBpZihxdWVzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdob3cgbWFueSBmaWxlcycpICYmIHByb21wdC5pbmNsdWRlcygnUHJvamVjdCBzdHJ1Y3R1cmU6JykpIHtcbiAgICAgIGNvbnN0IHByb2plY3RTdHJ1Y3R1cmUgPSBwcm9tcHQuc3BsaXQoJ1Byb2plY3Qgc3RydWN0dXJlOicpWzFdIHx8ICcnO1xuICAgICAgY29uc3QgZmlsZXMgPSBwcm9qZWN0U3RydWN0dXJlLnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gICAgICByZXR1cm4gYEJhc2VkIG9uIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBwcm92aWRlZCwgdGhlcmUgYXJlICR7ZmlsZXMubGVuZ3RofSBmaWxlcyBpbiB0aGUgcHJvamVjdC5gO1xuICAgIH1cblxuICAgIGlmKGlzR2VuZXJhdGVUYXNrKSB7XG4gICAgICByZXR1cm4gYFxuIyBDb2RlIEdlbmVyYXRpb24gUmVxdWVzdDogXCIke3F1ZXN0aW9ufVwiXG5cblRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgQ3Vyc29yJ3MgQUkgY2FwYWJpbGl0aWVzOlxuXG4xLiAqKk9wZW4geW91ciBwcm9qZWN0IGluIEN1cnNvciBJREUqKiAoaHR0cHM6Ly9jdXJzb3Iuc2gpXG4yLiBQcmVzcyAqKkNtZCtMKiogKG9yIEN0cmwrTCBvbiBXaW5kb3dzL0xpbnV4KSB0byBvcGVuIHRoZSBBSSBjaGF0XG4zLiBUeXBlIHlvdXIgcmVxdWVzdDogXCIke3F1ZXN0aW9ufVwiXG40LiBDdXJzb3Igd2lsbCBnZW5lcmF0ZSB0aGUgY29kZSBkaXJlY3RseSBpbiB5b3VyIGVkaXRvclxuXG5UaGUgY3VycmVudCBDTEkgaW50ZWdyYXRpb24gZG9lc24ndCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gQ3Vyc29yJ3MgY29kZSBnZW5lcmF0aW9uIGNhcGFiaWxpdGllcy5cblxuKipBbHRlcm5hdGl2ZSBvcHRpb25zOioqXG5cbjEuICoqVXNlIE9wZW5BSSBvciBBbnRocm9waWMgZGlyZWN0bHk6KipcbiAgIENvbmZpZ3VyZSBpbiB5b3VyIGxleC5jb25maWcgZmlsZTpcbiAgIFxcYFxcYFxcYGpzXG4gICBleHBvcnQgZGVmYXVsdCB7XG4gICAgIGFpOiB7XG4gICAgICAgcHJvdmlkZXI6ICdvcGVuYWknLFxuICAgICAgIGFwaUtleTogcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVksXG4gICAgICAgbW9kZWw6ICdncHQtNG8nXG4gICAgIH1cbiAgIH1cbiAgIFxcYFxcYFxcYFxuXG4yLiAqKlVzZSBDdXJzb3IncyBjb21tYW5kIGxpbmUgdG9vbDoqKlxuICAgSW5zdGFsbDogXFxgbnBtIGluc3RhbGwgLWcgQGN1cnNvci9jbGlcXGBcbiAgIFJ1bjogXFxgY3Vyc29yIGFpIFwiJHtxdWVzdGlvbn1cIlxcYFxuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuVG8gdXNlIEN1cnNvcidzIEFJIGNhcGFiaWxpdGllcyBmb3IgXCIke3F1ZXN0aW9ufVwiLCB5b3UgbmVlZCB0bzpcblxuMS4gT3BlbiB5b3VyIHByb2plY3QgaW4gQ3Vyc29yIElERSAoaHR0cHM6Ly9jdXJzb3Iuc2gpXG4yLiBVc2UgQ3Vyc29yJ3MgYnVpbHQtaW4gQUkgZmVhdHVyZXMgYnkgcHJlc3NpbmcgQ21kK0sgb3IgQ21kK0xcbjMuIE9yIHJ1biB0aGUgJ2N1cnNvcicgY29tbWFuZCBkaXJlY3RseSBmcm9tIHlvdXIgdGVybWluYWxcblxuVGhlIGN1cnJlbnQgaW50ZWdyYXRpb24gaXMgbGltaXRlZCBhbmQgZG9lc24ndCBkaXJlY3RseSBhY2Nlc3MgQ3Vyc29yJ3MgQUkgY2FwYWJpbGl0aWVzLlxuXG5Gb3IgdGhlIGJlc3QgZXhwZXJpZW5jZSB3aXRoIEFJIGNvZGUgZ2VuZXJhdGlvbjpcbi0gVXNlIEN1cnNvciBJREUgZGlyZWN0bHlcbi0gT3IgY29uZmlndXJlIE9wZW5BSSBvciBBbnRocm9waWMgYXMgeW91ciBwcm92aWRlciBpbiB5b3VyIGxleC5jb25maWcgZmlsZTpcblxuXFxgXFxgXFxganNcbi8vIGxleC5jb25maWcuanMgKG9yIGxleC5jb25maWcubWpzLCBsZXguY29uZmlnLmNqcywgZXRjLilcbmV4cG9ydCBkZWZhdWx0IHtcbiAgYWk6IHtcbiAgICBwcm92aWRlcjogJ29wZW5haScsIC8vIG9yICdhbnRocm9waWMnXG4gICAgYXBpS2V5OiBwcm9jZXNzLmVudi5PUEVOQUlfQVBJX0tFWSwgLy8gb3IgQU5USFJPUElDX0FQSV9LRVlcbiAgICBtb2RlbDogJ2dwdC00bycgLy8gb3IgJ2NsYXVkZS0zLW9wdXMnXG4gIH1cbn1cblxcYFxcYFxcYFxuXG5UaGVuIHNldCB5b3VyIEFQSSBrZXkgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU6XG5cXGBcXGBcXGBcbmV4cG9ydCBPUEVOQUlfQVBJX0tFWT15b3VyX2tleV9oZXJlXG5cXGBcXGBcXGBcbmA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEN1cnNvciBBSSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2FsbE9wZW5BSUFJID0gYXN5bmMgKHByb21wdDogc3RyaW5nLCBvcHRpb25zOiBBSUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgaWYoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgQVBJIGtleSBpcyByZXF1aXJlZC4gU2V0IGl0IGluIHlvdXIgbGV4LmNvbmZpZyBmaWxlIG9yIGFzIE9QRU5BSV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvY2hhdC9jb21wbGV0aW9ucycsIHtcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbWF4X3Rva2Vuczogb3B0aW9ucy5tYXhUb2tlbnMgfHwgNDAwMCxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICB7Y29udGVudDogJ1lvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudCB0aGF0IGZpeGVzIEVTTGludCBlcnJvcnMgaW4gY29kZS4nLCByb2xlOiAnc3lzdGVtJ30sXG4gICAgICAgICAge2NvbnRlbnQ6IHByb21wdCwgcm9sZTogJ3VzZXInfVxuICAgICAgICBdLFxuICAgICAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCB8fCAnZ3B0LTRvJyxcbiAgICAgICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMudGVtcGVyYXR1cmUgfHwgMC4xXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICB9KTtcblxuICAgIGlmKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BSSBBUEkgZXJyb3I6ICR7ZXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhLmNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgQUkgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNhbGxBbnRocm9waWNBSSA9IGFzeW5jIChwcm9tcHQ6IHN0cmluZywgb3B0aW9uczogQUlDb25maWcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LkFOVEhST1BJQ19BUElfS0VZO1xuICAgIGlmKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW50aHJvcGljIEFQSSBrZXkgaXMgcmVxdWlyZWQuIFNldCBpdCBpbiB5b3VyIGxleC5jb25maWcgZmlsZSBvciBhcyBBTlRIUk9QSUNfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzJywge1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtYXhfdG9rZW5zOiBvcHRpb25zLm1heFRva2VucyB8fCA0MDAwLFxuICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgIHtjb250ZW50OiBwcm9tcHQsIHJvbGU6ICd1c2VyJ31cbiAgICAgICAgXSxcbiAgICAgICAgbW9kZWw6IG9wdGlvbnMubW9kZWwgfHwgJ2NsYXVkZS0zLXNvbm5ldC0yMDI0MDIyOScsXG4gICAgICAgIHRlbXBlcmF0dXJlOiBvcHRpb25zLnRlbXBlcmF0dXJlIHx8IDAuMVxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJyxcbiAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleVxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgfSk7XG5cbiAgICBpZighcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbnRocm9waWMgQVBJIGVycm9yOiAke2Vycm9yLmVycm9yPy5tZXNzYWdlIHx8IHJlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5jb250ZW50WzBdLnRleHQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFudGhyb3BpYyBBSSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2FsbENvcGlsb3RBSSA9IGFzeW5jIChwcm9tcHQ6IHN0cmluZywgb3B0aW9uczogQUlDb25maWcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGxvZygnR2l0SHViIENvcGlsb3QgQUkgZml4ZXMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZC4gVXNpbmcgbWFudWFsIGZpeCBtb2RlLicsICdpbmZvJyk7XG4gICAgcmV0dXJuIHByb21wdDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIENvcGlsb3QgQUkgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByb21wdEZvckFJUHJvdmlkZXIgPSBhc3luYyAocXVpZXQgPSBmYWxzZSk6IFByb21pc2U8J2N1cnNvcicgfCAnY29waWxvdCcgfCAnb3BlbmFpJyB8ICdhbnRocm9waWMnIHwgJ25vbmUnPiA9PiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxvZygnXFxuTm8gQUkgcHJvdmlkZXIgY29uZmlndXJlZC4gUGxlYXNlIGNob29zZSBhbiBBSSBwcm92aWRlcjonLCAnaW5mbycpO1xuICAgIGxvZygnMS4gQ3Vyc29yIElERScsICdpbmZvJyk7XG4gICAgbG9nKCcyLiBPcGVuQUknLCAnaW5mbycpO1xuICAgIGxvZygnMy4gQW50aHJvcGljJywgJ2luZm8nKTtcbiAgICBsb2coJzQuIEdpdEh1YiBDb3BpbG90JywgJ2luZm8nKTtcbiAgICBsb2coJzUuIE5vbmUgKFNraXAgQUkgZmVhdHVyZXMpJywgJ2luZm8nKTtcblxuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciB5b3VyIGNob2ljZSAoMS01KTogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcblxuICAgICAgc3dpdGNoKGFuc3dlcikge1xuICAgICAgICBjYXNlICcxJzpcbiAgICAgICAgICByZXNvbHZlKCdjdXJzb3InKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnMic6XG4gICAgICAgICAgcmVzb2x2ZSgnb3BlbmFpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJzMnOlxuICAgICAgICAgIHJlc29sdmUoJ2FudGhyb3BpYycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICc0JzpcbiAgICAgICAgICByZXNvbHZlKCdjb3BpbG90Jyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVzb2x2ZSgnbm9uZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9tcHRGb3JBUElLZXkgPSBhc3luYyAocHJvdmlkZXI6IHN0cmluZywgcXVpZXQgPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKGBQbGVhc2UgZW50ZXIgeW91ciAke3Byb3ZpZGVyfSBBUEkga2V5OiBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBSVNlcnZpY2UgPSAocHJvdmlkZXI6IHN0cmluZywgb3B0aW9uczogQUlDb25maWcpOiAocHJvbXB0OiBzdHJpbmcsIG9wdGlvbnM6IEFJQ29uZmlnKSA9PiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBzd2l0Y2gocHJvdmlkZXIpIHtcbiAgICBjYXNlICdjdXJzb3InOlxuICAgICAgcmV0dXJuIGNhbGxDdXJzb3JBSTtcbiAgICBjYXNlICdvcGVuYWknOlxuICAgICAgcmV0dXJuIGNhbGxPcGVuQUlBSTtcbiAgICBjYXNlICdhbnRocm9waWMnOlxuICAgICAgcmV0dXJuIGNhbGxBbnRocm9waWNBSTtcbiAgICBjYXNlICdjb3BpbG90JzpcbiAgICAgIHJldHVybiBjYWxsQ29waWxvdEFJO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXN5bmMgKCkgPT4gJ05vIEFJIHByb3ZpZGVyIGNvbmZpZ3VyZWQnO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2FsbEFJU2VydmljZSA9IGFzeW5jIChwcm9tcHQ6IHN0cmluZywgcXVpZXQgPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcbiAgc3Bpbm5lci5zdGFydCgnQ2FsbGluZyBBSSBzZXJ2aWNlIHRvIGZpeCBjb2RlIGlzc3Vlcy4uLicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYWlDb25maWcgPSBMZXhDb25maWcuY29uZmlnLmFpIHx8IHtwcm92aWRlcjogJ25vbmUnfTtcblxuICAgIGNvbnN0IGlzSW5DdXJzb3JJREUgPSBwcm9jZXNzLmVudi5DVVJTT1JfSURFID09PSAndHJ1ZSc7XG4gICAgaWYoaXNJbkN1cnNvcklERSAmJiAoYWlDb25maWcucHJvdmlkZXIgPT09ICdub25lJyB8fCAhYWlDb25maWcucHJvdmlkZXIpKSB7XG4gICAgICBsb2coJ0RldGVjdGVkIEN1cnNvciBJREUgZW52aXJvbm1lbnQsIHVzaW5nIEN1cnNvciBhcyBBSSBwcm92aWRlcicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgYWlDb25maWcucHJvdmlkZXIgPSAnY3Vyc29yJztcbiAgICB9XG5cbiAgICBpZihhaUNvbmZpZy5wcm92aWRlciA9PT0gJ25vbmUnKSB7XG4gICAgICBjb25zdCBwcm92aWRlciA9IGF3YWl0IHByb21wdEZvckFJUHJvdmlkZXIocXVpZXQpO1xuXG4gICAgICBpZihwcm92aWRlciA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnQUkgZmVhdHVyZXMgc2tpcHBlZCcpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIGFpQ29uZmlnLnByb3ZpZGVyID0gcHJvdmlkZXI7XG5cbiAgICAgIGlmKHByb3ZpZGVyICE9PSAnY3Vyc29yJyAmJiBwcm92aWRlciAhPT0gJ2NvcGlsb3QnICYmXG4gICAgICAgICFwcm9jZXNzLmVudltgJHtwcm92aWRlci50b1VwcGVyQ2FzZSgpfV9BUElfS0VZYF0pIHtcbiAgICAgICAgYWlDb25maWcuYXBpS2V5ID0gYXdhaXQgcHJvbXB0Rm9yQVBJS2V5KHByb3ZpZGVyLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy5jb25maWcuYWkgPSBhaUNvbmZpZztcblxuICAgICAgLy8gU2VhcmNoIGZvciBjb25maWcgZmlsZXMgaW4gbXVsdGlwbGUgZm9ybWF0cyBsaWtlIExleENvbmZpZy5wYXJzZUNvbmZpZyBkb2VzXG4gICAgICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcbiAgICAgIGNvbnN0IGNvbmZpZ0Jhc2VOYW1lID0gJ2xleC5jb25maWcnO1xuICAgICAgbGV0IGNvbmZpZ1BhdGggPSAnJztcblxuICAgICAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICAgIGNvbnN0IHBvdGVudGlhbFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gKTtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhwb3RlbnRpYWxQYXRoKSkge1xuICAgICAgICAgIGNvbmZpZ1BhdGggPSBwb3RlbnRpYWxQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNvbmZpZ1BhdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb25maWdDb250ZW50ID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IGNvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgIC9haTouKj9bLH1dL3MsXG4gICAgICAgICAgICBgYWk6IHsgcHJvdmlkZXI6ICcke2FpQ29uZmlnLnByb3ZpZGVyfScgfSxgXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIHVwZGF0ZWRDb25maWcpO1xuICAgICAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgc3dpdGNoKGFpQ29uZmlnLnByb3ZpZGVyKSB7XG4gICAgICBjYXNlICdjdXJzb3InOlxuICAgICAgICByZXN1bHQgPSBhd2FpdCBjYWxsQ3Vyc29yQUkocHJvbXB0LCBhaUNvbmZpZyk7XG4gICAgICAgIGxvZygnQ3Vyc29yIElERSBBSSBpbnRlZ3JhdGlvbiBhY3RpdmUnLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcGVuYWknOlxuICAgICAgICByZXN1bHQgPSBhd2FpdCBjYWxsT3BlbkFJQUkocHJvbXB0LCBhaUNvbmZpZyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW50aHJvcGljJzpcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY2FsbEFudGhyb3BpY0FJKHByb21wdCwgYWlDb25maWcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvcGlsb3QnOlxuICAgICAgICByZXN1bHQgPSBhd2FpdCBjYWxsQ29waWxvdEFJKHByb21wdCwgYWlDb25maWcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnTm8gQUkgcHJvdmlkZXIgY29uZmlndXJlZCcpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBjb2RlIGZpeGVzIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKGBBSSBzZXJ2aWNlIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBsb2coZXJyb3IsICdlcnJvcicpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9CO0FBQ3RELFNBQVEsV0FBVyxtQkFBa0I7QUFDckMsT0FBTyxjQUFjO0FBRXJCLFNBQWtCLGlCQUFnQjtBQUNsQyxTQUFRLHFCQUFvQjtBQUM1QixTQUFRLFdBQVU7QUFHWCxNQUFNLGVBQWUsT0FBTyxRQUFnQixZQUF1QztBQUN4RixNQUFJO0FBR0YsUUFBSSxvQ0FBb0MsTUFBTTtBQUk5QyxRQUFJLG1DQUFtQyxNQUFNO0FBRTdDLFVBQU0sWUFBWSxPQUFPLE1BQU0scU1BQXFNO0FBQ3BPLFVBQU0sT0FBTyxZQUFZLFVBQVUsQ0FBQyxJQUFJO0FBQ3hDLFVBQU0saUJBQWlCLEtBQUssV0FBVyxlQUFlO0FBRXRELFVBQU0sZ0JBQWdCLE9BQU8sTUFBTSxzT0FBc087QUFDelEsVUFBTSxXQUFXLGdCQUFnQixjQUFjLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFM0QsUUFBRyxTQUFTLFlB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