@codeperfect/eslint-plugin 2.4.0 → 2.6.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.
- package/README.md +2 -0
- package/dist/application/custom-rules.d.ts +3 -0
- package/dist/application/custom-rules.d.ts.map +1 -1
- package/dist/application/custom-rules.js +6 -2
- package/dist/application/index.d.ts +1 -1
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +2 -2
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +1 -11
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +6 -14
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +2 -4
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +4 -134
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts +14 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.js +154 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +10 -12
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +4 -11
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +2 -12
- package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -3
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts +14 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +187 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts +26 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +95 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts +32 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +78 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts +18 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +45 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts +34 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.js +44 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts +59 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +133 -0
- package/dist/domain/architecture/no-unused-exports/{no-unused-exports-utilities.d.ts → no-unused-exports-usage-utilities.d.ts} +2 -23
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.js +106 -0
- package/dist/domain/architecture/no-unused-exports/rule.js +4 -2
- package/dist/domain/core/index.d.ts +1 -0
- package/dist/domain/core/index.d.ts.map +1 -1
- package/dist/domain/core/index.js +2 -1
- package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts +58 -0
- package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule-utilities.js +204 -0
- package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/rule.js +9 -211
- package/dist/domain/core/no-multiple-declarators/types.js +2 -2
- package/dist/domain/core/no-useless-delegation/index.d.ts +2 -0
- package/dist/domain/core/no-useless-delegation/index.d.ts.map +1 -0
- package/dist/domain/core/no-useless-delegation/index.js +2 -0
- package/dist/domain/core/no-useless-delegation/rule.d.ts +5 -0
- package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -0
- package/dist/domain/core/no-useless-delegation/rule.js +200 -0
- package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +57 -0
- package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/rule-utilities.js +105 -0
- package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
- package/dist/domain/core/prefer-interface-types/rule.js +2 -104
- package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts +25 -0
- package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +64 -0
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts +2 -24
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +3 -65
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -2
- package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/rule.js +3 -2
- package/dist/domain/docs/require-example-language/examples-collect.d.ts +15 -0
- package/dist/domain/docs/require-example-language/examples-collect.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/examples-collect.js +113 -0
- package/dist/domain/docs/require-example-language/examples.d.ts +24 -13
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/examples.js +2 -111
- package/dist/domain/docs/require-example-language/fixes.js +4 -4
- package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/rule.js +9 -8
- package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/types.js +1 -1
- package/dist/domain/index.d.ts +1 -1
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +2 -2
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +8 -8
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +10 -9
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.operands.js +2 -5
- package/dist/domain/testing/aaa/analyzer.classification.helpers.js +14 -16
- package/dist/domain/testing/aaa/analyzer.classification.traversal.js +6 -4
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.super.js +10 -8
- package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
- package/dist/domain/testing/assert-actual-expected-names/rule.js +21 -23
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +2 -160
- package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts +41 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.js +161 -0
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +2 -2
- package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts +81 -0
- package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +181 -0
- package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/rule.js +28 -217
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +29 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +1 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +200 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +12 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +1 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +151 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +16 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +1 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +109 -0
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +1 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +18 -450
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +7 -4
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +7 -4
- package/dist/domain/testing/prefer-vi-mocked-import/fix.js +2 -2
- package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts +18 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +162 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +5 -4
- package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts +29 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +100 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match.js +5 -246
- package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/rule.js +18 -20
- package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-act-result-capture/rule.js +47 -21
- package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/rule.js +2 -4
- package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
- package/dist/domain/testing/single-act-statement/rule.js +20 -22
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
- package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
- package/dist/infrastructure/codeperfect-plugin.js +3 -2
- package/dist/infrastructure/presets.d.ts.map +1 -1
- package/dist/infrastructure/presets.js +3 -1
- package/package.json +60 -69
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts.map +0 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.js +0 -612
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts one unknown value into an indexable record.
|
|
3
|
+
* @param value Candidate value.
|
|
4
|
+
* @returns Record view when the value is object-like.
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const record = asRecord({ type: "Identifier" });
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
const asRecord = (value) => value !== null && typeof value === "object"
|
|
11
|
+
? value
|
|
12
|
+
: void 0;
|
|
13
|
+
/**
|
|
14
|
+
* Reads one array property from an object-like value.
|
|
15
|
+
* @param value Candidate object.
|
|
16
|
+
* @param key Lookup key used to read the property.
|
|
17
|
+
* @returns Array value when present.
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const items = readArrayProperty({ elements: [1, 2] }, "elements");
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
const readArrayProperty = (value, key) => {
|
|
24
|
+
const record = asRecord(value);
|
|
25
|
+
const property = record?.[key];
|
|
26
|
+
return Array.isArray(property) ? property : void 0;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Reads one string property from an object-like value.
|
|
30
|
+
* @param value Candidate object.
|
|
31
|
+
* @param key Lookup key used to read the property.
|
|
32
|
+
* @returns String value when present.
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const name = readStringProperty({ name: "feature" }, "name");
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
const readStringProperty = (value, key) => {
|
|
39
|
+
const record = asRecord(value);
|
|
40
|
+
const property = record?.[key];
|
|
41
|
+
return typeof property === "string" ? property : void 0;
|
|
42
|
+
};
|
|
43
|
+
export { asRecord, readArrayProperty, readStringProperty };
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtcmVjb3JkLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1leHBvcnRzL25vLXVudXNlZC1leHBvcnRzLXJlY29yZC11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBdUMsRUFBRSxDQUN2RSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDekMsQ0FBQyxDQUFFLEtBQWlDO0lBQ3BDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUViOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsS0FBYyxFQUNkLEdBQVcsRUFDWSxFQUFFO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixLQUFjLEVBQ2QsR0FBVyxFQUNTLEVBQUU7SUFDdEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udmVydHMgb25lIHVua25vd24gdmFsdWUgaW50byBhbiBpbmRleGFibGUgcmVjb3JkLlxuICogQHBhcmFtIHZhbHVlIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIFJlY29yZCB2aWV3IHdoZW4gdGhlIHZhbHVlIGlzIG9iamVjdC1saWtlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHsgdHlwZTogXCJJZGVudGlmaWVyXCIgfSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgYXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCJcbiAgICA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA6IHZvaWQgMDtcblxuLyoqXG4gKiBSZWFkcyBvbmUgYXJyYXkgcHJvcGVydHkgZnJvbSBhbiBvYmplY3QtbGlrZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBDYW5kaWRhdGUgb2JqZWN0LlxuICogQHBhcmFtIGtleSBMb29rdXAga2V5IHVzZWQgdG8gcmVhZCB0aGUgcHJvcGVydHkuXG4gKiBAcmV0dXJucyBBcnJheSB2YWx1ZSB3aGVuIHByZXNlbnQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaXRlbXMgPSByZWFkQXJyYXlQcm9wZXJ0eSh7IGVsZW1lbnRzOiBbMSwgMl0gfSwgXCJlbGVtZW50c1wiKTtcbiAqIGBgYFxuICovXG5jb25zdCByZWFkQXJyYXlQcm9wZXJ0eSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogc3RyaW5nLFxuKTogdW5kZWZpbmVkIHwgdW5rbm93bltdID0+IHtcbiAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQodmFsdWUpO1xuICBjb25zdCBwcm9wZXJ0eSA9IHJlY29yZD8uW2tleV07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb3BlcnR5KSA/IHByb3BlcnR5IDogdm9pZCAwO1xufTtcblxuLyoqXG4gKiBSZWFkcyBvbmUgc3RyaW5nIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0LWxpa2UgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgQ2FuZGlkYXRlIG9iamVjdC5cbiAqIEBwYXJhbSBrZXkgTG9va3VwIGtleSB1c2VkIHRvIHJlYWQgdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgU3RyaW5nIHZhbHVlIHdoZW4gcHJlc2VudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuYW1lID0gcmVhZFN0cmluZ1Byb3BlcnR5KHsgbmFtZTogXCJmZWF0dXJlXCIgfSwgXCJuYW1lXCIpO1xuICogYGBgXG4gKi9cbmNvbnN0IHJlYWRTdHJpbmdQcm9wZXJ0eSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQodmFsdWUpO1xuICBjb25zdCBwcm9wZXJ0eSA9IHJlY29yZD8uW2tleV07XG4gIHJldHVybiB0eXBlb2YgcHJvcGVydHkgPT09IFwic3RyaW5nXCIgPyBwcm9wZXJ0eSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCB7IGFzUmVjb3JkLCByZWFkQXJyYXlQcm9wZXJ0eSwgcmVhZFN0cmluZ1Byb3BlcnR5IH07XG4iXX0=
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes an absolute file path for safe equality checks.
|
|
4
|
+
* @param inputPath Candidate path.
|
|
5
|
+
* @returns Normalized absolute path suitable for cross-platform comparisons.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const comparable = toComparableAbsolutePath("/repo/src/feature.ts");
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
declare const toComparableAbsolutePath: (inputPath: string) => string;
|
|
12
|
+
/**
|
|
13
|
+
* Checks whether two symbols reference the same declaration site.
|
|
14
|
+
* @param left Left-hand symbol candidate.
|
|
15
|
+
* @param right Right-hand symbol candidate.
|
|
16
|
+
* @returns True when both symbols identify the same declaration.
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const same = isSameSymbol(left, right);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare const isSameSymbol: (left: ts.Symbol, right: ts.Symbol) => boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Resolves one symbol to its canonical target.
|
|
25
|
+
* @param symbol Candidate symbol.
|
|
26
|
+
* @param checker TypeScript checker.
|
|
27
|
+
* @returns Resolved canonical symbol.
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const resolved = resolveCanonicalSymbol(symbol, checker);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare const resolveCanonicalSymbol: (symbol: ts.Symbol, checker: ts.TypeChecker) => ts.Symbol;
|
|
34
|
+
/**
|
|
35
|
+
* Resolves one exported symbol by name from a source file.
|
|
36
|
+
* @param program TypeScript program.
|
|
37
|
+
* @param sourceFilename Source file path.
|
|
38
|
+
* @param exportedName Public name exposed by the module export list.
|
|
39
|
+
* @returns Symbol when found.
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const symbol = getExportedSymbol(program, sourceFilename, "feature");
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare const getExportedSymbol: (program: ts.Program, sourceFilename: string, exportedName: string) => ts.Symbol | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Checks whether one source file exports the target symbol.
|
|
48
|
+
* @param sourceFile Source file that may expose the symbol.
|
|
49
|
+
* @param checker TypeScript checker.
|
|
50
|
+
* @param targetSymbol Symbol being classified.
|
|
51
|
+
* @returns True when one module export resolves to the target symbol.
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const exposed = sourceFileExportsSymbol(sourceFile, checker, targetSymbol);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
declare const sourceFileExportsSymbol: (sourceFile: ts.SourceFile, checker: ts.TypeChecker, targetSymbol: ts.Symbol) => boolean;
|
|
58
|
+
export { getExportedSymbol, isSameSymbol, resolveCanonicalSymbol, sourceFileExportsSymbol, toComparableAbsolutePath, };
|
|
59
|
+
//# sourceMappingURL=no-unused-exports-symbol-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unused-exports-symbol-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC;;;;;;;;GAQG;AACH,QAAA,MAAM,wBAAwB,GAAI,WAAW,MAAM,KAAG,MAIrD,CAAC;AAsBF;;;;;;;;;GASG;AACH,QAAA,MAAM,YAAY,GAAI,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,KAAG,OAezD,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,sBAAsB,GAC1B,QAAQ,EAAE,CAAC,MAAM,EACjB,SAAS,EAAE,CAAC,WAAW,KACtB,EAAE,CAAC,MAUL,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,iBAAiB,GACrB,SAAS,EAAE,CAAC,OAAO,EACnB,gBAAgB,MAAM,EACtB,cAAc,MAAM,KACnB,EAAE,CAAC,MAAM,GAAG,SA6Bd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,uBAAuB,GAC3B,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,WAAW,EACvB,cAAc,EAAE,CAAC,MAAM,KACtB,OAgBF,CAAC;AAEF,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GACzB,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes an absolute file path for safe equality checks.
|
|
5
|
+
* @param inputPath Candidate path.
|
|
6
|
+
* @returns Normalized absolute path suitable for cross-platform comparisons.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const comparable = toComparableAbsolutePath("/repo/src/feature.ts");
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
const toComparableAbsolutePath = (inputPath) => {
|
|
13
|
+
const absolutePath = path.normalize(path.resolve(inputPath));
|
|
14
|
+
return absolutePath.toLowerCase();
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Builds declaration-site keys for symbol identity matching.
|
|
18
|
+
* @param symbol Symbol being compared.
|
|
19
|
+
* @returns Declaration keys describing where this symbol is declared.
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const keys = getDeclarationKeys(symbol);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
const getDeclarationKeys = (symbol) => {
|
|
26
|
+
const declarations = symbol.declarations ?? [];
|
|
27
|
+
return new Set(declarations.map((declaration) => {
|
|
28
|
+
const sourceFilename = declaration.getSourceFile().fileName;
|
|
29
|
+
return `${sourceFilename}:${String(declaration.pos)}:${String(declaration.end)}`;
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Checks whether two symbols reference the same declaration site.
|
|
34
|
+
* @param left Left-hand symbol candidate.
|
|
35
|
+
* @param right Right-hand symbol candidate.
|
|
36
|
+
* @returns True when both symbols identify the same declaration.
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const same = isSameSymbol(left, right);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
const isSameSymbol = (left, right) => {
|
|
43
|
+
if (left === right) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const leftKeys = getDeclarationKeys(left);
|
|
47
|
+
const rightKeys = getDeclarationKeys(right);
|
|
48
|
+
for (const key of leftKeys) {
|
|
49
|
+
if (rightKeys.has(key)) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Resolves one symbol to its canonical target.
|
|
57
|
+
* @param symbol Candidate symbol.
|
|
58
|
+
* @param checker TypeScript checker.
|
|
59
|
+
* @returns Resolved canonical symbol.
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const resolved = resolveCanonicalSymbol(symbol, checker);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
const resolveCanonicalSymbol = (symbol, checker) => {
|
|
66
|
+
if ((symbol.flags & ts.SymbolFlags.Alias) === 0) {
|
|
67
|
+
return symbol;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
return checker.getAliasedSymbol(symbol);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return symbol;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Resolves one exported symbol by name from a source file.
|
|
78
|
+
* @param program TypeScript program.
|
|
79
|
+
* @param sourceFilename Source file path.
|
|
80
|
+
* @param exportedName Public name exposed by the module export list.
|
|
81
|
+
* @returns Symbol when found.
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const symbol = getExportedSymbol(program, sourceFilename, "feature");
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
const getExportedSymbol = (program, sourceFilename, exportedName) => {
|
|
88
|
+
const checker = program.getTypeChecker();
|
|
89
|
+
const sourceFile = program
|
|
90
|
+
.getSourceFiles()
|
|
91
|
+
.find((file) => toComparableAbsolutePath(file.fileName) ===
|
|
92
|
+
toComparableAbsolutePath(sourceFilename));
|
|
93
|
+
if (sourceFile === void 0) {
|
|
94
|
+
return void 0;
|
|
95
|
+
}
|
|
96
|
+
const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
|
|
97
|
+
if (moduleSymbol === void 0) {
|
|
98
|
+
return void 0;
|
|
99
|
+
}
|
|
100
|
+
const exportedSymbol = checker
|
|
101
|
+
.getExportsOfModule(moduleSymbol)
|
|
102
|
+
.find((symbol) => symbol.getName() === exportedName);
|
|
103
|
+
if (exportedSymbol === void 0) {
|
|
104
|
+
return void 0;
|
|
105
|
+
}
|
|
106
|
+
return resolveCanonicalSymbol(exportedSymbol, checker);
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Checks whether one source file exports the target symbol.
|
|
110
|
+
* @param sourceFile Source file that may expose the symbol.
|
|
111
|
+
* @param checker TypeScript checker.
|
|
112
|
+
* @param targetSymbol Symbol being classified.
|
|
113
|
+
* @returns True when one module export resolves to the target symbol.
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const exposed = sourceFileExportsSymbol(sourceFile, checker, targetSymbol);
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
const sourceFileExportsSymbol = (sourceFile, checker, targetSymbol) => {
|
|
120
|
+
const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
|
|
121
|
+
if (moduleSymbol === void 0) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
for (const exportedSymbol of checker.getExportsOfModule(moduleSymbol)) {
|
|
125
|
+
const resolvedSymbol = resolveCanonicalSymbol(exportedSymbol, checker);
|
|
126
|
+
if (isSameSymbol(resolvedSymbol, targetSymbol)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
};
|
|
132
|
+
export { getExportedSymbol, isSameSymbol, resolveCanonicalSymbol, sourceFileExportsSymbol, toComparableAbsolutePath, };
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1leHBvcnRzL25vLXVudXNlZC1leHBvcnRzLXN5bWJvbC11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFNBQWlCLEVBQVUsRUFBRTtJQUM3RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUU3RCxPQUFPLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFpQixFQUFlLEVBQUU7SUFDNUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7SUFFL0MsT0FBTyxJQUFJLEdBQUcsQ0FDWixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7UUFDL0IsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUM1RCxPQUFPLEdBQUcsY0FBYyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ25GLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQWUsRUFBRSxLQUFnQixF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Y0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2Qix3QkFBd0IsR0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiBhYnNvbHV0ZSBmaWxlIHBhdGggZm9yIHNhZmUgZXF1YWxpdHkgY2hlY2tzLlxuICogQHBhcmFtIGlucHV0UGF0aCBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgYWJzb2x1dGUgcGF0aCBzdWl0YWJsZSBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGFyaXNvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGFyYWJsZSA9IHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aChcIi9yZXBvL3NyYy9mZWF0dXJlLnRzXCIpO1xuICogYGBgXG4gKi9cbmNvbnN0IHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aCA9IChpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgubm9ybWFsaXplKHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpKTtcblxuICByZXR1cm4gYWJzb2x1dGVQYXRoLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBkZWNsYXJhdGlvbi1zaXRlIGtleXMgZm9yIHN5bWJvbCBpZGVudGl0eSBtYXRjaGluZy5cbiAqIEBwYXJhbSBzeW1ib2wgU3ltYm9sIGJlaW5nIGNvbXBhcmVkLlxuICogQHJldHVybnMgRGVjbGFyYXRpb24ga2V5cyBkZXNjcmliaW5nIHdoZXJlIHRoaXMgc3ltYm9sIGlzIGRlY2xhcmVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMgPSBnZXREZWNsYXJhdGlvbktleXMoc3ltYm9sKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXREZWNsYXJhdGlvbktleXMgPSAoc3ltYm9sOiB0cy5TeW1ib2wpOiBTZXQ8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW107XG5cbiAgcmV0dXJuIG5ldyBTZXQoXG4gICAgZGVjbGFyYXRpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVuYW1lID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lO1xuICAgICAgcmV0dXJuIGAke3NvdXJjZUZpbGVuYW1lfToke1N0cmluZyhkZWNsYXJhdGlvbi5wb3MpfToke1N0cmluZyhkZWNsYXJhdGlvbi5lbmQpfWA7XG4gICAgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHR3byBzeW1ib2xzIHJlZmVyZW5jZSB0aGUgc2FtZSBkZWNsYXJhdGlvbiBzaXRlLlxuICogQHBhcmFtIGxlZnQgTGVmdC1oYW5kIHN5bWJvbCBjYW5kaWRhdGUuXG4gKiBAcGFyYW0gcmlnaHQgUmlnaHQtaGFuZCBzeW1ib2wgY2FuZGlkYXRlLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGJvdGggc3ltYm9scyBpZGVudGlmeSB0aGUgc2FtZSBkZWNsYXJhdGlvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzYW1lID0gaXNTYW1lU3ltYm9sKGxlZnQsIHJpZ2h0KTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1NhbWVTeW1ib2wgPSAobGVmdDogdHMuU3ltYm9sLCByaWdodDogdHMuU3ltYm9sKTogYm9vbGVhbiA9PiB7XG4gIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbGVmdEtleXMgPSBnZXREZWNsYXJhdGlvbktleXMobGVmdCk7XG4gIGNvbnN0IHJpZ2h0S2V5cyA9IGdldERlY2xhcmF0aW9uS2V5cyhyaWdodCk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgbGVmdEtleXMpIHtcbiAgICBpZiAocmlnaHRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBzeW1ib2wgdG8gaXRzIGNhbm9uaWNhbCB0YXJnZXQuXG4gKiBAcGFyYW0gc3ltYm9sIENhbmRpZGF0ZSBzeW1ib2wuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IGNoZWNrZXIuXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBjYW5vbmljYWwgc3ltYm9sLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChzeW1ib2wsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IHJlc29sdmVDYW5vbmljYWxTeW1ib2wgPSAoXG4gIHN5bWJvbDogdHMuU3ltYm9sLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IHRzLlN5bWJvbCA9PiB7XG4gIGlmICgoc3ltYm9sLmZsYWdzICYgdHMuU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwKSB7XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNoZWNrZXIuZ2V0QWxpYXNlZFN5bWJvbChzeW1ib2wpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBleHBvcnRlZCBzeW1ib2wgYnkgbmFtZSBmcm9tIGEgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gcHJvZ3JhbSBUeXBlU2NyaXB0IHByb2dyYW0uXG4gKiBAcGFyYW0gc291cmNlRmlsZW5hbWUgU291cmNlIGZpbGUgcGF0aC5cbiAqIEBwYXJhbSBleHBvcnRlZE5hbWUgUHVibGljIG5hbWUgZXhwb3NlZCBieSB0aGUgbW9kdWxlIGV4cG9ydCBsaXN0LlxuICogQHJldHVybnMgU3ltYm9sIHdoZW4gZm91bmQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3ltYm9sID0gZ2V0RXhwb3J0ZWRTeW1ib2wocHJvZ3JhbSwgc291cmNlRmlsZW5hbWUsIFwiZmVhdHVyZVwiKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRFeHBvcnRlZFN5bWJvbCA9IChcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgc291cmNlRmlsZW5hbWU6IHN0cmluZyxcbiAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG4pOiB0cy5TeW1ib2wgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBjaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbVxuICAgIC5nZXRTb3VyY2VGaWxlcygpXG4gICAgLmZpbmQoXG4gICAgICAoZmlsZSkgPT5cbiAgICAgICAgdG9Db21wYXJhYmxlQWJzb2x1dGVQYXRoKGZpbGUuZmlsZU5hbWUpID09PVxuICAgICAgICB0b0NvbXBhcmFibGVBYnNvbHV0ZVBhdGgoc291cmNlRmlsZW5hbWUpLFxuICAgICk7XG5cbiAgaWYgKHNvdXJjZUZpbGUgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBtb2R1bGVTeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oc291cmNlRmlsZSk7XG5cbiAgaWYgKG1vZHVsZVN5bWJvbCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IGV4cG9ydGVkU3ltYm9sID0gY2hlY2tlclxuICAgIC5nZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlU3ltYm9sKVxuICAgIC5maW5kKChzeW1ib2wpID0+IHN5bWJvbC5nZXROYW1lKCkgPT09IGV4cG9ydGVkTmFtZSk7XG5cbiAgaWYgKGV4cG9ydGVkU3ltYm9sID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVDYW5vbmljYWxTeW1ib2woZXhwb3J0ZWRTeW1ib2wsIGNoZWNrZXIpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBvbmUgc291cmNlIGZpbGUgZXhwb3J0cyB0aGUgdGFyZ2V0IHN5bWJvbC5cbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRoYXQgbWF5IGV4cG9zZSB0aGUgc3ltYm9sLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCBjaGVja2VyLlxuICogQHBhcmFtIHRhcmdldFN5bWJvbCBTeW1ib2wgYmVpbmcgY2xhc3NpZmllZC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBvbmUgbW9kdWxlIGV4cG9ydCByZXNvbHZlcyB0byB0aGUgdGFyZ2V0IHN5bWJvbC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleHBvc2VkID0gc291cmNlRmlsZUV4cG9ydHNTeW1ib2woc291cmNlRmlsZSwgY2hlY2tlciwgdGFyZ2V0U3ltYm9sKTtcbiAqIGBgYFxuICovXG5jb25zdCBzb3VyY2VGaWxlRXhwb3J0c1N5bWJvbCA9IChcbiAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIHRhcmdldFN5bWJvbDogdHMuU3ltYm9sLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG1vZHVsZVN5bWJvbCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihzb3VyY2VGaWxlKTtcblxuICBpZiAobW9kdWxlU3ltYm9sID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGV4cG9ydGVkU3ltYm9sIG9mIGNoZWNrZXIuZ2V0RXhwb3J0c09mTW9kdWxlKG1vZHVsZVN5bWJvbCkpIHtcbiAgICBjb25zdCByZXNvbHZlZFN5bWJvbCA9IHJlc29sdmVDYW5vbmljYWxTeW1ib2woZXhwb3J0ZWRTeW1ib2wsIGNoZWNrZXIpO1xuXG4gICAgaWYgKGlzU2FtZVN5bWJvbChyZXNvbHZlZFN5bWJvbCwgdGFyZ2V0U3ltYm9sKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IHtcbiAgZ2V0RXhwb3J0ZWRTeW1ib2wsXG4gIGlzU2FtZVN5bWJvbCxcbiAgcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbCxcbiAgc291cmNlRmlsZUV4cG9ydHNTeW1ib2wsXG4gIHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aCxcbn07XG4iXX0=
|
|
@@ -1,26 +1,5 @@
|
|
|
1
|
-
import type { AST, Rule } from "eslint";
|
|
2
1
|
import * as ts from "typescript";
|
|
3
2
|
import type { ExportedElement, ExportUsage, NoUnusedExportsState } from "./types.js";
|
|
4
|
-
/**
|
|
5
|
-
* Resolves TypeScript parser services program when available.
|
|
6
|
-
* @param context Rule context.
|
|
7
|
-
* @returns TypeScript program when available.
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* const program = getTypeScriptProgram(context);
|
|
11
|
-
* ```
|
|
12
|
-
*/
|
|
13
|
-
declare const getTypeScriptProgram: (context: Rule.RuleContext) => ts.Program | undefined;
|
|
14
|
-
/**
|
|
15
|
-
* Collects exported elements from one program body.
|
|
16
|
-
* @param body Program body statements.
|
|
17
|
-
* @returns Exported elements in declaration order.
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* const exported = collectExportedElements(program.body);
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
declare const collectExportedElements: (body: AST.Program["body"]) => ExportedElement[];
|
|
24
3
|
/**
|
|
25
4
|
* Collects concrete usages of one exported element across the program.
|
|
26
5
|
* @param program TypeScript program.
|
|
@@ -45,5 +24,5 @@ declare const collectCrossFileUsages: (program: ts.Program, sourceFilename: stri
|
|
|
45
24
|
* ```
|
|
46
25
|
*/
|
|
47
26
|
declare const classifyExportUsage: (usages: ExportUsage[]) => "production" | "test-only" | "unused";
|
|
48
|
-
export { classifyExportUsage, collectCrossFileUsages
|
|
49
|
-
//# sourceMappingURL=no-unused-exports-utilities.d.ts.map
|
|
27
|
+
export { classifyExportUsage, collectCrossFileUsages };
|
|
28
|
+
//# sourceMappingURL=no-unused-exports-usage-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unused-exports-usage-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAuEjB;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,sBAAsB,GAC1B,SAAS,EAAE,CAAC,OAAO,EACnB,gBAAgB,MAAM,EACtB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,iBAAiB,eAAe,KAC/B,WAAW,EAoDb,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,mBAAmB,GACvB,QAAQ,WAAW,EAAE,KACpB,YAAY,GAAG,WAAW,GAAG,QAY/B,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { isConcreteUsageIdentifier } from "./no-unused-exports-identifier-utilities.js";
|
|
4
|
+
import { isTestFile } from "./no-unused-exports-options.js";
|
|
5
|
+
import { collectPublicApiExposureUsages } from "./no-unused-exports-public-api-usage-utilities.js";
|
|
6
|
+
import { getExportedSymbol, isSameSymbol, resolveCanonicalSymbol, toComparableAbsolutePath, } from "./no-unused-exports-symbol-utilities.js";
|
|
7
|
+
/**
|
|
8
|
+
* Appends concrete usages from one source file into the accumulator.
|
|
9
|
+
* @param sourceFile Source file to scan.
|
|
10
|
+
* @param checker TypeScript checker.
|
|
11
|
+
* @param targetSymbol Export symbol being classified.
|
|
12
|
+
* @param exportedElement Export metadata.
|
|
13
|
+
* @param consumerIsTestFile Whether source file is a test file.
|
|
14
|
+
* @param usages Mutable usage accumulator.
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* collectConcreteUsagesFromSourceFile(sourceFile, checker, targetSymbolKey, exportedElement, false, usages);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
const collectConcreteUsagesFromSourceFile = (sourceFile, checker, targetSymbol, exportedElement, consumerIsTestFile, usages) => {
|
|
21
|
+
const visitNode = (node) => {
|
|
22
|
+
if (!ts.isIdentifier(node)) {
|
|
23
|
+
ts.forEachChild(node, visitNode);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!isConcreteUsageIdentifier(node, exportedElement.exportKind)) {
|
|
27
|
+
ts.forEachChild(node, visitNode);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const isShorthandName = ts.isShorthandPropertyAssignment(node.parent) &&
|
|
31
|
+
node.parent.name === node;
|
|
32
|
+
const candidateSymbol = isShorthandName
|
|
33
|
+
? checker.getShorthandAssignmentValueSymbol(node.parent)
|
|
34
|
+
: checker.getSymbolAtLocation(node);
|
|
35
|
+
if (candidateSymbol === void 0) {
|
|
36
|
+
ts.forEachChild(node, visitNode);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const resolvedSymbol = resolveCanonicalSymbol(candidateSymbol, checker);
|
|
40
|
+
if (!isSameSymbol(resolvedSymbol, targetSymbol)) {
|
|
41
|
+
ts.forEachChild(node, visitNode);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
usages.push({ isTestFile: consumerIsTestFile });
|
|
45
|
+
ts.forEachChild(node, visitNode);
|
|
46
|
+
};
|
|
47
|
+
visitNode(sourceFile);
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Collects concrete usages of one exported element across the program.
|
|
51
|
+
* @param program TypeScript program.
|
|
52
|
+
* @param sourceFilename Source filename where export is defined.
|
|
53
|
+
* @param state Normalized rule options.
|
|
54
|
+
* @param repoRoot Absolute repository root used for test-file classification.
|
|
55
|
+
* @param exportedElement Exported element to classify.
|
|
56
|
+
* @returns Concrete usages for the exported element.
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const usages = collectCrossFileUsages(program, "/repo/src/feature.ts", state, "/repo", exportedElement);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
const collectCrossFileUsages = (program, sourceFilename, state, repoRoot, exportedElement) => {
|
|
63
|
+
const checker = program.getTypeChecker();
|
|
64
|
+
const targetSymbol = getExportedSymbol(program, sourceFilename, exportedElement.exportedName);
|
|
65
|
+
if (targetSymbol === void 0) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const normalizedSourceFilename = toComparableAbsolutePath(sourceFilename);
|
|
69
|
+
const normalizedRepoRoot = path.resolve(repoRoot);
|
|
70
|
+
const usages = collectPublicApiExposureUsages(program, sourceFilename, state, repoRoot, targetSymbol);
|
|
71
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
72
|
+
if (sourceFile.isDeclarationFile) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const consumerFilename = path.resolve(sourceFile.fileName);
|
|
76
|
+
const normalizedConsumerFilename = toComparableAbsolutePath(consumerFilename);
|
|
77
|
+
if (normalizedConsumerFilename === normalizedSourceFilename) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const isConsumerTestFile = isTestFile(consumerFilename, state, normalizedRepoRoot);
|
|
81
|
+
collectConcreteUsagesFromSourceFile(sourceFile, checker, targetSymbol, exportedElement, isConsumerTestFile, usages);
|
|
82
|
+
}
|
|
83
|
+
return usages;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Classifies one exported name based on cross-file usages.
|
|
87
|
+
* @param usages Collected usages.
|
|
88
|
+
* @returns Classification label.
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const classification = classifyExportUsage("feature", usages);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
const classifyExportUsage = (usages) => {
|
|
95
|
+
if (usages.length === 0) {
|
|
96
|
+
return "unused";
|
|
97
|
+
}
|
|
98
|
+
for (const usage of usages) {
|
|
99
|
+
if (!usage.isTestFile) {
|
|
100
|
+
return "production";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return "test-only";
|
|
104
|
+
};
|
|
105
|
+
export { classifyExportUsage, collectCrossFileUsages };
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtdXNhZ2UtdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtdXNhZ2UtdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQVFqQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDaEcsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLHdCQUF3QixHQUN6QixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sbUNBQW1DLEdBQUcsQ0FDMUMsVUFBeUIsRUFDekIsT0FBdUIsRUFDdkIsWUFBdUIsRUFDdkIsZUFBZ0MsRUFDaEMsa0JBQTJCLEVBQzNCLE1BQXFCLEVBQ2YsRUFBRTtJQUNSLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBYSxFQUFRLEVBQUU7UUFDeEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDakUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFD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a0IsRUFBRTtJQUN6QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUge1xuICBFeHBvcnRlZEVsZW1lbnQsXG4gIEV4cG9ydFVzYWdlLFxuICBOb1VudXNlZEV4cG9ydHNTdGF0ZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgaXNDb25jcmV0ZVVzYWdlSWRlbnRpZmllciB9IGZyb20gXCIuL25vLXVudXNlZC1leHBvcnRzLWlkZW50aWZpZXItdXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBpc1Rlc3RGaWxlIH0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtb3B0aW9uc1wiO1xuaW1wb3J0IHsgY29sbGVjdFB1YmxpY0FwaUV4cG9zdXJlVXNhZ2VzIH0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtcHVibGljLWFwaS11c2FnZS11dGlsaXRpZXNcIjtcbmltcG9ydCB7XG4gIGdldEV4cG9ydGVkU3ltYm9sLFxuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG4gIHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aCxcbn0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuXG4vKipcbiAqIEFwcGVuZHMgY29uY3JldGUgdXNhZ2VzIGZyb20gb25lIHNvdXJjZSBmaWxlIGludG8gdGhlIGFjY3VtdWxhdG9yLlxuICogQHBhcmFtIHNvdXJjZUZpbGUgU291cmNlIGZpbGUgdG8gc2Nhbi5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgY2hlY2tlci5cbiAqIEBwYXJhbSB0YXJnZXRTeW1ib2wgRXhwb3J0IHN5bWJvbCBiZWluZyBjbGFzc2lmaWVkLlxuICogQHBhcmFtIGV4cG9ydGVkRWxlbWVudCBFeHBvcnQgbWV0YWRhdGEuXG4gKiBAcGFyYW0gY29uc3VtZXJJc1Rlc3RGaWxlIFdoZXRoZXIgc291cmNlIGZpbGUgaXMgYSB0ZXN0IGZpbGUuXG4gKiBAcGFyYW0gdXNhZ2VzIE11dGFibGUgdXNhZ2UgYWNjdW11bGF0b3IuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29sbGVjdENvbmNyZXRlVXNhZ2VzRnJvbVNvdXJjZUZpbGUoc291cmNlRmlsZSwgY2hlY2tlciwgdGFyZ2V0U3ltYm9sS2V5LCBleHBvcnRlZEVsZW1lbnQsIGZhbHNlLCB1c2FnZXMpO1xuICogYGBgXG4gKi9cbmNvbnN0IGNvbGxlY3RDb25jcmV0ZVVzYWdlc0Zyb21Tb3VyY2VGaWxlID0gKFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgdGFyZ2V0U3ltYm9sOiB0cy5TeW1ib2wsXG4gIGV4cG9ydGVkRWxlbWVudDogRXhwb3J0ZWRFbGVtZW50LFxuICBjb25zdW1lcklzVGVzdEZpbGU6IGJvb2xlYW4sXG4gIHVzYWdlczogRXhwb3J0VXNhZ2VbXSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCB2aXNpdE5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXROb2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29uY3JldGVVc2FnZUlkZW50aWZpZXIobm9kZSwgZXhwb3J0ZWRFbGVtZW50LmV4cG9ydEtpbmQpKSB7XG4gICAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXROb2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1Nob3J0aGFuZE5hbWUgPVxuICAgICAgdHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQobm9kZS5wYXJlbnQpICYmXG4gICAgICBub2RlLnBhcmVudC5uYW1lID09PSBub2RlO1xuXG4gICAgY29uc3QgY2FuZGlkYXRlU3ltYm9sID0gaXNTaG9ydGhhbmROYW1lXG4gICAgICA/IGNoZWNrZXIuZ2V0U2hvcnRoYW5kQXNzaWdubWVudFZhbHVlU3ltYm9sKG5vZGUucGFyZW50KVxuICAgICAgOiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG5cbiAgICBpZiAoY2FuZGlkYXRlU3ltYm9sID09PSB2b2lkIDApIHtcbiAgICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3ltYm9sID0gcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChjYW5kaWRhdGVTeW1ib2wsIGNoZWNrZXIpO1xuXG4gICAgaWYgKCFpc1NhbWVTeW1ib2wocmVzb2x2ZWRTeW1ib2wsIHRhcmdldFN5bWJvbCkpIHtcbiAgICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVzYWdlcy5wdXNoKHsgaXNUZXN0RmlsZTogY29uc3VtZXJJc1Rlc3RGaWxlIH0pO1xuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUpO1xuICB9O1xuXG4gIHZpc2l0Tm9kZShzb3VyY2VGaWxlKTtcbn07XG5cbi8qKlxuICogQ29sbGVjdHMgY29uY3JldGUgdXNhZ2VzIG9mIG9uZSBleHBvcnRlZCBlbGVtZW50IGFjcm9zcyB0aGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvZ3JhbS5cbiAqIEBwYXJhbSBzb3VyY2VGaWxlbmFtZSBTb3VyY2UgZmlsZW5hbWUgd2hlcmUgZXhwb3J0IGlzIGRlZmluZWQuXG4gKiBAcGFyYW0gc3RhdGUgTm9ybWFsaXplZCBydWxlIG9wdGlvbnMuXG4gKiBAcGFyYW0gcmVwb1Jvb3QgQWJzb2x1dGUgcmVwb3NpdG9yeSByb290IHVzZWQgZm9yIHRlc3QtZmlsZSBjbGFzc2lmaWNhdGlvbi5cbiAqIEBwYXJhbSBleHBvcnRlZEVsZW1lbnQgRXhwb3J0ZWQgZWxlbWVudCB0byBjbGFzc2lmeS5cbiAqIEByZXR1cm5zIENvbmNyZXRlIHVzYWdlcyBmb3IgdGhlIGV4cG9ydGVkIGVsZW1lbnQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXNhZ2VzID0gY29sbGVjdENyb3NzRmlsZVVzYWdlcyhwcm9ncmFtLCBcIi9yZXBvL3NyYy9mZWF0dXJlLnRzXCIsIHN0YXRlLCBcIi9yZXBvXCIsIGV4cG9ydGVkRWxlbWVudCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgY29sbGVjdENyb3NzRmlsZVVzYWdlcyA9IChcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgc291cmNlRmlsZW5hbWU6IHN0cmluZyxcbiAgc3RhdGU6IE5vVW51c2VkRXhwb3J0c1N0YXRlLFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBleHBvcnRlZEVsZW1lbnQ6IEV4cG9ydGVkRWxlbWVudCxcbik6IEV4cG9ydFVzYWdlW10gPT4ge1xuICBjb25zdCBjaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCB0YXJnZXRTeW1ib2wgPSBnZXRFeHBvcnRlZFN5bWJvbChcbiAgICBwcm9ncmFtLFxuICAgIHNvdXJjZUZpbGVuYW1lLFxuICAgIGV4cG9ydGVkRWxlbWVudC5leHBvcnRlZE5hbWUsXG4gICk7XG5cbiAgaWYgKHRhcmdldFN5bWJvbCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFNvdXJjZUZpbGVuYW1lID0gdG9Db21wYXJhYmxlQWJzb2x1dGVQYXRoKHNvdXJjZUZpbGVuYW1lKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9Sb290ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290KTtcbiAgY29uc3QgdXNhZ2VzOiBFeHBvcnRVc2FnZVtdID0gY29sbGVjdFB1YmxpY0FwaUV4cG9zdXJlVXNhZ2VzKFxuICAgIHByb2dyYW0sXG4gICAgc291cmNlRmlsZW5hbWUsXG4gICAgc3RhdGUsXG4gICAgcmVwb1Jvb3QsXG4gICAgdGFyZ2V0U3ltYm9sLFxuICApO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc3VtZXJGaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICBjb25zdCBub3JtYWxpemVkQ29uc3VtZXJGaWxlbmFtZSA9XG4gICAgICB0b0NvbXBhcmFibGVBYnNvbHV0ZVBhdGgoY29uc3VtZXJGaWxlbmFtZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZENvbnN1bWVyRmlsZW5hbWUgPT09IG5vcm1hbGl6ZWRTb3VyY2VGaWxlbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDb25zdW1lclRlc3RGaWxlID0gaXNUZXN0RmlsZShcbiAgICAgIGNvbnN1bWVyRmlsZW5hbWUsXG4gICAgICBzdGF0ZSxcbiAgICAgIG5vcm1hbGl6ZWRSZXBvUm9vdCxcbiAgICApO1xuXG4gICAgY29sbGVjdENvbmNyZXRlVXNhZ2VzRnJvbVNvdXJjZUZpbGUoXG4gICAgICBzb3VyY2VGaWxlLFxuICAgICAgY2hlY2tlcixcbiAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgIGV4cG9ydGVkRWxlbWVudCxcbiAgICAgIGlzQ29uc3VtZXJUZXN0RmlsZSxcbiAgICAgIHVzYWdlcyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHVzYWdlcztcbn07XG5cbi8qKlxuICogQ2xhc3NpZmllcyBvbmUgZXhwb3J0ZWQgbmFtZSBiYXNlZCBvbiBjcm9zcy1maWxlIHVzYWdlcy5cbiAqIEBwYXJhbSB1c2FnZXMgQ29sbGVjdGVkIHVzYWdlcy5cbiAqIEByZXR1cm5zIENsYXNzaWZpY2F0aW9uIGxhYmVsLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsYXNzaWZpY2F0aW9uID0gY2xhc3NpZnlFeHBvcnRVc2FnZShcImZlYXR1cmVcIiwgdXNhZ2VzKTtcbiAqIGBgYFxuICovXG5jb25zdCBjbGFzc2lmeUV4cG9ydFVzYWdlID0gKFxuICB1c2FnZXM6IEV4cG9ydFVzYWdlW10sXG4pOiBcInByb2R1Y3Rpb25cIiB8IFwidGVzdC1vbmx5XCIgfCBcInVudXNlZFwiID0+IHtcbiAgaWYgKHVzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJ1bnVzZWRcIjtcbiAgfVxuXG4gIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgaWYgKCF1c2FnZS5pc1Rlc3RGaWxlKSB7XG4gICAgICByZXR1cm4gXCJwcm9kdWN0aW9uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFwidGVzdC1vbmx5XCI7XG59O1xuXG5leHBvcnQgeyBjbGFzc2lmeUV4cG9ydFVzYWdlLCBjb2xsZWN0Q3Jvc3NGaWxlVXNhZ2VzIH07XG4iXX0=
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
import { collectExportedElements } from "./no-unused-exports-declaration-utilities.js";
|
|
3
|
+
import { getTypeScriptProgram } from "./no-unused-exports-identifier-utilities.js";
|
|
2
4
|
import { DEFAULT_PUBLIC_API_FILES, DEFAULT_TEST_FILE_PATTERNS, getOptions, isLintableFilename, isPublicApiFile, } from "./no-unused-exports-options.js";
|
|
3
|
-
import { classifyExportUsage, collectCrossFileUsages,
|
|
5
|
+
import { classifyExportUsage, collectCrossFileUsages, } from "./no-unused-exports-usage-utilities.js";
|
|
4
6
|
/** ESLint rule flagging exports unused in production code. */
|
|
5
7
|
const noUnusedExportsRule = {
|
|
6
8
|
create(context) {
|
|
@@ -79,4 +81,4 @@ const noUnusedExportsRule = {
|
|
|
79
81
|
},
|
|
80
82
|
};
|
|
81
83
|
export { noUnusedExportsRule };
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1leHBvcnRzL3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBRTdCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLFVBQVUsRUFDVixrQkFBa0IsRUFDbEIsZUFBZSxHQUNoQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOERBQThEO0FBQzlELE1BQU0sbUJBQW1CLEdBQW9CO0lBQzNDLE1BQU0sQ0FBQyxPQUF5QjtRQUM5QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUMsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLENBQUMsSUFBSTtnQkFDVixNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFNUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2xDLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQzdDLHNCQUFzQixDQUNwQixPQUFPLEVBQ1AsUUFBUSxFQUNSLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxDQUNSLENBQ0YsQ0FBQztvQkFFRixJQUFJLG1CQUFtQixLQUFLLFlBQVksRUFBRSxDQUFDO3dCQUN6QyxTQUFTO29CQUNYLENBQUM7b0JBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDYixJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDNUMsU0FBUyxFQUNQLG1CQUFtQixLQUFLLFdBQVc7NEJBQ2pDLENBQUMsQ0FBQyxpQkFBaUI7NEJBQ25CLENBQUMsQ0FBQyxjQUFjO3dCQUNwQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7cUJBQ25CLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxFQUFFO1FBQ0osY0FBYyxFQUFFO1lBQ2Q7Z0JBQ0UsY0FBYyxFQUFFLENBQUMsR0FBRyx3QkFBd0IsQ0FBQztnQkFDN0MsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLDBCQUEwQixDQUFDO2FBQ2xEO1NBQ0Y7UUFDRCxJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1Qsa0VBQWtFO1lBQ3BFLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLEdBQUcsRUFBRSxvRkFBb0Y7U0FDMUY7UUFDRCxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQ1YsaUhBQWlIO1lBQ25ILGVBQWUsRUFDYixnSEFBZ0g7U0FDbkg7UUFDRCxNQUFNLEVBQUU7WUFDTjtnQkFDRSxvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixVQUFVLEVBQUU7b0JBQ1YsY0FBYyxFQUFFO3dCQUNkLFdBQVcsRUFBRSxvREFBb0Q7d0JBQ2pFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQ3pCLFFBQVEsRUFBRSxDQUFDO3dCQUNYLElBQUksRUFBRSxPQUFPO3FCQUNkO29CQUNELGdCQUFnQixFQUFFO3dCQUNoQixXQUFXLEVBQ1QsZ0VBQWdFO3dCQUNsRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO3dCQUN6QixRQUFRLEVBQUUsQ0FBQzt3QkFDWCxJQUFJLEVBQUUsT0FBTztxQkFDZDtpQkFDRjtnQkFDRCxJQUFJLEVBQUUsUUFBUTthQUNmO1NBQ0Y7UUFDRCxJQUFJLEVBQUUsU0FBUztLQUNoQjtDQUNGLENBQUM7QUFFRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBjb2xsZWN0RXhwb3J0ZWRFbGVtZW50cyB9IGZyb20gXCIuL25vLXVudXNlZC1leHBvcnRzLWRlY2xhcmF0aW9uLXV0aWxpdGllc1wiO1xuaW1wb3J0IHsgZ2V0VHlwZVNjcmlwdFByb2dyYW0gfSBmcm9tIFwiLi9uby11bnVzZWQtZXhwb3J0cy1pZGVudGlmaWVyLXV0aWxpdGllc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9QVUJMSUNfQVBJX0ZJTEVTLFxuICBERUZBVUxUX1RFU1RfRklMRV9QQVRURVJOUyxcbiAgZ2V0T3B0aW9ucyxcbiAgaXNMaW50YWJsZUZpbGVuYW1lLFxuICBpc1B1YmxpY0FwaUZpbGUsXG59IGZyb20gXCIuL25vLXVudXNlZC1leHBvcnRzLW9wdGlvbnNcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5RXhwb3J0VXNhZ2UsXG4gIGNvbGxlY3RDcm9zc0ZpbGVVc2FnZXMsXG59IGZyb20gXCIuL25vLXVudXNlZC1leHBvcnRzLXVzYWdlLXV0aWxpdGllc1wiO1xuXG4vKiogRVNMaW50IHJ1bGUgZmxhZ2dpbmcgZXhwb3J0cyB1bnVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiAqL1xuY29uc3Qgbm9VbnVzZWRFeHBvcnRzUnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgICBjb25zdCBzdGF0ZSA9IGdldE9wdGlvbnMoY29udGV4dC5vcHRpb25zKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGNvbnRleHQuZmlsZW5hbWU7XG5cbiAgICBpZiAoIWlzTGludGFibGVGaWxlbmFtZShmaWxlbmFtZSkpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmFtID0gZ2V0VHlwZVNjcmlwdFByb2dyYW0oY29udGV4dCk7XG5cbiAgICBpZiAocHJvZ3JhbSA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBwYXRoLnJlc29sdmUocHJvZ3JhbS5nZXRDdXJyZW50RGlyZWN0b3J5KCkpO1xuXG4gICAgaWYgKGlzUHVibGljQXBpRmlsZShmaWxlbmFtZSwgc3RhdGUsIHByb2plY3RSb290KSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBQcm9ncmFtKG5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwb3J0ZWRFbGVtZW50cyA9IGNvbGxlY3RFeHBvcnRlZEVsZW1lbnRzKG5vZGUuYm9keSk7XG5cbiAgICAgICAgaWYgKGV4cG9ydGVkRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGV4cG9ydGVkRWxlbWVudHMpIHtcbiAgICAgICAgICBjb25zdCB1c2FnZUNsYXNzaWZpY2F0aW9uID0gY2xhc3NpZnlFeHBvcnRVc2FnZShcbiAgICAgICAgICAgIGNvbGxlY3RDcm9zc0ZpbGVVc2FnZXMoXG4gICAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodXNhZ2VDbGFzc2lmaWNhdGlvbiA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHsgZXhwb3J0ZWROYW1lOiBlbGVtZW50LmV4cG9ydGVkTmFtZSB9LFxuICAgICAgICAgICAgbWVzc2FnZUlkOlxuICAgICAgICAgICAgICB1c2FnZUNsYXNzaWZpY2F0aW9uID09PSBcInRlc3Qtb25seVwiXG4gICAgICAgICAgICAgICAgPyBcInVzZWRPbmx5SW5UZXN0c1wiXG4gICAgICAgICAgICAgICAgOiBcInVudXNlZEV4cG9ydFwiLFxuICAgICAgICAgICAgbm9kZTogZWxlbWVudC5ub2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkZWZhdWx0T3B0aW9uczogW1xuICAgICAge1xuICAgICAgICBwdWJsaWNBcGlGaWxlczogWy4uLkRFRkFVTFRfUFVCTElDX0FQSV9GSUxFU10sXG4gICAgICAgIHRlc3RGaWxlUGF0dGVybnM6IFsuLi5ERUZBVUxUX1RFU1RfRklMRV9QQVRURVJOU10sXG4gICAgICB9LFxuICAgIF0sXG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRGlzYWxsb3cgZXhwb3J0cyB0aGF0IGFyZSB1bnVzZWQgb3IgY29uc3VtZWQgb25seSBieSB0ZXN0IGZpbGVzLlwiLFxuICAgICAgcmVjb21tZW5kZWQ6IGZhbHNlLFxuICAgICAgdXJsOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9wYXJsb3RpL2VzbGludC1wbHVnaW4vYmxvYi9tYWluL2RvY3MvcnVsZXMvbm8tdW51c2VkLWV4cG9ydHMubWRcIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICB1bnVzZWRFeHBvcnQ6XG4gICAgICAgIFwiRXhwb3J0ICd7e2V4cG9ydGVkTmFtZX19JyBpcyBuZXZlciBjb25zdW1lZCBieSBhbnkgZmlsZSBpbiB0aGUgcHJvamVjdDsgbWFrZSBpdCBwcml2YXRlIGJ5IHJlbW92aW5nIHRoZSBleHBvcnQuXCIsXG4gICAgICB1c2VkT25seUluVGVzdHM6XG4gICAgICAgIFwiRXhwb3J0ICd7e2V4cG9ydGVkTmFtZX19JyBpcyBjb25zdW1lZCBvbmx5IGJ5IHRlc3QgZmlsZXM7IG1vdmUgaXQgdG8gdGhlIHRlc3QgZmlsZSBvciBhIHRlc3QgdXRpbGl0aWVzIGZvbGRlci5cIixcbiAgICB9LFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwdWJsaWNBcGlGaWxlczoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsZSBnbG9icyB0aGF0IGRlZmluZSBwdWJsaWMgQVBJIGV4cG9ydCBzdXJmYWNlcy5cIixcbiAgICAgICAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVzdEZpbGVQYXR0ZXJuczoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFwiRmlsZSBnbG9icyB0cmVhdGVkIGFzIHRlc3RzIHdoZW4gY2xhc3NpZnlpbmcgZXhwb3J0IGNvbnN1bWVycy5cIixcbiAgICAgICAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdHlwZTogXCJwcm9ibGVtXCIsXG4gIH0sXG59O1xuXG5leHBvcnQgeyBub1VudXNlZEV4cG9ydHNSdWxlIH07XG4iXX0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { noMultipleDeclaratorsRule } from "./no-multiple-declarators/index.js";
|
|
2
|
+
export { noUselessDelegationRule } from "./no-useless-delegation/index.js";
|
|
2
3
|
export { preferInterfaceTypesRule } from "./prefer-interface-types/index.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { noMultipleDeclaratorsRule } from "./no-multiple-declarators/index.js";
|
|
2
|
+
export { noUselessDelegationRule } from "./no-useless-delegation/index.js";
|
|
2
3
|
export { preferInterfaceTypesRule } from "./prefer-interface-types/index.js";
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9tYWluL2NvcmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBub011bHRpcGxlRGVjbGFyYXRvcnNSdWxlIH0gZnJvbSBcIi4vbm8tbXVsdGlwbGUtZGVjbGFyYXRvcnNcIjtcbmV4cG9ydCB7IG5vVXNlbGVzc0RlbGVnYXRpb25SdWxlIH0gZnJvbSBcIi4vbm8tdXNlbGVzcy1kZWxlZ2F0aW9uXCI7XG5leHBvcnQgeyBwcmVmZXJJbnRlcmZhY2VUeXBlc1J1bGUgfSBmcm9tIFwiLi9wcmVmZXItaW50ZXJmYWNlLXR5cGVzXCI7XG4iXX0=
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
import type { FixableVariableDeclarationNode, RangedVariableDeclaratorNode, SourceCodeAccess, VariableDeclarationNode, VariableDeclaratorNode } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Gets the source access wrapper from the ESLint context.
|
|
5
|
+
* @param context Rule execution context.
|
|
6
|
+
* @returns Source access helpers used by the fixer.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const sourceCode = getSourceCode(context);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
declare const getSourceCode: (context: Rule.RuleContext) => SourceCodeAccess;
|
|
13
|
+
/**
|
|
14
|
+
* Reads the full source text for the active file.
|
|
15
|
+
* @param sourceCode Source access wrapper.
|
|
16
|
+
* @returns Full source text.
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const sourceText = getSourceText(sourceCode);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare const getSourceText: (sourceCode: SourceCodeAccess) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Collects ranged declarators when every declarator exposes a range.
|
|
25
|
+
* @param declarations Declarators from the declaration node.
|
|
26
|
+
* @returns Declarators with confirmed ranges, or `undefined` when any range is missing.
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const ranged = getRangedDeclarations(node.declarations ?? []);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare const getRangedDeclarations: (declarations: readonly VariableDeclaratorNode[]) => readonly RangedVariableDeclaratorNode[] | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Determines whether a declaration can be safely rewritten.
|
|
35
|
+
* @param node Declaration node to inspect.
|
|
36
|
+
* @param declarations Declarators within the declaration.
|
|
37
|
+
* @param sourceText Full source text.
|
|
38
|
+
* @returns Whether the declaration is safe to autofix.
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const fixable = canFix(node, declarations, sourceText);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare const canFix: (node: VariableDeclarationNode, declarations: readonly VariableDeclaratorNode[], sourceText: string) => boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Converts declarators into separate declaration statements.
|
|
47
|
+
* @param node Fixable declaration node.
|
|
48
|
+
* @param declarations Declarators that should be split.
|
|
49
|
+
* @param sourceCode Source access wrapper.
|
|
50
|
+
* @returns Replacement text for the full declaration.
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const replacement = buildReplacement(node, declarations, sourceCode);
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
declare const buildReplacement: (node: FixableVariableDeclarationNode, declarations: readonly RangedVariableDeclaratorNode[], sourceCode: SourceCodeAccess) => string;
|
|
57
|
+
export { buildReplacement, canFix, getRangedDeclarations, getSourceCode, getSourceText, };
|
|
58
|
+
//# sourceMappingURL=rule-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/core/no-multiple-declarators/rule-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EACV,8BAA8B,EAG9B,4BAA4B,EAC5B,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAejB;;;;;;;;GAQG;AACH,QAAA,MAAM,aAAa,GAAI,SAAS,IAAI,CAAC,WAAW,KAAG,gBACA,CAAC;AAEpD;;;;;;;;GAQG;AACH,QAAA,MAAM,aAAa,GAAI,YAAY,gBAAgB,KAAG,MACwB,CAAC;AA6I/E;;;;;;;;GAQG;AACH,QAAA,MAAM,qBAAqB,GACzB,cAAc,SAAS,sBAAsB,EAAE,KAC9C,SAAS,4BAA4B,EAAE,GAAG,SAY5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,MAAM,GACV,MAAM,uBAAuB,EAC7B,cAAc,SAAS,sBAAsB,EAAE,EAC/C,YAAY,MAAM,KACjB,OAiBF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,gBAAgB,GACpB,MAAM,8BAA8B,EACpC,cAAc,SAAS,4BAA4B,EAAE,EACrD,YAAY,gBAAgB,KAC3B,MAQF,CAAC;AAEF,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,qBAAqB,EACrB,aAAa,EACb,aAAa,GACd,CAAC"}
|