@futdevpro/dynamo-eslint 1.15.25 → 1.15.28

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 (194) hide show
  1. package/.c8rc.json +26 -26
  2. package/.cursor/rules/__assistant_guide.mdc +30 -30
  3. package/.cursor/rules/__main.mdc +64 -64
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_debug.mdc +7 -7
  7. package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -372
  8. package/.cursor/rules/_ag_file-refactoring.mdc +113 -113
  9. package/.cursor/rules/_ag_fixes_rules.mdc +5 -5
  10. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  11. package/.cursor/rules/_ag_frontend.mdc +39 -39
  12. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  13. package/.cursor/rules/_ag_naming.mdc +115 -115
  14. package/.cursor/rules/_ag_running_commands.mdc +4 -4
  15. package/.cursor/rules/_ag_server-controller.mdc +5 -5
  16. package/.cursor/rules/_ag_should-be.mdc +6 -6
  17. package/.cursor/rules/_ag_swearing.mdc +47 -47
  18. package/.cursor/rules/ai_development_guide.md +60 -60
  19. package/.cursor/rules/ai_directives.md +114 -114
  20. package/.cursor/rules/cursor-rules.md +160 -160
  21. package/.cursor/rules/default-command.mdc +464 -464
  22. package/.cursor/rules/error_code_pattern.md +39 -39
  23. package/.cursor/rules/saved rule mcp server use.md +15 -15
  24. package/.dynamo/pipeline.cicd.config.json +184 -184
  25. package/.dynamo/version-bump.config.json +5 -5
  26. package/.eslintrc.json +4 -4
  27. package/.github/workflows/main.yml +436 -436
  28. package/.husky/pre-commit +2 -2
  29. package/.vscode/settings.json +11 -11
  30. package/README.md +319 -319
  31. package/__documentations/2026-04-18-ccap-review-integration.md +173 -173
  32. package/__documentations/2026-08-18-bfr-ctm-005-eslint9-validator-report.md +45 -0
  33. package/build/configs/base.d.ts +9 -9
  34. package/build/configs/base.js +150 -150
  35. package/build/configs/fsm.d.ts +1 -1
  36. package/build/configs/fsm.js +7 -7
  37. package/build/configs/ngx-package.d.ts +1 -1
  38. package/build/configs/ngx-package.js +7 -7
  39. package/build/configs/ngx.d.ts +4 -4
  40. package/build/configs/ngx.js +91 -91
  41. package/build/configs/nts-package.d.ts +1 -1
  42. package/build/configs/nts-package.js +17 -17
  43. package/build/configs/nts.d.ts +1 -1
  44. package/build/configs/nts.js +31 -31
  45. package/build/index.d.ts +1 -1
  46. package/build/index.js +2 -2
  47. package/build/plugin/index.d.ts +52 -52
  48. package/build/plugin/index.js +80 -80
  49. package/build/plugin/rules/angular/angular-for-track-logic.d.ts +7 -7
  50. package/build/plugin/rules/angular/angular-for-track-logic.js +81 -81
  51. package/build/plugin/rules/angular/effect-signal-loop.d.ts +9 -9
  52. package/build/plugin/rules/angular/effect-signal-loop.js +112 -112
  53. package/build/plugin/rules/angular/no-async-ngoninit.d.ts +8 -8
  54. package/build/plugin/rules/angular/no-async-ngoninit.js +42 -42
  55. package/build/plugin/rules/angular/no-component-direct-api.d.ts +9 -9
  56. package/build/plugin/rules/angular/no-component-direct-api.js +75 -75
  57. package/build/plugin/rules/angular/no-method-call-in-template.d.ts +8 -8
  58. package/build/plugin/rules/angular/no-method-call-in-template.js +79 -79
  59. package/build/plugin/rules/angular/no-ngfor-directive.d.ts +7 -7
  60. package/build/plugin/rules/angular/no-ngfor-directive.js +59 -59
  61. package/build/plugin/rules/angular/no-ngif-directive.d.ts +7 -7
  62. package/build/plugin/rules/angular/no-ngif-directive.js +59 -59
  63. package/build/plugin/rules/explicit-types.d.ts +3 -3
  64. package/build/plugin/rules/explicit-types.js +178 -178
  65. package/build/plugin/rules/import/import-order.d.ts +3 -3
  66. package/build/plugin/rules/import/import-order.js +154 -154
  67. package/build/plugin/rules/import/no-import-type.d.ts +3 -3
  68. package/build/plugin/rules/import/no-import-type.js +45 -45
  69. package/build/plugin/rules/import/no-js-import.d.ts +3 -3
  70. package/build/plugin/rules/import/no-js-import.js +40 -40
  71. package/build/plugin/rules/naming-patterns.d.ts +7 -7
  72. package/build/plugin/rules/naming-patterns.js +366 -366
  73. package/build/plugin/rules/no-getter-logic.d.ts +3 -3
  74. package/build/plugin/rules/no-getter-logic.js +194 -194
  75. package/build/plugin/rules/prefer-enum-over-string-union.d.ts +3 -3
  76. package/build/plugin/rules/prefer-enum-over-string-union.js +289 -289
  77. package/build/plugin/rules/prefer-interface-over-duplicate-types.d.ts +3 -3
  78. package/build/plugin/rules/prefer-interface-over-duplicate-types.js +264 -264
  79. package/build/plugin/rules/require-jsdoc-description.d.ts +3 -3
  80. package/build/plugin/rules/require-jsdoc-description.js +496 -496
  81. package/build/plugin/rules/require-test-description-prefix.d.ts +3 -3
  82. package/build/plugin/rules/require-test-description-prefix.js +135 -135
  83. package/build/plugin/rules/ts/data-model-extends.d.ts +8 -8
  84. package/build/plugin/rules/ts/data-model-extends.js +94 -94
  85. package/build/plugin/rules/ts/no-any-type.d.ts +8 -8
  86. package/build/plugin/rules/ts/no-any-type.js +36 -36
  87. package/build/plugin/rules/ts/no-as-cast.d.ts +8 -8
  88. package/build/plugin/rules/ts/no-as-cast.js +49 -49
  89. package/build/plugin/rules/ts/no-dynamic-imports.d.ts +8 -8
  90. package/build/plugin/rules/ts/no-dynamic-imports.js +50 -50
  91. package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts +8 -8
  92. package/build/plugin/rules/ts/no-native-browser-dialogs.js +78 -78
  93. package/build/plugin/rules/ts/no-plain-function-export.d.ts +9 -9
  94. package/build/plugin/rules/ts/no-plain-function-export.js +69 -69
  95. package/build/plugin/rules/ts/one-export-per-file.d.ts +8 -8
  96. package/build/plugin/rules/ts/one-export-per-file.js +73 -73
  97. package/build/scripts/dynamo-fix.d.ts +26 -26
  98. package/build/scripts/dynamo-fix.js +146 -146
  99. package/build/scripts/eslintrc-audit.d.ts +26 -26
  100. package/build/scripts/eslintrc-audit.js +100 -100
  101. package/build/scripts/fix-return-types.d.ts +74 -74
  102. package/build/scripts/fix-return-types.js +226 -226
  103. package/build/scripts/validate-imports.d.ts +26 -26
  104. package/build/scripts/validate-imports.js +157 -146
  105. package/build/scripts/validate-imports.js.map +1 -1
  106. package/build/scripts/validate-naming.d.ts +26 -26
  107. package/build/scripts/validate-naming.js +157 -131
  108. package/build/scripts/validate-naming.js.map +1 -1
  109. package/eslint.config.js +15 -15
  110. package/package.json +105 -105
  111. package/samples/.vscode/settings.json +13 -13
  112. package/samples/base/.eslintrc.json +6 -6
  113. package/samples/base/eslint.config.js +3 -3
  114. package/samples/fsm/.eslintrc.json +4 -4
  115. package/samples/fsm/eslint.config.js +3 -3
  116. package/samples/ngx/.eslintrc.json +6 -6
  117. package/samples/ngx/eslint.config.js +3 -3
  118. package/samples/ngx-package/.eslintrc.json +4 -4
  119. package/samples/ngx-package/eslint.config.js +3 -3
  120. package/samples/nts/.eslintrc.json +6 -6
  121. package/samples/nts/eslint.config.js +3 -3
  122. package/samples/nts-package/.eslintrc.json +4 -4
  123. package/samples/nts-package/eslint.config.js +3 -3
  124. package/samples/package.json.example +26 -26
  125. package/samples/poc-sample.ts +38 -38
  126. package/samples/poc-violations.ts +54 -54
  127. package/scripts/run-coverage-tests.js +24 -24
  128. package/spec/support/helpers/ts-node-helper.js +9 -9
  129. package/spec/support/jasmine.coverage.json +23 -23
  130. package/spec/support/jasmine.json +24 -24
  131. package/src/configs/base.ts +157 -157
  132. package/src/configs/fsm.ts +10 -10
  133. package/src/configs/ngx-package.ts +10 -10
  134. package/src/configs/ngx.ts +96 -96
  135. package/src/configs/nts-package.ts +20 -20
  136. package/src/configs/nts.ts +34 -34
  137. package/src/index.ts +4 -4
  138. package/src/plugin/index.ts +86 -86
  139. package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -44
  140. package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -88
  141. package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -89
  142. package/src/plugin/rules/angular/effect-signal-loop.ts +125 -125
  143. package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -50
  144. package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -43
  145. package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -78
  146. package/src/plugin/rules/angular/no-component-direct-api.ts +82 -82
  147. package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -63
  148. package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -89
  149. package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -44
  150. package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -62
  151. package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -44
  152. package/src/plugin/rules/angular/no-ngif-directive.ts +62 -62
  153. package/src/plugin/rules/explicit-types.spec.ts +190 -190
  154. package/src/plugin/rules/explicit-types.ts +186 -186
  155. package/src/plugin/rules/import/import-order.spec.ts +219 -219
  156. package/src/plugin/rules/import/import-order.ts +197 -197
  157. package/src/plugin/rules/import/no-import-type.spec.ts +69 -69
  158. package/src/plugin/rules/import/no-import-type.ts +46 -46
  159. package/src/plugin/rules/import/no-js-import.spec.ts +82 -82
  160. package/src/plugin/rules/import/no-js-import.ts +45 -45
  161. package/src/plugin/rules/naming-patterns.spec.ts +189 -189
  162. package/src/plugin/rules/naming-patterns.ts +426 -426
  163. package/src/plugin/rules/no-getter-logic.spec.ts +591 -591
  164. package/src/plugin/rules/no-getter-logic.ts +220 -220
  165. package/src/plugin/rules/prefer-enum-over-string-union.spec.ts +583 -583
  166. package/src/plugin/rules/prefer-enum-over-string-union.ts +333 -333
  167. package/src/plugin/rules/prefer-interface-over-duplicate-types.spec.ts +404 -404
  168. package/src/plugin/rules/prefer-interface-over-duplicate-types.ts +314 -314
  169. package/src/plugin/rules/require-jsdoc-description.spec.ts +779 -779
  170. package/src/plugin/rules/require-jsdoc-description.ts +572 -572
  171. package/src/plugin/rules/require-test-description-prefix.spec.ts +459 -459
  172. package/src/plugin/rules/require-test-description-prefix.ts +154 -154
  173. package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -84
  174. package/src/plugin/rules/ts/data-model-extends.ts +100 -100
  175. package/src/plugin/rules/ts/no-any-type.spec.ts +28 -28
  176. package/src/plugin/rules/ts/no-any-type.ts +36 -36
  177. package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -51
  178. package/src/plugin/rules/ts/no-as-cast.ts +51 -51
  179. package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -54
  180. package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -49
  181. package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -54
  182. package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -84
  183. package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -72
  184. package/src/plugin/rules/ts/no-plain-function-export.ts +73 -73
  185. package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -64
  186. package/src/plugin/rules/ts/one-export-per-file.ts +77 -77
  187. package/src/scripts/dynamo-fix.ts +172 -172
  188. package/src/scripts/eslintrc-audit.ts +116 -116
  189. package/src/scripts/fix-return-types.spec.ts +65 -65
  190. package/src/scripts/fix-return-types.ts +288 -288
  191. package/src/scripts/validate-imports.ts +278 -261
  192. package/src/scripts/validate-naming.ts +204 -187
  193. package/src/scripts/validator-cli.integration.spec.ts +96 -0
  194. package/tsconfig.json +31 -31
