@futdevpro/dynamo-eslint 1.15.25 → 1.20.2

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 (146) 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 +312 -315
  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/__documentations/2026-08-22-angular-20-phase2-release.md +79 -0
  34. package/build/configs/base.d.ts +1 -2
  35. package/build/configs/base.d.ts.map +1 -1
  36. package/build/configs/base.js +3 -4
  37. package/build/configs/base.js.map +1 -1
  38. package/build/configs/ngx.d.ts +1 -3
  39. package/build/configs/ngx.d.ts.map +1 -1
  40. package/build/configs/ngx.js +4 -7
  41. package/build/configs/ngx.js.map +1 -1
  42. package/build/plugin/index.d.ts +24 -24
  43. package/build/plugin/rules/no-getter-logic.js +1 -1
  44. package/build/plugin/rules/no-getter-logic.js.map +1 -1
  45. package/build/plugin/rules/prefer-enum-over-string-union.js +7 -7
  46. package/build/plugin/rules/prefer-enum-over-string-union.js.map +1 -1
  47. package/build/plugin/rules/prefer-interface-over-duplicate-types.js +2 -2
  48. package/build/plugin/rules/prefer-interface-over-duplicate-types.js.map +1 -1
  49. package/build/plugin/rules/require-jsdoc-description.js +7 -7
  50. package/build/plugin/rules/require-jsdoc-description.js.map +1 -1
  51. package/build/scripts/dynamo-fix.js +1 -1
  52. package/build/scripts/dynamo-fix.js.map +1 -1
  53. package/build/scripts/fix-return-types.d.ts.map +1 -1
  54. package/build/scripts/fix-return-types.js.map +1 -1
  55. package/build/scripts/validate-imports.js +51 -27
  56. package/build/scripts/validate-imports.js.map +1 -1
  57. package/build/scripts/validate-naming.js +49 -10
  58. package/build/scripts/validate-naming.js.map +1 -1
  59. package/eslint.config.js +15 -15
  60. package/package.json +27 -28
  61. package/pnpm-workspace.yaml +2 -0
  62. package/samples/.vscode/settings.json +13 -13
  63. package/samples/base/.eslintrc.json +6 -6
  64. package/samples/base/eslint.config.js +3 -3
  65. package/samples/fsm/.eslintrc.json +4 -4
  66. package/samples/fsm/eslint.config.js +3 -3
  67. package/samples/ngx/.eslintrc.json +6 -6
  68. package/samples/ngx/eslint.config.js +3 -3
  69. package/samples/ngx-package/.eslintrc.json +4 -4
  70. package/samples/ngx-package/eslint.config.js +3 -3
  71. package/samples/nts/.eslintrc.json +6 -6
  72. package/samples/nts/eslint.config.js +3 -3
  73. package/samples/nts-package/.eslintrc.json +4 -4
  74. package/samples/nts-package/eslint.config.js +3 -3
  75. package/samples/package.json.example +22 -26
  76. package/samples/poc-sample.ts +38 -38
  77. package/samples/poc-violations.ts +54 -54
  78. package/scripts/run-coverage-tests.js +24 -24
  79. package/spec/support/helpers/ts-node-helper.js +9 -9
  80. package/spec/support/jasmine.coverage.json +23 -23
  81. package/spec/support/jasmine.json +24 -24
  82. package/src/configs/angular20-compatibility.spec.ts +62 -0
  83. package/src/configs/base.ts +156 -157
  84. package/src/configs/fsm.ts +10 -10
  85. package/src/configs/ngx-package.ts +10 -10
  86. package/src/configs/ngx.ts +92 -95
  87. package/src/configs/nts-package.ts +20 -20
  88. package/src/configs/nts.ts +34 -34
  89. package/src/index.ts +4 -4
  90. package/src/plugin/index.ts +86 -86
  91. package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -44
  92. package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -88
  93. package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -89
  94. package/src/plugin/rules/angular/effect-signal-loop.ts +125 -125
  95. package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -50
  96. package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -43
  97. package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -78
  98. package/src/plugin/rules/angular/no-component-direct-api.ts +82 -82
  99. package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -63
  100. package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -89
  101. package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -44
  102. package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -62
  103. package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -44
  104. package/src/plugin/rules/angular/no-ngif-directive.ts +62 -62
  105. package/src/plugin/rules/explicit-types.spec.ts +190 -190
  106. package/src/plugin/rules/explicit-types.ts +186 -186
  107. package/src/plugin/rules/import/import-order.spec.ts +219 -219
  108. package/src/plugin/rules/import/import-order.ts +197 -197
  109. package/src/plugin/rules/import/no-import-type.spec.ts +69 -69
  110. package/src/plugin/rules/import/no-import-type.ts +46 -46
  111. package/src/plugin/rules/import/no-js-import.spec.ts +82 -82
  112. package/src/plugin/rules/import/no-js-import.ts +45 -45
  113. package/src/plugin/rules/naming-patterns.spec.ts +189 -189
  114. package/src/plugin/rules/naming-patterns.ts +426 -426
  115. package/src/plugin/rules/no-getter-logic.spec.ts +591 -591
  116. package/src/plugin/rules/no-getter-logic.ts +220 -220
  117. package/src/plugin/rules/prefer-enum-over-string-union.spec.ts +583 -583
  118. package/src/plugin/rules/prefer-enum-over-string-union.ts +333 -334
  119. package/src/plugin/rules/prefer-interface-over-duplicate-types.spec.ts +404 -404
  120. package/src/plugin/rules/prefer-interface-over-duplicate-types.ts +314 -314
  121. package/src/plugin/rules/require-jsdoc-description.spec.ts +779 -779
  122. package/src/plugin/rules/require-jsdoc-description.ts +572 -572
  123. package/src/plugin/rules/require-test-description-prefix.spec.ts +459 -459
  124. package/src/plugin/rules/require-test-description-prefix.ts +154 -154
  125. package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -84
  126. package/src/plugin/rules/ts/data-model-extends.ts +100 -100
  127. package/src/plugin/rules/ts/no-any-type.spec.ts +28 -28
  128. package/src/plugin/rules/ts/no-any-type.ts +36 -36
  129. package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -51
  130. package/src/plugin/rules/ts/no-as-cast.ts +51 -51
  131. package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -54
  132. package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -49
  133. package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -54
  134. package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -84
  135. package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -72
  136. package/src/plugin/rules/ts/no-plain-function-export.ts +73 -73
  137. package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -64
  138. package/src/plugin/rules/ts/one-export-per-file.ts +77 -77
  139. package/src/scripts/dynamo-fix.ts +172 -172
  140. package/src/scripts/eslintrc-audit.ts +116 -116
  141. package/src/scripts/fix-return-types.spec.ts +65 -65
  142. package/src/scripts/fix-return-types.ts +286 -285
  143. package/src/scripts/validate-imports.ts +288 -257
  144. package/src/scripts/validate-naming.ts +209 -183
  145. package/src/scripts/validator-cli.integration.spec.ts +99 -0
  146. package/tsconfig.json +31 -31
