@opensip-tools/fitness 1.0.4
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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/LICENSE +21 -0
- package/dist/__tests__/gate.test.d.ts +13 -0
- package/dist/__tests__/gate.test.d.ts.map +1 -0
- package/dist/__tests__/gate.test.js +422 -0
- package/dist/__tests__/gate.test.js.map +1 -0
- package/dist/__tests__/sarif.test.d.ts +2 -0
- package/dist/__tests__/sarif.test.d.ts.map +1 -0
- package/dist/__tests__/sarif.test.js +169 -0
- package/dist/__tests__/sarif.test.js.map +1 -0
- package/dist/cli/dashboard.d.ts +6 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +77 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/fit.d.ts +37 -0
- package/dist/cli/fit.d.ts.map +1 -0
- package/dist/cli/fit.js +539 -0
- package/dist/cli/fit.js.map +1 -0
- package/dist/cli/list-checks.d.ts +6 -0
- package/dist/cli/list-checks.d.ts.map +1 -0
- package/dist/cli/list-checks.js +23 -0
- package/dist/cli/list-checks.js.map +1 -0
- package/dist/cli/list-recipes.d.ts +6 -0
- package/dist/cli/list-recipes.d.ts.map +1 -0
- package/dist/cli/list-recipes.js +31 -0
- package/dist/cli/list-recipes.js.map +1 -0
- package/dist/framework/__tests__/ast-utilities.test.d.ts +2 -0
- package/dist/framework/__tests__/ast-utilities.test.d.ts.map +1 -0
- package/dist/framework/__tests__/ast-utilities.test.js +153 -0
- package/dist/framework/__tests__/ast-utilities.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__/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 +71 -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 +104 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.js.map +1 -0
- package/dist/framework/__tests__/content-filter.test.d.ts +2 -0
- package/dist/framework/__tests__/content-filter.test.d.ts.map +1 -0
- package/dist/framework/__tests__/content-filter.test.js +126 -0
- package/dist/framework/__tests__/content-filter.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 +155 -0
- package/dist/framework/__tests__/define-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 +44 -0
- package/dist/framework/__tests__/directive-inventory.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 +62 -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__/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__/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 +42 -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 +208 -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-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 +140 -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 +42 -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 +136 -0
- package/dist/framework/abortable-exec.js.map +1 -0
- package/dist/framework/ast-utilities.d.ts +41 -0
- package/dist/framework/ast-utilities.d.ts.map +1 -0
- package/dist/framework/ast-utilities.js +106 -0
- package/dist/framework/ast-utilities.js.map +1 -0
- package/dist/framework/check-config.d.ts +171 -0
- package/dist/framework/check-config.d.ts.map +1 -0
- package/dist/framework/check-config.js +114 -0
- package/dist/framework/check-config.js.map +1 -0
- package/dist/framework/check-types.d.ts +57 -0
- package/dist/framework/check-types.d.ts.map +1 -0
- package/dist/framework/check-types.js +35 -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/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/content-filter.d.ts +33 -0
- package/dist/framework/content-filter.d.ts.map +1 -0
- package/dist/framework/content-filter.js +236 -0
- package/dist/framework/content-filter.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 +252 -0
- package/dist/framework/define-check.js.map +1 -0
- package/dist/framework/directive-inventory.d.ts +34 -0
- package/dist/framework/directive-inventory.d.ts.map +1 -0
- package/dist/framework/directive-inventory.js +77 -0
- package/dist/framework/directive-inventory.js.map +1 -0
- package/dist/framework/directive-parsing.d.ts +20 -0
- package/dist/framework/directive-parsing.d.ts.map +1 -0
- package/dist/framework/directive-parsing.js +121 -0
- package/dist/framework/directive-parsing.js.map +1 -0
- package/dist/framework/execution-context.d.ts +95 -0
- package/dist/framework/execution-context.d.ts.map +1 -0
- package/dist/framework/execution-context.js +122 -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 +178 -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 +22 -0
- package/dist/framework/ignore-processing.d.ts.map +1 -0
- package/dist/framework/ignore-processing.js +241 -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 +216 -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 +23 -0
- package/dist/framework/parse-cache.d.ts.map +1 -0
- package/dist/framework/parse-cache.js +37 -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 +10 -0
- package/dist/framework/register-helpers.d.ts.map +1 -0
- package/dist/framework/register-helpers.js +17 -0
- package/dist/framework/register-helpers.js.map +1 -0
- package/dist/framework/registry.d.ts +41 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +103 -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-resolver.d.ts +23 -0
- package/dist/framework/scope-resolver.d.ts.map +1 -0
- package/dist/framework/scope-resolver.js +201 -0
- package/dist/framework/scope-resolver.js.map +1 -0
- package/dist/framework/severity-mapping.d.ts +13 -0
- package/dist/framework/severity-mapping.d.ts.map +1 -0
- package/dist/framework/severity-mapping.js +51 -0
- package/dist/framework/severity-mapping.js.map +1 -0
- package/dist/framework/strip-literals.d.ts +48 -0
- package/dist/framework/strip-literals.d.ts.map +1 -0
- package/dist/framework/strip-literals.js +188 -0
- package/dist/framework/strip-literals.js.map +1 -0
- package/dist/gate.d.ts +74 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +257 -0
- package/dist/gate.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.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 +170 -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 +171 -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 +194 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/check-package-discovery.d.ts +73 -0
- package/dist/plugins/check-package-discovery.d.ts.map +1 -0
- package/dist/plugins/check-package-discovery.js +212 -0
- package/dist/plugins/check-package-discovery.js.map +1 -0
- package/dist/plugins/loader.d.ts +31 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +290 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +23 -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 +5 -0
- package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-config.test.js +37 -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 +135 -0
- package/dist/recipes/__tests__/check-resolution.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 +97 -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__/service.test.d.ts +11 -0
- package/dist/recipes/__tests__/service.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/service.test.js +482 -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 +247 -0
- package/dist/recipes/built-in-recipes.js.map +1 -0
- package/dist/recipes/check-config.d.ts +40 -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 +21 -0
- package/dist/recipes/check-resolution.d.ts.map +1 -0
- package/dist/recipes/check-resolution.js +121 -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 +158 -0
- package/dist/recipes/check-result-processor.js.map +1 -0
- package/dist/recipes/parallel-execution.d.ts +33 -0
- package/dist/recipes/parallel-execution.d.ts.map +1 -0
- package/dist/recipes/parallel-execution.js +142 -0
- package/dist/recipes/parallel-execution.js.map +1 -0
- package/dist/recipes/registry.d.ts +81 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +131 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/retry.d.ts +25 -0
- package/dist/recipes/retry.d.ts.map +1 -0
- package/dist/recipes/retry.js +44 -0
- package/dist/recipes/retry.js.map +1 -0
- package/dist/recipes/sequential-execution.d.ts +10 -0
- package/dist/recipes/sequential-execution.d.ts.map +1 -0
- package/dist/recipes/sequential-execution.js +122 -0
- package/dist/recipes/sequential-execution.js.map +1 -0
- package/dist/recipes/service-types.d.ts +84 -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 +71 -0
- package/dist/recipes/service.d.ts.map +1 -0
- package/dist/recipes/service.js +331 -0
- package/dist/recipes/service.js.map +1 -0
- package/dist/recipes/types.d.ts +154 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +54 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/sarif.d.ts +34 -0
- package/dist/sarif.d.ts.map +1 -0
- package/dist/sarif.js +192 -0
- package/dist/sarif.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 +74 -0
- package/dist/signalers/__tests__/loader.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 +24 -0
- package/dist/signalers/loader.d.ts.map +1 -0
- package/dist/signalers/loader.js +108 -0
- package/dist/signalers/loader.js.map +1 -0
- package/dist/signalers/schema.d.ts +288 -0
- package/dist/signalers/schema.d.ts.map +1 -0
- package/dist/signalers/schema.js +99 -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/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 +127 -0
- package/dist/targets/__tests__/loader.test.js.map +1 -0
- package/dist/targets/__tests__/resolver.test.d.ts +2 -0
- package/dist/targets/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/targets/__tests__/resolver.test.js +54 -0
- package/dist/targets/__tests__/resolver.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 +89 -0
- package/dist/targets/__tests__/target-registry.test.js.map +1 -0
- package/dist/targets/index.d.ts +10 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +12 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/loader.d.ts +19 -0
- package/dist/targets/loader.d.ts.map +1 -0
- package/dist/targets/loader.js +159 -0
- package/dist/targets/loader.js.map +1 -0
- package/dist/targets/resolver.d.ts +19 -0
- package/dist/targets/resolver.d.ts.map +1 -0
- package/dist/targets/resolver.js +37 -0
- package/dist/targets/resolver.js.map +1 -0
- package/dist/targets/target-registry.d.ts +61 -0
- package/dist/targets/target-registry.d.ts.map +1 -0
- package/dist/targets/target-registry.js +93 -0
- package/dist/targets/target-registry.js.map +1 -0
- package/dist/targets/types.d.ts +85 -0
- package/dist/targets/types.d.ts.map +1 -0
- package/dist/targets/types.js +5 -0
- package/dist/targets/types.js.map +1 -0
- package/dist/tool.d.ts +17 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +282 -0
- package/dist/tool.js.map +1 -0
- package/dist/types/findings.d.ts +117 -0
- package/dist/types/findings.d.ts.map +1 -0
- package/dist/types/findings.js +93 -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 +36 -0
- package/dist/types/severity.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/gate.test.ts +537 -0
- package/src/__tests__/sarif.test.ts +201 -0
- package/src/cli/dashboard.ts +93 -0
- package/src/cli/fit.ts +612 -0
- package/src/cli/list-checks.ts +32 -0
- package/src/cli/list-recipes.ts +38 -0
- package/src/framework/__tests__/ast-utilities.test.ts +157 -0
- package/src/framework/__tests__/check-config.test.ts +65 -0
- package/src/framework/__tests__/command-executor.test.ts +79 -0
- package/src/framework/__tests__/content-filter-dispatch.test.ts +132 -0
- package/src/framework/__tests__/content-filter.test.ts +136 -0
- package/src/framework/__tests__/define-check.test.ts +180 -0
- package/src/framework/__tests__/directive-inventory.test.ts +53 -0
- package/src/framework/__tests__/execution-context.test.ts +80 -0
- package/src/framework/__tests__/file-accessor.test.ts +121 -0
- package/src/framework/__tests__/file-cache.test.ts +142 -0
- package/src/framework/__tests__/import-graph.test.ts +282 -0
- package/src/framework/__tests__/path-matcher.test.ts +130 -0
- package/src/framework/__tests__/register-helpers.test.ts +51 -0
- package/src/framework/__tests__/registry.test.ts +243 -0
- package/src/framework/__tests__/result-builder.test.ts +178 -0
- package/src/framework/__tests__/scope-resolver.test.ts +208 -0
- package/src/framework/__tests__/severity-mapping.test.ts +50 -0
- package/src/framework/__tests__/strip-literals.test.ts +109 -0
- package/src/framework/abortable-exec.ts +177 -0
- package/src/framework/ast-utilities.ts +112 -0
- package/src/framework/check-config.ts +339 -0
- package/src/framework/check-types.ts +77 -0
- package/src/framework/command-executor.ts +100 -0
- package/src/framework/constants.ts +16 -0
- package/src/framework/content-filter.ts +288 -0
- package/src/framework/define-check.ts +336 -0
- package/src/framework/directive-inventory.ts +110 -0
- package/src/framework/directive-parsing.ts +152 -0
- package/src/framework/execution-context.ts +247 -0
- package/src/framework/file-accessor.ts +171 -0
- package/src/framework/file-cache.ts +220 -0
- package/src/framework/file-type-filter.ts +25 -0
- package/src/framework/ignore-processing.ts +350 -0
- package/src/framework/import-graph.ts +280 -0
- package/src/framework/memory-profiler.ts +145 -0
- package/src/framework/parse-cache.ts +38 -0
- package/src/framework/path-matcher.ts +191 -0
- package/src/framework/register-helpers.ts +20 -0
- package/src/framework/registry.ts +125 -0
- package/src/framework/result-builder.ts +225 -0
- package/src/framework/scope-resolver.ts +262 -0
- package/src/framework/severity-mapping.ts +56 -0
- package/src/framework/strip-literals.ts +200 -0
- package/src/gate.ts +337 -0
- package/src/index.ts +110 -0
- package/src/plugins/__tests__/check-package-discovery.test.ts +204 -0
- package/src/plugins/__tests__/lang-domain.test.ts +198 -0
- package/src/plugins/__tests__/loader.test.ts +226 -0
- package/src/plugins/check-package-discovery.ts +242 -0
- package/src/plugins/loader.ts +327 -0
- package/src/plugins/types.ts +25 -0
- package/src/recipes/__tests__/built-in-recipes.test.ts +107 -0
- package/src/recipes/__tests__/check-config.test.ts +51 -0
- package/src/recipes/__tests__/check-resolution.test.ts +185 -0
- package/src/recipes/__tests__/registry.test.ts +115 -0
- package/src/recipes/__tests__/retry.test.ts +83 -0
- package/src/recipes/__tests__/service.test.ts +572 -0
- package/src/recipes/built-in-recipes.ts +273 -0
- package/src/recipes/check-config.ts +64 -0
- package/src/recipes/check-resolution.ts +169 -0
- package/src/recipes/check-result-processor.ts +258 -0
- package/src/recipes/parallel-execution.ts +220 -0
- package/src/recipes/registry.ts +192 -0
- package/src/recipes/retry.ts +69 -0
- package/src/recipes/sequential-execution.ts +139 -0
- package/src/recipes/service-types.ts +105 -0
- package/src/recipes/service.ts +400 -0
- package/src/recipes/types.ts +247 -0
- package/src/sarif.ts +232 -0
- package/src/signalers/__tests__/loader.test.ts +99 -0
- package/src/signalers/index.ts +9 -0
- package/src/signalers/loader.ts +141 -0
- package/src/signalers/schema.ts +117 -0
- package/src/signalers/types.ts +15 -0
- package/src/targets/__tests__/loader.test.ts +170 -0
- package/src/targets/__tests__/resolver.test.ts +74 -0
- package/src/targets/__tests__/target-registry.test.ts +103 -0
- package/src/targets/index.ts +13 -0
- package/src/targets/loader.ts +214 -0
- package/src/targets/resolver.ts +44 -0
- package/src/targets/target-registry.ts +111 -0
- package/src/targets/types.ts +89 -0
- package/src/tool.ts +302 -0
- package/src/types/findings.ts +239 -0
- package/src/types/severity.ts +39 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +33 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Check result processor for fitness recipe execution
|
|
3
|
+
*
|
|
4
|
+
* Processes individual check results (success or error), updates session state,
|
|
5
|
+
* builds check summaries, and determines whether execution should stop.
|
|
6
|
+
*/
|
|
7
|
+
import { logger, SystemError } from '@opensip-tools/core';
|
|
8
|
+
import { memoryProfiler } from '../framework/memory-profiler.js';
|
|
9
|
+
import { countErrors, countWarnings } from '../types/severity.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CHECK SUMMARY BUILDERS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/** Build a CheckSummary from a successful check execution */
|
|
14
|
+
function createCheckSummary(checkId, checkSlug, passed, errorCount, warningCount, durationMs, memoryProfile, ignoredCount = 0, filesScanned = 0) {
|
|
15
|
+
return {
|
|
16
|
+
checkId,
|
|
17
|
+
checkSlug,
|
|
18
|
+
passed,
|
|
19
|
+
errors: errorCount,
|
|
20
|
+
warnings: warningCount,
|
|
21
|
+
durationMs,
|
|
22
|
+
filesScanned,
|
|
23
|
+
ignoredCount,
|
|
24
|
+
memoryProfile,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Build a CheckSummary from a failed or errored check execution */
|
|
28
|
+
function createErrorSummary(checkId, checkSlug, durationMs, memoryProfile, timedOut, errorMessage) {
|
|
29
|
+
return {
|
|
30
|
+
checkId,
|
|
31
|
+
checkSlug,
|
|
32
|
+
passed: false,
|
|
33
|
+
errors: 1,
|
|
34
|
+
warnings: 0,
|
|
35
|
+
durationMs,
|
|
36
|
+
filesScanned: 0,
|
|
37
|
+
ignoredCount: 0,
|
|
38
|
+
memoryProfile,
|
|
39
|
+
timedOut,
|
|
40
|
+
errorMessage,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// SESSION UPDATES
|
|
45
|
+
// =============================================================================
|
|
46
|
+
function updateSessionForSuccess(session, checkResult, tags) {
|
|
47
|
+
session.checkResults.push(checkResult);
|
|
48
|
+
session.completedChecks++;
|
|
49
|
+
if (checkResult.passed) {
|
|
50
|
+
session.passedChecks++;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
session.failedChecks++;
|
|
54
|
+
}
|
|
55
|
+
session.totalErrors += checkResult.errorCount;
|
|
56
|
+
session.totalWarnings += checkResult.warningCount;
|
|
57
|
+
session.totalIgnored += checkResult.ignoredCount;
|
|
58
|
+
for (const tag of tags) {
|
|
59
|
+
session.ignoresByTag.set(tag, (session.ignoresByTag.get(tag) ?? 0) + checkResult.ignoredCount);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function updateSessionForError(session, checkResult) {
|
|
63
|
+
session.checkResults.push(checkResult);
|
|
64
|
+
session.completedChecks++;
|
|
65
|
+
session.failedChecks++;
|
|
66
|
+
session.totalErrors++;
|
|
67
|
+
}
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// MAIN PROCESSORS
|
|
70
|
+
// =============================================================================
|
|
71
|
+
/** Process a successful check result: update session, invoke callbacks, and determine stop condition */
|
|
72
|
+
export function processSuccessResult(ctx, input) {
|
|
73
|
+
const { checkId, checkSlug, tags, checkIndex, totalChecks, result, durationMs, memoryBeforeMB } = input;
|
|
74
|
+
const { session, callbacks, recipe } = ctx;
|
|
75
|
+
// Apply file filter if set
|
|
76
|
+
let effectiveSignals = result.signals;
|
|
77
|
+
if (recipe.fileFilter) {
|
|
78
|
+
effectiveSignals = result.signals.filter((s) => s.code?.file === recipe.fileFilter);
|
|
79
|
+
}
|
|
80
|
+
const signalCount = effectiveSignals.length;
|
|
81
|
+
const errorCount = recipe.fileFilter
|
|
82
|
+
? countErrors(effectiveSignals)
|
|
83
|
+
: result.errors;
|
|
84
|
+
const warningCount = recipe.fileFilter
|
|
85
|
+
? countWarnings(effectiveSignals)
|
|
86
|
+
: result.warnings;
|
|
87
|
+
const ignoredCount = result.ignoredCount ?? 0;
|
|
88
|
+
const passed = recipe.fileFilter ? errorCount === 0 : result.passed;
|
|
89
|
+
const memoryProfile = memoryProfiler.recordCheckComplete(checkId, memoryBeforeMB, signalCount, durationMs);
|
|
90
|
+
if (memoryProfiler.exceedsThreshold(memoryProfile.memoryDeltaMB)) {
|
|
91
|
+
logger.warn('Check exceeded memory threshold', { evt: 'fitness.check.memory.exceeded', module: 'fitness:recipes', checkId, checkSlug, memoryDeltaMB: memoryProfile.memoryDeltaMB });
|
|
92
|
+
callbacks.onMemoryWarning?.(checkId, memoryProfile);
|
|
93
|
+
}
|
|
94
|
+
const checkResult = {
|
|
95
|
+
checkId,
|
|
96
|
+
checkSlug,
|
|
97
|
+
passed,
|
|
98
|
+
violationCount: signalCount,
|
|
99
|
+
errorCount,
|
|
100
|
+
warningCount,
|
|
101
|
+
ignoredCount,
|
|
102
|
+
durationMs,
|
|
103
|
+
totalItems: result.metadata.totalItems,
|
|
104
|
+
itemType: result.metadata.itemType,
|
|
105
|
+
skipped: false,
|
|
106
|
+
...(result.appliedDirectives && result.appliedDirectives.length > 0
|
|
107
|
+
? { appliedDirectives: result.appliedDirectives }
|
|
108
|
+
: {}),
|
|
109
|
+
...(ctx.includeViolations ? {
|
|
110
|
+
violations: effectiveSignals.map((s) => ({
|
|
111
|
+
file: s.code?.file ?? 'unknown',
|
|
112
|
+
line: s.code?.line ?? 0,
|
|
113
|
+
column: s.code?.column,
|
|
114
|
+
message: s.message,
|
|
115
|
+
severity: s.severity === 'high' ? 'error' : 'warning',
|
|
116
|
+
suggestion: s.suggestion,
|
|
117
|
+
})),
|
|
118
|
+
} : {}),
|
|
119
|
+
};
|
|
120
|
+
updateSessionForSuccess(session, checkResult, tags);
|
|
121
|
+
const summary = createCheckSummary(checkId, checkSlug, passed, errorCount, warningCount, durationMs, memoryProfile, ignoredCount, result.metadata.filesScanned ?? 0);
|
|
122
|
+
callbacks.onCheckComplete?.(checkSlug, summary, checkIndex, totalChecks);
|
|
123
|
+
const shouldStop = recipe.execution.stopOnFirstFailure && !passed;
|
|
124
|
+
return { checkResult, memoryProfile, shouldStop };
|
|
125
|
+
}
|
|
126
|
+
/** Process a failed check result: update session, invoke callbacks, and determine stop condition */
|
|
127
|
+
export function processErrorResult(ctx, input) {
|
|
128
|
+
const { checkId, checkSlug, checkIndex, totalChecks, error, durationMs, memoryBeforeMB, timedOut, timeoutMs } = input;
|
|
129
|
+
const { session, callbacks, recipe } = ctx;
|
|
130
|
+
let errMsg;
|
|
131
|
+
if (timedOut && timeoutMs) {
|
|
132
|
+
errMsg = `Check ${checkSlug} timed out after ${timeoutMs}ms`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
errMsg = error instanceof Error ? error.message : String(error);
|
|
136
|
+
}
|
|
137
|
+
const memoryProfile = memoryProfiler.recordCheckComplete(checkId, memoryBeforeMB, 0, durationMs);
|
|
138
|
+
const checkResult = {
|
|
139
|
+
checkId,
|
|
140
|
+
checkSlug,
|
|
141
|
+
passed: false,
|
|
142
|
+
violationCount: 0,
|
|
143
|
+
errorCount: 1,
|
|
144
|
+
warningCount: 0,
|
|
145
|
+
ignoredCount: 0,
|
|
146
|
+
durationMs,
|
|
147
|
+
skipped: false,
|
|
148
|
+
error: errMsg,
|
|
149
|
+
timedOut,
|
|
150
|
+
};
|
|
151
|
+
updateSessionForError(session, checkResult);
|
|
152
|
+
const summary = createErrorSummary(checkId, checkSlug, durationMs, memoryProfile, timedOut, errMsg);
|
|
153
|
+
callbacks.onError?.(checkSlug, error instanceof Error ? error : new SystemError(errMsg, { code: 'SYSTEM.FITNESS.CHECK_ERROR' }));
|
|
154
|
+
callbacks.onCheckComplete?.(checkSlug, summary, checkIndex, totalChecks);
|
|
155
|
+
const shouldStop = recipe.execution.stopOnFirstFailure;
|
|
156
|
+
return { checkResult, memoryProfile, shouldStop };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=check-result-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-result-processor.js","sourceRoot":"","sources":["../../src/recipes/check-result-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Parallel execution engine for fitness recipe checks
|
|
3
|
+
*
|
|
4
|
+
* Runs fitness checks concurrently with configurable parallelism,
|
|
5
|
+
* per-check timeouts, abort support, and retry logic.
|
|
6
|
+
*/
|
|
7
|
+
import type { FitnessRecipeServiceCallbacks, FitnessRecipeSession } from './service-types.js';
|
|
8
|
+
import type { FitnessRecipe } from './types.js';
|
|
9
|
+
import type { Check } from '../framework/check-types.js';
|
|
10
|
+
/** Options for executing a set of fitness checks */
|
|
11
|
+
export interface ExecutionOptions {
|
|
12
|
+
checks: Check[];
|
|
13
|
+
cwd: string;
|
|
14
|
+
recipe: FitnessRecipe;
|
|
15
|
+
/** Per-check pre-resolved file paths from target overrides */
|
|
16
|
+
checkTargetFiles?: ReadonlyMap<string, readonly string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Run-wide globalExcludes from project config. Forwarded into each
|
|
19
|
+
* check's RunOptions so scope-empty checks honor exclusions instead
|
|
20
|
+
* of scanning every file in the prewarmed cache.
|
|
21
|
+
*/
|
|
22
|
+
globalExcludes?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
/** Service context providing session state, callbacks, and abort control */
|
|
25
|
+
export interface ExecutionServiceContext {
|
|
26
|
+
session: FitnessRecipeSession;
|
|
27
|
+
callbacks: FitnessRecipeServiceCallbacks;
|
|
28
|
+
abortController?: AbortController;
|
|
29
|
+
includeViolations?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Execute fitness checks concurrently with configurable parallelism and per-check timeouts */
|
|
32
|
+
export declare function executeParallel(ctx: ExecutionServiceContext, opts: ExecutionOptions): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=parallel-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-execution.d.ts","sourceRoot":"","sources":["../../src/recipes/parallel-execution.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAUxD,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,aAAa,CAAA;IACrB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAA;IACzD;;;;OAIG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,SAAS,EAAE,6BAA6B,CAAA;IACxC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAMD,+FAA+F;AAC/F,wBAAsB,eAAe,CAAC,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmKzG"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Parallel execution engine for fitness recipe checks
|
|
3
|
+
*
|
|
4
|
+
* Runs fitness checks concurrently with configurable parallelism,
|
|
5
|
+
* per-check timeouts, abort support, and retry logic.
|
|
6
|
+
*/
|
|
7
|
+
import { TimeoutError, logger } from '@opensip-tools/core';
|
|
8
|
+
import { memoryProfiler } from '../framework/memory-profiler.js';
|
|
9
|
+
import { processSuccessResult, processErrorResult } from './check-result-processor.js';
|
|
10
|
+
import { executeWithRetry } from './retry.js';
|
|
11
|
+
import { getEffectiveMaxParallel } from './types.js';
|
|
12
|
+
/** Logger module tag used by every event emitted from the parallel execution engine. */
|
|
13
|
+
const MODULE_TAG = 'fitness:execution';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// PARALLEL EXECUTION
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/** Execute fitness checks concurrently with configurable parallelism and per-check timeouts */
|
|
18
|
+
export async function executeParallel(ctx, opts) {
|
|
19
|
+
// in-memory: single-threaded Node.js access pattern
|
|
20
|
+
const { checks, cwd, recipe, checkTargetFiles, globalExcludes } = opts;
|
|
21
|
+
const { session, callbacks, abortController } = ctx;
|
|
22
|
+
const recipeTimeout = recipe.execution.timeout ?? 30_000;
|
|
23
|
+
const maxParallel = getEffectiveMaxParallel(recipe);
|
|
24
|
+
const totalChecks = checks.length;
|
|
25
|
+
const memoryBeforeMap = new Map();
|
|
26
|
+
let nextCheckIndex = 0;
|
|
27
|
+
let activeCount = 0;
|
|
28
|
+
let shouldStopExecution = false;
|
|
29
|
+
const processorCtx = { session, callbacks, recipe, includeViolations: ctx.includeViolations ?? false };
|
|
30
|
+
// @fitness-ignore-next-line concurrency-safety -- async arrow provides Promise<void> return type for consistency; single-threaded Node.js access pattern
|
|
31
|
+
/* eslint-disable @typescript-eslint/require-await -- callers `await` this; preserving async signature in case future processors become async */
|
|
32
|
+
const processCheckResult = async (checkIndex, checkId, checkSlug, checkTags, result, durationMs) => {
|
|
33
|
+
// in-memory: single-threaded Node.js access pattern
|
|
34
|
+
const memoryBeforeMB = memoryBeforeMap.get(checkId) ?? 0;
|
|
35
|
+
const output = processSuccessResult(processorCtx, {
|
|
36
|
+
checkId,
|
|
37
|
+
checkSlug,
|
|
38
|
+
tags: checkTags,
|
|
39
|
+
checkIndex,
|
|
40
|
+
totalChecks,
|
|
41
|
+
result,
|
|
42
|
+
durationMs,
|
|
43
|
+
memoryBeforeMB,
|
|
44
|
+
});
|
|
45
|
+
if (output.shouldStop)
|
|
46
|
+
shouldStopExecution = true;
|
|
47
|
+
};
|
|
48
|
+
/* eslint-enable @typescript-eslint/require-await */
|
|
49
|
+
const processCheckError = (checkIndex, checkId, checkSlug, error, durationMs, timedOut = false, timeoutMs) => {
|
|
50
|
+
const memoryBeforeMB = memoryBeforeMap.get(checkId) ?? 0;
|
|
51
|
+
const errorInput = {
|
|
52
|
+
checkId,
|
|
53
|
+
checkSlug,
|
|
54
|
+
checkIndex,
|
|
55
|
+
totalChecks,
|
|
56
|
+
error,
|
|
57
|
+
durationMs,
|
|
58
|
+
memoryBeforeMB,
|
|
59
|
+
timedOut,
|
|
60
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
61
|
+
};
|
|
62
|
+
const output = processErrorResult(processorCtx, errorInput);
|
|
63
|
+
if (output.shouldStop)
|
|
64
|
+
shouldStopExecution = true;
|
|
65
|
+
};
|
|
66
|
+
await new Promise((resolve) => {
|
|
67
|
+
const advanceWindow = () => {
|
|
68
|
+
activeCount--;
|
|
69
|
+
if (!shouldStopExecution && nextCheckIndex < checks.length && !abortController?.signal.aborted) {
|
|
70
|
+
const nextCheck = checks[nextCheckIndex];
|
|
71
|
+
if (nextCheck) {
|
|
72
|
+
nextCheckIndex++;
|
|
73
|
+
startCheck(nextCheck, nextCheckIndex);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (activeCount === 0 && (nextCheckIndex >= checks.length || shouldStopExecution)) {
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// @fitness-ignore-next-line file-length-limits -- Parallel check launcher: orchestrates timeout, retry, result processing, and window advancement in a single cohesive unit
|
|
81
|
+
const startCheck = (check, displayIndex) => {
|
|
82
|
+
// in-memory: single-threaded Node.js access pattern
|
|
83
|
+
const checkId = check.config.id;
|
|
84
|
+
activeCount++;
|
|
85
|
+
const checkTimeout = check.config.timeout ?? recipeTimeout;
|
|
86
|
+
memoryBeforeMap.set(checkId, memoryProfiler.recordCheckStart());
|
|
87
|
+
callbacks.onCheckStart?.(check.config.slug, displayIndex, totalChecks);
|
|
88
|
+
logger.info({ evt: 'fitness.check.start', module: MODULE_TAG, checkSlug: check.config.slug, index: displayIndex, total: totalChecks, timeoutMs: checkTimeout });
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
const checkAbortController = new AbortController();
|
|
91
|
+
const timeoutId = setTimeout(() => checkAbortController.abort(), checkTimeout);
|
|
92
|
+
const targetFiles = checkTargetFiles?.get(check.config.slug);
|
|
93
|
+
void executeWithRetry(() => check.run(cwd, {
|
|
94
|
+
signal: checkAbortController.signal,
|
|
95
|
+
...(targetFiles ? { targetFiles } : {}),
|
|
96
|
+
...(globalExcludes ? { globalExcludes } : {}),
|
|
97
|
+
}), {
|
|
98
|
+
enabled: recipe.execution.retryOnFailure ?? false,
|
|
99
|
+
maxRetries: recipe.execution.maxRetries ?? 2,
|
|
100
|
+
checkId,
|
|
101
|
+
checkSlug: check.config.slug,
|
|
102
|
+
})
|
|
103
|
+
.then(async (retryResult) => {
|
|
104
|
+
const durationMs = Date.now() - startTime;
|
|
105
|
+
if (retryResult.result === undefined) {
|
|
106
|
+
clearTimeout(timeoutId);
|
|
107
|
+
const isTimeout = checkAbortController.signal.aborted;
|
|
108
|
+
logger.info({ evt: 'fitness.check.error', module: MODULE_TAG, checkSlug: check.config.slug, durationMs, timedOut: isTimeout, error: retryResult.lastError instanceof Error ? retryResult.lastError.message : String(retryResult.lastError) });
|
|
109
|
+
void processCheckError(displayIndex, checkId, check.config.slug, retryResult.lastError, durationMs, isTimeout, isTimeout ? checkTimeout : undefined);
|
|
110
|
+
}
|
|
111
|
+
else if (checkAbortController.signal.aborted) {
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
logger.info({ evt: 'fitness.check.timeout', module: MODULE_TAG, checkSlug: check.config.slug, durationMs, timeoutMs: checkTimeout });
|
|
114
|
+
void processCheckError(displayIndex, checkId, check.config.slug, new TimeoutError(`Check ${checkId} timed out after ${checkTimeout}ms`, checkTimeout), durationMs, true, checkTimeout);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
clearTimeout(timeoutId);
|
|
118
|
+
logger.info({ evt: 'fitness.check.done', module: MODULE_TAG, checkSlug: check.config.slug, durationMs, signals: retryResult.result.signals.length });
|
|
119
|
+
await processCheckResult(displayIndex, checkId, check.config.slug, check.config.tags ?? [], retryResult.result, durationMs);
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
.catch((error) => {
|
|
123
|
+
clearTimeout(timeoutId);
|
|
124
|
+
const durationMs = Date.now() - startTime;
|
|
125
|
+
logger.info({ evt: 'fitness.check.error', module: MODULE_TAG, checkSlug: check.config.slug, durationMs, error: error instanceof Error ? error.message : String(error) });
|
|
126
|
+
void processCheckError(displayIndex, checkId, check.config.slug, error, durationMs);
|
|
127
|
+
})
|
|
128
|
+
.finally(() => advanceWindow());
|
|
129
|
+
};
|
|
130
|
+
const initialBatchSize = Math.min(maxParallel, checks.length);
|
|
131
|
+
for (let i = 0; i < initialBatchSize; i++) {
|
|
132
|
+
const check = checks[i];
|
|
133
|
+
if (check) {
|
|
134
|
+
nextCheckIndex = i + 1;
|
|
135
|
+
startCheck(check, i + 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (checks.length === 0)
|
|
139
|
+
resolve();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=parallel-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-execution.js","sourceRoot":"","sources":["../../src/recipes/parallel-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Fitness recipe registry
|
|
3
|
+
*
|
|
4
|
+
* Manages registration and lookup of fitness recipes (built-in and user-defined).
|
|
5
|
+
*/
|
|
6
|
+
import type { FitnessRecipe } from './types.js';
|
|
7
|
+
/** Stub for user recipe loading (not ported to opensip-tools) */
|
|
8
|
+
interface UserFitnessRecipesResult {
|
|
9
|
+
recipes: FitnessRecipe[];
|
|
10
|
+
warnings: string[];
|
|
11
|
+
loadedFrom?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Options for constructing a FitnessRecipeRegistry */
|
|
14
|
+
export interface FitnessRecipeRegistryOptions {
|
|
15
|
+
readonly basePath?: string;
|
|
16
|
+
readonly loadUserRecipes?: boolean;
|
|
17
|
+
readonly logWarnings?: boolean;
|
|
18
|
+
readonly logSummary?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Display-friendly info about a registered recipe */
|
|
21
|
+
export interface RecipeDisplayInfo {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly displayName: string;
|
|
24
|
+
readonly description: string;
|
|
25
|
+
readonly tags: readonly string[];
|
|
26
|
+
readonly isBuiltIn: boolean;
|
|
27
|
+
readonly isUserDefined: boolean;
|
|
28
|
+
readonly overridesBuiltIn: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Registry for fitness recipes, loading built-in and user-defined recipes */
|
|
31
|
+
export declare class FitnessRecipeRegistry {
|
|
32
|
+
private readonly byId;
|
|
33
|
+
private readonly byName;
|
|
34
|
+
private _userRecipesLoadResult;
|
|
35
|
+
private readonly _overriddenBuiltIns;
|
|
36
|
+
constructor(options?: FitnessRecipeRegistryOptions);
|
|
37
|
+
private registerBuiltInRecipes;
|
|
38
|
+
private loadAndRegisterUserRecipes;
|
|
39
|
+
/** Return the result of loading user-defined recipes, if attempted */
|
|
40
|
+
getUserRecipesLoadResult(): UserFitnessRecipesResult | undefined;
|
|
41
|
+
/** Check whether a built-in recipe has been overridden by a user recipe */
|
|
42
|
+
isOverridden(name: string): boolean;
|
|
43
|
+
/** Return the names of all built-in recipes overridden by user recipes */
|
|
44
|
+
getOverriddenBuiltIns(): readonly string[];
|
|
45
|
+
/** Look up a recipe by name or ID */
|
|
46
|
+
loadRecipe(nameOrId: string): FitnessRecipe | undefined;
|
|
47
|
+
/** Retrieve a recipe by its name */
|
|
48
|
+
getByName(name: string): FitnessRecipe | undefined;
|
|
49
|
+
/** Retrieve a recipe by its ID */
|
|
50
|
+
getById(id: string): FitnessRecipe | undefined;
|
|
51
|
+
/** Check whether a recipe exists by name or ID */
|
|
52
|
+
has(nameOrId: string): boolean;
|
|
53
|
+
/** Return all registered recipes */
|
|
54
|
+
getAllRecipes(): readonly FitnessRecipe[];
|
|
55
|
+
/** Return all registered recipe names */
|
|
56
|
+
getNames(): readonly string[];
|
|
57
|
+
/** Return all recipes matching a given tag */
|
|
58
|
+
getByTag(tag: string): readonly FitnessRecipe[];
|
|
59
|
+
/** Number of registered recipes */
|
|
60
|
+
get size(): number;
|
|
61
|
+
/** Register a recipe. Throws if already registered unless allowOverwrite is true. */
|
|
62
|
+
register(recipe: FitnessRecipe, options?: {
|
|
63
|
+
allowOverwrite?: boolean;
|
|
64
|
+
}): void;
|
|
65
|
+
/** Register multiple recipes at once */
|
|
66
|
+
registerAll(recipes: readonly FitnessRecipe[], options?: {
|
|
67
|
+
allowOverwrite?: boolean;
|
|
68
|
+
}): void;
|
|
69
|
+
/** Remove a recipe by ID. Returns true if the recipe was found and removed. */
|
|
70
|
+
remove(id: string): boolean;
|
|
71
|
+
/** Remove all registered recipes */
|
|
72
|
+
clear(): void;
|
|
73
|
+
/** Clear all recipes and re-register built-in recipes */
|
|
74
|
+
reset(): void;
|
|
75
|
+
/** Return display-friendly info for all registered recipes */
|
|
76
|
+
listForDisplay(): readonly RecipeDisplayInfo[];
|
|
77
|
+
}
|
|
78
|
+
/** Shared singleton recipe registry with built-in recipes pre-loaded */
|
|
79
|
+
export declare const defaultRecipeRegistry: FitnessRecipeRegistry;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/recipes/registry.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,iEAAiE;AACjE,UAAU,wBAAwB;IAChC,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,uDAAuD;AACvD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CACnC;AAED,8EAA8E;AAC9E,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoB;gBAE5C,OAAO,GAAE,4BAAiC;IAetD,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,0BAA0B;IASlC,sEAAsE;IACtE,wBAAwB,IAAI,wBAAwB,GAAG,SAAS;IAIhE,2EAA2E;IAC3E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,0EAA0E;IAC1E,qBAAqB,IAAI,SAAS,MAAM,EAAE;IAI1C,qCAAqC;IACrC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIvD,oCAAoC;IACpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIlD,kCAAkC;IAClC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9C,kDAAkD;IAClD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B,oCAAoC;IACpC,aAAa,IAAI,SAAS,aAAa,EAAE;IAIzC,yCAAyC;IACzC,QAAQ,IAAI,SAAS,MAAM,EAAE;IAI7B,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE;IAI/C,mCAAmC;IACnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAU7E,wCAAwC;IACxC,WAAW,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAM5F,+EAA+E;IAC/E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ3B,oCAAoC;IACpC,KAAK,IAAI,IAAI;IAKb,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAKb,8DAA8D;IAC9D,cAAc,IAAI,SAAS,iBAAiB,EAAE;CAc/C;AAED,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,uBAAoD,CAAA"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// @fitness-ignore-file batch-operation-limits -- iterates bounded collections (config entries, registry items, or small analysis results)
|
|
2
|
+
// @fitness-ignore-file no-console-log -- User recipe warnings/summary output before CLI framework is initialized
|
|
3
|
+
// @fitness-ignore-file logging-standards -- User recipe warnings/summary output before structured logger is available
|
|
4
|
+
/**
|
|
5
|
+
* @fileoverview Fitness recipe registry
|
|
6
|
+
*
|
|
7
|
+
* Manages registration and lookup of fitness recipes (built-in and user-defined).
|
|
8
|
+
*/
|
|
9
|
+
import { ValidationError } from '@opensip-tools/core';
|
|
10
|
+
import { builtInRecipes, isBuiltInRecipe } from './built-in-recipes.js';
|
|
11
|
+
/** Registry for fitness recipes, loading built-in and user-defined recipes */
|
|
12
|
+
export class FitnessRecipeRegistry {
|
|
13
|
+
byId = new Map();
|
|
14
|
+
byName = new Map();
|
|
15
|
+
_userRecipesLoadResult;
|
|
16
|
+
_overriddenBuiltIns = new Set();
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
const { basePath, loadUserRecipes: shouldLoadUserRecipes = true, logWarnings = true, logSummary = false, } = options;
|
|
19
|
+
this.registerBuiltInRecipes();
|
|
20
|
+
if (shouldLoadUserRecipes) {
|
|
21
|
+
this.loadAndRegisterUserRecipes(basePath, logWarnings, logSummary);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
registerBuiltInRecipes() {
|
|
25
|
+
for (const recipe of builtInRecipes) {
|
|
26
|
+
this.byId.set(recipe.id, recipe);
|
|
27
|
+
this.byName.set(recipe.name, recipe);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
loadAndRegisterUserRecipes(_basePath, _logWarnings, _logSummary) {
|
|
31
|
+
// User recipe loading not ported to opensip-tools — stub
|
|
32
|
+
this._userRecipesLoadResult = { recipes: [], warnings: [] };
|
|
33
|
+
}
|
|
34
|
+
/** Return the result of loading user-defined recipes, if attempted */
|
|
35
|
+
getUserRecipesLoadResult() {
|
|
36
|
+
return this._userRecipesLoadResult;
|
|
37
|
+
}
|
|
38
|
+
/** Check whether a built-in recipe has been overridden by a user recipe */
|
|
39
|
+
isOverridden(name) {
|
|
40
|
+
return this._overriddenBuiltIns.has(name);
|
|
41
|
+
}
|
|
42
|
+
/** Return the names of all built-in recipes overridden by user recipes */
|
|
43
|
+
getOverriddenBuiltIns() {
|
|
44
|
+
return [...this._overriddenBuiltIns];
|
|
45
|
+
}
|
|
46
|
+
/** Look up a recipe by name or ID */
|
|
47
|
+
loadRecipe(nameOrId) {
|
|
48
|
+
return this.byName.get(nameOrId) ?? this.byId.get(nameOrId);
|
|
49
|
+
}
|
|
50
|
+
/** Retrieve a recipe by its name */
|
|
51
|
+
getByName(name) {
|
|
52
|
+
return this.byName.get(name);
|
|
53
|
+
}
|
|
54
|
+
/** Retrieve a recipe by its ID */
|
|
55
|
+
getById(id) {
|
|
56
|
+
return this.byId.get(id);
|
|
57
|
+
}
|
|
58
|
+
/** Check whether a recipe exists by name or ID */
|
|
59
|
+
has(nameOrId) {
|
|
60
|
+
return this.byName.has(nameOrId) || this.byId.has(nameOrId);
|
|
61
|
+
}
|
|
62
|
+
/** Return all registered recipes */
|
|
63
|
+
getAllRecipes() {
|
|
64
|
+
return [...this.byId.values()];
|
|
65
|
+
}
|
|
66
|
+
/** Return all registered recipe names */
|
|
67
|
+
getNames() {
|
|
68
|
+
return [...this.byName.keys()];
|
|
69
|
+
}
|
|
70
|
+
/** Return all recipes matching a given tag */
|
|
71
|
+
getByTag(tag) {
|
|
72
|
+
return [...this.byId.values()].filter((r) => r.tags?.includes(tag));
|
|
73
|
+
}
|
|
74
|
+
/** Number of registered recipes */
|
|
75
|
+
get size() {
|
|
76
|
+
return this.byId.size;
|
|
77
|
+
}
|
|
78
|
+
/** Register a recipe. Throws if already registered unless allowOverwrite is true. */
|
|
79
|
+
register(recipe, options) {
|
|
80
|
+
const allowOverwrite = options?.allowOverwrite ?? false;
|
|
81
|
+
if (!allowOverwrite && (this.byId.has(recipe.id) || this.byName.has(recipe.name))) {
|
|
82
|
+
// @fitness-ignore-next-line result-pattern-consistency -- internal registration guard, throw is appropriate
|
|
83
|
+
throw new ValidationError(`Recipe '${recipe.name}' (${recipe.id}) already registered`, { code: 'VALIDATION.FITNESS.DUPLICATE_RECIPE' });
|
|
84
|
+
}
|
|
85
|
+
this.byId.set(recipe.id, recipe);
|
|
86
|
+
this.byName.set(recipe.name, recipe);
|
|
87
|
+
}
|
|
88
|
+
/** Register multiple recipes at once */
|
|
89
|
+
registerAll(recipes, options) {
|
|
90
|
+
for (const recipe of recipes) {
|
|
91
|
+
this.register(recipe, options);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Remove a recipe by ID. Returns true if the recipe was found and removed. */
|
|
95
|
+
remove(id) {
|
|
96
|
+
const recipe = this.byId.get(id);
|
|
97
|
+
if (!recipe)
|
|
98
|
+
return false;
|
|
99
|
+
this.byId.delete(id);
|
|
100
|
+
this.byName.delete(recipe.name);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
/** Remove all registered recipes */
|
|
104
|
+
clear() {
|
|
105
|
+
this.byId.clear();
|
|
106
|
+
this.byName.clear();
|
|
107
|
+
}
|
|
108
|
+
/** Clear all recipes and re-register built-in recipes */
|
|
109
|
+
reset() {
|
|
110
|
+
this.clear();
|
|
111
|
+
this.registerBuiltInRecipes();
|
|
112
|
+
}
|
|
113
|
+
/** Return display-friendly info for all registered recipes */
|
|
114
|
+
listForDisplay() {
|
|
115
|
+
return [...this.byId.values()].map((recipe) => {
|
|
116
|
+
const isUserRecipe = recipe.id.startsWith('URCP_');
|
|
117
|
+
return {
|
|
118
|
+
name: recipe.name,
|
|
119
|
+
displayName: recipe.displayName,
|
|
120
|
+
description: recipe.description,
|
|
121
|
+
tags: recipe.tags ?? [],
|
|
122
|
+
isBuiltIn: !isUserRecipe && isBuiltInRecipe(recipe.name),
|
|
123
|
+
isUserDefined: isUserRecipe,
|
|
124
|
+
overridesBuiltIn: this._overriddenBuiltIns.has(recipe.name),
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Shared singleton recipe registry with built-in recipes pre-loaded */
|
|
130
|
+
export const defaultRecipeRegistry = new FitnessRecipeRegistry({ logWarnings: false });
|
|
131
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/recipes/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Retry logic for fitness check execution
|
|
3
|
+
*
|
|
4
|
+
* Provides exponential backoff retry wrapper for transient check failures.
|
|
5
|
+
*/
|
|
6
|
+
/** Configuration for retry behavior */
|
|
7
|
+
export interface RetryOptions {
|
|
8
|
+
readonly enabled: boolean;
|
|
9
|
+
readonly maxRetries: number;
|
|
10
|
+
readonly checkId: string;
|
|
11
|
+
readonly checkSlug: string;
|
|
12
|
+
}
|
|
13
|
+
/** Result of a retry-wrapped function execution */
|
|
14
|
+
export interface RetryResult<T> {
|
|
15
|
+
readonly result: T | undefined;
|
|
16
|
+
readonly lastError: unknown;
|
|
17
|
+
readonly retryCount: number;
|
|
18
|
+
readonly wasRetried: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Execute a function with retry logic.
|
|
22
|
+
* Only retries when the function throws. CheckAbortedError is never retried.
|
|
23
|
+
*/
|
|
24
|
+
export declare function executeWithRetry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<RetryResult<T>>;
|
|
25
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/recipes/retry.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAMH,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAOD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA6BzB"}
|