@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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core type definitions for fitness checks
|
|
3
|
+
*
|
|
4
|
+
* Check interface is the return type of defineCheck.
|
|
5
|
+
* CheckConfig represents the internal configuration structure.
|
|
6
|
+
* CheckResult carries Signal[].
|
|
7
|
+
*/
|
|
8
|
+
import type { CheckScope, ResolvedScope } from './check-config.js';
|
|
9
|
+
import type { ExecutionContext, RunOptions } from './execution-context.js';
|
|
10
|
+
import type { PathMatcher } from './path-matcher.js';
|
|
11
|
+
import type { CheckResult, ItemType } from '../types/findings.js';
|
|
12
|
+
/**
|
|
13
|
+
* Check configuration options.
|
|
14
|
+
*/
|
|
15
|
+
export interface CheckConfig {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly slug: string;
|
|
18
|
+
readonly tags: readonly string[];
|
|
19
|
+
readonly description: string;
|
|
20
|
+
readonly longDescription?: string | undefined;
|
|
21
|
+
readonly analysisMode: 'analyze' | 'analyzeAll' | 'command';
|
|
22
|
+
readonly scope: ResolvedScope;
|
|
23
|
+
readonly itemType: ItemType;
|
|
24
|
+
readonly unit?: string | undefined;
|
|
25
|
+
readonly additionalExcludes?: readonly string[] | undefined;
|
|
26
|
+
readonly docs?: string | undefined;
|
|
27
|
+
readonly disabled?: boolean | undefined;
|
|
28
|
+
readonly confidence?: 'high' | 'medium' | 'low' | undefined;
|
|
29
|
+
readonly timeout?: number | undefined;
|
|
30
|
+
readonly scansFiles?: boolean | undefined;
|
|
31
|
+
readonly fileTypes?: readonly string[] | undefined;
|
|
32
|
+
/** Portable scope declaration for marketplace-ready target matching. */
|
|
33
|
+
readonly checkScope?: CheckScope | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Display icon (an emoji) for CLI/dashboard output. Travels WITH the check
|
|
36
|
+
* (§5.3 separate-domains fold) — there is no separate per-process display
|
|
37
|
+
* sidecar map. Absent → consumers fall back to a default icon.
|
|
38
|
+
*/
|
|
39
|
+
readonly icon?: string | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Human-readable display name for CLI/dashboard output. Absent → consumers
|
|
42
|
+
* fall back to kebab-to-title-case of the slug.
|
|
43
|
+
*/
|
|
44
|
+
readonly displayName?: string | undefined;
|
|
45
|
+
readonly execute: (ctx: ExecutionContext) => Promise<CheckResult>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A defined check, ready to run.
|
|
49
|
+
*/
|
|
50
|
+
export interface Check {
|
|
51
|
+
readonly config: CheckConfig;
|
|
52
|
+
readonly run: (cwd: string, options?: RunOptions) => Promise<CheckResult>;
|
|
53
|
+
readonly getScope: () => ResolvedScope;
|
|
54
|
+
readonly getMatcher: (cwd: string) => PathMatcher;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Type guard: is this value a Check object?
|
|
58
|
+
*
|
|
59
|
+
* Checks for the shape of a Check object:
|
|
60
|
+
* - Has a `config` property that is an object
|
|
61
|
+
* - config has an `id` property that is a string
|
|
62
|
+
* - config has a `slug` property that is a string
|
|
63
|
+
* - config has an `execute` property that is a function
|
|
64
|
+
* - Has a `run` property that is a function
|
|
65
|
+
*/
|
|
66
|
+
export declare function isCheck(value: unknown): value is Check;
|
|
67
|
+
/**
|
|
68
|
+
* Walk a barrel-export object and collect every Check it contains,
|
|
69
|
+
* deduplicated by `config.id`. Recurses into nested object exports;
|
|
70
|
+
* arrays are not traversed (they are typically the `checks` re-export
|
|
71
|
+
* the loader handles separately).
|
|
72
|
+
*
|
|
73
|
+
* Pack authors call this in their package's `index.ts`:
|
|
74
|
+
*
|
|
75
|
+
* import * as allChecks from './checks/index.js'
|
|
76
|
+
* export const checks = collectCheckObjects(allChecks)
|
|
77
|
+
*
|
|
78
|
+
* `seen` is exposed for callers that need to merge multiple barrels.
|
|
79
|
+
*/
|
|
80
|
+
export declare function collectCheckObjects(obj: Record<string, unknown>, seen?: Set<string>): Check[];
|
|
81
|
+
export { type ResolvedScope } from './check-config.js';
|
|
82
|
+
//# sourceMappingURL=check-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-types.d.ts","sourceRoot":"","sources":["../../src/framework/check-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACnD,wEAAwE;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,aAAa,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;CACnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAatD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,GAAE,GAAG,CAAC,MAAM,CAAqB,GACpC,KAAK,EAAE,CAaT;AAED,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core type definitions for fitness checks
|
|
3
|
+
*
|
|
4
|
+
* Check interface is the return type of defineCheck.
|
|
5
|
+
* CheckConfig represents the internal configuration structure.
|
|
6
|
+
* CheckResult carries Signal[].
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Type guard: is this value a Check object?
|
|
10
|
+
*
|
|
11
|
+
* Checks for the shape of a Check object:
|
|
12
|
+
* - Has a `config` property that is an object
|
|
13
|
+
* - config has an `id` property that is a string
|
|
14
|
+
* - config has a `slug` property that is a string
|
|
15
|
+
* - config has an `execute` property that is a function
|
|
16
|
+
* - Has a `run` property that is a function
|
|
17
|
+
*/
|
|
18
|
+
export function isCheck(value) {
|
|
19
|
+
if (value === null || typeof value !== 'object')
|
|
20
|
+
return false;
|
|
21
|
+
const obj = value;
|
|
22
|
+
if (!obj.config || typeof obj.config !== 'object')
|
|
23
|
+
return false;
|
|
24
|
+
const config = obj.config;
|
|
25
|
+
if (typeof config.id !== 'string')
|
|
26
|
+
return false;
|
|
27
|
+
if (typeof config.slug !== 'string')
|
|
28
|
+
return false;
|
|
29
|
+
if (typeof config.execute !== 'function')
|
|
30
|
+
return false;
|
|
31
|
+
if (typeof obj.run !== 'function')
|
|
32
|
+
return false;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Walk a barrel-export object and collect every Check it contains,
|
|
37
|
+
* deduplicated by `config.id`. Recurses into nested object exports;
|
|
38
|
+
* arrays are not traversed (they are typically the `checks` re-export
|
|
39
|
+
* the loader handles separately).
|
|
40
|
+
*
|
|
41
|
+
* Pack authors call this in their package's `index.ts`:
|
|
42
|
+
*
|
|
43
|
+
* import * as allChecks from './checks/index.js'
|
|
44
|
+
* export const checks = collectCheckObjects(allChecks)
|
|
45
|
+
*
|
|
46
|
+
* `seen` is exposed for callers that need to merge multiple barrels.
|
|
47
|
+
*/
|
|
48
|
+
export function collectCheckObjects(obj, seen = new Set()) {
|
|
49
|
+
const result = [];
|
|
50
|
+
for (const value of Object.values(obj)) {
|
|
51
|
+
if (isCheck(value)) {
|
|
52
|
+
if (!seen.has(value.config.id)) {
|
|
53
|
+
seen.add(value.config.id);
|
|
54
|
+
result.push(value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
58
|
+
result.push(...collectCheckObjects(value, seen));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=check-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-types.js","sourceRoot":"","sources":["../../src/framework/check-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqDH;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE9D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEhE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAiC,CAAC;IACrD,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAEhD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,OAAoB,IAAI,GAAG,EAAU;IAErC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAgC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command executor for external tool checks
|
|
3
|
+
*
|
|
4
|
+
* Executes external commands (eslint, prettier, etc.) with abort
|
|
5
|
+
* and timeout support, then parses output into violations.
|
|
6
|
+
*/
|
|
7
|
+
import type { CheckViolation, CommandConfig } from './check-config.js';
|
|
8
|
+
/** Options for executing an external command. */
|
|
9
|
+
export interface CommandExecutorOptions {
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly signal?: AbortSignal | undefined;
|
|
12
|
+
readonly timeout?: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Result of executing an external command, including parsed violations. */
|
|
15
|
+
export interface CommandExecutionResult {
|
|
16
|
+
readonly violations: CheckViolation[];
|
|
17
|
+
readonly aborted: boolean;
|
|
18
|
+
readonly exitCode: number | null;
|
|
19
|
+
readonly error?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute an external command and parse its output into violations.
|
|
23
|
+
*/
|
|
24
|
+
export declare function executeCommand(config: CommandConfig, files: readonly string[], options: CommandExecutorOptions): Promise<CommandExecutionResult>;
|
|
25
|
+
//# sourceMappingURL=command-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../src/framework/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMvE,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CA6DjC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command executor for external tool checks
|
|
3
|
+
*
|
|
4
|
+
* Executes external commands (eslint, prettier, etc.) with abort
|
|
5
|
+
* and timeout support, then parses output into violations.
|
|
6
|
+
*/
|
|
7
|
+
import { execAbortable } from './abortable-exec.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// EXECUTOR
|
|
10
|
+
// =============================================================================
|
|
11
|
+
const DEFAULT_EXPECTED_EXIT_CODES = [0, 1];
|
|
12
|
+
/**
|
|
13
|
+
* Execute an external command and parse its output into violations.
|
|
14
|
+
*/
|
|
15
|
+
export async function executeCommand(config, files, options) {
|
|
16
|
+
const { cwd, signal, timeout } = options;
|
|
17
|
+
const args = typeof config.args === 'function' ? config.args(files) : config.args;
|
|
18
|
+
const command = [config.bin, ...args];
|
|
19
|
+
const execOptions = { cwd, signal, timeout };
|
|
20
|
+
let result;
|
|
21
|
+
try {
|
|
22
|
+
result = await execAbortable(command, execOptions);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
// ENOENT = tool not installed (spawn fails before the process starts)
|
|
26
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
27
|
+
if (message.includes('ENOENT') || message.includes('not found')) {
|
|
28
|
+
return {
|
|
29
|
+
violations: [],
|
|
30
|
+
aborted: false,
|
|
31
|
+
exitCode: null,
|
|
32
|
+
error: `${config.bin} is not installed. Install it to enable this check.`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
if (result.aborted) {
|
|
38
|
+
return { violations: [], aborted: true, exitCode: result.exitCode };
|
|
39
|
+
}
|
|
40
|
+
// Exit code 127 = command not found (shell mode)
|
|
41
|
+
if (result.exitCode === 127) {
|
|
42
|
+
return {
|
|
43
|
+
violations: [],
|
|
44
|
+
aborted: false,
|
|
45
|
+
exitCode: 127,
|
|
46
|
+
error: `${config.bin} is not installed. Install it to enable this check.`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const expectedCodes = config.expectedExitCodes ?? DEFAULT_EXPECTED_EXIT_CODES;
|
|
50
|
+
if (result.exitCode !== null && !expectedCodes.includes(result.exitCode)) {
|
|
51
|
+
return {
|
|
52
|
+
violations: [],
|
|
53
|
+
aborted: false,
|
|
54
|
+
exitCode: result.exitCode,
|
|
55
|
+
error: `Command exited with unexpected code ${result.exitCode}. ` +
|
|
56
|
+
`Expected one of: ${expectedCodes.join(', ')}. ` +
|
|
57
|
+
`stderr: ${result.stderr.slice(0, 500)}${result.stderr.length > 500 ? ' [truncated]' : ''}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const violations = config.parseOutput(result.stdout, result.stderr, result.exitCode ?? 0, files, cwd);
|
|
61
|
+
return { violations, aborted: false, exitCode: result.exitCode };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=command-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/framework/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAuB/E,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,MAAM,2BAA2B,GAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB,EACrB,KAAwB,EACxB,OAA+B;IAE/B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAClF,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAyB,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEnE,IAAI,MAAiD,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sEAAsE;QACtE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChE,OAAO;gBACL,UAAU,EAAE,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,qDAAqD;aAC1E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC;IAED,iDAAiD;IACjD,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO;YACL,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,qDAAqD;SAC1E,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;IAC9E,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EACH,uCAAuC,MAAM,CAAC,QAAQ,IAAI;gBAC1D,oBAAoB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAChD,WAAW,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;SAC9F,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CACnC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,IAAI,CAAC,EACpB,KAAK,EACL,GAAG,CACJ,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Comment-opener table — re-exported from the kernel.
|
|
3
|
+
*
|
|
4
|
+
* The canonical table now lives in `@opensip-cli/core`
|
|
5
|
+
* (`signals/comment-openers.ts`, ADR-0014) so the suppression scanner and the
|
|
6
|
+
* fitness directive inventory share a single source of truth (they
|
|
7
|
+
* historically drifted). This module preserves the local import path for
|
|
8
|
+
* fitness consumers (`directive-inventory.ts`).
|
|
9
|
+
*/
|
|
10
|
+
export { COMMENT_OPENERS, stripCommentOpener } from '@opensip-cli/core';
|
|
11
|
+
//# sourceMappingURL=comment-openers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-openers.d.ts","sourceRoot":"","sources":["../../src/framework/comment-openers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Comment-opener table — re-exported from the kernel.
|
|
3
|
+
*
|
|
4
|
+
* The canonical table now lives in `@opensip-cli/core`
|
|
5
|
+
* (`signals/comment-openers.ts`, ADR-0014) so the suppression scanner and the
|
|
6
|
+
* fitness directive inventory share a single source of truth (they
|
|
7
|
+
* historically drifted). This module preserves the local import path for
|
|
8
|
+
* fitness consumers (`directive-inventory.ts`).
|
|
9
|
+
*/
|
|
10
|
+
export { COMMENT_OPENERS, stripCommentOpener } from '@opensip-cli/core';
|
|
11
|
+
//# sourceMappingURL=comment-openers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-openers.js","sourceRoot":"","sources":["../../src/framework/comment-openers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared constants for the fitness framework
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Standard exclusion patterns for file matching across the framework.
|
|
6
|
+
* Used by execution context, directive inventory, and file cache.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_EXCLUSION_PATTERNS: readonly ["**/node_modules/**", "**/dist/**", "**/.git/**", "**/coverage/**", "**/*.tsbuildinfo"];
|
|
9
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/framework/constants.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,mGAM7B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @fitness-ignore-file project-readme-existence -- internal module, not a package root
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Shared constants for the fitness framework
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Standard exclusion patterns for file matching across the framework.
|
|
7
|
+
* Used by execution context, directive inventory, and file cache.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_EXCLUSION_PATTERNS = [
|
|
10
|
+
'**/node_modules/**',
|
|
11
|
+
'**/dist/**',
|
|
12
|
+
'**/.git/**',
|
|
13
|
+
'**/coverage/**',
|
|
14
|
+
'**/*.tsbuildinfo',
|
|
15
|
+
];
|
|
16
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/framework/constants.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;CACV,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview defineCheck - Unified check definition API
|
|
3
|
+
*
|
|
4
|
+
* The main API for creating fitness checks. Supports three modes:
|
|
5
|
+
* - analyze: Per-file analysis with content and path
|
|
6
|
+
* - analyzeAll: Multi-file analysis with lazy loading FileAccessor
|
|
7
|
+
* - command: External tool execution with output parsing
|
|
8
|
+
*
|
|
9
|
+
* Check authors return CheckViolation[]. The framework converts each
|
|
10
|
+
* CheckViolation into a universal Signal via createSignal().
|
|
11
|
+
*/
|
|
12
|
+
import type { UnifiedCheckConfig } from './check-config.js';
|
|
13
|
+
import type { Check } from './check-types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Define a fitness check using the unified API.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* export const noConsoleLog = defineCheck({
|
|
20
|
+
* id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
|
|
21
|
+
* slug: 'no-console-log',
|
|
22
|
+
* category: 'quality',
|
|
23
|
+
* description: 'Disallow console.log in production code',
|
|
24
|
+
* analyze: (content, filePath) => {
|
|
25
|
+
* const violations: CheckViolation[] = [];
|
|
26
|
+
* content.split('\n').forEach((line, idx) => {
|
|
27
|
+
* if (line.includes('console.log')) {
|
|
28
|
+
* violations.push({ line: idx + 1, message: 'No console.log', severity: 'error' });
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
* return violations;
|
|
32
|
+
* },
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
* @throws {ValidationError} When the check config is invalid
|
|
36
|
+
*/
|
|
37
|
+
export declare function defineCheck(config: UnifiedCheckConfig): Check;
|
|
38
|
+
//# sourceMappingURL=define-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-check.d.ts","sourceRoot":"","sources":["../../src/framework/define-check.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AA0BH,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AA0K9C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,KAAK,CAqH7D"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// @fitness-ignore-file module-coupling-metrics -- central orchestration module with necessary coupling
|
|
2
|
+
// @fitness-ignore-file null-safety -- ResultBuilder.create() returns a fluent builder; .totalItems().filesScanned() chain is always safe
|
|
3
|
+
// @fitness-ignore-file unbounded-memory -- reads single source files at a time via FileAccessor; per-file memory bounded by source size
|
|
4
|
+
/**
|
|
5
|
+
* @fileoverview defineCheck - Unified check definition API
|
|
6
|
+
*
|
|
7
|
+
* The main API for creating fitness checks. Supports three modes:
|
|
8
|
+
* - analyze: Per-file analysis with content and path
|
|
9
|
+
* - analyzeAll: Multi-file analysis with lazy loading FileAccessor
|
|
10
|
+
* - command: External tool execution with output parsing
|
|
11
|
+
*
|
|
12
|
+
* Check authors return CheckViolation[]. The framework converts each
|
|
13
|
+
* CheckViolation into a universal Signal via createSignal().
|
|
14
|
+
*/
|
|
15
|
+
import { logger, SystemError, createSignal, applyContentFilter, currentScope, } from '@opensip-cli/core';
|
|
16
|
+
import { getAnalysisMode, isAnalyzeConfig, isAnalyzeAllConfig, isCommandConfig, validateCheckConfig, } from './check-config.js';
|
|
17
|
+
import { executeCommand } from './command-executor.js';
|
|
18
|
+
import { CheckAbortedError, createExecutionContext } from './execution-context.js';
|
|
19
|
+
import { createFileAccessor } from './file-accessor.js';
|
|
20
|
+
import { filterFilesByType } from './file-type-filter.js';
|
|
21
|
+
import { filterSignalsByDirectives, buildFilteredResult } from './ignore-processing.js';
|
|
22
|
+
import { PathMatcher } from './path-matcher.js';
|
|
23
|
+
import { ResultBuilder } from './result-builder.js';
|
|
24
|
+
import { mapFindingSeverity, mapTagsToSignalCategory } from './severity-mapping.js';
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// VIOLATION → SIGNAL CONVERSION
|
|
27
|
+
// =============================================================================
|
|
28
|
+
function toSignal(violation, checkSlug, checkTags, defaultFilePath, provider = 'opensip') {
|
|
29
|
+
const filePath = violation.filePath ?? defaultFilePath ?? '';
|
|
30
|
+
return createSignal({
|
|
31
|
+
source: 'fitness',
|
|
32
|
+
provider,
|
|
33
|
+
severity: mapFindingSeverity(violation.severity),
|
|
34
|
+
category: mapTagsToSignalCategory(checkTags),
|
|
35
|
+
ruleId: `fit:${checkSlug}`,
|
|
36
|
+
message: violation.message,
|
|
37
|
+
suggestion: violation.suggestion,
|
|
38
|
+
code: { file: filePath, line: violation.line, column: violation.column },
|
|
39
|
+
fix: violation.fix ??
|
|
40
|
+
(violation.suggestion ? { action: 'refactor', confidence: 0.5 } : undefined),
|
|
41
|
+
metadata: Object.fromEntries(Object.entries({
|
|
42
|
+
match: violation.match,
|
|
43
|
+
type: violation.type,
|
|
44
|
+
checkSlug,
|
|
45
|
+
checkTags: checkTags.length > 0 ? checkTags.join(',') : undefined,
|
|
46
|
+
}).filter(([, v]) => v != null && v !== '')),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// ANALYSIS MODE EXECUTORS
|
|
51
|
+
// =============================================================================
|
|
52
|
+
/** @throws {CheckAbortedError} When the check is aborted via AbortSignal */
|
|
53
|
+
async function executeAnalyzeMode(config, files, ctx) {
|
|
54
|
+
const builder = ResultBuilder.create({
|
|
55
|
+
checkId: config.id,
|
|
56
|
+
itemType: config.itemType ?? 'files',
|
|
57
|
+
})
|
|
58
|
+
.totalItems(files.length)
|
|
59
|
+
.filesScanned(files.length);
|
|
60
|
+
for (const filePath of files) {
|
|
61
|
+
if (ctx.signal?.aborted) {
|
|
62
|
+
throw new CheckAbortedError(config.slug);
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const rawContent = await ctx.readFile(filePath);
|
|
66
|
+
// Dispatch the content filter through the LanguageAdapter for the
|
|
67
|
+
// file's extension. Falls back to raw content when no adapter is
|
|
68
|
+
// registered. See languages/content-filter-dispatch.ts.
|
|
69
|
+
const content = applyContentFilter(filePath, rawContent, config.contentFilter ?? 'none');
|
|
70
|
+
const violations = config.analyze(content, filePath);
|
|
71
|
+
for (const violation of violations) {
|
|
72
|
+
void builder.addSignal(toSignal(violation, config.slug, config.tags ?? [], filePath, config.provider));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof CheckAbortedError)
|
|
77
|
+
throw error;
|
|
78
|
+
logger.debug('Skipping unreadable file', {
|
|
79
|
+
evt: 'fitness.check.file.skip',
|
|
80
|
+
module: 'fitness:framework',
|
|
81
|
+
filePath,
|
|
82
|
+
checkSlug: config.slug,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return builder.build();
|
|
87
|
+
}
|
|
88
|
+
/** @throws {CheckAbortedError} When the check is aborted via AbortSignal */
|
|
89
|
+
async function executeAnalyzeAllMode(config, files, ctx) {
|
|
90
|
+
if (ctx.signal?.aborted) {
|
|
91
|
+
throw new CheckAbortedError(config.slug);
|
|
92
|
+
}
|
|
93
|
+
const fileAccessor = createFileAccessor(files, {
|
|
94
|
+
signal: ctx.signal,
|
|
95
|
+
contentFilter: config.contentFilter,
|
|
96
|
+
});
|
|
97
|
+
const violations = await config.analyzeAll(fileAccessor);
|
|
98
|
+
if (ctx.signal?.aborted) {
|
|
99
|
+
throw new CheckAbortedError(config.slug);
|
|
100
|
+
}
|
|
101
|
+
const builder = ResultBuilder.create({
|
|
102
|
+
checkId: config.id,
|
|
103
|
+
itemType: config.itemType ?? 'files',
|
|
104
|
+
})
|
|
105
|
+
.totalItems(files.length)
|
|
106
|
+
.filesScanned(files.length);
|
|
107
|
+
for (const violation of violations) {
|
|
108
|
+
if (!violation.filePath) {
|
|
109
|
+
ctx.log(`Warning: violation missing filePath in analyzeAll mode`);
|
|
110
|
+
}
|
|
111
|
+
void builder.addSignal(toSignal(violation, config.slug, config.tags ?? [], undefined, config.provider));
|
|
112
|
+
}
|
|
113
|
+
return builder.build();
|
|
114
|
+
}
|
|
115
|
+
/** @throws {CheckAbortedError} When the check is aborted via AbortSignal */
|
|
116
|
+
async function executeCommandMode(config, files, ctx) {
|
|
117
|
+
const result = await executeCommand(config.command, files, {
|
|
118
|
+
cwd: ctx.cwd,
|
|
119
|
+
signal: ctx.signal,
|
|
120
|
+
timeout: config.timeout,
|
|
121
|
+
});
|
|
122
|
+
/* v8 ignore start -- defensive: command-mode tests cover the non-aborted path; abort during external command execution requires a long-running subprocess that's intentionally not unit-testable */
|
|
123
|
+
if (result.aborted) {
|
|
124
|
+
throw new CheckAbortedError(config.slug);
|
|
125
|
+
}
|
|
126
|
+
/* v8 ignore stop */
|
|
127
|
+
const builder = ResultBuilder.create({
|
|
128
|
+
checkId: config.id,
|
|
129
|
+
itemType: config.itemType ?? 'files',
|
|
130
|
+
})
|
|
131
|
+
.totalItems(files.length)
|
|
132
|
+
.filesScanned(0);
|
|
133
|
+
if (result.error) {
|
|
134
|
+
return builder.buildError(result.error);
|
|
135
|
+
}
|
|
136
|
+
for (const violation of result.violations) {
|
|
137
|
+
void builder.addSignal(toSignal(violation, config.slug, config.tags ?? [], undefined, config.provider));
|
|
138
|
+
}
|
|
139
|
+
return builder.build();
|
|
140
|
+
}
|
|
141
|
+
// =============================================================================
|
|
142
|
+
// MAIN EXPORT
|
|
143
|
+
// =============================================================================
|
|
144
|
+
/**
|
|
145
|
+
* Define a fitness check using the unified API.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* export const noConsoleLog = defineCheck({
|
|
150
|
+
* id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
|
|
151
|
+
* slug: 'no-console-log',
|
|
152
|
+
* category: 'quality',
|
|
153
|
+
* description: 'Disallow console.log in production code',
|
|
154
|
+
* analyze: (content, filePath) => {
|
|
155
|
+
* const violations: CheckViolation[] = [];
|
|
156
|
+
* content.split('\n').forEach((line, idx) => {
|
|
157
|
+
* if (line.includes('console.log')) {
|
|
158
|
+
* violations.push({ line: idx + 1, message: 'No console.log', severity: 'error' });
|
|
159
|
+
* }
|
|
160
|
+
* });
|
|
161
|
+
* return violations;
|
|
162
|
+
* },
|
|
163
|
+
* });
|
|
164
|
+
* ```
|
|
165
|
+
* @throws {ValidationError} When the check config is invalid
|
|
166
|
+
*/
|
|
167
|
+
export function defineCheck(config) {
|
|
168
|
+
validateCheckConfig(config);
|
|
169
|
+
// Canonicalise scope languages through the current scope's language
|
|
170
|
+
// registry so a check declared with `scope: { languages: ['c'] }` is
|
|
171
|
+
// indexed under the canonical id `'cpp'`. Unknown languages pass
|
|
172
|
+
// through unchanged (with a debug log) — they may resolve later if a
|
|
173
|
+
// custom adapter ships, and dropping them here would silently break
|
|
174
|
+
// checks. When `defineCheck` runs at module-load time before a scope
|
|
175
|
+
// is bound (the typical case for top-level `export const x =
|
|
176
|
+
// defineCheck(...)`), we cannot canonicalise — just lowercase.
|
|
177
|
+
//
|
|
178
|
+
// Recovery: the engine *always* re-canonicalizes check-declared languages
|
|
179
|
+
// at scope-match / file-resolution time (see scope-resolver.ts: liveScopeLangs
|
|
180
|
+
// map + target-registry.ts:toCanonical + findByScope). This makes define-time
|
|
181
|
+
// canonicalization best-effort only; execution-time canonicalization against
|
|
182
|
+
// the entered RunScope's LanguageRegistry is the source of truth for matching.
|
|
183
|
+
const scope = currentScope();
|
|
184
|
+
const canonicalLanguages = config.scope
|
|
185
|
+
? config.scope.languages.map((lang) => {
|
|
186
|
+
const canonical = scope?.languages.canonicalize(lang);
|
|
187
|
+
if (canonical === undefined) {
|
|
188
|
+
logger.debug({
|
|
189
|
+
evt: 'fitness.check.scope.unknown_language',
|
|
190
|
+
module: 'fitness:framework',
|
|
191
|
+
checkSlug: config.slug,
|
|
192
|
+
language: lang,
|
|
193
|
+
msg: `Check ${config.slug} declared scope language ${lang} which is not registered (or no scope at definition time)`,
|
|
194
|
+
});
|
|
195
|
+
return lang.toLowerCase();
|
|
196
|
+
}
|
|
197
|
+
return canonical;
|
|
198
|
+
})
|
|
199
|
+
: undefined;
|
|
200
|
+
const check = {
|
|
201
|
+
config: {
|
|
202
|
+
id: config.id,
|
|
203
|
+
slug: config.slug,
|
|
204
|
+
tags: config.tags ? [...config.tags] : [],
|
|
205
|
+
description: config.description,
|
|
206
|
+
longDescription: config.longDescription,
|
|
207
|
+
analysisMode: getAnalysisMode(config),
|
|
208
|
+
scope: { include: [], exclude: [], description: '' },
|
|
209
|
+
itemType: config.itemType ?? 'files',
|
|
210
|
+
docs: config.docs,
|
|
211
|
+
disabled: config.disabled,
|
|
212
|
+
confidence: config.confidence,
|
|
213
|
+
timeout: config.timeout,
|
|
214
|
+
scansFiles: !isCommandConfig(config),
|
|
215
|
+
fileTypes: config.fileTypes ? [...config.fileTypes] : undefined,
|
|
216
|
+
checkScope: config.scope && canonicalLanguages
|
|
217
|
+
? { languages: canonicalLanguages, concerns: [...config.scope.concerns] }
|
|
218
|
+
: undefined,
|
|
219
|
+
// Display metadata travels WITH the check (§5.3 fold) — no separate
|
|
220
|
+
// per-process display sidecar/singleton. Authors set these inline, or a
|
|
221
|
+
// pack's display map is applied via applyCheckDisplay().
|
|
222
|
+
icon: config.icon,
|
|
223
|
+
displayName: config.displayName,
|
|
224
|
+
// @fitness-ignore-next-line concurrency-safety -- async arrow delegates to executeUnifiedCheck which is async; needed for type compatibility
|
|
225
|
+
execute: async (ctx) => executeUnifiedCheck(config, ctx),
|
|
226
|
+
},
|
|
227
|
+
getScope() {
|
|
228
|
+
return { include: [], exclude: [], description: 'target-based scope' };
|
|
229
|
+
},
|
|
230
|
+
getMatcher(cwd) {
|
|
231
|
+
return PathMatcher.create({
|
|
232
|
+
include: [],
|
|
233
|
+
exclude: [],
|
|
234
|
+
cwd,
|
|
235
|
+
});
|
|
236
|
+
},
|
|
237
|
+
async run(cwd, options) {
|
|
238
|
+
const start = Date.now();
|
|
239
|
+
const matcher = PathMatcher.create({
|
|
240
|
+
include: [],
|
|
241
|
+
exclude: [],
|
|
242
|
+
cwd,
|
|
243
|
+
});
|
|
244
|
+
const executionConfig = {
|
|
245
|
+
id: config.id,
|
|
246
|
+
slug: config.slug,
|
|
247
|
+
itemType: config.itemType ?? 'files',
|
|
248
|
+
};
|
|
249
|
+
const ctx = createExecutionContext(executionConfig, cwd, matcher, options);
|
|
250
|
+
try {
|
|
251
|
+
const result = await executeUnifiedCheck(config, ctx);
|
|
252
|
+
const { filteredSignals, ignoredCount, appliedDirectives } = await filterSignalsByDirectives(result.signals, config.slug, result.ignoredCount ?? 0);
|
|
253
|
+
const filtered = buildFilteredResult(result, filteredSignals, ignoredCount, start);
|
|
254
|
+
return appliedDirectives.length > 0 ? { ...filtered, appliedDirectives } : filtered;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (error instanceof CheckAbortedError)
|
|
258
|
+
throw error;
|
|
259
|
+
const builder = ResultBuilder.create({
|
|
260
|
+
checkId: config.id,
|
|
261
|
+
itemType: config.itemType ?? 'files',
|
|
262
|
+
});
|
|
263
|
+
return builder.buildError(`Check ${config.slug} threw an error: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
return check;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Internal: Execute a check based on its analysis mode (analyze /
|
|
271
|
+
* analyzeAll / command).
|
|
272
|
+
* @throws {CheckAbortedError} When the check is aborted via AbortSignal
|
|
273
|
+
* @throws {SystemError} When an unknown analysis mode is encountered
|
|
274
|
+
*/
|
|
275
|
+
async function executeUnifiedCheck(config, ctx) {
|
|
276
|
+
const matchedFiles = await ctx.matchFiles();
|
|
277
|
+
// Filter by check's declared file types
|
|
278
|
+
const files = filterFilesByType(matchedFiles, config.fileTypes);
|
|
279
|
+
ctx.log(`Matched ${files.length} files`);
|
|
280
|
+
if (isAnalyzeConfig(config)) {
|
|
281
|
+
return executeAnalyzeMode(config, files, ctx);
|
|
282
|
+
}
|
|
283
|
+
else if (isAnalyzeAllConfig(config)) {
|
|
284
|
+
return executeAnalyzeAllMode(config, files, ctx);
|
|
285
|
+
}
|
|
286
|
+
else if (isCommandConfig(config)) {
|
|
287
|
+
return executeCommandMode(config, files, ctx);
|
|
288
|
+
}
|
|
289
|
+
/* v8 ignore start -- exhaustive check: all UnifiedCheckConfig variants are handled above; this throw fires only if someone introduces a new variant without updating this switch */
|
|
290
|
+
const _exhaustiveCheck = config;
|
|
291
|
+
throw new SystemError(`Unknown analysis mode: ${JSON.stringify(_exhaustiveCheck)}`, {
|
|
292
|
+
code: 'SYSTEM.FITNESS.UNKNOWN_MODE',
|
|
293
|
+
});
|
|
294
|
+
/* v8 ignore stop */
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=define-check.js.map
|