@nlabs/lex 1.47.2 → 1.47.3

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 (124) hide show
  1. package/.gitattributes +1 -0
  2. package/.storybook/main.ts +86 -0
  3. package/.storybook/preview.ts +15 -0
  4. package/.vscode/settings.json +83 -0
  5. package/CHANGELOG.md +1 -0
  6. package/TYPESCRIPT_CONFIGS.md +103 -0
  7. package/__mocks__/LexConfig.js +17 -2
  8. package/__mocks__/execa.js +9 -7
  9. package/__mocks__/file.js +50 -0
  10. package/__mocks__/ora.js +10 -1
  11. package/config.json +33 -0
  12. package/dist/LexConfig.js +93 -5
  13. package/dist/commands/ai/ai.js +1 -1
  14. package/dist/commands/build/build.js +15 -11
  15. package/dist/commands/clean/clean.js +10 -4
  16. package/dist/commands/compile/compile.js +29 -34
  17. package/dist/commands/create/create.js +5 -5
  18. package/dist/commands/dev/dev.js +11 -7
  19. package/dist/commands/init/init.js +5 -5
  20. package/dist/commands/lint/lint.js +55 -64
  21. package/dist/commands/migrate/migrate.js +2 -2
  22. package/dist/commands/storybook/storybook.js +174 -0
  23. package/dist/commands/test/test.js +51 -13
  24. package/dist/commands/update/update.js +3 -2
  25. package/dist/commands/upgrade/upgrade.js +3 -3
  26. package/dist/commands/versions/versions.js +3 -3
  27. package/dist/create/changelog.js +1 -1
  28. package/dist/dist/LexConfig.d.ts +119 -0
  29. package/dist/dist/utils/file.d.ts +7 -0
  30. package/dist/dist/utils/log.d.ts +1 -0
  31. package/dist/index.js +4 -3
  32. package/dist/lex.js +14 -1
  33. package/dist/utils/aiService.js +2 -2
  34. package/dist/utils/app.js +3 -3
  35. package/dist/utils/file.js +78 -4
  36. package/eslint.config.js +5 -3
  37. package/examples/lex.config.js +50 -0
  38. package/jest.config.cjs +14 -14
  39. package/jest.setup.js +30 -4
  40. package/package.json +40 -23
  41. package/tsconfig.build.json +38 -5
  42. package/tsconfig.json +28 -1
  43. package/tsconfig.lint.json +44 -0
  44. package/tsconfig.test.json +48 -0
  45. package/webpack.config.js +14 -13
  46. package/dist/LexConfig.d.ts +0 -79
  47. package/dist/commands/ai/ai.d.ts +0 -17
  48. package/dist/commands/ai/index.d.ts +0 -8
  49. package/dist/commands/build/build.cli.test.d.ts +0 -5
  50. package/dist/commands/build/build.d.ts +0 -18
  51. package/dist/commands/build/build.integration.test.d.ts +0 -1
  52. package/dist/commands/build/build.options.test.d.ts +0 -5
  53. package/dist/commands/clean/clean.cli.test.d.ts +0 -1
  54. package/dist/commands/clean/clean.d.ts +0 -7
  55. package/dist/commands/clean/clean.integration.test.d.ts +0 -1
  56. package/dist/commands/clean/clean.options.test.d.ts +0 -1
  57. package/dist/commands/compile/compile.cli.test.d.ts +0 -1
  58. package/dist/commands/compile/compile.d.ts +0 -2
  59. package/dist/commands/compile/compile.integration.test.d.ts +0 -1
  60. package/dist/commands/compile/compile.options.test.d.ts +0 -1
  61. package/dist/commands/config/config.cli.test.d.ts +0 -1
  62. package/dist/commands/config/config.d.ts +0 -7
  63. package/dist/commands/config/config.integration.test.d.ts +0 -1
  64. package/dist/commands/config/config.options.test.d.ts +0 -1
  65. package/dist/commands/copy/copy.cli.test.d.ts +0 -1
  66. package/dist/commands/copy/copy.d.ts +0 -6
  67. package/dist/commands/copy/copy.integration.test.d.ts +0 -1
  68. package/dist/commands/copy/copy.options.test.d.ts +0 -1
  69. package/dist/commands/create/create.cli.test.d.ts +0 -1
  70. package/dist/commands/create/create.d.ts +0 -8
  71. package/dist/commands/create/create.integration.test.d.ts +0 -1
  72. package/dist/commands/create/create.options.test.d.ts +0 -1
  73. package/dist/commands/dev/dev.cli.test.d.ts +0 -1
  74. package/dist/commands/dev/dev.d.ts +0 -11
  75. package/dist/commands/dev/dev.integration.test.d.ts +0 -1
  76. package/dist/commands/dev/dev.options.test.d.ts +0 -1
  77. package/dist/commands/init/init.cli.test.d.ts +0 -1
  78. package/dist/commands/init/init.d.ts +0 -9
  79. package/dist/commands/init/init.integration.test.d.ts +0 -1
  80. package/dist/commands/init/init.options.test.d.ts +0 -1
  81. package/dist/commands/link/link.cli.test.d.ts +0 -1
  82. package/dist/commands/link/link.d.ts +0 -6
  83. package/dist/commands/link/link.integration.test.d.ts +0 -1
  84. package/dist/commands/link/link.options.test.d.ts +0 -1
  85. package/dist/commands/lint/autofix.d.ts +0 -2
  86. package/dist/commands/lint/lint.cli.test.d.ts +0 -1
  87. package/dist/commands/lint/lint.d.ts +0 -39
  88. package/dist/commands/lint/lint.integration.test.d.ts +0 -1
  89. package/dist/commands/lint/lint.options.test.d.ts +0 -1
  90. package/dist/commands/migrate/migrate.cli.test.d.ts +0 -1
  91. package/dist/commands/migrate/migrate.d.ts +0 -7
  92. package/dist/commands/migrate/migrate.integration.test.d.ts +0 -1
  93. package/dist/commands/migrate/migrate.options.test.d.ts +0 -1
  94. package/dist/commands/publish/publish.cli.test.d.ts +0 -1
  95. package/dist/commands/publish/publish.d.ts +0 -12
  96. package/dist/commands/publish/publish.integration.test.d.ts +0 -1
  97. package/dist/commands/publish/publish.options.test.d.ts +0 -1
  98. package/dist/commands/test/test.cli.test.d.ts +0 -1
  99. package/dist/commands/test/test.d.ts +0 -50
  100. package/dist/commands/test/test.integration.test.d.ts +0 -1
  101. package/dist/commands/test/test.options.test.d.ts +0 -1
  102. package/dist/commands/test/test.test.d.ts +0 -1
  103. package/dist/commands/update/update.cli.test.d.ts +0 -1
  104. package/dist/commands/update/update.d.ts +0 -9
  105. package/dist/commands/update/update.integration.test.d.ts +0 -1
  106. package/dist/commands/update/update.options.test.d.ts +0 -1
  107. package/dist/commands/upgrade/upgrade.cli.test.d.ts +0 -1
  108. package/dist/commands/upgrade/upgrade.d.ts +0 -7
  109. package/dist/commands/upgrade/upgrade.integration.test.d.ts +0 -1
  110. package/dist/commands/upgrade/upgrade.options.test.d.ts +0 -1
  111. package/dist/commands/versions/versions.cli.test.d.ts +0 -1
  112. package/dist/commands/versions/versions.d.ts +0 -13
  113. package/dist/commands/versions/versions.integration.test.d.ts +0 -1
  114. package/dist/commands/versions/versions.options.test.d.ts +0 -1
  115. package/dist/create/changelog.d.ts +0 -6
  116. package/dist/index.d.ts +0 -31
  117. package/dist/lex.d.ts +0 -2
  118. package/dist/types.d.ts +0 -5
  119. package/dist/utils/aiService.d.ts +0 -9
  120. package/dist/utils/app.d.ts +0 -41
  121. package/dist/utils/file.d.ts +0 -3
  122. package/dist/utils/log.d.ts +0 -1
  123. package/dist/utils/reactShim.d.ts +0 -2
  124. /package/{jest.config.lex.d.ts → dist/jest.config.lex.d.ts} +0 -0