@@ -1,116 +1,116 @@
1
- #!/usr/bin/env node
2
- /**
3
- * @fileoverview ESLint Configuration Audit Script
4
- *
5
- * This script analyzes ESLint configuration files (.eslintrc.json) across the project
6
- * to provide statistics on rule usage. It helps identify commonly used rules and
7
- * potential configuration inconsistencies.
8
- *
9
- * @usage
10
- * ```bash
11
- * dynamo-eslintrc-audit
12
- * ```
13
- *
14
- * @example
15
- * ```bash
16
- * # Audit all ESLint configurations in the project
17
- * npx dynamo-eslintrc-audit
18
- *
19
- * # Or run via npm script
20
- * npm run audit:eslintrc
21
- * ```
22
- *
23
- * @author Future Development Program Ltd.
24
- * @version 1.14.3
25
- */
26
-
27
- import fg from 'fast-glob';
28
- import { readFileSync } from 'fs';
29
- /** Type alias for any JSON value */
30
- type AnyJson = any;
31
-
32
- /**
33
- * Safely parses a JSON file and returns the parsed object or null if parsing fails
34
- *
35
- * @param jsonPath - Path to the JSON file to parse
36
- * @returns Parsed JSON object or null if parsing fails
37
- *
38
- * @example
39
- * ```typescript
40
- * const config = safeParse('./.eslintrc.json');
41
- * if (config) {
42
- * console.log('Rules:', Object.keys(config.rules || {}));
43
- * }
44
- * ```
45
- */
46
- function safeParse(jsonPath: string): AnyJson | null {
47
- try {
48
- const content = readFileSync(jsonPath, 'utf8');
49
-
50
- return JSON.parse(content);
51
- } catch {
52
- // Return null for any parsing errors (malformed JSON, file not found, etc.)
53
- return null;
54
- }
55
- }
56
-
57
- /**
58
- * Main function that analyzes ESLint configuration files and generates rule usage statistics
59
- *
60
- * Scans for all .eslintrc.json files in the project, extracts rule configurations,
61
- * and provides a sorted table of the most commonly used rules.
62
- *
63
- * @returns Promise that resolves when analysis is complete
64
- *
65
- * @example
66
- * ```typescript
67
- * // The function will output a table like:
68
- * // ┌─────────┬─────────────────────────┬───────┐
69
- * // │ (index) │ rule │ count │
70
- * // ├─────────┼─────────────────────────┼───────┤
71
- * // │ 0 │ 'no-unused-vars' │ 5 │
72
- * // │ 1 │ 'semi' │ 4 │
73
- * // └─────────┴─────────────────────────┴───────┘
74
- * ```
75
- */
76
- async function main(): Promise<void> {
77
- // Find all ESLint configuration files, excluding node_modules
78
- const files: string[] = await fg([ '**/.eslintrc.json' ], { ignore: [ '**/node_modules/**' ] });
79
- const ruleCounts: Record<string, number> = {};
80
- const total: number = files.length;
81
-
82
- // Process each configuration file
83
- for (const p of files) {
84
- const cfg = safeParse(p);
85
-
86
- // Skip files without rules configuration
87
- if (!cfg?.rules) continue;
88
-
89
- // Count each rule occurrence
90
- for (const key of Object.keys(cfg.rules)) {
91
- ruleCounts[key] = (ruleCounts[key] ?? 0) + 1;
92
- }
93
- }
94
-
95
- // Sort rules by usage count (most used first)
96
- const entries = Object.entries(ruleCounts).sort(
97
- (a: [ string, number ], b: [ string, number ]): number => b[1] - a[1]
98
- );
99
-
100
- // Display results
101
- console.log(`[dynamo-eslintrc-audit] analyzed ${total} files`);
102
- console.table(entries.slice(0, 50).map(([ rule, count ]) => ({ rule, count })));
103
- }
104
-
105
- // Execute the main function and handle any errors
106
- main().catch((err: Error): void => {
107
- console.error(err);
108
- process.exit(1);
109
- });
110
-
111
-
112
-
113
-
114
-
115
-
116
-
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview ESLint Configuration Audit Script
4
+ *
5
+ * This script analyzes ESLint configuration files (.eslintrc.json) across the project
6
+ * to provide statistics on rule usage. It helps identify commonly used rules and
7
+ * potential configuration inconsistencies.
8
+ *
9
+ * @usage
10
+ * ```bash
11
+ * dynamo-eslintrc-audit
12
+ * ```
13
+ *
14
+ * @example
15
+ * ```bash
16
+ * # Audit all ESLint configurations in the project
17
+ * npx dynamo-eslintrc-audit
18
+ *
19
+ * # Or run via npm script
20
+ * npm run audit:eslintrc
21
+ * ```
22
+ *
23
+ * @author Future Development Program Ltd.
24
+ * @version 1.14.3
25
+ */
26
+
27
+ import fg from 'fast-glob';
28
+ import { readFileSync } from 'fs';
29
+ /** Type alias for any JSON value */
30
+ type AnyJson = any;
31
+
32
+ /**
33
+ * Safely parses a JSON file and returns the parsed object or null if parsing fails
34
+ *
35
+ * @param jsonPath - Path to the JSON file to parse
36
+ * @returns Parsed JSON object or null if parsing fails
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const config = safeParse('./.eslintrc.json');
41
+ * if (config) {
42
+ * console.log('Rules:', Object.keys(config.rules || {}));
43
+ * }
44
+ * ```
45
+ */
46
+ function safeParse(jsonPath: string): AnyJson | null {
47
+ try {
48
+ const content = readFileSync(jsonPath, 'utf8');
49
+
50
+ return JSON.parse(content);
51
+ } catch {
52
+ // Return null for any parsing errors (malformed JSON, file not found, etc.)
53
+ return null;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Main function that analyzes ESLint configuration files and generates rule usage statistics
59
+ *
60
+ * Scans for all .eslintrc.json files in the project, extracts rule configurations,
61
+ * and provides a sorted table of the most commonly used rules.
62
+ *
63
+ * @returns Promise that resolves when analysis is complete
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // The function will output a table like:
68
+ * // ┌─────────┬─────────────────────────┬───────┐
69
+ * // │ (index) │ rule │ count │
70
+ * // ├─────────┼─────────────────────────┼───────┤
71
+ * // │ 0 │ 'no-unused-vars' │ 5 │
72
+ * // │ 1 │ 'semi' │ 4 │
73
+ * // └─────────┴─────────────────────────┴───────┘
74
+ * ```
75
+ */
76
+ async function main(): Promise<void> {
77
+ // Find all ESLint configuration files, excluding node_modules
78
+ const files: string[] = await fg([ '**/.eslintrc.json' ], { ignore: [ '**/node_modules/**' ] });
79
+ const ruleCounts: Record<string, number> = {};
80
+ const total: number = files.length;
81
+
82
+ // Process each configuration file
83
+ for (const p of files) {
84
+ const cfg = safeParse(p);
85
+
86
+ // Skip files without rules configuration
87
+ if (!cfg?.rules) continue;
88
+
89
+ // Count each rule occurrence
90
+ for (const key of Object.keys(cfg.rules)) {
91
+ ruleCounts[key] = (ruleCounts[key] ?? 0) + 1;
92
+ }
93
+ }
94
+
95
+ // Sort rules by usage count (most used first)
96
+ const entries = Object.entries(ruleCounts).sort(
97
+ (a: [ string, number ], b: [ string, number ]): number => b[1] - a[1]
98
+ );
99
+
100
+ // Display results
101
+ console.log(`[dynamo-eslintrc-audit] analyzed ${total} files`);
102
+ console.table(entries.slice(0, 50).map(([ rule, count ]) => ({ rule, count })));
103
+ }
104
+
105
+ // Execute the main function and handle any errors
106
+ main().catch((err: Error): void => {
107
+ console.error(err);
108
+ process.exit(1);
109
+ });
110
+
111
+
112
+
113
+
114
+
115
+
116
+
@@ -1,65 +1,65 @@
1
- import * as ts from 'typescript';
2
-
3
- import { buildTypeNodeFromString } from './fix-return-types';
4
-
5
- /**
6
- * A `buildTypeNodeFromString` helper-t fedi le — ez a B2 regresszio magja: a regi
7
- * `ts.factory.createTypeReferenceNode(typeString)` csonka `Record`-ot emittalt a
8
- * generic tipusoknal. A helper most a teljes tipus-stringet valodi TypeNode-da
9
- * parse-olja, vagy bail-el (undefined), ha nem biztonsagos.
10
- */
11
- describe('| fix-return-types buildTypeNodeFromString', () => {
12
- const printer: ts.Printer = ts.createPrinter();
13
- const dummySource: ts.SourceFile = ts.createSourceFile('__dummy__.ts', '', ts.ScriptTarget.Latest, false);
14
-
15
- /** Egy TypeNode-ot vissza-printel forras-szovegge az assert-hez. */
16
- function printType(node: ts.TypeNode): string {
17
- return printer.printNode(ts.EmitHint.Unspecified, node, dummySource);
18
- }
19
-
20
- it('| should keep the type arguments of a generic Record (no truncation)', () => {
21
- const node: ts.TypeNode | undefined = buildTypeNodeFromString('Record<string, unknown>');
22
-
23
- expect(node).toBeDefined();
24
-
25
- const printed: string = printType(node as ts.TypeNode);
26
-
27
- // A regi bug itt csonka "Record"-ot adott — most a teljes generic megmarad.
28
- expect(printed).toContain('Record');
29
- expect(printed).toContain('<');
30
- expect(printed).toContain('string');
31
- expect(printed).toContain('unknown');
32
- expect(printed).not.toMatch(/^Record;?$/);
33
- });
34
-
35
- it('| should preserve a union type', () => {
36
- const node: ts.TypeNode | undefined = buildTypeNodeFromString('string | null');
37
-
38
- expect(node).toBeDefined();
39
- expect(printType(node as ts.TypeNode)).toContain('|');
40
- });
41
-
42
- it('| should preserve a nested generic (Promise of array)', () => {
43
- const node: ts.TypeNode | undefined = buildTypeNodeFromString('Promise<number[]>');
44
-
45
- expect(node).toBeDefined();
46
-
47
- const printed: string = printType(node as ts.TypeNode);
48
- expect(printed).toContain('Promise');
49
- expect(printed).toContain('number');
50
- expect(printed).toContain('[]');
51
- });
52
-
53
- it('| should bail (undefined) on an inline import() type to avoid leaking a path', () => {
54
- const node: ts.TypeNode | undefined = buildTypeNodeFromString('import("/abs/path/to/mod").Foo');
55
-
56
- expect(node).toBeUndefined();
57
- });
58
-
59
- it('| should still handle a plain identifier type', () => {
60
- const node: ts.TypeNode | undefined = buildTypeNodeFromString('MyType');
61
-
62
- expect(node).toBeDefined();
63
- expect(printType(node as ts.TypeNode)).toBe('MyType');
64
- });
65
- });
1
+ import * as ts from 'typescript';
2
+
3
+ import { buildTypeNodeFromString } from './fix-return-types';
4
+
5
+ /**
6
+ * A `buildTypeNodeFromString` helper-t fedi le — ez a B2 regresszio magja: a regi
7
+ * `ts.factory.createTypeReferenceNode(typeString)` csonka `Record`-ot emittalt a
8
+ * generic tipusoknal. A helper most a teljes tipus-stringet valodi TypeNode-da
9
+ * parse-olja, vagy bail-el (undefined), ha nem biztonsagos.
10
+ */
11
+ describe('| fix-return-types buildTypeNodeFromString', () => {
12
+ const printer: ts.Printer = ts.createPrinter();
13
+ const dummySource: ts.SourceFile = ts.createSourceFile('__dummy__.ts', '', ts.ScriptTarget.Latest, false);
14
+
15
+ /** Egy TypeNode-ot vissza-printel forras-szovegge az assert-hez. */
16
+ function printType(node: ts.TypeNode): string {
17
+ return printer.printNode(ts.EmitHint.Unspecified, node, dummySource);
18
+ }
19
+
20
+ it('| should keep the type arguments of a generic Record (no truncation)', () => {
21
+ const node: ts.TypeNode | undefined = buildTypeNodeFromString('Record<string, unknown>');
22
+
23
+ expect(node).toBeDefined();
24
+
25
+ const printed: string = printType(node as ts.TypeNode);
26
+
27
+ // A regi bug itt csonka "Record"-ot adott — most a teljes generic megmarad.
28
+ expect(printed).toContain('Record');
29
+ expect(printed).toContain('<');
30
+ expect(printed).toContain('string');
31
+ expect(printed).toContain('unknown');
32
+ expect(printed).not.toMatch(/^Record;?$/);
33
+ });
34
+
35
+ it('| should preserve a union type', () => {
36
+ const node: ts.TypeNode | undefined = buildTypeNodeFromString('string | null');
37
+
38
+ expect(node).toBeDefined();
39
+ expect(printType(node as ts.TypeNode)).toContain('|');
40
+ });
41
+
42
+ it('| should preserve a nested generic (Promise of array)', () => {
43
+ const node: ts.TypeNode | undefined = buildTypeNodeFromString('Promise<number[]>');
44
+
45
+ expect(node).toBeDefined();
46
+
47
+ const printed: string = printType(node as ts.TypeNode);
48
+ expect(printed).toContain('Promise');
49
+ expect(printed).toContain('number');
50
+ expect(printed).toContain('[]');
51
+ });
52
+
53
+ it('| should bail (undefined) on an inline import() type to avoid leaking a path', () => {
54
+ const node: ts.TypeNode | undefined = buildTypeNodeFromString('import("/abs/path/to/mod").Foo');
55
+
56
+ expect(node).toBeUndefined();
57
+ });
58
+
59
+ it('| should still handle a plain identifier type', () => {
60
+ const node: ts.TypeNode | undefined = buildTypeNodeFromString('MyType');
61
+
62
+ expect(node).toBeDefined();
63
+ expect(printType(node as ts.TypeNode)).toBe('MyType');
64
+ });
65
+ });