@codeperfect/eslint-plugin 1.0.0 → 2.0.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 +140 -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 +85 -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 +43 -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 +219 -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 +145 -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} +1 -1
- package/dist/domain/custom-rule-documentation.d.ts.map +1 -0
- package/dist/domain/custom-rule-documentation.js +35 -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 +168 -0
- package/dist/domain/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
- package/dist/domain/docs/no-interface-member-docs/test-helpers.js +157 -0
- 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 +34 -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.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 +196 -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 +92 -0
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts +4 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +4 -0
- package/dist/domain/testing/aaa/analyzer.analysis.js +247 -0
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts +93 -0
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.js +283 -0
- package/dist/domain/testing/aaa/analyzer.classification.d.ts +75 -0
- package/dist/domain/testing/aaa/analyzer.classification.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.js +201 -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.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 +107 -0
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.super.js +228 -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 +113 -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.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 +34 -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 +85 -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 +36 -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 +86 -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 +150 -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 +81 -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 +189 -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 +92 -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 +62 -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 +203 -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 +129 -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 +217 -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 +106 -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 +57 -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 +34 -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 +54 -27
- 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/test-helpers.js +0 -157
- 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.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/rule.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,85 @@
|
|
|
1
|
+
import { createRuleDocumentation } from "../../custom-rule-documentation.js";
|
|
2
|
+
import { aaaPhaseOrder, analyzeTestBlock, getFlattenedSections } from "../aaa/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reports a duplicate or out-of-order AAA section comment.
|
|
5
|
+
* @param input Composite reporting input for the current section.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* reportSectionIssue({
|
|
9
|
+
* context: {} as Rule.RuleContext,
|
|
10
|
+
* messageId: "duplicateSection",
|
|
11
|
+
* section: {} as ReturnType<typeof getFlattenedSections>[number],
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
const reportSectionIssue = (input) => {
|
|
16
|
+
const { context, messageId, section } = input;
|
|
17
|
+
context.report({
|
|
18
|
+
data: { section: section.phase },
|
|
19
|
+
messageId,
|
|
20
|
+
node: section.comment,
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Tracks the current AAA ordering state for one flattened section.
|
|
25
|
+
* @param input Composite ordering state for the current section.
|
|
26
|
+
* @returns Updated phase order watermark.
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const nextOrder = updateSectionOrder({
|
|
30
|
+
* context: {} as Rule.RuleContext,
|
|
31
|
+
* lastPhaseOrder: -1,
|
|
32
|
+
* section: {} as ReturnType<typeof getFlattenedSections>[number],
|
|
33
|
+
* seenPhases: new Set(),
|
|
34
|
+
* });
|
|
35
|
+
* void nextOrder;
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
const updateSectionOrder = (input) => {
|
|
39
|
+
const { context, lastPhaseOrder, section, seenPhases } = input;
|
|
40
|
+
if (seenPhases.has(section.phase)) {
|
|
41
|
+
reportSectionIssue({ context, messageId: "duplicateSection", section });
|
|
42
|
+
return lastPhaseOrder;
|
|
43
|
+
}
|
|
44
|
+
const currentPhaseOrder = aaaPhaseOrder[section.phase];
|
|
45
|
+
if (currentPhaseOrder < lastPhaseOrder) {
|
|
46
|
+
reportSectionIssue({ context, messageId: "invalidOrder", section });
|
|
47
|
+
}
|
|
48
|
+
seenPhases.add(section.phase);
|
|
49
|
+
return Math.max(lastPhaseOrder, currentPhaseOrder);
|
|
50
|
+
};
|
|
51
|
+
/** Enforces a single Arrange/Act/Assert sequence inside supported test blocks. */
|
|
52
|
+
const enforceAaaStructureRule = {
|
|
53
|
+
create(context) {
|
|
54
|
+
return {
|
|
55
|
+
CallExpression(node) {
|
|
56
|
+
const analysis = analyzeTestBlock(context, node);
|
|
57
|
+
if (analysis === void 0) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const flattenedSections = getFlattenedSections(analysis);
|
|
61
|
+
const seenPhases = new Set();
|
|
62
|
+
let lastPhaseOrder = -1;
|
|
63
|
+
for (const section of flattenedSections) {
|
|
64
|
+
lastPhaseOrder = updateSectionOrder({
|
|
65
|
+
context,
|
|
66
|
+
lastPhaseOrder,
|
|
67
|
+
section,
|
|
68
|
+
seenPhases,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
meta: {
|
|
75
|
+
docs: createRuleDocumentation("enforce-aaa-structure", "Require AAA sections to appear once and in Arrange, Act, Assert order."),
|
|
76
|
+
messages: {
|
|
77
|
+
duplicateSection: "Use the // {{section}} section comment only once per test.",
|
|
78
|
+
invalidOrder: "Move the // {{section}} section comment so AAA phases stay in Arrange, Act, Assert order.",
|
|
79
|
+
},
|
|
80
|
+
schema: [],
|
|
81
|
+
type: "problem",
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
export { enforceAaaStructureRule };
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9lbmZvcmNlLWFhYS1zdHJ1Y3R1cmUvcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBNkIvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUE4QixFQUFRLEVBQUU7SUFDbEUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRTlDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDYixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRTtRQUNoQyxTQUFTO1FBQ1QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO0tBQ3RCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQThCLEVBQVUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRS9ELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELElBQUksaUJBQWlCLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDdkMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsa0ZBQWtGO0FBQ2xGLE1BQU0sdUJBQXVCLEdBQW9CO0lBQy9DLE1BQU0sQ0FBQyxPQUF5QjtRQUM5QixPQUFPO1lBQ0wsY0FBYyxDQUFDLElBQUk7Z0JBQ2pCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxDQUFDO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0JBQ3JDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV4QixLQUFLLE1BQU0sT0FBTyxJQUFJLGlCQUFpQixFQUFFLENBQUM7b0JBQ3hDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQzt3QkFDbEMsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLE9BQU87d0JBQ1AsVUFBVTtxQkFDWCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7U0FDMEIsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLHVCQUF1QixDQUMzQix1QkFBdUIsRUFDdkIsd0VBQXdFLENBQ3pFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsZ0JBQWdCLEVBQ2QsNERBQTREO1lBQzlELFlBQVksRUFDViwyRkFBMkY7U0FDOUY7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxTQUFTO0tBQ2hCO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgeyBjcmVhdGVSdWxlRG9jdW1lbnRhdGlvbiB9IGZyb20gXCIuLi8uLi9jdXN0b20tcnVsZS1kb2N1bWVudGF0aW9uXCI7XG5pbXBvcnQgeyBhYWFQaGFzZU9yZGVyLCBhbmFseXplVGVzdEJsb2NrLCBnZXRGbGF0dGVuZWRTZWN0aW9ucyB9IGZyb20gXCIuLi9hYWFcIjtcblxuLyoqIENvbXBvc2l0ZSBpbnB1dCBmb3IgcmVwb3J0aW5nIG9uZSBBQUEgc2VjdGlvbiBpc3N1ZS4gKi9cbmludGVyZmFjZSBSZXBvcnRTZWN0aW9uSXNzdWVJbnB1dCB7XG4gIC8qKiBBY3RpdmUgRVNMaW50IHJ1bGUgY29udGV4dC4gKi9cbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dDtcblxuICAvKiogTWVzc2FnZSBpZGVudGlmaWVyIHRvIHJlcG9ydCBmb3IgdGhlIHNlY3Rpb24uICovXG4gIG1lc3NhZ2VJZDogXCJkdXBsaWNhdGVTZWN0aW9uXCIgfCBcImludmFsaWRPcmRlclwiO1xuXG4gIC8qKiBTZWN0aW9uIGNvbW1lbnQgYW5kIHBoYXNlIG1ldGFkYXRhIHVuZGVyIGluc3BlY3Rpb24uICovXG4gIHNlY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIGdldEZsYXR0ZW5lZFNlY3Rpb25zPltudW1iZXJdO1xufVxuXG4vKiogQ29tcG9zaXRlIGlucHV0IGZvciBhZHZhbmNpbmcgdGhlIEFBQSBzZWN0aW9uIG9yZGVyaW5nIHN0YXRlLiAqL1xuaW50ZXJmYWNlIFVwZGF0ZVNlY3Rpb25PcmRlcklucHV0IHtcbiAgLyoqIEFjdGl2ZSBFU0xpbnQgcnVsZSBjb250ZXh0LiAqL1xuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0O1xuXG4gIC8qKiBIaWdoZXN0IHBoYXNlIG9yZGVyIHNlZW4gc28gZmFyLiAqL1xuICBsYXN0UGhhc2VPcmRlcjogbnVtYmVyO1xuXG4gIC8qKiBTZWN0aW9uIGNvbW1lbnQgYW5kIHBoYXNlIG1ldGFkYXRhIHVuZGVyIGluc3BlY3Rpb24uICovXG4gIHNlY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIGdldEZsYXR0ZW5lZFNlY3Rpb25zPltudW1iZXJdO1xuXG4gIC8qKiBTZXQgb2YgcGhhc2VzIGFscmVhZHkgc2VlbiBpbiB0aGUgY3VycmVudCB0ZXN0IGJsb2NrLiAqL1xuICBzZWVuUGhhc2VzOiBTZXQ8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGEgZHVwbGljYXRlIG9yIG91dC1vZi1vcmRlciBBQUEgc2VjdGlvbiBjb21tZW50LlxuICogQHBhcmFtIGlucHV0IENvbXBvc2l0ZSByZXBvcnRpbmcgaW5wdXQgZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcmVwb3J0U2VjdGlvbklzc3VlKHtcbiAqICAgY29udGV4dDoge30gYXMgUnVsZS5SdWxlQ29udGV4dCxcbiAqICAgbWVzc2FnZUlkOiBcImR1cGxpY2F0ZVNlY3Rpb25cIixcbiAqICAgc2VjdGlvbjoge30gYXMgUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RmxhdHRlbmVkU2VjdGlvbnM+W251bWJlcl0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5jb25zdCByZXBvcnRTZWN0aW9uSXNzdWUgPSAoaW5wdXQ6IFJlcG9ydFNlY3Rpb25Jc3N1ZUlucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29udGV4dCwgbWVzc2FnZUlkLCBzZWN0aW9uIH0gPSBpbnB1dDtcblxuICBjb250ZXh0LnJlcG9ydCh7XG4gICAgZGF0YTogeyBzZWN0aW9uOiBzZWN0aW9uLnBoYXNlIH0sXG4gICAgbWVzc2FnZUlkLFxuICAgIG5vZGU6IHNlY3Rpb24uY29tbWVudCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgY3VycmVudCBBQUEgb3JkZXJpbmcgc3RhdGUgZm9yIG9uZSBmbGF0dGVuZWQgc2VjdGlvbi5cbiAqIEBwYXJhbSBpbnB1dCBDb21wb3NpdGUgb3JkZXJpbmcgc3RhdGUgZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKiBAcmV0dXJucyBVcGRhdGVkIHBoYXNlIG9yZGVyIHdhdGVybWFyay5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0T3JkZXIgPSB1cGRhdGVTZWN0aW9uT3JkZXIoe1xuICogICBjb250ZXh0OiB7fSBhcyBSdWxlLlJ1bGVDb250ZXh0LFxuICogICBsYXN0UGhhc2VPcmRlcjogLTEsXG4gKiAgIHNlY3Rpb246IHt9IGFzIFJldHVyblR5cGU8dHlwZW9mIGdldEZsYXR0ZW5lZFNlY3Rpb25zPltudW1iZXJdLFxuICogICBzZWVuUGhhc2VzOiBuZXcgU2V0KCksXG4gKiB9KTtcbiAqIHZvaWQgbmV4dE9yZGVyO1xuICogYGBgXG4gKi9cbmNvbnN0IHVwZGF0ZVNlY3Rpb25PcmRlciA9IChpbnB1dDogVXBkYXRlU2VjdGlvbk9yZGVySW5wdXQpOiBudW1iZXIgPT4ge1xuICBjb25zdCB7IGNvbnRleHQsIGxhc3RQaGFzZU9yZGVyLCBzZWN0aW9uLCBzZWVuUGhhc2VzIH0gPSBpbnB1dDtcblxuICBpZiAoc2VlblBoYXNlcy5oYXMoc2VjdGlvbi5waGFzZSkpIHtcbiAgICByZXBvcnRTZWN0aW9uSXNzdWUoeyBjb250ZXh0LCBtZXNzYWdlSWQ6IFwiZHVwbGljYXRlU2VjdGlvblwiLCBzZWN0aW9uIH0pO1xuICAgIHJldHVybiBsYXN0UGhhc2VPcmRlcjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRQaGFzZU9yZGVyID0gYWFhUGhhc2VPcmRlcltzZWN0aW9uLnBoYXNlXTtcbiAgaWYgKGN1cnJlbnRQaGFzZU9yZGVyIDwgbGFzdFBoYXNlT3JkZXIpIHtcbiAgICByZXBvcnRTZWN0aW9uSXNzdWUoeyBjb250ZXh0LCBtZXNzYWdlSWQ6IFwiaW52YWxpZE9yZGVyXCIsIHNlY3Rpb24gfSk7XG4gIH1cblxuICBzZWVuUGhhc2VzLmFkZChzZWN0aW9uLnBoYXNlKTtcbiAgcmV0dXJuIE1hdGgubWF4KGxhc3RQaGFzZU9yZGVyLCBjdXJyZW50UGhhc2VPcmRlcik7XG59O1xuXG4vKiogRW5mb3JjZXMgYSBzaW5nbGUgQXJyYW5nZS9BY3QvQXNzZXJ0IHNlcXVlbmNlIGluc2lkZSBzdXBwb3J0ZWQgdGVzdCBibG9ja3MuICovXG5jb25zdCBlbmZvcmNlQWFhU3RydWN0dXJlUnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVUZXN0QmxvY2soY29udGV4dCwgbm9kZSk7XG4gICAgICAgIGlmIChhbmFseXNpcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmxhdHRlbmVkU2VjdGlvbnMgPSBnZXRGbGF0dGVuZWRTZWN0aW9ucyhhbmFseXNpcyk7XG4gICAgICAgIGNvbnN0IHNlZW5QaGFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgbGV0IGxhc3RQaGFzZU9yZGVyID0gLTE7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGZsYXR0ZW5lZFNlY3Rpb25zKSB7XG4gICAgICAgICAgbGFzdFBoYXNlT3JkZXIgPSB1cGRhdGVTZWN0aW9uT3JkZXIoe1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGxhc3RQaGFzZU9yZGVyLFxuICAgICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICAgIHNlZW5QaGFzZXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgUnVsZS5SdWxlTGlzdGVuZXI7XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiBjcmVhdGVSdWxlRG9jdW1lbnRhdGlvbihcbiAgICAgIFwiZW5mb3JjZS1hYWEtc3RydWN0dXJlXCIsXG4gICAgICBcIlJlcXVpcmUgQUFBIHNlY3Rpb25zIHRvIGFwcGVhciBvbmNlIGFuZCBpbiBBcnJhbmdlLCBBY3QsIEFzc2VydCBvcmRlci5cIixcbiAgICApLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBkdXBsaWNhdGVTZWN0aW9uOlxuICAgICAgICBcIlVzZSB0aGUgLy8ge3tzZWN0aW9ufX0gc2VjdGlvbiBjb21tZW50IG9ubHkgb25jZSBwZXIgdGVzdC5cIixcbiAgICAgIGludmFsaWRPcmRlcjpcbiAgICAgICAgXCJNb3ZlIHRoZSAvLyB7e3NlY3Rpb259fSBzZWN0aW9uIGNvbW1lbnQgc28gQUFBIHBoYXNlcyBzdGF5IGluIEFycmFuZ2UsIEFjdCwgQXNzZXJ0IG9yZGVyLlwiLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgICB0eXBlOiBcInByb2JsZW1cIixcbiAgfSxcbn07XG5cbmV4cG9ydCB7IGVuZm9yY2VBYWFTdHJ1Y3R1cmVSdWxlIH07XG4iXX0=
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
export { assertActualExpectedNamesRule } from "./assert-actual-expected-names";
|
|
2
|
-
export { enforceAaaPhasePurityRule } from "./enforce-aaa-phase-purity";
|
|
3
|
-
export { enforceAaaStructureRule } from "./enforce-aaa-structure";
|
|
4
|
-
export { preferViMockedImportRule } from "./prefer-vi-mocked-import";
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
1
|
+
export { assertActualExpectedNamesRule } from "./assert-actual-expected-names/index.js";
|
|
2
|
+
export { enforceAaaPhasePurityRule } from "./enforce-aaa-phase-purity/index.js";
|
|
3
|
+
export { enforceAaaStructureRule } from "./enforce-aaa-structure/index.js";
|
|
4
|
+
export { preferViMockedImportRule } from "./prefer-vi-mocked-import/index.js";
|
|
5
|
+
export { preferVitestIncrementalCastsRule } from "./prefer-vitest-incremental-casts/index.js";
|
|
6
|
+
export { requireAaaSectionsRule } from "./require-aaa-sections/index.js";
|
|
7
|
+
export { requireActResultCaptureRule } from "./require-act-result-capture/index.js";
|
|
8
|
+
export { requireTestCompanionRule } from "./require-test-companion/index.js";
|
|
9
|
+
export { singleActStatementRule } from "./single-act-statement/index.js";
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { assertActualExpectedNamesRule } from "./assert-actual-expected-names/index.js";
|
|
2
|
+
export { enforceAaaPhasePurityRule } from "./enforce-aaa-phase-purity/index.js";
|
|
3
|
+
export { enforceAaaStructureRule } from "./enforce-aaa-structure/index.js";
|
|
4
|
+
export { preferViMockedImportRule } from "./prefer-vi-mocked-import/index.js";
|
|
5
|
+
export { preferVitestIncrementalCastsRule } from "./prefer-vitest-incremental-casts/index.js";
|
|
6
|
+
export { requireAaaSectionsRule } from "./require-aaa-sections/index.js";
|
|
7
|
+
export { requireActResultCaptureRule } from "./require-act-result-capture/index.js";
|
|
8
|
+
export { requireTestCompanionRule } from "./require-test-companion/index.js";
|
|
9
|
+
export { singleActStatementRule } from "./single-act-statement/index.js";
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhc3NlcnRBY3R1YWxFeHBlY3RlZE5hbWVzUnVsZSB9IGZyb20gXCIuL2Fzc2VydC1hY3R1YWwtZXhwZWN0ZWQtbmFtZXNcIjtcbmV4cG9ydCB7IGVuZm9yY2VBYWFQaGFzZVB1cml0eVJ1bGUgfSBmcm9tIFwiLi9lbmZvcmNlLWFhYS1waGFzZS1wdXJpdHlcIjtcbmV4cG9ydCB7IGVuZm9yY2VBYWFTdHJ1Y3R1cmVSdWxlIH0gZnJvbSBcIi4vZW5mb3JjZS1hYWEtc3RydWN0dXJlXCI7XG5leHBvcnQgeyBwcmVmZXJWaU1vY2tlZEltcG9ydFJ1bGUgfSBmcm9tIFwiLi9wcmVmZXItdmktbW9ja2VkLWltcG9ydFwiO1xuZXhwb3J0IHsgcHJlZmVyVml0ZXN0SW5jcmVtZW50YWxDYXN0c1J1bGUgfSBmcm9tIFwiLi9wcmVmZXItdml0ZXN0LWluY3JlbWVudGFsLWNhc3RzXCI7XG5leHBvcnQgeyByZXF1aXJlQWFhU2VjdGlvbnNSdWxlIH0gZnJvbSBcIi4vcmVxdWlyZS1hYWEtc2VjdGlvbnNcIjtcbmV4cG9ydCB7IHJlcXVpcmVBY3RSZXN1bHRDYXB0dXJlUnVsZSB9IGZyb20gXCIuL3JlcXVpcmUtYWN0LXJlc3VsdC1jYXB0dXJlXCI7XG5leHBvcnQgeyByZXF1aXJlVGVzdENvbXBhbmlvblJ1bGUgfSBmcm9tIFwiLi9yZXF1aXJlLXRlc3QtY29tcGFuaW9uXCI7XG5leHBvcnQgeyBzaW5nbGVBY3RTdGF0ZW1lbnRSdWxlIH0gZnJvbSBcIi4vc2luZ2xlLWFjdC1zdGF0ZW1lbnRcIjtcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
import type { RuleMatch } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds fixes for adding or updating imports.
|
|
5
|
+
* @param match Autofix context produced by the matcher.
|
|
6
|
+
* @param fixer ESLint fixer.
|
|
7
|
+
* @returns Import fixes for one match.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const fixes = buildImportFixes({} as never, {} as never);
|
|
11
|
+
* void fixes;
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare function buildImportFixes(match: RuleMatch, fixer: Rule.RuleFixer): Rule.Fix[];
|
|
15
|
+
/**
|
|
16
|
+
* Creates an import statement string from import parts.
|
|
17
|
+
* @param moduleSpecifier Module path used in the generated statement.
|
|
18
|
+
* @param defaultImportName Existing default-import local identifier, when present.
|
|
19
|
+
* @param names Named imports to include in braces.
|
|
20
|
+
* @returns Fully formatted import statement text.
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const text = buildImportStatement("./x", void 0, ["a"]);
|
|
24
|
+
* void text;
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare function buildImportStatement(moduleSpecifier: string, defaultImportName: string | undefined, names: readonly string[]): string;
|
|
28
|
+
export { buildImportFixes, buildImportStatement };
|
|
29
|
+
//# sourceMappingURL=fix-import-statements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-import-statements.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-import-statements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,iBAAS,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAa7E;AAyCD;;;;;;;;;;;GAWG;AACH,iBAAS,oBAAoB,CAC3B,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,CAOR;AAsCD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds fixes for adding or updating imports.
|
|
3
|
+
* @param match Autofix context produced by the matcher.
|
|
4
|
+
* @param fixer ESLint fixer.
|
|
5
|
+
* @returns Import fixes for one match.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const fixes = buildImportFixes({} as never, {} as never);
|
|
9
|
+
* void fixes;
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
function buildImportFixes(match, fixer) {
|
|
13
|
+
const { names } = match.importPlan;
|
|
14
|
+
if (names.length === 0) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const sortedNames = [...names].toSorted();
|
|
18
|
+
const updateFix = buildImportUpdateFix(match, sortedNames, fixer);
|
|
19
|
+
return updateFix === void 0
|
|
20
|
+
? buildImportInsertFixes(match, sortedNames, fixer)
|
|
21
|
+
: [updateFix];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Builds import insertion fixes when no compatible import exists.
|
|
25
|
+
* @param match Autofix context produced by the matcher.
|
|
26
|
+
* @param sortedNames Sorted names that must be imported.
|
|
27
|
+
* @param fixer ESLint fixer.
|
|
28
|
+
* @returns Import insertion fixes for one match.
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const fixes = buildImportInsertFixes({ importPlan: { moduleSpecifier: "./x", names: [] }, newline: "\n" } as never, [], {} as never);
|
|
32
|
+
* void fixes;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
function buildImportInsertFixes(match, sortedNames, fixer) {
|
|
36
|
+
const statementText = buildImportStatement(match.importPlan.moduleSpecifier, void 0, sortedNames);
|
|
37
|
+
const { afterRange } = match.importPlan.insert ?? {};
|
|
38
|
+
return afterRange === void 0
|
|
39
|
+
? [
|
|
40
|
+
fixer.insertTextBeforeRange([0, 0], `${statementText}${match.newline}${match.newline}`),
|
|
41
|
+
]
|
|
42
|
+
: [
|
|
43
|
+
fixer.insertTextAfterRange(afterRange, `${match.newline}${statementText}`),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates an import statement string from import parts.
|
|
48
|
+
* @param moduleSpecifier Module path used in the generated statement.
|
|
49
|
+
* @param defaultImportName Existing default-import local identifier, when present.
|
|
50
|
+
* @param names Named imports to include in braces.
|
|
51
|
+
* @returns Fully formatted import statement text.
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const text = buildImportStatement("./x", void 0, ["a"]);
|
|
55
|
+
* void text;
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
function buildImportStatement(moduleSpecifier, defaultImportName, names) {
|
|
59
|
+
const moduleText = JSON.stringify(moduleSpecifier);
|
|
60
|
+
const namedText = `{ ${names.join(", ")} }`;
|
|
61
|
+
return defaultImportName === void 0
|
|
62
|
+
? `import ${namedText} from ${moduleText};`
|
|
63
|
+
: `import ${defaultImportName}, ${namedText} from ${moduleText};`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds an import update fix when an existing import is compatible.
|
|
67
|
+
* @param match Autofix context produced by the matcher.
|
|
68
|
+
* @param sortedNames Sorted names that must be imported.
|
|
69
|
+
* @param fixer ESLint fixer.
|
|
70
|
+
* @returns Replacement fix when an import can be updated.
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const fix = buildImportUpdateFix({ importPlan: { moduleSpecifier: "./x", names: [] } } as never, [], {} as never);
|
|
74
|
+
* void fix;
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
function buildImportUpdateFix(match, sortedNames, fixer) {
|
|
78
|
+
const { moduleSpecifier, update } = match.importPlan;
|
|
79
|
+
if (update === void 0) {
|
|
80
|
+
return void 0;
|
|
81
|
+
}
|
|
82
|
+
const { defaultImportName, existingNamedImports, range } = update;
|
|
83
|
+
const mergedNames = [
|
|
84
|
+
...new Set([...sortedNames, ...existingNamedImports]),
|
|
85
|
+
].toSorted();
|
|
86
|
+
const statementText = buildImportStatement(moduleSpecifier, defaultImportName, mergedNames);
|
|
87
|
+
return fixer.replaceTextRange(range, statementText);
|
|
88
|
+
}
|
|
89
|
+
export { buildImportFixes, buildImportStatement };
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWltcG9ydC1zdGF0ZW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L2ZpeC1pbXBvcnQtc3RhdGVtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFnQixFQUFFLEtBQXFCO0lBQy9ELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBRW5DLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVsRSxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLEtBQWdCLEVBQ2hCLFdBQXFCLEVBQ3JCLEtBQXFCO0lBRXJCLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFDaEMsS0FBSyxDQUFDLEVBQ04sV0FBVyxDQUNaLENBQUM7SUFDRixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRXJELE9BQU8sVUFBVSxLQUFLLEtBQUssQ0FBQztRQUMxQixDQUFDLENBQUM7WUFDRSxLQUFLLENBQUMscUJBQXFCLENBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNOLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNuRDtTQUNGO1FBQ0gsQ0FBQyxDQUFDO1lBQ0UsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixVQUFVLEVBQ1YsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLGFBQWEsRUFBRSxDQUNuQztTQUNGLENBQUM7QUFDUixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixlQUF1QixFQUN2QixpQkFBcUMsRUFDckMsS0FBd0I7SUFFeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUU1QyxPQUFPLGlCQUFpQixLQUFLLEtBQUssQ0FBQztRQUNqQyxDQUFDLENBQUMsVUFBVSxTQUFTLFNBQVMsVUFBVSxHQUFHO1FBQzNDLENBQUMsQ0FBQyxVQUFVLGlCQUFpQixLQUFLLFNBQVMsU0FBUyxVQUFVLEdBQUcsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixLQUFnQixFQUNoQixXQUFxQixFQUNyQixLQUFxQjtJQUVyQixNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFFckQsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLG9CQUFvQixDQUFDLENBQUM7S0FDdEQsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNiLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgUnVsZU1hdGNoIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgZml4ZXMgZm9yIGFkZGluZyBvciB1cGRhdGluZyBpbXBvcnRzLlxyXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxyXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxyXG4gKiBAcmV0dXJucyBJbXBvcnQgZml4ZXMgZm9yIG9uZSBtYXRjaC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBmaXhlcyA9IGJ1aWxkSW1wb3J0Rml4ZXMoe30gYXMgbmV2ZXIsIHt9IGFzIG5ldmVyKTtcclxuICogdm9pZCBmaXhlcztcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZEltcG9ydEZpeGVzKG1hdGNoOiBSdWxlTWF0Y2gsIGZpeGVyOiBSdWxlLlJ1bGVGaXhlcik6IFJ1bGUuRml4W10ge1xyXG4gIGNvbnN0IHsgbmFtZXMgfSA9IG1hdGNoLmltcG9ydFBsYW47XHJcblxyXG4gIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHNvcnRlZE5hbWVzID0gWy4uLm5hbWVzXS50b1NvcnRlZCgpO1xyXG4gIGNvbnN0IHVwZGF0ZUZpeCA9IGJ1aWxkSW1wb3J0VXBkYXRlRml4KG1hdGNoLCBzb3J0ZWROYW1lcywgZml4ZXIpO1xyXG5cclxuICByZXR1cm4gdXBkYXRlRml4ID09PSB2b2lkIDBcclxuICAgID8gYnVpbGRJbXBvcnRJbnNlcnRGaXhlcyhtYXRjaCwgc29ydGVkTmFtZXMsIGZpeGVyKVxyXG4gICAgOiBbdXBkYXRlRml4XTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBpbXBvcnQgaW5zZXJ0aW9uIGZpeGVzIHdoZW4gbm8gY29tcGF0aWJsZSBpbXBvcnQgZXhpc3RzLlxyXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxyXG4gKiBAcGFyYW0gc29ydGVkTmFtZXMgU29ydGVkIG5hbWVzIHRoYXQgbXVzdCBiZSBpbXBvcnRlZC5cclxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cclxuICogQHJldHVybnMgSW1wb3J0IGluc2VydGlvbiBmaXhlcyBmb3Igb25lIG1hdGNoLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRJbXBvcnRJbnNlcnRGaXhlcyh7IGltcG9ydFBsYW46IHsgbW9kdWxlU3BlY2lmaWVyOiBcIi4veFwiLCBuYW1lczogW10gfSwgbmV3bGluZTogXCJcXG5cIiB9IGFzIG5ldmVyLCBbXSwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeGVzO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkSW1wb3J0SW5zZXJ0Rml4ZXMoXHJcbiAgbWF0Y2g6IFJ1bGVNYXRjaCxcclxuICBzb3J0ZWROYW1lczogc3RyaW5nW10sXHJcbiAgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyLFxyXG4pOiBSdWxlLkZpeFtdIHtcclxuICBjb25zdCBzdGF0ZW1lbnRUZXh0ID0gYnVpbGRJbXBvcnRTdGF0ZW1lbnQoXHJcbiAgICBtYXRjaC5pbXBvcnRQbGFuLm1vZHVsZVNwZWNpZmllcixcclxuICAgIHZvaWQgMCxcclxuICAgIHNvcnRlZE5hbWVzLFxyXG4gICk7XHJcbiAgY29uc3QgeyBhZnRlclJhbmdlIH0gPSBtYXRjaC5pbXBvcnRQbGFuLmluc2VydCA/PyB7fTtcclxuXHJcbiAgcmV0dXJuIGFmdGVyUmFuZ2UgPT09IHZvaWQgMFxyXG4gICAgPyBbXHJcbiAgICAgICAgZml4ZXIuaW5zZXJ0VGV4dEJlZm9yZVJhbmdlKFxyXG4gICAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgICAgYCR7c3RhdGVtZW50VGV4dH0ke21hdGNoLm5ld2xpbmV9JHttYXRjaC5uZXdsaW5lfWAsXHJcbiAgICAgICAgKSxcclxuICAgICAgXVxyXG4gICAgOiBbXHJcbiAgICAgICAgZml4ZXIuaW5zZXJ0VGV4dEFmdGVyUmFuZ2UoXHJcbiAgICAgICAgICBhZnRlclJhbmdlLFxyXG4gICAgICAgICAgYCR7bWF0Y2gubmV3bGluZX0ke3N0YXRlbWVudFRleHR9YCxcclxuICAgICAgICApLFxyXG4gICAgICBdO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhbiBpbXBvcnQgc3RhdGVtZW50IHN0cmluZyBmcm9tIGltcG9ydCBwYXJ0cy5cclxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBNb2R1bGUgcGF0aCB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgc3RhdGVtZW50LlxyXG4gKiBAcGFyYW0gZGVmYXVsdEltcG9ydE5hbWUgRXhpc3RpbmcgZGVmYXVsdC1pbXBvcnQgbG9jYWwgaWRlbnRpZmllciwgd2hlbiBwcmVzZW50LlxyXG4gKiBAcGFyYW0gbmFtZXMgTmFtZWQgaW1wb3J0cyB0byBpbmNsdWRlIGluIGJyYWNlcy5cclxuICogQHJldHVybnMgRnVsbHkgZm9ybWF0dGVkIGltcG9ydCBzdGF0ZW1lbnQgdGV4dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCB0ZXh0ID0gYnVpbGRJbXBvcnRTdGF0ZW1lbnQoXCIuL3hcIiwgdm9pZCAwLCBbXCJhXCJdKTtcclxuICogdm9pZCB0ZXh0O1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkSW1wb3J0U3RhdGVtZW50KFxyXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxyXG4gIGRlZmF1bHRJbXBvcnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxyXG4pOiBzdHJpbmcge1xyXG4gIGNvbnN0IG1vZHVsZVRleHQgPSBKU09OLnN0cmluZ2lmeShtb2R1bGVTcGVjaWZpZXIpO1xyXG4gIGNvbnN0IG5hbWVkVGV4dCA9IGB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9YDtcclxuXHJcbiAgcmV0dXJuIGRlZmF1bHRJbXBvcnROYW1lID09PSB2b2lkIDBcclxuICAgID8gYGltcG9ydCAke25hbWVkVGV4dH0gZnJvbSAke21vZHVsZVRleHR9O2BcclxuICAgIDogYGltcG9ydCAke2RlZmF1bHRJbXBvcnROYW1lfSwgJHtuYW1lZFRleHR9IGZyb20gJHttb2R1bGVUZXh0fTtgO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGFuIGltcG9ydCB1cGRhdGUgZml4IHdoZW4gYW4gZXhpc3RpbmcgaW1wb3J0IGlzIGNvbXBhdGlibGUuXHJcbiAqIEBwYXJhbSBtYXRjaCBBdXRvZml4IGNvbnRleHQgcHJvZHVjZWQgYnkgdGhlIG1hdGNoZXIuXHJcbiAqIEBwYXJhbSBzb3J0ZWROYW1lcyBTb3J0ZWQgbmFtZXMgdGhhdCBtdXN0IGJlIGltcG9ydGVkLlxyXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxyXG4gKiBAcmV0dXJucyBSZXBsYWNlbWVudCBmaXggd2hlbiBhbiBpbXBvcnQgY2FuIGJlIHVwZGF0ZWQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgZml4ID0gYnVpbGRJbXBvcnRVcGRhdGVGaXgoeyBpbXBvcnRQbGFuOiB7IG1vZHVsZVNwZWNpZmllcjogXCIuL3hcIiwgbmFtZXM6IFtdIH0gfSBhcyBuZXZlciwgW10sIHt9IGFzIG5ldmVyKTtcclxuICogdm9pZCBmaXg7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRJbXBvcnRVcGRhdGVGaXgoXHJcbiAgbWF0Y2g6IFJ1bGVNYXRjaCxcclxuICBzb3J0ZWROYW1lczogc3RyaW5nW10sXHJcbiAgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyLFxyXG4pOiBSdWxlLkZpeCB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3QgeyBtb2R1bGVTcGVjaWZpZXIsIHVwZGF0ZSB9ID0gbWF0Y2guaW1wb3J0UGxhbjtcclxuXHJcbiAgaWYgKHVwZGF0ZSA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeyBkZWZhdWx0SW1wb3J0TmFtZSwgZXhpc3RpbmdOYW1lZEltcG9ydHMsIHJhbmdlIH0gPSB1cGRhdGU7XHJcbiAgY29uc3QgbWVyZ2VkTmFtZXMgPSBbXHJcbiAgICAuLi5uZXcgU2V0KFsuLi5zb3J0ZWROYW1lcywgLi4uZXhpc3RpbmdOYW1lZEltcG9ydHNdKSxcclxuICBdLnRvU29ydGVkKCk7XHJcbiAgY29uc3Qgc3RhdGVtZW50VGV4dCA9IGJ1aWxkSW1wb3J0U3RhdGVtZW50KFxyXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxyXG4gICAgZGVmYXVsdEltcG9ydE5hbWUsXHJcbiAgICBtZXJnZWROYW1lcyxcclxuICApO1xyXG5cclxuICByZXR1cm4gZml4ZXIucmVwbGFjZVRleHRSYW5nZShyYW5nZSwgc3RhdGVtZW50VGV4dCk7XHJcbn1cclxuXHJcbmV4cG9ydCB7IGJ1aWxkSW1wb3J0Rml4ZXMsIGJ1aWxkSW1wb3J0U3RhdGVtZW50IH07XHJcbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
/** Combined import work for one module across all matches. */
|
|
3
|
+
interface CombinedImportPlanLike {
|
|
4
|
+
/** Module imported by this plan. */
|
|
5
|
+
moduleSpecifier: string;
|
|
6
|
+
/** Named imports required for this module. */
|
|
7
|
+
names: Set<string>;
|
|
8
|
+
/** Existing import replacement plan when present. */
|
|
9
|
+
update?: {
|
|
10
|
+
/** Existing default import local name. */
|
|
11
|
+
defaultImportName?: string;
|
|
12
|
+
/** Existing named imports already present. */
|
|
13
|
+
existingNamedImports: string[];
|
|
14
|
+
/** Import range to replace. */
|
|
15
|
+
range: [number, number];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Builds replacement fixes for existing compatible imports.
|
|
20
|
+
* @param combinedPlans Combined plans keyed by module specifier.
|
|
21
|
+
* @param fixer ESLint fixer.
|
|
22
|
+
* @returns Replacement fixes for existing imports.
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const fixes = buildCombinedUpdateFixes(new Map(), {} as never);
|
|
26
|
+
* void fixes;
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare function buildCombinedUpdateFixes(combinedPlans: Map<string, CombinedImportPlanLike>, fixer: Rule.RuleFixer): Rule.Fix[];
|
|
30
|
+
export { buildCombinedUpdateFixes };
|
|
31
|
+
//# sourceMappingURL=fix-import-updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-import-updates.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-import-updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,8DAA8D;AAC9D,UAAU,sBAAsB;IAC9B,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,8CAA8C;QAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,+BAA+B;QAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAClD,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CAMZ;AAoCD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { buildImportStatement } from "./fix-import-statements.js";
|
|
2
|
+
/**
|
|
3
|
+
* Builds replacement fixes for existing compatible imports.
|
|
4
|
+
* @param combinedPlans Combined plans keyed by module specifier.
|
|
5
|
+
* @param fixer ESLint fixer.
|
|
6
|
+
* @returns Replacement fixes for existing imports.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const fixes = buildCombinedUpdateFixes(new Map(), {} as never);
|
|
10
|
+
* void fixes;
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function buildCombinedUpdateFixes(combinedPlans, fixer) {
|
|
14
|
+
return [...combinedPlans.values()].flatMap((plan) => {
|
|
15
|
+
const updateFix = toCombinedUpdateFix(plan, fixer);
|
|
16
|
+
return updateFix === void 0 ? [] : [updateFix];
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Builds a replacement fix for one combined update plan.
|
|
21
|
+
* @param plan Combined import plan for one module.
|
|
22
|
+
* @param fixer ESLint fixer.
|
|
23
|
+
* @returns Replacement fix when the module already has a compatible import.
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const fix = toCombinedUpdateFix({ moduleSpecifier: "./x", names: new Set() } as never, {} as never);
|
|
27
|
+
* void fix;
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
function toCombinedUpdateFix(plan, fixer) {
|
|
31
|
+
const { moduleSpecifier, names, update } = plan;
|
|
32
|
+
if (update === void 0) {
|
|
33
|
+
return void 0;
|
|
34
|
+
}
|
|
35
|
+
const { defaultImportName, existingNamedImports, range } = update;
|
|
36
|
+
const mergedNames = [
|
|
37
|
+
...new Set([...names, ...existingNamedImports]),
|
|
38
|
+
].toSorted();
|
|
39
|
+
const statementText = buildImportStatement(moduleSpecifier, defaultImportName, mergedNames);
|
|
40
|
+
return fixer.replaceTextRange(range, statementText);
|
|
41
|
+
}
|
|
42
|
+
export { buildCombinedUpdateFixes };
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWltcG9ydC11cGRhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L2ZpeC1pbXBvcnQtdXBkYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQW1CL0Q7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLGFBQWtELEVBQ2xELEtBQXFCO0lBRXJCLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuRCxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixJQUE0QixFQUM1QixLQUFxQjtJQUVyQixNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFaEQsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLG9CQUFvQixDQUFDLENBQUM7S0FDaEQsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNiLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcclxuXHJcbmltcG9ydCB7IGJ1aWxkSW1wb3J0U3RhdGVtZW50IH0gZnJvbSBcIi4vZml4LWltcG9ydC1zdGF0ZW1lbnRzXCI7XHJcblxyXG4vKiogQ29tYmluZWQgaW1wb3J0IHdvcmsgZm9yIG9uZSBtb2R1bGUgYWNyb3NzIGFsbCBtYXRjaGVzLiAqL1xyXG5pbnRlcmZhY2UgQ29tYmluZWRJbXBvcnRQbGFuTGlrZSB7XHJcbiAgLyoqIE1vZHVsZSBpbXBvcnRlZCBieSB0aGlzIHBsYW4uICovXHJcbiAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmc7XHJcbiAgLyoqIE5hbWVkIGltcG9ydHMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlLiAqL1xyXG4gIG5hbWVzOiBTZXQ8c3RyaW5nPjtcclxuICAvKiogRXhpc3RpbmcgaW1wb3J0IHJlcGxhY2VtZW50IHBsYW4gd2hlbiBwcmVzZW50LiAqL1xyXG4gIHVwZGF0ZT86IHtcclxuICAgIC8qKiBFeGlzdGluZyBkZWZhdWx0IGltcG9ydCBsb2NhbCBuYW1lLiAqL1xyXG4gICAgZGVmYXVsdEltcG9ydE5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogRXhpc3RpbmcgbmFtZWQgaW1wb3J0cyBhbHJlYWR5IHByZXNlbnQuICovXHJcbiAgICBleGlzdGluZ05hbWVkSW1wb3J0czogc3RyaW5nW107XHJcbiAgICAvKiogSW1wb3J0IHJhbmdlIHRvIHJlcGxhY2UuICovXHJcbiAgICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBjb21wYXRpYmxlIGltcG9ydHMuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW5zIENvbWJpbmVkIHBsYW5zIGtleWVkIGJ5IG1vZHVsZSBzcGVjaWZpZXIuXHJcbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXHJcbiAqIEByZXR1cm5zIFJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBpbXBvcnRzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRDb21iaW5lZFVwZGF0ZUZpeGVzKG5ldyBNYXAoKSwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeGVzO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkQ29tYmluZWRVcGRhdGVGaXhlcyhcclxuICBjb21iaW5lZFBsYW5zOiBNYXA8c3RyaW5nLCBDb21iaW5lZEltcG9ydFBsYW5MaWtlPixcclxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXHJcbik6IFJ1bGUuRml4W10ge1xyXG4gIHJldHVybiBbLi4uY29tYmluZWRQbGFucy52YWx1ZXMoKV0uZmxhdE1hcCgocGxhbikgPT4ge1xyXG4gICAgY29uc3QgdXBkYXRlRml4ID0gdG9Db21iaW5lZFVwZGF0ZUZpeChwbGFuLCBmaXhlcik7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZUZpeCA9PT0gdm9pZCAwID8gW10gOiBbdXBkYXRlRml4XTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIHJlcGxhY2VtZW50IGZpeCBmb3Igb25lIGNvbWJpbmVkIHVwZGF0ZSBwbGFuLlxyXG4gKiBAcGFyYW0gcGxhbiBDb21iaW5lZCBpbXBvcnQgcGxhbiBmb3Igb25lIG1vZHVsZS5cclxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cclxuICogQHJldHVybnMgUmVwbGFjZW1lbnQgZml4IHdoZW4gdGhlIG1vZHVsZSBhbHJlYWR5IGhhcyBhIGNvbXBhdGlibGUgaW1wb3J0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeCA9IHRvQ29tYmluZWRVcGRhdGVGaXgoeyBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIG5hbWVzOiBuZXcgU2V0KCkgfSBhcyBuZXZlciwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeDtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiB0b0NvbWJpbmVkVXBkYXRlRml4KFxyXG4gIHBsYW46IENvbWJpbmVkSW1wb3J0UGxhbkxpa2UsXHJcbiAgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyLFxyXG4pOiBSdWxlLkZpeCB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3QgeyBtb2R1bGVTcGVjaWZpZXIsIG5hbWVzLCB1cGRhdGUgfSA9IHBsYW47XHJcblxyXG4gIGlmICh1cGRhdGUgPT09IHZvaWQgMCkge1xyXG4gICAgcmV0dXJuIHZvaWQgMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHsgZGVmYXVsdEltcG9ydE5hbWUsIGV4aXN0aW5nTmFtZWRJbXBvcnRzLCByYW5nZSB9ID0gdXBkYXRlO1xyXG4gIGNvbnN0IG1lcmdlZE5hbWVzID0gW1xyXG4gICAgLi4ubmV3IFNldChbLi4ubmFtZXMsIC4uLmV4aXN0aW5nTmFtZWRJbXBvcnRzXSksXHJcbiAgXS50b1NvcnRlZCgpO1xyXG4gIGNvbnN0IHN0YXRlbWVudFRleHQgPSBidWlsZEltcG9ydFN0YXRlbWVudChcclxuICAgIG1vZHVsZVNwZWNpZmllcixcclxuICAgIGRlZmF1bHRJbXBvcnROYW1lLFxyXG4gICAgbWVyZ2VkTmFtZXMsXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UocmFuZ2UsIHN0YXRlbWVudFRleHQpO1xyXG59XHJcblxyXG5leHBvcnQgeyBidWlsZENvbWJpbmVkVXBkYXRlRml4ZXMgfTtcclxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
import type { RuleMatch } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds shared import fixes for every file match.
|
|
5
|
+
* @param matches Autofix contexts produced by the matcher.
|
|
6
|
+
* @param fixer ESLint fixer.
|
|
7
|
+
* @returns Import fixes de-duplicated by module and insertion site.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const fixes = buildCombinedImportFixes([], {} as never);
|
|
11
|
+
* void fixes;
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare function buildCombinedImportFixes(matches: RuleMatch[], fixer: Rule.RuleFixer): Rule.Fix[];
|
|
15
|
+
export { buildCombinedImportFixes };
|
|
16
|
+
//# sourceMappingURL=fix-imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-imports.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAsDzC;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,SAAS,EAAE,EACpB,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CASZ;AAoND,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { buildImportStatement } from "./fix-import-statements.js";
|
|
2
|
+
import { buildCombinedUpdateFixes } from "./fix-import-updates.js";
|
|
3
|
+
/**
|
|
4
|
+
* Adds one import statement to its insertion group.
|
|
5
|
+
* @param insertGroups Import statements grouped by insertion point.
|
|
6
|
+
* @param plan Combined import plan for one module.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* addInsertStatement(new Map(), { moduleSpecifier: "./x", names: new Set(["a"]) } as never);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
function addInsertStatement(insertGroups, plan) {
|
|
13
|
+
const sortedNames = [...plan.names].toSorted();
|
|
14
|
+
if (sortedNames.length === 0 || plan.update !== void 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const key = getInsertGroupKey(plan.afterRange);
|
|
18
|
+
const group = insertGroups.get(key) ?? createInsertGroup(plan.afterRange);
|
|
19
|
+
group.statements.push(buildImportStatement(plan.moduleSpecifier, void 0, sortedNames));
|
|
20
|
+
group.statements.sort((left, right) => left.localeCompare(right));
|
|
21
|
+
insertGroups.set(key, group);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Builds shared import fixes for every file match.
|
|
25
|
+
* @param matches Autofix contexts produced by the matcher.
|
|
26
|
+
* @param fixer ESLint fixer.
|
|
27
|
+
* @returns Import fixes de-duplicated by module and insertion site.
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const fixes = buildCombinedImportFixes([], {} as never);
|
|
31
|
+
* void fixes;
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function buildCombinedImportFixes(matches, fixer) {
|
|
35
|
+
const newline = matches[0]?.newline ?? "\n";
|
|
36
|
+
const combinedPlans = combineImportPlans(matches);
|
|
37
|
+
const insertGroups = collectInsertGroups(combinedPlans);
|
|
38
|
+
return [
|
|
39
|
+
...buildCombinedUpdateFixes(combinedPlans, fixer),
|
|
40
|
+
...buildInsertGroupFixes(insertGroups, fixer, newline),
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Builds grouped insertion fixes for new imports.
|
|
45
|
+
* @param insertGroups Import statements grouped by insertion site.
|
|
46
|
+
* @param fixer ESLint fixer.
|
|
47
|
+
* @param newline Preferred file newline.
|
|
48
|
+
* @returns Insert fixes for new imports.
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const fixes = buildInsertGroupFixes(new Map(), {} as never, "\n");
|
|
52
|
+
* void fixes;
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
function buildInsertGroupFixes(insertGroups, fixer, newline) {
|
|
56
|
+
return [...insertGroups.values()].map((group) => group.afterRange === void 0
|
|
57
|
+
? fixer.insertTextBeforeRange([0, 0], `${group.statements.join(newline)}${newline}${newline}`)
|
|
58
|
+
: fixer.insertTextAfterRange(group.afterRange, `${newline}${group.statements.join(newline)}`));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Collects insert groups keyed by insertion point.
|
|
62
|
+
* @param combinedPlans Combined plans keyed by module specifier.
|
|
63
|
+
* @returns Import statements grouped by insertion point.
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const groups = collectInsertGroups(new Map());
|
|
67
|
+
* void groups;
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
function collectInsertGroups(combinedPlans) {
|
|
71
|
+
const insertGroups = new Map();
|
|
72
|
+
for (const plan of combinedPlans.values()) {
|
|
73
|
+
addInsertStatement(insertGroups, plan);
|
|
74
|
+
}
|
|
75
|
+
return insertGroups;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Combines import plans across every file match.
|
|
79
|
+
* @param matches Autofix contexts produced by the matcher.
|
|
80
|
+
* @returns Combined plans keyed by module specifier.
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const plans = combineImportPlans([]);
|
|
84
|
+
* void plans;
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
function combineImportPlans(matches) {
|
|
88
|
+
const combinedPlans = new Map();
|
|
89
|
+
for (const match of matches) {
|
|
90
|
+
mergeImportPlan(combinedPlans, match);
|
|
91
|
+
}
|
|
92
|
+
return combinedPlans;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates the initial combined plan for one match.
|
|
96
|
+
* @param match Autofix context produced by the matcher.
|
|
97
|
+
* @returns Combined import plan seed.
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const plan = createCombinedImportPlan({ moduleSpecifier: "./x", importPlan: { names: [] } } as never);
|
|
101
|
+
* void plan;
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
function createCombinedImportPlan(match) {
|
|
105
|
+
const combinedPlan = {
|
|
106
|
+
moduleSpecifier: match.moduleSpecifier,
|
|
107
|
+
names: new Set(match.importPlan.names),
|
|
108
|
+
};
|
|
109
|
+
if (match.importPlan.insert?.afterRange !== void 0) {
|
|
110
|
+
combinedPlan.afterRange = match.importPlan.insert.afterRange;
|
|
111
|
+
}
|
|
112
|
+
if (match.importPlan.update !== void 0) {
|
|
113
|
+
combinedPlan.update = match.importPlan.update;
|
|
114
|
+
}
|
|
115
|
+
return combinedPlan;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Creates an insertion group for one location.
|
|
119
|
+
* @param afterRange Insert location for the group.
|
|
120
|
+
* @returns Insert group seed.
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const group = createInsertGroup(void 0);
|
|
124
|
+
* void group;
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
function createInsertGroup(afterRange) {
|
|
128
|
+
return afterRange === void 0
|
|
129
|
+
? { statements: [] }
|
|
130
|
+
: { afterRange, statements: [] };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Creates a stable key for an insert location.
|
|
134
|
+
* @param afterRange Insert location when a new import must be inserted.
|
|
135
|
+
* @returns Stable key for the insertion site.
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* const key = getInsertGroupKey(void 0);
|
|
139
|
+
* void key;
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
function getInsertGroupKey(afterRange) {
|
|
143
|
+
return afterRange === void 0 ? "TOP" : `${afterRange[0]}:${afterRange[1]}`;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Merges one match into the combined import-plan map.
|
|
147
|
+
* @param combinedPlans Combined plans keyed by module specifier.
|
|
148
|
+
* @param match Autofix context produced by the matcher.
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* mergeImportPlan(new Map(), {} as never);
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
function mergeImportPlan(combinedPlans, match) {
|
|
155
|
+
const combinedPlan = combinedPlans.get(match.moduleSpecifier) ?? createCombinedImportPlan(match);
|
|
156
|
+
mergeImportPlanInsertRange(combinedPlan, match);
|
|
157
|
+
mergeImportPlanNames(combinedPlan, match.importPlan.names);
|
|
158
|
+
mergeImportPlanUpdate(combinedPlan, match);
|
|
159
|
+
combinedPlans.set(match.moduleSpecifier, combinedPlan);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Merges the first discovered insert range for a module.
|
|
163
|
+
* @param combinedPlan Combined plan for one module.
|
|
164
|
+
* @param match Autofix context produced by the matcher.
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* mergeImportPlanInsertRange({ moduleSpecifier: "./x", names: new Set() } as never, {} as never);
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
function mergeImportPlanInsertRange(combinedPlan, match) {
|
|
171
|
+
if (combinedPlan.afterRange === void 0 &&
|
|
172
|
+
match.importPlan.insert?.afterRange !== void 0) {
|
|
173
|
+
combinedPlan.afterRange = match.importPlan.insert.afterRange;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Merges discovered import names for a module.
|
|
178
|
+
* @param combinedPlan Combined plan for one module.
|
|
179
|
+
* @param names Additional import names.
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* mergeImportPlanNames({ moduleSpecifier: "./x", names: new Set() } as never, ["a"]);
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
function mergeImportPlanNames(combinedPlan, names) {
|
|
186
|
+
for (const name of names) {
|
|
187
|
+
combinedPlan.names.add(name);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Merges the first discovered update plan for a module.
|
|
192
|
+
* @param combinedPlan Combined plan for one module.
|
|
193
|
+
* @param match Autofix context produced by the matcher.
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* mergeImportPlanUpdate({ moduleSpecifier: "./x", names: new Set() } as never, {} as never);
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
function mergeImportPlanUpdate(combinedPlan, match) {
|
|
200
|
+
if (combinedPlan.update === void 0 && match.importPlan.update !== void 0) {
|
|
201
|
+
combinedPlan.update = match.importPlan.update;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export { buildCombinedImportFixes };
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWltcG9ydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvcHJlZmVyLXZpLW1vY2tlZC1pbXBvcnQvZml4LWltcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFzQmhFOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsWUFBc0MsRUFDdEMsSUFBd0I7SUFFeEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUUvQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDbkIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FDaEUsQ0FBQztJQUNGLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsT0FBb0IsRUFDcEIsS0FBcUI7SUFFckIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFeEQsT0FBTztRQUNMLEdBQUcsd0JBQXdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztRQUNqRCxHQUFHLHFCQUFxQixDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDO0tBQ3ZELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixZQUFzQyxFQUN0QyxLQUFxQixFQUNyQixPQUFzQjtJQUV0QixPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM5QyxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDTixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FDeEQ7UUFDSCxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixLQUFLLENBQUMsVUFBVSxFQUNoQixHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUM5QyxDQUNOLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsYUFBOEM7SUFFOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFcEQsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUMxQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixPQUFvQjtJQUVwQixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUU1RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLGVBQWUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQWdCO0lBQ2hELE1BQU0sWUFBWSxHQUF1QjtRQUN2QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7UUFDdEMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ3ZDLENBQUM7SUFFRixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25ELFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkMsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNoRCxDQUFDO0lBRUQsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBNkI7SUFDdEQsT0FBTyxVQUFVLEtBQUssS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7UUFDcEIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxVQUE2QjtJQUN0RCxPQUFPLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGVBQWUsQ0FDdEIsYUFBOEMsRUFDOUMsS0FBZ0I7SUFFaEIsTUFBTSxZQUFZLEdBQ2hCLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0MsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsMEJBQTBCLENBQ2pDLFlBQWdDLEVBQ2hDLEtBQWdCO0lBRWhCLElBQ0UsWUFBWSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUM7UUFDbEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUM5QyxDQUFDO1FBQ0QsWUFBWSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDL0QsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLFlBQWdDLEVBQ2hDLEtBQWU7SUFFZixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixZQUFnQyxFQUNoQyxLQUFnQjtJQUVoQixJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxZQUFZLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hELENBQUM7QUFDSCxDQUFDO0FBRUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IFJhbmdlIH0gZnJvbSBcIi4vbWF0Y2gtaGVscGVyc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFJ1bGVNYXRjaCB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBidWlsZEltcG9ydFN0YXRlbWVudCB9IGZyb20gXCIuL2ZpeC1pbXBvcnQtc3RhdGVtZW50c1wiO1xyXG5pbXBvcnQgeyBidWlsZENvbWJpbmVkVXBkYXRlRml4ZXMgfSBmcm9tIFwiLi9maXgtaW1wb3J0LXVwZGF0ZXNcIjtcclxuXHJcbi8qKiBDb21iaW5lZCBpbXBvcnQgd29yayBmb3Igb25lIG1vZHVsZSBhY3Jvc3MgYWxsIG1hdGNoZXMuICovXHJcbmludGVyZmFjZSBDb21iaW5lZEltcG9ydFBsYW4ge1xyXG4gIC8qKiBJbnNlcnQgbG9jYXRpb24gZm9yIGEgbmV3IGltcG9ydC4gKi9cclxuICBhZnRlclJhbmdlPzogUmFuZ2U7XHJcbiAgLyoqIE1vZHVsZSBpbXBvcnRlZCBieSB0aGlzIHBsYW4uICovXHJcbiAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmc7XHJcbiAgLyoqIE5hbWVkIGltcG9ydHMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlLiAqL1xyXG4gIG5hbWVzOiBTZXQ8c3RyaW5nPjtcclxuICAvKiogRXhpc3RpbmcgaW1wb3J0IHJlcGxhY2VtZW50IHBsYW4gd2hlbiBwcmVzZW50LiAqL1xyXG4gIHVwZGF0ZT86IE5vbk51bGxhYmxlPFJ1bGVNYXRjaFtcImltcG9ydFBsYW5cIl1bXCJ1cGRhdGVcIl0+O1xyXG59XHJcblxyXG4vKiogSW1wb3J0IHN0YXRlbWVudHMgZ3JvdXBlZCBieSBpbnNlcnRpb24gcG9pbnQuICovXHJcbmludGVyZmFjZSBJbnNlcnRHcm91cCB7XHJcbiAgLyoqIEluc2VydCBsb2NhdGlvbiBmb3IgdGhpcyBncm91cC4gKi9cclxuICBhZnRlclJhbmdlPzogUmFuZ2U7XHJcbiAgLyoqIFN0YXRlbWVudHMgZW1pdHRlZCBhdCB0aGUgc2FtZSBpbnNlcnRpb24gcG9pbnQuICovXHJcbiAgc3RhdGVtZW50czogc3RyaW5nW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIG9uZSBpbXBvcnQgc3RhdGVtZW50IHRvIGl0cyBpbnNlcnRpb24gZ3JvdXAuXHJcbiAqIEBwYXJhbSBpbnNlcnRHcm91cHMgSW1wb3J0IHN0YXRlbWVudHMgZ3JvdXBlZCBieSBpbnNlcnRpb24gcG9pbnQuXHJcbiAqIEBwYXJhbSBwbGFuIENvbWJpbmVkIGltcG9ydCBwbGFuIGZvciBvbmUgbW9kdWxlLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGFkZEluc2VydFN0YXRlbWVudChuZXcgTWFwKCksIHsgbW9kdWxlU3BlY2lmaWVyOiBcIi4veFwiLCBuYW1lczogbmV3IFNldChbXCJhXCJdKSB9IGFzIG5ldmVyKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBhZGRJbnNlcnRTdGF0ZW1lbnQoXHJcbiAgaW5zZXJ0R3JvdXBzOiBNYXA8c3RyaW5nLCBJbnNlcnRHcm91cD4sXHJcbiAgcGxhbjogQ29tYmluZWRJbXBvcnRQbGFuLFxyXG4pOiB2b2lkIHtcclxuICBjb25zdCBzb3J0ZWROYW1lcyA9IFsuLi5wbGFuLm5hbWVzXS50b1NvcnRlZCgpO1xyXG5cclxuICBpZiAoc29ydGVkTmFtZXMubGVuZ3RoID09PSAwIHx8IHBsYW4udXBkYXRlICE9PSB2b2lkIDApIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IGtleSA9IGdldEluc2VydEdyb3VwS2V5KHBsYW4uYWZ0ZXJSYW5nZSk7XHJcbiAgY29uc3QgZ3JvdXAgPSBpbnNlcnRHcm91cHMuZ2V0KGtleSkgPz8gY3JlYXRlSW5zZXJ0R3JvdXAocGxhbi5hZnRlclJhbmdlKTtcclxuXHJcbiAgZ3JvdXAuc3RhdGVtZW50cy5wdXNoKFxyXG4gICAgYnVpbGRJbXBvcnRTdGF0ZW1lbnQocGxhbi5tb2R1bGVTcGVjaWZpZXIsIHZvaWQgMCwgc29ydGVkTmFtZXMpLFxyXG4gICk7XHJcbiAgZ3JvdXAuc3RhdGVtZW50cy5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSk7XHJcbiAgaW5zZXJ0R3JvdXBzLnNldChrZXksIGdyb3VwKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBzaGFyZWQgaW1wb3J0IGZpeGVzIGZvciBldmVyeSBmaWxlIG1hdGNoLlxyXG4gKiBAcGFyYW0gbWF0Y2hlcyBBdXRvZml4IGNvbnRleHRzIHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxyXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxyXG4gKiBAcmV0dXJucyBJbXBvcnQgZml4ZXMgZGUtZHVwbGljYXRlZCBieSBtb2R1bGUgYW5kIGluc2VydGlvbiBzaXRlLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRDb21iaW5lZEltcG9ydEZpeGVzKFtdLCB7fSBhcyBuZXZlcik7XHJcbiAqIHZvaWQgZml4ZXM7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRDb21iaW5lZEltcG9ydEZpeGVzKFxyXG4gIG1hdGNoZXM6IFJ1bGVNYXRjaFtdLFxyXG4gIGZpeGVyOiBSdWxlLlJ1bGVGaXhlcixcclxuKTogUnVsZS5GaXhbXSB7XHJcbiAgY29uc3QgbmV3bGluZSA9IG1hdGNoZXNbMF0/Lm5ld2xpbmUgPz8gXCJcXG5cIjtcclxuICBjb25zdCBjb21iaW5lZFBsYW5zID0gY29tYmluZUltcG9ydFBsYW5zKG1hdGNoZXMpO1xyXG4gIGNvbnN0IGluc2VydEdyb3VwcyA9IGNvbGxlY3RJbnNlcnRHcm91cHMoY29tYmluZWRQbGFucyk7XHJcblxyXG4gIHJldHVybiBbXHJcbiAgICAuLi5idWlsZENvbWJpbmVkVXBkYXRlRml4ZXMoY29tYmluZWRQbGFucywgZml4ZXIpLFxyXG4gICAgLi4uYnVpbGRJbnNlcnRHcm91cEZpeGVzKGluc2VydEdyb3VwcywgZml4ZXIsIG5ld2xpbmUpLFxyXG4gIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgZ3JvdXBlZCBpbnNlcnRpb24gZml4ZXMgZm9yIG5ldyBpbXBvcnRzLlxyXG4gKiBAcGFyYW0gaW5zZXJ0R3JvdXBzIEltcG9ydCBzdGF0ZW1lbnRzIGdyb3VwZWQgYnkgaW5zZXJ0aW9uIHNpdGUuXHJcbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXHJcbiAqIEBwYXJhbSBuZXdsaW5lIFByZWZlcnJlZCBmaWxlIG5ld2xpbmUuXHJcbiAqIEByZXR1cm5zIEluc2VydCBmaXhlcyBmb3IgbmV3IGltcG9ydHMuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgZml4ZXMgPSBidWlsZEluc2VydEdyb3VwRml4ZXMobmV3IE1hcCgpLCB7fSBhcyBuZXZlciwgXCJcXG5cIik7XHJcbiAqIHZvaWQgZml4ZXM7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRJbnNlcnRHcm91cEZpeGVzKFxyXG4gIGluc2VydEdyb3VwczogTWFwPHN0cmluZywgSW5zZXJ0R3JvdXA+LFxyXG4gIGZpeGVyOiBSdWxlLlJ1bGVGaXhlcixcclxuICBuZXdsaW5lOiBcIlxcblwiIHwgXCJcXHJcXG5cIixcclxuKTogUnVsZS5GaXhbXSB7XHJcbiAgcmV0dXJuIFsuLi5pbnNlcnRHcm91cHMudmFsdWVzKCldLm1hcCgoZ3JvdXApID0+XHJcbiAgICBncm91cC5hZnRlclJhbmdlID09PSB2b2lkIDBcclxuICAgICAgPyBmaXhlci5pbnNlcnRUZXh0QmVmb3JlUmFuZ2UoXHJcbiAgICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgICBgJHtncm91cC5zdGF0ZW1lbnRzLmpvaW4obmV3bGluZSl9JHtuZXdsaW5lfSR7bmV3bGluZX1gLFxyXG4gICAgICAgIClcclxuICAgICAgOiBmaXhlci5pbnNlcnRUZXh0QWZ0ZXJSYW5nZShcclxuICAgICAgICAgIGdyb3VwLmFmdGVyUmFuZ2UsXHJcbiAgICAgICAgICBgJHtuZXdsaW5lfSR7Z3JvdXAuc3RhdGVtZW50cy5qb2luKG5ld2xpbmUpfWAsXHJcbiAgICAgICAgKSxcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQ29sbGVjdHMgaW5zZXJ0IGdyb3VwcyBrZXllZCBieSBpbnNlcnRpb24gcG9pbnQuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW5zIENvbWJpbmVkIHBsYW5zIGtleWVkIGJ5IG1vZHVsZSBzcGVjaWZpZXIuXHJcbiAqIEByZXR1cm5zIEltcG9ydCBzdGF0ZW1lbnRzIGdyb3VwZWQgYnkgaW5zZXJ0aW9uIHBvaW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGdyb3VwcyA9IGNvbGxlY3RJbnNlcnRHcm91cHMobmV3IE1hcCgpKTtcclxuICogdm9pZCBncm91cHM7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gY29sbGVjdEluc2VydEdyb3VwcyhcclxuICBjb21iaW5lZFBsYW5zOiBNYXA8c3RyaW5nLCBDb21iaW5lZEltcG9ydFBsYW4+LFxyXG4pOiBNYXA8c3RyaW5nLCBJbnNlcnRHcm91cD4ge1xyXG4gIGNvbnN0IGluc2VydEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBJbnNlcnRHcm91cD4oKTtcclxuXHJcbiAgZm9yIChjb25zdCBwbGFuIG9mIGNvbWJpbmVkUGxhbnMudmFsdWVzKCkpIHtcclxuICAgIGFkZEluc2VydFN0YXRlbWVudChpbnNlcnRHcm91cHMsIHBsYW4pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluc2VydEdyb3VwcztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbWJpbmVzIGltcG9ydCBwbGFucyBhY3Jvc3MgZXZlcnkgZmlsZSBtYXRjaC5cclxuICogQHBhcmFtIG1hdGNoZXMgQXV0b2ZpeCBjb250ZXh0cyBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cclxuICogQHJldHVybnMgQ29tYmluZWQgcGxhbnMga2V5ZWQgYnkgbW9kdWxlIHNwZWNpZmllci5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBwbGFucyA9IGNvbWJpbmVJbXBvcnRQbGFucyhbXSk7XHJcbiAqIHZvaWQgcGxhbnM7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gY29tYmluZUltcG9ydFBsYW5zKFxyXG4gIG1hdGNoZXM6IFJ1bGVNYXRjaFtdLFxyXG4pOiBNYXA8c3RyaW5nLCBDb21iaW5lZEltcG9ydFBsYW4+IHtcclxuICBjb25zdCBjb21iaW5lZFBsYW5zID0gbmV3IE1hcDxzdHJpbmcsIENvbWJpbmVkSW1wb3J0UGxhbj4oKTtcclxuXHJcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XHJcbiAgICBtZXJnZUltcG9ydFBsYW4oY29tYmluZWRQbGFucywgbWF0Y2gpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbWJpbmVkUGxhbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGNvbWJpbmVkIHBsYW4gZm9yIG9uZSBtYXRjaC5cclxuICogQHBhcmFtIG1hdGNoIEF1dG9maXggY29udGV4dCBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cclxuICogQHJldHVybnMgQ29tYmluZWQgaW1wb3J0IHBsYW4gc2VlZC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBwbGFuID0gY3JlYXRlQ29tYmluZWRJbXBvcnRQbGFuKHsgbW9kdWxlU3BlY2lmaWVyOiBcIi4veFwiLCBpbXBvcnRQbGFuOiB7IG5hbWVzOiBbXSB9IH0gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIHBsYW47XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlQ29tYmluZWRJbXBvcnRQbGFuKG1hdGNoOiBSdWxlTWF0Y2gpOiBDb21iaW5lZEltcG9ydFBsYW4ge1xyXG4gIGNvbnN0IGNvbWJpbmVkUGxhbjogQ29tYmluZWRJbXBvcnRQbGFuID0ge1xyXG4gICAgbW9kdWxlU3BlY2lmaWVyOiBtYXRjaC5tb2R1bGVTcGVjaWZpZXIsXHJcbiAgICBuYW1lczogbmV3IFNldChtYXRjaC5pbXBvcnRQbGFuLm5hbWVzKSxcclxuICB9O1xyXG5cclxuICBpZiAobWF0Y2guaW1wb3J0UGxhbi5pbnNlcnQ/LmFmdGVyUmFuZ2UgIT09IHZvaWQgMCkge1xyXG4gICAgY29tYmluZWRQbGFuLmFmdGVyUmFuZ2UgPSBtYXRjaC5pbXBvcnRQbGFuLmluc2VydC5hZnRlclJhbmdlO1xyXG4gIH1cclxuXHJcbiAgaWYgKG1hdGNoLmltcG9ydFBsYW4udXBkYXRlICE9PSB2b2lkIDApIHtcclxuICAgIGNvbWJpbmVkUGxhbi51cGRhdGUgPSBtYXRjaC5pbXBvcnRQbGFuLnVwZGF0ZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBjb21iaW5lZFBsYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIGluc2VydGlvbiBncm91cCBmb3Igb25lIGxvY2F0aW9uLlxyXG4gKiBAcGFyYW0gYWZ0ZXJSYW5nZSBJbnNlcnQgbG9jYXRpb24gZm9yIHRoZSBncm91cC5cclxuICogQHJldHVybnMgSW5zZXJ0IGdyb3VwIHNlZWQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgZ3JvdXAgPSBjcmVhdGVJbnNlcnRHcm91cCh2b2lkIDApO1xyXG4gKiB2b2lkIGdyb3VwO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUluc2VydEdyb3VwKGFmdGVyUmFuZ2U6IFJhbmdlIHwgdW5kZWZpbmVkKTogSW5zZXJ0R3JvdXAge1xyXG4gIHJldHVybiBhZnRlclJhbmdlID09PSB2b2lkIDBcclxuICAgID8geyBzdGF0ZW1lbnRzOiBbXSB9XHJcbiAgICA6IHsgYWZ0ZXJSYW5nZSwgc3RhdGVtZW50czogW10gfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBzdGFibGUga2V5IGZvciBhbiBpbnNlcnQgbG9jYXRpb24uXHJcbiAqIEBwYXJhbSBhZnRlclJhbmdlIEluc2VydCBsb2NhdGlvbiB3aGVuIGEgbmV3IGltcG9ydCBtdXN0IGJlIGluc2VydGVkLlxyXG4gKiBAcmV0dXJucyBTdGFibGUga2V5IGZvciB0aGUgaW5zZXJ0aW9uIHNpdGUuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3Qga2V5ID0gZ2V0SW5zZXJ0R3JvdXBLZXkodm9pZCAwKTtcclxuICogdm9pZCBrZXk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0SW5zZXJ0R3JvdXBLZXkoYWZ0ZXJSYW5nZTogUmFuZ2UgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gIHJldHVybiBhZnRlclJhbmdlID09PSB2b2lkIDAgPyBcIlRPUFwiIDogYCR7YWZ0ZXJSYW5nZVswXX06JHthZnRlclJhbmdlWzFdfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNZXJnZXMgb25lIG1hdGNoIGludG8gdGhlIGNvbWJpbmVkIGltcG9ydC1wbGFuIG1hcC5cclxuICogQHBhcmFtIGNvbWJpbmVkUGxhbnMgQ29tYmluZWQgcGxhbnMga2V5ZWQgYnkgbW9kdWxlIHNwZWNpZmllci5cclxuICogQHBhcmFtIG1hdGNoIEF1dG9maXggY29udGV4dCBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBtZXJnZUltcG9ydFBsYW4obmV3IE1hcCgpLCB7fSBhcyBuZXZlcik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2VJbXBvcnRQbGFuKFxyXG4gIGNvbWJpbmVkUGxhbnM6IE1hcDxzdHJpbmcsIENvbWJpbmVkSW1wb3J0UGxhbj4sXHJcbiAgbWF0Y2g6IFJ1bGVNYXRjaCxcclxuKTogdm9pZCB7XHJcbiAgY29uc3QgY29tYmluZWRQbGFuID1cclxuICAgIGNvbWJpbmVkUGxhbnMuZ2V0KG1hdGNoLm1vZHVsZVNwZWNpZmllcikgPz8gY3JlYXRlQ29tYmluZWRJbXBvcnRQbGFuKG1hdGNoKTtcclxuXHJcbiAgbWVyZ2VJbXBvcnRQbGFuSW5zZXJ0UmFuZ2UoY29tYmluZWRQbGFuLCBtYXRjaCk7XHJcbiAgbWVyZ2VJbXBvcnRQbGFuTmFtZXMoY29tYmluZWRQbGFuLCBtYXRjaC5pbXBvcnRQbGFuLm5hbWVzKTtcclxuICBtZXJnZUltcG9ydFBsYW5VcGRhdGUoY29tYmluZWRQbGFuLCBtYXRjaCk7XHJcbiAgY29tYmluZWRQbGFucy5zZXQobWF0Y2gubW9kdWxlU3BlY2lmaWVyLCBjb21iaW5lZFBsYW4pO1xyXG59XHJcblxyXG4vKipcclxuICogTWVyZ2VzIHRoZSBmaXJzdCBkaXNjb3ZlcmVkIGluc2VydCByYW5nZSBmb3IgYSBtb2R1bGUuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW4gQ29tYmluZWQgcGxhbiBmb3Igb25lIG1vZHVsZS5cclxuICogQHBhcmFtIG1hdGNoIEF1dG9maXggY29udGV4dCBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBtZXJnZUltcG9ydFBsYW5JbnNlcnRSYW5nZSh7IG1vZHVsZVNwZWNpZmllcjogXCIuL3hcIiwgbmFtZXM6IG5ldyBTZXQoKSB9IGFzIG5ldmVyLCB7fSBhcyBuZXZlcik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2VJbXBvcnRQbGFuSW5zZXJ0UmFuZ2UoXHJcbiAgY29tYmluZWRQbGFuOiBDb21iaW5lZEltcG9ydFBsYW4sXHJcbiAgbWF0Y2g6IFJ1bGVNYXRjaCxcclxuKTogdm9pZCB7XHJcbiAgaWYgKFxyXG4gICAgY29tYmluZWRQbGFuLmFmdGVyUmFuZ2UgPT09IHZvaWQgMCAmJlxyXG4gICAgbWF0Y2guaW1wb3J0UGxhbi5pbnNlcnQ/LmFmdGVyUmFuZ2UgIT09IHZvaWQgMFxyXG4gICkge1xyXG4gICAgY29tYmluZWRQbGFuLmFmdGVyUmFuZ2UgPSBtYXRjaC5pbXBvcnRQbGFuLmluc2VydC5hZnRlclJhbmdlO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1lcmdlcyBkaXNjb3ZlcmVkIGltcG9ydCBuYW1lcyBmb3IgYSBtb2R1bGUuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW4gQ29tYmluZWQgcGxhbiBmb3Igb25lIG1vZHVsZS5cclxuICogQHBhcmFtIG5hbWVzIEFkZGl0aW9uYWwgaW1wb3J0IG5hbWVzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIG1lcmdlSW1wb3J0UGxhbk5hbWVzKHsgbW9kdWxlU3BlY2lmaWVyOiBcIi4veFwiLCBuYW1lczogbmV3IFNldCgpIH0gYXMgbmV2ZXIsIFtcImFcIl0pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlSW1wb3J0UGxhbk5hbWVzKFxyXG4gIGNvbWJpbmVkUGxhbjogQ29tYmluZWRJbXBvcnRQbGFuLFxyXG4gIG5hbWVzOiBzdHJpbmdbXSxcclxuKTogdm9pZCB7XHJcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XHJcbiAgICBjb21iaW5lZFBsYW4ubmFtZXMuYWRkKG5hbWUpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1lcmdlcyB0aGUgZmlyc3QgZGlzY292ZXJlZCB1cGRhdGUgcGxhbiBmb3IgYSBtb2R1bGUuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW4gQ29tYmluZWQgcGxhbiBmb3Igb25lIG1vZHVsZS5cclxuICogQHBhcmFtIG1hdGNoIEF1dG9maXggY29udGV4dCBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBtZXJnZUltcG9ydFBsYW5VcGRhdGUoeyBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIG5hbWVzOiBuZXcgU2V0KCkgfSBhcyBuZXZlciwge30gYXMgbmV2ZXIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlSW1wb3J0UGxhblVwZGF0ZShcclxuICBjb21iaW5lZFBsYW46IENvbWJpbmVkSW1wb3J0UGxhbixcclxuICBtYXRjaDogUnVsZU1hdGNoLFxyXG4pOiB2b2lkIHtcclxuICBpZiAoY29tYmluZWRQbGFuLnVwZGF0ZSA9PT0gdm9pZCAwICYmIG1hdGNoLmltcG9ydFBsYW4udXBkYXRlICE9PSB2b2lkIDApIHtcclxuICAgIGNvbWJpbmVkUGxhbi51cGRhdGUgPSBtYXRjaC5pbXBvcnRQbGFuLnVwZGF0ZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7IGJ1aWxkQ29tYmluZWRJbXBvcnRGaXhlcyB9O1xyXG4iXX0=
|