@opensip-cli/fitness 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/baseline-plane.test.d.ts +12 -0
- package/dist/__tests__/baseline-plane.test.d.ts.map +1 -0
- package/dist/__tests__/baseline-plane.test.js +63 -0
- package/dist/__tests__/baseline-plane.test.js.map +1 -0
- package/dist/__tests__/check-utils.test.d.ts +10 -0
- package/dist/__tests__/check-utils.test.d.ts.map +1 -0
- package/dist/__tests__/check-utils.test.js +193 -0
- package/dist/__tests__/check-utils.test.js.map +1 -0
- package/dist/__tests__/fingerprint-parity.test.d.ts +14 -0
- package/dist/__tests__/fingerprint-parity.test.d.ts.map +1 -0
- package/dist/__tests__/fingerprint-parity.test.js +59 -0
- package/dist/__tests__/fingerprint-parity.test.js.map +1 -0
- package/dist/__tests__/fit-execute-opts.test.d.ts +15 -0
- package/dist/__tests__/fit-execute-opts.test.d.ts.map +1 -0
- package/dist/__tests__/fit-execute-opts.test.js +124 -0
- package/dist/__tests__/fit-execute-opts.test.js.map +1 -0
- package/dist/__tests__/public-api.test.d.ts +19 -0
- package/dist/__tests__/public-api.test.d.ts.map +1 -0
- package/dist/__tests__/public-api.test.js +85 -0
- package/dist/__tests__/public-api.test.js.map +1 -0
- package/dist/__tests__/tool.test.d.ts +10 -0
- package/dist/__tests__/tool.test.d.ts.map +1 -0
- package/dist/__tests__/tool.test.js +57 -0
- package/dist/__tests__/tool.test.js.map +1 -0
- package/dist/baseline-strategy.d.ts +21 -0
- package/dist/baseline-strategy.d.ts.map +1 -0
- package/dist/baseline-strategy.js +21 -0
- package/dist/baseline-strategy.js.map +1 -0
- package/dist/check-utils/display.d.ts +52 -0
- package/dist/check-utils/display.d.ts.map +1 -0
- package/dist/check-utils/display.js +66 -0
- package/dist/check-utils/display.js.map +1 -0
- package/dist/check-utils/index.d.ts +17 -0
- package/dist/check-utils/index.d.ts.map +1 -0
- package/dist/check-utils/index.js +13 -0
- package/dist/check-utils/index.js.map +1 -0
- package/dist/check-utils/path-matching.d.ts +40 -0
- package/dist/check-utils/path-matching.d.ts.map +1 -0
- package/dist/check-utils/path-matching.js +38 -0
- package/dist/check-utils/path-matching.js.map +1 -0
- package/dist/check-utils/source-analysis.d.ts +36 -0
- package/dist/check-utils/source-analysis.d.ts.map +1 -0
- package/dist/check-utils/source-analysis.js +44 -0
- package/dist/check-utils/source-analysis.js.map +1 -0
- package/dist/check-utils/test-helpers.d.ts +57 -0
- package/dist/check-utils/test-helpers.d.ts.map +1 -0
- package/dist/check-utils/test-helpers.js +71 -0
- package/dist/check-utils/test-helpers.js.map +1 -0
- package/dist/cli/__tests__/fit-gate-mode.test.d.ts +14 -0
- package/dist/cli/__tests__/fit-gate-mode.test.d.ts.map +1 -0
- package/dist/cli/__tests__/fit-gate-mode.test.js +110 -0
- package/dist/cli/__tests__/fit-gate-mode.test.js.map +1 -0
- package/dist/cli/__tests__/fit-modes-live.test.d.ts +13 -0
- package/dist/cli/__tests__/fit-modes-live.test.d.ts.map +1 -0
- package/dist/cli/__tests__/fit-modes-live.test.js +182 -0
- package/dist/cli/__tests__/fit-modes-live.test.js.map +1 -0
- package/dist/cli/__tests__/report-data.test.d.ts +12 -0
- package/dist/cli/__tests__/report-data.test.d.ts.map +1 -0
- package/dist/cli/__tests__/report-data.test.js +113 -0
- package/dist/cli/__tests__/report-data.test.js.map +1 -0
- package/dist/cli/fit/__tests__/display-fold.test.d.ts +8 -0
- package/dist/cli/fit/__tests__/display-fold.test.d.ts.map +1 -0
- package/dist/cli/fit/__tests__/display-fold.test.js +87 -0
- package/dist/cli/fit/__tests__/display-fold.test.js.map +1 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts +16 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts.map +1 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.js +62 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.js.map +1 -0
- package/dist/cli/fit/check-loader.d.ts +37 -0
- package/dist/cli/fit/check-loader.d.ts.map +1 -0
- package/dist/cli/fit/check-loader.js +154 -0
- package/dist/cli/fit/check-loader.js.map +1 -0
- package/dist/cli/fit/config-loader.d.ts +55 -0
- package/dist/cli/fit/config-loader.d.ts.map +1 -0
- package/dist/cli/fit/config-loader.js +107 -0
- package/dist/cli/fit/config-loader.js.map +1 -0
- package/dist/cli/fit/display-registry.d.ts +19 -0
- package/dist/cli/fit/display-registry.d.ts.map +1 -0
- package/dist/cli/fit/display-registry.js +33 -0
- package/dist/cli/fit/display-registry.js.map +1 -0
- package/dist/cli/fit/envelope-view.d.ts +49 -0
- package/dist/cli/fit/envelope-view.d.ts.map +1 -0
- package/dist/cli/fit/envelope-view.js +85 -0
- package/dist/cli/fit/envelope-view.js.map +1 -0
- package/dist/cli/fit/fit-aux-command-specs.d.ts +35 -0
- package/dist/cli/fit/fit-aux-command-specs.d.ts.map +1 -0
- package/dist/cli/fit/fit-aux-command-specs.js +110 -0
- package/dist/cli/fit/fit-aux-command-specs.js.map +1 -0
- package/dist/cli/fit/fit-command-spec.d.ts +24 -0
- package/dist/cli/fit/fit-command-spec.d.ts.map +1 -0
- package/dist/cli/fit/fit-command-spec.js +131 -0
- package/dist/cli/fit/fit-command-spec.js.map +1 -0
- package/dist/cli/fit/gate-compare-render.d.ts +13 -0
- package/dist/cli/fit/gate-compare-render.d.ts.map +1 -0
- package/dist/cli/fit/gate-compare-render.js +87 -0
- package/dist/cli/fit/gate-compare-render.js.map +1 -0
- package/dist/cli/fit/recipe-selector.d.ts +53 -0
- package/dist/cli/fit/recipe-selector.d.ts.map +1 -0
- package/dist/cli/fit/recipe-selector.js +106 -0
- package/dist/cli/fit/recipe-selector.js.map +1 -0
- package/dist/cli/fit/recipe-selector.test.d.ts +2 -0
- package/dist/cli/fit/recipe-selector.test.d.ts.map +1 -0
- package/dist/cli/fit/recipe-selector.test.js +69 -0
- package/dist/cli/fit/recipe-selector.test.js.map +1 -0
- package/dist/cli/fit/resolved-fitness-config.d.ts +48 -0
- package/dist/cli/fit/resolved-fitness-config.d.ts.map +1 -0
- package/dist/cli/fit/resolved-fitness-config.js +46 -0
- package/dist/cli/fit/resolved-fitness-config.js.map +1 -0
- package/dist/cli/fit/result-builders.d.ts +91 -0
- package/dist/cli/fit/result-builders.d.ts.map +1 -0
- package/dist/cli/fit/result-builders.js +206 -0
- package/dist/cli/fit/result-builders.js.map +1 -0
- package/dist/cli/fit-list.d.ts +7 -0
- package/dist/cli/fit-list.d.ts.map +1 -0
- package/dist/cli/fit-list.js +24 -0
- package/dist/cli/fit-list.js.map +1 -0
- package/dist/cli/fit-modes.d.ts +42 -0
- package/dist/cli/fit-modes.d.ts.map +1 -0
- package/dist/cli/fit-modes.js +322 -0
- package/dist/cli/fit-modes.js.map +1 -0
- package/dist/cli/fit-recipes.d.ts +7 -0
- package/dist/cli/fit-recipes.d.ts.map +1 -0
- package/dist/cli/fit-recipes.js +34 -0
- package/dist/cli/fit-recipes.js.map +1 -0
- package/dist/cli/fit-runner-views.d.ts +33 -0
- package/dist/cli/fit-runner-views.d.ts.map +1 -0
- package/dist/cli/fit-runner-views.js +92 -0
- package/dist/cli/fit-runner-views.js.map +1 -0
- package/dist/cli/fit-runner.d.ts +44 -0
- package/dist/cli/fit-runner.d.ts.map +1 -0
- package/dist/cli/fit-runner.js +250 -0
- package/dist/cli/fit-runner.js.map +1 -0
- package/dist/cli/fit-worker.d.ts +26 -0
- package/dist/cli/fit-worker.d.ts.map +1 -0
- package/dist/cli/fit-worker.js +67 -0
- package/dist/cli/fit-worker.js.map +1 -0
- package/dist/cli/fit.d.ts +74 -0
- package/dist/cli/fit.d.ts.map +1 -0
- package/dist/cli/fit.js +149 -0
- package/dist/cli/fit.js.map +1 -0
- package/dist/cli/report-data.d.ts +44 -0
- package/dist/cli/report-data.d.ts.map +1 -0
- package/dist/cli/report-data.js +89 -0
- package/dist/cli/report-data.js.map +1 -0
- package/dist/config/__tests__/fitness-config-schema.test.d.ts +6 -0
- package/dist/config/__tests__/fitness-config-schema.test.d.ts.map +1 -0
- package/dist/config/__tests__/fitness-config-schema.test.js +37 -0
- package/dist/config/__tests__/fitness-config-schema.test.js.map +1 -0
- package/dist/config/fitness-config-schema.d.ts +48 -0
- package/dist/config/fitness-config-schema.d.ts.map +1 -0
- package/dist/config/fitness-config-schema.js +62 -0
- package/dist/config/fitness-config-schema.js.map +1 -0
- package/dist/framework/__tests__/abortable-exec.test.d.ts +9 -0
- package/dist/framework/__tests__/abortable-exec.test.d.ts.map +1 -0
- package/dist/framework/__tests__/abortable-exec.test.js +102 -0
- package/dist/framework/__tests__/abortable-exec.test.js.map +1 -0
- package/dist/framework/__tests__/check-config.test.d.ts +2 -0
- package/dist/framework/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/framework/__tests__/check-config.test.js +56 -0
- package/dist/framework/__tests__/check-config.test.js.map +1 -0
- package/dist/framework/__tests__/check-types.test.d.ts +2 -0
- package/dist/framework/__tests__/check-types.test.d.ts.map +1 -0
- package/dist/framework/__tests__/check-types.test.js +76 -0
- package/dist/framework/__tests__/check-types.test.js.map +1 -0
- package/dist/framework/__tests__/command-executor.test.d.ts +2 -0
- package/dist/framework/__tests__/command-executor.test.d.ts.map +1 -0
- package/dist/framework/__tests__/command-executor.test.js +110 -0
- package/dist/framework/__tests__/command-executor.test.js.map +1 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.d.ts +2 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.js +122 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.js.map +1 -0
- package/dist/framework/__tests__/define-check.test.d.ts +2 -0
- package/dist/framework/__tests__/define-check.test.d.ts.map +1 -0
- package/dist/framework/__tests__/define-check.test.js +402 -0
- package/dist/framework/__tests__/define-check.test.js.map +1 -0
- package/dist/framework/__tests__/define-regex-list-check.test.d.ts +15 -0
- package/dist/framework/__tests__/define-regex-list-check.test.d.ts.map +1 -0
- package/dist/framework/__tests__/define-regex-list-check.test.js +299 -0
- package/dist/framework/__tests__/define-regex-list-check.test.js.map +1 -0
- package/dist/framework/__tests__/directive-inventory.test.d.ts +2 -0
- package/dist/framework/__tests__/directive-inventory.test.d.ts.map +1 -0
- package/dist/framework/__tests__/directive-inventory.test.js +111 -0
- package/dist/framework/__tests__/directive-inventory.test.js.map +1 -0
- package/dist/framework/__tests__/directive-parsing.test.d.ts +13 -0
- package/dist/framework/__tests__/directive-parsing.test.d.ts.map +1 -0
- package/dist/framework/__tests__/directive-parsing.test.js +86 -0
- package/dist/framework/__tests__/directive-parsing.test.js.map +1 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts +2 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts.map +1 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.js +56 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.js.map +1 -0
- package/dist/framework/__tests__/execution-context.test.d.ts +2 -0
- package/dist/framework/__tests__/execution-context.test.d.ts.map +1 -0
- package/dist/framework/__tests__/execution-context.test.js +140 -0
- package/dist/framework/__tests__/execution-context.test.js.map +1 -0
- package/dist/framework/__tests__/file-accessor.test.d.ts +2 -0
- package/dist/framework/__tests__/file-accessor.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-accessor.test.js +106 -0
- package/dist/framework/__tests__/file-accessor.test.js.map +1 -0
- package/dist/framework/__tests__/file-cache.test.d.ts +2 -0
- package/dist/framework/__tests__/file-cache.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-cache.test.js +122 -0
- package/dist/framework/__tests__/file-cache.test.js.map +1 -0
- package/dist/framework/__tests__/file-type-filter.test.d.ts +9 -0
- package/dist/framework/__tests__/file-type-filter.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-type-filter.test.js +39 -0
- package/dist/framework/__tests__/file-type-filter.test.js.map +1 -0
- package/dist/framework/__tests__/ignore-processing.test.d.ts +11 -0
- package/dist/framework/__tests__/ignore-processing.test.d.ts.map +1 -0
- package/dist/framework/__tests__/ignore-processing.test.js +175 -0
- package/dist/framework/__tests__/ignore-processing.test.js.map +1 -0
- package/dist/framework/__tests__/import-graph.test.d.ts +15 -0
- package/dist/framework/__tests__/import-graph.test.d.ts.map +1 -0
- package/dist/framework/__tests__/import-graph.test.js +164 -0
- package/dist/framework/__tests__/import-graph.test.js.map +1 -0
- package/dist/framework/__tests__/memory-profiler.test.d.ts +9 -0
- package/dist/framework/__tests__/memory-profiler.test.d.ts.map +1 -0
- package/dist/framework/__tests__/memory-profiler.test.js +108 -0
- package/dist/framework/__tests__/memory-profiler.test.js.map +1 -0
- package/dist/framework/__tests__/parse-cache.test.d.ts +9 -0
- package/dist/framework/__tests__/parse-cache.test.d.ts.map +1 -0
- package/dist/framework/__tests__/parse-cache.test.js +51 -0
- package/dist/framework/__tests__/parse-cache.test.js.map +1 -0
- package/dist/framework/__tests__/path-matcher.test.d.ts +2 -0
- package/dist/framework/__tests__/path-matcher.test.d.ts.map +1 -0
- package/dist/framework/__tests__/path-matcher.test.js +113 -0
- package/dist/framework/__tests__/path-matcher.test.js.map +1 -0
- package/dist/framework/__tests__/register-helpers.test.d.ts +2 -0
- package/dist/framework/__tests__/register-helpers.test.d.ts.map +1 -0
- package/dist/framework/__tests__/register-helpers.test.js +51 -0
- package/dist/framework/__tests__/register-helpers.test.js.map +1 -0
- package/dist/framework/__tests__/registry.test.d.ts +2 -0
- package/dist/framework/__tests__/registry.test.d.ts.map +1 -0
- package/dist/framework/__tests__/registry.test.js +211 -0
- package/dist/framework/__tests__/registry.test.js.map +1 -0
- package/dist/framework/__tests__/result-builder.test.d.ts +2 -0
- package/dist/framework/__tests__/result-builder.test.d.ts.map +1 -0
- package/dist/framework/__tests__/result-builder.test.js +153 -0
- package/dist/framework/__tests__/result-builder.test.js.map +1 -0
- package/dist/framework/__tests__/scope-registry.test.d.ts +8 -0
- package/dist/framework/__tests__/scope-registry.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-registry.test.js +156 -0
- package/dist/framework/__tests__/scope-registry.test.js.map +1 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.d.ts +2 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.js +105 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.js.map +1 -0
- package/dist/framework/__tests__/scope-resolver.test.d.ts +2 -0
- package/dist/framework/__tests__/scope-resolver.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-resolver.test.js +150 -0
- package/dist/framework/__tests__/scope-resolver.test.js.map +1 -0
- package/dist/framework/__tests__/severity-mapping.test.d.ts +2 -0
- package/dist/framework/__tests__/severity-mapping.test.d.ts.map +1 -0
- package/dist/framework/__tests__/severity-mapping.test.js +74 -0
- package/dist/framework/__tests__/severity-mapping.test.js.map +1 -0
- package/dist/framework/__tests__/strip-literals.test.d.ts +2 -0
- package/dist/framework/__tests__/strip-literals.test.d.ts.map +1 -0
- package/dist/framework/__tests__/strip-literals.test.js +87 -0
- package/dist/framework/__tests__/strip-literals.test.js.map +1 -0
- package/dist/framework/abortable-exec.d.ts +34 -0
- package/dist/framework/abortable-exec.d.ts.map +1 -0
- package/dist/framework/abortable-exec.js +143 -0
- package/dist/framework/abortable-exec.js.map +1 -0
- package/dist/framework/check-config.d.ts +175 -0
- package/dist/framework/check-config.d.ts.map +1 -0
- package/dist/framework/check-config.js +115 -0
- package/dist/framework/check-config.js.map +1 -0
- package/dist/framework/check-types.d.ts +82 -0
- package/dist/framework/check-types.d.ts.map +1 -0
- package/dist/framework/check-types.js +63 -0
- package/dist/framework/check-types.js.map +1 -0
- package/dist/framework/command-executor.d.ts +25 -0
- package/dist/framework/command-executor.d.ts.map +1 -0
- package/dist/framework/command-executor.js +63 -0
- package/dist/framework/command-executor.js.map +1 -0
- package/dist/framework/comment-openers.d.ts +11 -0
- package/dist/framework/comment-openers.d.ts.map +1 -0
- package/dist/framework/comment-openers.js +11 -0
- package/dist/framework/comment-openers.js.map +1 -0
- package/dist/framework/constants.d.ts +9 -0
- package/dist/framework/constants.d.ts.map +1 -0
- package/dist/framework/constants.js +16 -0
- package/dist/framework/constants.js.map +1 -0
- package/dist/framework/define-check.d.ts +38 -0
- package/dist/framework/define-check.d.ts.map +1 -0
- package/dist/framework/define-check.js +296 -0
- package/dist/framework/define-check.js.map +1 -0
- package/dist/framework/define-regex-list-check.d.ts +160 -0
- package/dist/framework/define-regex-list-check.d.ts.map +1 -0
- package/dist/framework/define-regex-list-check.js +177 -0
- package/dist/framework/define-regex-list-check.js.map +1 -0
- package/dist/framework/directive-inventory.d.ts +37 -0
- package/dist/framework/directive-inventory.d.ts.map +1 -0
- package/dist/framework/directive-inventory.js +82 -0
- package/dist/framework/directive-inventory.js.map +1 -0
- package/dist/framework/directive-parsing.d.ts +23 -0
- package/dist/framework/directive-parsing.d.ts.map +1 -0
- package/dist/framework/directive-parsing.js +39 -0
- package/dist/framework/directive-parsing.js.map +1 -0
- package/dist/framework/execution-context.d.ts +98 -0
- package/dist/framework/execution-context.d.ts.map +1 -0
- package/dist/framework/execution-context.js +145 -0
- package/dist/framework/execution-context.js.map +1 -0
- package/dist/framework/file-accessor.d.ts +20 -0
- package/dist/framework/file-accessor.d.ts.map +1 -0
- package/dist/framework/file-accessor.js +122 -0
- package/dist/framework/file-accessor.js.map +1 -0
- package/dist/framework/file-cache.d.ts +70 -0
- package/dist/framework/file-cache.d.ts.map +1 -0
- package/dist/framework/file-cache.js +199 -0
- package/dist/framework/file-cache.js.map +1 -0
- package/dist/framework/file-type-filter.d.ts +11 -0
- package/dist/framework/file-type-filter.d.ts.map +1 -0
- package/dist/framework/file-type-filter.js +21 -0
- package/dist/framework/file-type-filter.js.map +1 -0
- package/dist/framework/ignore-processing.d.ts +36 -0
- package/dist/framework/ignore-processing.d.ts.map +1 -0
- package/dist/framework/ignore-processing.js +172 -0
- package/dist/framework/ignore-processing.js.map +1 -0
- package/dist/framework/import-graph.d.ts +51 -0
- package/dist/framework/import-graph.d.ts.map +1 -0
- package/dist/framework/import-graph.js +217 -0
- package/dist/framework/import-graph.js.map +1 -0
- package/dist/framework/memory-profiler.d.ts +53 -0
- package/dist/framework/memory-profiler.d.ts.map +1 -0
- package/dist/framework/memory-profiler.js +92 -0
- package/dist/framework/memory-profiler.js.map +1 -0
- package/dist/framework/parse-cache.d.ts +24 -0
- package/dist/framework/parse-cache.d.ts.map +1 -0
- package/dist/framework/parse-cache.js +41 -0
- package/dist/framework/parse-cache.js.map +1 -0
- package/dist/framework/path-matcher.d.ts +86 -0
- package/dist/framework/path-matcher.d.ts.map +1 -0
- package/dist/framework/path-matcher.js +138 -0
- package/dist/framework/path-matcher.js.map +1 -0
- package/dist/framework/register-helpers.d.ts +11 -0
- package/dist/framework/register-helpers.d.ts.map +1 -0
- package/dist/framework/register-helpers.js +19 -0
- package/dist/framework/register-helpers.js.map +1 -0
- package/dist/framework/registry.d.ts +51 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +131 -0
- package/dist/framework/registry.js.map +1 -0
- package/dist/framework/result-builder.d.ts +74 -0
- package/dist/framework/result-builder.d.ts.map +1 -0
- package/dist/framework/result-builder.js +154 -0
- package/dist/framework/result-builder.js.map +1 -0
- package/dist/framework/scope-registry.d.ts +38 -0
- package/dist/framework/scope-registry.d.ts.map +1 -0
- package/dist/framework/scope-registry.js +77 -0
- package/dist/framework/scope-registry.js.map +1 -0
- package/dist/framework/scope-resolver.d.ts +23 -0
- package/dist/framework/scope-resolver.d.ts.map +1 -0
- package/dist/framework/scope-resolver.js +102 -0
- package/dist/framework/scope-resolver.js.map +1 -0
- package/dist/framework/severity-mapping.d.ts +17 -0
- package/dist/framework/severity-mapping.d.ts.map +1 -0
- package/dist/framework/severity-mapping.js +71 -0
- package/dist/framework/severity-mapping.js.map +1 -0
- package/dist/framework/strip-literals.d.ts +73 -0
- package/dist/framework/strip-literals.d.ts.map +1 -0
- package/dist/framework/strip-literals.js +213 -0
- package/dist/framework/strip-literals.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +17 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +17 -0
- package/dist/internal.js.map +1 -0
- package/dist/persistence/session-payload.d.ts +68 -0
- package/dist/persistence/session-payload.d.ts.map +1 -0
- package/dist/persistence/session-payload.js +78 -0
- package/dist/persistence/session-payload.js.map +1 -0
- package/dist/persistence/session-payload.test.d.ts +11 -0
- package/dist/persistence/session-payload.test.d.ts.map +1 -0
- package/dist/persistence/session-payload.test.js +80 -0
- package/dist/persistence/session-payload.test.js.map +1 -0
- package/dist/persistence/session-replay.d.ts +14 -0
- package/dist/persistence/session-replay.d.ts.map +1 -0
- package/dist/persistence/session-replay.js +85 -0
- package/dist/persistence/session-replay.js.map +1 -0
- package/dist/persistence/session-replay.test.d.ts +10 -0
- package/dist/persistence/session-replay.test.d.ts.map +1 -0
- package/dist/persistence/session-replay.test.js +171 -0
- package/dist/persistence/session-replay.test.js.map +1 -0
- package/dist/plugins/__tests__/check-package-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/check-package-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/check-package-discovery.test.js +48 -0
- package/dist/plugins/__tests__/check-package-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/lang-domain.test.d.ts +2 -0
- package/dist/plugins/__tests__/lang-domain.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/lang-domain.test.js +192 -0
- package/dist/plugins/__tests__/lang-domain.test.js.map +1 -0
- package/dist/plugins/__tests__/loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/loader.test.js +271 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/check-package-discovery.d.ts +19 -0
- package/dist/plugins/check-package-discovery.d.ts.map +1 -0
- package/dist/plugins/check-package-discovery.js +34 -0
- package/dist/plugins/check-package-discovery.js.map +1 -0
- package/dist/plugins/loader.d.ts +32 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +198 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +29 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +9 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts +2 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js +93 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js.map +1 -0
- package/dist/recipes/__tests__/check-config.test.d.ts +12 -0
- package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-config.test.js +90 -0
- package/dist/recipes/__tests__/check-config.test.js.map +1 -0
- package/dist/recipes/__tests__/check-resolution.test.d.ts +2 -0
- package/dist/recipes/__tests__/check-resolution.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-resolution.test.js +160 -0
- package/dist/recipes/__tests__/check-resolution.test.js.map +1 -0
- package/dist/recipes/__tests__/execution-branches.test.d.ts +10 -0
- package/dist/recipes/__tests__/execution-branches.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/execution-branches.test.js +612 -0
- package/dist/recipes/__tests__/execution-branches.test.js.map +1 -0
- package/dist/recipes/__tests__/execution-paths.test.d.ts +10 -0
- package/dist/recipes/__tests__/execution-paths.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/execution-paths.test.js +280 -0
- package/dist/recipes/__tests__/execution-paths.test.js.map +1 -0
- package/dist/recipes/__tests__/registry.test.d.ts +2 -0
- package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/registry.test.js +89 -0
- package/dist/recipes/__tests__/registry.test.js.map +1 -0
- package/dist/recipes/__tests__/retry.test.d.ts +2 -0
- package/dist/recipes/__tests__/retry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/retry.test.js +75 -0
- package/dist/recipes/__tests__/retry.test.js.map +1 -0
- package/dist/recipes/__tests__/run-one-check.test.d.ts +14 -0
- package/dist/recipes/__tests__/run-one-check.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/run-one-check.test.js +182 -0
- package/dist/recipes/__tests__/run-one-check.test.js.map +1 -0
- package/dist/recipes/__tests__/service.test.d.ts +11 -0
- package/dist/recipes/__tests__/service.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/service.test.js +572 -0
- package/dist/recipes/__tests__/service.test.js.map +1 -0
- package/dist/recipes/built-in-recipes.d.ts +14 -0
- package/dist/recipes/built-in-recipes.d.ts.map +1 -0
- package/dist/recipes/built-in-recipes.js +241 -0
- package/dist/recipes/built-in-recipes.js.map +1 -0
- package/dist/recipes/check-config.d.ts +56 -0
- package/dist/recipes/check-config.d.ts.map +1 -0
- package/dist/recipes/check-config.js +61 -0
- package/dist/recipes/check-config.js.map +1 -0
- package/dist/recipes/check-resolution.d.ts +36 -0
- package/dist/recipes/check-resolution.d.ts.map +1 -0
- package/dist/recipes/check-resolution.js +81 -0
- package/dist/recipes/check-resolution.js.map +1 -0
- package/dist/recipes/check-result-processor.d.ts +51 -0
- package/dist/recipes/check-result-processor.d.ts.map +1 -0
- package/dist/recipes/check-result-processor.js +197 -0
- package/dist/recipes/check-result-processor.js.map +1 -0
- package/dist/recipes/parallel-execution.d.ts +38 -0
- package/dist/recipes/parallel-execution.d.ts.map +1 -0
- package/dist/recipes/parallel-execution.js +61 -0
- package/dist/recipes/parallel-execution.js.map +1 -0
- package/dist/recipes/registry.d.ts +47 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +70 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/retry.d.ts +29 -0
- package/dist/recipes/retry.d.ts.map +1 -0
- package/dist/recipes/retry.js +23 -0
- package/dist/recipes/retry.js.map +1 -0
- package/dist/recipes/run-one-check.d.ts +59 -0
- package/dist/recipes/run-one-check.d.ts.map +1 -0
- package/dist/recipes/run-one-check.js +174 -0
- package/dist/recipes/run-one-check.js.map +1 -0
- package/dist/recipes/sequential-execution.d.ts +12 -0
- package/dist/recipes/sequential-execution.d.ts.map +1 -0
- package/dist/recipes/sequential-execution.js +48 -0
- package/dist/recipes/sequential-execution.js.map +1 -0
- package/dist/recipes/service-types.d.ts +87 -0
- package/dist/recipes/service-types.d.ts.map +1 -0
- package/dist/recipes/service-types.js +8 -0
- package/dist/recipes/service-types.js.map +1 -0
- package/dist/recipes/service.d.ts +73 -0
- package/dist/recipes/service.d.ts.map +1 -0
- package/dist/recipes/service.js +438 -0
- package/dist/recipes/service.js.map +1 -0
- package/dist/recipes/types.d.ts +155 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +56 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/scaffold/config-block.d.ts +17 -0
- package/dist/scaffold/config-block.d.ts.map +1 -0
- package/dist/scaffold/config-block.js +30 -0
- package/dist/scaffold/config-block.js.map +1 -0
- package/dist/scaffold/examples.d.ts +30 -0
- package/dist/scaffold/examples.d.ts.map +1 -0
- package/dist/scaffold/examples.js +129 -0
- package/dist/scaffold/examples.js.map +1 -0
- package/dist/scope-augmentation.d.ts +77 -0
- package/dist/scope-augmentation.d.ts.map +1 -0
- package/dist/scope-augmentation.js +31 -0
- package/dist/scope-augmentation.js.map +1 -0
- package/dist/signalers/__tests__/loader.test.d.ts +2 -0
- package/dist/signalers/__tests__/loader.test.d.ts.map +1 -0
- package/dist/signalers/__tests__/loader.test.js +141 -0
- package/dist/signalers/__tests__/loader.test.js.map +1 -0
- package/dist/signalers/__tests__/violation-to-signal.test.d.ts +2 -0
- package/dist/signalers/__tests__/violation-to-signal.test.d.ts.map +1 -0
- package/dist/signalers/__tests__/violation-to-signal.test.js +59 -0
- package/dist/signalers/__tests__/violation-to-signal.test.js.map +1 -0
- package/dist/signalers/index.d.ts +8 -0
- package/dist/signalers/index.d.ts.map +1 -0
- package/dist/signalers/index.js +9 -0
- package/dist/signalers/index.js.map +1 -0
- package/dist/signalers/loader.d.ts +30 -0
- package/dist/signalers/loader.d.ts.map +1 -0
- package/dist/signalers/loader.js +120 -0
- package/dist/signalers/loader.js.map +1 -0
- package/dist/signalers/schema.d.ts +60 -0
- package/dist/signalers/schema.d.ts.map +1 -0
- package/dist/signalers/schema.js +74 -0
- package/dist/signalers/schema.js.map +1 -0
- package/dist/signalers/types.d.ts +13 -0
- package/dist/signalers/types.d.ts.map +1 -0
- package/dist/signalers/types.js +5 -0
- package/dist/signalers/types.js.map +1 -0
- package/dist/signalers/violation-to-signal.d.ts +38 -0
- package/dist/signalers/violation-to-signal.d.ts.map +1 -0
- package/dist/signalers/violation-to-signal.js +43 -0
- package/dist/signalers/violation-to-signal.js.map +1 -0
- package/dist/targets/__tests__/loader.test.d.ts +2 -0
- package/dist/targets/__tests__/loader.test.d.ts.map +1 -0
- package/dist/targets/__tests__/loader.test.js +190 -0
- package/dist/targets/__tests__/loader.test.js.map +1 -0
- package/dist/targets/__tests__/target-registry.test.d.ts +2 -0
- package/dist/targets/__tests__/target-registry.test.d.ts.map +1 -0
- package/dist/targets/__tests__/target-registry.test.js +182 -0
- package/dist/targets/__tests__/target-registry.test.js.map +1 -0
- package/dist/targets/index.d.ts +18 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +21 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/loader.d.ts +27 -0
- package/dist/targets/loader.d.ts.map +1 -0
- package/dist/targets/loader.js +178 -0
- package/dist/targets/loader.js.map +1 -0
- package/dist/targets/target-registry.d.ts +41 -0
- package/dist/targets/target-registry.d.ts.map +1 -0
- package/dist/targets/target-registry.js +71 -0
- package/dist/targets/target-registry.js.map +1 -0
- package/dist/targets/types.d.ts +14 -0
- package/dist/targets/types.d.ts.map +1 -0
- package/dist/targets/types.js +14 -0
- package/dist/targets/types.js.map +1 -0
- package/dist/tool.d.ts +61 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +260 -0
- package/dist/tool.js.map +1 -0
- package/dist/types/findings.d.ts +113 -0
- package/dist/types/findings.d.ts.map +1 -0
- package/dist/types/findings.js +89 -0
- package/dist/types/findings.js.map +1 -0
- package/dist/types/severity.d.ts +15 -0
- package/dist/types/severity.d.ts.map +1 -0
- package/dist/types/severity.js +33 -0
- package/dist/types/severity.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// @fitness-ignore-file public-api-jsdoc -- internal framework module; public API documented at package level
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview In-memory file cache for fitness checks
|
|
4
|
+
*
|
|
5
|
+
* Simple file content cache with optional prewarming.
|
|
6
|
+
* Used by all checks during a run for efficient file access.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs/promises';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { SystemError, ValidationError } from '@opensip-cli/core';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
/**
|
|
13
|
+
* Simple in-memory file cache.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* 1. Call prewarm() before running checks (loads file contents)
|
|
17
|
+
* 2. Use get() to read file contents (falls back to disk if not cached)
|
|
18
|
+
* 3. Call clear() after checks complete
|
|
19
|
+
*/
|
|
20
|
+
const PREWARM_BATCH_SIZE = 100;
|
|
21
|
+
export class FileCache {
|
|
22
|
+
cache = new Map();
|
|
23
|
+
_prewarmed = false;
|
|
24
|
+
_cleared = false;
|
|
25
|
+
_autoClearTimer = null;
|
|
26
|
+
/**
|
|
27
|
+
* Prewarm the cache by loading all files matching patterns.
|
|
28
|
+
* @param cwd - Working directory for file resolution
|
|
29
|
+
* @param patterns - Glob patterns to prewarm file contents for
|
|
30
|
+
* @returns Prewarm statistics
|
|
31
|
+
*/
|
|
32
|
+
async prewarm(cwd, patterns) {
|
|
33
|
+
const start = Date.now();
|
|
34
|
+
let totalBytes = 0;
|
|
35
|
+
// Find all matching files for content caching
|
|
36
|
+
const allFiles = new Set();
|
|
37
|
+
for (const pattern of patterns) {
|
|
38
|
+
// @fitness-ignore-next-line performance-anti-patterns -- sequential glob calls: each pattern must resolve before deduplication
|
|
39
|
+
const files = await glob(pattern, {
|
|
40
|
+
cwd,
|
|
41
|
+
absolute: true,
|
|
42
|
+
nodir: true,
|
|
43
|
+
ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**'],
|
|
44
|
+
});
|
|
45
|
+
for (const file of files) {
|
|
46
|
+
allFiles.add(file);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Load file contents in parallel batches
|
|
50
|
+
const files = [...allFiles];
|
|
51
|
+
for (let i = 0; i < files.length; i += PREWARM_BATCH_SIZE) {
|
|
52
|
+
const batch = files.slice(i, i + PREWARM_BATCH_SIZE);
|
|
53
|
+
// @fitness-ignore-next-line performance-anti-patterns -- intentional batching: limits concurrent file reads to control memory pressure
|
|
54
|
+
const results = await Promise.allSettled(batch.map(async (filePath) => {
|
|
55
|
+
const stats = await fs.stat(filePath);
|
|
56
|
+
if (stats.isDirectory()) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
60
|
+
return { filePath, content };
|
|
61
|
+
}));
|
|
62
|
+
for (const result of results) {
|
|
63
|
+
if (result.status === 'fulfilled' && result.value !== null) {
|
|
64
|
+
const { filePath, content } = result.value;
|
|
65
|
+
// Enforce the same 10 MiB per-file limit that ExecutionContext.readFile
|
|
66
|
+
// guarantees to checks. Huge files are skipped during prewarm (they will
|
|
67
|
+
// still fail loudly with a clear error if a check later tries to read them
|
|
68
|
+
// explicitly). This keeps the cache from holding data that no check is
|
|
69
|
+
// allowed to consume.
|
|
70
|
+
if (content.length > 10_000_000) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
this.cache.set(filePath, content);
|
|
74
|
+
totalBytes += content.length;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this._prewarmed = true;
|
|
79
|
+
this._cleared = false;
|
|
80
|
+
this.scheduleAutoClear();
|
|
81
|
+
const durationMs = Date.now() - start;
|
|
82
|
+
return {
|
|
83
|
+
filesLoaded: this.cache.size,
|
|
84
|
+
durationMs,
|
|
85
|
+
totalBytes,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get file content from cache, falling back to disk if not cached.
|
|
90
|
+
* @throws {Error} If the path is a directory instead of a file
|
|
91
|
+
*/
|
|
92
|
+
/** Synchronously check if a file is in cache. Returns content or undefined. */
|
|
93
|
+
getCached(filePath) {
|
|
94
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
|
|
95
|
+
return this.cache.get(absolutePath);
|
|
96
|
+
}
|
|
97
|
+
async get(filePath) {
|
|
98
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
|
|
99
|
+
const cached = this.cache.get(absolutePath);
|
|
100
|
+
if (cached !== undefined) {
|
|
101
|
+
return cached;
|
|
102
|
+
}
|
|
103
|
+
const stats = await fs.stat(absolutePath);
|
|
104
|
+
if (stats.isDirectory()) {
|
|
105
|
+
// @fitness-ignore-next-line result-pattern-consistency -- internal method, exceptions propagate to public Result boundary
|
|
106
|
+
throw new ValidationError(`Cannot read directory as file: ${absolutePath}`, {
|
|
107
|
+
code: 'VALIDATION.FITNESS.DIRECTORY_AS_FILE',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const content = await fs.readFile(absolutePath, 'utf8');
|
|
111
|
+
if (content.length > 10_000_000) {
|
|
112
|
+
// Consistent with ExecutionContext.readFile and prewarm: never surface
|
|
113
|
+
// >10 MiB of content to a check. Throw here so even direct cache.get
|
|
114
|
+
// callers (and any future direct users of fileCache) are protected.
|
|
115
|
+
throw new SystemError(`File too large (${content.length} bytes, max 10MB): ${absolutePath}`, {
|
|
116
|
+
code: 'SYSTEM.FITNESS.FILE_TOO_LARGE',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
this.cache.set(absolutePath, content);
|
|
120
|
+
return content;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a file exists (in cache or on disk).
|
|
124
|
+
*/
|
|
125
|
+
async exists(filePath) {
|
|
126
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
|
|
127
|
+
if (this.cache.has(absolutePath)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
await fs.access(absolutePath);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// @swallow-ok File access check failed — treat as not accessible
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Clear the cache. Must be called after checks complete.
|
|
141
|
+
*/
|
|
142
|
+
clear() {
|
|
143
|
+
this.cache.clear();
|
|
144
|
+
this._prewarmed = false;
|
|
145
|
+
this._cleared = true;
|
|
146
|
+
if (this._autoClearTimer) {
|
|
147
|
+
clearTimeout(this._autoClearTimer);
|
|
148
|
+
this._autoClearTimer = null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get all cached file paths.
|
|
153
|
+
* Returns the paths of all files loaded during prewarm or on-demand reads.
|
|
154
|
+
*/
|
|
155
|
+
paths() {
|
|
156
|
+
return [...this.cache.keys()].sort();
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get cache statistics.
|
|
160
|
+
*/
|
|
161
|
+
/** Auto-clear after timeout to prevent memory leaks from missed lifecycle cleanup */
|
|
162
|
+
scheduleAutoClear() {
|
|
163
|
+
if (this._autoClearTimer) {
|
|
164
|
+
clearTimeout(this._autoClearTimer);
|
|
165
|
+
}
|
|
166
|
+
this._autoClearTimer = setTimeout(() => {
|
|
167
|
+
/* v8 ignore start -- 10-minute auto-clear timer; not exercised in unit tests */
|
|
168
|
+
if (this.cache.size > 0) {
|
|
169
|
+
this.clear();
|
|
170
|
+
}
|
|
171
|
+
/* v8 ignore stop */
|
|
172
|
+
}, 10 * 60 * 1000); // 10 minutes
|
|
173
|
+
// Unref so the timer doesn't keep the process alive
|
|
174
|
+
this._autoClearTimer.unref();
|
|
175
|
+
}
|
|
176
|
+
get stats() {
|
|
177
|
+
return {
|
|
178
|
+
size: this.cache.size,
|
|
179
|
+
prewarmed: this._prewarmed,
|
|
180
|
+
cleared: this._cleared,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Shared file cache instance.
|
|
186
|
+
*/
|
|
187
|
+
export const fileCache = new FileCache();
|
|
188
|
+
/**
|
|
189
|
+
* Default patterns to prewarm for fitness checks.
|
|
190
|
+
*/
|
|
191
|
+
export const DEFAULT_PREWARM_PATTERNS = [
|
|
192
|
+
'**/*.ts',
|
|
193
|
+
'**/*.tsx',
|
|
194
|
+
'**/*.js',
|
|
195
|
+
'**/*.jsx',
|
|
196
|
+
'**/*.json',
|
|
197
|
+
'**/*.md',
|
|
198
|
+
];
|
|
199
|
+
//# sourceMappingURL=file-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../src/framework/file-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview File type filtering for per-check file extension matching
|
|
3
|
+
*
|
|
4
|
+
* Filters matched files by extension based on a check's declared fileTypes.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Filter files by extension based on a check's declared fileTypes.
|
|
8
|
+
* If fileTypes is undefined or empty, returns all files (universal).
|
|
9
|
+
*/
|
|
10
|
+
export declare function filterFilesByType(files: readonly string[], fileTypes: readonly string[] | undefined): string[];
|
|
11
|
+
//# sourceMappingURL=file-type-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-type-filter.d.ts","sourceRoot":"","sources":["../../src/framework/file-type-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACvC,MAAM,EAAE,CASV"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview File type filtering for per-check file extension matching
|
|
3
|
+
*
|
|
4
|
+
* Filters matched files by extension based on a check's declared fileTypes.
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Filter files by extension based on a check's declared fileTypes.
|
|
9
|
+
* If fileTypes is undefined or empty, returns all files (universal).
|
|
10
|
+
*/
|
|
11
|
+
export function filterFilesByType(files, fileTypes) {
|
|
12
|
+
if (!fileTypes || fileTypes.length === 0) {
|
|
13
|
+
return [...files];
|
|
14
|
+
}
|
|
15
|
+
const extensions = new Set(fileTypes);
|
|
16
|
+
return files.filter((f) => {
|
|
17
|
+
const ext = path.extname(f).slice(1); // remove leading dot
|
|
18
|
+
return extensions.has(ext);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=file-type-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-type-filter.js","sourceRoot":"","sources":["../../src/framework/file-type-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAwB,EACxB,SAAwC;IAExC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAC3D,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Ignore directive processing for fitness checks
|
|
3
|
+
*
|
|
4
|
+
* Filters signals via the shared core suppression primitive (ADR-0014), then
|
|
5
|
+
* builds fitness-specific outputs on top: the `ignoredCount`, the
|
|
6
|
+
* `DirectiveEntry` audit list (with weak-reason classification), and the
|
|
7
|
+
* rebuilt `CheckResult`. The matching algorithm (file/line directives,
|
|
8
|
+
* anti-recursion: a finding pointing at a directive line is never suppressed)
|
|
9
|
+
* lives once in `@opensip-cli/core`.
|
|
10
|
+
*/
|
|
11
|
+
import type { DirectiveEntry } from './directive-inventory.js';
|
|
12
|
+
import type { CheckResult } from '../types/findings.js';
|
|
13
|
+
import type { Signal } from '@opensip-cli/core';
|
|
14
|
+
/**
|
|
15
|
+
* Filter a check's signals by `@fitness-ignore` directives.
|
|
16
|
+
*
|
|
17
|
+
* Delegates matching to the core primitive with the fitness keywords and
|
|
18
|
+
* `ruleIdOf: () => checkId` (every signal in this call belongs to one check, so
|
|
19
|
+
* the directive must name that check's slug — the historical per-check
|
|
20
|
+
* semantics). The core primitive owns the anti-recursion guard: a finding that
|
|
21
|
+
* points at a directive line is never suppressed by a line-level directive,
|
|
22
|
+
* which prevents directive-auditing checks from suppressing their own findings.
|
|
23
|
+
*
|
|
24
|
+
* The suppressed matches are reduced back into the file/line buckets the
|
|
25
|
+
* `DirectiveEntry` audit collection expects.
|
|
26
|
+
*/
|
|
27
|
+
export declare function filterSignalsByDirectives(signals: readonly Signal[], checkId: string, initialIgnoredCount: number): Promise<{
|
|
28
|
+
filteredSignals: Signal[];
|
|
29
|
+
ignoredCount: number;
|
|
30
|
+
appliedDirectives: DirectiveEntry[];
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Builds the filtered result from the original result and filtered signals.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildFilteredResult(result: CheckResult, filteredSignals: Signal[], ignoredCount: number, start: number): CheckResult;
|
|
36
|
+
//# sourceMappingURL=ignore-processing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-processing.d.ts","sourceRoot":"","sources":["../../src/framework/ignore-processing.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAMhD;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC;IACT,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,cAAc,EAAE,CAAC;CACrC,CAAC,CAkCD;AA+GD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,WAAW,CAwBb"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// @fitness-ignore-file batch-operation-limits -- iterates bounded collections (config entries, registry items, or small analysis results)
|
|
2
|
+
// @fitness-ignore-file concurrency-safety -- Single-threaded Node.js; Map-based caches are safe without synchronization
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Ignore directive processing for fitness checks
|
|
5
|
+
*
|
|
6
|
+
* Filters signals via the shared core suppression primitive (ADR-0014), then
|
|
7
|
+
* builds fitness-specific outputs on top: the `ignoredCount`, the
|
|
8
|
+
* `DirectiveEntry` audit list (with weak-reason classification), and the
|
|
9
|
+
* rebuilt `CheckResult`. The matching algorithm (file/line directives,
|
|
10
|
+
* anti-recursion: a finding pointing at a directive line is never suppressed)
|
|
11
|
+
* lives once in `@opensip-cli/core`.
|
|
12
|
+
*/
|
|
13
|
+
import { filterSignalsBySuppressions, logger } from '@opensip-cli/core';
|
|
14
|
+
import { countErrors, countWarnings } from '../types/severity.js';
|
|
15
|
+
import { extractGroup, isWeakReason, parseDirectiveLine } from './directive-inventory.js';
|
|
16
|
+
import { FITNESS_KEYWORDS } from './directive-parsing.js';
|
|
17
|
+
import { fileCache } from './file-cache.js';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// SIGNAL FILTERING
|
|
20
|
+
// =============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Filter a check's signals by `@fitness-ignore` directives.
|
|
23
|
+
*
|
|
24
|
+
* Delegates matching to the core primitive with the fitness keywords and
|
|
25
|
+
* `ruleIdOf: () => checkId` (every signal in this call belongs to one check, so
|
|
26
|
+
* the directive must name that check's slug — the historical per-check
|
|
27
|
+
* semantics). The core primitive owns the anti-recursion guard: a finding that
|
|
28
|
+
* points at a directive line is never suppressed by a line-level directive,
|
|
29
|
+
* which prevents directive-auditing checks from suppressing their own findings.
|
|
30
|
+
*
|
|
31
|
+
* The suppressed matches are reduced back into the file/line buckets the
|
|
32
|
+
* `DirectiveEntry` audit collection expects.
|
|
33
|
+
*/
|
|
34
|
+
export async function filterSignalsByDirectives(signals, checkId, initialIgnoredCount) {
|
|
35
|
+
const { kept, suppressed } = await filterSignalsBySuppressions({
|
|
36
|
+
signals,
|
|
37
|
+
keywords: FITNESS_KEYWORDS,
|
|
38
|
+
readFile: (filePath) => fileCache.get(filePath),
|
|
39
|
+
ruleIdOf: () => checkId,
|
|
40
|
+
});
|
|
41
|
+
const appliedFileIgnores = new Set();
|
|
42
|
+
const appliedLineIgnores = new Map();
|
|
43
|
+
for (const match of suppressed) {
|
|
44
|
+
if (match.line === 'file') {
|
|
45
|
+
appliedFileIgnores.add(match.file);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
let lineSet = appliedLineIgnores.get(match.file);
|
|
49
|
+
if (!lineSet) {
|
|
50
|
+
lineSet = new Set();
|
|
51
|
+
appliedLineIgnores.set(match.file, lineSet);
|
|
52
|
+
}
|
|
53
|
+
lineSet.add(match.line);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const appliedDirectives = await collectAppliedDirectives(checkId, appliedFileIgnores, appliedLineIgnores);
|
|
57
|
+
return {
|
|
58
|
+
filteredSignals: [...kept],
|
|
59
|
+
ignoredCount: initialIgnoredCount + suppressed.length,
|
|
60
|
+
appliedDirectives,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// =============================================================================
|
|
64
|
+
// APPLIED DIRECTIVE COLLECTION
|
|
65
|
+
// =============================================================================
|
|
66
|
+
function toDirectiveEntry(filePath, lineNumber, parsed) {
|
|
67
|
+
return {
|
|
68
|
+
filePath,
|
|
69
|
+
lineNumber,
|
|
70
|
+
type: parsed.type,
|
|
71
|
+
checkId: parsed.checkId,
|
|
72
|
+
group: extractGroup(parsed.checkId),
|
|
73
|
+
reason: parsed.reason,
|
|
74
|
+
weakReason: isWeakReason(parsed.reason),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function collectFileIgnoreDirectives(checkId, appliedFileIgnores) {
|
|
78
|
+
const results = await Promise.all([...appliedFileIgnores].map(async (filePath) => {
|
|
79
|
+
try {
|
|
80
|
+
const content = await fileCache.get(filePath);
|
|
81
|
+
const lines = content.split('\n');
|
|
82
|
+
for (let i = 0; i < Math.min(lines.length, 50); i++) {
|
|
83
|
+
const parsed = parseDirectiveLine(lines[i] ?? '');
|
|
84
|
+
if (parsed?.type === 'file' && parsed.checkId === checkId) {
|
|
85
|
+
return toDirectiveEntry(filePath, i + 1, parsed);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.warn('fitness.ignore.directive_read.failed', {
|
|
91
|
+
evt: 'fitness.ignore.directive_read.failed',
|
|
92
|
+
module: 'fitness:ignore-processing',
|
|
93
|
+
err: error,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}));
|
|
98
|
+
return results.filter((d) => d !== null);
|
|
99
|
+
}
|
|
100
|
+
async function collectLineIgnoreDirectives(checkId, appliedLineIgnores) {
|
|
101
|
+
const results = await Promise.all([...appliedLineIgnores.entries()].map(async ([filePath, suppressedLines]) => {
|
|
102
|
+
const found = [];
|
|
103
|
+
try {
|
|
104
|
+
const content = await fileCache.get(filePath);
|
|
105
|
+
const lines = content.split('\n');
|
|
106
|
+
for (let i = 0; i < lines.length; i++) {
|
|
107
|
+
const parsed = parseDirectiveLine(lines[i] ?? '');
|
|
108
|
+
if (parsed?.type !== 'next-line' || parsed.checkId !== checkId)
|
|
109
|
+
continue;
|
|
110
|
+
let targetLine = i + 1;
|
|
111
|
+
while (targetLine < lines.length &&
|
|
112
|
+
(lines[targetLine] ?? '').trimStart().startsWith('//')) {
|
|
113
|
+
targetLine++;
|
|
114
|
+
}
|
|
115
|
+
if (suppressedLines.has(targetLine + 1)) {
|
|
116
|
+
found.push(toDirectiveEntry(filePath, i + 1, parsed));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.warn('fitness.ignore.directive_read.failed', {
|
|
122
|
+
evt: 'fitness.ignore.directive_read.failed',
|
|
123
|
+
module: 'fitness:ignore-processing',
|
|
124
|
+
err: error,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return found;
|
|
128
|
+
}));
|
|
129
|
+
const directives = [];
|
|
130
|
+
for (const batch of results) {
|
|
131
|
+
for (const d of batch) {
|
|
132
|
+
directives.push(d);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return directives;
|
|
136
|
+
}
|
|
137
|
+
async function collectAppliedDirectives(checkId, appliedFileIgnores, appliedLineIgnores) {
|
|
138
|
+
const [fileDirectives, lineDirectives] = await Promise.all([
|
|
139
|
+
collectFileIgnoreDirectives(checkId, appliedFileIgnores),
|
|
140
|
+
collectLineIgnoreDirectives(checkId, appliedLineIgnores),
|
|
141
|
+
]);
|
|
142
|
+
return [...fileDirectives, ...lineDirectives];
|
|
143
|
+
}
|
|
144
|
+
// =============================================================================
|
|
145
|
+
// RESULT BUILDING
|
|
146
|
+
// =============================================================================
|
|
147
|
+
/**
|
|
148
|
+
* Builds the filtered result from the original result and filtered signals.
|
|
149
|
+
*/
|
|
150
|
+
export function buildFilteredResult(result, filteredSignals, ignoredCount, start) {
|
|
151
|
+
if (!Array.isArray(filteredSignals)) {
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
const durationMs = result.metadata.durationMs ?? Date.now() - start;
|
|
155
|
+
const filteredErrors = countErrors(filteredSignals);
|
|
156
|
+
const filteredWarnings = countWarnings(filteredSignals);
|
|
157
|
+
const filteredResult = {
|
|
158
|
+
...result,
|
|
159
|
+
passed: filteredErrors === 0,
|
|
160
|
+
errors: filteredErrors,
|
|
161
|
+
warnings: filteredWarnings,
|
|
162
|
+
signals: filteredSignals,
|
|
163
|
+
metadata: {
|
|
164
|
+
...result.metadata,
|
|
165
|
+
durationMs,
|
|
166
|
+
signals: filteredSignals,
|
|
167
|
+
},
|
|
168
|
+
...(ignoredCount > 0 ? { ignoredCount } : {}),
|
|
169
|
+
};
|
|
170
|
+
return filteredResult;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=ignore-processing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-processing.js","sourceRoot":"","sources":["../../src/framework/ignore-processing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Project-wide import graph builder.
|
|
3
|
+
*
|
|
4
|
+
* Builds a file-level dependency graph from a set of TypeScript/JavaScript
|
|
5
|
+
* source files, plus a Tarjan's strongly-connected-components implementation
|
|
6
|
+
* for cycle detection. Used by structural-drift checks like
|
|
7
|
+
* circular-import-detection and module-coupling-fan-out.
|
|
8
|
+
*
|
|
9
|
+
* Module resolution is deliberately a heuristic: relative imports are
|
|
10
|
+
* resolved by trying common extension/index.ts suffixes; bare specifiers
|
|
11
|
+
* (npm packages) are dropped; tsconfig path aliases are NOT resolved
|
|
12
|
+
* (treated as unresolved — they simply don't appear as edges in the graph).
|
|
13
|
+
*
|
|
14
|
+
* This matches the heuristic the existing `phantom-dependency-detection`
|
|
15
|
+
* check uses, which has been shipping reliably. Adding tsconfig-aware
|
|
16
|
+
* resolution is a follow-up plan.
|
|
17
|
+
*/
|
|
18
|
+
/** A file-level import graph for a project. */
|
|
19
|
+
export interface ImportGraph {
|
|
20
|
+
/** All node file paths (absolute, as supplied by the caller). */
|
|
21
|
+
readonly nodes: ReadonlySet<string>;
|
|
22
|
+
/** Adjacency: file → set of files it imports (intra-project edges only). */
|
|
23
|
+
readonly outbound: ReadonlyMap<string, ReadonlySet<string>>;
|
|
24
|
+
/** Reverse adjacency: file → set of files that import it. */
|
|
25
|
+
readonly inbound: ReadonlyMap<string, ReadonlySet<string>>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build an import graph from a collection of file paths and their content.
|
|
29
|
+
*
|
|
30
|
+
* Each file's TS AST is walked for top-level `import` and `export ... from`
|
|
31
|
+
* declarations. Relative specifiers (`./foo`, `../bar/baz.js`) are resolved
|
|
32
|
+
* against the importing file's directory using the heuristic in
|
|
33
|
+
* `resolveRelativeSpecifier`. Bare specifiers (`react`, `lodash`) are
|
|
34
|
+
* dropped — they don't represent intra-project edges.
|
|
35
|
+
*
|
|
36
|
+
* Files that fail to parse are still added as nodes (with no edges) so the
|
|
37
|
+
* graph remains complete.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildImportGraph(files: ReadonlyMap<string, string>): ImportGraph;
|
|
40
|
+
/**
|
|
41
|
+
* Find strongly-connected components in the graph using Tarjan's algorithm.
|
|
42
|
+
*
|
|
43
|
+
* Returns an array of SCCs, each represented as an array of node names. SCCs
|
|
44
|
+
* of size 1 represent a node with no cycle (or a self-loop, which is rare in
|
|
45
|
+
* import graphs). Cycle-detection callers typically filter to `scc.length > 1`
|
|
46
|
+
* to get only real multi-file cycles.
|
|
47
|
+
*
|
|
48
|
+
* Algorithm: standard iterative Tarjan's SCC. O(V + E), single pass.
|
|
49
|
+
*/
|
|
50
|
+
export declare function findStronglyConnectedComponents(graph: ImportGraph): readonly (readonly string[])[];
|
|
51
|
+
//# sourceMappingURL=import-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../src/framework/import-graph.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;GAgBG;AAYH,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5D;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAwBhF;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,WAAW,GACjB,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAiGhC"}
|