@codeperfect/eslint-plugin 1.0.0 → 2.1.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 +26 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/{custom-rules.d.ts → application/custom-rules.d.ts} +3 -0
- package/dist/application/custom-rules.d.ts.map +1 -0
- package/dist/application/custom-rules.js +74 -0
- package/dist/application/index.d.ts +4 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +3 -0
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +56 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +149 -0
- package/dist/{architecture → domain/architecture}/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +4 -4
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +98 -0
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +45 -0
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +64 -0
- package/dist/{architecture → domain/architecture}/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +5 -4
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +87 -0
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +145 -0
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts +5 -0
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/index.js +4 -0
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +90 -0
- package/dist/{architecture → domain/architecture}/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +91 -0
- package/dist/{architecture → domain/architecture}/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +4 -6
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +95 -0
- package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/rule.js +51 -0
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.d.ts +4 -0
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.js +4 -0
- package/dist/{architecture → domain/architecture}/consistent-barrel-files/test-helpers.d.ts +48 -48
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.d.ts +20 -0
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.js +25 -0
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.js +235 -0
- package/dist/domain/architecture/consistent-barrel-files/types.d.ts +19 -0
- package/dist/domain/architecture/consistent-barrel-files/types.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/types.js +2 -0
- package/dist/{architecture → domain/architecture}/index.d.ts +1 -1
- package/dist/domain/architecture/index.d.ts.map +1 -0
- package/dist/domain/architecture/index.js +2 -0
- package/dist/{core → domain/core}/index.d.ts +2 -2
- package/dist/domain/core/index.d.ts.map +1 -0
- package/dist/domain/core/index.js +3 -0
- package/dist/domain/core/no-multiple-declarators/index.d.ts +2 -0
- package/dist/domain/core/no-multiple-declarators/index.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/index.js +2 -0
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.d.ts +101 -0
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.js +108 -0
- package/dist/{core → domain/core}/no-multiple-declarators/rule.d.ts +1 -0
- package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule.fixes.d.ts +35 -0
- package/dist/domain/core/no-multiple-declarators/rule.fixes.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule.fixes.js +95 -0
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.d.ts +4 -0
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.js +4 -0
- package/dist/domain/core/no-multiple-declarators/rule.js +222 -0
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.d.ts +4 -0
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.js +4 -0
- package/dist/domain/core/no-multiple-declarators/types.d.ts +77 -0
- package/dist/domain/core/no-multiple-declarators/types.d.ts.map +1 -0
- package/dist/domain/core/no-multiple-declarators/types.js +38 -0
- package/dist/domain/core/prefer-interface-types/index.d.ts +2 -0
- package/dist/domain/core/prefer-interface-types/index.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/index.js +2 -0
- package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/rule.js +148 -0
- package/dist/domain/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/test-helpers.js +116 -0
- package/dist/{custom-rule-documentation.d.ts → domain/custom-rule-documentation.d.ts} +3 -1
- package/dist/domain/custom-rule-documentation.d.ts.map +1 -0
- package/dist/domain/custom-rule-documentation.js +36 -0
- package/dist/domain/docs/index.d.ts +4 -0
- package/dist/domain/docs/index.d.ts.map +1 -0
- package/dist/domain/docs/index.js +4 -0
- package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
- package/dist/{docs → domain/docs}/no-interface-member-docs/comment-utilities.d.ts +1 -1
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +146 -0
- package/dist/domain/docs/no-interface-member-docs/index.d.ts +2 -0
- package/dist/domain/docs/no-interface-member-docs/index.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/index.js +2 -0
- package/dist/{docs → domain/docs}/no-interface-member-docs/parameter-tags.d.ts +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +101 -0
- package/dist/{docs → domain/docs}/no-interface-member-docs/parameter-utilities.d.ts +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +125 -0
- package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/rule.js +171 -0
- package/dist/domain/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
- package/dist/{docs → domain/docs}/no-interface-member-docs/test-helpers.js +2 -2
- package/dist/{docs → domain/docs}/no-interface-member-docs/types.d.ts +2 -2
- package/dist/domain/docs/no-interface-member-docs/types.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/types.js +2 -0
- package/dist/domain/docs/require-example-language/create-fixer.d.ts +5 -0
- package/dist/domain/docs/require-example-language/create-fixer.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/create-fixer.js +5 -0
- package/dist/domain/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/empty-fence-fixes.js +169 -0
- package/dist/domain/docs/require-example-language/example-utilities.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/example-utilities.js +76 -0
- package/dist/{docs → domain/docs}/require-example-language/examples.d.ts +1 -1
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/examples.js +181 -0
- package/dist/{docs → domain/docs}/require-example-language/fixes.d.ts +2 -2
- package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/fixes.js +182 -0
- package/dist/domain/docs/require-example-language/index.d.ts +3 -0
- package/dist/domain/docs/require-example-language/index.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/index.js +2 -0
- package/dist/{docs → domain/docs}/require-example-language/reporting.d.ts +1 -1
- package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/reporting.js +148 -0
- package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/rule.js +37 -0
- package/dist/domain/docs/require-example-language/types.d.ts.map +1 -0
- package/dist/domain/docs/require-example-language/types.js +2 -0
- package/dist/domain/docs/single-line-jsdoc/index.d.ts +2 -0
- package/dist/domain/docs/single-line-jsdoc/index.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/index.js +2 -0
- package/dist/domain/docs/single-line-jsdoc/rule.d.ts +4 -0
- package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.d.ts +4 -0
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.js +5 -0
- package/dist/domain/docs/single-line-jsdoc/rule.js +201 -0
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.d.ts +4 -0
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.js +5 -0
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
- package/dist/{docs → domain/docs}/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +1 -1
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
- package/dist/domain/docs/test-helpers.d.ts.map +1 -0
- package/dist/domain/docs/test-helpers.js +107 -0
- package/dist/domain/index.d.ts +6 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +6 -0
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts +34 -0
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts +145 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +203 -0
- package/dist/domain/testing/aaa/analyzer.analysis.js +82 -0
- package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts +4 -0
- package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.analysis.unsupported.js +4 -0
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts +18 -0
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts +4 -0
- package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.destructured.js +4 -0
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts +95 -0
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +185 -0
- package/dist/domain/testing/aaa/analyzer.assertions.js +33 -0
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts +64 -0
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.operands.js +105 -0
- package/dist/domain/testing/aaa/analyzer.classification.d.ts +16 -0
- package/dist/domain/testing/aaa/analyzer.classification.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts +77 -0
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.helpers.js +203 -0
- package/dist/domain/testing/aaa/analyzer.classification.js +31 -0
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.d.ts +9 -0
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.js +10 -0
- package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts +4 -0
- package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.mutations.js +4 -0
- package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts +15 -0
- package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.traversal.js +34 -0
- package/dist/domain/testing/aaa/analyzer.d.ts +46 -0
- package/dist/domain/testing/aaa/analyzer.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.js +59 -0
- package/dist/domain/testing/aaa/analyzer.super.d.ts +106 -0
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts +27 -0
- package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.super.helpers.js +66 -0
- package/dist/domain/testing/aaa/analyzer.super.js +211 -0
- package/dist/{testing → domain/testing}/aaa/index.d.ts +2 -2
- package/dist/domain/testing/aaa/index.d.ts.map +1 -0
- package/dist/domain/testing/aaa/index.js +2 -0
- package/dist/domain/testing/aaa/types.d.ts +58 -0
- package/dist/domain/testing/aaa/types.d.ts.map +1 -0
- package/dist/domain/testing/aaa/types.js +2 -0
- package/dist/domain/testing/assert-actual-expected-names/index.d.ts +2 -0
- package/dist/domain/testing/assert-actual-expected-names/index.d.ts.map +1 -0
- package/dist/domain/testing/assert-actual-expected-names/index.js +2 -0
- package/dist/{testing → domain/testing}/assert-actual-expected-names/rule.d.ts +1 -0
- package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
- package/dist/domain/testing/assert-actual-expected-names/rule.js +116 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/index.js +2 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts +13 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +134 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.d.ts +25 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.js +138 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.js +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.js +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.d.ts +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.js +4 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts +14 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +180 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.d.ts +42 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.js +188 -0
- package/dist/{testing → domain/testing}/enforce-aaa-phase-purity/rule.d.ts +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-phase-purity/rule.js +37 -0
- package/dist/domain/testing/enforce-aaa-structure/index.d.ts +2 -0
- package/dist/domain/testing/enforce-aaa-structure/index.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-structure/index.js +2 -0
- package/dist/{testing → domain/testing}/enforce-aaa-structure/rule.d.ts +1 -0
- package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-structure/rule.js +88 -0
- package/dist/{testing → domain/testing}/index.d.ts +9 -8
- package/dist/domain/testing/index.d.ts.map +1 -0
- package/dist/domain/testing/index.js +10 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.d.ts +29 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.js +90 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts +31 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +43 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts +16 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +205 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts +28 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/fix.js +171 -0
- package/dist/domain/testing/prefer-vi-mocked-import/index.d.ts +2 -0
- package/dist/domain/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/index.js +2 -0
- package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-bindings.d.ts +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
- package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-declarations.d.ts +2 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +131 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
- package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-imports.d.ts +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +156 -0
- package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-rewrites.d.ts +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match-walk.js +62 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts +26 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/match.js +198 -0
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.d.ts +20 -0
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.js +39 -0
- package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/rule.js +39 -0
- package/dist/{testing → domain/testing}/prefer-vi-mocked-import/types.d.ts +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vi-mocked-import/types.js +2 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts +97 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.js +174 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.d.ts +2 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.js +2 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts +14 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.js +84 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts +13 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.js +195 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts +25 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.js +96 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.d.ts +32 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.js +164 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts +5 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.d.ts +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.js +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.d.ts +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.js +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.js +88 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.d.ts +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.js +4 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts +24 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.js +113 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.d.ts +36 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.js +138 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts +187 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts.map +1 -0
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.js +2 -0
- package/dist/domain/testing/require-aaa-sections/index.d.ts +2 -0
- package/dist/domain/testing/require-aaa-sections/index.d.ts.map +1 -0
- package/dist/domain/testing/require-aaa-sections/index.js +2 -0
- package/dist/domain/testing/require-aaa-sections/missing-section-fixes.d.ts +17 -0
- package/dist/domain/testing/require-aaa-sections/missing-section-fixes.d.ts.map +1 -0
- package/dist/domain/testing/require-aaa-sections/missing-section-fixes.js +150 -0
- package/dist/{testing → domain/testing}/require-aaa-sections/rule.d.ts +1 -0
- package/dist/domain/testing/require-aaa-sections/rule.d.ts.map +1 -0
- package/dist/domain/testing/require-aaa-sections/rule.js +134 -0
- package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts +104 -0
- package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts.map +1 -0
- package/dist/domain/testing/require-aaa-sections/rule.reporting.js +216 -0
- package/dist/domain/testing/require-act-result-capture/index.d.ts +2 -0
- package/dist/domain/testing/require-act-result-capture/index.d.ts.map +1 -0
- package/dist/domain/testing/require-act-result-capture/index.js +2 -0
- package/dist/{testing → domain/testing}/require-act-result-capture/rule.d.ts +1 -0
- package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -0
- package/dist/domain/testing/require-act-result-capture/rule.js +109 -0
- package/dist/domain/testing/require-test-companion/index.d.ts +3 -0
- package/dist/domain/testing/require-test-companion/index.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/index.js +3 -0
- package/dist/{testing → domain/testing}/require-test-companion/require-test-companion-listeners.d.ts +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.js +145 -0
- package/dist/domain/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/require-test-companion-options.js +113 -0
- package/dist/{testing → domain/testing}/require-test-companion/require-test-companion-test-helpers.d.ts +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/require-test-companion-test-helpers.js +184 -0
- package/dist/{testing → domain/testing}/require-test-companion/require-test-companion-utilities.d.ts +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/require-test-companion-utilities.js +26 -0
- package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/rule.js +82 -0
- package/dist/domain/testing/require-test-companion/types.d.ts.map +1 -0
- package/dist/domain/testing/require-test-companion/types.js +2 -0
- package/dist/domain/testing/single-act-statement/index.d.ts +2 -0
- package/dist/domain/testing/single-act-statement/index.d.ts.map +1 -0
- package/dist/domain/testing/single-act-statement/index.js +2 -0
- package/dist/{testing → domain/testing}/single-act-statement/rule.d.ts +1 -0
- package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -0
- package/dist/domain/testing/single-act-statement/rule.js +37 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/{codeperfect-plugin.d.ts → infrastructure/codeperfect-plugin.d.ts} +2 -0
- package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -0
- package/dist/infrastructure/codeperfect-plugin.js +30 -0
- package/dist/infrastructure/index.d.ts +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +4 -0
- package/dist/infrastructure/presets.d.ts +18 -0
- package/dist/infrastructure/presets.d.ts.map +1 -0
- package/dist/infrastructure/presets.js +81 -0
- package/package.json +67 -32
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +0 -131
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -48
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +0 -126
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +0 -90
- package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/exports-only-rule.js +0 -218
- package/dist/architecture/consistent-barrel-files/index.d.ts +0 -5
- package/dist/architecture/consistent-barrel-files/index.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/index.js +0 -4
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +0 -100
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +0 -90
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +0 -154
- package/dist/architecture/consistent-barrel-files/rule.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/rule.js +0 -58
- package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/test-helpers.js +0 -229
- package/dist/architecture/consistent-barrel-files/types.d.ts +0 -25
- package/dist/architecture/consistent-barrel-files/types.d.ts.map +0 -1
- package/dist/architecture/consistent-barrel-files/types.js +0 -2
- package/dist/architecture/index.d.ts.map +0 -1
- package/dist/architecture/index.js +0 -2
- package/dist/benchmark-rules.d.ts +0 -83
- package/dist/benchmark-rules.d.ts.map +0 -1
- package/dist/benchmark-rules.js +0 -175
- package/dist/codeperfect-plugin.d.ts.map +0 -1
- package/dist/codeperfect-plugin.js +0 -29
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -3
- package/dist/core/no-multiple-declarators/index.d.ts +0 -2
- package/dist/core/no-multiple-declarators/index.d.ts.map +0 -1
- package/dist/core/no-multiple-declarators/index.js +0 -2
- package/dist/core/no-multiple-declarators/rule.d.ts.map +0 -1
- package/dist/core/no-multiple-declarators/rule.js +0 -100
- package/dist/core/prefer-interface-types/index.d.ts +0 -2
- package/dist/core/prefer-interface-types/index.d.ts.map +0 -1
- package/dist/core/prefer-interface-types/index.js +0 -2
- package/dist/core/prefer-interface-types/rule.d.ts.map +0 -1
- package/dist/core/prefer-interface-types/rule.js +0 -145
- package/dist/core/prefer-interface-types/test-helpers.d.ts.map +0 -1
- package/dist/core/prefer-interface-types/test-helpers.js +0 -116
- package/dist/custom-rule-documentation.d.ts.map +0 -1
- package/dist/custom-rule-documentation.js +0 -35
- package/dist/custom-rules.d.ts.map +0 -1
- package/dist/custom-rules.js +0 -70
- package/dist/docs/index.d.ts +0 -4
- package/dist/docs/index.d.ts.map +0 -1
- package/dist/docs/index.js +0 -4
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +0 -129
- package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/comment-utilities.js +0 -146
- package/dist/docs/no-interface-member-docs/index.d.ts +0 -2
- package/dist/docs/no-interface-member-docs/index.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/index.js +0 -2
- package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/parameter-tags.js +0 -101
- package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/parameter-utilities.js +0 -125
- package/dist/docs/no-interface-member-docs/rule.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/rule.js +0 -168
- package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/types.d.ts.map +0 -1
- package/dist/docs/no-interface-member-docs/types.js +0 -2
- package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +0 -1
- package/dist/docs/require-example-language/empty-fence-fixes.js +0 -169
- package/dist/docs/require-example-language/example-utilities.d.ts.map +0 -1
- package/dist/docs/require-example-language/example-utilities.js +0 -76
- package/dist/docs/require-example-language/examples.d.ts.map +0 -1
- package/dist/docs/require-example-language/examples.js +0 -181
- package/dist/docs/require-example-language/fixes.d.ts.map +0 -1
- package/dist/docs/require-example-language/fixes.js +0 -182
- package/dist/docs/require-example-language/index.d.ts +0 -3
- package/dist/docs/require-example-language/index.d.ts.map +0 -1
- package/dist/docs/require-example-language/index.js +0 -2
- package/dist/docs/require-example-language/reporting.d.ts.map +0 -1
- package/dist/docs/require-example-language/reporting.js +0 -145
- package/dist/docs/require-example-language/rule.d.ts.map +0 -1
- package/dist/docs/require-example-language/rule.js +0 -34
- package/dist/docs/require-example-language/types.d.ts.map +0 -1
- package/dist/docs/require-example-language/types.js +0 -2
- package/dist/docs/single-line-jsdoc/index.d.ts +0 -2
- package/dist/docs/single-line-jsdoc/index.d.ts.map +0 -1
- package/dist/docs/single-line-jsdoc/index.js +0 -2
- package/dist/docs/single-line-jsdoc/rule.d.ts +0 -5
- package/dist/docs/single-line-jsdoc/rule.d.ts.map +0 -1
- package/dist/docs/single-line-jsdoc/rule.js +0 -196
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +0 -1
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +0 -95
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +0 -1
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +0 -140
- package/dist/docs/test-helpers.d.ts.map +0 -1
- package/dist/docs/test-helpers.js +0 -107
- package/dist/presets.d.ts +0 -10
- package/dist/presets.d.ts.map +0 -1
- package/dist/presets.js +0 -50
- package/dist/rules/index.d.ts +0 -5
- package/dist/rules/index.d.ts.map +0 -1
- package/dist/rules/index.js +0 -6
- package/dist/testing/aaa/analyzer.d.ts +0 -36
- package/dist/testing/aaa/analyzer.d.ts.map +0 -1
- package/dist/testing/aaa/analyzer.js +0 -490
- package/dist/testing/aaa/index.d.ts.map +0 -1
- package/dist/testing/aaa/index.js +0 -2
- package/dist/testing/aaa/types.d.ts +0 -31
- package/dist/testing/aaa/types.d.ts.map +0 -1
- package/dist/testing/aaa/types.js +0 -2
- package/dist/testing/assert-actual-expected-names/index.d.ts +0 -2
- package/dist/testing/assert-actual-expected-names/index.d.ts.map +0 -1
- package/dist/testing/assert-actual-expected-names/index.js +0 -2
- package/dist/testing/assert-actual-expected-names/rule.d.ts.map +0 -1
- package/dist/testing/assert-actual-expected-names/rule.js +0 -54
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts +0 -2
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +0 -1
- package/dist/testing/enforce-aaa-phase-purity/index.js +0 -2
- package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +0 -1
- package/dist/testing/enforce-aaa-phase-purity/rule.js +0 -110
- package/dist/testing/enforce-aaa-structure/index.d.ts +0 -2
- package/dist/testing/enforce-aaa-structure/index.d.ts.map +0 -1
- package/dist/testing/enforce-aaa-structure/index.js +0 -2
- package/dist/testing/enforce-aaa-structure/rule.d.ts.map +0 -1
- package/dist/testing/enforce-aaa-structure/rule.js +0 -48
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -9
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts +0 -16
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/fix.js +0 -224
- package/dist/testing/prefer-vi-mocked-import/index.d.ts +0 -2
- package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/index.js +0 -2
- package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-bindings.js +0 -52
- package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-declarations.js +0 -99
- package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-helpers.js +0 -102
- package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-imports.js +0 -156
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +0 -119
- package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match-walk.js +0 -62
- package/dist/testing/prefer-vi-mocked-import/match.d.ts +0 -15
- package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/match.js +0 -193
- package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/rule.js +0 -32
- package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +0 -1
- package/dist/testing/prefer-vi-mocked-import/types.js +0 -2
- package/dist/testing/require-aaa-sections/index.d.ts +0 -2
- package/dist/testing/require-aaa-sections/index.d.ts.map +0 -1
- package/dist/testing/require-aaa-sections/index.js +0 -2
- package/dist/testing/require-aaa-sections/rule.d.ts.map +0 -1
- package/dist/testing/require-aaa-sections/rule.js +0 -111
- package/dist/testing/require-act-result-capture/index.d.ts +0 -2
- package/dist/testing/require-act-result-capture/index.d.ts.map +0 -1
- package/dist/testing/require-act-result-capture/index.js +0 -2
- package/dist/testing/require-act-result-capture/rule.d.ts.map +0 -1
- package/dist/testing/require-act-result-capture/rule.js +0 -34
- package/dist/testing/require-test-companion/index.d.ts +0 -3
- package/dist/testing/require-test-companion/index.d.ts.map +0 -1
- package/dist/testing/require-test-companion/index.js +0 -3
- package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +0 -1
- package/dist/testing/require-test-companion/require-test-companion-listeners.js +0 -145
- package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +0 -1
- package/dist/testing/require-test-companion/require-test-companion-options.js +0 -112
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +0 -1
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +0 -183
- package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +0 -1
- package/dist/testing/require-test-companion/require-test-companion-utilities.js +0 -26
- package/dist/testing/require-test-companion/rule.d.ts.map +0 -1
- package/dist/testing/require-test-companion/rule.js +0 -57
- package/dist/testing/require-test-companion/types.d.ts.map +0 -1
- package/dist/testing/require-test-companion/types.js +0 -2
- package/dist/testing/single-act-statement/index.d.ts +0 -2
- package/dist/testing/single-act-statement/index.d.ts.map +0 -1
- package/dist/testing/single-act-statement/index.js +0 -2
- package/dist/testing/single-act-statement/rule.d.ts.map +0 -1
- package/dist/testing/single-act-statement/rule.js +0 -33
- /package/dist/{architecture → domain/architecture}/consistent-barrel-files/exports-only-rule.d.ts +0 -0
- /package/dist/{architecture → domain/architecture}/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +0 -0
- /package/dist/{architecture → domain/architecture}/consistent-barrel-files/rule.d.ts +0 -0
- /package/dist/{core → domain/core}/prefer-interface-types/rule.d.ts +0 -0
- /package/dist/{core → domain/core}/prefer-interface-types/test-helpers.d.ts +0 -0
- /package/dist/{docs → domain/docs}/no-interface-member-docs/comment-utilities-test-helpers.d.ts +0 -0
- /package/dist/{docs → domain/docs}/no-interface-member-docs/rule.d.ts +0 -0
- /package/dist/{docs → domain/docs}/no-interface-member-docs/test-helpers.d.ts +0 -0
- /package/dist/{docs → domain/docs}/require-example-language/empty-fence-fixes.d.ts +0 -0
- /package/dist/{docs → domain/docs}/require-example-language/example-utilities.d.ts +0 -0
- /package/dist/{docs → domain/docs}/require-example-language/rule.d.ts +0 -0
- /package/dist/{docs → domain/docs}/require-example-language/types.d.ts +0 -0
- /package/dist/{docs → domain/docs}/single-line-jsdoc/single-line-jsdoc-content.d.ts +0 -0
- /package/dist/{docs → domain/docs}/test-helpers.d.ts +0 -0
- /package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-helpers.d.ts +0 -0
- /package/dist/{testing → domain/testing}/prefer-vi-mocked-import/match-walk.d.ts +0 -0
- /package/dist/{testing → domain/testing}/prefer-vi-mocked-import/rule.d.ts +0 -0
- /package/dist/{testing → domain/testing}/require-test-companion/require-test-companion-options.d.ts +0 -0
- /package/dist/{testing → domain/testing}/require-test-companion/rule.d.ts +0 -0
- /package/dist/{testing → domain/testing}/require-test-companion/types.d.ts +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { getPropertyName, isSupportedProperty, shouldWrapImplicitObject, } from "./ast-helpers.js";
|
|
2
|
+
import { getFactoryMatchInput } from "./match-input.js";
|
|
3
|
+
import { applyTextReplacements, buildPropertyReplacement, } from "./replacement-helpers.js";
|
|
4
|
+
import { isOuterCastRequired, resolveFactoryTargetType } from "./type-helpers.js";
|
|
5
|
+
/**
|
|
6
|
+
* Records one property replacement when the source text must change.
|
|
7
|
+
* @param propertyNames Property names already handled for the object literal.
|
|
8
|
+
* @param replacements Replacement entries collected so far.
|
|
9
|
+
* @param replacementContext Replacement context for the current property.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* appendPropertyReplacement(new Set(), [], replacementContext);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
function appendPropertyReplacement(propertyNames, replacements, replacementContext) {
|
|
16
|
+
propertyNames.add(replacementContext.keyName);
|
|
17
|
+
const replacement = buildPropertyReplacement(replacementContext);
|
|
18
|
+
if (replacement !== void 0) {
|
|
19
|
+
replacements.push(replacement);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builds the final match result for a rewritten object literal.
|
|
24
|
+
* @param context Data required to build the final replacement.
|
|
25
|
+
* @returns Final match result when the object text changes.
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const match = buildMatchResult(context);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
function buildMatchResult(context) {
|
|
32
|
+
const objectText = applyTextReplacements(context.sourceText.slice(context.objectExpression.range[0], context.objectExpression.range[1]), context.replacements, context.objectExpression.range[0]);
|
|
33
|
+
const replacementText = createReplacementText(context, objectText);
|
|
34
|
+
const originalText = context.sourceText.slice(context.returnExpression.range[0], context.returnExpression.range[1]);
|
|
35
|
+
return originalText === replacementText
|
|
36
|
+
? void 0
|
|
37
|
+
: {
|
|
38
|
+
replacementText,
|
|
39
|
+
returnExpressionRange: context.returnExpression.range,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Collects nested replacements for all supported object literal properties.
|
|
44
|
+
* @param context Data required to analyze supported object properties.
|
|
45
|
+
* @param properties Supported object literal properties to rewrite.
|
|
46
|
+
* @returns Property replacements when every property can be handled safely.
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const collection = buildPropertyReplacementCollection(context, properties);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function buildPropertyReplacementCollection(context, properties) {
|
|
53
|
+
const propertyNames = new Set();
|
|
54
|
+
const replacements = [];
|
|
55
|
+
const targetProperties = createTargetPropertyMap(context);
|
|
56
|
+
for (const property of properties) {
|
|
57
|
+
const replacementContext = createPropertyReplacementContext(context, property, targetProperties);
|
|
58
|
+
if (replacementContext === void 0) {
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
appendPropertyReplacement(propertyNames, replacements, replacementContext);
|
|
62
|
+
}
|
|
63
|
+
return { propertyNames, replacements };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Collects a fix match for a supported Vitest mock factory call.
|
|
67
|
+
* @param context Match collection context.
|
|
68
|
+
* @returns Match result when the object literal can be safely rewritten.
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const match = collectMatch(context);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
function collectMatch(context) {
|
|
75
|
+
const factoryMatchInput = getFactoryMatchInput(context.callExpression);
|
|
76
|
+
if (factoryMatchInput === void 0) {
|
|
77
|
+
return void 0;
|
|
78
|
+
}
|
|
79
|
+
const targetType = resolveFactoryTargetType({
|
|
80
|
+
callExpression: context.callExpression,
|
|
81
|
+
checker: context.checker,
|
|
82
|
+
factoryArgument: factoryMatchInput.factoryArgument,
|
|
83
|
+
objectExpression: factoryMatchInput.objectExpression,
|
|
84
|
+
services: context.services,
|
|
85
|
+
});
|
|
86
|
+
if (targetType === void 0) {
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
const collectedReplacements = collectPropertyReplacements({
|
|
90
|
+
checker: context.checker,
|
|
91
|
+
moduleSpecifier: factoryMatchInput.moduleSpecifier,
|
|
92
|
+
namespaceAlias: context.namespaceImports.get(factoryMatchInput.moduleSpecifier),
|
|
93
|
+
objectExpression: factoryMatchInput.objectExpression,
|
|
94
|
+
services: context.services,
|
|
95
|
+
sourceText: context.sourceText,
|
|
96
|
+
targetType,
|
|
97
|
+
});
|
|
98
|
+
return collectedReplacements === void 0
|
|
99
|
+
? void 0
|
|
100
|
+
: buildMatchResult({
|
|
101
|
+
checker: context.checker,
|
|
102
|
+
factoryArgument: factoryMatchInput.factoryArgument,
|
|
103
|
+
moduleSpecifier: factoryMatchInput.moduleSpecifier,
|
|
104
|
+
namespaceAlias: context.namespaceImports.get(factoryMatchInput.moduleSpecifier),
|
|
105
|
+
objectExpression: factoryMatchInput.objectExpression,
|
|
106
|
+
propertyNames: collectedReplacements.propertyNames,
|
|
107
|
+
replacements: collectedReplacements.replacements,
|
|
108
|
+
returnExpression: factoryMatchInput.returnExpression,
|
|
109
|
+
sourceText: context.sourceText,
|
|
110
|
+
targetType,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Collects nested replacements for all supported object literal properties.
|
|
115
|
+
* @param context Data required to analyze supported object properties.
|
|
116
|
+
* @returns Property replacements when every property can be handled safely.
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const collection = collectPropertyReplacements(context);
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
function collectPropertyReplacements(context) {
|
|
123
|
+
const properties = context.objectExpression.properties.filter((property) => isSupportedProperty(property));
|
|
124
|
+
return properties.length === context.objectExpression.properties.length
|
|
125
|
+
? buildPropertyReplacementCollection(context, properties)
|
|
126
|
+
: void 0;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates replacement inputs for one supported object literal property.
|
|
130
|
+
* @param context Data required to analyze supported object properties.
|
|
131
|
+
* @param property Supported property from the returned object literal.
|
|
132
|
+
* @param targetProperties Target-property lookup keyed by property name.
|
|
133
|
+
* @returns Replacement inputs when the property can be handled safely.
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const replacementContext = createPropertyReplacementContext(context, property, targetProperties);
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
function createPropertyReplacementContext(context, property, targetProperties) {
|
|
140
|
+
const keyName = getPropertyName(property.key);
|
|
141
|
+
const targetPropertySymbol = keyName === void 0 ? void 0 : targetProperties.get(keyName);
|
|
142
|
+
return keyName === void 0 || targetPropertySymbol === void 0
|
|
143
|
+
? void 0
|
|
144
|
+
: {
|
|
145
|
+
checker: context.checker,
|
|
146
|
+
keyName,
|
|
147
|
+
moduleSpecifier: context.moduleSpecifier,
|
|
148
|
+
namespaceAlias: context.namespaceAlias,
|
|
149
|
+
property,
|
|
150
|
+
services: context.services,
|
|
151
|
+
sourceText: context.sourceText,
|
|
152
|
+
targetPropertySymbol,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Creates the final replacement text for the returned object expression.
|
|
157
|
+
* @param context Data required to build the final replacement.
|
|
158
|
+
* @param objectText Rewritten object literal text.
|
|
159
|
+
* @returns Final replacement text for the factory return expression.
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const text = createReplacementText(context, "({})");
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
function createReplacementText(context, objectText) {
|
|
166
|
+
if (isOuterCastRequired({
|
|
167
|
+
checker: context.checker,
|
|
168
|
+
propertyNames: context.propertyNames,
|
|
169
|
+
targetType: context.targetType,
|
|
170
|
+
})) {
|
|
171
|
+
const moduleReference = context.namespaceAlias === void 0
|
|
172
|
+
? `import(${JSON.stringify(context.moduleSpecifier)})`
|
|
173
|
+
: context.namespaceAlias;
|
|
174
|
+
return `(${objectText}) as typeof ${moduleReference}`;
|
|
175
|
+
}
|
|
176
|
+
return shouldWrapImplicitObject(context.factoryArgument, context.returnExpression, context.objectExpression)
|
|
177
|
+
? `(${objectText})`
|
|
178
|
+
: objectText;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Builds the lookup of target properties from the inferred target type.
|
|
182
|
+
* @param context Data required to analyze supported object properties.
|
|
183
|
+
* @returns Target-property lookup keyed by property name.
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const targetProperties = createTargetPropertyMap(context);
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
function createTargetPropertyMap(context) {
|
|
190
|
+
return new Map(context.checker
|
|
191
|
+
.getPropertiesOfType(context.targetType)
|
|
192
|
+
.map((propertySymbol) => [propertySymbol.getName(), propertySymbol]));
|
|
193
|
+
}
|
|
194
|
+
export { collectMatch };
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvcHJlZmVyLXZpdGVzdC1pbmNyZW1lbnRhbC1jYXN0cy9tYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0JBQXdCLEdBQ3pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0U7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FDaEMsYUFBMEIsRUFDMUIsWUFBbUMsRUFDbkMsa0JBQW1EO0lBRW5ELGFBQWEsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFOUMsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUVqRSxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLE9BQWdDO0lBRWhDLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUN0QyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FDdEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDakMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDbEMsRUFDRCxPQUFPLENBQUMsWUFBWSxFQUNwQixPQUFPLENB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RTNDLE9BQU8sSUFBSSxHQUFHLENBQ1osT0FBTyxDQUFDLE9BQU87U0FDWixtQkFBbUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XHJcbiAgQnVpbGRNYXRjaFJlc3VsdENvbnRleHQsXHJcbiAgQnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50Q29udGV4dCxcclxuICBDb2xsZWN0TWF0Y2hDb250ZXh0LFxyXG4gIENvbGxlY3RQcm9wZXJ0eVJlcGxhY2VtZW50c0NvbnRleHQsXHJcbiAgTWF0Y2hSZXN1bHQsXHJcbiAgUHJvcGVydHlSZXBsYWNlbWVudCxcclxuICBQcm9wZXJ0eVJlcGxhY2VtZW50Q29sbGVjdGlvbixcclxuICBTdXBwb3J0ZWRQcm9wZXJ0eSxcclxuICBUYXJnZXRQcm9wZXJ0eU1hcCxcclxufSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuaW1wb3J0IHtcclxuICBnZXRQcm9wZXJ0eU5hbWUsXHJcbiAgaXNTdXBwb3J0ZWRQcm9wZXJ0eSxcclxuICBzaG91bGRXcmFwSW1wbGljaXRPYmplY3QsXHJcbn0gZnJvbSBcIi4vYXN0LWhlbHBlcnNcIjtcclxuaW1wb3J0IHsgZ2V0RmFjdG9yeU1hdGNoSW5wdXQgfSBmcm9tIFwiLi9tYXRjaC1pbnB1dFwiO1xyXG5pbXBvcnQge1xyXG4gIGFwcGx5VGV4dFJlcGxhY2VtZW50cyxcclxuICBidWlsZFByb3BlcnR5UmVwbGFjZW1lbnQsXHJcbn0gZnJvbSBcIi4vcmVwbGFjZW1lbnQtaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBpc091dGVyQ2FzdFJlcXVpcmVkLCByZXNvbHZlRmFjdG9yeVRhcmdldFR5cGUgfSBmcm9tIFwiLi90eXBlLWhlbHBlcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBSZWNvcmRzIG9uZSBwcm9wZXJ0eSByZXBsYWNlbWVudCB3aGVuIHRoZSBzb3VyY2UgdGV4dCBtdXN0IGNoYW5nZS5cclxuICogQHBhcmFtIHByb3BlcnR5TmFtZXMgUHJvcGVydHkgbmFtZXMgYWxyZWFkeSBoYW5kbGVkIGZvciB0aGUgb2JqZWN0IGxpdGVyYWwuXHJcbiAqIEBwYXJhbSByZXBsYWNlbWVudHMgUmVwbGFjZW1lbnQgZW50cmllcyBjb2xsZWN0ZWQgc28gZmFyLlxyXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnRDb250ZXh0IFJlcGxhY2VtZW50IGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IHByb3BlcnR5LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGFwcGVuZFByb3BlcnR5UmVwbGFjZW1lbnQobmV3IFNldCgpLCBbXSwgcmVwbGFjZW1lbnRDb250ZXh0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBlbmRQcm9wZXJ0eVJlcGxhY2VtZW50KFxyXG4gIHByb3BlcnR5TmFtZXM6IFNldDxzdHJpbmc+LFxyXG4gIHJlcGxhY2VtZW50czogUHJvcGVydHlSZXBsYWNlbWVudFtdLFxyXG4gIHJlcGxhY2VtZW50Q29udGV4dDogQnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50Q29udGV4dCxcclxuKTogdm9pZCB7XHJcbiAgcHJvcGVydHlOYW1lcy5hZGQocmVwbGFjZW1lbnRDb250ZXh0LmtleU5hbWUpO1xyXG5cclxuICBjb25zdCByZXBsYWNlbWVudCA9IGJ1aWxkUHJvcGVydHlSZXBsYWNlbWVudChyZXBsYWNlbWVudENvbnRleHQpO1xyXG5cclxuICBpZiAocmVwbGFjZW1lbnQgIT09IHZvaWQgMCkge1xyXG4gICAgcmVwbGFjZW1lbnRzLnB1c2gocmVwbGFjZW1lbnQpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyB0aGUgZmluYWwgbWF0Y2ggcmVzdWx0IGZvciBhIHJld3JpdHRlbiBvYmplY3QgbGl0ZXJhbC5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSByZXF1aXJlZCB0byBidWlsZCB0aGUgZmluYWwgcmVwbGFjZW1lbnQuXHJcbiAqIEByZXR1cm5zIEZpbmFsIG1hdGNoIHJlc3VsdCB3aGVuIHRoZSBvYmplY3QgdGV4dCBjaGFuZ2VzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IG1hdGNoID0gYnVpbGRNYXRjaFJlc3VsdChjb250ZXh0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZE1hdGNoUmVzdWx0KFxyXG4gIGNvbnRleHQ6IEJ1aWxkTWF0Y2hSZXN1bHRDb250ZXh0LFxyXG4pOiBNYXRjaFJlc3VsdCB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3Qgb2JqZWN0VGV4dCA9IGFwcGx5VGV4dFJlcGxhY2VtZW50cyhcclxuICAgIGNvbnRleHQuc291cmNlVGV4dC5zbGljZShcclxuICAgICAgY29udGV4dC5vYmplY3RFeHByZXNzaW9uLnJhbmdlWzBdLFxyXG4gICAgICBjb250ZXh0Lm9iamVjdEV4cHJlc3Npb24ucmFuZ2VbMV0sXHJcbiAgICApLFxyXG4gICAgY29udGV4dC5yZXBsYWNlbWVudHMsXHJcbiAgICBjb250ZXh0Lm9iamVjdEV4cHJlc3Npb24ucmFuZ2VbMF0sXHJcbiAgKTtcclxuICBjb25zdCByZXBsYWNlbWVudFRleHQgPSBjcmVhdGVSZXBsYWNlbWVudFRleHQoY29udGV4dCwgb2JqZWN0VGV4dCk7XHJcbiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gY29udGV4dC5zb3VyY2VUZXh0LnNsaWNlKFxyXG4gICAgY29udGV4dC5yZXR1cm5FeHByZXNzaW9uLnJhbmdlWzBdLFxyXG4gICAgY29udGV4dC5yZXR1cm5FeHByZXNzaW9uLnJhbmdlWzFdLFxyXG4gICk7XHJcblxyXG4gIHJldHVybiBvcmlnaW5hbFRleHQgPT09IHJlcGxhY2VtZW50VGV4dFxyXG4gICAgPyB2b2lkIDBcclxuICAgIDoge1xyXG4gICAgICAgIHJlcGxhY2VtZW50VGV4dCxcclxuICAgICAgICByZXR1cm5FeHByZXNzaW9uUmFuZ2U6IGNvbnRleHQucmV0dXJuRXhwcmVzc2lvbi5yYW5nZSxcclxuICAgICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbGxlY3RzIG5lc3RlZCByZXBsYWNlbWVudHMgZm9yIGFsbCBzdXBwb3J0ZWQgb2JqZWN0IGxpdGVyYWwgcHJvcGVydGllcy5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSByZXF1aXJlZCB0byBhbmFseXplIHN1cHBvcnRlZCBvYmplY3QgcHJvcGVydGllcy5cclxuICogQHBhcmFtIHByb3BlcnRpZXMgU3VwcG9ydGVkIG9iamVjdCBsaXRlcmFsIHByb3BlcnRpZXMgdG8gcmV3cml0ZS5cclxuICogQHJldHVybnMgUHJvcGVydHkgcmVwbGFjZW1lbnRzIHdoZW4gZXZlcnkgcHJvcGVydHkgY2FuIGJlIGhhbmRsZWQgc2FmZWx5LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGNvbGxlY3Rpb24gPSBidWlsZFByb3BlcnR5UmVwbGFjZW1lbnRDb2xsZWN0aW9uKGNvbnRleHQsIHByb3BlcnRpZXMpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkUHJvcGVydHlSZXBsYWNlbWVudENvbGxlY3Rpb24oXHJcbiAgY29udGV4dDogQ29sbGVjdFByb3BlcnR5UmVwbGFjZW1lbnRzQ29udGV4dCxcclxuICBwcm9wZXJ0aWVzOiByZWFkb25seSBTdXBwb3J0ZWRQcm9wZXJ0eVtdLFxyXG4pOiBQcm9wZXJ0eVJlcGxhY2VtZW50Q29sbGVjdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3QgcHJvcGVydHlOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIGNvbnN0IHJlcGxhY2VtZW50czogUHJvcGVydHlSZXBsYWNlbWVudFtdID0gW107XHJcbiAgY29uc3QgdGFyZ2V0UHJvcGVydGllcyA9IGNyZWF0ZVRhcmdldFByb3BlcnR5TWFwKGNvbnRleHQpO1xyXG5cclxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IHJlcGxhY2VtZW50Q29udGV4dCA9IGNyZWF0ZVByb3BlcnR5UmVwbGFjZW1lbnRDb250ZXh0KFxyXG4gICAgICBjb250ZXh0LFxyXG4gICAgICBwcm9wZXJ0eSxcclxuICAgICAgdGFyZ2V0UHJvcGVydGllcyxcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHJlcGxhY2VtZW50Q29udGV4dCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIHJldHVybiB2b2lkIDA7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kUHJvcGVydHlSZXBsYWNlbWVudChwcm9wZXJ0eU5hbWVzLCByZXBsYWNlbWVudHMsIHJlcGxhY2VtZW50Q29udGV4dCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBwcm9wZXJ0eU5hbWVzLCByZXBsYWNlbWVudHMgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbGxlY3RzIGEgZml4IG1hdGNoIGZvciBhIHN1cHBvcnRlZCBWaXRlc3QgbW9jayBmYWN0b3J5IGNhbGwuXHJcbiAqIEBwYXJhbSBjb250ZXh0IE1hdGNoIGNvbGxlY3Rpb24gY29udGV4dC5cclxuICogQHJldHVybnMgTWF0Y2ggcmVzdWx0IHdoZW4gdGhlIG9iamVjdCBsaXRlcmFsIGNhbiBiZSBzYWZlbHkgcmV3cml0dGVuLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IG1hdGNoID0gY29sbGVjdE1hdGNoKGNvbnRleHQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGNvbGxlY3RNYXRjaChjb250ZXh0OiBDb2xsZWN0TWF0Y2hDb250ZXh0KTogTWF0Y2hSZXN1bHQgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IGZhY3RvcnlNYXRjaElucHV0ID0gZ2V0RmFjdG9yeU1hdGNoSW5wdXQoY29udGV4dC5jYWxsRXhwcmVzc2lvbik7XHJcblxyXG4gIGlmIChmYWN0b3J5TWF0Y2hJbnB1dCA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGFyZ2V0VHlwZSA9IHJlc29sdmVGYWN0b3J5VGFyZ2V0VHlwZSh7XHJcbiAgICBjYWxsRXhwcmVzc2lvbjogY29udGV4dC5jYWxsRXhwcmVzc2lvbixcclxuICAgIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlcixcclxuICAgIGZhY3RvcnlBcmd1bWVudDogZmFjdG9yeU1hdGNoSW5wdXQuZmFjdG9yeUFyZ3VtZW50LFxyXG4gICAgb2JqZWN0RXhwcmVzc2lvbjogZmFjdG9yeU1hdGNoSW5wdXQub2JqZWN0RXhwcmVzc2lvbixcclxuICAgIHNlcnZpY2VzOiBjb250ZXh0LnNlcnZpY2VzLFxyXG4gIH0pO1xyXG5cclxuICBpZiAodGFyZ2V0VHlwZSA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY29sbGVjdGVkUmVwbGFjZW1lbnRzID0gY29sbGVjdFByb3BlcnR5UmVwbGFjZW1lbnRzKHtcclxuICAgIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlcixcclxuICAgIG1vZHVsZVNwZWNpZmllcjogZmFjdG9yeU1hdGNoSW5wdXQubW9kdWxlU3BlY2lmaWVyLFxyXG4gICAgbmFtZXNwYWNlQWxpYXM6IGNvbnRleHQubmFtZXNwYWNlSW1wb3J0cy5nZXQoXHJcbiAgICAgIGZhY3RvcnlNYXRjaElucHV0Lm1vZHVsZVNwZWNpZmllcixcclxuICAgICksXHJcbiAgICBvYmplY3RFeHByZXNzaW9uOiBmYWN0b3J5TWF0Y2hJbnB1dC5vYmplY3RFeHByZXNzaW9uLFxyXG4gICAgc2VydmljZXM6IGNvbnRleHQuc2VydmljZXMsXHJcbiAgICBzb3VyY2VUZXh0OiBjb250ZXh0LnNvdXJjZVRleHQsXHJcbiAgICB0YXJnZXRUeXBlLFxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gY29sbGVjdGVkUmVwbGFjZW1lbnRzID09PSB2b2lkIDBcclxuICAgID8gdm9pZCAwXHJcbiAgICA6IGJ1aWxkTWF0Y2hSZXN1bHQoe1xyXG4gICAgICAgIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlcixcclxuICAgICAgICBmYWN0b3J5QXJndW1lbnQ6IGZhY3RvcnlNYXRjaElucHV0LmZhY3RvcnlBcmd1bWVudCxcclxuICAgICAgICBtb2R1bGVTcGVjaWZpZXI6IGZhY3RvcnlNYXRjaElucHV0Lm1vZHVsZVNwZWNpZmllcixcclxuICAgICAgICBuYW1lc3BhY2VBbGlhczogY29udGV4dC5uYW1lc3BhY2VJbXBvcnRzLmdldChcclxuICAgICAgICAgIGZhY3RvcnlNYXRjaElucHV0Lm1vZHVsZVNwZWNpZmllcixcclxuICAgICAgICApLFxyXG4gICAgICAgIG9iamVjdEV4cHJlc3Npb246IGZhY3RvcnlNYXRjaElucHV0Lm9iamVjdEV4cHJlc3Npb24sXHJcbiAgICAgICAgcHJvcGVydHlOYW1lczogY29sbGVjdGVkUmVwbGFjZW1lbnRzLnByb3BlcnR5TmFtZXMsXHJcbiAgICAgICAgcmVwbGFjZW1lbnRzOiBjb2xsZWN0ZWRSZXBsYWNlbWVudHMucmVwbGFjZW1lbnRzLFxyXG4gICAgICAgIHJldHVybkV4cHJlc3Npb246IGZhY3RvcnlNYXRjaElucHV0LnJldHVybkV4cHJlc3Npb24sXHJcbiAgICAgICAgc291cmNlVGV4dDogY29udGV4dC5zb3VyY2VUZXh0LFxyXG4gICAgICAgIHRhcmdldFR5cGUsXHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ29sbGVjdHMgbmVzdGVkIHJlcGxhY2VtZW50cyBmb3IgYWxsIHN1cHBvcnRlZCBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0gY29udGV4dCBEYXRhIHJlcXVpcmVkIHRvIGFuYWx5emUgc3VwcG9ydGVkIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG4gKiBAcmV0dXJucyBQcm9wZXJ0eSByZXBsYWNlbWVudHMgd2hlbiBldmVyeSBwcm9wZXJ0eSBjYW4gYmUgaGFuZGxlZCBzYWZlbHkuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgY29sbGVjdGlvbiA9IGNvbGxlY3RQcm9wZXJ0eVJlcGxhY2VtZW50cyhjb250ZXh0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjb2xsZWN0UHJvcGVydHlSZXBsYWNlbWVudHMoXHJcbiAgY29udGV4dDogQ29sbGVjdFByb3BlcnR5UmVwbGFjZW1lbnRzQ29udGV4dCxcclxuKTogUHJvcGVydHlSZXBsYWNlbWVudENvbGxlY3Rpb24gfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHByb3BlcnRpZXMgPSBjb250ZXh0Lm9iamVjdEV4cHJlc3Npb24ucHJvcGVydGllcy5maWx0ZXIoKHByb3BlcnR5KSA9PlxyXG4gICAgaXNTdXBwb3J0ZWRQcm9wZXJ0eShwcm9wZXJ0eSksXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHByb3BlcnRpZXMubGVuZ3RoID09PSBjb250ZXh0Lm9iamVjdEV4cHJlc3Npb24ucHJvcGVydGllcy5sZW5ndGhcclxuICAgID8gYnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50Q29sbGVjdGlvbihjb250ZXh0LCBwcm9wZXJ0aWVzKVxyXG4gICAgOiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIHJlcGxhY2VtZW50IGlucHV0cyBmb3Igb25lIHN1cHBvcnRlZCBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSByZXF1aXJlZCB0byBhbmFseXplIHN1cHBvcnRlZCBvYmplY3QgcHJvcGVydGllcy5cclxuICogQHBhcmFtIHByb3BlcnR5IFN1cHBvcnRlZCBwcm9wZXJ0eSBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3QgbGl0ZXJhbC5cclxuICogQHBhcmFtIHRhcmdldFByb3BlcnRpZXMgVGFyZ2V0LXByb3BlcnR5IGxvb2t1cCBrZXllZCBieSBwcm9wZXJ0eSBuYW1lLlxyXG4gKiBAcmV0dXJucyBSZXBsYWNlbWVudCBpbnB1dHMgd2hlbiB0aGUgcHJvcGVydHkgY2FuIGJlIGhhbmRsZWQgc2FmZWx5LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IHJlcGxhY2VtZW50Q29udGV4dCA9IGNyZWF0ZVByb3BlcnR5UmVwbGFjZW1lbnRDb250ZXh0KGNvbnRleHQsIHByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0aWVzKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVJlcGxhY2VtZW50Q29udGV4dChcclxuICBjb250ZXh0OiBDb2xsZWN0UHJvcGVydHlSZXBsYWNlbWVudHNDb250ZXh0LFxyXG4gIHByb3BlcnR5OiBTdXBwb3J0ZWRQcm9wZXJ0eSxcclxuICB0YXJnZXRQcm9wZXJ0aWVzOiBUYXJnZXRQcm9wZXJ0eU1hcCxcclxuKTogQnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50Q29udGV4dCB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3Qga2V5TmFtZSA9IGdldFByb3BlcnR5TmFtZShwcm9wZXJ0eS5rZXkpO1xyXG4gIGNvbnN0IHRhcmdldFByb3BlcnR5U3ltYm9sID1cclxuICAgIGtleU5hbWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldFByb3BlcnRpZXMuZ2V0KGtleU5hbWUpO1xyXG5cclxuICByZXR1cm4ga2V5TmFtZSA9PT0gdm9pZCAwIHx8IHRhcmdldFByb3BlcnR5U3ltYm9sID09PSB2b2lkIDBcclxuICAgID8gdm9pZCAwXHJcbiAgICA6IHtcclxuICAgICAgICBjaGVja2VyOiBjb250ZXh0LmNoZWNrZXIsXHJcbiAgICAgICAga2V5TmFtZSxcclxuICAgICAgICBtb2R1bGVTcGVjaWZpZXI6IGNvbnRleHQubW9kdWxlU3BlY2lmaWVyLFxyXG4gICAgICAgIG5hbWVzcGFjZUFsaWFzOiBjb250ZXh0Lm5hbWVzcGFjZUFsaWFzLFxyXG4gICAgICAgIHByb3BlcnR5LFxyXG4gICAgICAgIHNlcnZpY2VzOiBjb250ZXh0LnNlcnZpY2VzLFxyXG4gICAgICAgIHNvdXJjZVRleHQ6IGNvbnRleHQuc291cmNlVGV4dCxcclxuICAgICAgICB0YXJnZXRQcm9wZXJ0eVN5bWJvbCxcclxuICAgICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgdGhlIGZpbmFsIHJlcGxhY2VtZW50IHRleHQgZm9yIHRoZSByZXR1cm5lZCBvYmplY3QgZXhwcmVzc2lvbi5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSByZXF1aXJlZCB0byBidWlsZCB0aGUgZmluYWwgcmVwbGFjZW1lbnQuXHJcbiAqIEBwYXJhbSBvYmplY3RUZXh0IFJld3JpdHRlbiBvYmplY3QgbGl0ZXJhbCB0ZXh0LlxyXG4gKiBAcmV0dXJucyBGaW5hbCByZXBsYWNlbWVudCB0ZXh0IGZvciB0aGUgZmFjdG9yeSByZXR1cm4gZXhwcmVzc2lvbi5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCB0ZXh0ID0gY3JlYXRlUmVwbGFjZW1lbnRUZXh0KGNvbnRleHQsIFwiKHt9KVwiKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSZXBsYWNlbWVudFRleHQoXHJcbiAgY29udGV4dDogQnVpbGRNYXRjaFJlc3VsdENvbnRleHQsXHJcbiAgb2JqZWN0VGV4dDogc3RyaW5nLFxyXG4pOiBzdHJpbmcge1xyXG4gIGlmIChcclxuICAgIGlzT3V0ZXJDYXN0UmVxdWlyZWQoe1xyXG4gICAgICBjaGVja2VyOiBjb250ZXh0LmNoZWNrZXIsXHJcbiAgICAgIHByb3BlcnR5TmFtZXM6IGNvbnRleHQucHJvcGVydHlOYW1lcyxcclxuICAgICAgdGFyZ2V0VHlwZTogY29udGV4dC50YXJnZXRUeXBlLFxyXG4gICAgfSlcclxuICApIHtcclxuICAgIGNvbnN0IG1vZHVsZVJlZmVyZW5jZSA9XHJcbiAgICAgIGNvbnRleHQubmFtZXNwYWNlQWxpYXMgPT09IHZvaWQgMFxyXG4gICAgICAgID8gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KGNvbnRleHQubW9kdWxlU3BlY2lmaWVyKX0pYFxyXG4gICAgICAgIDogY29udGV4dC5uYW1lc3BhY2VBbGlhcztcclxuXHJcbiAgICByZXR1cm4gYCgke29iamVjdFRleHR9KSBhcyB0eXBlb2YgJHttb2R1bGVSZWZlcmVuY2V9YDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzaG91bGRXcmFwSW1wbGljaXRPYmplY3QoXHJcbiAgICBjb250ZXh0LmZhY3RvcnlBcmd1bWVudCxcclxuICAgIGNvbnRleHQucmV0dXJuRXhwcmVzc2lvbixcclxuICAgIGNvbnRleHQub2JqZWN0RXhwcmVzc2lvbixcclxuICApXHJcbiAgICA/IGAoJHtvYmplY3RUZXh0fSlgXHJcbiAgICA6IG9iamVjdFRleHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgdGhlIGxvb2t1cCBvZiB0YXJnZXQgcHJvcGVydGllcyBmcm9tIHRoZSBpbmZlcnJlZCB0YXJnZXQgdHlwZS5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSByZXF1aXJlZCB0byBhbmFseXplIHN1cHBvcnRlZCBvYmplY3QgcHJvcGVydGllcy5cclxuICogQHJldHVybnMgVGFyZ2V0LXByb3BlcnR5IGxvb2t1cCBrZXllZCBieSBwcm9wZXJ0eSBuYW1lLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IHRhcmdldFByb3BlcnRpZXMgPSBjcmVhdGVUYXJnZXRQcm9wZXJ0eU1hcChjb250ZXh0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUYXJnZXRQcm9wZXJ0eU1hcChcclxuICBjb250ZXh0OiBDb2xsZWN0UHJvcGVydHlSZXBsYWNlbWVudHNDb250ZXh0LFxyXG4pOiBUYXJnZXRQcm9wZXJ0eU1hcCB7XHJcbiAgcmV0dXJuIG5ldyBNYXAoXHJcbiAgICBjb250ZXh0LmNoZWNrZXJcclxuICAgICAgLmdldFByb3BlcnRpZXNPZlR5cGUoY29udGV4dC50YXJnZXRUeXBlKVxyXG4gICAgICAubWFwKChwcm9wZXJ0eVN5bWJvbCkgPT4gW3Byb3BlcnR5U3ltYm9sLmdldE5hbWUoKSwgcHJvcGVydHlTeW1ib2xdKSxcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgeyBjb2xsZWN0TWF0Y2ggfTtcclxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BuildPropertyReplacementContext, PropertyReplacement } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Applies the collected property replacements in reverse source order.
|
|
4
|
+
* @param text Original object literal source text.
|
|
5
|
+
* @param replacements Replacement operations for the object literal.
|
|
6
|
+
* @param offset Absolute start offset of the object literal.
|
|
7
|
+
* @returns Updated object literal source text.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const objectText = applyTextReplacements(text, replacements, offset);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
declare function applyTextReplacements(text: string, replacements: readonly PropertyReplacement[], offset: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Builds the replacement entry when a property's source text must change.
|
|
16
|
+
* @param context Data needed to rewrite one supported object property.
|
|
17
|
+
* @returns Replacement details when the property text changes.
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const replacement = buildPropertyReplacement(context);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function buildPropertyReplacement(context: BuildPropertyReplacementContext): PropertyReplacement | undefined;
|
|
24
|
+
export { applyTextReplacements, buildPropertyReplacement };
|
|
25
|
+
//# sourceMappingURL=replacement-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replacement-helpers.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+BAA+B,EAC/B,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;;GAUG;AACH,iBAAS,qBAAqB,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,mBAAmB,EAAE,EAC5C,MAAM,EAAE,MAAM,GACb,MAAM,CAaR;AAED;;;;;;;;GAQG;AACH,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,+BAA+B,GACvC,mBAAmB,GAAG,SAAS,CAWjC;AAsFD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { canUseShorthand, unwrapExpression } from "./ast-helpers.js";
|
|
2
|
+
/**
|
|
3
|
+
* Applies the collected property replacements in reverse source order.
|
|
4
|
+
* @param text Original object literal source text.
|
|
5
|
+
* @param replacements Replacement operations for the object literal.
|
|
6
|
+
* @param offset Absolute start offset of the object literal.
|
|
7
|
+
* @returns Updated object literal source text.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const objectText = applyTextReplacements(text, replacements, offset);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function applyTextReplacements(text, replacements, offset) {
|
|
14
|
+
let currentText = text;
|
|
15
|
+
for (const replacement of replacements.toSorted((left, right) => right.range[0] - left.range[0])) {
|
|
16
|
+
const start = replacement.range[0] - offset;
|
|
17
|
+
const end = replacement.range[1] - offset;
|
|
18
|
+
currentText = `${currentText.slice(0, start)}${replacement.replacementText}${currentText.slice(end)}`;
|
|
19
|
+
}
|
|
20
|
+
return currentText;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builds the replacement entry when a property's source text must change.
|
|
24
|
+
* @param context Data needed to rewrite one supported object property.
|
|
25
|
+
* @returns Replacement details when the property text changes.
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const replacement = buildPropertyReplacement(context);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
function buildPropertyReplacement(context) {
|
|
32
|
+
const replacementText = buildReplacementText(context);
|
|
33
|
+
const propertyRange = context.property.range;
|
|
34
|
+
const originalText = context.sourceText.slice(propertyRange[0], propertyRange[1]);
|
|
35
|
+
return originalText === replacementText
|
|
36
|
+
? void 0
|
|
37
|
+
: { range: propertyRange, replacementText };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Builds the final source text for one object literal property.
|
|
41
|
+
* @param context Property replacement context.
|
|
42
|
+
* @returns Rewritten property text.
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const replacementText = buildReplacementText(context);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
function buildReplacementText(context) {
|
|
49
|
+
const { keyName, moduleSpecifier, namespaceAlias, property, sourceText } = context;
|
|
50
|
+
const baseValue = unwrapExpression(property.value);
|
|
51
|
+
const baseValueText = sourceText.slice(baseValue.range[0], baseValue.range[1]);
|
|
52
|
+
const keyText = sourceText.slice(property.key.range[0], property.key.range[1]);
|
|
53
|
+
const needsCast = isPropertyCastRequired(context, baseValue);
|
|
54
|
+
const valueText = needsCast
|
|
55
|
+
? `${baseValueText} as ${getPropertyTypeText(moduleSpecifier, keyName, namespaceAlias)}`
|
|
56
|
+
: baseValueText;
|
|
57
|
+
return canUseShorthand({ baseValue, keyName, needsCast, property })
|
|
58
|
+
? keyName
|
|
59
|
+
: `${keyText}: ${valueText}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Builds the imported property type expression used for a nested cast.
|
|
63
|
+
* @param moduleSpecifier Static module specifier used by the mock.
|
|
64
|
+
* @param keyName Property name being cast.
|
|
65
|
+
* @param namespaceAlias Namespace alias for the module, when present.
|
|
66
|
+
* @returns Type expression for the imported property.
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const propertyType = getPropertyTypeText("fixture-module", "parser");
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
function getPropertyTypeText(moduleSpecifier, keyName, namespaceAlias) {
|
|
73
|
+
const moduleReference = namespaceAlias === void 0
|
|
74
|
+
? `import(${JSON.stringify(moduleSpecifier)})`
|
|
75
|
+
: namespaceAlias;
|
|
76
|
+
return `typeof ${moduleReference}[${JSON.stringify(keyName)}]`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determines whether a property value still needs a nested cast.
|
|
80
|
+
* @param context Property replacement context.
|
|
81
|
+
* @param baseValue Unwrapped property value expression.
|
|
82
|
+
* @returns True when the property value is not assignable to the target type.
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const needsCast = isPropertyCastRequired(context, baseValue);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
function isPropertyCastRequired(context, baseValue) {
|
|
89
|
+
const tsBaseValueNode = context.services.esTreeNodeToTSNodeMap.get(baseValue);
|
|
90
|
+
const tsPropertyKeyNode = context.services.esTreeNodeToTSNodeMap.get(context.property.key);
|
|
91
|
+
const sourceType = context.checker.getTypeAtLocation(tsBaseValueNode);
|
|
92
|
+
const propertyTargetType = context.checker.getTypeOfSymbolAtLocation(context.targetPropertySymbol, tsPropertyKeyNode);
|
|
93
|
+
return !context.checker.isTypeAssignableTo(sourceType, propertyTargetType);
|
|
94
|
+
}
|
|
95
|
+
export { applyTextReplacements, buildPropertyReplacement };
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZW1lbnQtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9wcmVmZXItdml0ZXN0LWluY3JlbWVudGFsLWNhc3RzL3JlcGxhY2VtZW50LWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsSUFBWSxFQUNaLFlBQTRDLEVBQzVDLE1BQWM7SUFFZCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFFdkIsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUM3QyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDaEQsRUFBRSxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFFMUMsV0FBVyxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDeEcsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLE9BQXdDO0lBRXhDLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELE1B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Q0FBQztBQUVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xyXG4gIEJ1aWxkUHJvcGVydHlSZXBsYWNlbWVudENvbnRleHQsXHJcbiAgUHJvcGVydHlSZXBsYWNlbWVudCxcclxufSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgY2FuVXNlU2hvcnRoYW5kLCB1bndyYXBFeHByZXNzaW9uIH0gZnJvbSBcIi4vYXN0LWhlbHBlcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIHRoZSBjb2xsZWN0ZWQgcHJvcGVydHkgcmVwbGFjZW1lbnRzIGluIHJldmVyc2Ugc291cmNlIG9yZGVyLlxyXG4gKiBAcGFyYW0gdGV4dCBPcmlnaW5hbCBvYmplY3QgbGl0ZXJhbCBzb3VyY2UgdGV4dC5cclxuICogQHBhcmFtIHJlcGxhY2VtZW50cyBSZXBsYWNlbWVudCBvcGVyYXRpb25zIGZvciB0aGUgb2JqZWN0IGxpdGVyYWwuXHJcbiAqIEBwYXJhbSBvZmZzZXQgQWJzb2x1dGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBvYmplY3QgbGl0ZXJhbC5cclxuICogQHJldHVybnMgVXBkYXRlZCBvYmplY3QgbGl0ZXJhbCBzb3VyY2UgdGV4dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBvYmplY3RUZXh0ID0gYXBwbHlUZXh0UmVwbGFjZW1lbnRzKHRleHQsIHJlcGxhY2VtZW50cywgb2Zmc2V0KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVRleHRSZXBsYWNlbWVudHMoXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlcGxhY2VtZW50czogcmVhZG9ubHkgUHJvcGVydHlSZXBsYWNlbWVudFtdLFxyXG4gIG9mZnNldDogbnVtYmVyLFxyXG4pOiBzdHJpbmcge1xyXG4gIGxldCBjdXJyZW50VGV4dCA9IHRleHQ7XHJcblxyXG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnRvU29ydGVkKFxyXG4gICAgKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5yYW5nZVswXSAtIGxlZnQucmFuZ2VbMF0sXHJcbiAgKSkge1xyXG4gICAgY29uc3Qgc3RhcnQgPSByZXBsYWNlbWVudC5yYW5nZVswXSAtIG9mZnNldDtcclxuICAgIGNvbnN0IGVuZCA9IHJlcGxhY2VtZW50LnJhbmdlWzFdIC0gb2Zmc2V0O1xyXG5cclxuICAgIGN1cnJlbnRUZXh0ID0gYCR7Y3VycmVudFRleHQuc2xpY2UoMCwgc3RhcnQpfSR7cmVwbGFjZW1lbnQucmVwbGFjZW1lbnRUZXh0fSR7Y3VycmVudFRleHQuc2xpY2UoZW5kKX1gO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHRoZSByZXBsYWNlbWVudCBlbnRyeSB3aGVuIGEgcHJvcGVydHkncyBzb3VyY2UgdGV4dCBtdXN0IGNoYW5nZS5cclxuICogQHBhcmFtIGNvbnRleHQgRGF0YSBuZWVkZWQgdG8gcmV3cml0ZSBvbmUgc3VwcG9ydGVkIG9iamVjdCBwcm9wZXJ0eS5cclxuICogQHJldHVybnMgUmVwbGFjZW1lbnQgZGV0YWlscyB3aGVuIHRoZSBwcm9wZXJ0eSB0ZXh0IGNoYW5nZXMuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgcmVwbGFjZW1lbnQgPSBidWlsZFByb3BlcnR5UmVwbGFjZW1lbnQoY29udGV4dCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50KFxyXG4gIGNvbnRleHQ6IEJ1aWxkUHJvcGVydHlSZXBsYWNlbWVudENvbnRleHQsXHJcbik6IFByb3BlcnR5UmVwbGFjZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHJlcGxhY2VtZW50VGV4dCA9IGJ1aWxkUmVwbGFjZW1lbnRUZXh0KGNvbnRleHQpO1xyXG4gIGNvbnN0IHByb3BlcnR5UmFuZ2UgPSBjb250ZXh0LnByb3BlcnR5LnJhbmdlO1xyXG4gIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGNvbnRleHQuc291cmNlVGV4dC5zbGljZShcclxuICAgIHByb3BlcnR5UmFuZ2VbMF0sXHJcbiAgICBwcm9wZXJ0eVJhbmdlWzFdLFxyXG4gICk7XHJcblxyXG4gIHJldHVybiBvcmlnaW5hbFRleHQgPT09IHJlcGxhY2VtZW50VGV4dFxyXG4gICAgPyB2b2lkIDBcclxuICAgIDogeyByYW5nZTogcHJvcGVydHlSYW5nZSwgcmVwbGFjZW1lbnRUZXh0IH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgdGhlIGZpbmFsIHNvdXJjZSB0ZXh0IGZvciBvbmUgb2JqZWN0IGxpdGVyYWwgcHJvcGVydHkuXHJcbiAqIEBwYXJhbSBjb250ZXh0IFByb3BlcnR5IHJlcGxhY2VtZW50IGNvbnRleHQuXHJcbiAqIEByZXR1cm5zIFJld3JpdHRlbiBwcm9wZXJ0eSB0ZXh0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IHJlcGxhY2VtZW50VGV4dCA9IGJ1aWxkUmVwbGFjZW1lbnRUZXh0KGNvbnRleHQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkUmVwbGFjZW1lbnRUZXh0KFxyXG4gIGNvbnRleHQ6IEJ1aWxkUHJvcGVydHlSZXBsYWNlbWVudENvbnRleHQsXHJcbik6IHN0cmluZyB7XHJcbiAgY29uc3QgeyBrZXlOYW1lLCBtb2R1bGVTcGVjaWZpZXIsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0eSwgc291cmNlVGV4dCB9ID1cclxuICAgIGNvbnRleHQ7XHJcbiAgY29uc3QgYmFzZVZhbHVlID0gdW53cmFwRXhwcmVzc2lvbihwcm9wZXJ0eS52YWx1ZSk7XHJcbiAgY29uc3QgYmFzZVZhbHVlVGV4dCA9IHNvdXJjZVRleHQuc2xpY2UoXHJcbiAgICBiYXNlVmFsdWUucmFuZ2VbMF0sXHJcbiAgICBiYXNlVmFsdWUucmFuZ2VbMV0sXHJcbiAgKTtcclxuICBjb25zdCBrZXlUZXh0ID0gc291cmNlVGV4dC5zbGljZShcclxuICAgIHByb3BlcnR5LmtleS5yYW5nZVswXSxcclxuICAgIHByb3BlcnR5LmtleS5yYW5nZVsxXSxcclxuICApO1xyXG4gIGNvbnN0IG5lZWRzQ2FzdCA9IGlzUHJvcGVydHlDYXN0UmVxdWlyZWQoY29udGV4dCwgYmFzZVZhbHVlKTtcclxuICBjb25zdCB2YWx1ZVRleHQgPSBuZWVkc0Nhc3RcclxuICAgID8gYCR7YmFzZVZhbHVlVGV4dH0gYXMgJHtnZXRQcm9wZXJ0eVR5cGVUZXh0KG1vZHVsZVNwZWNpZmllciwga2V5TmFtZSwgbmFtZXNwYWNlQWxpYXMpfWBcclxuICAgIDogYmFzZVZhbHVlVGV4dDtcclxuXHJcbiAgcmV0dXJuIGNhblVzZVNob3J0aGFuZCh7IGJhc2VWYWx1ZSwga2V5TmFtZSwgbmVlZHNDYXN0LCBwcm9wZXJ0eSB9KVxyXG4gICAgPyBrZXlOYW1lXHJcbiAgICA6IGAke2tleVRleHR9OiAke3ZhbHVlVGV4dH1gO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHRoZSBpbXBvcnRlZCBwcm9wZXJ0eSB0eXBlIGV4cHJlc3Npb24gdXNlZCBmb3IgYSBuZXN0ZWQgY2FzdC5cclxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBTdGF0aWMgbW9kdWxlIHNwZWNpZmllciB1c2VkIGJ5IHRoZSBtb2NrLlxyXG4gKiBAcGFyYW0ga2V5TmFtZSBQcm9wZXJ0eSBuYW1lIGJlaW5nIGNhc3QuXHJcbiAqIEBwYXJhbSBuYW1lc3BhY2VBbGlhcyBOYW1lc3BhY2UgYWxpYXMgZm9yIHRoZSBtb2R1bGUsIHdoZW4gcHJlc2VudC5cclxuICogQHJldHVybnMgVHlwZSBleHByZXNzaW9uIGZvciB0aGUgaW1wb3J0ZWQgcHJvcGVydHkuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgcHJvcGVydHlUeXBlID0gZ2V0UHJvcGVydHlUeXBlVGV4dChcImZpeHR1cmUtbW9kdWxlXCIsIFwicGFyc2VyXCIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFByb3BlcnR5VHlwZVRleHQoXHJcbiAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsXHJcbiAga2V5TmFtZTogc3RyaW5nLFxyXG4gIG5hbWVzcGFjZUFsaWFzPzogc3RyaW5nLFxyXG4pOiBzdHJpbmcge1xyXG4gIGNvbnN0IG1vZHVsZVJlZmVyZW5jZSA9XHJcbiAgICBuYW1lc3BhY2VBbGlhcyA9PT0gdm9pZCAwXHJcbiAgICAgID8gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KG1vZHVsZVNwZWNpZmllcil9KWBcclxuICAgICAgOiBuYW1lc3BhY2VBbGlhcztcclxuXHJcbiAgcmV0dXJuIGB0eXBlb2YgJHttb2R1bGVSZWZlcmVuY2V9WyR7SlNPTi5zdHJpbmdpZnkoa2V5TmFtZSl9XWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eSB2YWx1ZSBzdGlsbCBuZWVkcyBhIG5lc3RlZCBjYXN0LlxyXG4gKiBAcGFyYW0gY29udGV4dCBQcm9wZXJ0eSByZXBsYWNlbWVudCBjb250ZXh0LlxyXG4gKiBAcGFyYW0gYmFzZVZhbHVlIFVud3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBleHByZXNzaW9uLlxyXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSB0YXJnZXQgdHlwZS5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBuZWVkc0Nhc3QgPSBpc1Byb3BlcnR5Q2FzdFJlcXVpcmVkKGNvbnRleHQsIGJhc2VWYWx1ZSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaXNQcm9wZXJ0eUNhc3RSZXF1aXJlZChcclxuICBjb250ZXh0OiBCdWlsZFByb3BlcnR5UmVwbGFjZW1lbnRDb250ZXh0LFxyXG4gIGJhc2VWYWx1ZTogQnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50Q29udGV4dFtcInByb3BlcnR5XCJdW1widmFsdWVcIl0sXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHRzQmFzZVZhbHVlTm9kZSA9IGNvbnRleHQuc2VydmljZXMuZXNUcmVlTm9kZVRvVFNOb2RlTWFwLmdldChiYXNlVmFsdWUpO1xyXG4gIGNvbnN0IHRzUHJvcGVydHlLZXlOb2RlID0gY29udGV4dC5zZXJ2aWNlcy5lc1RyZWVOb2RlVG9UU05vZGVNYXAuZ2V0KFxyXG4gICAgY29udGV4dC5wcm9wZXJ0eS5rZXksXHJcbiAgKTtcclxuICBjb25zdCBzb3VyY2VUeXBlID0gY29udGV4dC5jaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHRzQmFzZVZhbHVlTm9kZSk7XHJcbiAgY29uc3QgcHJvcGVydHlUYXJnZXRUeXBlID0gY29udGV4dC5jaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24oXHJcbiAgICBjb250ZXh0LnRhcmdldFByb3BlcnR5U3ltYm9sLFxyXG4gICAgdHNQcm9wZXJ0eUtleU5vZGUsXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuICFjb250ZXh0LmNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKHNvdXJjZVR5cGUsIHByb3BlcnR5VGFyZ2V0VHlwZSk7XHJcbn1cclxuXHJcbmV4cG9ydCB7IGFwcGx5VGV4dFJlcGxhY2VtZW50cywgYnVpbGRQcm9wZXJ0eVJlcGxhY2VtZW50IH07XHJcbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Linter } from "eslint";
|
|
2
|
+
/** Type definition for rule data. */
|
|
3
|
+
interface FixRunResult {
|
|
4
|
+
/** Lint messages produced during the run. */
|
|
5
|
+
messages: Linter.LintMessage[];
|
|
6
|
+
/** Output code after fixes. */
|
|
7
|
+
output: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Removes temporary fixture projects created during rule tests.
|
|
11
|
+
* @returns Promise that resolves after cleanup completes.
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* await cleanupTemporaryDirectories();
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
declare const cleanupTemporaryDirectories: () => Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Runs the rule with autofix enabled inside a temporary typed fixture project.
|
|
20
|
+
* @param code Source code passed to ESLint.
|
|
21
|
+
* @param declarationText Ambient declarations used by the fixture project.
|
|
22
|
+
* @returns Fixed output and lint messages.
|
|
23
|
+
* @throws {Error} When ESLint does not return a lint result.
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const result = await runFix("vi.doMock(import(\"fixture-module\"), () => ({}));\n");
|
|
27
|
+
* void result;
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare const runFix: (code: string, declarationText?: string) => Promise<FixRunResult>;
|
|
31
|
+
export { cleanupTemporaryDirectories, runFix };
|
|
32
|
+
//# sourceMappingURL=rule-test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-test-helpers.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUrC,qCAAqC;AACrC,UAAU,YAAY;IACpB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAE/B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAgJD;;;;;;;GAOG;AACH,QAAA,MAAM,2BAA2B,QAAa,OAAO,CAAC,IAAI,CAQzD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,MAAM,GACV,MAAM,MAAM,EACZ,wBAAwC,KACvC,OAAO,CAAC,YAAY,CAuBtB,CAAC;AAEF,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { ESLint } from "eslint";
|
|
2
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { parser } from "typescript-eslint";
|
|
6
|
+
import { preferVitestIncrementalCastsRule } from "./rule.js";
|
|
7
|
+
/** Ambient declarations used by the typed fixture project. */
|
|
8
|
+
const defaultDeclarationText = [
|
|
9
|
+
'declare module "fixture-module" {',
|
|
10
|
+
" export const configs: { disableTypeChecked: { rules: string[]; strict: boolean } };",
|
|
11
|
+
" export const extra: number;",
|
|
12
|
+
" export const parser: { parseForESLint(code: string): { ast: string } };",
|
|
13
|
+
" export const plugin: { meta: { name: string } };",
|
|
14
|
+
"}",
|
|
15
|
+
"",
|
|
16
|
+
"declare const vi: {",
|
|
17
|
+
' doMock(specifier: Promise<typeof import("fixture-module")>, factory: () => typeof import("fixture-module")): void;',
|
|
18
|
+
' doMock(specifier: Promise<typeof import("fixture-module")>, factory: () => Partial<typeof import("fixture-module")>): void;',
|
|
19
|
+
' doMock(specifier: Promise<typeof import("fixture-module")>, factory: () => Promise<Partial<typeof import("fixture-module")>>): void;',
|
|
20
|
+
' mock(specifier: Promise<typeof import("fixture-module")>, factory: () => typeof import("fixture-module")): void;',
|
|
21
|
+
' mock(specifier: Promise<typeof import("fixture-module")>, factory: () => Partial<typeof import("fixture-module")>): void;',
|
|
22
|
+
' mock(specifier: Promise<typeof import("fixture-module")>, factory: (importOriginal: () => Promise<typeof import("fixture-module")>) => Promise<Partial<typeof import("fixture-module")>>): void;',
|
|
23
|
+
"};",
|
|
24
|
+
"",
|
|
25
|
+
].join("\n");
|
|
26
|
+
/** Temporary fixture directories pending cleanup. */
|
|
27
|
+
const temporaryDirectories = [];
|
|
28
|
+
/**
|
|
29
|
+
* Creates the fixture tsconfig text used by typed rule runs.
|
|
30
|
+
* @returns Serialized tsconfig file contents.
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const tsconfigText = createTsconfigText();
|
|
34
|
+
* void tsconfigText;
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
const createTsconfigText = () => JSON.stringify({
|
|
38
|
+
compilerOptions: {
|
|
39
|
+
module: "esnext",
|
|
40
|
+
moduleResolution: "bundler",
|
|
41
|
+
noEmit: true,
|
|
42
|
+
strict: true,
|
|
43
|
+
target: "esnext",
|
|
44
|
+
},
|
|
45
|
+
include: ["**/*.ts", "**/*.d.ts"],
|
|
46
|
+
}, void 0, 2);
|
|
47
|
+
/**
|
|
48
|
+
* Creates the typed ESLint instance used by the rule tests.
|
|
49
|
+
* @param directory Fixture directory that becomes ESLint cwd.
|
|
50
|
+
* @param tsconfigPath Path to the generated fixture tsconfig.
|
|
51
|
+
* @returns ESLint instance configured for the typed rule.
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const eslint = createTypedRuleEslint("/tmp/project", "/tmp/project/tsconfig.json");
|
|
55
|
+
* void eslint;
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
const createTypedRuleEslint = (directory, tsconfigPath) => new ESLint({
|
|
59
|
+
cwd: directory,
|
|
60
|
+
fix: true,
|
|
61
|
+
ignore: false,
|
|
62
|
+
overrideConfig: [
|
|
63
|
+
{
|
|
64
|
+
files: ["**/*.ts"],
|
|
65
|
+
languageOptions: {
|
|
66
|
+
parser,
|
|
67
|
+
parserOptions: {
|
|
68
|
+
ecmaVersion: 2022,
|
|
69
|
+
project: [tsconfigPath],
|
|
70
|
+
sourceType: "module",
|
|
71
|
+
tsconfigRootDir: directory,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
plugins: {
|
|
75
|
+
codeperfect: {
|
|
76
|
+
rules: {
|
|
77
|
+
"prefer-vitest-incremental-casts": preferVitestIncrementalCastsRule,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
rules: {
|
|
82
|
+
"codeperfect/prefer-vitest-incremental-casts": "error",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
overrideConfigFile: true,
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* Creates the temporary fixture project used by typed helper runs.
|
|
90
|
+
* @param declarationText Ambient declarations used by the fixture project.
|
|
91
|
+
* @returns Fresh fixture project state.
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const fixtureProject = await createFixtureProject(defaultDeclarationText);
|
|
95
|
+
* void fixtureProject;
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
const createFixtureProject = async (declarationText) => {
|
|
99
|
+
const directory = await mkdtemp(path.join(tmpdir(), "codeperfect-rule-"));
|
|
100
|
+
const globalsPath = path.join(directory, "globals.d.ts");
|
|
101
|
+
const tsconfigPath = path.join(directory, "tsconfig.json");
|
|
102
|
+
temporaryDirectories.push(directory);
|
|
103
|
+
await Promise.all([
|
|
104
|
+
writeFile(globalsPath, declarationText, "utf8"),
|
|
105
|
+
writeFile(tsconfigPath, createTsconfigText(), "utf8"),
|
|
106
|
+
]);
|
|
107
|
+
return { directory, tsconfigPath };
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Creates a unique file path for one isolated lint run.
|
|
111
|
+
* @param directory Temporary fixture directory.
|
|
112
|
+
* @returns Unique file path for the current run.
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* createRunFilePath("/tmp/project");
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
const createRunFilePath = (directory) => path.join(directory, "example.spec.ts");
|
|
119
|
+
/**
|
|
120
|
+
* Removes temporary fixture projects created during rule tests.
|
|
121
|
+
* @returns Promise that resolves after cleanup completes.
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* await cleanupTemporaryDirectories();
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
const cleanupTemporaryDirectories = async () => {
|
|
128
|
+
await Promise.all(temporaryDirectories
|
|
129
|
+
.splice(0)
|
|
130
|
+
.map(async (directory) => rm(directory, { force: true, recursive: true })));
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Runs the rule with autofix enabled inside a temporary typed fixture project.
|
|
134
|
+
* @param code Source code passed to ESLint.
|
|
135
|
+
* @param declarationText Ambient declarations used by the fixture project.
|
|
136
|
+
* @returns Fixed output and lint messages.
|
|
137
|
+
* @throws {Error} When ESLint does not return a lint result.
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const result = await runFix("vi.doMock(import(\"fixture-module\"), () => ({}));\n");
|
|
141
|
+
* void result;
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
const runFix = async (code, declarationText = defaultDeclarationText) => {
|
|
145
|
+
const fixtureProject = await createFixtureProject(declarationText);
|
|
146
|
+
const filePath = createRunFilePath(fixtureProject.directory);
|
|
147
|
+
const eslint = createTypedRuleEslint(fixtureProject.directory, fixtureProject.tsconfigPath);
|
|
148
|
+
await writeFile(filePath, code, "utf8");
|
|
149
|
+
try {
|
|
150
|
+
const [result] = await eslint.lintText(code, { filePath });
|
|
151
|
+
if (result === void 0) {
|
|
152
|
+
throw new Error("Expected ESLint to return a lint result.");
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
messages: result.messages,
|
|
156
|
+
output: result.output ?? code,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
await rm(fixtureProject.directory, { force: true, recursive: true });
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
export { cleanupTemporaryDirectories, runFix };
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS10ZXN0LWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvcHJlZmVyLXZpdGVzdC1pbmNyZW1lbnRhbC1jYXN0cy9ydWxlLXRlc3QtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFvQjFELDhEQUE4RDtBQUM5RCxNQUFNLHNCQUFzQixHQUFHO0lBQzdCLG1DQUFtQztJQUNuQyx1RkFBdUY7SUFDdkYsK0JBQStCO0lBQy9CLDJFQUEyRTtJQUMzRSxvREFBb0Q7SUFDcEQsR0FBRztJQUNILEVBQUU7SUFDRixxQkFBcUI7SUFDckIsc0hBQXNIO0lBQ3RILCtIQUErSDtJQUMvSCx3SUFBd0k7SUFDeEksb0hBQW9IO0lBQ3BILDZIQUE2SDtJQUM3SCxvTUFBb007SUFDcE0sSUFBSTtJQUNKLEVBQUU7Q0FDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUViLHFEQUFxRDtBQUNyRCxNQUFNLG9CQUFvQixHQUFhLEVBQUUsQ0FBQztBQUUxQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsR0FBVyxFQUFFLENBQ3RDLElBQUksQ0FBQyxTQUFTLENBQ1o7SUFDRSxlQUFlLEVBQUU7UUFDZixNQUFNLEVBQUUsUUFBUTtRQUNoQixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLE1BQU0s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QUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FDbEMsY0FBYyxDQUFDLFNBQVMsRUFDeEIsY0FBYyxDQUFDLFlBQVksQ0FDNUIsQ0FBQztJQUVGLE1BQU0sU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTNELElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUk7U0FDOUIsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGludGVyIH0gZnJvbSBcImVzbGludFwiO1xyXG5cclxuaW1wb3J0IHsgRVNMaW50IH0gZnJvbSBcImVzbGludFwiO1xyXG5pbXBvcnQgeyBta2R0ZW1wLCBybSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcclxuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcclxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xyXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tIFwidHlwZXNjcmlwdC1lc2xpbnRcIjtcclxuXHJcbmltcG9ydCB7IHByZWZlclZpdGVzdEluY3JlbWVudGFsQ2FzdHNSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xyXG5cclxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xyXG5pbnRlcmZhY2UgRml4UnVuUmVzdWx0IHtcclxuICAvKiogTGludCBtZXNzYWdlcyBwcm9kdWNlZCBkdXJpbmcgdGhlIHJ1bi4gKi9cclxuICBtZXNzYWdlczogTGludGVyLkxpbnRNZXNzYWdlW107XHJcblxyXG4gIC8qKiBPdXRwdXQgY29kZSBhZnRlciBmaXhlcy4gKi9cclxuICBvdXRwdXQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xyXG5pbnRlcmZhY2UgRml4dHVyZVByb2plY3Qge1xyXG4gIC8qKiBUZW1wb3JhcnkgZml4dHVyZSBkaXJlY3RvcnkgcGF0aC4gKi9cclxuICBkaXJlY3Rvcnk6IHN0cmluZztcclxuXHJcbiAgLyoqIEZpeHR1cmUgdHNjb25maWcgcGF0aCB1c2VkIGJ5IHR5cGVkIEVTTGludC4gKi9cclxuICB0c2NvbmZpZ1BhdGg6IHN0cmluZztcclxufVxyXG5cclxuLyoqIEFtYmllbnQgZGVjbGFyYXRpb25zIHVzZWQgYnkgdGhlIHR5cGVkIGZpeHR1cmUgcHJvamVjdC4gKi9cclxuY29uc3QgZGVmYXVsdERlY2xhcmF0aW9uVGV4dCA9IFtcclxuICAnZGVjbGFyZSBtb2R1bGUgXCJmaXh0dXJlLW1vZHVsZVwiIHsnLFxyXG4gIFwiICBleHBvcnQgY29uc3QgY29uZmlnczogeyBkaXNhYmxlVHlwZUNoZWNrZWQ6IHsgcnVsZXM6IHN0cmluZ1tdOyBzdHJpY3Q6IGJvb2xlYW4gfSB9O1wiLFxyXG4gIFwiICBleHBvcnQgY29uc3QgZXh0cmE6IG51bWJlcjtcIixcclxuICBcIiAgZXhwb3J0IGNvbnN0IHBhcnNlcjogeyBwYXJzZUZvckVTTGludChjb2RlOiBzdHJpbmcpOiB7IGFzdDogc3RyaW5nIH0gfTtcIixcclxuICBcIiAgZXhwb3J0IGNvbnN0IHBsdWdpbjogeyBtZXRhOiB7IG5hbWU6IHN0cmluZyB9IH07XCIsXHJcbiAgXCJ9XCIsXHJcbiAgXCJcIixcclxuICBcImRlY2xhcmUgY29uc3Qgdmk6IHtcIixcclxuICAnICBkb01vY2soc3BlY2lmaWVyOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJmaXh0dXJlLW1vZHVsZVwiKT4sIGZhY3Rvcnk6ICgpID0+IHR5cGVvZiBpbXBvcnQoXCJmaXh0dXJlLW1vZHVsZVwiKSk6IHZvaWQ7JyxcclxuICAnICBkb01vY2soc3BlY2lmaWVyOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJmaXh0dXJlLW1vZHVsZVwiKT4sIGZhY3Rvcnk6ICgpID0+IFBhcnRpYWw8dHlwZW9mIGltcG9ydChcImZpeHR1cmUtbW9kdWxlXCIpPik6IHZvaWQ7JyxcclxuICAnICBkb01vY2soc3BlY2lmaWVyOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJmaXh0dXJlLW1vZHVsZVwiKT4sIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8UGFydGlhbDx0eXBlb2YgaW1wb3J0KFwiZml4dHVyZS1tb2R1bGVcIik+Pik6IHZvaWQ7JyxcclxuICAnICBtb2NrKHNwZWNpZmllcjogUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiZml4dHVyZS1tb2R1bGVcIik+LCBmYWN0b3J5OiAoKSA9PiB0eXBlb2YgaW1wb3J0KFwiZml4dHVyZS1tb2R1bGVcIikpOiB2b2lkOycsXHJcbiAgJyAgbW9jayhzcGVjaWZpZXI6IFByb21pc2U8dHlwZW9mIGltcG9ydChcImZpeHR1cmUtbW9kdWxlXCIpPiwgZmFjdG9yeTogKCkgPT4gUGFydGlhbDx0eXBlb2YgaW1wb3J0KFwiZml4dHVyZS1tb2R1bGVcIik+KTogdm9pZDsnLFxyXG4gICcgIG1vY2soc3BlY2lmaWVyOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJmaXh0dXJlLW1vZHVsZVwiKT4sIGZhY3Rvcnk6IChpbXBvcnRPcmlnaW5hbDogKCkgPT4gUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiZml4dHVyZS1tb2R1bGVcIik+KSA9PiBQcm9taXNlPFBhcnRpYWw8dHlwZW9mIGltcG9ydChcImZpeHR1cmUtbW9kdWxlXCIpPj4pOiB2b2lkOycsXHJcbiAgXCJ9O1wiLFxyXG4gIFwiXCIsXHJcbl0uam9pbihcIlxcblwiKTtcclxuXHJcbi8qKiBUZW1wb3JhcnkgZml4dHVyZSBkaXJlY3RvcmllcyBwZW5kaW5nIGNsZWFudXAuICovXHJcbmNvbnN0IHRlbXBvcmFyeURpcmVjdG9yaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgdGhlIGZpeHR1cmUgdHNjb25maWcgdGV4dCB1c2VkIGJ5IHR5cGVkIHJ1bGUgcnVucy5cclxuICogQHJldHVybnMgU2VyaWFsaXplZCB0c2NvbmZpZyBmaWxlIGNvbnRlbnRzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IHRzY29uZmlnVGV4dCA9IGNyZWF0ZVRzY29uZmlnVGV4dCgpO1xyXG4gKiB2b2lkIHRzY29uZmlnVGV4dDtcclxuICogYGBgXHJcbiAqL1xyXG5jb25zdCBjcmVhdGVUc2NvbmZpZ1RleHQgPSAoKTogc3RyaW5nID0+XHJcbiAgSlNPTi5zdHJpbmdpZnkoXHJcbiAgICB7XHJcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xyXG4gICAgICAgIG1vZHVsZTogXCJlc25leHRcIixcclxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBcImJ1bmRsZXJcIixcclxuICAgICAgICBub0VtaXQ6IHRydWUsXHJcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxyXG4gICAgICAgIHRhcmdldDogXCJlc25leHRcIixcclxuICAgICAgfSxcclxuICAgICAgaW5jbHVkZTogW1wiKiovKi50c1wiLCBcIioqLyouZC50c1wiXSxcclxuICAgIH0sXHJcbiAgICB2b2lkIDAsXHJcbiAgICAyLFxyXG4gICk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyB0aGUgdHlwZWQgRVNMaW50IGluc3RhbmNlIHVzZWQgYnkgdGhlIHJ1bGUgdGVzdHMuXHJcbiAqIEBwYXJhbSBkaXJlY3RvcnkgRml4dHVyZSBkaXJlY3RvcnkgdGhhdCBiZWNvbWVzIEVTTGludCBjd2QuXHJcbiAqIEBwYXJhbSB0c2NvbmZpZ1BhdGggUGF0aCB0byB0aGUgZ2VuZXJhdGVkIGZpeHR1cmUgdHNjb25maWcuXHJcbiAqIEByZXR1cm5zIEVTTGludCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgdHlwZWQgcnVsZS5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBlc2xpbnQgPSBjcmVhdGVUeXBlZFJ1bGVFc2xpbnQoXCIvdG1wL3Byb2plY3RcIiwgXCIvdG1wL3Byb2plY3QvdHNjb25maWcuanNvblwiKTtcclxuICogdm9pZCBlc2xpbnQ7XHJcbiAqIGBgYFxyXG4gKi9cclxuY29uc3QgY3JlYXRlVHlwZWRSdWxlRXNsaW50ID0gKFxyXG4gIGRpcmVjdG9yeTogc3RyaW5nLFxyXG4gIHRzY29uZmlnUGF0aDogc3RyaW5nLFxyXG4pOiBFU0xpbnQgPT5cclxuICBuZXcgRVNMaW50KHtcclxuICAgIGN3ZDogZGlyZWN0b3J5LFxyXG4gICAgZml4OiB0cnVlLFxyXG4gICAgaWdub3JlOiBmYWxzZSxcclxuICAgIG92ZXJyaWRlQ29uZmlnOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBmaWxlczogW1wiKiovKi50c1wiXSxcclxuICAgICAgICBsYW5ndWFnZU9wdGlvbnM6IHtcclxuICAgICAgICAgIHBhcnNlcixcclxuICAgICAgICAgIHBhcnNlck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZWNtYVZlcnNpb246IDIwMjIsXHJcbiAgICAgICAgICAgIHByb2plY3Q6IFt0c2NvbmZpZ1BhdGhdLFxyXG4gICAgICAgICAgICBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiLFxyXG4gICAgICAgICAgICB0c2NvbmZpZ1Jvb3REaXI6IGRpcmVjdG9yeSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICBjb2RlcGVyZmVjdDoge1xyXG4gICAgICAgICAgICBydWxlczoge1xyXG4gICAgICAgICAgICAgIFwicHJlZmVyLXZpdGVzdC1pbmNyZW1lbnRhbC1jYXN0c1wiOlxyXG4gICAgICAgICAgICAgICAgcHJlZmVyVml0ZXN0SW5jcmVtZW50YWxDYXN0c1J1bGUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcnVsZXM6IHtcclxuICAgICAgICAgIFwiY29kZXBlcmZlY3QvcHJlZmVyLXZpdGVzdC1pbmNyZW1lbnRhbC1jYXN0c1wiOiBcImVycm9yXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgICBvdmVycmlkZUNvbmZpZ0ZpbGU6IHRydWUsXHJcbiAgfSk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyB0aGUgdGVtcG9yYXJ5IGZpeHR1cmUgcHJvamVjdCB1c2VkIGJ5IHR5cGVkIGhlbHBlciBydW5zLlxyXG4gKiBAcGFyYW0gZGVjbGFyYXRpb25UZXh0IEFtYmllbnQgZGVjbGFyYXRpb25zIHVzZWQgYnkgdGhlIGZpeHR1cmUgcHJvamVjdC5cclxuICogQHJldHVybnMgRnJlc2ggZml4dHVyZSBwcm9qZWN0IHN0YXRlLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeHR1cmVQcm9qZWN0ID0gYXdhaXQgY3JlYXRlRml4dHVyZVByb2plY3QoZGVmYXVsdERlY2xhcmF0aW9uVGV4dCk7XHJcbiAqIHZvaWQgZml4dHVyZVByb2plY3Q7XHJcbiAqIGBgYFxyXG4gKi9cclxuY29uc3QgY3JlYXRlRml4dHVyZVByb2plY3QgPSBhc3luYyAoXHJcbiAgZGVjbGFyYXRpb25UZXh0OiBzdHJpbmcsXHJcbik6IFByb21pc2U8Rml4dHVyZVByb2plY3Q+ID0+IHtcclxuICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBta2R0ZW1wKHBhdGguam9pbih0bXBkaXIoKSwgXCJjb2RlcGVyZmVjdC1ydWxlLVwiKSk7XHJcbiAgY29uc3QgZ2xvYmFsc1BhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBcImdsb2JhbHMuZC50c1wiKTtcclxuICBjb25zdCB0c2NvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBcInRzY29uZmlnLmpzb25cIik7XHJcblxyXG4gIHRlbXBvcmFyeURpcmVjdG9yaWVzLnB1c2goZGlyZWN0b3J5KTtcclxuICBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICB3cml0ZUZpbGUoZ2xvYmFsc1BhdGgsIGRlY2xhcmF0aW9uVGV4dCwgXCJ1dGY4XCIpLFxyXG4gICAgd3JpdGVGaWxlKHRzY29uZmlnUGF0aCwgY3JlYXRlVHNjb25maWdUZXh0KCksIFwidXRmOFwiKSxcclxuICBdKTtcclxuXHJcbiAgcmV0dXJuIHsgZGlyZWN0b3J5LCB0c2NvbmZpZ1BhdGggfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdW5pcXVlIGZpbGUgcGF0aCBmb3Igb25lIGlzb2xhdGVkIGxpbnQgcnVuLlxyXG4gKiBAcGFyYW0gZGlyZWN0b3J5IFRlbXBvcmFyeSBmaXh0dXJlIGRpcmVjdG9yeS5cclxuICogQHJldHVybnMgVW5pcXVlIGZpbGUgcGF0aCBmb3IgdGhlIGN1cnJlbnQgcnVuLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNyZWF0ZVJ1bkZpbGVQYXRoKFwiL3RtcC9wcm9qZWN0XCIpO1xyXG4gKiBgYGBcclxuICovXHJcbmNvbnN0IGNyZWF0ZVJ1bkZpbGVQYXRoID0gKGRpcmVjdG9yeTogc3RyaW5nKTogc3RyaW5nID0+XHJcbiAgcGF0aC5qb2luKGRpcmVjdG9yeSwgXCJleGFtcGxlLnNwZWMudHNcIik7XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyB0ZW1wb3JhcnkgZml4dHVyZSBwcm9qZWN0cyBjcmVhdGVkIGR1cmluZyBydWxlIHRlc3RzLlxyXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY2xlYW51cCBjb21wbGV0ZXMuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogYXdhaXQgY2xlYW51cFRlbXBvcmFyeURpcmVjdG9yaWVzKCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY29uc3QgY2xlYW51cFRlbXBvcmFyeURpcmVjdG9yaWVzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgdGVtcG9yYXJ5RGlyZWN0b3JpZXNcclxuICAgICAgLnNwbGljZSgwKVxyXG4gICAgICAubWFwKGFzeW5jIChkaXJlY3RvcnkpID0+XHJcbiAgICAgICAgcm0oZGlyZWN0b3J5LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXHJcbiAgICAgICksXHJcbiAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSdW5zIHRoZSBydWxlIHdpdGggYXV0b2ZpeCBlbmFibGVkIGluc2lkZSBhIHRlbXBvcmFyeSB0eXBlZCBmaXh0dXJlIHByb2plY3QuXHJcbiAqIEBwYXJhbSBjb2RlIFNvdXJjZSBjb2RlIHBhc3NlZCB0byBFU0xpbnQuXHJcbiAqIEBwYXJhbSBkZWNsYXJhdGlvblRleHQgQW1iaWVudCBkZWNsYXJhdGlvbnMgdXNlZCBieSB0aGUgZml4dHVyZSBwcm9qZWN0LlxyXG4gKiBAcmV0dXJucyBGaXhlZCBvdXRwdXQgYW5kIGxpbnQgbWVzc2FnZXMuXHJcbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIEVTTGludCBkb2VzIG5vdCByZXR1cm4gYSBsaW50IHJlc3VsdC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5GaXgoXCJ2aS5kb01vY2soaW1wb3J0KFxcXCJmaXh0dXJlLW1vZHVsZVxcXCIpLCAoKSA9PiAoe30pKTtcXG5cIik7XHJcbiAqIHZvaWQgcmVzdWx0O1xyXG4gKiBgYGBcclxuICovXHJcbmNvbnN0IHJ1bkZpeCA9IGFzeW5jIChcclxuICBjb2RlOiBzdHJpbmcsXHJcbiAgZGVjbGFyYXRpb25UZXh0ID0gZGVmYXVsdERlY2xhcmF0aW9uVGV4dCxcclxuKTogUHJvbWlzZTxGaXhSdW5SZXN1bHQ+ID0+IHtcclxuICBjb25zdCBmaXh0dXJlUHJvamVjdCA9IGF3YWl0IGNyZWF0ZUZpeHR1cmVQcm9qZWN0KGRlY2xhcmF0aW9uVGV4dCk7XHJcbiAgY29uc3QgZmlsZVBhdGggPSBjcmVhdGVSdW5GaWxlUGF0aChmaXh0dXJlUHJvamVjdC5kaXJlY3RvcnkpO1xyXG4gIGNvbnN0IGVzbGludCA9IGNyZWF0ZVR5cGVkUnVsZUVzbGludChcclxuICAgIGZpeHR1cmVQcm9qZWN0LmRpcmVjdG9yeSxcclxuICAgIGZpeHR1cmVQcm9qZWN0LnRzY29uZmlnUGF0aCxcclxuICApO1xyXG5cclxuICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGNvZGUsIFwidXRmOFwiKTtcclxuICB0cnkge1xyXG4gICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBlc2xpbnQubGludFRleHQoY29kZSwgeyBmaWxlUGF0aCB9KTtcclxuXHJcbiAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgRVNMaW50IHRvIHJldHVybiBhIGxpbnQgcmVzdWx0LlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXNzYWdlczogcmVzdWx0Lm1lc3NhZ2VzLFxyXG4gICAgICBvdXRwdXQ6IHJlc3VsdC5vdXRwdXQgPz8gY29kZSxcclxuICAgIH07XHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGF3YWl0IHJtKGZpeHR1cmVQcm9qZWN0LmRpcmVjdG9yeSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCB7IGNsZWFudXBUZW1wb3JhcnlEaXJlY3RvcmllcywgcnVuRml4IH07XHJcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
/** Enforces minimal nested casts for `vi.mock` and `vi.doMock` factory objects. */
|
|
3
|
+
declare const preferVitestIncrementalCastsRule: Rule.RuleModule;
|
|
4
|
+
export { preferVitestIncrementalCastsRule };
|
|
5
|
+
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vitest-incremental-casts/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkEnC,mFAAmF;AACnF,QAAA,MAAM,gCAAgC,EAwDrB,IAAI,CAAC,UAAU,CAAC;AAEjC,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.guardrails.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,QAAA,MAAM,uBAAuB,oDACsB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Suite name for the guardrail-focused companion spec. */
|
|
2
|
+
const ruleGuardrailsSuiteName = "prefer-vitest-incremental-casts rule guardrails";
|
|
3
|
+
export { ruleGuardrailsSuiteName };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5ndWFyZHJhaWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL3ByZWZlci12aXRlc3QtaW5jcmVtZW50YWwtY2FzdHMvcnVsZS5ndWFyZHJhaWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJEQUEyRDtBQUMzRCxNQUFNLHVCQUF1QixHQUMzQixpREFBaUQsQ0FBQztBQUVwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTdWl0ZSBuYW1lIGZvciB0aGUgZ3VhcmRyYWlsLWZvY3VzZWQgY29tcGFuaW9uIHNwZWMuICovXHJcbmNvbnN0IHJ1bGVHdWFyZHJhaWxzU3VpdGVOYW1lID1cclxuICBcInByZWZlci12aXRlc3QtaW5jcmVtZW50YWwtY2FzdHMgcnVsZSBndWFyZHJhaWxzXCI7XHJcblxyXG5leHBvcnQgeyBydWxlR3VhcmRyYWlsc1N1aXRlTmFtZSB9O1xyXG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.input-shapes.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,QAAA,MAAM,wBAAwB,sDACuB,CAAC;AAEtD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|