@futdevpro/dynamo-eslint 1.15.18 → 1.15.20
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.
- package/.dynamo/pipeline.cicd.config.json +4 -0
- package/build/plugin/rules/prefer-interface-over-duplicate-types.d.ts.map +1 -1
- package/build/plugin/rules/prefer-interface-over-duplicate-types.js +48 -39
- package/build/plugin/rules/prefer-interface-over-duplicate-types.js.map +1 -1
- package/package.json +1 -1
- package/src/plugin/rules/prefer-interface-over-duplicate-types.spec.ts +9 -4
- package/src/plugin/rules/prefer-interface-over-duplicate-types.ts +12 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-interface-over-duplicate-types.d.ts","sourceRoot":"","sources":["../../../src/plugin/rules/prefer-interface-over-duplicate-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAY9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"prefer-interface-over-duplicate-types.d.ts","sourceRoot":"","sources":["../../../src/plugin/rules/prefer-interface-over-duplicate-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAY9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA8QhB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -22,8 +22,13 @@ const rule = {
|
|
|
22
22
|
],
|
|
23
23
|
messages: {
|
|
24
24
|
preferInterface: 'Object type used {{count}} times. Consider creating interface "{{interfaceName}}"}}',
|
|
25
|
+
extractInterface: 'Extract to interface "{{interfaceName}}" (⚠️ review the generated types — complex/union/qualified types may need manual correction).',
|
|
25
26
|
},
|
|
26
|
-
|
|
27
|
+
// BFR-ADVENTOR-009: az auto-fixer a LOSSY normalizált signature-stringből rekonstruálja az interface-törzset
|
|
28
|
+
// (`reference`/`complex`/`union` literálok kerülnek a generált kódba → érvénytelen TS, build-törés `--fix`-re).
|
|
29
|
+
// Amíg a fixer forrás-szöveg-megőrzőre nincs átírva, SUGGESTION-ként fut (nem `fixable:'code'`) → a bulk
|
|
30
|
+
// `eslint --fix` NEM futtatja automatikusan; csak explicit apply-ra, a fenti figyelmeztetéssel.
|
|
31
|
+
hasSuggestions: true,
|
|
27
32
|
},
|
|
28
33
|
create(context) {
|
|
29
34
|
const options = context.options[0] || {};
|
|
@@ -174,47 +179,51 @@ const rule = {
|
|
|
174
179
|
count: usages.length.toString(),
|
|
175
180
|
interfaceName,
|
|
176
181
|
},
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
lastImport =
|
|
182
|
+
suggest: [{
|
|
183
|
+
messageId: 'extractInterface',
|
|
184
|
+
data: { interfaceName },
|
|
185
|
+
fix(fixer) {
|
|
186
|
+
try {
|
|
187
|
+
// Generate interface declaration
|
|
188
|
+
const properties = signature.split(';').map(prop => {
|
|
189
|
+
const [key, type] = prop.split(':');
|
|
190
|
+
return ` ${key}: ${type};`;
|
|
191
|
+
}).join('\n');
|
|
192
|
+
const interfaceDeclaration = `interface ${interfaceName} {\n${properties}\n}`;
|
|
193
|
+
// Find insertion point (after imports, before other code)
|
|
194
|
+
const firstNode = sourceCode.ast.body[0];
|
|
195
|
+
let insertPosition = 0;
|
|
196
|
+
if (firstNode && firstNode.type === 'ImportDeclaration') {
|
|
197
|
+
// Find last import
|
|
198
|
+
let lastImport = firstNode;
|
|
199
|
+
for (const node of sourceCode.ast.body) {
|
|
200
|
+
if (node.type === 'ImportDeclaration') {
|
|
201
|
+
lastImport = node;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
insertPosition = lastImport.range[1];
|
|
194
208
|
}
|
|
195
|
-
|
|
196
|
-
|
|
209
|
+
// Add interface declaration
|
|
210
|
+
const fixes = [
|
|
211
|
+
fixer.insertTextAfterRange([insertPosition, insertPosition], `\n\n${interfaceDeclaration}\n`),
|
|
212
|
+
];
|
|
213
|
+
// Replace all usages with interface reference
|
|
214
|
+
for (const usage of usages) {
|
|
215
|
+
const nodeText = sourceCode.getText(usage.node);
|
|
216
|
+
const replacement = interfaceName;
|
|
217
|
+
fixes.push(fixer.replaceText(usage.node, replacement));
|
|
197
218
|
}
|
|
219
|
+
return fixes;
|
|
198
220
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
// Replace all usages with interface reference
|
|
206
|
-
for (const usage of usages) {
|
|
207
|
-
const nodeText = sourceCode.getText(usage.node);
|
|
208
|
-
const replacement = interfaceName;
|
|
209
|
-
fixes.push(fixer.replaceText(usage.node, replacement));
|
|
210
|
-
}
|
|
211
|
-
return fixes;
|
|
212
|
-
}
|
|
213
|
-
catch (fixError) {
|
|
214
|
-
console.error('[prefer-interface-over-duplicate-types] Error in fix function:', fixError);
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
},
|
|
221
|
+
catch (fixError) {
|
|
222
|
+
console.error('[prefer-interface-over-duplicate-types] Error in fix function:', fixError);
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
}],
|
|
218
227
|
});
|
|
219
228
|
}
|
|
220
229
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-interface-over-duplicate-types.js","sourceRoot":"","sources":["../../../src/plugin/rules/prefer-interface-over-duplicate-types.ts"],"names":[],"mappings":";;AAYA,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,2FAA2F;YACxG,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,CAAC;wBACV,OAAO,EAAE,CAAC;qBACX;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,QAAQ,EAAE;YACR,eAAe,EAAE,qFAAqF;
|
|
1
|
+
{"version":3,"file":"prefer-interface-over-duplicate-types.js","sourceRoot":"","sources":["../../../src/plugin/rules/prefer-interface-over-duplicate-types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,10 @@ describe('| prefer-interface-over-duplicate-types', () => {
|
|
|
4
4
|
it('| should be a valid ESLint rule', () => {
|
|
5
5
|
expect(preferInterfaceRule.meta?.type).toBe('suggestion');
|
|
6
6
|
expect(preferInterfaceRule.meta?.docs?.description).toContain('Suggest creating interfaces');
|
|
7
|
-
|
|
7
|
+
// BFR-ADVENTOR-009: a lossy-signature fixer degradálva suggestion-né (nem auto-`--fix`) → hasSuggestions,
|
|
8
|
+
// hogy a bulk `eslint --fix` ne generálhasson érvénytelen kódot (a teljes forrás-megőrző rewrite külön slice).
|
|
9
|
+
expect(preferInterfaceRule.meta?.fixable).toBeUndefined();
|
|
10
|
+
expect(preferInterfaceRule.meta?.hasSuggestions).toBe(true);
|
|
8
11
|
});
|
|
9
12
|
|
|
10
13
|
it('| should have create function that returns visitor object', () => {
|
|
@@ -238,11 +241,13 @@ describe('| prefer-interface-over-duplicate-types', () => {
|
|
|
238
241
|
expect(reportCalled).toBe(true);
|
|
239
242
|
});
|
|
240
243
|
|
|
241
|
-
it('| should provide
|
|
244
|
+
it('| should provide suggestion-based fix functionality (BFR-ADVENTOR-009: degraded from auto-fix)', () => {
|
|
242
245
|
const mockContext = {
|
|
243
246
|
report: (options: any) => {
|
|
244
|
-
|
|
245
|
-
expect(
|
|
247
|
+
// a fixer mostantól suggestion (nem auto-`--fix`), így a bulk `--fix` nem generálhat érvénytelen kódot
|
|
248
|
+
expect(options.fix).toBeUndefined();
|
|
249
|
+
expect(Array.isArray(options.suggest)).toBe(true);
|
|
250
|
+
expect(typeof options.suggest[0].fix).toBe('function');
|
|
246
251
|
},
|
|
247
252
|
options: [{ threshold: 2 }],
|
|
248
253
|
sourceCode: {
|
|
@@ -32,8 +32,13 @@ const rule: Rule.RuleModule = {
|
|
|
32
32
|
],
|
|
33
33
|
messages: {
|
|
34
34
|
preferInterface: 'Object type used {{count}} times. Consider creating interface "{{interfaceName}}"}}',
|
|
35
|
+
extractInterface: 'Extract to interface "{{interfaceName}}" (⚠️ review the generated types — complex/union/qualified types may need manual correction).',
|
|
35
36
|
},
|
|
36
|
-
|
|
37
|
+
// BFR-ADVENTOR-009: az auto-fixer a LOSSY normalizált signature-stringből rekonstruálja az interface-törzset
|
|
38
|
+
// (`reference`/`complex`/`union` literálok kerülnek a generált kódba → érvénytelen TS, build-törés `--fix`-re).
|
|
39
|
+
// Amíg a fixer forrás-szöveg-megőrzőre nincs átírva, SUGGESTION-ként fut (nem `fixable:'code'`) → a bulk
|
|
40
|
+
// `eslint --fix` NEM futtatja automatikusan; csak explicit apply-ra, a fenti figyelmeztetéssel.
|
|
41
|
+
hasSuggestions: true,
|
|
37
42
|
},
|
|
38
43
|
create(context) {
|
|
39
44
|
const options: RuleOptions = context.options[0] || {};
|
|
@@ -210,7 +215,10 @@ const rule: Rule.RuleModule = {
|
|
|
210
215
|
count: usages.length.toString(),
|
|
211
216
|
interfaceName,
|
|
212
217
|
},
|
|
213
|
-
|
|
218
|
+
suggest: [{
|
|
219
|
+
messageId: 'extractInterface',
|
|
220
|
+
data: { interfaceName },
|
|
221
|
+
fix(fixer) {
|
|
214
222
|
try {
|
|
215
223
|
// Generate interface declaration
|
|
216
224
|
const properties = signature.split(';').map(prop => {
|
|
@@ -260,7 +268,8 @@ const rule: Rule.RuleModule = {
|
|
|
260
268
|
|
|
261
269
|
return null;
|
|
262
270
|
}
|
|
263
|
-
|
|
271
|
+
},
|
|
272
|
+
}],
|
|
264
273
|
});
|
|
265
274
|
}
|
|
266
275
|
}
|