@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,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auto-discovery of @opensip-tools/checks-* packages
|
|
3
|
+
* installed in node_modules.
|
|
4
|
+
*
|
|
5
|
+
* Resolution rules (apply in order):
|
|
6
|
+
*
|
|
7
|
+
* 1. If `plugins.checkPackages` is declared in the project config,
|
|
8
|
+
* that explicit list wins. Auto-discovery is skipped entirely.
|
|
9
|
+
* Lets users pin their check set deterministically.
|
|
10
|
+
*
|
|
11
|
+
* 2. Else if `plugins.autoDiscoverChecks: false` is declared,
|
|
12
|
+
* no additional check packages are loaded. Lets users opt out
|
|
13
|
+
* of dependency-based discovery (e.g. when running in an
|
|
14
|
+
* environment with unrelated @opensip-tools packages installed).
|
|
15
|
+
*
|
|
16
|
+
* 3. Otherwise (default), scan node_modules for any package whose
|
|
17
|
+
* name matches `@opensip-tools/checks-*` and return the list.
|
|
18
|
+
*
|
|
19
|
+
* No package is privileged — what used to be `checks-builtin` is now
|
|
20
|
+
* just one of many `@opensip-tools/checks-*` packages declared as
|
|
21
|
+
* ordinary CLI dependencies and discovered uniformly. The CLI no
|
|
22
|
+
* longer hardcodes any check package import.
|
|
23
|
+
*
|
|
24
|
+
* The walker handles pnpm's nested node_modules layout: it looks at
|
|
25
|
+
* the project's direct node_modules, then walks up to ancestor
|
|
26
|
+
* node_modules (matching Node's resolution algorithm). We don't need
|
|
27
|
+
* to recurse into transitive deps because check packages are expected
|
|
28
|
+
* to be direct dependencies.
|
|
29
|
+
*/
|
|
30
|
+
export interface CheckPackageDiscoveryOptions {
|
|
31
|
+
/** Absolute path to the project root (where opensip-tools.config.yml lives). */
|
|
32
|
+
readonly projectDir: string;
|
|
33
|
+
/** Explicit list from `plugins.checkPackages` in the config. */
|
|
34
|
+
readonly explicitPackages?: readonly string[];
|
|
35
|
+
/** When false, auto-discovery is disabled. Default: true. */
|
|
36
|
+
readonly autoDiscover?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface DiscoveredCheckPackage {
|
|
39
|
+
/** npm package name, e.g. '@opensip-tools/checks-python'. */
|
|
40
|
+
readonly name: string;
|
|
41
|
+
/** Absolute path to the package's directory inside node_modules. */
|
|
42
|
+
readonly packageDir: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the list of check packages to load, applying the ordered
|
|
46
|
+
* resolution rules in the file header. Returns every discovered
|
|
47
|
+
* @opensip-tools/checks-* package; the CLI loads them all uniformly,
|
|
48
|
+
* with no package privileged over another.
|
|
49
|
+
*/
|
|
50
|
+
export declare function discoverCheckPackages(options: CheckPackageDiscoveryOptions): DiscoveredCheckPackage[];
|
|
51
|
+
/**
|
|
52
|
+
* Read `name` and `main`/`exports` from a package.json. Used by the CLI
|
|
53
|
+
* to resolve the entry point of a discovered check package.
|
|
54
|
+
*/
|
|
55
|
+
export interface CheckPackageMetadata {
|
|
56
|
+
readonly name: string;
|
|
57
|
+
readonly mainEntry: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the `plugins.checkPackages` and `plugins.autoDiscoverChecks`
|
|
61
|
+
* fields from the project's opensip-tools.config.yml without doing a
|
|
62
|
+
* full schema parse. Returns the raw values so callers can apply the
|
|
63
|
+
* resolution rules in `discoverCheckPackages()`.
|
|
64
|
+
*
|
|
65
|
+
* Mirrors the inline-yaml-read pattern used by readProjectPluginsList()
|
|
66
|
+
* — avoids a circular dep between plugins/ and targets/.
|
|
67
|
+
*/
|
|
68
|
+
export declare function readCheckPackagePreferences(projectDir: string): {
|
|
69
|
+
readonly checkPackages?: readonly string[];
|
|
70
|
+
readonly autoDiscoverChecks?: boolean;
|
|
71
|
+
};
|
|
72
|
+
export declare function readCheckPackageMetadata(packageDir: string): CheckPackageMetadata | undefined;
|
|
73
|
+
//# sourceMappingURL=check-package-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-package-discovery.d.ts","sourceRoot":"","sources":["../../src/plugins/check-package-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAoBH,MAAM,WAAW,4BAA4B;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,sBAAsB,EAAE,CAgC1B;AA2DD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC,CAsBA;AAGD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAgC7F"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auto-discovery of @opensip-tools/checks-* packages
|
|
3
|
+
* installed in node_modules.
|
|
4
|
+
*
|
|
5
|
+
* Resolution rules (apply in order):
|
|
6
|
+
*
|
|
7
|
+
* 1. If `plugins.checkPackages` is declared in the project config,
|
|
8
|
+
* that explicit list wins. Auto-discovery is skipped entirely.
|
|
9
|
+
* Lets users pin their check set deterministically.
|
|
10
|
+
*
|
|
11
|
+
* 2. Else if `plugins.autoDiscoverChecks: false` is declared,
|
|
12
|
+
* no additional check packages are loaded. Lets users opt out
|
|
13
|
+
* of dependency-based discovery (e.g. when running in an
|
|
14
|
+
* environment with unrelated @opensip-tools packages installed).
|
|
15
|
+
*
|
|
16
|
+
* 3. Otherwise (default), scan node_modules for any package whose
|
|
17
|
+
* name matches `@opensip-tools/checks-*` and return the list.
|
|
18
|
+
*
|
|
19
|
+
* No package is privileged — what used to be `checks-builtin` is now
|
|
20
|
+
* just one of many `@opensip-tools/checks-*` packages declared as
|
|
21
|
+
* ordinary CLI dependencies and discovered uniformly. The CLI no
|
|
22
|
+
* longer hardcodes any check package import.
|
|
23
|
+
*
|
|
24
|
+
* The walker handles pnpm's nested node_modules layout: it looks at
|
|
25
|
+
* the project's direct node_modules, then walks up to ancestor
|
|
26
|
+
* node_modules (matching Node's resolution algorithm). We don't need
|
|
27
|
+
* to recurse into transitive deps because check packages are expected
|
|
28
|
+
* to be direct dependencies.
|
|
29
|
+
*/
|
|
30
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
31
|
+
import { createRequire } from 'node:module';
|
|
32
|
+
import { dirname, join } from 'node:path';
|
|
33
|
+
import { logger } from '@opensip-tools/core';
|
|
34
|
+
const CONFIG_FILENAME = 'opensip-tools.config.yml';
|
|
35
|
+
// Bridge ESM ↔ CJS: createRequire bound to this module's URL gives us a
|
|
36
|
+
// `require` that resolves js-yaml from this package's own deps. The bare
|
|
37
|
+
// `require('js-yaml')` form fails in ESM because no global require is
|
|
38
|
+
// present; using createRequire(import.meta.url) is the supported escape
|
|
39
|
+
// hatch.
|
|
40
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
41
|
+
const SCOPE = '@opensip-tools';
|
|
42
|
+
const CHECKS_PREFIX = 'checks-';
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the list of check packages to load, applying the ordered
|
|
45
|
+
* resolution rules in the file header. Returns every discovered
|
|
46
|
+
* @opensip-tools/checks-* package; the CLI loads them all uniformly,
|
|
47
|
+
* with no package privileged over another.
|
|
48
|
+
*/
|
|
49
|
+
export function discoverCheckPackages(options) {
|
|
50
|
+
const { projectDir, explicitPackages, autoDiscover = true } = options;
|
|
51
|
+
// Rule 1: explicit list wins
|
|
52
|
+
if (explicitPackages !== undefined) {
|
|
53
|
+
if (explicitPackages.length === 0) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const out = [];
|
|
57
|
+
for (const name of explicitPackages) {
|
|
58
|
+
const dir = resolvePackageDir(projectDir, name);
|
|
59
|
+
if (dir) {
|
|
60
|
+
out.push({ name, packageDir: dir });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
logger.warn({
|
|
64
|
+
evt: 'plugin.check_package.not_resolved',
|
|
65
|
+
module: 'core:plugins',
|
|
66
|
+
name,
|
|
67
|
+
msg: `Configured check package "${name}" is not installed in node_modules — skipping`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
// Rule 2: opt-out
|
|
74
|
+
if (!autoDiscover) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
// Rule 3: auto-discover
|
|
78
|
+
return autoDiscoverChecks(projectDir);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Walk up the directory tree from `projectDir` looking for the first
|
|
82
|
+
* `node_modules/@opensip-tools/` directory and return all `checks-*`
|
|
83
|
+
* package directories found there. Mirrors Node's module resolution
|
|
84
|
+
* (any ancestor node_modules counts), which handles pnpm hoisting and
|
|
85
|
+
* monorepo layouts where the scope may live in the workspace root.
|
|
86
|
+
*/
|
|
87
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- ancestor-walk discovery: walks node_modules trees up the directory tree until the filesystem root
|
|
88
|
+
function autoDiscoverChecks(projectDir) {
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
const out = [];
|
|
91
|
+
let dir = projectDir;
|
|
92
|
+
let prev = '';
|
|
93
|
+
while (dir !== prev) {
|
|
94
|
+
const scopeDir = join(dir, 'node_modules', SCOPE);
|
|
95
|
+
if (existsSync(scopeDir)) {
|
|
96
|
+
for (const entry of safeReaddir(scopeDir)) {
|
|
97
|
+
if (!entry.startsWith(CHECKS_PREFIX))
|
|
98
|
+
continue;
|
|
99
|
+
const name = `${SCOPE}/${entry}`;
|
|
100
|
+
if (seen.has(name))
|
|
101
|
+
continue;
|
|
102
|
+
const packageDir = join(scopeDir, entry);
|
|
103
|
+
if (!hasPackageJson(packageDir))
|
|
104
|
+
continue;
|
|
105
|
+
seen.add(name);
|
|
106
|
+
out.push({ name, packageDir });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
prev = dir;
|
|
110
|
+
dir = dirname(dir);
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
function resolvePackageDir(projectDir, name) {
|
|
115
|
+
let dir = projectDir;
|
|
116
|
+
let prev = '';
|
|
117
|
+
while (dir !== prev) {
|
|
118
|
+
const candidate = join(dir, 'node_modules', name);
|
|
119
|
+
if (hasPackageJson(candidate))
|
|
120
|
+
return candidate;
|
|
121
|
+
prev = dir;
|
|
122
|
+
dir = dirname(dir);
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
function hasPackageJson(packageDir) {
|
|
127
|
+
if (!existsSync(packageDir))
|
|
128
|
+
return false;
|
|
129
|
+
return existsSync(join(packageDir, 'package.json'));
|
|
130
|
+
}
|
|
131
|
+
function safeReaddir(dir) {
|
|
132
|
+
try {
|
|
133
|
+
return readdirSync(dir);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Read the `plugins.checkPackages` and `plugins.autoDiscoverChecks`
|
|
141
|
+
* fields from the project's opensip-tools.config.yml without doing a
|
|
142
|
+
* full schema parse. Returns the raw values so callers can apply the
|
|
143
|
+
* resolution rules in `discoverCheckPackages()`.
|
|
144
|
+
*
|
|
145
|
+
* Mirrors the inline-yaml-read pattern used by readProjectPluginsList()
|
|
146
|
+
* — avoids a circular dep between plugins/ and targets/.
|
|
147
|
+
*/
|
|
148
|
+
export function readCheckPackagePreferences(projectDir) {
|
|
149
|
+
const configPath = join(projectDir, CONFIG_FILENAME);
|
|
150
|
+
if (!existsSync(configPath))
|
|
151
|
+
return {};
|
|
152
|
+
try {
|
|
153
|
+
const raw = readFileSync(configPath, 'utf8');
|
|
154
|
+
const yaml = requireFromHere('js-yaml');
|
|
155
|
+
const doc = yaml.load(raw);
|
|
156
|
+
if (!doc || typeof doc !== 'object')
|
|
157
|
+
return {};
|
|
158
|
+
const plugins = doc.plugins;
|
|
159
|
+
if (!plugins || typeof plugins !== 'object')
|
|
160
|
+
return {};
|
|
161
|
+
const p = plugins;
|
|
162
|
+
const result = {};
|
|
163
|
+
if (Array.isArray(p.checkPackages)) {
|
|
164
|
+
result.checkPackages = p.checkPackages.filter((v) => typeof v === 'string');
|
|
165
|
+
}
|
|
166
|
+
if (typeof p.autoDiscoverChecks === 'boolean') {
|
|
167
|
+
result.autoDiscoverChecks = p.autoDiscoverChecks;
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- exports-map resolution: each branch corresponds to a documented npm exports shape (string, object with import/default/require)
|
|
176
|
+
export function readCheckPackageMetadata(packageDir) {
|
|
177
|
+
const pkgPath = join(packageDir, 'package.json');
|
|
178
|
+
if (!existsSync(pkgPath))
|
|
179
|
+
return undefined;
|
|
180
|
+
try {
|
|
181
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
182
|
+
if (!pkg.name)
|
|
183
|
+
return undefined;
|
|
184
|
+
let mainEntry;
|
|
185
|
+
const exports = pkg.exports;
|
|
186
|
+
if (typeof exports === 'string') {
|
|
187
|
+
mainEntry = exports;
|
|
188
|
+
}
|
|
189
|
+
else if (exports && typeof exports === 'object' && '.' in exports) {
|
|
190
|
+
const dot = exports['.'];
|
|
191
|
+
if (typeof dot === 'string') {
|
|
192
|
+
mainEntry = dot;
|
|
193
|
+
}
|
|
194
|
+
else if (dot && typeof dot === 'object') {
|
|
195
|
+
const obj = dot;
|
|
196
|
+
if (typeof obj.import === 'string')
|
|
197
|
+
mainEntry = obj.import;
|
|
198
|
+
else if (typeof obj.default === 'string')
|
|
199
|
+
mainEntry = obj.default;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!mainEntry && typeof pkg.main === 'string') {
|
|
203
|
+
mainEntry = pkg.main;
|
|
204
|
+
}
|
|
205
|
+
mainEntry ??= './index.js';
|
|
206
|
+
return { name: pkg.name, mainEntry: join(packageDir, mainEntry) };
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=check-package-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-package-discovery.js","sourceRoot":"","sources":["../../src/plugins/check-package-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plugin loader — dynamic import and registration
|
|
3
|
+
*
|
|
4
|
+
* Takes discovered plugins, imports them, validates their exports,
|
|
5
|
+
* and registers checks/recipes with namespaces.
|
|
6
|
+
*/
|
|
7
|
+
import type { DiscoveredPlugin, LoadedPlugin, PluginDomain, PluginLoadResult } from '@opensip-tools/core';
|
|
8
|
+
/**
|
|
9
|
+
* Load a single discovered plugin.
|
|
10
|
+
*
|
|
11
|
+
* For `domain === 'lang'`, the module is expected to export an `adapters`
|
|
12
|
+
* array of LanguageAdapter; each is registered with defaultLanguageRegistry.
|
|
13
|
+
* For other domains, registers checks and recipes with defaultRegistry and
|
|
14
|
+
* defaultRecipeRegistry respectively.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadPlugin(plugin: DiscoveredPlugin, domain?: PluginDomain): Promise<LoadedPlugin>;
|
|
17
|
+
/**
|
|
18
|
+
* Discover and load all plugins for a domain. Loads sequentially to
|
|
19
|
+
* ensure deterministic registration order.
|
|
20
|
+
*
|
|
21
|
+
* Discovers loose `.mjs` files under
|
|
22
|
+
* `<projectDir>/opensip-tools/<tool>/{checks,recipes,scenarios}/` plus
|
|
23
|
+
* any npm-installed packages in
|
|
24
|
+
* `<projectDir>/opensip-tools/.runtime/plugins/<domain>/node_modules/`
|
|
25
|
+
* that are listed in `plugins.<domain>` in the project config.
|
|
26
|
+
*
|
|
27
|
+
* Without a `projectDir`, no plugins are loaded — there's no
|
|
28
|
+
* user-global fallback.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadAllPlugins(domain: PluginDomain, projectDir?: string): Promise<PluginLoadResult>;
|
|
31
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EACV,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAK5B;;;;;;;GAOG;AAEH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,YAAoB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAmOvB;AAqBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plugin loader — dynamic import and registration
|
|
3
|
+
*
|
|
4
|
+
* Takes discovered plugins, imports them, validates their exports,
|
|
5
|
+
* and registers checks/recipes with namespaces.
|
|
6
|
+
*/
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { logger, defaultLanguageRegistry, discoverPlugins } from '@opensip-tools/core';
|
|
9
|
+
import { isCheck } from '../framework/check-types.js';
|
|
10
|
+
import { defaultRegistry } from '../framework/registry.js';
|
|
11
|
+
import { defaultRecipeRegistry } from '../recipes/registry.js';
|
|
12
|
+
/** Logger module tag used by every event emitted from this loader. */
|
|
13
|
+
const MODULE_TAG = 'core:plugins';
|
|
14
|
+
/**
|
|
15
|
+
* Load a single discovered plugin.
|
|
16
|
+
*
|
|
17
|
+
* For `domain === 'lang'`, the module is expected to export an `adapters`
|
|
18
|
+
* array of LanguageAdapter; each is registered with defaultLanguageRegistry.
|
|
19
|
+
* For other domains, registers checks and recipes with defaultRegistry and
|
|
20
|
+
* defaultRecipeRegistry respectively.
|
|
21
|
+
*/
|
|
22
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- plugin loader dispatcher: handles three domains and lifecycle (validate, register, error-wrap) inline; splitting fragments error context
|
|
23
|
+
export async function loadPlugin(plugin, domain = 'fit') {
|
|
24
|
+
try {
|
|
25
|
+
const moduleUrl = pathToFileURL(plugin.entryPoint).href;
|
|
26
|
+
const mod = await import(moduleUrl);
|
|
27
|
+
let checksRegistered = 0;
|
|
28
|
+
let recipesRegistered = 0;
|
|
29
|
+
let adaptersRegistered = 0;
|
|
30
|
+
// Lang domain: register language adapters from `adapters` array,
|
|
31
|
+
// named exports, and default export. Adapters are deduplicated by id.
|
|
32
|
+
if (domain === 'lang') {
|
|
33
|
+
const registeredAdapterIds = new Set();
|
|
34
|
+
const tryRegisterAdapter = (value, sourceLabel) => {
|
|
35
|
+
if (!looksLikeLanguageAdapter(value))
|
|
36
|
+
return;
|
|
37
|
+
const id = value.id;
|
|
38
|
+
if (registeredAdapterIds.has(id))
|
|
39
|
+
return;
|
|
40
|
+
defaultLanguageRegistry.register(value);
|
|
41
|
+
registeredAdapterIds.add(id);
|
|
42
|
+
adaptersRegistered++;
|
|
43
|
+
logger.debug({
|
|
44
|
+
evt: 'plugin.loader.adapter.registered',
|
|
45
|
+
module: MODULE_TAG,
|
|
46
|
+
namespace: plugin.namespace,
|
|
47
|
+
source: sourceLabel,
|
|
48
|
+
id,
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
if (mod.adapters !== undefined) {
|
|
52
|
+
if (Array.isArray(mod.adapters)) {
|
|
53
|
+
for (const [index, adapter] of mod.adapters.entries()) {
|
|
54
|
+
if (looksLikeLanguageAdapter(adapter)) {
|
|
55
|
+
tryRegisterAdapter(adapter, `adapters[${index}]`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
logger.warn({
|
|
59
|
+
evt: 'plugin.loader.invalid_adapter_item',
|
|
60
|
+
module: MODULE_TAG,
|
|
61
|
+
namespace: plugin.namespace,
|
|
62
|
+
source: plugin.source,
|
|
63
|
+
index,
|
|
64
|
+
msg: `Plugin "${plugin.namespace}" adapters[${index}] is not a valid LanguageAdapter — skipping.`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
logger.warn({
|
|
71
|
+
evt: 'plugin.loader.invalid_adapters_export',
|
|
72
|
+
module: MODULE_TAG,
|
|
73
|
+
namespace: plugin.namespace,
|
|
74
|
+
source: plugin.source,
|
|
75
|
+
msg: `Plugin "${plugin.namespace}" exports "adapters" but it is not an array — skipping adapter registration.`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Named exports that look like LanguageAdapter
|
|
80
|
+
for (const [exportName, value] of Object.entries(mod)) {
|
|
81
|
+
if (exportName === 'default' ||
|
|
82
|
+
exportName === 'adapters' ||
|
|
83
|
+
exportName === 'checks' ||
|
|
84
|
+
exportName === 'recipes' ||
|
|
85
|
+
exportName === 'metadata')
|
|
86
|
+
continue;
|
|
87
|
+
tryRegisterAdapter(value, `named:${exportName}`);
|
|
88
|
+
}
|
|
89
|
+
// Default export: a single LanguageAdapter
|
|
90
|
+
const defaultExport = mod.default;
|
|
91
|
+
tryRegisterAdapter(defaultExport, 'default');
|
|
92
|
+
}
|
|
93
|
+
// Register checks with namespace (skipped for lang domain).
|
|
94
|
+
//
|
|
95
|
+
// Two authorship styles are supported:
|
|
96
|
+
// 1. `export const checks = [...]` — array of Check instances
|
|
97
|
+
// 2. `export const myCheck = defineCheck({...})` — Check as a named export
|
|
98
|
+
//
|
|
99
|
+
// Style 2 enables single-file plugins that drop into ~/.opensip-tools/fit/
|
|
100
|
+
// to author one check per file without a redundant array wrapper.
|
|
101
|
+
// Both styles can coexist in the same module; checks are deduplicated by
|
|
102
|
+
// their stable id so a check appearing in both an array and a named
|
|
103
|
+
// export is registered exactly once.
|
|
104
|
+
if (domain !== 'lang') {
|
|
105
|
+
const registeredIds = new Set();
|
|
106
|
+
// Style 1: explicit `checks` array
|
|
107
|
+
if (mod.checks !== undefined) {
|
|
108
|
+
if (Array.isArray(mod.checks)) {
|
|
109
|
+
for (const [index, check] of mod.checks.entries()) {
|
|
110
|
+
if (isCheck(check)) {
|
|
111
|
+
if (!registeredIds.has(check.config.id)) {
|
|
112
|
+
defaultRegistry.register(check, plugin.namespace);
|
|
113
|
+
registeredIds.add(check.config.id);
|
|
114
|
+
checksRegistered++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
logger.warn({
|
|
119
|
+
evt: 'plugin.loader.invalid_check_item',
|
|
120
|
+
module: MODULE_TAG,
|
|
121
|
+
namespace: plugin.namespace,
|
|
122
|
+
source: plugin.source,
|
|
123
|
+
index,
|
|
124
|
+
msg: `Plugin "${plugin.namespace}" checks[${index}] is not a valid Check object — skipping.`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
logger.warn({
|
|
131
|
+
evt: 'plugin.loader.invalid_checks_export',
|
|
132
|
+
module: MODULE_TAG,
|
|
133
|
+
namespace: plugin.namespace,
|
|
134
|
+
source: plugin.source,
|
|
135
|
+
msg: `Plugin "${plugin.namespace}" exports "checks" but it is not an array — skipping checks registration.`,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Style 2: any named export that is a Check instance
|
|
140
|
+
for (const [exportName, value] of Object.entries(mod)) {
|
|
141
|
+
if (exportName === 'default' || exportName === 'checks' || exportName === 'recipes' || exportName === 'metadata')
|
|
142
|
+
continue;
|
|
143
|
+
if (isCheck(value) && !registeredIds.has(value.config.id)) {
|
|
144
|
+
defaultRegistry.register(value, plugin.namespace);
|
|
145
|
+
registeredIds.add(value.config.id);
|
|
146
|
+
checksRegistered++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Default export: a single Check instance
|
|
150
|
+
const defaultExport = mod.default;
|
|
151
|
+
if (isCheck(defaultExport) && !registeredIds.has(defaultExport.config.id)) {
|
|
152
|
+
defaultRegistry.register(defaultExport, plugin.namespace);
|
|
153
|
+
registeredIds.add(defaultExport.config.id);
|
|
154
|
+
checksRegistered++;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Register recipes (skipped for lang domain)
|
|
158
|
+
if (domain !== 'lang' && mod.recipes !== undefined) {
|
|
159
|
+
const recipes = mod.recipes;
|
|
160
|
+
for (const [index, recipe] of recipes.entries()) {
|
|
161
|
+
if (recipe && typeof recipe === 'object' && 'id' in recipe && 'name' in recipe) {
|
|
162
|
+
try {
|
|
163
|
+
defaultRecipeRegistry.register(recipe, { allowOverwrite: false });
|
|
164
|
+
recipesRegistered++;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Duplicate recipe — skip silently
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
logger.warn({
|
|
172
|
+
evt: 'plugin.loader.invalid_recipe_item',
|
|
173
|
+
module: MODULE_TAG,
|
|
174
|
+
namespace: plugin.namespace,
|
|
175
|
+
source: plugin.source,
|
|
176
|
+
index,
|
|
177
|
+
msg: `Plugin "${plugin.namespace}" recipes[${index}] is not a valid Recipe object (missing id or name) — skipping.`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Warn only when nothing was registered. With named-export discovery,
|
|
183
|
+
// counting actual registrations is more accurate than checking which
|
|
184
|
+
// declared exports were present.
|
|
185
|
+
const nothingRegistered = domain === 'lang'
|
|
186
|
+
? adaptersRegistered === 0
|
|
187
|
+
: checksRegistered === 0 && recipesRegistered === 0;
|
|
188
|
+
if (nothingRegistered) {
|
|
189
|
+
logger.warn({
|
|
190
|
+
evt: 'plugin.loader.no_exports',
|
|
191
|
+
module: MODULE_TAG,
|
|
192
|
+
namespace: plugin.namespace,
|
|
193
|
+
source: plugin.source,
|
|
194
|
+
domain,
|
|
195
|
+
msg: domain === 'lang'
|
|
196
|
+
? `Plugin "${plugin.namespace}" registered no language adapters — nothing to use.`
|
|
197
|
+
: `Plugin "${plugin.namespace}" registered no checks or recipes — nothing to run.`,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
logger.info({
|
|
201
|
+
evt: 'plugin.loader.load.success',
|
|
202
|
+
module: MODULE_TAG,
|
|
203
|
+
namespace: plugin.namespace,
|
|
204
|
+
source: plugin.source,
|
|
205
|
+
domain,
|
|
206
|
+
checksRegistered,
|
|
207
|
+
recipesRegistered,
|
|
208
|
+
adaptersRegistered,
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
namespace: plugin.namespace,
|
|
212
|
+
source: plugin.source,
|
|
213
|
+
type: plugin.type,
|
|
214
|
+
checksRegistered,
|
|
215
|
+
recipesRegistered,
|
|
216
|
+
adaptersRegistered,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
221
|
+
logger.warn({
|
|
222
|
+
evt: 'plugin.loader.load.error',
|
|
223
|
+
module: MODULE_TAG,
|
|
224
|
+
namespace: plugin.namespace,
|
|
225
|
+
source: plugin.source,
|
|
226
|
+
error: errorMsg,
|
|
227
|
+
err: error instanceof Error ? error : undefined,
|
|
228
|
+
msg: `Plugin "${plugin.namespace}" failed to load: ${errorMsg}. Continuing without this plugin.`,
|
|
229
|
+
});
|
|
230
|
+
return {
|
|
231
|
+
namespace: plugin.namespace,
|
|
232
|
+
source: plugin.source,
|
|
233
|
+
type: plugin.type,
|
|
234
|
+
checksRegistered: 0,
|
|
235
|
+
recipesRegistered: 0,
|
|
236
|
+
adaptersRegistered: 0,
|
|
237
|
+
error: errorMsg,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Structural check for LanguageAdapter — used by the lang plugin domain
|
|
243
|
+
* to identify adapter values among arbitrary named exports. We don't
|
|
244
|
+
* have a runtime type guard equivalent to isCheck() for adapters, so
|
|
245
|
+
* we duck-type the required surface (`id`, `fileExtensions`, `parse`,
|
|
246
|
+
* `stripStrings`, `stripComments`).
|
|
247
|
+
*/
|
|
248
|
+
function looksLikeLanguageAdapter(value) {
|
|
249
|
+
if (!value || typeof value !== 'object')
|
|
250
|
+
return false;
|
|
251
|
+
const v = value;
|
|
252
|
+
return (typeof v.id === 'string' &&
|
|
253
|
+
Array.isArray(v.fileExtensions) &&
|
|
254
|
+
typeof v.parse === 'function' &&
|
|
255
|
+
typeof v.stripStrings === 'function' &&
|
|
256
|
+
typeof v.stripComments === 'function');
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Discover and load all plugins for a domain. Loads sequentially to
|
|
260
|
+
* ensure deterministic registration order.
|
|
261
|
+
*
|
|
262
|
+
* Discovers loose `.mjs` files under
|
|
263
|
+
* `<projectDir>/opensip-tools/<tool>/{checks,recipes,scenarios}/` plus
|
|
264
|
+
* any npm-installed packages in
|
|
265
|
+
* `<projectDir>/opensip-tools/.runtime/plugins/<domain>/node_modules/`
|
|
266
|
+
* that are listed in `plugins.<domain>` in the project config.
|
|
267
|
+
*
|
|
268
|
+
* Without a `projectDir`, no plugins are loaded — there's no
|
|
269
|
+
* user-global fallback.
|
|
270
|
+
*/
|
|
271
|
+
export async function loadAllPlugins(domain, projectDir) {
|
|
272
|
+
const discovered = discoverPlugins(domain, projectDir);
|
|
273
|
+
const plugins = [];
|
|
274
|
+
const errors = [];
|
|
275
|
+
for (const plugin of discovered) {
|
|
276
|
+
const result = await loadPlugin(plugin, domain);
|
|
277
|
+
plugins.push(result);
|
|
278
|
+
if (result.error) {
|
|
279
|
+
errors.push(`${result.source}: ${result.error}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
plugins,
|
|
284
|
+
totalChecks: plugins.reduce((sum, p) => sum + p.checksRegistered, 0),
|
|
285
|
+
totalRecipes: plugins.reduce((sum, p) => sum + p.recipesRegistered, 0),
|
|
286
|
+
totalAdapters: plugins.reduce((sum, p) => sum + (p.adaptersRegistered ?? 0), 0),
|
|
287
|
+
errors,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Fitness plugin export contract
|
|
3
|
+
*
|
|
4
|
+
* What an @opensip-tools/checks-* (or any fit-domain plugin) exports.
|
|
5
|
+
* Held in fitness because it references Check / FitnessRecipe — types
|
|
6
|
+
* the kernel doesn't know about.
|
|
7
|
+
*/
|
|
8
|
+
import type { Check } from '../framework/check-types.js';
|
|
9
|
+
import type { FitnessRecipe } from '../recipes/types.js';
|
|
10
|
+
import type { CheckDisplayEntry, PluginMetadata } from '@opensip-tools/core';
|
|
11
|
+
/** What a fitness plugin package/file exports */
|
|
12
|
+
export interface FitPluginExports {
|
|
13
|
+
readonly checks?: readonly Check[];
|
|
14
|
+
readonly recipes?: readonly FitnessRecipe[];
|
|
15
|
+
readonly metadata?: PluginMetadata;
|
|
16
|
+
/**
|
|
17
|
+
* Optional display map: check slug → [icon, displayName].
|
|
18
|
+
* The CLI merges these from every loaded check package and uses
|
|
19
|
+
* the merged map when rendering tables and dashboard catalog entries.
|
|
20
|
+
*/
|
|
21
|
+
readonly checkDisplay?: Readonly<Record<string, CheckDisplayEntry>>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|