@@ -1,7 +1,32 @@
1
1
  import findFileUp from "find-file-up";
2
2
  import { existsSync } from "fs";
3
3
  import { resolve as pathResolve } from "path";
4
- import { URL } from "url";
4
+ import { LexConfig } from "../LexConfig.js";
5
+ function getDirName() {
6
+ try {
7
+ return eval('new URL(".", import.meta.url).pathname');
8
+ } catch {
9
+ return process.cwd();
10
+ }
11
+ }
12
+ function getFilePath(relativePath) {
13
+ try {
14
+ return eval('require("url").fileURLToPath(new URL(relativePath, import.meta.url))');
15
+ } catch {
16
+ if (relativePath === "../../../package.json") {
17
+ return pathResolve(process.cwd(), "package.json");
18
+ }
19
+ return pathResolve(process.cwd(), relativePath);
20
+ }
21
+ }
22
+ function getLexPackageJsonPath() {
23
+ try {
24
+ const lexRoot = eval('require("path").dirname(require("url").fileURLToPath(import.meta.url))');
25
+ return pathResolve(lexRoot, "../../package.json");
26
+ } catch {
27
+ return pathResolve(process.cwd(), "package.json");
28
+ }
29
+ }
5
30
  const relativeFilePath = (filename, dirPath = "./", backUp = 0) => {
6
31
  const nestDepth = 10;
7
32
  if (backUp) {
@@ -32,7 +57,7 @@ const relativeNodePath = (filename, dirPath = "./", backUp = 0) => {
32
57
  return findFileUp.sync(modulePath, dirPath, nestDepth) || `/node_modules/${filename}`;
33
58
  };
34
59
  const getNodePath = (moduleName) => {
35
- const dirName = new URL(".", import.meta.url).pathname;
60
+ const dirName = getDirName();
36
61
  const modulePath = `node_modules/${moduleName}`;
37
62
  const projectPath = pathResolve(process.cwd(), modulePath);
38
63
  if (existsSync(projectPath)) {
@@ -45,9 +70,58 @@ const getNodePath = (moduleName) => {
45
70
  const localPath = findFileUp.sync(modulePath, "./", 10) || `./${modulePath}`;
46
71
  return localPath;
47
72
  };
73
+ const resolveBinaryPath = (binaryName, packageName) => {
74
+ const lexDir = LexConfig.getLexDir();
75
+ const lexBinPath = pathResolve(lexDir, `node_modules/.bin/${binaryName}`);
76
+ if (existsSync(lexBinPath)) {
77
+ return lexBinPath;
78
+ }
79
+ if (packageName) {
80
+ const lexPackageBinPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}`);
81
+ if (existsSync(lexPackageBinPath)) {
82
+ return lexPackageBinPath;
83
+ }
84
+ const lexPackageBinJsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.js`);
85
+ if (existsSync(lexPackageBinJsPath)) {
86
+ return lexPackageBinJsPath;
87
+ }
88
+ const lexPackageBinCjsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.cjs`);
89
+ if (existsSync(lexPackageBinCjsPath)) {
90
+ return lexPackageBinCjsPath;
91
+ }
92
+ }
93
+ const checkBinUp = (startDir) => {
94
+ let checkDir = startDir;
95
+ for (let i = 0; i < 5; i++) {
96
+ const monorepoBinPath = pathResolve(checkDir, `node_modules/.bin/${binaryName}`);
97
+ if (existsSync(monorepoBinPath)) {
98
+ return monorepoBinPath;
99
+ }
100
+ const parentDir = pathResolve(checkDir, "..");
101
+ if (parentDir === checkDir) {
102
+ break;
103
+ }
104
+ checkDir = parentDir;
105
+ }
106
+ return "";
107
+ };
108
+ const fromCwd = checkBinUp(process.cwd());
109
+ if (fromCwd) {
110
+ return fromCwd;
111
+ }
112
+ const fromLex = checkBinUp(lexDir);
113
+ if (fromLex) {
114
+ return fromLex;
115
+ }
116
+ return "";
117
+ };
48
118
  export {
119
+ getDirName,
120
+ getFilePath,
121
+ getLexPackageJsonPath,
49
122
  getNodePath,
50
123
  relativeFilePath,
51
- relativeNodePath
124
+ relativeNodePath,
125
+ resolveBinaryPath
52
126
  };
53
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2ZpbGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyLVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbi8vIEdldCBmaWxlIHBhdGhzIHJlbGF0aXZlIHRvIExleFxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xuICAgIGNvbnN0IHByZXZpb3VzUGF0aDogc3RyaW5nID0gQXJyYXkoYmFja1VwKS5maWxsKG51bGwpLm1hcCgoKSA9PiAnLi4vJykuam9pbignJyk7XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKGZpbGVQYXRoLCBwcmV2aW91c1BhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRGaWxlVXAuc3luYyhmaWxlbmFtZSwgZGlyUGF0aCwgbmVzdERlcHRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxhdGl2ZU5vZGVQYXRoID0gKGZpbGVuYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyA9ICcuLycsIGJhY2tVcDogbnVtYmVyID0gMCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5lc3REZXB0aDogbnVtYmVyID0gMTA7XG4gIGNvbnN0IG1vZHVsZVBhdGggPSBgbm9kZV9tb2R1bGVzLyR7ZmlsZW5hbWV9YDtcblxuICAvLyBGaXJzdCwgY2hlY2sgdGhlIExleCBwYWNrYWdlJ3Mgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxuICBpZihkaXJQYXRoICE9PSAnLi8nKSB7XG4gICAgY29uc3QgbGV4TW9kdWxlUGF0aCA9IHBhdGhSZXNvbHZlKGRpclBhdGgsIG1vZHVsZVBhdGgpO1xuICAgIGlmKGV4aXN0c1N5bmMobGV4TW9kdWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhNb2R1bGVQYXRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlY29uZCwgY2hlY2sgdGhlIHVzZXIncyBwcm9qZWN0IG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICAvLyBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBhcyBmYWxsYmFja1xuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuLy8gR2V0IGZpbGUgcGF0aHMgcmVsYXRpdmUgdG8gTGV4XG5leHBvcnQgY29uc3QgZ2V0Tm9kZVBhdGggPSAobW9kdWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZGlyTmFtZSA9IG5ldyBVUkwoJy4nLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lO1xuICBjb25zdCBtb2R1bGVQYXRoOiBzdHJpbmcgPSBgbm9kZV9tb2R1bGVzLyR7bW9kdWxlTmFtZX1gO1xuXG4gIC8vIFRyeSBwcm9qZWN0IHJvb3QgZmlyc3RcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICAvLyBUaGVuIHRyeSBtb2R1bGUgbG9jYWwgdG8gTGV4XG4gIGNvbnN0IHJlcG9QYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMobW9kdWxlUGF0aCwgZGlyTmFtZSk7XG4gIGlmKHJlcG9QYXRoICYmIGV4aXN0c1N5bmMocmVwb1BhdGgpKSB7XG4gICAgcmV0dXJuIHJlcG9QYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gZ2VuZXJhbCBzZWFyY2hcbiAgY29uc3QgbG9jYWxQYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMobW9kdWxlUGF0aCwgJy4vJywgMTApIHx8IGAuLyR7bW9kdWxlUGF0aH1gO1xuICByZXR1cm4gbG9jYWxQYXRoO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFPLGdCQUFnQjtBQUN2QixTQUFRLGtCQUFpQjtBQUN6QixTQUFRLFdBQVcsbUJBQWtCO0FBQ3JDLFNBQVEsV0FBVTtBQUdYLE1BQU0sbUJBQW1CLENBQUMsVUFBa0IsVUFBa0IsTUFBTSxTQUFpQixNQUFjO0FBQ3hHLFFBQU0sWUFBb0I7QUFFMUIsTUFBRyxRQUFRO0FBQ1QsVUFBTSxXQUFtQixXQUFXLEtBQUssVUFBVSxTQUFTLFNBQVM7QUFDckUsVUFBTSxlQUF1QixNQUFNLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLEtBQUssRUFBRTtBQUM5RSxXQUFPLFlBQVksVUFBVSxZQUFZO0FBQUEsRUFDM0M7QUFFQSxTQUFPLFdBQVcsS0FBSyxVQUFVLFNBQVMsU0FBUztBQUNyRDtBQUVPLE1BQU0sbUJBQW1CLENBQUMsVUFBa0IsVUFBa0IsTUFBTSxTQUFpQixNQUFjO0FBQ3hHLFFBQU0sWUFBb0I7QUFDMUIsUUFBTSxhQUFhLGdCQUFnQixRQUFRO0FBRzNDLE1BQUcsWUFBWSxNQUFNO0FBQ25CLFVBQU0sZ0JBQWdCLFlBQVksU0FBUyxVQUFVO0FBQ3JELFFBQUcsV0FBVyxhQUFhLEdBQUc7QUFDNUIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBR0EsUUFBTSxjQUFjLFlBQVksUUFBUSxJQUFJLEdBQUcsVUFBVTtBQUN6RCxNQUFHLFdBQVcsV0FBVyxHQUFHO0FBQzFCLFdBQU87QUFBQSxFQUNUO0FBR0EsTUFBRyxRQUFRO0FBQ1QsVUFBTSxXQUFtQixXQUFXLEtBQUssWUFBWSxTQUFTLFNBQVM7QUFDdkUsVUFBTSxlQUF1QixNQUFNLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNqRixXQUFPLFlBQVksVUFBVSxZQUFZO0FBQUEsRUFDM0M7QUFFQSxTQUFPLFdBQVcsS0FBSyxZQUFZLFNBQVMsU0FBUyxLQUFLLGlCQUFpQixRQUFRO0FBQ3JGO0FBR08sTUFBTSxjQUFjLENBQUMsZUFBK0I7QUFDekQsUUFBTSxVQUFVLElBQUksSUFBSSxLQUFLLFlBQVksR0FBRyxFQUFFO0FBQzlDLFFBQU0sYUFBcUIsZ0JBQWdCLFVBQVU7QUFHckQsUUFBTSxjQUFjLFlBQVksUUFBUSxJQUFJLEdBQUcsVUFBVTtBQUN6RCxNQUFHLFdBQVcsV0FBVyxHQUFHO0FBQzFCLFdBQU87QUFBQSxFQUNUO0FBR0EsUUFBTSxXQUFtQixXQUFXLEtBQUssWUFBWSxPQUFPO0FBQzVELE1BQUcsWUFBWSxXQUFXLFFBQVEsR0FBRztBQUNuQyxXQUFPO0FBQUEsRUFDVDtBQUdBLFFBQU0sWUFBb0IsV0FBVyxLQUFLLFlBQVksTUFBTSxFQUFFLEtBQUssS0FBSyxVQUFVO0FBQ2xGLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
127
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2ZpbGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuXG4vKipcbiAqIFNhZmVseSBnZXQgZGlyZWN0b3J5IG5hbWUgdGhhdCB3b3JrcyBpbiBib3RoIEVTTSBhbmQgSmVzdCBlbnZpcm9ubWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpck5hbWUoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyBPbmx5IHdvcmtzIGluIEVTTSBlbnZpcm9ubWVudHNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgIHJldHVybiBldmFsKCduZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIGZvciBKZXN0IG9yIENKU1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICB9XG59XG5cbi8qKlxuICogU2FmZWx5IGdldCBmaWxlIHBhdGggdGhhdCB3b3JrcyBpbiBib3RoIEVTTSBhbmQgSmVzdCBlbnZpcm9ubWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVQYXRoKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyBPbmx5IHdvcmtzIGluIEVTTSBlbnZpcm9ubWVudHNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgIHJldHVybiBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgobmV3IFVSTChyZWxhdGl2ZVBhdGgsIGltcG9ydC5tZXRhLnVybCkpJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIGZvciBKZXN0IG9yIENKU1xuICAgIGlmKHJlbGF0aXZlUGF0aCA9PT0gJy4uLy4uLy4uL3BhY2thZ2UuanNvbicpIHtcbiAgICAgIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIExleCdzIG93biBwYWNrYWdlLmpzb24sIHJlZ2FyZGxlc3Mgb2YgQ1dEXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZXhQYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8gTGV4J3Mgb3duIHBhY2thZ2UuanNvbiwgcmVnYXJkbGVzcyBvZiBDV0RcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgIGNvbnN0IGxleFJvb3QgPSBldmFsKCdyZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKHJlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKScpO1xuICAgIHJldHVybiBwYXRoUmVzb2x2ZShsZXhSb290LCAnLi4vLi4vcGFja2FnZS5qc29uJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIGZvciBKZXN0IG9yIENKUyBlbnZpcm9ubWVudHNcbiAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG59XG5cbi8vIEdldCBmaWxlIHBhdGhzIHJlbGF0aXZlIHRvIExleFxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xuICAgIGNvbnN0IHByZXZpb3VzUGF0aDogc3RyaW5nID0gQXJyYXkoYmFja1VwKS5maWxsKG51bGwpLm1hcCgoKSA9PiAnLi4vJykuam9pbignJyk7XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKGZpbGVQYXRoLCBwcmV2aW91c1BhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRGaWxlVXAuc3luYyhmaWxlbmFtZSwgZGlyUGF0aCwgbmVzdERlcHRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxhdGl2ZU5vZGVQYXRoID0gKGZpbGVuYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyA9ICcuLycsIGJhY2tVcDogbnVtYmVyID0gMCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5lc3REZXB0aDogbnVtYmVyID0gMTA7XG4gIGNvbnN0IG1vZHVsZVBhdGggPSBgbm9kZV9tb2R1bGVzLyR7ZmlsZW5hbWV9YDtcblxuICAvLyBGaXJzdCwgY2hlY2sgdGhlIExleCBwYWNrYWdlJ3Mgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxuICBpZihkaXJQYXRoICE9PSAnLi8nKSB7XG4gICAgY29uc3QgbGV4TW9kdWxlUGF0aCA9IHBhdGhSZXNvbHZlKGRpclBhdGgsIG1vZHVsZVBhdGgpO1xuICAgIGlmKGV4aXN0c1N5bmMobGV4TW9kdWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhNb2R1bGVQYXRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlY29uZCwgY2hlY2sgdGhlIHVzZXIncyBwcm9qZWN0IG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICAvLyBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBhcyBmYWxsYmFja1xuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuLy8gR2V0IGZpbGUgcGF0aHMgcmVsYXRpdmUgdG8gTGV4XG5leHBvcnQgY29uc3QgZ2V0Tm9kZVBhdGggPSAobW9kdWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUoKTtcbiAgY29uc3QgbW9kdWxlUGF0aDogc3RyaW5nID0gYG5vZGVfbW9kdWxlcy8ke21vZHVsZU5hbWV9YDtcblxuICAvLyBUcnkgcHJvamVjdCByb290IGZpcnN0XG4gIGNvbnN0IHByb2plY3RQYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgbW9kdWxlUGF0aCk7XG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgcmV0dXJuIHByb2plY3RQYXRoO1xuICB9XG5cbiAgLy8gVGhlbiB0cnkgbW9kdWxlIGxvY2FsIHRvIExleFxuICBjb25zdCByZXBvUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpck5hbWUpO1xuICBpZihyZXBvUGF0aCAmJiBleGlzdHNTeW5jKHJlcG9QYXRoKSkge1xuICAgIHJldHVybiByZXBvUGF0aDtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGdlbmVyYWwgc2VhcmNoXG4gIGNvbnN0IGxvY2FsUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsICcuLycsIDEwKSB8fCBgLi8ke21vZHVsZVBhdGh9YDtcbiAgcmV0dXJuIGxvY2FsUGF0aDtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBiaW5hcnkgcGF0aCB3aXRoIGZhbGxiYWNrIGxvZ2ljIGZvciBtb25vcmVwbyBhbmQgcGFja2FnZSBzY2VuYXJpb3NcbiAqIENoZWNrczogMSkgTGV4J3Mgbm9kZV9tb2R1bGVzLy5iaW4vLCAyKSBMZXgncyBub2RlX21vZHVsZXMvPHBhY2thZ2U+L2Jpbi8sIDMpIE1vbm9yZXBvIHJvb3Qgbm9kZV9tb2R1bGVzLy5iaW4vIChmcm9tIHByb2Nlc3MuY3dkKCkpLCA0KSBNb25vcmVwbyByb290IG5vZGVfbW9kdWxlcy8uYmluLyAoZnJvbSBMZXgncyBkaXIpXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQmluYXJ5UGF0aCA9IChiaW5hcnlOYW1lOiBzdHJpbmcsIHBhY2thZ2VOYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIC8vIDEuIENoZWNrIExleCdzIG5vZGVfbW9kdWxlcy8uYmluL1xuICBjb25zdCBsZXhCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICBpZihleGlzdHNTeW5jKGxleEJpblBhdGgpKSB7XG4gICAgcmV0dXJuIGxleEJpblBhdGg7XG4gIH1cblxuICAvLyAyLiBDaGVjayBMZXgncyBub2RlX21vZHVsZXMvPHBhY2thZ2U+L2Jpbi8gKGlmIHBhY2thZ2VOYW1lIHByb3ZpZGVkKVxuICBpZihwYWNrYWdlTmFtZSkge1xuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5QYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQYWNrYWdlQmluUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluUGF0aDtcbiAgICB9XG5cbiAgICAvLyBBbHNvIGNoZWNrIGZvciAuanMgZXh0ZW5zaW9uXG4gICAgY29uc3QgbGV4UGFja2FnZUJpbkpzUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgYG5vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfS9iaW4vJHtiaW5hcnlOYW1lfS5qc2ApO1xuICAgIGlmKGV4aXN0c1N5bmMobGV4UGFja2FnZUJpbkpzUGF0aCkpIHtcbiAgICAgIHJldHVybiBsZXhQYWNrYWdlQmluSnNQYXRoO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciAuY2pzIGV4dGVuc2lvblxuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5DanNQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCBgbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9L2Jpbi8ke2JpbmFyeU5hbWV9LmNqc2ApO1xuICAgIGlmKGV4aXN0c1N5bmMobGV4UGFja2FnZUJpbkNqc1BhdGgpKSB7XG4gICAgICByZXR1cm4gbGV4UGFja2FnZUJpbkNqc1BhdGg7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gV2FsayB1cCBmcm9tIHByb2Nlc3MuY3dkKCkgYW5kIGNoZWNrIG5vZGVfbW9kdWxlcy8uYmluL1xuICBjb25zdCBjaGVja0JpblVwID0gKHN0YXJ0RGlyOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgY2hlY2tEaXIgPSBzdGFydERpcjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBjb25zdCBtb25vcmVwb0JpblBhdGggPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgYG5vZGVfbW9kdWxlcy8uYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICAgIGlmKGV4aXN0c1N5bmMobW9ub3JlcG9CaW5QYXRoKSkge1xuICAgICAgICByZXR1cm4gbW9ub3JlcG9CaW5QYXRoO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aFJlc29sdmUoY2hlY2tEaXIsICcuLicpO1xuICAgICAgaWYocGFyZW50RGlyID09PSBjaGVja0Rpcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNoZWNrRGlyID0gcGFyZW50RGlyO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLy8gM2EuIFdhbGsgdXAgZnJvbSBwcm9jZXNzLmN3ZCgpXG4gIGNvbnN0IGZyb21Dd2QgPSBjaGVja0JpblVwKHByb2Nlc3MuY3dkKCkpO1xuICBpZihmcm9tQ3dkKSB7XG4gICAgcmV0dXJuIGZyb21Dd2Q7XG4gIH1cblxuICAvLyAzYi4gV2FsayB1cCBmcm9tIExleCdzIGRpcmVjdG9yeVxuICBjb25zdCBmcm9tTGV4ID0gY2hlY2tCaW5VcChsZXhEaXIpO1xuICBpZihmcm9tTGV4KSB7XG4gICAgcmV0dXJuIGZyb21MZXg7XG4gIH1cblxuICAvLyBOb3QgZm91bmRcbiAgcmV0dXJuICcnO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFPLGdCQUFnQjtBQUN2QixTQUFRLGtCQUFpQjtBQUN6QixTQUFRLFdBQVcsbUJBQWtCO0FBR3JDLFNBQVEsaUJBQWdCO0FBS2pCLFNBQVMsYUFBcUI7QUFDbkMsTUFBSTtBQUdGLFdBQU8sS0FBSyx3Q0FBd0M7QUFBQSxFQUN0RCxRQUFRO0FBRU4sV0FBTyxR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
package/eslint.config.js CHANGED
@@ -1,5 +1,7 @@
1
- import { typescriptConfig } from 'eslint-config-styleguidejs';
1
+ import {typescriptConfig} from 'eslint-config-styleguidejs';
2
2
 
3
- export default [
4
- ...typescriptConfig
3
+ const config = [
4
+ ...typescriptConfig,
5
5
  ];
6
+
7
+ export default config;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Lex configuration file
3
+ * This file contains configuration options for the Lex CLI tool
4
+ */
5
+
6
+ export default {
7
+ // Source and output paths
8
+ sourcePath: './src',
9
+ outputPath: './dist',
10
+
11
+ // Project settings
12
+ useTypescript: true,
13
+ targetEnvironment: 'web',
14
+ preset: 'web',
15
+
16
+ // AI configuration
17
+ // Use this section to configure AI features for lint --fix and ai commands
18
+ ai: {
19
+ // Available providers: 'cursor', 'copilot', 'openai', 'anthropic', 'none'
20
+ provider: 'cursor',
21
+
22
+ // API key for external providers (recommended to use environment variables)
23
+ // apiKey: process.env.OPENAI_API_KEY,
24
+
25
+ // Model configuration (specific to each provider)
26
+ model: 'cursor-code', // For Cursor IDE
27
+ // model: 'copilot-codex', // For GitHub Copilot
28
+ // model: 'gpt-4o', // For OpenAI
29
+ // model: 'claude-3-sonnet', // For Anthropic
30
+
31
+ // Optional parameters
32
+ maxTokens: 4000,
33
+ temperature: 0.1
34
+ },
35
+
36
+ // Build configuration
37
+ esbuild: {
38
+ entryPoints: ['src/index.ts'],
39
+ outdir: 'dist',
40
+ platform: 'node',
41
+ target: 'es2020',
42
+ format: 'esm'
43
+ },
44
+
45
+ // Test configuration
46
+ jest: {
47
+ roots: ['<rootDir>/src'],
48
+ testEnvironment: 'node'
49
+ }
50
+ };
package/jest.config.cjs CHANGED
@@ -16,28 +16,28 @@ module.exports = {
16
16
  '^boxen$': '<rootDir>/__mocks__/boxen.js',
17
17
  '^chalk$': '<rootDir>/__mocks__/chalk.js',
18
18
  '^ora$': '<rootDir>/__mocks__/ora.js',
19
- // Mock modules that use import.meta.url - use more specific patterns
19
+ // Mock modules that use import.meta.url
20
20
  '.*LexConfig.*': '<rootDir>/__mocks__/LexConfig.js',
21
21
  '.*build\\.js$': '<rootDir>/__mocks__/build.js',
22
22
  '.*versions\\.js$': '<rootDir>/__mocks__/versions.js',
23
- '.*compile\\.js$': '<rootDir>/__mocks__/compile.js'
23
+ '.*compile\\.js$': '<rootDir>/__mocks__/compile.js',
24
+ // Mock file utility to avoid import.meta.url issues
25
+ 'utils/file\\.js$': '<rootDir>/__mocks__/file.js',
26
+ '.*/utils/file\\.js$': '<rootDir>/__mocks__/file.js',
27
+ '^(\\.{1,2}/)*utils/file\\.js$': '<rootDir>/__mocks__/file.js',
28
+
24
29
  },
25
30
  rootDir: './',
26
31
  testMatch: ['<rootDir>/**/*.test.ts*'],
27
32
  transform: {
28
- '^.+\\.ts$|^.+\\.tsx$': ['ts-jest', {
29
- useESM: true,
30
- tsconfig: {
31
- module: 'ESNext',
32
- target: 'ESNext',
33
- allowJs: true
34
- }
35
- }],
36
- '\\.(gql|graphql)$': 'jest-transform-graphql'
33
+ '^.+\\.ts$|^.+\\.tsx$': ['babel-jest', {
34
+ presets: [
35
+ ['@babel/preset-env', {targets: {node: 'current'}}],
36
+ '@babel/preset-typescript'
37
+ ]
38
+ }]
37
39
  },
38
- // Disable coverage temporarily to avoid import.meta issues
39
40
  collectCoverage: false,
40
- // Transform all node_modules to handle ES modules
41
41
  transformIgnorePatterns: [],
42
- setupFilesAfterEnv: ['../../jest.setup.js']
42
+ setupFilesAfterEnv: ['./jest.setup.js']
43
43
  };
package/jest.setup.js CHANGED
@@ -1,5 +1,31 @@
1
- // Temporarily disable jest-dom due to ESM compatibility issues with chalk 5
2
- // require('@testing-library/jest-dom');
3
- // const execaMock = require('@nlabs/execa-mock');
1
+ // jest.mock('execa', () => jest.fn().mockResolvedValue({
2
+ // stdout: '',
3
+ // stderr: '',
4
+ // exitCode: 0,
5
+ // command: 'mocked-command',
6
+ // pid: 123
7
+ // }));
4
8
 
5
- // jest.mock('execa', execaMock);
9
+ jest.mock('ora');
10
+
11
+ try {
12
+ jest.mock('latest-version', () => jest.fn().mockResolvedValue('1.0.0'));
13
+ } catch (error) {
14
+ jest.doMock('latest-version', () => jest.fn().mockResolvedValue('1.0.0'));
15
+ }
16
+
17
+ const originalReadFileSync = require('fs').readFileSync;
18
+ require('fs').readFileSync = jest.fn((path, encoding) => {
19
+ if (path && path.toString().includes('package.json')) {
20
+ return JSON.stringify({
21
+ version: '1.0.0',
22
+ dependencies: {
23
+ esbuild: '^0.19.0',
24
+ jest: '^29.0.0',
25
+ typescript: '^5.0.0',
26
+ webpack: '^5.0.0'
27
+ }
28
+ });
29
+ }
30
+ return originalReadFileSync(path, encoding);
31
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "1.47.2",
3
+ "version": "1.47.3",
4
4
  "description": "Lex",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "scripts": {
39
39
  "build": "NODE_ENV=production && rm -rf dist && esbuild $(find src -name '*.ts' -not -name '*.test.ts' -not -name '*.spec.ts') --platform=node --outdir=./dist --sourcemap=inline --target=node22 --format=esm --packages=external && npm run declarations",
40
40
  "build:all": "npm run build && npm run build:ai",
41
- "build:ai": "NODE_ENV=production && esbuild packages/lex/src/commands/ai/*.ts --platform=node --outdir=./dist/commands/ai --sourcemap=inline --target=node22 --format=esm --packages=external",
41
+ "build:ai": "NODE_ENV=production && esbuild src/commands/ai/*.ts --platform=node --outdir=./dist/commands/ai --sourcemap=inline --target=node22 --format=esm --packages=external",
42
42
  "declarations": "tsc --declaration --emitDeclarationOnly --outDir dist",
43
43
  "clean": "rm -rf dist node_modules package-lock.json *.log coverage",
44
44
  "compile": "tsc -p tsconfig.build.json",
@@ -50,20 +50,33 @@
50
50
  "publish:major": "npm version major && npm publish",
51
51
  "publish:minor": "npm version minor && npm publish",
52
52
  "publish:patch": "npm version patch && npm publish",
53
- "reset": "rm -rf node_modules packages-lock.json",
54
- "test": "NODE_ENV=test && npm run lint && npm run env && jest",
53
+ "test": "NODE_ENV=test && npm run lint && npm run test:unit",
54
+ "test:unit": "NODE_ENV=test npm run env && npx jest",
55
55
  "update": "npm-check-updates -i",
56
56
  "watch": "NODE_ENV=development rm -rf dist && npm run compile -w"
57
57
  },
58
58
  "dependencies": {
59
59
  "@babel/core": "^7.28.0",
60
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
61
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
60
62
  "@babel/preset-env": "^7.28.0",
61
63
  "@babel/preset-typescript": "7.27.1",
62
64
  "@luckycatfactory/esbuild-graphql-loader": "^3.8.1",
63
- "@nlabs/execa-mock": "*",
64
65
  "@nlabs/webpack-plugin-static-site": "*",
66
+ "@storybook/addon-actions": "^9.0.8",
67
+ "@storybook/addon-backgrounds": "^9.0.8",
68
+ "@storybook/addon-controls": "^9.0.8",
69
+ "@storybook/addon-docs": "^9.0.17",
70
+ "@storybook/addon-links": "^9.0.17",
71
+ "@storybook/addon-themes": "^9.0.17",
72
+ "@storybook/addon-viewport": "^9.0.8",
73
+ "@storybook/cli": "^9.0.17",
74
+ "@storybook/react": "^9.0.17",
75
+ "@storybook/react-webpack5": "^9.0.17",
65
76
  "@tailwindcss/postcss": "4.1.11",
66
77
  "@testing-library/jest-dom": "^6.6.3",
78
+ "@typescript-eslint/eslint-plugin": "^8.37.0",
79
+ "@typescript-eslint/parser": "^8.37.0",
67
80
  "acorn": "^8.15.0",
68
81
  "ajv": "^8.17.1",
69
82
  "assert": "^2.1.0",
@@ -82,15 +95,13 @@
82
95
  "core-js": "^3.44.0",
83
96
  "crypto-browserify": "^3.12.1",
84
97
  "css-loader": "^7.1.2",
85
- "cssnano": "^7.0.7",
98
+ "cssnano": "^7.1.0",
86
99
  "dotenv-webpack": "^8.1.1",
87
100
  "download-npm-package": "^3.1.12",
88
101
  "esbuild": "0.25.6",
89
102
  "esbuild-loader": "4.3.0",
90
- "eslint": "9.30.1",
91
- "@typescript-eslint/eslint-plugin": "^8.36.0",
92
- "@typescript-eslint/parser": "^8.36.0",
93
- "eslint-config-styleguidejs": "^4.0.16",
103
+ "eslint": "^9.31.0",
104
+ "eslint-config-styleguidejs": "^4.0.22",
94
105
  "execa": "9.6.0",
95
106
  "exports-loader": "^5.0.0",
96
107
  "favicons-webpack-plugin": "^6.0.1",
@@ -103,18 +114,19 @@
103
114
  "html-webpack-plugin": "^5.6.3",
104
115
  "https-browserify": "^1.0.0",
105
116
  "imports-loader": "^5.0.0",
106
- "jest": "30.0.4",
107
- "jest-circus": "30.0.4",
108
- "jest-cli": "30.0.4",
109
- "jest-environment-jsdom": "30.0.4",
117
+ "jest": "^29.7.0",
118
+ "jest-circus": "^29.7.0",
119
+ "jest-cli": "^29.7.0",
120
+ "jest-environment-jsdom": "^29.7.0",
110
121
  "jest-transform-graphql": "2.1.0",
122
+ "jest-util": "^29.7.0",
111
123
  "json-d-ts": "1.0.1",
112
124
  "latest-version": "9.0.0",
113
125
  "lodash": "^4.17.21",
114
- "luxon": "^3.6.1",
126
+ "luxon": "^3.7.1",
115
127
  "net": "^1.0.2",
116
128
  "npm-check-updates": "^18.0.1",
117
- "openai": "^5.8.3",
129
+ "openai": "^5.9.2",
118
130
  "ora": "8.2.0",
119
131
  "os-browserify": "^0.3.0",
120
132
  "path-browserify": "^1.0.1",
@@ -130,7 +142,7 @@
130
142
  "postcss-percentage": "^0.0.0",
131
143
  "postcss-preset-env": "^10.2.4",
132
144
  "postcss-simple-vars": "^7.0.1",
133
- "postcss-svgo": "7.0.2",
145
+ "postcss-svgo": "7.1.0",
134
146
  "postcss-url": "10.1.3",
135
147
  "process": "^0.11.10",
136
148
  "react": "^19.1.0",
@@ -143,13 +155,14 @@
143
155
  "source-map-support": "^0.5.21",
144
156
  "speed-measure-webpack-plugin": "^1.5.0",
145
157
  "static-site-generator-webpack-plugin": "^3.4.2",
158
+ "storybook": "^9.0.17",
146
159
  "stream-browserify": "^3.0.0",
147
160
  "stream-http": "^3.2.0",
148
161
  "style-loader": "^4.0.0",
149
162
  "svg-spritemap-webpack-plugin": "^4.7.0",
150
163
  "svgo": "4.0.0",
151
164
  "tls": "^0.0.1",
152
- "ts-jest": "29.4.0",
165
+ "ts-jest": "^29.4.0",
153
166
  "ts-node": "^10.9.2",
154
167
  "tsconfig-paths-webpack-plugin": "^4.2.0",
155
168
  "typescript": "5.8.3",
@@ -157,7 +170,7 @@
157
170
  "url-loader": "^4.1.1",
158
171
  "util": "^0.12.5",
159
172
  "vm-browserify": "^1.1.2",
160
- "webpack": "5.99.9",
173
+ "webpack": "5.100.2",
161
174
  "webpack-bundle-analyzer": "^4.10.2",
162
175
  "webpack-cli": "^6.0.1",
163
176
  "webpack-merge": "^6.0.1",
@@ -167,15 +180,19 @@
167
180
  "devDependencies": {
168
181
  "@babel/plugin-transform-runtime": "^7.28.0",
169
182
  "@babel/preset-react": "^7.27.1",
170
- "@nlabs/execa-mock": "^1.41.0",
171
183
  "@types/jest": "^30.0.0",
172
184
  "@types/luxon": "^3.6.2",
173
- "@types/node": "^24.0.10",
185
+ "@types/node": "^24.0.14",
174
186
  "@types/ora": "^3.2.0",
175
187
  "@types/react": "^19.1.8",
176
188
  "@types/webpack": "^5.28.5",
177
- "babel-plugin-transform-import-meta": "^2.3.3",
178
- "babel-plugin-transform-vite-meta-env": "^1.0.3"
189
+ "babel-loader": "^10.0.0",
190
+ "babel-plugin-transform-import-meta": "^2.3.3"
191
+ },
192
+ "peerDependencies": {
193
+ "@storybook/react": "^9.0.17",
194
+ "@storybook/react-webpack5": "^9.0.17",
195
+ "storybook": "^9.0.17"
179
196
  },
180
197
  "gitHead": "0f5fb22fc0f0ab1abab5adf62afed24c7c87e4a8"
181
198
  }
@@ -1,15 +1,48 @@
1
1
  {
2
- "extends": "../../tsconfig.json",
2
+ "extends": "./tsconfig.json",
3
3
  "compilerOptions": {
4
- "moduleResolution": "node16",
4
+ "allowJs": true,
5
+ "allowSyntheticDefaultImports": true,
6
+ "baseUrl": "./src",
7
+ "declaration": true,
8
+ "emitDeclarationOnly": false,
9
+ "esModuleInterop": true,
10
+ "experimentalDecorators": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "inlineSourceMap": true,
13
+ "isolatedModules": true,
14
+ "jsx": "react",
15
+ "lib": [
16
+ "ESNext",
17
+ "DOM"
18
+ ],
19
+ "module": "NodeNext",
20
+ "moduleResolution": "NodeNext",
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noImplicitReturns": true,
23
+ "noImplicitThis": true,
24
+ "noUnusedLocals": false,
5
25
  "outDir": "./dist",
6
- "rootDir": "./src"
26
+ "pretty": true,
27
+ "removeComments": true,
28
+ "resolveJsonModule": true,
29
+ "skipLibCheck": true,
30
+ "strict": true,
31
+ "target": "ESNext",
32
+ "types": [
33
+ "node"
34
+ ]
7
35
  },
8
36
  "include": [
9
37
  "src/**/*"
10
38
  ],
11
39
  "exclude": [
12
- "**/*.test.ts",
13
- "**/*.spec.ts"
40
+ "**/*.test.*",
41
+ "**/*.spec.*",
42
+ "**/*.integration.*",
43
+ "**/__tests__/**",
44
+ "**/__mocks__/**",
45
+ "dist",
46
+ "node_modules"
14
47
  ]
15
48
  }
package/tsconfig.json CHANGED
@@ -1,10 +1,37 @@
1
1
  {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "allowSyntheticDefaultImports": true,
5
+ "declaration": true,
6
+ "emitDeclarationOnly": true,
7
+ "esModuleInterop": true,
8
+ "inlineSourceMap": true,
9
+ "isolatedModules": true,
10
+ "jsx": "react",
11
+ "lib": [
12
+ "dom",
13
+ "ESNext"
14
+ ],
15
+ "module": "NodeNext",
16
+ "moduleResolution": "NodeNext",
17
+ "noFallthroughCasesInSwitch": true,
18
+ "noImplicitReturns": true,
19
+ "noImplicitThis": true,
20
+ "noUnusedLocals": false,
21
+ "pretty": true,
22
+ "resolveJsonModule": true,
23
+ "skipLibCheck": true,
24
+ "target": "ESNext",
25
+ "types": [
26
+ "jest",
27
+ "node"
28
+ ]
29
+ },
2
30
  "exclude": [
3
31
  "./.vscode",
4
32
  "./dist",
5
33
  "./node_modules"
6
34
  ],
7
- "extends": "../../tsconfig.base.json",
8
35
  "include": [
9
36
  "./src",
10
37
  "./jest.setup.ts"
@@ -0,0 +1,44 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "allowJs": true,
5
+ "allowSyntheticDefaultImports": true,
6
+ "baseUrl": "./src",
7
+ "declaration": false,
8
+ "emitDeclarationOnly": false,
9
+ "esModuleInterop": true,
10
+ "experimentalDecorators": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "inlineSourceMap": false,
13
+ "isolatedModules": true,
14
+ "jsx": "react",
15
+ "lib": [
16
+ "ESNext",
17
+ "DOM"
18
+ ],
19
+ "module": "NodeNext",
20
+ "moduleResolution": "NodeNext",
21
+ "noEmit": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noImplicitReturns": true,
24
+ "noImplicitThis": true,
25
+ "noUnusedLocals": true,
26
+ "pretty": false,
27
+ "removeComments": false,
28
+ "resolveJsonModule": true,
29
+ "skipLibCheck": true,
30
+ "strict": true,
31
+ "target": "ESNext",
32
+ "types": [
33
+ "node",
34
+ "jest"
35
+ ]
36
+ },
37
+ "include": [
38
+ "src/**/*"
39
+ ],
40
+ "exclude": [
41
+ "dist",
42
+ "node_modules"
43
+ ]
44
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "allowSyntheticDefaultImports": true,
5
+ "baseUrl": "./src",
6
+ "declaration": false,
7
+ "emitDeclarationOnly": false,
8
+ "esModuleInterop": true,
9
+ "experimentalDecorators": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "inlineSourceMap": true,
12
+ "isolatedModules": true,
13
+ "jsx": "react",
14
+ "lib": [
15
+ "ESNext",
16
+ "DOM"
17
+ ],
18
+ "module": "NodeNext",
19
+ "moduleResolution": "NodeNext",
20
+ "noEmit": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noImplicitReturns": true,
23
+ "noImplicitThis": true,
24
+ "noUnusedLocals": false,
25
+ "pretty": true,
26
+ "removeComments": false,
27
+ "resolveJsonModule": true,
28
+ "skipLibCheck": true,
29
+ "strict": false,
30
+ "target": "ESNext",
31
+ "types": [
32
+ "jest",
33
+ "node"
34
+ ]
35
+ },
36
+ "include": [
37
+ "src/**/*",
38
+ "**/*.test.*",
39
+ "**/*.spec.*",
40
+ "**/*.integration.*",
41
+ "**/__tests__/*",
42
+ "jest.setup.ts"
43
+ ],
44
+ "exclude": [
45
+ "dist",
46
+ "node_modules"
47
+ ]
48
+ }