@codeperfect/eslint-plugin 2.0.0 → 2.2.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 +3 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/application/custom-rules.d.ts +8 -8
- package/dist/application/custom-rules.js +14 -14
- package/dist/application/index.d.ts +1 -1
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +2 -2
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +3 -4
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +5 -3
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +17 -7
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +36 -4
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts +2 -0
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/index.js +3 -1
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts +5 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +247 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts +5 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +1 -0
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +136 -0
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +8 -3
- package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/rule.js +12 -5
- package/dist/domain/architecture/index.d.ts +2 -1
- package/dist/domain/architecture/index.d.ts.map +1 -1
- package/dist/domain/architecture/index.js +3 -2
- package/dist/domain/architecture/no-unused-exports/index.d.ts +3 -0
- package/dist/domain/architecture/no-unused-exports/index.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/index.js +2 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.d.ts +50 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.js +141 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts +49 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.js +608 -0
- package/dist/domain/architecture/no-unused-exports/rule.d.ts +5 -0
- package/dist/domain/architecture/no-unused-exports/rule.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/rule.js +82 -0
- package/dist/domain/architecture/no-unused-exports/types.d.ts +32 -0
- package/dist/domain/architecture/no-unused-exports/types.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-exports/types.js +2 -0
- package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/rule.js +58 -6
- package/dist/domain/core/no-multiple-declarators/types.d.ts +3 -1
- package/dist/domain/core/no-multiple-declarators/types.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/types.js +5 -2
- package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
- package/dist/domain/core/prefer-interface-types/rule.js +94 -23
- package/dist/domain/custom-rule-documentation.d.ts +3 -14
- package/dist/domain/custom-rule-documentation.d.ts.map +1 -1
- package/dist/domain/custom-rule-documentation.js +3 -2
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +11 -2
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +1 -1
- package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/rule.js +12 -4
- package/dist/domain/docs/require-example-language/examples.d.ts +4 -15
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/examples.js +119 -26
- package/dist/domain/docs/require-example-language/fixes.d.ts +1 -21
- package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/fixes.js +5 -2
- package/dist/domain/docs/require-example-language/reporting.d.ts +2 -38
- package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/reporting.js +2 -2
- package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/rule.js +7 -3
- package/dist/domain/docs/require-example-language/types.d.ts +1 -1
- package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/types.js +1 -1
- package/dist/domain/docs/single-line-jsdoc/rule.d.ts +1 -2
- package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/rule.js +18 -13
- package/dist/domain/index.d.ts +2 -3
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -4
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts +2 -78
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts +121 -3
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +199 -4
- package/dist/domain/testing/aaa/analyzer.analysis.js +30 -188
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts +1 -92
- package/dist/domain/testing/aaa/analyzer.assertions.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts +93 -0
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +184 -0
- package/dist/domain/testing/aaa/analyzer.assertions.js +5 -283
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts +62 -0
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.assertions.operands.js +106 -0
- package/dist/domain/testing/aaa/analyzer.classification.d.ts +1 -74
- package/dist/domain/testing/aaa/analyzer.classification.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts +75 -0
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.helpers.js +202 -0
- package/dist/domain/testing/aaa/analyzer.classification.js +5 -201
- package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts +13 -0
- package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.classification.traversal.js +32 -0
- package/dist/domain/testing/aaa/analyzer.super.d.ts +6 -13
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts +14 -0
- package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts.map +1 -0
- package/dist/domain/testing/aaa/analyzer.super.helpers.js +64 -0
- package/dist/domain/testing/aaa/analyzer.super.js +29 -61
- package/dist/domain/testing/aaa/index.d.ts +1 -2
- package/dist/domain/testing/aaa/index.d.ts.map +1 -1
- package/dist/domain/testing/aaa/index.js +2 -2
- package/dist/domain/testing/aaa/types.d.ts +1 -1
- package/dist/domain/testing/aaa/types.d.ts.map +1 -1
- package/dist/domain/testing/aaa/types.js +1 -1
- package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
- package/dist/domain/testing/assert-actual-expected-names/rule.js +33 -5
- package/dist/domain/testing/enforce-aaa-phase-purity/index.d.ts +2 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/index.js +3 -2
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.d.ts +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.js +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +78 -16
- package/dist/domain/testing/{require-aaa-sections → enforce-aaa-structure}/missing-section-fixes.d.ts +1 -1
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -0
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +150 -0
- package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/rule.js +165 -3
- package/dist/domain/testing/index.d.ts +0 -3
- package/dist/domain/testing/index.d.ts.map +1 -1
- package/dist/domain/testing/index.js +1 -4
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.d.ts +1 -15
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.js +2 -71
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +4 -2
- package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts +1 -13
- package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix.js +3 -21
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +2 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +6 -6
- package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts +1 -12
- package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match.js +149 -15
- package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/rule.js +6 -3
- package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-act-result-capture/rule.js +42 -10
- package/dist/domain/testing/require-test-companion/index.d.ts +0 -1
- package/dist/domain/testing/require-test-companion/index.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/index.js +1 -2
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts +2 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.js +13 -58
- package/dist/domain/testing/require-test-companion/require-test-companion-options.d.ts +2 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-options.js +6 -5
- package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/rule.js +34 -9
- package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
- package/dist/domain/testing/single-act-statement/rule.js +11 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/infrastructure/codeperfect-plugin.d.ts +6 -6
- package/dist/infrastructure/codeperfect-plugin.js +5 -5
- package/dist/infrastructure/presets.d.ts.map +1 -1
- package/dist/infrastructure/presets.js +23 -7
- package/package.json +37 -38
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +0 -41
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +0 -87
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +0 -40
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +0 -91
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.d.ts +0 -4
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/rule.repeat-runs.js +0 -4
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.d.ts +0 -141
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.d.ts +0 -20
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.file-writers.js +0 -25
- package/dist/domain/architecture/consistent-barrel-files/test-helpers.js +0 -235
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.d.ts +0 -101
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.d.ts.map +0 -1
- package/dist/domain/core/no-multiple-declarators/rule-test-helpers.js +0 -108
- package/dist/domain/core/no-multiple-declarators/rule.fixes.d.ts +0 -35
- package/dist/domain/core/no-multiple-declarators/rule.fixes.d.ts.map +0 -1
- package/dist/domain/core/no-multiple-declarators/rule.fixes.js +0 -95
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.d.ts +0 -4
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.d.ts.map +0 -1
- package/dist/domain/core/no-multiple-declarators/rule.guardrails.js +0 -4
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.d.ts +0 -4
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.d.ts.map +0 -1
- package/dist/domain/core/no-multiple-declarators/rule.mocked-types.js +0 -4
- package/dist/domain/core/prefer-interface-types/test-helpers.d.ts +0 -110
- package/dist/domain/core/prefer-interface-types/test-helpers.d.ts.map +0 -1
- package/dist/domain/core/prefer-interface-types/test-helpers.js +0 -116
- package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +0 -89
- package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +0 -1
- package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.js +0 -129
- package/dist/domain/docs/no-interface-member-docs/test-helpers.d.ts +0 -103
- package/dist/domain/docs/no-interface-member-docs/test-helpers.d.ts.map +0 -1
- package/dist/domain/docs/no-interface-member-docs/test-helpers.js +0 -157
- package/dist/domain/docs/require-example-language/create-fixer.d.ts +0 -5
- package/dist/domain/docs/require-example-language/create-fixer.d.ts.map +0 -1
- package/dist/domain/docs/require-example-language/create-fixer.js +0 -5
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.d.ts +0 -4
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.d.ts.map +0 -1
- package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.js +0 -5
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.d.ts +0 -4
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.d.ts.map +0 -1
- package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.js +0 -5
- package/dist/domain/docs/test-helpers.d.ts +0 -50
- package/dist/domain/docs/test-helpers.d.ts.map +0 -1
- package/dist/domain/docs/test-helpers.js +0 -107
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.d.ts +0 -9
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.d.ts.map +0 -1
- package/dist/domain/testing/aaa/analyzer.classification.member-patterns.js +0 -10
- package/dist/domain/testing/aaa/analyzer.d.ts +0 -46
- package/dist/domain/testing/aaa/analyzer.d.ts.map +0 -1
- package/dist/domain/testing/aaa/analyzer.js +0 -59
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.d.ts +0 -4
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.d.ts.map +0 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.js +0 -4
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.d.ts +0 -42
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.d.ts.map +0 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.js +0 -188
- package/dist/domain/testing/enforce-aaa-phase-purity/rule.d.ts +0 -5
- package/dist/domain/testing/enforce-aaa-phase-purity/rule.d.ts.map +0 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/rule.js +0 -34
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.d.ts +0 -20
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vi-mocked-import/rule-test-helpers.js +0 -39
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts +0 -86
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.js +0 -150
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.d.ts +0 -2
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/index.js +0 -2
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts +0 -14
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.js +0 -81
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts +0 -13
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/match.js +0 -189
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts +0 -25
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.js +0 -92
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.d.ts +0 -32
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule-test-helpers.js +0 -164
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts +0 -5
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.d.ts +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.guardrails.js +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.d.ts +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.input-shapes.js +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.js +0 -62
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.d.ts +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/rule.signature-fallback.js +0 -4
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts +0 -24
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.js +0 -113
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.d.ts +0 -36
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/type-shape-helpers.js +0 -138
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts +0 -203
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts.map +0 -1
- package/dist/domain/testing/prefer-vitest-incremental-casts/types.js +0 -2
- package/dist/domain/testing/require-aaa-sections/index.d.ts +0 -2
- package/dist/domain/testing/require-aaa-sections/index.d.ts.map +0 -1
- package/dist/domain/testing/require-aaa-sections/index.js +0 -2
- package/dist/domain/testing/require-aaa-sections/missing-section-fixes.d.ts.map +0 -1
- package/dist/domain/testing/require-aaa-sections/missing-section-fixes.js +0 -150
- package/dist/domain/testing/require-aaa-sections/rule.d.ts +0 -5
- package/dist/domain/testing/require-aaa-sections/rule.d.ts.map +0 -1
- package/dist/domain/testing/require-aaa-sections/rule.js +0 -129
- package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts +0 -104
- package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts.map +0 -1
- package/dist/domain/testing/require-aaa-sections/rule.reporting.js +0 -217
- package/dist/domain/testing/require-test-companion/require-test-companion-test-helpers.d.ts +0 -51
- package/dist/domain/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +0 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-test-helpers.js +0 -184
- package/dist/domain/testing/require-test-companion/require-test-companion-utilities.d.ts +0 -28
- package/dist/domain/testing/require-test-companion/require-test-companion-utilities.d.ts.map +0 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-utilities.js +0 -26
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type * as ESTree from "estree";
|
|
2
|
+
import type { LocatedNode, TestBlockAnalysis } from "./types.js";
|
|
3
|
+
/** Identifier names extracted from an assertion statement. */
|
|
4
|
+
interface AssertionIdentifiers {
|
|
5
|
+
/** Identifier used as the actual value. */
|
|
6
|
+
actual: string | undefined;
|
|
7
|
+
/** Identifier used as the expected value. */
|
|
8
|
+
expected: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Collects Assert declarations.
|
|
12
|
+
* @param analysis Input analysis value.
|
|
13
|
+
* @returns Return value output.
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* getAssertDeclaredIdentifiers(analysis);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function getAssertDeclaredIdentifiers(analysis: TestBlockAnalysis): Map<string, LocatedNode<ESTree.Identifier>>;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts assertion identifiers.
|
|
22
|
+
* @param statement Input statement value.
|
|
23
|
+
* @returns Return value output.
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* getAssertionIdentifiers(statement);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare function getAssertionIdentifiers(statement: ESTree.Statement): AssertionIdentifiers;
|
|
30
|
+
/**
|
|
31
|
+
* Gets a statement expression.
|
|
32
|
+
* @param statement Input statement value.
|
|
33
|
+
* @returns Return value output.
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* getStatementExpression(statement);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
declare function getStatementExpression(statement: ESTree.Statement): ESTree.Expression | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Checks for assertions.
|
|
42
|
+
* @param statement Input statement value.
|
|
43
|
+
* @returns Return value output.
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* hasAssertion(statement);
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare function hasAssertion(statement: ESTree.Statement): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Checks for action expressions.
|
|
52
|
+
* @param expression Input expression value.
|
|
53
|
+
* @returns Return value output.
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* isActionExpression(expression);
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
declare function isActionExpression(expression: ESTree.Expression | undefined): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Checks Assert statement validity.
|
|
62
|
+
* @param statement Input statement value.
|
|
63
|
+
* @returns Return value output.
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* isValidAssertStatement(statement);
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
declare function isValidAssertStatement(statement: ESTree.Statement): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Unwraps nested expressions.
|
|
72
|
+
* @param expression Input expression value.
|
|
73
|
+
* @returns Return value output.
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* unwrapExpression(expression);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare function unwrapExpression(expression: ESTree.Expression | undefined): ESTree.Expression | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Checks AAA naming prefixes.
|
|
82
|
+
* @param name Input name value.
|
|
83
|
+
* @param prefix Input prefix value.
|
|
84
|
+
* @returns Return value output.
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* usesPrefix("actualResult", "actual");
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function usesPrefix(name: string, prefix: "actual" | "expected"): boolean;
|
|
91
|
+
/** Companion marker for test isolation. */
|
|
92
|
+
export { getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
|
|
93
|
+
//# sourceMappingURL=analyzer.assertions.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.assertions.helpers.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAW9D,8DAA8D;AAC9D,UAAU,oBAAoB;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,iBAAS,4BAA4B,CACnC,QAAQ,EAAE,iBAAiB,GAC1B,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAkB7C;AAwBD;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAC9B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,oBAAoB,CAqBtB;AAED;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC1B,MAAM,CAAC,UAAU,GAAG,SAAS,CAY/B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAQ1D;AAED;;;;;;;;GAQG;AACH,iBAAS,kBAAkB,CACzB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,OAAO,CAOT;AAED;;;;;;;;GAQG;AACH,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAmBpE;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CACvB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,MAAM,CAAC,UAAU,GAAG,SAAS,CAQ/B;AAED;;;;;;;;;GASG;AACH,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAExE;AAED,2CAA2C;AAC3C,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,GACX,CAAC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { getAssertOperands, getExpectOperands, getIdentifierName, hasEvaluatedAssertionActual, isAssertionCall, } from "./analyzer.assertions.operands.js";
|
|
2
|
+
import { visitNode } from "./analyzer.super.helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Collects Assert declarations.
|
|
5
|
+
* @param analysis Input analysis value.
|
|
6
|
+
* @returns Return value output.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* getAssertDeclaredIdentifiers(analysis);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
function getAssertDeclaredIdentifiers(analysis) {
|
|
13
|
+
const declaredIdentifiers = new Map();
|
|
14
|
+
for (const statement of analysis.statements) {
|
|
15
|
+
if (statement.phases.includes("Assert") &&
|
|
16
|
+
statement.node.type === "VariableDeclaration") {
|
|
17
|
+
for (const declaration of statement.node.declarations) {
|
|
18
|
+
if (declaration.id.type === "Identifier") {
|
|
19
|
+
declaredIdentifiers.set(declaration.id.name, declaration.id);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return declaredIdentifiers;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gets the outer assertion call expression for one statement when present.
|
|
28
|
+
* @param statement Statement to inspect.
|
|
29
|
+
* @returns Assertion call expression when the statement is expression-based.
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const expression = getAssertionExpression(statement);
|
|
33
|
+
* void expression;
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
function getAssertionExpression(statement) {
|
|
37
|
+
if (statement.type !== "ExpressionStatement") {
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
const expression = unwrapExpression(statement.expression);
|
|
41
|
+
return expression?.type === "CallExpression" ? expression : void 0;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extracts assertion identifiers.
|
|
45
|
+
* @param statement Input statement value.
|
|
46
|
+
* @returns Return value output.
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* getAssertionIdentifiers(statement);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function getAssertionIdentifiers(statement) {
|
|
53
|
+
if (statement.type !== "ExpressionStatement") {
|
|
54
|
+
return { actual: void 0, expected: void 0 };
|
|
55
|
+
}
|
|
56
|
+
const expression = unwrapExpression(statement.expression);
|
|
57
|
+
if (expression?.type !== "CallExpression") {
|
|
58
|
+
return { actual: void 0, expected: void 0 };
|
|
59
|
+
}
|
|
60
|
+
const expectOperands = getExpectOperands(expression);
|
|
61
|
+
if (expectOperands !== void 0) {
|
|
62
|
+
return {
|
|
63
|
+
actual: getIdentifierName(expectOperands.actual),
|
|
64
|
+
expected: getIdentifierName(expectOperands.expected),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const assertOperands = getAssertOperands(expression);
|
|
68
|
+
return {
|
|
69
|
+
actual: getIdentifierName(assertOperands?.actual),
|
|
70
|
+
expected: getIdentifierName(assertOperands?.expected),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Gets a statement expression.
|
|
75
|
+
* @param statement Input statement value.
|
|
76
|
+
* @returns Return value output.
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* getStatementExpression(statement);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function getStatementExpression(statement) {
|
|
83
|
+
if (statement.type === "ExpressionStatement") {
|
|
84
|
+
return statement.expression;
|
|
85
|
+
}
|
|
86
|
+
if (statement.type === "VariableDeclaration" &&
|
|
87
|
+
statement.declarations.length === 1) {
|
|
88
|
+
const [declaration] = statement.declarations;
|
|
89
|
+
return declaration?.init;
|
|
90
|
+
}
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Checks for assertions.
|
|
95
|
+
* @param statement Input statement value.
|
|
96
|
+
* @returns Return value output.
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* hasAssertion(statement);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
function hasAssertion(statement) {
|
|
103
|
+
let foundAssertion = false;
|
|
104
|
+
visitNode(statement, (node) => {
|
|
105
|
+
if (node.type === "CallExpression" && isAssertionCall(node)) {
|
|
106
|
+
foundAssertion = true;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return foundAssertion;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checks for action expressions.
|
|
113
|
+
* @param expression Input expression value.
|
|
114
|
+
* @returns Return value output.
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* isActionExpression(expression);
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
function isActionExpression(expression) {
|
|
121
|
+
const unwrappedExpression = unwrapExpression(expression);
|
|
122
|
+
return (unwrappedExpression?.type === "AwaitExpression" ||
|
|
123
|
+
unwrappedExpression?.type === "CallExpression" ||
|
|
124
|
+
unwrappedExpression?.type === "NewExpression");
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Checks Assert statement validity.
|
|
128
|
+
* @param statement Input statement value.
|
|
129
|
+
* @returns Return value output.
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* isValidAssertStatement(statement);
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
function isValidAssertStatement(statement) {
|
|
136
|
+
if (hasAssertion(statement)) {
|
|
137
|
+
const assertionExpression = getAssertionExpression(statement);
|
|
138
|
+
return (assertionExpression === void 0 ||
|
|
139
|
+
!hasEvaluatedAssertionActual(assertionExpression, isActionExpression));
|
|
140
|
+
}
|
|
141
|
+
if (statement.type !== "VariableDeclaration") {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return statement.declarations.every((declaration) => {
|
|
145
|
+
if (declaration.init === null) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return !isActionExpression(unwrapExpression(declaration.init));
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Unwraps nested expressions.
|
|
153
|
+
* @param expression Input expression value.
|
|
154
|
+
* @returns Return value output.
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* unwrapExpression(expression);
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
function unwrapExpression(expression) {
|
|
161
|
+
if (expression?.type === "ChainExpression") {
|
|
162
|
+
return unwrapExpression(expression.expression);
|
|
163
|
+
}
|
|
164
|
+
if (expression?.type === "AwaitExpression") {
|
|
165
|
+
return expression.argument;
|
|
166
|
+
}
|
|
167
|
+
return expression;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Checks AAA naming prefixes.
|
|
171
|
+
* @param name Input name value.
|
|
172
|
+
* @param prefix Input prefix value.
|
|
173
|
+
* @returns Return value output.
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* usesPrefix("actualResult", "actual");
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
function usesPrefix(name, prefix) {
|
|
180
|
+
return name === prefix || name.startsWith(prefix);
|
|
181
|
+
}
|
|
182
|
+
/** Companion marker for test isolation. */
|
|
183
|
+
export { getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL2FhYS9hbmFseXplci5hc3NlcnRpb25zLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLDJCQUEyQixFQUMzQixlQUFlLEdBQ2hCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBVXJEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FDbkMsUUFBMkI7SUFFM0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUM5RSxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUNFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxxQkFBcUIsRUFDN0MsQ0FBQztZQUNELEtBQUssTUFBTSxXQUFXLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDekMsbUJBQW1CLENBQUMsR0FBRyxDQUNyQixXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFDbkIsV0FBVyxDQUFDLEVBQW9DLENBQ2pELENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLFNBQTJCO0lBRTNCLElBQUksU0FBUyxD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QUFVLENBQUMsSUFBWSxFQUFFLE1BQTZCO0lBQzdELE9BQU8sSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixVQUFVLEdBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgTG9jYXRlZE5vZGUsIFRlc3RCbG9ja0FuYWx5c2lzIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgZ2V0QXNzZXJ0T3BlcmFuZHMsXHJcbiAgZ2V0RXhwZWN0T3BlcmFuZHMsXHJcbiAgZ2V0SWRlbnRpZmllck5hbWUsXHJcbiAgaGFzRXZhbHVhdGVkQXNzZXJ0aW9uQWN0dWFsLFxyXG4gIGlzQXNzZXJ0aW9uQ2FsbCxcclxufSBmcm9tIFwiLi9hbmFseXplci5hc3NlcnRpb25zLm9wZXJhbmRzXCI7XHJcbmltcG9ydCB7IHZpc2l0Tm9kZSB9IGZyb20gXCIuL2FuYWx5emVyLnN1cGVyLmhlbHBlcnNcIjtcclxuXHJcbi8qKiBJZGVudGlmaWVyIG5hbWVzIGV4dHJhY3RlZCBmcm9tIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQuICovXHJcbmludGVyZmFjZSBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgLyoqIElkZW50aWZpZXIgdXNlZCBhcyB0aGUgYWN0dWFsIHZhbHVlLiAqL1xyXG4gIGFjdHVhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8qKiBJZGVudGlmaWVyIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHZhbHVlLiAqL1xyXG4gIGV4cGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0cyBBc3NlcnQgZGVjbGFyYXRpb25zLlxyXG4gKiBAcGFyYW0gYW5hbHlzaXMgSW5wdXQgYW5hbHlzaXMgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhhbmFseXNpcyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhcclxuICBhbmFseXNpczogVGVzdEJsb2NrQW5hbHlzaXMsXHJcbik6IE1hcDxzdHJpbmcsIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPj4ge1xyXG4gIGNvbnN0IGRlY2xhcmVkSWRlbnRpZmllcnMgPSBuZXcgTWFwPHN0cmluZywgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+PigpO1xyXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFuYWx5c2lzLnN0YXRlbWVudHMpIHtcclxuICAgIGlmIChcclxuICAgICAgc3RhdGVtZW50LnBoYXNlcy5pbmNsdWRlcyhcIkFzc2VydFwiKSAmJlxyXG4gICAgICBzdGF0ZW1lbnQubm9kZS50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3RhdGVtZW50Lm5vZGUuZGVjbGFyYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XHJcbiAgICAgICAgICBkZWNsYXJlZElkZW50aWZpZXJzLnNldChcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQubmFtZSxcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQgYXMgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRlY2xhcmVkSWRlbnRpZmllcnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvdXRlciBhc3NlcnRpb24gY2FsbCBleHByZXNzaW9uIGZvciBvbmUgc3RhdGVtZW50IHdoZW4gcHJlc2VudC5cclxuICogQHBhcmFtIHN0YXRlbWVudCBTdGF0ZW1lbnQgdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMgQXNzZXJ0aW9uIGNhbGwgZXhwcmVzc2lvbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaXMgZXhwcmVzc2lvbi1iYXNlZC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBleHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiB2b2lkIGV4cHJlc3Npb247XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihcclxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQsXHJcbik6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHZvaWQgMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKTtcclxuXHJcbiAgcmV0dXJuIGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiA/IGV4cHJlc3Npb24gOiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBhc3NlcnRpb24gaWRlbnRpZmllcnMuXHJcbiAqIEBwYXJhbSBzdGF0ZW1lbnQgSW5wdXQgc3RhdGVtZW50IHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldEFzc2VydGlvbklkZW50aWZpZXJzKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMoXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHsgYWN0dWFsOiB2b2lkIDAsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcbiAgY29uc3QgZXhwcmVzc2lvbiA9IHVud3JhcEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pO1xyXG4gIGlmIChleHByZXNzaW9uPy50eXBlICE9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiB7IGFjdHVhbDogdm9pZCAwLCBleHBlY3RlZDogdm9pZCAwIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBleHBlY3RPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIGlmIChleHBlY3RPcGVyYW5kcyAhPT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGV4cGVjdE9wZXJhbmRzLmFjdHVhbCksXHJcbiAgICAgIGV4cGVjdGVkOiBnZXRJZGVudGlmaWVyTmFtZShleHBlY3RPcGVyYW5kcy5leHBlY3RlZCksXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBhc3NlcnRPcGVyYW5kcyA9IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiB7XHJcbiAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5hY3R1YWwpLFxyXG4gICAgZXhwZWN0ZWQ6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5leHBlY3RlZCksXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYSBzdGF0ZW1lbnQgZXhwcmVzc2lvbi5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFN0YXRlbWVudEV4cHJlc3Npb24oXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICBzdGF0ZW1lbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcclxuICAgIHN0YXRlbWVudC5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgKSB7XHJcbiAgICBjb25zdCBbZGVjbGFyYXRpb25dID0gc3RhdGVtZW50LmRlY2xhcmF0aW9ucztcclxuICAgIHJldHVybiBkZWNsYXJhdGlvbj8uaW5pdCBhcyBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYXNzZXJ0aW9ucy5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaGFzQXNzZXJ0aW9uKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaGFzQXNzZXJ0aW9uKHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCk6IGJvb2xlYW4ge1xyXG4gIGxldCBmb3VuZEFzc2VydGlvbiA9IGZhbHNlO1xyXG4gIHZpc2l0Tm9kZShzdGF0ZW1lbnQsIChub2RlKSA9PiB7XHJcbiAgICBpZiAobm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgaXNBc3NlcnRpb25DYWxsKG5vZGUpKSB7XHJcbiAgICAgIGZvdW5kQXNzZXJ0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZm91bmRBc3NlcnRpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgZm9yIGFjdGlvbiBleHByZXNzaW9ucy5cclxuICogQHBhcmFtIGV4cHJlc3Npb24gSW5wdXQgZXhwcmVzc2lvbiB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpc0FjdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaXNBY3Rpb25FeHByZXNzaW9uKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxyXG4pOiBib29sZWFuIHtcclxuICBjb25zdCB1bndyYXBwZWRFeHByZXNzaW9uID0gdW53cmFwRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICByZXR1cm4gKFxyXG4gICAgdW53cmFwcGVkRXhwcmVzc2lvbj8udHlwZSA9PT0gXCJBd2FpdEV4cHJlc3Npb25cIiB8fFxyXG4gICAgdW53cmFwcGVkRXhwcmVzc2lvbj8udHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8XHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIlxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgQXNzZXJ0IHN0YXRlbWVudCB2YWxpZGl0eS5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaXNWYWxpZEFzc2VydFN0YXRlbWVudChzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQoc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XHJcbiAgaWYgKGhhc0Fzc2VydGlvbihzdGF0ZW1lbnQpKSB7XHJcbiAgICBjb25zdCBhc3NlcnRpb25FeHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIGFzc2VydGlvbkV4cHJlc3Npb24gPT09IHZvaWQgMCB8fFxyXG4gICAgICAhaGFzRXZhbHVhdGVkQXNzZXJ0aW9uQWN0dWFsKGFzc2VydGlvbkV4cHJlc3Npb24sIGlzQWN0aW9uRXhwcmVzc2lvbilcclxuICAgICk7XHJcbiAgfVxyXG4gIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zLmV2ZXJ5KChkZWNsYXJhdGlvbikgPT4ge1xyXG4gICAgaWYgKGRlY2xhcmF0aW9uLmluaXQgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWlzQWN0aW9uRXhwcmVzc2lvbih1bndyYXBFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXQpKTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVud3JhcHMgbmVzdGVkIGV4cHJlc3Npb25zLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIHVud3JhcEV4cHJlc3Npb24oZXhwcmVzc2lvbik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gdW53cmFwRXhwcmVzc2lvbihcclxuICBleHByZXNzaW9uOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCxcclxuKTogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xyXG4gIGlmIChleHByZXNzaW9uPy50eXBlID09PSBcIkNoYWluRXhwcmVzc2lvblwiKSB7XHJcbiAgICByZXR1cm4gdW53cmFwRXhwcmVzc2lvbihleHByZXNzaW9uLmV4cHJlc3Npb24pO1xyXG4gIH1cclxuICBpZiAoZXhwcmVzc2lvbj8udHlwZSA9PT0gXCJBd2FpdEV4cHJlc3Npb25cIikge1xyXG4gICAgcmV0dXJuIGV4cHJlc3Npb24uYXJndW1lbnQ7XHJcbiAgfVxyXG4gIHJldHVybiBleHByZXNzaW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIEFBQSBuYW1pbmcgcHJlZml4ZXMuXHJcbiAqIEBwYXJhbSBuYW1lIElucHV0IG5hbWUgdmFsdWUuXHJcbiAqIEBwYXJhbSBwcmVmaXggSW5wdXQgcHJlZml4IHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIHVzZXNQcmVmaXgoXCJhY3R1YWxSZXN1bHRcIiwgXCJhY3R1YWxcIik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gdXNlc1ByZWZpeChuYW1lOiBzdHJpbmcsIHByZWZpeDogXCJhY3R1YWxcIiB8IFwiZXhwZWN0ZWRcIik6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBuYW1lID09PSBwcmVmaXggfHwgbmFtZS5zdGFydHNXaXRoKHByZWZpeCk7XHJcbn1cclxuXHJcbi8qKiBDb21wYW5pb24gbWFya2VyIGZvciB0ZXN0IGlzb2xhdGlvbi4gKi9cclxuZXhwb3J0IHtcclxuICBnZXRBc3NlcnREZWNsYXJlZElkZW50aWZpZXJzLFxyXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzLFxyXG4gIGdldFN0YXRlbWVudEV4cHJlc3Npb24sXHJcbiAgaGFzQXNzZXJ0aW9uLFxyXG4gIGlzQWN0aW9uRXhwcmVzc2lvbixcclxuICBpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50LFxyXG4gIHVud3JhcEV4cHJlc3Npb24sXHJcbiAgdXNlc1ByZWZpeCxcclxufTtcclxuIl19
|
|
@@ -1,283 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* @returns Return value output.
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* getAssertDeclaredIdentifiers(analysis);
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
|
-
function getAssertDeclaredIdentifiers(analysis) {
|
|
13
|
-
const declaredIdentifiers = new Map();
|
|
14
|
-
for (const statement of analysis.statements) {
|
|
15
|
-
if (statement.phases.includes("Assert") &&
|
|
16
|
-
statement.node.type === "VariableDeclaration") {
|
|
17
|
-
for (const declaration of statement.node.declarations) {
|
|
18
|
-
if (declaration.id.type === "Identifier") {
|
|
19
|
-
declaredIdentifiers.set(declaration.id.name, declaration.id);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return declaredIdentifiers;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Gets the outer assertion call expression for one statement when present.
|
|
28
|
-
* @param statement Statement to inspect.
|
|
29
|
-
* @returns Assertion call expression when the statement is expression-based.
|
|
30
|
-
* @example
|
|
31
|
-
* ```typescript
|
|
32
|
-
* const expression = getAssertionExpression(statement);
|
|
33
|
-
* void expression;
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
function getAssertionExpression(statement) {
|
|
37
|
-
if (statement.type !== "ExpressionStatement") {
|
|
38
|
-
return void 0;
|
|
39
|
-
}
|
|
40
|
-
const expression = unwrapExpression(statement.expression);
|
|
41
|
-
return expression?.type === "CallExpression" ? expression : void 0;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Extracts assertion identifiers.
|
|
45
|
-
* @param statement Input statement value.
|
|
46
|
-
* @returns Return value output.
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* getAssertionIdentifiers(statement);
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
function getAssertionIdentifiers(statement) {
|
|
53
|
-
if (statement.type !== "ExpressionStatement") {
|
|
54
|
-
return { actual: void 0, expected: void 0 };
|
|
55
|
-
}
|
|
56
|
-
const expression = unwrapExpression(statement.expression);
|
|
57
|
-
if (expression?.type !== "CallExpression") {
|
|
58
|
-
return { actual: void 0, expected: void 0 };
|
|
59
|
-
}
|
|
60
|
-
const expectOperands = getExpectOperands(expression);
|
|
61
|
-
if (expectOperands !== void 0) {
|
|
62
|
-
return {
|
|
63
|
-
actual: getIdentifierName(expectOperands.actual),
|
|
64
|
-
expected: getIdentifierName(expectOperands.expected),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
const assertOperands = getAssertOperands(expression);
|
|
68
|
-
return {
|
|
69
|
-
actual: getIdentifierName(assertOperands?.actual),
|
|
70
|
-
expected: getIdentifierName(assertOperands?.expected),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Gets assert operands.
|
|
75
|
-
* @param expression Input expression value.
|
|
76
|
-
* @returns Return value output.
|
|
77
|
-
* @example
|
|
78
|
-
* ```typescript
|
|
79
|
-
* getAssertOperands(expression);
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
function getAssertOperands(expression) {
|
|
83
|
-
if (expression.callee.type === "MemberExpression" &&
|
|
84
|
-
expression.callee.object.type === "Identifier" &&
|
|
85
|
-
expression.callee.object.name === "assert") {
|
|
86
|
-
const [actual, expected] = expression.arguments;
|
|
87
|
-
if (actual?.type !== "SpreadElement" &&
|
|
88
|
-
expected?.type !== "SpreadElement") {
|
|
89
|
-
return { actual, expected };
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return void 0;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Gets expect operands.
|
|
96
|
-
* @param expression Input expression value.
|
|
97
|
-
* @returns Return value output.
|
|
98
|
-
* @example
|
|
99
|
-
* ```typescript
|
|
100
|
-
* getExpectOperands(expression);
|
|
101
|
-
* ```
|
|
102
|
-
*/
|
|
103
|
-
function getExpectOperands(expression) {
|
|
104
|
-
if (expression.callee.type === "Identifier" &&
|
|
105
|
-
expression.callee.name === "expect") {
|
|
106
|
-
const [actual] = expression.arguments;
|
|
107
|
-
return actual?.type === "SpreadElement"
|
|
108
|
-
? { actual: void 0, expected: void 0 }
|
|
109
|
-
: { actual, expected: void 0 };
|
|
110
|
-
}
|
|
111
|
-
if (expression.callee.type === "MemberExpression" &&
|
|
112
|
-
expression.callee.object.type === "CallExpression") {
|
|
113
|
-
const nestedOperands = getExpectOperands(expression.callee.object);
|
|
114
|
-
if (nestedOperands === void 0) {
|
|
115
|
-
return void 0;
|
|
116
|
-
}
|
|
117
|
-
const [expected] = expression.arguments;
|
|
118
|
-
return expected?.type === "SpreadElement"
|
|
119
|
-
? nestedOperands
|
|
120
|
-
: { actual: nestedOperands.actual, expected };
|
|
121
|
-
}
|
|
122
|
-
return void 0;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Gets an identifier name.
|
|
126
|
-
* @param expression Input expression value.
|
|
127
|
-
* @returns Return value output.
|
|
128
|
-
* @example
|
|
129
|
-
* ```typescript
|
|
130
|
-
* getIdentifierName(expression);
|
|
131
|
-
* ```
|
|
132
|
-
*/
|
|
133
|
-
function getIdentifierName(expression) {
|
|
134
|
-
return expression?.type === "Identifier" ? expression.name : void 0;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Gets a statement expression.
|
|
138
|
-
* @param statement Input statement value.
|
|
139
|
-
* @returns Return value output.
|
|
140
|
-
* @example
|
|
141
|
-
* ```typescript
|
|
142
|
-
* getStatementExpression(statement);
|
|
143
|
-
* ```
|
|
144
|
-
*/
|
|
145
|
-
function getStatementExpression(statement) {
|
|
146
|
-
if (statement.type === "ExpressionStatement") {
|
|
147
|
-
return statement.expression;
|
|
148
|
-
}
|
|
149
|
-
if (statement.type === "VariableDeclaration" &&
|
|
150
|
-
statement.declarations.length === 1) {
|
|
151
|
-
const [declaration] = statement.declarations;
|
|
152
|
-
return declaration?.init;
|
|
153
|
-
}
|
|
154
|
-
return void 0;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Checks for assertions.
|
|
158
|
-
* @param statement Input statement value.
|
|
159
|
-
* @returns Return value output.
|
|
160
|
-
* @example
|
|
161
|
-
* ```typescript
|
|
162
|
-
* hasAssertion(statement);
|
|
163
|
-
* ```
|
|
164
|
-
*/
|
|
165
|
-
function hasAssertion(statement) {
|
|
166
|
-
let foundAssertion = false;
|
|
167
|
-
visitNode(statement, (node) => {
|
|
168
|
-
if (node.type === "CallExpression" && isAssertionCall(node)) {
|
|
169
|
-
foundAssertion = true;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
return foundAssertion;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Checks whether an assertion evaluates the actual operand inline.
|
|
176
|
-
* @param expression Assertion call expression to inspect.
|
|
177
|
-
* @returns True when the assertion actual operand performs action-like work.
|
|
178
|
-
* @example
|
|
179
|
-
* ```typescript
|
|
180
|
-
* const actual = hasEvaluatedAssertionActual(expression);
|
|
181
|
-
* void actual;
|
|
182
|
-
* ```
|
|
183
|
-
*/
|
|
184
|
-
function hasEvaluatedAssertionActual(expression) {
|
|
185
|
-
const operands = getExpectOperands(expression) ?? getAssertOperands(expression);
|
|
186
|
-
return operands !== void 0 && isActionExpression(operands.actual);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Checks for action expressions.
|
|
190
|
-
* @param expression Input expression value.
|
|
191
|
-
* @returns Return value output.
|
|
192
|
-
* @example
|
|
193
|
-
* ```typescript
|
|
194
|
-
* isActionExpression(expression);
|
|
195
|
-
* ```
|
|
196
|
-
*/
|
|
197
|
-
function isActionExpression(expression) {
|
|
198
|
-
const unwrappedExpression = unwrapExpression(expression);
|
|
199
|
-
return (unwrappedExpression?.type === "AwaitExpression" ||
|
|
200
|
-
unwrappedExpression?.type === "CallExpression" ||
|
|
201
|
-
unwrappedExpression?.type === "NewExpression");
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Checks for assertion calls.
|
|
205
|
-
* @param node Input node value.
|
|
206
|
-
* @returns Return value output.
|
|
207
|
-
* @example
|
|
208
|
-
* ```typescript
|
|
209
|
-
* isAssertionCall(node);
|
|
210
|
-
* ```
|
|
211
|
-
*/
|
|
212
|
-
function isAssertionCall(node) {
|
|
213
|
-
if (node.callee.type === "Identifier") {
|
|
214
|
-
return node.callee.name === "expect" || node.callee.name === "assert";
|
|
215
|
-
}
|
|
216
|
-
if (node.callee.type !== "MemberExpression") {
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
if (node.callee.object.type === "Identifier" &&
|
|
220
|
-
node.callee.object.name === "assert") {
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
|
-
return (node.callee.object.type === "CallExpression" &&
|
|
224
|
-
isAssertionCall(node.callee.object));
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Checks Assert statement validity.
|
|
228
|
-
* @param statement Input statement value.
|
|
229
|
-
* @returns Return value output.
|
|
230
|
-
* @example
|
|
231
|
-
* ```typescript
|
|
232
|
-
* isValidAssertStatement(statement);
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
function isValidAssertStatement(statement) {
|
|
236
|
-
if (hasAssertion(statement)) {
|
|
237
|
-
const assertionExpression = getAssertionExpression(statement);
|
|
238
|
-
return (assertionExpression === void 0 ||
|
|
239
|
-
!hasEvaluatedAssertionActual(assertionExpression));
|
|
240
|
-
}
|
|
241
|
-
if (statement.type !== "VariableDeclaration") {
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
return statement.declarations.every((declaration) => {
|
|
245
|
-
if (declaration.init === null) {
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
return !isActionExpression(unwrapExpression(declaration.init));
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Unwraps nested expressions.
|
|
253
|
-
* @param expression Input expression value.
|
|
254
|
-
* @returns Return value output.
|
|
255
|
-
* @example
|
|
256
|
-
* ```typescript
|
|
257
|
-
* unwrapExpression(expression);
|
|
258
|
-
* ```
|
|
259
|
-
*/
|
|
260
|
-
function unwrapExpression(expression) {
|
|
261
|
-
if (expression?.type === "ChainExpression") {
|
|
262
|
-
return unwrapExpression(expression.expression);
|
|
263
|
-
}
|
|
264
|
-
if (expression?.type === "AwaitExpression") {
|
|
265
|
-
return expression.argument;
|
|
266
|
-
}
|
|
267
|
-
return expression;
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Checks AAA naming prefixes.
|
|
271
|
-
* @param name Input name value.
|
|
272
|
-
* @param prefix Input prefix value.
|
|
273
|
-
* @returns Return value output.
|
|
274
|
-
* @example
|
|
275
|
-
* ```typescript
|
|
276
|
-
* usesPrefix("actualResult", "actual");
|
|
277
|
-
* ```
|
|
278
|
-
*/
|
|
279
|
-
function usesPrefix(name, prefix) {
|
|
280
|
-
return name === prefix || name.startsWith(prefix);
|
|
281
|
-
}
|
|
282
|
-
export { getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
|
|
283
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9hYWEvYW5hbHl6ZXIuYXNzZXJ0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1SUFBdUk7QUFNdkksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBa0I3Qzs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsNEJBQTRCLENBQ25DLFFBQTJCO0lBRTNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7SUFDOUUsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsSUFDRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQzdDLENBQUM7WUFDRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RELElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3pDLG1CQUFtQixDQUFDLEdBQUcsQ0FDckIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQ25CLFdBQVcsQ0FBQyxFQUFvQyxDQUNqRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHNCQUFzQixDQUM3QixTQUEyQjtJQUUzQixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FB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QUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLFVBQXlDO0lBRXpDLElBQUksVUFBVSxFQUFFLElBQUksS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNDLE9BQU8sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUMzQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBNkI7SUFDN0QsT0FBTyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbWF4LWxpbmVzOiBbXCJlcnJvclwiLCAzODBdIC0tIE1hbmRhdG9yeSBtdWx0aWxpbmUgSlNEb2MgZm9yIGludGVybmFsIGhlbHBlcnMgcHVzaGVzIHRoaXMgc3BsaXQgZmlsZSBvdmVyIHRoZSBkZWZhdWx0IGxpbWl0LiAqL1xyXG5cclxuaW1wb3J0IHR5cGUgKiBhcyBFU1RyZWUgZnJvbSBcImVzdHJlZVwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBMb2NhdGVkTm9kZSwgVGVzdEJsb2NrQW5hbHlzaXMgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgdmlzaXROb2RlIH0gZnJvbSBcIi4vYW5hbHl6ZXIuc3VwZXJcIjtcclxuXHJcbi8qKiBJZGVudGlmaWVyIG5hbWVzIGV4dHJhY3RlZCBmcm9tIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQuICovXHJcbmludGVyZmFjZSBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgLyoqIElkZW50aWZpZXIgdXNlZCBhcyB0aGUgYWN0dWFsIHZhbHVlLiAqL1xyXG4gIGFjdHVhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8qKiBJZGVudGlmaWVyIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHZhbHVlLiAqL1xyXG4gIGV4cGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBSYXcgYXNzZXJ0aW9uIG9wZXJhbmRzIGV4dHJhY3RlZCBmcm9tIGEgY2FsbCBleHByZXNzaW9uLiAqL1xyXG5pbnRlcmZhY2UgQXNzZXJ0aW9uT3BlcmFuZHMge1xyXG4gIC8qKiBFeHByZXNzaW9uIHVzZWQgYXMgdGhlIGFjdHVhbCBvcGVyYW5kLiAqL1xyXG4gIGFjdHVhbDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XHJcbiAgLyoqIEV4cHJlc3Npb24gdXNlZCBhcyB0aGUgZXhwZWN0ZWQgb3BlcmFuZC4gKi9cclxuICBleHBlY3RlZDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0cyBBc3NlcnQgZGVjbGFyYXRpb25zLlxyXG4gKiBAcGFyYW0gYW5hbHlzaXMgSW5wdXQgYW5hbHlzaXMgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhhbmFseXNpcyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhcclxuICBhbmFseXNpczogVGVzdEJsb2NrQW5hbHlzaXMsXHJcbik6IE1hcDxzdHJpbmcsIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPj4ge1xyXG4gIGNvbnN0IGRlY2xhcmVkSWRlbnRpZmllcnMgPSBuZXcgTWFwPHN0cmluZywgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+PigpO1xyXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFuYWx5c2lzLnN0YXRlbWVudHMpIHtcclxuICAgIGlmIChcclxuICAgICAgc3RhdGVtZW50LnBoYXNlcy5pbmNsdWRlcyhcIkFzc2VydFwiKSAmJlxyXG4gICAgICBzdGF0ZW1lbnQubm9kZS50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3RhdGVtZW50Lm5vZGUuZGVjbGFyYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XHJcbiAgICAgICAgICBkZWNsYXJlZElkZW50aWZpZXJzLnNldChcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQubmFtZSxcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQgYXMgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRlY2xhcmVkSWRlbnRpZmllcnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvdXRlciBhc3NlcnRpb24gY2FsbCBleHByZXNzaW9uIGZvciBvbmUgc3RhdGVtZW50IHdoZW4gcHJlc2VudC5cclxuICogQHBhcmFtIHN0YXRlbWVudCBTdGF0ZW1lbnQgdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMgQXNzZXJ0aW9uIGNhbGwgZXhwcmVzc2lvbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaXMgZXhwcmVzc2lvbi1iYXNlZC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBleHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiB2b2lkIGV4cHJlc3Npb247XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihcclxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQsXHJcbik6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHZvaWQgMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKTtcclxuXHJcbiAgcmV0dXJuIGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiA/IGV4cHJlc3Npb24gOiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBhc3NlcnRpb24gaWRlbnRpZmllcnMuXHJcbiAqIEBwYXJhbSBzdGF0ZW1lbnQgSW5wdXQgc3RhdGVtZW50IHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldEFzc2VydGlvbklkZW50aWZpZXJzKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMoXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHsgYWN0dWFsOiB2b2lkIDAsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcbiAgY29uc3QgZXhwcmVzc2lvbiA9IHVud3JhcEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pO1xyXG4gIGlmIChleHByZXNzaW9uPy50eXBlICE9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiB7IGFjdHVhbDogdm9pZCAwLCBleHBlY3RlZDogdm9pZCAwIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBleHBlY3RPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIGlmIChleHBlY3RPcGVyYW5kcyAhPT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGV4cGVjdE9wZXJhbmRzLmFjdHVhbCksXHJcbiAgICAgIGV4cGVjdGVkOiBnZXRJZGVudGlmaWVyTmFtZShleHBlY3RPcGVyYW5kcy5leHBlY3RlZCksXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBhc3NlcnRPcGVyYW5kcyA9IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiB7XHJcbiAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5hY3R1YWwpLFxyXG4gICAgZXhwZWN0ZWQ6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5leHBlY3RlZCksXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYXNzZXJ0IG9wZXJhbmRzLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldEFzc2VydE9wZXJhbmRzKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5DYWxsRXhwcmVzc2lvbixcclxuKTogQXNzZXJ0aW9uT3BlcmFuZHMgfCB1bmRlZmluZWQge1xyXG4gIGlmIChcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdC5uYW1lID09PSBcImFzc2VydFwiXHJcbiAgKSB7XHJcbiAgICBjb25zdCBbYWN0dWFsLCBleHBlY3RlZF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcclxuICAgIGlmIChcclxuICAgICAgYWN0dWFsPy50eXBlICE9PSBcIlNwcmVhZEVsZW1lbnRcIiAmJlxyXG4gICAgICBleHBlY3RlZD8udHlwZSAhPT0gXCJTcHJlYWRFbGVtZW50XCJcclxuICAgICkge1xyXG4gICAgICByZXR1cm4geyBhY3R1YWwsIGV4cGVjdGVkIH07XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIGV4cGVjdCBvcGVyYW5kcy5cclxuICogQHBhcmFtIGV4cHJlc3Npb24gSW5wdXQgZXhwcmVzc2lvbiB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRFeHBlY3RPcGVyYW5kcyhleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRFeHBlY3RPcGVyYW5kcyhcclxuICBleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXHJcbik6IEFzc2VydGlvbk9wZXJhbmRzIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxyXG4gICAgZXhwcmVzc2lvbi5jYWxsZWUubmFtZSA9PT0gXCJleHBlY3RcIlxyXG4gICkge1xyXG4gICAgY29uc3QgW2FjdHVhbF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcclxuICAgIHJldHVybiBhY3R1YWw/LnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiXHJcbiAgICAgID8geyBhY3R1YWw6IHZvaWQgMCwgZXhwZWN0ZWQ6IHZvaWQgMCB9XHJcbiAgICAgIDogeyBhY3R1YWwsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcblxyXG4gIGlmIChcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiXHJcbiAgKSB7XHJcbiAgICBjb25zdCBuZXN0ZWRPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdCk7XHJcbiAgICBpZiAobmVzdGVkT3BlcmFuZHMgPT09IHZvaWQgMCkge1xyXG4gICAgICByZXR1cm4gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgW2V4cGVjdGVkXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xyXG4gICAgcmV0dXJuIGV4cGVjdGVkPy50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIlxyXG4gICAgICA/IG5lc3RlZE9wZXJhbmRzXHJcbiAgICAgIDogeyBhY3R1YWw6IG5lc3RlZE9wZXJhbmRzLmFjdHVhbCwgZXhwZWN0ZWQgfTtcclxuICB9XHJcbiAgcmV0dXJuIHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYW4gaWRlbnRpZmllciBuYW1lLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldElkZW50aWZpZXJOYW1lKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldElkZW50aWZpZXJOYW1lKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiBleHByZXNzaW9uPy50eXBlID09PSBcIklkZW50aWZpZXJcIiA/IGV4cHJlc3Npb24ubmFtZSA6IHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYSBzdGF0ZW1lbnQgZXhwcmVzc2lvbi5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFN0YXRlbWVudEV4cHJlc3Npb24oXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICBzdGF0ZW1lbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcclxuICAgIHN0YXRlbWVudC5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgKSB7XHJcbiAgICBjb25zdCBbZGVjbGFyYXRpb25dID0gc3RhdGVtZW50LmRlY2xhcmF0aW9ucztcclxuICAgIHJldHVybiBkZWNsYXJhdGlvbj8uaW5pdCBhcyBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYXNzZXJ0aW9ucy5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaGFzQXNzZXJ0aW9uKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaGFzQXNzZXJ0aW9uKHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCk6IGJvb2xlYW4ge1xyXG4gIGxldCBmb3VuZEFzc2VydGlvbiA9IGZhbHNlO1xyXG4gIHZpc2l0Tm9kZShzdGF0ZW1lbnQsIChub2RlKSA9PiB7XHJcbiAgICBpZiAobm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgaXNBc3NlcnRpb25DYWxsKG5vZGUpKSB7XHJcbiAgICAgIGZvdW5kQXNzZXJ0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZm91bmRBc3NlcnRpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciBhbiBhc3NlcnRpb24gZXZhbHVhdGVzIHRoZSBhY3R1YWwgb3BlcmFuZCBpbmxpbmUuXHJcbiAqIEBwYXJhbSBleHByZXNzaW9uIEFzc2VydGlvbiBjYWxsIGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gYWN0dWFsIG9wZXJhbmQgcGVyZm9ybXMgYWN0aW9uLWxpa2Ugd29yay5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBhY3R1YWwgPSBoYXNFdmFsdWF0ZWRBc3NlcnRpb25BY3R1YWwoZXhwcmVzc2lvbik7XHJcbiAqIHZvaWQgYWN0dWFsO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGhhc0V2YWx1YXRlZEFzc2VydGlvbkFjdHVhbChcclxuICBleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IG9wZXJhbmRzID1cclxuICAgIGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pID8/IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG5cclxuICByZXR1cm4gb3BlcmFuZHMgIT09IHZvaWQgMCAmJiBpc0FjdGlvbkV4cHJlc3Npb24ob3BlcmFuZHMuYWN0dWFsKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYWN0aW9uIGV4cHJlc3Npb25zLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGlzQWN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FjdGlvbkV4cHJlc3Npb24oXHJcbiAgZXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiAoXHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiIHx8XHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHxcclxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgPT09IFwiTmV3RXhwcmVzc2lvblwiXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYXNzZXJ0aW9uIGNhbGxzLlxyXG4gKiBAcGFyYW0gbm9kZSBJbnB1dCBub2RlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGlzQXNzZXJ0aW9uQ2FsbChub2RlKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Fzc2VydGlvbkNhbGwobm9kZTogRVNUcmVlLkNhbGxFeHByZXNzaW9uKTogYm9vbGVhbiB7XHJcbiAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jYWxsZWUubmFtZSA9PT0gXCJleHBlY3RcIiB8fCBub2RlLmNhbGxlZS5uYW1lID09PSBcImFzc2VydFwiO1xyXG4gIH1cclxuICBpZiAobm9kZS5jYWxsZWUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgaWYgKFxyXG4gICAgbm9kZS5jYWxsZWUub2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXHJcbiAgICBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gXCJhc3NlcnRcIlxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiAoXHJcbiAgICBub2RlLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiICYmXHJcbiAgICBpc0Fzc2VydGlvbkNhbGwobm9kZS5jYWxsZWUub2JqZWN0KVxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgQXNzZXJ0IHN0YXRlbWVudCB2YWxpZGl0eS5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaXNWYWxpZEFzc2VydFN0YXRlbWVudChzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQoc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XHJcbiAgaWYgKGhhc0Fzc2VydGlvbihzdGF0ZW1lbnQpKSB7XHJcbiAgICBjb25zdCBhc3NlcnRpb25FeHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIGFzc2VydGlvbkV4cHJlc3Npb24gPT09IHZvaWQgMCB8fFxyXG4gICAgICAhaGFzRXZhbHVhdGVkQXNzZXJ0aW9uQWN0dWFsKGFzc2VydGlvbkV4cHJlc3Npb24pXHJcbiAgICApO1xyXG4gIH1cclxuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gc3RhdGVtZW50LmRlY2xhcmF0aW9ucy5ldmVyeSgoZGVjbGFyYXRpb24pID0+IHtcclxuICAgIGlmIChkZWNsYXJhdGlvbi5pbml0ID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICFpc0FjdGlvbkV4cHJlc3Npb24odW53cmFwRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0KSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVbndyYXBzIG5lc3RlZCBleHByZXNzaW9ucy5cclxuICogQHBhcmFtIGV4cHJlc3Npb24gSW5wdXQgZXhwcmVzc2lvbiB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIHVud3JhcEV4cHJlc3Npb24oXHJcbiAgZXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXHJcbik6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoZXhwcmVzc2lvbj8udHlwZSA9PT0gXCJDaGFpbkV4cHJlc3Npb25cIikge1xyXG4gICAgcmV0dXJuIHVud3JhcEV4cHJlc3Npb24oZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcclxuICB9XHJcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQXdhaXRFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiBleHByZXNzaW9uLmFyZ3VtZW50O1xyXG4gIH1cclxuICByZXR1cm4gZXhwcmVzc2lvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBBQUEgbmFtaW5nIHByZWZpeGVzLlxyXG4gKiBAcGFyYW0gbmFtZSBJbnB1dCBuYW1lIHZhbHVlLlxyXG4gKiBAcGFyYW0gcHJlZml4IElucHV0IHByZWZpeCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiB1c2VzUHJlZml4KFwiYWN0dWFsUmVzdWx0XCIsIFwiYWN0dWFsXCIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIHVzZXNQcmVmaXgobmFtZTogc3RyaW5nLCBwcmVmaXg6IFwiYWN0dWFsXCIgfCBcImV4cGVjdGVkXCIpOiBib29sZWFuIHtcclxuICByZXR1cm4gbmFtZSA9PT0gcHJlZml4IHx8IG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMsXHJcbiAgZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMsXHJcbiAgZ2V0U3RhdGVtZW50RXhwcmVzc2lvbixcclxuICBoYXNBc3NlcnRpb24sXHJcbiAgaXNBY3Rpb25FeHByZXNzaW9uLFxyXG4gIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQsXHJcbiAgdW53cmFwRXhwcmVzc2lvbixcclxuICB1c2VzUHJlZml4LFxyXG59O1xyXG5leHBvcnQgdHlwZSB7IEFzc2VydGlvbklkZW50aWZpZXJzIH07XHJcbiJdfQ==
|
|
1
|
+
/** Companion module retained for companion-spec enforcement after wrapper export removal. */
|
|
2
|
+
const analyzerAssertionsModuleCompanion = void 0;
|
|
3
|
+
JSON.stringify(analyzerAssertionsModuleCompanion);
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9hYWEvYW5hbHl6ZXIuYXNzZXJ0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSw2RkFBNkY7QUFDN0YsTUFBTSxpQ0FBaUMsR0FBa0MsS0FBSyxDQUFDLENBQUM7QUFFaEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUZXN0QmxvY2tBbmFseXNpcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKiBDb21wYW5pb24gbW9kdWxlIHJldGFpbmVkIGZvciBjb21wYW5pb24tc3BlYyBlbmZvcmNlbWVudCBhZnRlciB3cmFwcGVyIGV4cG9ydCByZW1vdmFsLiAqL1xuY29uc3QgYW5hbHl6ZXJBc3NlcnRpb25zTW9kdWxlQ29tcGFuaW9uOiBUZXN0QmxvY2tBbmFseXNpcyB8IHVuZGVmaW5lZCA9IHZvaWQgMDtcblxuSlNPTi5zdHJpbmdpZnkoYW5hbHl6ZXJBc3NlcnRpb25zTW9kdWxlQ29tcGFuaW9uKTtcbiJdfQ==
|