@cbnventures/nova 0.12.0 → 0.13.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 (183) hide show
  1. package/build/eslint.config.d.ts +32 -1
  2. package/build/eslint.config.d.ts.map +1 -1
  3. package/build/eslint.config.js +9 -1
  4. package/build/eslint.config.js.map +1 -1
  5. package/build/package.json +63 -59
  6. package/build/src/api/node-releases.d.ts +7 -0
  7. package/build/src/api/node-releases.d.ts.map +1 -0
  8. package/build/src/api/node-releases.js +67 -0
  9. package/build/src/api/node-releases.js.map +1 -0
  10. package/build/src/api/spdx-licenses.d.ts +7 -0
  11. package/build/src/api/spdx-licenses.d.ts.map +1 -0
  12. package/build/src/api/spdx-licenses.js +43 -0
  13. package/build/src/api/spdx-licenses.js.map +1 -0
  14. package/build/src/cli/index.js +60 -18
  15. package/build/src/cli/index.js.map +1 -1
  16. package/build/src/cli/recipe/pin-versions.d.ts +7 -0
  17. package/build/src/cli/recipe/pin-versions.d.ts.map +1 -0
  18. package/build/src/cli/recipe/pin-versions.js +145 -0
  19. package/build/src/cli/recipe/pin-versions.js.map +1 -0
  20. package/build/src/cli/recipe/sync-lts-engines.d.ts +6 -0
  21. package/build/src/cli/recipe/sync-lts-engines.d.ts.map +1 -0
  22. package/build/src/cli/recipe/sync-lts-engines.js +118 -0
  23. package/build/src/cli/recipe/sync-lts-engines.js.map +1 -0
  24. package/build/src/cli/recipe/sync-packages.d.ts +18 -0
  25. package/build/src/cli/recipe/sync-packages.d.ts.map +1 -0
  26. package/build/src/cli/recipe/sync-packages.js +1212 -0
  27. package/build/src/cli/recipe/sync-packages.js.map +1 -0
  28. package/build/src/cli/utility/changelog.d.ts +11 -0
  29. package/build/src/cli/utility/changelog.d.ts.map +1 -0
  30. package/build/src/cli/utility/changelog.js +670 -0
  31. package/build/src/cli/utility/changelog.js.map +1 -0
  32. package/build/src/cli/utility/initialize.d.ts +9 -5
  33. package/build/src/cli/utility/initialize.d.ts.map +1 -1
  34. package/build/src/cli/utility/initialize.js +478 -210
  35. package/build/src/cli/utility/initialize.js.map +1 -1
  36. package/build/src/cli/utility/type-check.d.ts +9 -0
  37. package/build/src/cli/utility/type-check.d.ts.map +1 -0
  38. package/build/src/cli/utility/type-check.js +59 -0
  39. package/build/src/cli/utility/type-check.js.map +1 -0
  40. package/build/src/cli/utility/version.d.ts +2 -2
  41. package/build/src/cli/utility/version.d.ts.map +1 -1
  42. package/build/src/cli/utility/version.js +107 -68
  43. package/build/src/cli/utility/version.js.map +1 -1
  44. package/build/src/lib/item.d.ts +23 -5
  45. package/build/src/lib/item.d.ts.map +1 -1
  46. package/build/src/lib/item.js +329 -4
  47. package/build/src/lib/item.js.map +1 -1
  48. package/build/src/lib/nova-config.d.ts +4 -4
  49. package/build/src/lib/nova-config.d.ts.map +1 -1
  50. package/build/src/lib/nova-config.js +76 -88
  51. package/build/src/lib/nova-config.js.map +1 -1
  52. package/build/src/lib/regex.d.ts +9 -1
  53. package/build/src/lib/regex.d.ts.map +1 -1
  54. package/build/src/lib/regex.js +9 -1
  55. package/build/src/lib/regex.js.map +1 -1
  56. package/build/src/lib/schema.d.ts +18 -0
  57. package/build/src/lib/schema.d.ts.map +1 -0
  58. package/build/src/lib/schema.js +13 -0
  59. package/build/src/lib/schema.js.map +1 -0
  60. package/build/src/lib/utility.d.ts +9 -1
  61. package/build/src/lib/utility.d.ts.map +1 -1
  62. package/build/src/lib/utility.js +219 -40
  63. package/build/src/lib/utility.js.map +1 -1
  64. package/build/src/presets/eslint/dx-code-style.d.mts.map +1 -1
  65. package/build/src/presets/eslint/dx-code-style.mjs +0 -20
  66. package/build/src/presets/eslint/dx-code-style.mjs.map +1 -1
  67. package/build/src/presets/eslint/lang-mdx.d.mts.map +1 -1
  68. package/build/src/presets/eslint/lang-mdx.mjs +0 -21
  69. package/build/src/presets/eslint/lang-mdx.mjs.map +1 -1
  70. package/build/src/presets/tsconfig/dx-strict.json +2 -1
  71. package/build/src/rules/eslint/index.d.ts +4 -0
  72. package/build/src/rules/eslint/index.d.ts.map +1 -1
  73. package/build/src/rules/eslint/index.js +4 -0
  74. package/build/src/rules/eslint/index.js.map +1 -1
  75. package/build/src/rules/eslint/no-logger-dev.d.ts +3 -1
  76. package/build/src/rules/eslint/no-logger-dev.d.ts.map +1 -1
  77. package/build/src/rules/eslint/no-logger-dev.js +4 -4
  78. package/build/src/rules/eslint/no-logger-dev.js.map +1 -1
  79. package/build/src/rules/eslint/no-raw-text-in-code.d.ts +6 -0
  80. package/build/src/rules/eslint/no-raw-text-in-code.d.ts.map +1 -0
  81. package/build/src/rules/eslint/no-raw-text-in-code.js +34 -0
  82. package/build/src/rules/eslint/no-raw-text-in-code.js.map +1 -0
  83. package/build/src/rules/eslint/no-regex-literal-flags.d.ts +6 -0
  84. package/build/src/rules/eslint/no-regex-literal-flags.d.ts.map +1 -0
  85. package/build/src/rules/eslint/no-regex-literal-flags.js +30 -0
  86. package/build/src/rules/eslint/no-regex-literal-flags.js.map +1 -0
  87. package/build/src/rules/eslint/no-regex-literals.d.ts +9 -0
  88. package/build/src/rules/eslint/no-regex-literals.d.ts.map +1 -0
  89. package/build/src/rules/eslint/no-regex-literals.js +55 -0
  90. package/build/src/rules/eslint/no-regex-literals.js.map +1 -0
  91. package/build/src/rules/eslint/switch-case-blocks.d.ts +6 -0
  92. package/build/src/rules/eslint/switch-case-blocks.d.ts.map +1 -0
  93. package/build/src/rules/eslint/switch-case-blocks.js +36 -0
  94. package/build/src/rules/eslint/switch-case-blocks.js.map +1 -0
  95. package/build/src/tests/api/node-releases.test.d.ts +2 -0
  96. package/build/src/tests/api/node-releases.test.d.ts.map +1 -0
  97. package/build/src/tests/api/node-releases.test.js +193 -0
  98. package/build/src/tests/api/node-releases.test.js.map +1 -0
  99. package/build/src/tests/api/spdx-licenses.test.d.ts +2 -0
  100. package/build/src/tests/api/spdx-licenses.test.d.ts.map +1 -0
  101. package/build/src/tests/api/spdx-licenses.test.js +91 -0
  102. package/build/src/tests/api/spdx-licenses.test.js.map +1 -0
  103. package/build/src/tests/cli/recipe/pin-versions.test.d.ts +2 -0
  104. package/build/src/tests/cli/recipe/pin-versions.test.d.ts.map +1 -0
  105. package/build/src/tests/cli/recipe/pin-versions.test.js +197 -0
  106. package/build/src/tests/cli/recipe/pin-versions.test.js.map +1 -0
  107. package/build/src/tests/cli/recipe/sync-lts-engines.test.d.ts +2 -0
  108. package/build/src/tests/cli/recipe/sync-lts-engines.test.d.ts.map +1 -0
  109. package/build/src/tests/cli/recipe/sync-lts-engines.test.js +131 -0
  110. package/build/src/tests/cli/recipe/sync-lts-engines.test.js.map +1 -0
  111. package/build/src/tests/lib/item.test.d.ts +2 -0
  112. package/build/src/tests/lib/item.test.d.ts.map +1 -0
  113. package/build/src/tests/lib/item.test.js +142 -0
  114. package/build/src/tests/lib/item.test.js.map +1 -0
  115. package/build/src/tests/lib/nova-config.test.d.ts +2 -0
  116. package/build/src/tests/lib/nova-config.test.d.ts.map +1 -0
  117. package/build/src/tests/lib/nova-config.test.js +489 -0
  118. package/build/src/tests/lib/nova-config.test.js.map +1 -0
  119. package/build/src/tests/lib/regex.test.d.ts +2 -0
  120. package/build/src/tests/lib/regex.test.d.ts.map +1 -0
  121. package/build/src/tests/lib/regex.test.js +342 -0
  122. package/build/src/tests/lib/regex.test.js.map +1 -0
  123. package/build/src/tests/lib/schema.test.d.ts +2 -0
  124. package/build/src/tests/lib/schema.test.d.ts.map +1 -0
  125. package/build/src/tests/lib/schema.test.js +260 -0
  126. package/build/src/tests/lib/schema.test.js.map +1 -0
  127. package/build/src/tests/lib/utility.test.js +704 -44
  128. package/build/src/tests/lib/utility.test.js.map +1 -1
  129. package/build/src/tests/rules/eslint/no-logger-dev.test.d.ts +2 -0
  130. package/build/src/tests/rules/eslint/no-logger-dev.test.d.ts.map +1 -0
  131. package/build/src/tests/rules/eslint/no-logger-dev.test.js +55 -0
  132. package/build/src/tests/rules/eslint/no-logger-dev.test.js.map +1 -0
  133. package/build/src/tests/rules/eslint/no-raw-text-in-code.test.d.ts +2 -0
  134. package/build/src/tests/rules/eslint/no-raw-text-in-code.test.d.ts.map +1 -0
  135. package/build/src/tests/rules/eslint/no-raw-text-in-code.test.js +47 -0
  136. package/build/src/tests/rules/eslint/no-raw-text-in-code.test.js.map +1 -0
  137. package/build/src/tests/rules/eslint/no-regex-literal-flags.test.d.ts +2 -0
  138. package/build/src/tests/rules/eslint/no-regex-literal-flags.test.d.ts.map +1 -0
  139. package/build/src/tests/rules/eslint/no-regex-literal-flags.test.js +47 -0
  140. package/build/src/tests/rules/eslint/no-regex-literal-flags.test.js.map +1 -0
  141. package/build/src/tests/rules/eslint/no-regex-literals.test.d.ts +2 -0
  142. package/build/src/tests/rules/eslint/no-regex-literals.test.d.ts.map +1 -0
  143. package/build/src/tests/rules/eslint/no-regex-literals.test.js +49 -0
  144. package/build/src/tests/rules/eslint/no-regex-literals.test.js.map +1 -0
  145. package/build/src/tests/rules/eslint/switch-case-blocks.test.d.ts +2 -0
  146. package/build/src/tests/rules/eslint/switch-case-blocks.test.d.ts.map +1 -0
  147. package/build/src/tests/rules/eslint/switch-case-blocks.test.js +43 -0
  148. package/build/src/tests/rules/eslint/switch-case-blocks.test.js.map +1 -0
  149. package/build/src/tests/toolkit/cli-header.test.d.ts +2 -0
  150. package/build/src/tests/toolkit/cli-header.test.d.ts.map +1 -0
  151. package/build/src/tests/toolkit/cli-header.test.js +143 -0
  152. package/build/src/tests/toolkit/cli-header.test.js.map +1 -0
  153. package/build/src/tests/toolkit/logger.test.d.ts +2 -0
  154. package/build/src/tests/toolkit/logger.test.d.ts.map +1 -0
  155. package/build/src/tests/toolkit/logger.test.js +96 -0
  156. package/build/src/tests/toolkit/logger.test.js.map +1 -0
  157. package/build/src/tests/toolkit/markdown-table.test.d.ts +2 -0
  158. package/build/src/tests/toolkit/markdown-table.test.d.ts.map +1 -0
  159. package/build/src/tests/toolkit/markdown-table.test.js +138 -0
  160. package/build/src/tests/toolkit/markdown-table.test.js.map +1 -0
  161. package/build/src/toolkit/cli-header.d.ts +1 -0
  162. package/build/src/toolkit/cli-header.d.ts.map +1 -1
  163. package/build/src/toolkit/cli-header.js +24 -13
  164. package/build/src/toolkit/cli-header.js.map +1 -1
  165. package/build/src/toolkit/index.d.ts +1 -1
  166. package/build/src/toolkit/index.d.ts.map +1 -1
  167. package/build/src/toolkit/index.js +1 -1
  168. package/build/src/toolkit/index.js.map +1 -1
  169. package/build/src/toolkit/logger.d.ts.map +1 -1
  170. package/build/src/toolkit/logger.js +25 -10
  171. package/build/src/toolkit/logger.js.map +1 -1
  172. package/build/src/toolkit/markdown-table.d.ts.map +1 -1
  173. package/build/src/toolkit/markdown-table.js +3 -3
  174. package/build/src/toolkit/markdown-table.js.map +1 -1
  175. package/package.json +63 -59
  176. package/build/src/cli/recipe/sync-metadata.d.ts +0 -5
  177. package/build/src/cli/recipe/sync-metadata.d.ts.map +0 -1
  178. package/build/src/cli/recipe/sync-metadata.js +0 -7
  179. package/build/src/cli/recipe/sync-metadata.js.map +0 -1
  180. package/build/src/cli/recipe/sync-versions.d.ts +0 -5
  181. package/build/src/cli/recipe/sync-versions.d.ts.map +0 -1
  182. package/build/src/cli/recipe/sync-versions.js +0 -7
  183. package/build/src/cli/recipe/sync-versions.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ const noRawTextInCode = ESLintUtils.RuleCreator(() => '#')({
3
+ name: 'no-raw-text-in-code',
4
+ meta: {
5
+ type: 'problem',
6
+ docs: {
7
+ description: 'Disallow unwrapped text inside <code> JSX elements. Wrap text in a {} expression to prevent MDX parsing issues.',
8
+ },
9
+ messages: {
10
+ noRawText: 'Do not put unwrapped text inside the <code> element. Wrap the text in a {} expression (e.g., <code>{\'Array<string>\'}</code>) to prevent MDX from parsing special characters as JSX.',
11
+ },
12
+ schema: [],
13
+ },
14
+ defaultOptions: [],
15
+ create(context) {
16
+ const checkJSXText = (node) => {
17
+ const { parent } = node;
18
+ if (parent !== undefined
19
+ && parent.type === 'JSXElement'
20
+ && parent.openingElement.name.type === 'JSXIdentifier'
21
+ && parent.openingElement.name.name === 'code') {
22
+ context.report({
23
+ node,
24
+ messageId: 'noRawText',
25
+ });
26
+ }
27
+ };
28
+ return {
29
+ JSXText: checkJSXText,
30
+ };
31
+ },
32
+ });
33
+ export default noRawTextInCode;
34
+ //# sourceMappingURL=no-raw-text-in-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-raw-text-in-code.js","sourceRoot":"","sources":["../../../../src/rules/eslint/no-raw-text-in-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AASvD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,iHAAiH;SAC/H;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,uLAAuL;SACnM;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QAUZ,MAAM,YAAY,GAAG,CAAC,IAAqC,EAAsC,EAAE;YACjG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAExB,IACE,MAAM,KAAK,SAAS;mBACjB,MAAM,CAAC,IAAI,KAAK,YAAY;mBAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;mBACnD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAC7C,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ declare const noRegexLiteralFlags: ESLintUtils.RuleModule<"noRegexFlags", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ export default noRegexLiteralFlags;
6
+ //# sourceMappingURL=no-regex-literal-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-regex-literal-flags.d.ts","sourceRoot":"","sources":["../../../../src/rules/eslint/no-regex-literal-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AASvD,QAAA,MAAM,mBAAmB;;CAoCvB,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ const noRegexLiteralFlags = ESLintUtils.RuleCreator(() => '#')({
3
+ name: 'no-regex-literal-flags',
4
+ meta: {
5
+ type: 'suggestion',
6
+ docs: {
7
+ description: 'Disallow flags on regex literals. Add flags at the call site via new RegExp(pattern, flags) instead.',
8
+ },
9
+ messages: {
10
+ noRegexFlags: 'Do not use flags on regex literals. Add flags at the call site via new RegExp(pattern, flags) instead.',
11
+ },
12
+ schema: [],
13
+ },
14
+ defaultOptions: [],
15
+ create(context) {
16
+ const checkLiteral = (node) => {
17
+ if ('regex' in node && node.regex !== undefined && node.regex.flags.length > 0) {
18
+ context.report({
19
+ node,
20
+ messageId: 'noRegexFlags',
21
+ });
22
+ }
23
+ };
24
+ return {
25
+ Literal: checkLiteral,
26
+ };
27
+ },
28
+ });
29
+ export default noRegexLiteralFlags;
30
+ //# sourceMappingURL=no-regex-literal-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-regex-literal-flags.js","sourceRoot":"","sources":["../../../../src/rules/eslint/no-regex-literal-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AASvD,MAAM,mBAAmB,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,sGAAsG;SACpH;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,wGAAwG;SACvH;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QAUZ,MAAM,YAAY,GAAG,CAAC,IAAyC,EAA0C,EAAE;YACzG,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/E,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ import type { NoRegexLiteralsDefaultOptionsAllowedFiles } from '@/types/rules/eslint/no-regex-literals.d.ts';
3
+ declare const noRegexLiterals: ESLintUtils.RuleModule<"noRegexLiteral", [{
4
+ allowedFiles: NoRegexLiteralsDefaultOptionsAllowedFiles;
5
+ }], unknown, ESLintUtils.RuleListener> & {
6
+ name: string;
7
+ };
8
+ export default noRegexLiterals;
9
+ //# sourceMappingURL=no-regex-literals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-regex-literals.d.ts","sourceRoot":"","sources":["../../../../src/rules/eslint/no-regex-literals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAGV,yCAAyC,EAC1C,MAAM,6CAA6C,CAAC;AAOrD,QAAA,MAAM,eAAe;kBA0BG,yCAAyC;;;CAwC/D,CAAC;AAEH,eAAe,eAAe,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ const noRegexLiterals = ESLintUtils.RuleCreator(() => '#')({
3
+ name: 'no-regex-literals',
4
+ meta: {
5
+ type: 'suggestion',
6
+ docs: {
7
+ description: 'Disallow regex literal expressions. Centralize patterns in a shared patterns file instead.',
8
+ },
9
+ messages: {
10
+ noRegexLiteral: 'Do not use regex literals inline. Centralize patterns in a shared patterns file and import from there.',
11
+ },
12
+ schema: [
13
+ {
14
+ type: 'object',
15
+ properties: {
16
+ allowedFiles: {
17
+ type: 'array',
18
+ items: {
19
+ type: 'string',
20
+ },
21
+ },
22
+ },
23
+ additionalProperties: false,
24
+ },
25
+ ],
26
+ },
27
+ defaultOptions: [{
28
+ allowedFiles: [],
29
+ }],
30
+ create(context, [options]) {
31
+ const allowedFiles = options.allowedFiles;
32
+ const normalizedFilename = context.filename.replaceAll('\\', '/');
33
+ const isAllowed = allowedFiles.some((pattern) => {
34
+ const normalizedPattern = pattern.replaceAll('\\', '/');
35
+ return normalizedFilename === normalizedPattern
36
+ || normalizedFilename.endsWith(`/${normalizedPattern}`);
37
+ });
38
+ if (isAllowed === true) {
39
+ return {};
40
+ }
41
+ const checkLiteral = (node) => {
42
+ if ('regex' in node && node.regex !== undefined) {
43
+ context.report({
44
+ node,
45
+ messageId: 'noRegexLiteral',
46
+ });
47
+ }
48
+ };
49
+ return {
50
+ Literal: checkLiteral,
51
+ };
52
+ },
53
+ });
54
+ export default noRegexLiterals;
55
+ //# sourceMappingURL=no-regex-literals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-regex-literals.js","sourceRoot":"","sources":["../../../../src/rules/eslint/no-regex-literals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAavD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,4FAA4F;SAC1G;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,wGAAwG;SACzH;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,YAAY,EAAE;wBACZ,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;yBACf;qBACF;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE,CAAC;YACf,YAAY,EAAE,EAA+C;SAC9D,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAGlE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAExD,OAAO,kBAAkB,KAAK,iBAAiB;mBAC1C,kBAAkB,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAWD,MAAM,YAAY,GAAG,CAAC,IAAqC,EAAsC,EAAE;YACjG,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,gBAAgB;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ declare const switchCaseBlocks: ESLintUtils.RuleModule<"requireBlock", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ export default switchCaseBlocks;
6
+ //# sourceMappingURL=switch-case-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch-case-blocks.d.ts","sourceRoot":"","sources":["../../../../src/rules/eslint/switch-case-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AASvD,QAAA,MAAM,gBAAgB;;CAgDpB,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ const switchCaseBlocks = ESLintUtils.RuleCreator(() => '#')({
3
+ name: 'switch-case-blocks',
4
+ meta: {
5
+ type: 'layout',
6
+ docs: {
7
+ description: 'Require each switch case to wrap its statements in a block (e.g., "case x: { ... }").',
8
+ },
9
+ messages: {
10
+ requireBlock: 'Wrap this switch case body in a block.',
11
+ },
12
+ schema: [],
13
+ },
14
+ defaultOptions: [],
15
+ create(context) {
16
+ const checkCase = (node) => {
17
+ const { consequent } = node;
18
+ if (consequent.length === 0) {
19
+ return;
20
+ }
21
+ const [firstConsequent] = consequent;
22
+ if (consequent.length === 1 && firstConsequent !== undefined && firstConsequent.type === 'BlockStatement') {
23
+ return;
24
+ }
25
+ context.report({
26
+ node,
27
+ messageId: 'requireBlock',
28
+ });
29
+ };
30
+ return {
31
+ SwitchCase: checkCase,
32
+ };
33
+ },
34
+ });
35
+ export default switchCaseBlocks;
36
+ //# sourceMappingURL=switch-case-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch-case-blocks.js","sourceRoot":"","sources":["../../../../src/rules/eslint/switch-case-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AASvD,MAAM,gBAAgB,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,uFAAuF;SACrG;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,wCAAwC;SACvD;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QAUZ,MAAM,SAAS,GAAG,CAAC,IAAmC,EAAoC,EAAE;YAC1F,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;YAG5B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAGD,MAAM,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;YAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC1G,OAAO;YACT,CAAC;YAED,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI;gBACJ,SAAS,EAAE,cAAc;aAC1B,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO;YACL,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node-releases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-releases.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api/node-releases.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,193 @@
1
+ import { strictEqual } from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { NodeReleases } from '../../api/node-releases.js';
4
+ test('NodeReleases.fetchLtsVersions', async (context) => {
5
+ context.afterEach(() => {
6
+ NodeReleases.resetForTesting();
7
+ });
8
+ await context.test('returns constraint string for valid response', async (t) => {
9
+ const today = new Date().toISOString().slice(0, 10);
10
+ t.mock.method(global, 'fetch', () => Promise.resolve({
11
+ ok: true,
12
+ json: () => Promise.resolve({
13
+ v18: {
14
+ lts: '2000-01-01',
15
+ end: '2099-12-31',
16
+ },
17
+ v20: {
18
+ lts: '2000-01-01',
19
+ end: '2099-12-31',
20
+ },
21
+ v22: {
22
+ lts: today,
23
+ end: '2099-12-31',
24
+ },
25
+ }),
26
+ }));
27
+ const result = await NodeReleases.fetchLtsVersions();
28
+ strictEqual(result, '^18 || ^20 || ^22');
29
+ });
30
+ await context.test('caches result after first fetch', async (t) => {
31
+ let callCount = 0;
32
+ t.mock.method(global, 'fetch', () => {
33
+ callCount += 1;
34
+ return Promise.resolve({
35
+ ok: true,
36
+ json: () => Promise.resolve({
37
+ v20: {
38
+ lts: '2000-01-01',
39
+ end: '2099-12-31',
40
+ },
41
+ }),
42
+ });
43
+ });
44
+ const first = await NodeReleases.fetchLtsVersions();
45
+ const second = await NodeReleases.fetchLtsVersions();
46
+ strictEqual(first, '^20');
47
+ strictEqual(second, '^20');
48
+ strictEqual(callCount, 1);
49
+ });
50
+ await context.test('returns undefined on HTTP 404', async (t) => {
51
+ t.mock.method(global, 'fetch', () => Promise.resolve({
52
+ ok: false,
53
+ status: 404,
54
+ }));
55
+ const result = await NodeReleases.fetchLtsVersions();
56
+ strictEqual(result, undefined);
57
+ });
58
+ await context.test('returns undefined on network error', async (t) => {
59
+ t.mock.method(global, 'fetch', () => Promise.reject(new Error('network error')));
60
+ const result = await NodeReleases.fetchLtsVersions();
61
+ strictEqual(result, undefined);
62
+ });
63
+ await context.test('returns undefined on malformed JSON', async (t) => {
64
+ t.mock.method(global, 'fetch', () => Promise.resolve({
65
+ ok: true,
66
+ json: () => Promise.resolve('not an object'),
67
+ }));
68
+ const result = await NodeReleases.fetchLtsVersions();
69
+ strictEqual(result, undefined);
70
+ });
71
+ await context.test('returns undefined when no active LTS versions', async (t) => {
72
+ t.mock.method(global, 'fetch', () => Promise.resolve({
73
+ ok: true,
74
+ json: () => Promise.resolve({
75
+ v16: {
76
+ lts: '2000-01-01',
77
+ end: '2000-01-01',
78
+ },
79
+ v14: {
80
+ lts: '2000-01-01',
81
+ end: '2000-01-01',
82
+ },
83
+ }),
84
+ }));
85
+ const result = await NodeReleases.fetchLtsVersions();
86
+ strictEqual(result, undefined);
87
+ });
88
+ await context.test('skips keys that do not parse to a major version number', async (t) => {
89
+ t.mock.method(global, 'fetch', () => Promise.resolve({
90
+ ok: true,
91
+ json: () => Promise.resolve({
92
+ vNext: {
93
+ lts: '2000-01-01',
94
+ end: '2099-12-31',
95
+ },
96
+ v20: {
97
+ lts: '2000-01-01',
98
+ end: '2099-12-31',
99
+ },
100
+ }),
101
+ }));
102
+ const result = await NodeReleases.fetchLtsVersions();
103
+ strictEqual(result, '^20');
104
+ });
105
+ await context.test('caches undefined result after fetch failure', async (t) => {
106
+ let callCount = 0;
107
+ t.mock.method(global, 'fetch', () => {
108
+ callCount += 1;
109
+ return Promise.resolve({
110
+ ok: false,
111
+ status: 500,
112
+ });
113
+ });
114
+ const first = await NodeReleases.fetchLtsVersions();
115
+ const second = await NodeReleases.fetchLtsVersions();
116
+ strictEqual(first, undefined);
117
+ strictEqual(second, undefined);
118
+ strictEqual(callCount, 1);
119
+ });
120
+ await context.test('excludes entries where LTS has not started yet', async (t) => {
121
+ t.mock.method(global, 'fetch', () => Promise.resolve({
122
+ ok: true,
123
+ json: () => Promise.resolve({
124
+ v20: {
125
+ lts: '2000-01-01',
126
+ end: '2099-12-31',
127
+ },
128
+ v24: {
129
+ lts: '2099-01-01',
130
+ end: '2099-12-31',
131
+ },
132
+ }),
133
+ }));
134
+ const result = await NodeReleases.fetchLtsVersions();
135
+ strictEqual(result, '^20');
136
+ });
137
+ await context.test('excludes entries where end-of-life has passed', async (t) => {
138
+ t.mock.method(global, 'fetch', () => Promise.resolve({
139
+ ok: true,
140
+ json: () => Promise.resolve({
141
+ v16: {
142
+ lts: '2000-01-01',
143
+ end: '2000-01-01',
144
+ },
145
+ v20: {
146
+ lts: '2000-01-01',
147
+ end: '2099-12-31',
148
+ },
149
+ }),
150
+ }));
151
+ const result = await NodeReleases.fetchLtsVersions();
152
+ strictEqual(result, '^20');
153
+ });
154
+ await context.test('filters out non-LTS entries', async (t) => {
155
+ t.mock.method(global, 'fetch', () => Promise.resolve({
156
+ ok: true,
157
+ json: () => Promise.resolve({
158
+ v21: {
159
+ end: '2099-12-31',
160
+ },
161
+ v20: {
162
+ lts: '2000-01-01',
163
+ end: '2099-12-31',
164
+ },
165
+ }),
166
+ }));
167
+ const result = await NodeReleases.fetchLtsVersions();
168
+ strictEqual(result, '^20');
169
+ });
170
+ await context.test('sorts major versions ascending', async (t) => {
171
+ const today = new Date().toISOString().slice(0, 10);
172
+ t.mock.method(global, 'fetch', () => Promise.resolve({
173
+ ok: true,
174
+ json: () => Promise.resolve({
175
+ v22: {
176
+ lts: today,
177
+ end: '2099-12-31',
178
+ },
179
+ v18: {
180
+ lts: '2000-01-01',
181
+ end: '2099-12-31',
182
+ },
183
+ v20: {
184
+ lts: '2000-01-01',
185
+ end: '2099-12-31',
186
+ },
187
+ }),
188
+ }));
189
+ const result = await NodeReleases.fetchLtsVersions();
190
+ strictEqual(result, '^18 || ^20 || ^22');
191
+ });
192
+ });
193
+ //# sourceMappingURL=node-releases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-releases.test.js","sourceRoot":"","sources":["../../../../src/tests/api/node-releases.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spdx-licenses.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spdx-licenses.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api/spdx-licenses.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { ok, strictEqual } from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { SpdxLicenses } from '../../api/spdx-licenses.js';
4
+ test('SpdxLicenses.fetchLicenses', async (context) => {
5
+ context.afterEach(() => {
6
+ SpdxLicenses.resetForTesting();
7
+ });
8
+ await context.test('returns Set of license IDs for valid response', async (t) => {
9
+ t.mock.method(global, 'fetch', () => Promise.resolve({
10
+ ok: true,
11
+ json: () => Promise.resolve({
12
+ licenses: [
13
+ { licenseId: 'MIT' },
14
+ { licenseId: 'Apache-2.0' },
15
+ { licenseId: 'ISC' },
16
+ ],
17
+ }),
18
+ }));
19
+ const result = await SpdxLicenses.fetchLicenses();
20
+ ok(result instanceof Set);
21
+ strictEqual(result.size, 3);
22
+ ok(result.has('MIT'));
23
+ ok(result.has('Apache-2.0'));
24
+ ok(result.has('ISC'));
25
+ });
26
+ await context.test('caches result after first fetch', async (t) => {
27
+ let callCount = 0;
28
+ t.mock.method(global, 'fetch', () => {
29
+ callCount += 1;
30
+ return Promise.resolve({
31
+ ok: true,
32
+ json: () => Promise.resolve({
33
+ licenses: [
34
+ { licenseId: 'MIT' },
35
+ ],
36
+ }),
37
+ });
38
+ });
39
+ await SpdxLicenses.fetchLicenses();
40
+ await SpdxLicenses.fetchLicenses();
41
+ strictEqual(callCount, 1);
42
+ });
43
+ await context.test('caches undefined result after fetch failure', async (t) => {
44
+ let callCount = 0;
45
+ t.mock.method(global, 'fetch', () => {
46
+ callCount += 1;
47
+ return Promise.resolve({
48
+ ok: false,
49
+ status: 500,
50
+ });
51
+ });
52
+ const first = await SpdxLicenses.fetchLicenses();
53
+ const second = await SpdxLicenses.fetchLicenses();
54
+ strictEqual(first, undefined);
55
+ strictEqual(second, undefined);
56
+ strictEqual(callCount, 1);
57
+ });
58
+ await context.test('returns undefined on HTTP 500', async (t) => {
59
+ t.mock.method(global, 'fetch', () => Promise.resolve({
60
+ ok: false,
61
+ status: 500,
62
+ }));
63
+ const result = await SpdxLicenses.fetchLicenses();
64
+ strictEqual(result, undefined);
65
+ });
66
+ await context.test('returns undefined on network error', async (t) => {
67
+ t.mock.method(global, 'fetch', () => Promise.reject(new Error('network error')));
68
+ const result = await SpdxLicenses.fetchLicenses();
69
+ strictEqual(result, undefined);
70
+ });
71
+ await context.test('returns undefined on malformed JSON', async (t) => {
72
+ t.mock.method(global, 'fetch', () => Promise.resolve({
73
+ ok: true,
74
+ json: () => Promise.resolve('not an object'),
75
+ }));
76
+ const result = await SpdxLicenses.fetchLicenses();
77
+ strictEqual(result, undefined);
78
+ });
79
+ await context.test('returns empty Set for empty licenses array', async (t) => {
80
+ t.mock.method(global, 'fetch', () => Promise.resolve({
81
+ ok: true,
82
+ json: () => Promise.resolve({
83
+ licenses: [],
84
+ }),
85
+ }));
86
+ const result = await SpdxLicenses.fetchLicenses();
87
+ ok(result instanceof Set);
88
+ strictEqual(result.size, 0);
89
+ });
90
+ });
91
+ //# sourceMappingURL=spdx-licenses.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spdx-licenses.test.js","sourceRoot":"","sources":["../../../../src/tests/api/spdx-licenses.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pin-versions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-versions.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/cli/recipe/pin-versions.test.ts"],"names":[],"mappings":""}