@@ -1,219 +1,219 @@
1
- import importOrderRule from './import-order';
2
-
3
- describe('| import-order', () => {
4
- it('| should be a valid ESLint rule', () => {
5
- expect(importOrderRule.meta?.type).toBe('suggestion');
6
- expect(importOrderRule.meta?.docs?.description).toContain('import ordering');
7
- expect(importOrderRule.meta?.fixable).toBe('code');
8
- });
9
-
10
- it('| should have create function that returns object with Program method', () => {
11
- const mockContext = {
12
- getSourceCode: () => ({
13
- ast: {},
14
- getLines: () => [ 'line1', 'line2', 'line3' ],
15
- }),
16
- getFilename: () => 'test.ts',
17
- report: () => {},
18
- } as any;
19
-
20
- const result = importOrderRule.create(mockContext);
21
-
22
- expect(typeof result).toBe('object');
23
- expect(typeof result.Program).toBe('function');
24
- });
25
-
26
- it('| should detect forbidden NPM-packages imports', () => {
27
- const mockContext = {
28
- sourceCode: {
29
- ast: {},
30
- getLines: () => [ 'import { Something } from \'../../../NPM-packages/some-package\';' ],
31
- },
32
- filename: 'test.ts',
33
- report: (options: any) => {
34
- expect(options.messageId).toBe('forbiddenNpmPackages');
35
- },
36
- } as any;
37
-
38
- const mockNode = {
39
- type: 'Program',
40
- sourceType: 'module',
41
- body: [
42
- {
43
- type: 'ImportDeclaration',
44
- source: { value: '../../../NPM-packages/some-package' },
45
- importKind: 'value',
46
- loc: { start: { line: 1 }, end: { line: 1 } },
47
- },
48
- ],
49
- } as any;
50
-
51
- const rule = importOrderRule.create(mockContext);
52
-
53
- rule.Program(mockNode);
54
- });
55
-
56
- it('| should detect forbidden .js extension imports', () => {
57
- const mockContext = {
58
- sourceCode: {
59
- ast: {},
60
- getLines: () => [ 'import { Something } from \'./some-file.js\';' ],
61
- },
62
- filename: 'test.ts',
63
- report: (options: any) => {
64
- expect(options.messageId).toBe('forbiddenJsExtension');
65
- },
66
- } as any;
67
-
68
- const mockNode = {
69
- type: 'Program',
70
- sourceType: 'module',
71
- body: [
72
- {
73
- type: 'ImportDeclaration',
74
- source: { value: './some-file.js' },
75
- importKind: 'value',
76
- loc: { start: { line: 1 }, end: { line: 1 } },
77
- },
78
- ],
79
- } as any;
80
-
81
- const rule = importOrderRule.create(mockContext);
82
-
83
- rule.Program(mockNode);
84
- });
85
-
86
- it('| should detect forbidden import type usage', () => {
87
- const mockContext = {
88
- sourceCode: {
89
- ast: {},
90
- getLines: () => [ 'import type { SomeType } from \'./some-file\';' ],
91
- },
92
- filename: 'test.ts',
93
- report: (options: any) => {
94
- expect(options.messageId).toBe('forbiddenImportType');
95
- },
96
- } as any;
97
-
98
- const mockNode = {
99
- type: 'Program',
100
- sourceType: 'module',
101
- body: [
102
- {
103
- type: 'ImportDeclaration',
104
- source: { value: './some-file' },
105
- importKind: 'type',
106
- loc: { start: { line: 1 }, end: { line: 1 } },
107
- },
108
- ],
109
- } as any;
110
-
111
- const rule = importOrderRule.create(mockContext);
112
-
113
- rule.Program(mockNode);
114
- });
115
-
116
- it('| should detect misordered imports', () => {
117
- let reportCount = 0;
118
- const mockContext = {
119
- sourceCode: {
120
- ast: {},
121
- getLines: () => [
122
- 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';',
123
- 'import { Component } from \'@angular/core\';',
124
- ],
125
- },
126
- filename: 'test.ts',
127
- report: (options: any) => {
128
- if (options.messageId === 'misordered') {
129
- reportCount++;
130
- }
131
- },
132
- } as any;
133
-
134
- const mockNode = {
135
- type: 'Program',
136
- sourceType: 'module',
137
- body: [
138
- {
139
- type: 'ImportDeclaration',
140
- source: { value: '@futdevpro/fsm-dynamo' },
141
- importKind: 'value',
142
- loc: { start: { line: 1 }, end: { line: 1 } },
143
- },
144
- {
145
- type: 'ImportDeclaration',
146
- source: { value: '@angular/core' },
147
- importKind: 'value',
148
- loc: { start: { line: 2 }, end: { line: 2 } },
149
- },
150
- ],
151
- } as any;
152
-
153
- const rule = importOrderRule.create(mockContext);
154
-
155
- rule.Program(mockNode);
156
-
157
- expect(reportCount).toBeGreaterThan(0);
158
- });
159
-
160
- it('| should detect missing empty line between groups', () => {
161
- let reportCount = 0;
162
- let hasFix = false;
163
- const mockContext = {
164
- sourceCode: {
165
- ast: {},
166
- getLines: () => [
167
- 'import { Component } from \'@angular/core\';',
168
- 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';',
169
- ],
170
- getText: (node: any) => {
171
- if (node.source?.value === '@angular/core') {
172
- return 'import { Component } from \'@angular/core\';';
173
- }
174
- if (node.source?.value === '@futdevpro/fsm-dynamo') {
175
- return 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';';
176
- }
177
- return '';
178
- },
179
- },
180
- filename: 'test.ts',
181
- report: (options: any) => {
182
- if (options.messageId === 'misordered') {
183
- reportCount++;
184
- }
185
- if (options.fix) {
186
- hasFix = true;
187
- }
188
- },
189
- } as any;
190
-
191
- const mockNode = {
192
- type: 'Program',
193
- sourceType: 'module',
194
- body: [
195
- {
196
- type: 'ImportDeclaration',
197
- source: { value: '@angular/core' },
198
- importKind: 'value',
199
- loc: { start: { line: 1 }, end: { line: 1 } },
200
- range: [0, 40],
201
- },
202
- {
203
- type: 'ImportDeclaration',
204
- source: { value: '@futdevpro/fsm-dynamo' },
205
- importKind: 'value',
206
- loc: { start: { line: 2 }, end: { line: 2 } },
207
- range: [41, 85],
208
- },
209
- ],
210
- } as any;
211
-
212
- const rule = importOrderRule.create(mockContext);
213
-
214
- rule.Program(mockNode);
215
-
216
- expect(reportCount).toBeGreaterThan(0);
217
- expect(hasFix).toBe(true);
218
- });
219
- });
1
+ import importOrderRule from './import-order';
2
+
3
+ describe('| import-order', () => {
4
+ it('| should be a valid ESLint rule', () => {
5
+ expect(importOrderRule.meta?.type).toBe('suggestion');
6
+ expect(importOrderRule.meta?.docs?.description).toContain('import ordering');
7
+ expect(importOrderRule.meta?.fixable).toBe('code');
8
+ });
9
+
10
+ it('| should have create function that returns object with Program method', () => {
11
+ const mockContext = {
12
+ getSourceCode: () => ({
13
+ ast: {},
14
+ getLines: () => [ 'line1', 'line2', 'line3' ],
15
+ }),
16
+ getFilename: () => 'test.ts',
17
+ report: () => {},
18
+ } as any;
19
+
20
+ const result = importOrderRule.create(mockContext);
21
+
22
+ expect(typeof result).toBe('object');
23
+ expect(typeof result.Program).toBe('function');
24
+ });
25
+
26
+ it('| should detect forbidden NPM-packages imports', () => {
27
+ const mockContext = {
28
+ sourceCode: {
29
+ ast: {},
30
+ getLines: () => [ 'import { Something } from \'../../../NPM-packages/some-package\';' ],
31
+ },
32
+ filename: 'test.ts',
33
+ report: (options: any) => {
34
+ expect(options.messageId).toBe('forbiddenNpmPackages');
35
+ },
36
+ } as any;
37
+
38
+ const mockNode = {
39
+ type: 'Program',
40
+ sourceType: 'module',
41
+ body: [
42
+ {
43
+ type: 'ImportDeclaration',
44
+ source: { value: '../../../NPM-packages/some-package' },
45
+ importKind: 'value',
46
+ loc: { start: { line: 1 }, end: { line: 1 } },
47
+ },
48
+ ],
49
+ } as any;
50
+
51
+ const rule = importOrderRule.create(mockContext);
52
+
53
+ rule.Program(mockNode);
54
+ });
55
+
56
+ it('| should detect forbidden .js extension imports', () => {
57
+ const mockContext = {
58
+ sourceCode: {
59
+ ast: {},
60
+ getLines: () => [ 'import { Something } from \'./some-file.js\';' ],
61
+ },
62
+ filename: 'test.ts',
63
+ report: (options: any) => {
64
+ expect(options.messageId).toBe('forbiddenJsExtension');
65
+ },
66
+ } as any;
67
+
68
+ const mockNode = {
69
+ type: 'Program',
70
+ sourceType: 'module',
71
+ body: [
72
+ {
73
+ type: 'ImportDeclaration',
74
+ source: { value: './some-file.js' },
75
+ importKind: 'value',
76
+ loc: { start: { line: 1 }, end: { line: 1 } },
77
+ },
78
+ ],
79
+ } as any;
80
+
81
+ const rule = importOrderRule.create(mockContext);
82
+
83
+ rule.Program(mockNode);
84
+ });
85
+
86
+ it('| should detect forbidden import type usage', () => {
87
+ const mockContext = {
88
+ sourceCode: {
89
+ ast: {},
90
+ getLines: () => [ 'import type { SomeType } from \'./some-file\';' ],
91
+ },
92
+ filename: 'test.ts',
93
+ report: (options: any) => {
94
+ expect(options.messageId).toBe('forbiddenImportType');
95
+ },
96
+ } as any;
97
+
98
+ const mockNode = {
99
+ type: 'Program',
100
+ sourceType: 'module',
101
+ body: [
102
+ {
103
+ type: 'ImportDeclaration',
104
+ source: { value: './some-file' },
105
+ importKind: 'type',
106
+ loc: { start: { line: 1 }, end: { line: 1 } },
107
+ },
108
+ ],
109
+ } as any;
110
+
111
+ const rule = importOrderRule.create(mockContext);
112
+
113
+ rule.Program(mockNode);
114
+ });
115
+
116
+ it('| should detect misordered imports', () => {
117
+ let reportCount = 0;
118
+ const mockContext = {
119
+ sourceCode: {
120
+ ast: {},
121
+ getLines: () => [
122
+ 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';',
123
+ 'import { Component } from \'@angular/core\';',
124
+ ],
125
+ },
126
+ filename: 'test.ts',
127
+ report: (options: any) => {
128
+ if (options.messageId === 'misordered') {
129
+ reportCount++;
130
+ }
131
+ },
132
+ } as any;
133
+
134
+ const mockNode = {
135
+ type: 'Program',
136
+ sourceType: 'module',
137
+ body: [
138
+ {
139
+ type: 'ImportDeclaration',
140
+ source: { value: '@futdevpro/fsm-dynamo' },
141
+ importKind: 'value',
142
+ loc: { start: { line: 1 }, end: { line: 1 } },
143
+ },
144
+ {
145
+ type: 'ImportDeclaration',
146
+ source: { value: '@angular/core' },
147
+ importKind: 'value',
148
+ loc: { start: { line: 2 }, end: { line: 2 } },
149
+ },
150
+ ],
151
+ } as any;
152
+
153
+ const rule = importOrderRule.create(mockContext);
154
+
155
+ rule.Program(mockNode);
156
+
157
+ expect(reportCount).toBeGreaterThan(0);
158
+ });
159
+
160
+ it('| should detect missing empty line between groups', () => {
161
+ let reportCount = 0;
162
+ let hasFix = false;
163
+ const mockContext = {
164
+ sourceCode: {
165
+ ast: {},
166
+ getLines: () => [
167
+ 'import { Component } from \'@angular/core\';',
168
+ 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';',
169
+ ],
170
+ getText: (node: any) => {
171
+ if (node.source?.value === '@angular/core') {
172
+ return 'import { Component } from \'@angular/core\';';
173
+ }
174
+ if (node.source?.value === '@futdevpro/fsm-dynamo') {
175
+ return 'import { DyFM_Error } from \'@futdevpro/fsm-dynamo\';';
176
+ }
177
+ return '';
178
+ },
179
+ },
180
+ filename: 'test.ts',
181
+ report: (options: any) => {
182
+ if (options.messageId === 'misordered') {
183
+ reportCount++;
184
+ }
185
+ if (options.fix) {
186
+ hasFix = true;
187
+ }
188
+ },
189
+ } as any;
190
+
191
+ const mockNode = {
192
+ type: 'Program',
193
+ sourceType: 'module',
194
+ body: [
195
+ {
196
+ type: 'ImportDeclaration',
197
+ source: { value: '@angular/core' },
198
+ importKind: 'value',
199
+ loc: { start: { line: 1 }, end: { line: 1 } },
200
+ range: [0, 40],
201
+ },
202
+ {
203
+ type: 'ImportDeclaration',
204
+ source: { value: '@futdevpro/fsm-dynamo' },
205
+ importKind: 'value',
206
+ loc: { start: { line: 2 }, end: { line: 2 } },
207
+ range: [41, 85],
208
+ },
209
+ ],
210
+ } as any;
211
+
212
+ const rule = importOrderRule.create(mockContext);
213
+
214
+ rule.Program(mockNode);
215
+
216
+ expect(reportCount).toBeGreaterThan(0);
217
+ expect(hasFix).toBe(true);
218
+ });
219
+ });