@opensip-cli/graph 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/baseline-plane.test.d.ts +11 -0
- package/dist/__tests__/baseline-plane.test.d.ts.map +1 -0
- package/dist/__tests__/baseline-plane.test.js +60 -0
- package/dist/__tests__/baseline-plane.test.js.map +1 -0
- package/dist/__tests__/cache/engine-version.test.d.ts +12 -0
- package/dist/__tests__/cache/engine-version.test.d.ts.map +1 -0
- package/dist/__tests__/cache/engine-version.test.js +79 -0
- package/dist/__tests__/cache/engine-version.test.js.map +1 -0
- package/dist/__tests__/cache/invalidate.test.d.ts +9 -0
- package/dist/__tests__/cache/invalidate.test.d.ts.map +1 -0
- package/dist/__tests__/cache/invalidate.test.js +228 -0
- package/dist/__tests__/cache/invalidate.test.js.map +1 -0
- package/dist/__tests__/cli/contribution-from-signals.test.d.ts +17 -0
- package/dist/__tests__/cli/contribution-from-signals.test.d.ts.map +1 -0
- package/dist/__tests__/cli/contribution-from-signals.test.js +89 -0
- package/dist/__tests__/cli/contribution-from-signals.test.js.map +1 -0
- package/dist/__tests__/cli/detect.test.d.ts +2 -0
- package/dist/__tests__/cli/detect.test.d.ts.map +1 -0
- package/dist/__tests__/cli/detect.test.js +96 -0
- package/dist/__tests__/cli/detect.test.js.map +1 -0
- package/dist/__tests__/cli/graph-config.test.d.ts +9 -0
- package/dist/__tests__/cli/graph-config.test.d.ts.map +1 -0
- package/dist/__tests__/cli/graph-config.test.js +113 -0
- package/dist/__tests__/cli/graph-config.test.js.map +1 -0
- package/dist/__tests__/cli/graph-execute.test.d.ts +9 -0
- package/dist/__tests__/cli/graph-execute.test.d.ts.map +1 -0
- package/dist/__tests__/cli/graph-execute.test.js +434 -0
- package/dist/__tests__/cli/graph-execute.test.js.map +1 -0
- package/dist/__tests__/cli/graph.test.d.ts +12 -0
- package/dist/__tests__/cli/graph.test.d.ts.map +1 -0
- package/dist/__tests__/cli/graph.test.js +589 -0
- package/dist/__tests__/cli/graph.test.js.map +1 -0
- package/dist/__tests__/cli/heap-preflight.test.d.ts +11 -0
- package/dist/__tests__/cli/heap-preflight.test.d.ts.map +1 -0
- package/dist/__tests__/cli/heap-preflight.test.js +150 -0
- package/dist/__tests__/cli/heap-preflight.test.js.map +1 -0
- package/dist/__tests__/cli/language-mismatch.test.d.ts +10 -0
- package/dist/__tests__/cli/language-mismatch.test.d.ts.map +1 -0
- package/dist/__tests__/cli/language-mismatch.test.js +155 -0
- package/dist/__tests__/cli/language-mismatch.test.js.map +1 -0
- package/dist/__tests__/cli/lookup.test.d.ts +7 -0
- package/dist/__tests__/cli/lookup.test.d.ts.map +1 -0
- package/dist/__tests__/cli/lookup.test.js +104 -0
- package/dist/__tests__/cli/lookup.test.js.map +1 -0
- package/dist/__tests__/cli/orchestrate.test.d.ts +12 -0
- package/dist/__tests__/cli/orchestrate.test.d.ts.map +1 -0
- package/dist/__tests__/cli/orchestrate.test.js +315 -0
- package/dist/__tests__/cli/orchestrate.test.js.map +1 -0
- package/dist/__tests__/cli/positional-paths.test.d.ts +5 -0
- package/dist/__tests__/cli/positional-paths.test.d.ts.map +1 -0
- package/dist/__tests__/cli/positional-paths.test.js +87 -0
- package/dist/__tests__/cli/positional-paths.test.js.map +1 -0
- package/dist/__tests__/cli/pressure-monitor.test.d.ts +11 -0
- package/dist/__tests__/cli/pressure-monitor.test.d.ts.map +1 -0
- package/dist/__tests__/cli/pressure-monitor.test.js +94 -0
- package/dist/__tests__/cli/pressure-monitor.test.js.map +1 -0
- package/dist/__tests__/cli/sarif-export.test.d.ts +8 -0
- package/dist/__tests__/cli/sarif-export.test.d.ts.map +1 -0
- package/dist/__tests__/cli/sarif-export.test.js +94 -0
- package/dist/__tests__/cli/sarif-export.test.js.map +1 -0
- package/dist/__tests__/cli/session-contract.test.d.ts +17 -0
- package/dist/__tests__/cli/session-contract.test.d.ts.map +1 -0
- package/dist/__tests__/cli/session-contract.test.js +225 -0
- package/dist/__tests__/cli/session-contract.test.js.map +1 -0
- package/dist/__tests__/cli/symbol-index.test.d.ts +7 -0
- package/dist/__tests__/cli/symbol-index.test.d.ts.map +1 -0
- package/dist/__tests__/cli/symbol-index.test.js +117 -0
- package/dist/__tests__/cli/symbol-index.test.js.map +1 -0
- package/dist/__tests__/cli/tool-show-mode.test.d.ts +10 -0
- package/dist/__tests__/cli/tool-show-mode.test.d.ts.map +1 -0
- package/dist/__tests__/cli/tool-show-mode.test.js +128 -0
- package/dist/__tests__/cli/tool-show-mode.test.js.map +1 -0
- package/dist/__tests__/cli/workspace-runner-polyglot.test.d.ts +10 -0
- package/dist/__tests__/cli/workspace-runner-polyglot.test.d.ts.map +1 -0
- package/dist/__tests__/cli/workspace-runner-polyglot.test.js +120 -0
- package/dist/__tests__/cli/workspace-runner-polyglot.test.js.map +1 -0
- package/dist/__tests__/graph-catalog-drift.test.d.ts +24 -0
- package/dist/__tests__/graph-catalog-drift.test.d.ts.map +1 -0
- package/dist/__tests__/graph-catalog-drift.test.js +34 -0
- package/dist/__tests__/graph-catalog-drift.test.js.map +1 -0
- package/dist/__tests__/internal-surface.test.d.ts +17 -0
- package/dist/__tests__/internal-surface.test.d.ts.map +1 -0
- package/dist/__tests__/internal-surface.test.js +45 -0
- package/dist/__tests__/internal-surface.test.js.map +1 -0
- package/dist/__tests__/lang-adapter/body-digest.test.d.ts +13 -0
- package/dist/__tests__/lang-adapter/body-digest.test.d.ts.map +1 -0
- package/dist/__tests__/lang-adapter/body-digest.test.js +51 -0
- package/dist/__tests__/lang-adapter/body-digest.test.js.map +1 -0
- package/dist/__tests__/lang-adapter/edge-helpers.test.d.ts +12 -0
- package/dist/__tests__/lang-adapter/edge-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/lang-adapter/edge-helpers.test.js +147 -0
- package/dist/__tests__/lang-adapter/edge-helpers.test.js.map +1 -0
- package/dist/__tests__/lang-adapter/registry.test.d.ts +9 -0
- package/dist/__tests__/lang-adapter/registry.test.d.ts.map +1 -0
- package/dist/__tests__/lang-adapter/registry.test.js +228 -0
- package/dist/__tests__/lang-adapter/registry.test.js.map +1 -0
- package/dist/__tests__/persistence/catalog-repo.test.d.ts +2 -0
- package/dist/__tests__/persistence/catalog-repo.test.d.ts.map +1 -0
- package/dist/__tests__/persistence/catalog-repo.test.js +188 -0
- package/dist/__tests__/persistence/catalog-repo.test.js.map +1 -0
- package/dist/__tests__/persistence/session-payload.test.d.ts +2 -0
- package/dist/__tests__/persistence/session-payload.test.d.ts.map +1 -0
- package/dist/__tests__/persistence/session-payload.test.js +81 -0
- package/dist/__tests__/persistence/session-payload.test.js.map +1 -0
- package/dist/__tests__/persistence/session-replay.test.d.ts +10 -0
- package/dist/__tests__/persistence/session-replay.test.d.ts.map +1 -0
- package/dist/__tests__/persistence/session-replay.test.js +196 -0
- package/dist/__tests__/persistence/session-replay.test.js.map +1 -0
- package/dist/__tests__/public-api.test.d.ts +19 -0
- package/dist/__tests__/public-api.test.d.ts.map +1 -0
- package/dist/__tests__/public-api.test.js +96 -0
- package/dist/__tests__/public-api.test.js.map +1 -0
- package/dist/__tests__/render/catalog-json-types.test.d.ts +10 -0
- package/dist/__tests__/render/catalog-json-types.test.d.ts.map +1 -0
- package/dist/__tests__/render/catalog-json-types.test.js +121 -0
- package/dist/__tests__/render/catalog-json-types.test.js.map +1 -0
- package/dist/__tests__/render/catalog-json.test.d.ts +19 -0
- package/dist/__tests__/render/catalog-json.test.d.ts.map +1 -0
- package/dist/__tests__/render/catalog-json.test.js +435 -0
- package/dist/__tests__/render/catalog-json.test.js.map +1 -0
- package/dist/__tests__/render/opensip-id-derivation.test.d.ts +21 -0
- package/dist/__tests__/render/opensip-id-derivation.test.d.ts.map +1 -0
- package/dist/__tests__/render/opensip-id-derivation.test.js +159 -0
- package/dist/__tests__/render/opensip-id-derivation.test.js.map +1 -0
- package/dist/__tests__/render/rule-id-mapping.test.d.ts +13 -0
- package/dist/__tests__/render/rule-id-mapping.test.d.ts.map +1 -0
- package/dist/__tests__/render/rule-id-mapping.test.js +50 -0
- package/dist/__tests__/render/rule-id-mapping.test.js.map +1 -0
- package/dist/__tests__/render/sarif-opensip.test.d.ts +20 -0
- package/dist/__tests__/render/sarif-opensip.test.d.ts.map +1 -0
- package/dist/__tests__/render/sarif-opensip.test.js +235 -0
- package/dist/__tests__/render/sarif-opensip.test.js.map +1 -0
- package/dist/__tests__/resolution-mode.test.d.ts +10 -0
- package/dist/__tests__/resolution-mode.test.d.ts.map +1 -0
- package/dist/__tests__/resolution-mode.test.js +96 -0
- package/dist/__tests__/resolution-mode.test.js.map +1 -0
- package/dist/__tests__/resolve-callee.test.d.ts +2 -0
- package/dist/__tests__/resolve-callee.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-callee.test.js +119 -0
- package/dist/__tests__/resolve-callee.test.js.map +1 -0
- package/dist/__tests__/rules/_entry-points.test.d.ts +8 -0
- package/dist/__tests__/rules/_entry-points.test.d.ts.map +1 -0
- package/dist/__tests__/rules/_entry-points.test.js +74 -0
- package/dist/__tests__/rules/_entry-points.test.js.map +1 -0
- package/dist/__tests__/rules/_helpers.d.ts +18 -0
- package/dist/__tests__/rules/_helpers.d.ts.map +1 -0
- package/dist/__tests__/rules/_helpers.js +72 -0
- package/dist/__tests__/rules/_helpers.js.map +1 -0
- package/dist/__tests__/rules/always-throws-branch.test.d.ts +9 -0
- package/dist/__tests__/rules/always-throws-branch.test.d.ts.map +1 -0
- package/dist/__tests__/rules/always-throws-branch.test.js +113 -0
- package/dist/__tests__/rules/always-throws-branch.test.js.map +1 -0
- package/dist/__tests__/rules/cycle-and-coupling.test.d.ts +13 -0
- package/dist/__tests__/rules/cycle-and-coupling.test.d.ts.map +1 -0
- package/dist/__tests__/rules/cycle-and-coupling.test.js +224 -0
- package/dist/__tests__/rules/cycle-and-coupling.test.js.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body-config.test.d.ts +8 -0
- package/dist/__tests__/rules/duplicated-function-body-config.test.d.ts.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body-config.test.js +132 -0
- package/dist/__tests__/rules/duplicated-function-body-config.test.js.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body-cross-package.test.d.ts +10 -0
- package/dist/__tests__/rules/duplicated-function-body-cross-package.test.d.ts.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body-cross-package.test.js +274 -0
- package/dist/__tests__/rules/duplicated-function-body-cross-package.test.js.map +1 -0
- package/dist/__tests__/rules/feature-column-parity.test.d.ts +11 -0
- package/dist/__tests__/rules/feature-column-parity.test.d.ts.map +1 -0
- package/dist/__tests__/rules/feature-column-parity.test.js +169 -0
- package/dist/__tests__/rules/feature-column-parity.test.js.map +1 -0
- package/dist/__tests__/rules/high-blast-untested.test.d.ts +13 -0
- package/dist/__tests__/rules/high-blast-untested.test.d.ts.map +1 -0
- package/dist/__tests__/rules/high-blast-untested.test.js +108 -0
- package/dist/__tests__/rules/high-blast-untested.test.js.map +1 -0
- package/dist/__tests__/rules/large-function.test.d.ts +11 -0
- package/dist/__tests__/rules/large-function.test.d.ts.map +1 -0
- package/dist/__tests__/rules/large-function.test.js +105 -0
- package/dist/__tests__/rules/large-function.test.js.map +1 -0
- package/dist/__tests__/rules/no-side-effect-path.test.d.ts +10 -0
- package/dist/__tests__/rules/no-side-effect-path.test.d.ts.map +1 -0
- package/dist/__tests__/rules/no-side-effect-path.test.js +301 -0
- package/dist/__tests__/rules/no-side-effect-path.test.js.map +1 -0
- package/dist/__tests__/rules/orphan-subtree-config.test.d.ts +8 -0
- package/dist/__tests__/rules/orphan-subtree-config.test.d.ts.map +1 -0
- package/dist/__tests__/rules/orphan-subtree-config.test.js +176 -0
- package/dist/__tests__/rules/orphan-subtree-config.test.js.map +1 -0
- package/dist/__tests__/rules/registry.test.d.ts +11 -0
- package/dist/__tests__/rules/registry.test.d.ts.map +1 -0
- package/dist/__tests__/rules/registry.test.js +50 -0
- package/dist/__tests__/rules/registry.test.js.map +1 -0
- package/dist/__tests__/rules/severity-override.test.d.ts +11 -0
- package/dist/__tests__/rules/severity-override.test.d.ts.map +1 -0
- package/dist/__tests__/rules/severity-override.test.js +67 -0
- package/dist/__tests__/rules/severity-override.test.js.map +1 -0
- package/dist/__tests__/rules/test-only-reachable.test.d.ts +9 -0
- package/dist/__tests__/rules/test-only-reachable.test.d.ts.map +1 -0
- package/dist/__tests__/rules/test-only-reachable.test.js +142 -0
- package/dist/__tests__/rules/test-only-reachable.test.js.map +1 -0
- package/dist/__tests__/rules/wide-function.test.d.ts +9 -0
- package/dist/__tests__/rules/wide-function.test.d.ts.map +1 -0
- package/dist/__tests__/rules/wide-function.test.js +64 -0
- package/dist/__tests__/rules/wide-function.test.js.map +1 -0
- package/dist/__tests__/test-utils/with-graph-scope.d.ts +14 -0
- package/dist/__tests__/test-utils/with-graph-scope.d.ts.map +1 -0
- package/dist/__tests__/test-utils/with-graph-scope.js +26 -0
- package/dist/__tests__/test-utils/with-graph-scope.js.map +1 -0
- package/dist/__tests__/tool-branches.test.d.ts +18 -0
- package/dist/__tests__/tool-branches.test.d.ts.map +1 -0
- package/dist/__tests__/tool-branches.test.js +262 -0
- package/dist/__tests__/tool-branches.test.js.map +1 -0
- package/dist/__tests__/tool-register.test.d.ts +16 -0
- package/dist/__tests__/tool-register.test.d.ts.map +1 -0
- package/dist/__tests__/tool-register.test.js +419 -0
- package/dist/__tests__/tool-register.test.js.map +1 -0
- package/dist/__tests__/tool.test.d.ts +18 -0
- package/dist/__tests__/tool.test.d.ts.map +1 -0
- package/dist/__tests__/tool.test.js +65 -0
- package/dist/__tests__/tool.test.js.map +1 -0
- package/dist/baseline-strategy.d.ts +28 -0
- package/dist/baseline-strategy.d.ts.map +1 -0
- package/dist/baseline-strategy.js +27 -0
- package/dist/baseline-strategy.js.map +1 -0
- package/dist/cache/engine-version.d.ts +69 -0
- package/dist/cache/engine-version.d.ts.map +1 -0
- package/dist/cache/engine-version.js +60 -0
- package/dist/cache/engine-version.js.map +1 -0
- package/dist/cache/invalidate.d.ts +60 -0
- package/dist/cache/invalidate.d.ts.map +1 -0
- package/dist/cache/invalidate.js +120 -0
- package/dist/cache/invalidate.js.map +1 -0
- package/dist/cli/__tests__/build-envelope.test.d.ts +8 -0
- package/dist/cli/__tests__/build-envelope.test.d.ts.map +1 -0
- package/dist/cli/__tests__/build-envelope.test.js +70 -0
- package/dist/cli/__tests__/build-envelope.test.js.map +1 -0
- package/dist/cli/__tests__/dispatch-envelope.test.d.ts +15 -0
- package/dist/cli/__tests__/dispatch-envelope.test.d.ts.map +1 -0
- package/dist/cli/__tests__/dispatch-envelope.test.js +73 -0
- package/dist/cli/__tests__/dispatch-envelope.test.js.map +1 -0
- package/dist/cli/__tests__/dispatch-suppression-root.test.d.ts +18 -0
- package/dist/cli/__tests__/dispatch-suppression-root.test.d.ts.map +1 -0
- package/dist/cli/__tests__/dispatch-suppression-root.test.js +91 -0
- package/dist/cli/__tests__/dispatch-suppression-root.test.js.map +1 -0
- package/dist/cli/__tests__/graph-config-schema.test.d.ts +7 -0
- package/dist/cli/__tests__/graph-config-schema.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-config-schema.test.js +60 -0
- package/dist/cli/__tests__/graph-config-schema.test.js.map +1 -0
- package/dist/cli/__tests__/graph-gate-mode.test.d.ts +15 -0
- package/dist/cli/__tests__/graph-gate-mode.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-gate-mode.test.js +99 -0
- package/dist/cli/__tests__/graph-gate-mode.test.js.map +1 -0
- package/dist/cli/__tests__/graph-recipes.test.d.ts +7 -0
- package/dist/cli/__tests__/graph-recipes.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-recipes.test.js +24 -0
- package/dist/cli/__tests__/graph-recipes.test.js.map +1 -0
- package/dist/cli/__tests__/graph-report.test.d.ts +7 -0
- package/dist/cli/__tests__/graph-report.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-report.test.js +138 -0
- package/dist/cli/__tests__/graph-report.test.js.map +1 -0
- package/dist/cli/__tests__/graph-tracer.test.d.ts +11 -0
- package/dist/cli/__tests__/graph-tracer.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-tracer.test.js +41 -0
- package/dist/cli/__tests__/graph-tracer.test.js.map +1 -0
- package/dist/cli/__tests__/graph-worker.test.d.ts +13 -0
- package/dist/cli/__tests__/graph-worker.test.d.ts.map +1 -0
- package/dist/cli/__tests__/graph-worker.test.js +127 -0
- package/dist/cli/__tests__/graph-worker.test.js.map +1 -0
- package/dist/cli/__tests__/list-files.test.d.ts +12 -0
- package/dist/cli/__tests__/list-files.test.d.ts.map +1 -0
- package/dist/cli/__tests__/list-files.test.js +146 -0
- package/dist/cli/__tests__/list-files.test.js.map +1 -0
- package/dist/cli/__tests__/live-suppression-parity.test.d.ts +23 -0
- package/dist/cli/__tests__/live-suppression-parity.test.d.ts.map +1 -0
- package/dist/cli/__tests__/live-suppression-parity.test.js +136 -0
- package/dist/cli/__tests__/live-suppression-parity.test.js.map +1 -0
- package/dist/cli/__tests__/orchestrate-spans.test.d.ts +18 -0
- package/dist/cli/__tests__/orchestrate-spans.test.d.ts.map +1 -0
- package/dist/cli/__tests__/orchestrate-spans.test.js +108 -0
- package/dist/cli/__tests__/orchestrate-spans.test.js.map +1 -0
- package/dist/cli/__tests__/shard-worker.test.d.ts +10 -0
- package/dist/cli/__tests__/shard-worker.test.d.ts.map +1 -0
- package/dist/cli/__tests__/shard-worker.test.js +153 -0
- package/dist/cli/__tests__/shard-worker.test.js.map +1 -0
- package/dist/cli/__tests__/workspace-report.test.d.ts +6 -0
- package/dist/cli/__tests__/workspace-report.test.d.ts.map +1 -0
- package/dist/cli/__tests__/workspace-report.test.js +89 -0
- package/dist/cli/__tests__/workspace-report.test.js.map +1 -0
- package/dist/cli/apply-suppressions.d.ts +86 -0
- package/dist/cli/apply-suppressions.d.ts.map +1 -0
- package/dist/cli/apply-suppressions.js +101 -0
- package/dist/cli/apply-suppressions.js.map +1 -0
- package/dist/cli/apply-suppressions.test.d.ts +12 -0
- package/dist/cli/apply-suppressions.test.d.ts.map +1 -0
- package/dist/cli/apply-suppressions.test.js +85 -0
- package/dist/cli/apply-suppressions.test.js.map +1 -0
- package/dist/cli/build-envelope.d.ts +53 -0
- package/dist/cli/build-envelope.d.ts.map +1 -0
- package/dist/cli/build-envelope.js +88 -0
- package/dist/cli/build-envelope.js.map +1 -0
- package/dist/cli/detect.d.ts +37 -0
- package/dist/cli/detect.d.ts.map +1 -0
- package/dist/cli/detect.js +60 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/equivalence-check-command.d.ts +45 -0
- package/dist/cli/equivalence-check-command.d.ts.map +1 -0
- package/dist/cli/equivalence-check-command.js +196 -0
- package/dist/cli/equivalence-check-command.js.map +1 -0
- package/dist/cli/graph/graph-aux-command-specs.d.ts +60 -0
- package/dist/cli/graph/graph-aux-command-specs.d.ts.map +1 -0
- package/dist/cli/graph/graph-aux-command-specs.js +390 -0
- package/dist/cli/graph/graph-aux-command-specs.js.map +1 -0
- package/dist/cli/graph/graph-command-spec.d.ts +43 -0
- package/dist/cli/graph/graph-command-spec.d.ts.map +1 -0
- package/dist/cli/graph/graph-command-spec.js +456 -0
- package/dist/cli/graph/graph-command-spec.js.map +1 -0
- package/dist/cli/graph-config-schema.d.ts +70 -0
- package/dist/cli/graph-config-schema.d.ts.map +1 -0
- package/dist/cli/graph-config-schema.js +68 -0
- package/dist/cli/graph-config-schema.js.map +1 -0
- package/dist/cli/graph-config.d.ts +53 -0
- package/dist/cli/graph-config.d.ts.map +1 -0
- package/dist/cli/graph-config.js +111 -0
- package/dist/cli/graph-config.js.map +1 -0
- package/dist/cli/graph-modes.d.ts +36 -0
- package/dist/cli/graph-modes.d.ts.map +1 -0
- package/dist/cli/graph-modes.js +161 -0
- package/dist/cli/graph-modes.js.map +1 -0
- package/dist/cli/graph-options.d.ts +143 -0
- package/dist/cli/graph-options.d.ts.map +1 -0
- package/dist/cli/graph-options.js +15 -0
- package/dist/cli/graph-options.js.map +1 -0
- package/dist/cli/graph-progress.d.ts +31 -0
- package/dist/cli/graph-progress.d.ts.map +1 -0
- package/dist/cli/graph-progress.js +56 -0
- package/dist/cli/graph-progress.js.map +1 -0
- package/dist/cli/graph-recipes.d.ts +23 -0
- package/dist/cli/graph-recipes.d.ts.map +1 -0
- package/dist/cli/graph-recipes.js +44 -0
- package/dist/cli/graph-recipes.js.map +1 -0
- package/dist/cli/graph-report.d.ts +79 -0
- package/dist/cli/graph-report.d.ts.map +1 -0
- package/dist/cli/graph-report.js +186 -0
- package/dist/cli/graph-report.js.map +1 -0
- package/dist/cli/graph-runner.d.ts +106 -0
- package/dist/cli/graph-runner.d.ts.map +1 -0
- package/dist/cli/graph-runner.js +274 -0
- package/dist/cli/graph-runner.js.map +1 -0
- package/dist/cli/graph-tracer.d.ts +27 -0
- package/dist/cli/graph-tracer.d.ts.map +1 -0
- package/dist/cli/graph-tracer.js +33 -0
- package/dist/cli/graph-tracer.js.map +1 -0
- package/dist/cli/graph-worker.d.ts +29 -0
- package/dist/cli/graph-worker.d.ts.map +1 -0
- package/dist/cli/graph-worker.js +86 -0
- package/dist/cli/graph-worker.js.map +1 -0
- package/dist/cli/graph.d.ts +171 -0
- package/dist/cli/graph.d.ts.map +1 -0
- package/dist/cli/graph.js +1041 -0
- package/dist/cli/graph.js.map +1 -0
- package/dist/cli/heap-preflight.d.ts +62 -0
- package/dist/cli/heap-preflight.d.ts.map +1 -0
- package/dist/cli/heap-preflight.js +176 -0
- package/dist/cli/heap-preflight.js.map +1 -0
- package/dist/cli/list-files.d.ts +37 -0
- package/dist/cli/list-files.d.ts.map +1 -0
- package/dist/cli/list-files.js +166 -0
- package/dist/cli/list-files.js.map +1 -0
- package/dist/cli/lookup.d.ts +19 -0
- package/dist/cli/lookup.d.ts.map +1 -0
- package/dist/cli/lookup.js +87 -0
- package/dist/cli/lookup.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/_equivalence-harness.d.ts +47 -0
- package/dist/cli/orchestrate/__tests__/_equivalence-harness.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/_equivalence-harness.js +331 -0
- package/dist/cli/orchestrate/__tests__/_equivalence-harness.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/_flat-large-fixture.d.ts +69 -0
- package/dist/cli/orchestrate/__tests__/_flat-large-fixture.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/_flat-large-fixture.js +181 -0
- package/dist/cli/orchestrate/__tests__/_flat-large-fixture.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/canonical-file-set.test.d.ts +8 -0
- package/dist/cli/orchestrate/__tests__/canonical-file-set.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/canonical-file-set.test.js +51 -0
- package/dist/cli/orchestrate/__tests__/canonical-file-set.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/catalog-builder-incremental.test.d.ts +9 -0
- package/dist/cli/orchestrate/__tests__/catalog-builder-incremental.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/catalog-builder-incremental.test.js +147 -0
- package/dist/cli/orchestrate/__tests__/catalog-builder-incremental.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.d.ts +12 -0
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js +509 -0
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/determinism.test.d.ts +19 -0
- package/dist/cli/orchestrate/__tests__/determinism.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/determinism.test.js +163 -0
- package/dist/cli/orchestrate/__tests__/determinism.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/edge-identity.test.d.ts +9 -0
- package/dist/cli/orchestrate/__tests__/edge-identity.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/edge-identity.test.js +103 -0
- package/dist/cli/orchestrate/__tests__/edge-identity.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence-check.test.d.ts +10 -0
- package/dist/cli/orchestrate/__tests__/equivalence-check.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence-check.test.js +277 -0
- package/dist/cli/orchestrate/__tests__/equivalence-check.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence-repo-scale.test.d.ts +51 -0
- package/dist/cli/orchestrate/__tests__/equivalence-repo-scale.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence-repo-scale.test.js +183 -0
- package/dist/cli/orchestrate/__tests__/equivalence-repo-scale.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence.test.d.ts +47 -0
- package/dist/cli/orchestrate/__tests__/equivalence.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/equivalence.test.js +259 -0
- package/dist/cli/orchestrate/__tests__/equivalence.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/exact-boundary-recovery.test.d.ts +9 -0
- package/dist/cli/orchestrate/__tests__/exact-boundary-recovery.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/exact-boundary-recovery.test.js +105 -0
- package/dist/cli/orchestrate/__tests__/exact-boundary-recovery.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/export-index.test.d.ts +12 -0
- package/dist/cli/orchestrate/__tests__/export-index.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/export-index.test.js +346 -0
- package/dist/cli/orchestrate/__tests__/export-index.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/flat-large-fixture.test.d.ts +16 -0
- package/dist/cli/orchestrate/__tests__/flat-large-fixture.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/flat-large-fixture.test.js +99 -0
- package/dist/cli/orchestrate/__tests__/flat-large-fixture.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/flat-monorepo-strategy.test.d.ts +11 -0
- package/dist/cli/orchestrate/__tests__/flat-monorepo-strategy.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/flat-monorepo-strategy.test.js +271 -0
- package/dist/cli/orchestrate/__tests__/flat-monorepo-strategy.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/function-set-parity.test.d.ts +38 -0
- package/dist/cli/orchestrate/__tests__/function-set-parity.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/function-set-parity.test.js +163 -0
- package/dist/cli/orchestrate/__tests__/function-set-parity.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/incremental-merge.test.d.ts +8 -0
- package/dist/cli/orchestrate/__tests__/incremental-merge.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/incremental-merge.test.js +153 -0
- package/dist/cli/orchestrate/__tests__/incremental-merge.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/partition-files.test.d.ts +10 -0
- package/dist/cli/orchestrate/__tests__/partition-files.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/partition-files.test.js +104 -0
- package/dist/cli/orchestrate/__tests__/partition-files.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/resolution-completeness-floor.test.d.ts +21 -0
- package/dist/cli/orchestrate/__tests__/resolution-completeness-floor.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/resolution-completeness-floor.test.js +59 -0
- package/dist/cli/orchestrate/__tests__/resolution-completeness-floor.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/shard-model.test.d.ts +8 -0
- package/dist/cli/orchestrate/__tests__/shard-model.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/shard-model.test.js +77 -0
- package/dist/cli/orchestrate/__tests__/shard-model.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/shard-runner-spawn.test.d.ts +13 -0
- package/dist/cli/orchestrate/__tests__/shard-runner-spawn.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/shard-runner-spawn.test.js +103 -0
- package/dist/cli/orchestrate/__tests__/shard-runner-spawn.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/sharded-graph.test.d.ts +13 -0
- package/dist/cli/orchestrate/__tests__/sharded-graph.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/sharded-graph.test.js +257 -0
- package/dist/cli/orchestrate/__tests__/sharded-graph.test.js.map +1 -0
- package/dist/cli/orchestrate/__tests__/worker-pool.test.d.ts +6 -0
- package/dist/cli/orchestrate/__tests__/worker-pool.test.d.ts.map +1 -0
- package/dist/cli/orchestrate/__tests__/worker-pool.test.js +38 -0
- package/dist/cli/orchestrate/__tests__/worker-pool.test.js.map +1 -0
- package/dist/cli/orchestrate/cache-orchestrator.d.ts +42 -0
- package/dist/cli/orchestrate/cache-orchestrator.d.ts.map +1 -0
- package/dist/cli/orchestrate/cache-orchestrator.js +92 -0
- package/dist/cli/orchestrate/cache-orchestrator.js.map +1 -0
- package/dist/cli/orchestrate/canonical-file-set.d.ts +51 -0
- package/dist/cli/orchestrate/canonical-file-set.d.ts.map +1 -0
- package/dist/cli/orchestrate/canonical-file-set.js +58 -0
- package/dist/cli/orchestrate/canonical-file-set.js.map +1 -0
- package/dist/cli/orchestrate/catalog-builder.d.ts +121 -0
- package/dist/cli/orchestrate/catalog-builder.d.ts.map +1 -0
- package/dist/cli/orchestrate/catalog-builder.js +279 -0
- package/dist/cli/orchestrate/catalog-builder.js.map +1 -0
- package/dist/cli/orchestrate/catalog-stats.d.ts +31 -0
- package/dist/cli/orchestrate/catalog-stats.d.ts.map +1 -0
- package/dist/cli/orchestrate/catalog-stats.js +52 -0
- package/dist/cli/orchestrate/catalog-stats.js.map +1 -0
- package/dist/cli/orchestrate/cross-shard-resolve.d.ts +190 -0
- package/dist/cli/orchestrate/cross-shard-resolve.d.ts.map +1 -0
- package/dist/cli/orchestrate/cross-shard-resolve.js +523 -0
- package/dist/cli/orchestrate/cross-shard-resolve.js.map +1 -0
- package/dist/cli/orchestrate/edge-identity.d.ts +48 -0
- package/dist/cli/orchestrate/edge-identity.d.ts.map +1 -0
- package/dist/cli/orchestrate/edge-identity.js +68 -0
- package/dist/cli/orchestrate/edge-identity.js.map +1 -0
- package/dist/cli/orchestrate/equivalence-check.d.ts +227 -0
- package/dist/cli/orchestrate/equivalence-check.d.ts.map +1 -0
- package/dist/cli/orchestrate/equivalence-check.js +264 -0
- package/dist/cli/orchestrate/equivalence-check.js.map +1 -0
- package/dist/cli/orchestrate/exact-boundary-recovery.d.ts +33 -0
- package/dist/cli/orchestrate/exact-boundary-recovery.d.ts.map +1 -0
- package/dist/cli/orchestrate/exact-boundary-recovery.js +62 -0
- package/dist/cli/orchestrate/exact-boundary-recovery.js.map +1 -0
- package/dist/cli/orchestrate/flat-monorepo-strategy.d.ts +171 -0
- package/dist/cli/orchestrate/flat-monorepo-strategy.d.ts.map +1 -0
- package/dist/cli/orchestrate/flat-monorepo-strategy.js +328 -0
- package/dist/cli/orchestrate/flat-monorepo-strategy.js.map +1 -0
- package/dist/cli/orchestrate/incremental-merge.d.ts +46 -0
- package/dist/cli/orchestrate/incremental-merge.d.ts.map +1 -0
- package/dist/cli/orchestrate/incremental-merge.js +236 -0
- package/dist/cli/orchestrate/incremental-merge.js.map +1 -0
- package/dist/cli/orchestrate/partition-chunk.d.ts +36 -0
- package/dist/cli/orchestrate/partition-chunk.d.ts.map +1 -0
- package/dist/cli/orchestrate/partition-chunk.js +37 -0
- package/dist/cli/orchestrate/partition-chunk.js.map +1 -0
- package/dist/cli/orchestrate/partition-files.d.ts +52 -0
- package/dist/cli/orchestrate/partition-files.d.ts.map +1 -0
- package/dist/cli/orchestrate/partition-files.js +94 -0
- package/dist/cli/orchestrate/partition-files.js.map +1 -0
- package/dist/cli/orchestrate/resolution-trace.d.ts +11 -0
- package/dist/cli/orchestrate/resolution-trace.d.ts.map +1 -0
- package/dist/cli/orchestrate/resolution-trace.js +27 -0
- package/dist/cli/orchestrate/resolution-trace.js.map +1 -0
- package/dist/cli/orchestrate/shard-model.d.ts +99 -0
- package/dist/cli/orchestrate/shard-model.d.ts.map +1 -0
- package/dist/cli/orchestrate/shard-model.js +23 -0
- package/dist/cli/orchestrate/shard-model.js.map +1 -0
- package/dist/cli/orchestrate/shard-runner.d.ts +65 -0
- package/dist/cli/orchestrate/shard-runner.d.ts.map +1 -0
- package/dist/cli/orchestrate/shard-runner.js +169 -0
- package/dist/cli/orchestrate/shard-runner.js.map +1 -0
- package/dist/cli/orchestrate/sharded-graph.d.ts +86 -0
- package/dist/cli/orchestrate/sharded-graph.d.ts.map +1 -0
- package/dist/cli/orchestrate/sharded-graph.js +227 -0
- package/dist/cli/orchestrate/sharded-graph.js.map +1 -0
- package/dist/cli/orchestrate/types.d.ts +31 -0
- package/dist/cli/orchestrate/types.d.ts.map +1 -0
- package/dist/cli/orchestrate/types.js +24 -0
- package/dist/cli/orchestrate/types.js.map +1 -0
- package/dist/cli/orchestrate/worker-pool.d.ts +16 -0
- package/dist/cli/orchestrate/worker-pool.d.ts.map +1 -0
- package/dist/cli/orchestrate/worker-pool.js +39 -0
- package/dist/cli/orchestrate/worker-pool.js.map +1 -0
- package/dist/cli/orchestrate.d.ts +106 -0
- package/dist/cli/orchestrate.d.ts.map +1 -0
- package/dist/cli/orchestrate.js +228 -0
- package/dist/cli/orchestrate.js.map +1 -0
- package/dist/cli/positional-paths.d.ts +23 -0
- package/dist/cli/positional-paths.d.ts.map +1 -0
- package/dist/cli/positional-paths.js +64 -0
- package/dist/cli/positional-paths.js.map +1 -0
- package/dist/cli/pressure-monitor.d.ts +62 -0
- package/dist/cli/pressure-monitor.d.ts.map +1 -0
- package/dist/cli/pressure-monitor.js +110 -0
- package/dist/cli/pressure-monitor.js.map +1 -0
- package/dist/cli/profile.d.ts +82 -0
- package/dist/cli/profile.d.ts.map +1 -0
- package/dist/cli/profile.js +120 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/report-data.d.ts +46 -0
- package/dist/cli/report-data.d.ts.map +1 -0
- package/dist/cli/report-data.js +48 -0
- package/dist/cli/report-data.js.map +1 -0
- package/dist/cli/resolve-adapters.d.ts +19 -0
- package/dist/cli/resolve-adapters.d.ts.map +1 -0
- package/dist/cli/resolve-adapters.js +38 -0
- package/dist/cli/resolve-adapters.js.map +1 -0
- package/dist/cli/sarif-export.d.ts +40 -0
- package/dist/cli/sarif-export.d.ts.map +1 -0
- package/dist/cli/sarif-export.js +69 -0
- package/dist/cli/sarif-export.js.map +1 -0
- package/dist/cli/shard-worker.d.ts +25 -0
- package/dist/cli/shard-worker.d.ts.map +1 -0
- package/dist/cli/shard-worker.js +98 -0
- package/dist/cli/shard-worker.js.map +1 -0
- package/dist/cli/symbol-index.d.ts +51 -0
- package/dist/cli/symbol-index.d.ts.map +1 -0
- package/dist/cli/symbol-index.js +120 -0
- package/dist/cli/symbol-index.js.map +1 -0
- package/dist/cli/workspace-report.d.ts +32 -0
- package/dist/cli/workspace-report.d.ts.map +1 -0
- package/dist/cli/workspace-report.js +107 -0
- package/dist/cli/workspace-report.js.map +1 -0
- package/dist/cli/workspace-runner.d.ts +104 -0
- package/dist/cli/workspace-runner.d.ts.map +1 -0
- package/dist/cli/workspace-runner.js +166 -0
- package/dist/cli/workspace-runner.js.map +1 -0
- package/dist/cross-package/export-index.d.ts +118 -0
- package/dist/cross-package/export-index.d.ts.map +1 -0
- package/dist/cross-package/export-index.js +296 -0
- package/dist/cross-package/export-index.js.map +1 -0
- package/dist/cross-package/posix-path.d.ts +16 -0
- package/dist/cross-package/posix-path.d.ts.map +1 -0
- package/dist/cross-package/posix-path.js +18 -0
- package/dist/cross-package/posix-path.js.map +1 -0
- package/dist/cross-package/resolve.d.ts +68 -0
- package/dist/cross-package/resolve.d.ts.map +1 -0
- package/dist/cross-package/resolve.js +83 -0
- package/dist/cross-package/resolve.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +38 -0
- package/dist/internal.js.map +1 -0
- package/dist/lang-adapter/body-digest.d.ts +46 -0
- package/dist/lang-adapter/body-digest.d.ts.map +1 -0
- package/dist/lang-adapter/body-digest.js +49 -0
- package/dist/lang-adapter/body-digest.js.map +1 -0
- package/dist/lang-adapter/edge-helpers.d.ts +104 -0
- package/dist/lang-adapter/edge-helpers.d.ts.map +1 -0
- package/dist/lang-adapter/edge-helpers.js +120 -0
- package/dist/lang-adapter/edge-helpers.js.map +1 -0
- package/dist/lang-adapter/registry.d.ts +59 -0
- package/dist/lang-adapter/registry.d.ts.map +1 -0
- package/dist/lang-adapter/registry.js +100 -0
- package/dist/lang-adapter/registry.js.map +1 -0
- package/dist/lang-adapter/selector.d.ts +39 -0
- package/dist/lang-adapter/selector.d.ts.map +1 -0
- package/dist/lang-adapter/selector.js +140 -0
- package/dist/lang-adapter/selector.js.map +1 -0
- package/dist/lang-adapter/types.d.ts +217 -0
- package/dist/lang-adapter/types.d.ts.map +1 -0
- package/dist/lang-adapter/types.js +18 -0
- package/dist/lang-adapter/types.js.map +1 -0
- package/dist/owner-key.d.ts +22 -0
- package/dist/owner-key.d.ts.map +1 -0
- package/dist/owner-key.js +25 -0
- package/dist/owner-key.js.map +1 -0
- package/dist/persistence/__tests__/shard-fragment-cache.test.d.ts +8 -0
- package/dist/persistence/__tests__/shard-fragment-cache.test.d.ts.map +1 -0
- package/dist/persistence/__tests__/shard-fragment-cache.test.js +126 -0
- package/dist/persistence/__tests__/shard-fragment-cache.test.js.map +1 -0
- package/dist/persistence/catalog-repo.d.ts +77 -0
- package/dist/persistence/catalog-repo.d.ts.map +1 -0
- package/dist/persistence/catalog-repo.js +229 -0
- package/dist/persistence/catalog-repo.js.map +1 -0
- package/dist/persistence/schema.d.ts +249 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +53 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/session-payload.d.ts +96 -0
- package/dist/persistence/session-payload.d.ts.map +1 -0
- package/dist/persistence/session-payload.js +116 -0
- package/dist/persistence/session-payload.js.map +1 -0
- package/dist/persistence/session-replay.d.ts +15 -0
- package/dist/persistence/session-replay.d.ts.map +1 -0
- package/dist/persistence/session-replay.js +80 -0
- package/dist/persistence/session-replay.js.map +1 -0
- package/dist/pipeline/__tests__/assign-packages.test.d.ts +2 -0
- package/dist/pipeline/__tests__/assign-packages.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/assign-packages.test.js +88 -0
- package/dist/pipeline/__tests__/assign-packages.test.js.map +1 -0
- package/dist/pipeline/__tests__/constrain-edges.test.d.ts +2 -0
- package/dist/pipeline/__tests__/constrain-edges.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/constrain-edges.test.js +228 -0
- package/dist/pipeline/__tests__/constrain-edges.test.js.map +1 -0
- package/dist/pipeline/__tests__/features.test.d.ts +9 -0
- package/dist/pipeline/__tests__/features.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/features.test.js +458 -0
- package/dist/pipeline/__tests__/features.test.js.map +1 -0
- package/dist/pipeline/__tests__/indexes-imports.test.d.ts +2 -0
- package/dist/pipeline/__tests__/indexes-imports.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/indexes-imports.test.js +114 -0
- package/dist/pipeline/__tests__/indexes-imports.test.js.map +1 -0
- package/dist/pipeline/assign-packages.d.ts +18 -0
- package/dist/pipeline/assign-packages.d.ts.map +1 -0
- package/dist/pipeline/assign-packages.js +86 -0
- package/dist/pipeline/assign-packages.js.map +1 -0
- package/dist/pipeline/constrain-edges.d.ts +34 -0
- package/dist/pipeline/constrain-edges.d.ts.map +1 -0
- package/dist/pipeline/constrain-edges.js +139 -0
- package/dist/pipeline/constrain-edges.js.map +1 -0
- package/dist/pipeline/feature-deps.d.ts +19 -0
- package/dist/pipeline/feature-deps.d.ts.map +1 -0
- package/dist/pipeline/feature-deps.js +28 -0
- package/dist/pipeline/feature-deps.js.map +1 -0
- package/dist/pipeline/features.d.ts +50 -0
- package/dist/pipeline/features.d.ts.map +1 -0
- package/dist/pipeline/features.js +462 -0
- package/dist/pipeline/features.js.map +1 -0
- package/dist/pipeline/indexes.d.ts +27 -0
- package/dist/pipeline/indexes.d.ts.map +1 -0
- package/dist/pipeline/indexes.js +159 -0
- package/dist/pipeline/indexes.js.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts +5 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js +24 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js.map +1 -0
- package/dist/recipes/__tests__/registry.test.d.ts +7 -0
- package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/registry.test.js +34 -0
- package/dist/recipes/__tests__/registry.test.js.map +1 -0
- package/dist/recipes/__tests__/resolve.test.d.ts +10 -0
- package/dist/recipes/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/resolve.test.js +38 -0
- package/dist/recipes/__tests__/resolve.test.js.map +1 -0
- package/dist/recipes/built-in-recipes.d.ts +26 -0
- package/dist/recipes/built-in-recipes.d.ts.map +1 -0
- package/dist/recipes/built-in-recipes.js +43 -0
- package/dist/recipes/built-in-recipes.js.map +1 -0
- package/dist/recipes/registry.d.ts +31 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +48 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/resolve.d.ts +31 -0
- package/dist/recipes/resolve.d.ts.map +1 -0
- package/dist/recipes/resolve.js +70 -0
- package/dist/recipes/resolve.js.map +1 -0
- package/dist/recipes/types.d.ts +58 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +39 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/render/__tests__/catalog-json.test.d.ts +9 -0
- package/dist/render/__tests__/catalog-json.test.d.ts.map +1 -0
- package/dist/render/__tests__/catalog-json.test.js +132 -0
- package/dist/render/__tests__/catalog-json.test.js.map +1 -0
- package/dist/render/catalog-json-types.d.ts +114 -0
- package/dist/render/catalog-json-types.d.ts.map +1 -0
- package/dist/render/catalog-json-types.js +23 -0
- package/dist/render/catalog-json-types.js.map +1 -0
- package/dist/render/catalog-json.d.ts +43 -0
- package/dist/render/catalog-json.d.ts.map +1 -0
- package/dist/render/catalog-json.js +303 -0
- package/dist/render/catalog-json.js.map +1 -0
- package/dist/render/opensip-id-derivation.d.ts +73 -0
- package/dist/render/opensip-id-derivation.d.ts.map +1 -0
- package/dist/render/opensip-id-derivation.js +65 -0
- package/dist/render/opensip-id-derivation.js.map +1 -0
- package/dist/render/rule-id-mapping.d.ts +61 -0
- package/dist/render/rule-id-mapping.d.ts.map +1 -0
- package/dist/render/rule-id-mapping.js +82 -0
- package/dist/render/rule-id-mapping.js.map +1 -0
- package/dist/resolve-callee.d.ts +50 -0
- package/dist/resolve-callee.d.ts.map +1 -0
- package/dist/resolve-callee.js +80 -0
- package/dist/resolve-callee.js.map +1 -0
- package/dist/rules/__tests__/__fixtures__/catalog.fixture.d.ts +22 -0
- package/dist/rules/__tests__/__fixtures__/catalog.fixture.d.ts.map +1 -0
- package/dist/rules/__tests__/__fixtures__/catalog.fixture.js +143 -0
- package/dist/rules/__tests__/__fixtures__/catalog.fixture.js.map +1 -0
- package/dist/rules/__tests__/create-graph-signal.test.d.ts +8 -0
- package/dist/rules/__tests__/create-graph-signal.test.d.ts.map +1 -0
- package/dist/rules/__tests__/create-graph-signal.test.js +55 -0
- package/dist/rules/__tests__/create-graph-signal.test.js.map +1 -0
- package/dist/rules/__tests__/define-rule.test.d.ts +13 -0
- package/dist/rules/__tests__/define-rule.test.d.ts.map +1 -0
- package/dist/rules/__tests__/define-rule.test.js +102 -0
- package/dist/rules/__tests__/define-rule.test.js.map +1 -0
- package/dist/rules/__tests__/fingerprint-golden.test.d.ts +21 -0
- package/dist/rules/__tests__/fingerprint-golden.test.d.ts.map +1 -0
- package/dist/rules/__tests__/fingerprint-golden.test.js +69 -0
- package/dist/rules/__tests__/fingerprint-golden.test.js.map +1 -0
- package/dist/rules/__tests__/registry.test.d.ts +6 -0
- package/dist/rules/__tests__/registry.test.d.ts.map +1 -0
- package/dist/rules/__tests__/registry.test.js +37 -0
- package/dist/rules/__tests__/registry.test.js.map +1 -0
- package/dist/rules/__tests__/rule-behaviors.test.d.ts +9 -0
- package/dist/rules/__tests__/rule-behaviors.test.d.ts.map +1 -0
- package/dist/rules/__tests__/rule-behaviors.test.js +204 -0
- package/dist/rules/__tests__/rule-behaviors.test.js.map +1 -0
- package/dist/rules/__tests__/signal-output.snapshot.test.d.ts +11 -0
- package/dist/rules/__tests__/signal-output.snapshot.test.d.ts.map +1 -0
- package/dist/rules/__tests__/signal-output.snapshot.test.js +55 -0
- package/dist/rules/__tests__/signal-output.snapshot.test.js.map +1 -0
- package/dist/rules/_approximation.d.ts +23 -0
- package/dist/rules/_approximation.d.ts.map +1 -0
- package/dist/rules/_approximation.js +28 -0
- package/dist/rules/_approximation.js.map +1 -0
- package/dist/rules/_entry-points.d.ts +27 -0
- package/dist/rules/_entry-points.d.ts.map +1 -0
- package/dist/rules/_entry-points.js +81 -0
- package/dist/rules/_entry-points.js.map +1 -0
- package/dist/rules/_severity-override.d.ts +32 -0
- package/dist/rules/_severity-override.d.ts.map +1 -0
- package/dist/rules/_severity-override.js +33 -0
- package/dist/rules/_severity-override.js.map +1 -0
- package/dist/rules/always-throws-branch.d.ts +26 -0
- package/dist/rules/always-throws-branch.d.ts.map +1 -0
- package/dist/rules/always-throws-branch.js +66 -0
- package/dist/rules/always-throws-branch.js.map +1 -0
- package/dist/rules/create-graph-signal.d.ts +38 -0
- package/dist/rules/create-graph-signal.d.ts.map +1 -0
- package/dist/rules/create-graph-signal.js +35 -0
- package/dist/rules/create-graph-signal.js.map +1 -0
- package/dist/rules/cycle.d.ts +29 -0
- package/dist/rules/cycle.d.ts.map +1 -0
- package/dist/rules/cycle.js +166 -0
- package/dist/rules/cycle.js.map +1 -0
- package/dist/rules/cycle.memberlocations.test.d.ts +11 -0
- package/dist/rules/cycle.memberlocations.test.d.ts.map +1 -0
- package/dist/rules/cycle.memberlocations.test.js +84 -0
- package/dist/rules/cycle.memberlocations.test.js.map +1 -0
- package/dist/rules/define-rule.d.ts +67 -0
- package/dist/rules/define-rule.d.ts.map +1 -0
- package/dist/rules/define-rule.js +66 -0
- package/dist/rules/define-rule.js.map +1 -0
- package/dist/rules/duplicated-function-body.d.ts +40 -0
- package/dist/rules/duplicated-function-body.d.ts.map +1 -0
- package/dist/rules/duplicated-function-body.js +232 -0
- package/dist/rules/duplicated-function-body.js.map +1 -0
- package/dist/rules/high-blast-untested.d.ts +26 -0
- package/dist/rules/high-blast-untested.d.ts.map +1 -0
- package/dist/rules/high-blast-untested.js +82 -0
- package/dist/rules/high-blast-untested.js.map +1 -0
- package/dist/rules/large-function.d.ts +22 -0
- package/dist/rules/large-function.d.ts.map +1 -0
- package/dist/rules/large-function.js +72 -0
- package/dist/rules/large-function.js.map +1 -0
- package/dist/rules/no-side-effect-path.d.ts +31 -0
- package/dist/rules/no-side-effect-path.d.ts.map +1 -0
- package/dist/rules/no-side-effect-path.js +217 -0
- package/dist/rules/no-side-effect-path.js.map +1 -0
- package/dist/rules/orphan-subtree.d.ts +11 -0
- package/dist/rules/orphan-subtree.d.ts.map +1 -0
- package/dist/rules/orphan-subtree.js +104 -0
- package/dist/rules/orphan-subtree.js.map +1 -0
- package/dist/rules/registry.d.ts +35 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +96 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/test-only-reachable.d.ts +9 -0
- package/dist/rules/test-only-reachable.d.ts.map +1 -0
- package/dist/rules/test-only-reachable.js +101 -0
- package/dist/rules/test-only-reachable.js.map +1 -0
- package/dist/rules/unexpected-coupling.d.ts +29 -0
- package/dist/rules/unexpected-coupling.d.ts.map +1 -0
- package/dist/rules/unexpected-coupling.js +0 -0
- package/dist/rules/unexpected-coupling.js.map +1 -0
- package/dist/rules/wide-function.d.ts +18 -0
- package/dist/rules/wide-function.d.ts.map +1 -0
- package/dist/rules/wide-function.js +58 -0
- package/dist/rules/wide-function.js.map +1 -0
- package/dist/scope-augmentation.d.ts +58 -0
- package/dist/scope-augmentation.d.ts.map +1 -0
- package/dist/scope-augmentation.js +29 -0
- package/dist/scope-augmentation.js.map +1 -0
- package/dist/tool.d.ts +29 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +241 -0
- package/dist/tool.js.map +1 -0
- package/dist/types.d.ts +642 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +136 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:duplicated-function-body — group catalog entries whose body
|
|
3
|
+
* normalizes to the same hash and report duplicate bodies. The rule has
|
|
4
|
+
* two complementary code paths under one slug:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Per-instance (size-gated).** A "duplicate" is two or more
|
|
7
|
+
* functions whose normalized body is byte-identical
|
|
8
|
+
* (whitespace/comment normalization handled by hashFunctionBody).
|
|
9
|
+
* Two thresholds filter out non-actionable hits:
|
|
10
|
+
*
|
|
11
|
+
* - minDuplicateBodyLines (default 5): the source span must be at
|
|
12
|
+
* least this many lines.
|
|
13
|
+
* - minDuplicateBodySize (default 200): the *normalized* body
|
|
14
|
+
* (post comment-strip + whitespace-collapse) must be at least
|
|
15
|
+
* this many characters. This catches the common case of a
|
|
16
|
+
* `defineCheck({ ... analyze(content) { return analyzeFile(...) } })`
|
|
17
|
+
* wrapper where the source spans 8+ lines but the executable
|
|
18
|
+
* body is only ~80 characters once normalized — structurally
|
|
19
|
+
* identical to every other thin wrapper, but never an actionable
|
|
20
|
+
* refactor target.
|
|
21
|
+
*
|
|
22
|
+
* Emits N-1 signals per group (one per non-primary occurrence).
|
|
23
|
+
*
|
|
24
|
+
* 2. **Aggregate (cross-package).** For each body hash present in
|
|
25
|
+
* ≥ minCrossPackageDuplicatePackages (default 3) DISTINCT packages
|
|
26
|
+
* (via `pkgOf`), the rule emits ONE aggregate signal naming the
|
|
27
|
+
* packages and SUPPRESSES the per-instance signals for that same hash
|
|
28
|
+
* (no double-reporting). Bodies that don't reach N packages flow
|
|
29
|
+
* through path (1) unchanged.
|
|
30
|
+
*
|
|
31
|
+
* This path applies a LIGHTER, body-size-only floor
|
|
32
|
+
* (`minCrossPackageDuplicateBodySize`, default 80 chars — no line floor)
|
|
33
|
+
* rather than the per-instance floor: a *small* body copied across
|
|
34
|
+
* packages is exactly what this path exists to catch, so the floor is
|
|
35
|
+
* tuned only to drop TRIVIAL bodies (empty DI-constructor shims,
|
|
36
|
+
* one-line getters, thin delegators) that are never consolidation
|
|
37
|
+
* targets, while keeping genuinely-small shared utilities visible.
|
|
38
|
+
*/
|
|
39
|
+
import { pkgOf } from '../resolve-callee.js';
|
|
40
|
+
import { createGraphSignal } from './create-graph-signal.js';
|
|
41
|
+
import { defineRule } from './define-rule.js';
|
|
42
|
+
const DEFAULT_MIN_LINES = 5;
|
|
43
|
+
const DEFAULT_MIN_BODY_SIZE = 200;
|
|
44
|
+
const DEFAULT_MIN_CROSS_PACKAGE_PACKAGES = 3;
|
|
45
|
+
// Lighter than DEFAULT_MIN_BODY_SIZE (the per-instance floor) and applied with
|
|
46
|
+
// NO line floor: the aggregate path is meant to catch genuinely-small shared
|
|
47
|
+
// utilities copied across packages, so its floor only drops trivial bodies
|
|
48
|
+
// (empty DI shims, one-line getters/delegators).
|
|
49
|
+
const DEFAULT_MIN_CROSS_PACKAGE_BODY_SIZE = 80;
|
|
50
|
+
const SLUG = 'graph:duplicated-function-body';
|
|
51
|
+
export const duplicatedFunctionBodyRule = defineRule({
|
|
52
|
+
slug: SLUG,
|
|
53
|
+
defaultSeverity: 'warning',
|
|
54
|
+
featureDeps: ['bodyLines'],
|
|
55
|
+
evaluate({ catalog, config, features }) {
|
|
56
|
+
const minLines = config.minDuplicateBodyLines ?? DEFAULT_MIN_LINES;
|
|
57
|
+
const minBodySize = config.minDuplicateBodySize ?? DEFAULT_MIN_BODY_SIZE;
|
|
58
|
+
const minPackages = config.minCrossPackageDuplicatePackages ?? DEFAULT_MIN_CROSS_PACKAGE_PACKAGES;
|
|
59
|
+
const minCrossPackageBodySize = config.minCrossPackageDuplicateBodySize ?? DEFAULT_MIN_CROSS_PACKAGE_BODY_SIZE;
|
|
60
|
+
const signals = [];
|
|
61
|
+
// Aggregate path first: group every kind/test-eligible occurrence by
|
|
62
|
+
// body hash (no line floor) so we can detect cross-package spread and
|
|
63
|
+
// decide which hashes to suppress on the per-instance path below.
|
|
64
|
+
const aggregateBuckets = groupByHashUnfloored(catalog);
|
|
65
|
+
const suppressedHashes = new Set();
|
|
66
|
+
for (const [bodyHash, occs] of aggregateBuckets) {
|
|
67
|
+
const packages = [...new Set(occs.map((o) => pkgOf(o)))].sort();
|
|
68
|
+
if (packages.length < minPackages)
|
|
69
|
+
continue;
|
|
70
|
+
const anchor = lowestByQualifiedName(occs);
|
|
71
|
+
// Lighter, body-size-only floor (NO line floor): keeps the aggregate
|
|
72
|
+
// path catching genuinely-small shared utilities copied across packages,
|
|
73
|
+
// while dropping trivial bodies — empty DI-constructor shims, one-line
|
|
74
|
+
// getters, thin delegators — that are not consolidation targets. A body
|
|
75
|
+
// that fails this won't surface on the per-instance path either (its
|
|
76
|
+
// 200-char floor is stricter), so there is nothing to suppress.
|
|
77
|
+
if (anchor.bodySize !== undefined && anchor.bodySize < minCrossPackageBodySize)
|
|
78
|
+
continue;
|
|
79
|
+
// This hash is owned by the aggregate path; suppress its per-instance
|
|
80
|
+
// signals so a single duplicate group never double-reports.
|
|
81
|
+
suppressedHashes.add(bodyHash);
|
|
82
|
+
signals.push(createGraphSignal(SLUG, config, {
|
|
83
|
+
severity: 'low',
|
|
84
|
+
category: 'quality',
|
|
85
|
+
message: `This body is duplicated across ${String(packages.length)} packages (${packages.join(', ')}) in ${String(occs.length)} occurrences — hoist it into a shared package.`,
|
|
86
|
+
code: { file: anchor.filePath, line: anchor.line, column: anchor.column },
|
|
87
|
+
suggestion: 'Hoist the shared body into a single shared package and have every copy import it.',
|
|
88
|
+
metadata: {
|
|
89
|
+
packages,
|
|
90
|
+
packageCount: packages.length,
|
|
91
|
+
occurrenceCount: occs.length,
|
|
92
|
+
bodyHash,
|
|
93
|
+
},
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
// Per-instance path: size-gated groups, skipping any hash already
|
|
97
|
+
// claimed by an aggregate signal so a group never double-reports.
|
|
98
|
+
const groups = groupByHash(catalog, minLines, minBodySize, features);
|
|
99
|
+
signals.push(...emitPerInstanceSignals(groups, suppressedHashes, config));
|
|
100
|
+
return signals;
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* Per-instance duplicate signals: N-1 per size-gated group, skipping any hash
|
|
105
|
+
* already claimed by an aggregate signal (no double-reporting). Extracted from
|
|
106
|
+
* evaluate() to keep its cognitive complexity within budget.
|
|
107
|
+
*/
|
|
108
|
+
function emitPerInstanceSignals(groups, suppressedHashes, config) {
|
|
109
|
+
const signals = [];
|
|
110
|
+
for (const group of groups) {
|
|
111
|
+
if (group.length < 2)
|
|
112
|
+
continue;
|
|
113
|
+
const primary = group[0];
|
|
114
|
+
/* v8 ignore next */
|
|
115
|
+
if (!primary)
|
|
116
|
+
continue;
|
|
117
|
+
if (suppressedHashes.has(primary.bodyHash))
|
|
118
|
+
continue;
|
|
119
|
+
for (let i = 1; i < group.length; i++) {
|
|
120
|
+
const occ = group[i];
|
|
121
|
+
/* v8 ignore next */
|
|
122
|
+
if (!occ)
|
|
123
|
+
continue;
|
|
124
|
+
signals.push(createGraphSignal(SLUG, config, {
|
|
125
|
+
severity: 'low',
|
|
126
|
+
category: 'quality',
|
|
127
|
+
message: `${occ.simpleName} has the same body as ${primary.qualifiedName} (${primary.filePath}:${String(primary.line)}).`,
|
|
128
|
+
code: { file: occ.filePath, line: occ.line, column: occ.column },
|
|
129
|
+
suggestion: 'Extract the shared body to a single function and have both call sites import it.',
|
|
130
|
+
metadata: {
|
|
131
|
+
primary: primary.qualifiedName,
|
|
132
|
+
duplicate: occ.qualifiedName,
|
|
133
|
+
groupSize: group.length,
|
|
134
|
+
},
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return signals;
|
|
139
|
+
}
|
|
140
|
+
function groupByHash(catalog, minLines, minBodySize, features) {
|
|
141
|
+
// Walk the catalog directly; the byBodyHash index dedupes by hash,
|
|
142
|
+
// which is exactly what we need to NOT do here.
|
|
143
|
+
const buckets = new Map();
|
|
144
|
+
for (const name of Object.keys(catalog.functions)) {
|
|
145
|
+
const occs = catalog.functions[name];
|
|
146
|
+
/* v8 ignore next */
|
|
147
|
+
if (!occs)
|
|
148
|
+
continue;
|
|
149
|
+
for (const occ of occs) {
|
|
150
|
+
if (!isInterestingForDup(occ, minLines, minBodySize, features))
|
|
151
|
+
continue;
|
|
152
|
+
let bucket = buckets.get(occ.bodyHash);
|
|
153
|
+
if (!bucket) {
|
|
154
|
+
bucket = [];
|
|
155
|
+
buckets.set(occ.bodyHash, bucket);
|
|
156
|
+
}
|
|
157
|
+
bucket.push(occ);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return [...buckets.values()];
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Group occurrences by body hash applying ONLY the kind/test-file
|
|
164
|
+
* exclusions (no size/line floor) — the grouping the aggregate
|
|
165
|
+
* cross-package path consumes. Returns a Map so callers keep the body
|
|
166
|
+
* hash key for suppression bookkeeping.
|
|
167
|
+
*/
|
|
168
|
+
function groupByHashUnfloored(catalog) {
|
|
169
|
+
const buckets = new Map();
|
|
170
|
+
for (const name of Object.keys(catalog.functions)) {
|
|
171
|
+
const occs = catalog.functions[name];
|
|
172
|
+
/* v8 ignore next */
|
|
173
|
+
if (!occs)
|
|
174
|
+
continue;
|
|
175
|
+
for (const occ of occs) {
|
|
176
|
+
if (!isEligibleKind(occ))
|
|
177
|
+
continue;
|
|
178
|
+
let bucket = buckets.get(occ.bodyHash);
|
|
179
|
+
if (!bucket) {
|
|
180
|
+
bucket = [];
|
|
181
|
+
buckets.set(occ.bodyHash, bucket);
|
|
182
|
+
}
|
|
183
|
+
bucket.push(occ);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return buckets;
|
|
187
|
+
}
|
|
188
|
+
function lowestByQualifiedName(occs) {
|
|
189
|
+
return occs.reduce((lo, c) => (c.qualifiedName < lo.qualifiedName ? c : lo));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The kind/test-file exclusions shared by both code paths. Inline arrows
|
|
193
|
+
* / function expressions / module-init occurrences are never an
|
|
194
|
+
* extract/hoist target:
|
|
195
|
+
* - test-suite arrows with identical 5-line bodies are common boilerplate
|
|
196
|
+
* - module-inits hash whatever is at top level; identical hashes mean
|
|
197
|
+
* twin files, not a dup-extraction opportunity
|
|
198
|
+
* - constructor/getter/setter/method dups are interesting; keep those
|
|
199
|
+
*
|
|
200
|
+
* Test-file occurrences are excluded on both paths.
|
|
201
|
+
*/
|
|
202
|
+
function isEligibleKind(occ) {
|
|
203
|
+
if (occ.kind === 'arrow' || occ.kind === 'function-expression' || occ.kind === 'module-init') {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (occ.inTestFile)
|
|
207
|
+
return false;
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The per-instance dup-body filter: the shared kind/test exclusions plus
|
|
212
|
+
* the size/line floor. The bodySize threshold drops trivial wrappers — a
|
|
213
|
+
* `defineCheck` or pass-through analyze that contains an `if`-guard plus a
|
|
214
|
+
* delegating call. These have identical normalized bodies across many
|
|
215
|
+
* files but are never the right refactor target. Catalogs from older runs
|
|
216
|
+
* that lack `bodySize` skip the size check (treated as "passes").
|
|
217
|
+
*/
|
|
218
|
+
function isInterestingForDup(occ, minLines, minBodySize, features) {
|
|
219
|
+
if (!isEligibleKind(occ))
|
|
220
|
+
return false;
|
|
221
|
+
// The bodyLines feature column is the canonical span (computed once in
|
|
222
|
+
// pipeline/features.ts). The inline `endLine − line + 1` here is the single
|
|
223
|
+
// sanctioned graceful-degrade fallback for features-absent calls (3/4-arg
|
|
224
|
+
// test evaluate), not a duplicate of the engine derivation.
|
|
225
|
+
const span = features?.function.get(occ.bodyHash)?.bodyLines ?? occ.endLine - occ.line + 1;
|
|
226
|
+
if (span < minLines)
|
|
227
|
+
return false;
|
|
228
|
+
if (occ.bodySize !== undefined && occ.bodySize < minBodySize)
|
|
229
|
+
return false;
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=duplicated-function-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicated-function-body.js","sourceRoot":"","sources":["../../src/rules/duplicated-function-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:high-blast-untested (flagship) — flag high-reach functions that are
|
|
3
|
+
* NOT exercised by any test. The combination gate ADR-0001 sanctions: a raw
|
|
4
|
+
* metric (`blast`) gates only as an **ABSOLUTE-threshold input** to a bounded,
|
|
5
|
+
* actionable predicate, never as a ranking/percentile.
|
|
6
|
+
*
|
|
7
|
+
* Predicate (per occurrence): `blast.score >= absoluteThreshold && !testReachable`.
|
|
8
|
+
* - test-reachable → skip (a high-blast TESTED function emits nothing).
|
|
9
|
+
* - `blast.score < warn` → skip (a LOW-blast untested function emits nothing — noise).
|
|
10
|
+
* - `blast.score >= error` → base `high`; else (`[warn, error)`) → base `medium`.
|
|
11
|
+
*
|
|
12
|
+
* The count reaches zero once every high-blast function is test-covered →
|
|
13
|
+
* bounded → gateable. The fix is one verb: add a test. Thresholds are in-rule
|
|
14
|
+
* opinionated ABSOLUTE constants, overridable via `config.highBlastWarnThreshold`
|
|
15
|
+
* / `highBlastErrorThreshold` (Phase A). Emitted severity routes through the
|
|
16
|
+
* opt-in `applySeverityOverride` clamp (ADR-0005).
|
|
17
|
+
*
|
|
18
|
+
* Feature columns: `blast` (composite reach score `direct + 0.5 × transitive`)
|
|
19
|
+
* and `testReachable` (the boolean companion to `reachableOnlyFromTests`).
|
|
20
|
+
* Both are needed-only `featureDeps`. When the columns are absent (e.g. a
|
|
21
|
+
* 3/4-arg test call with no features), the rule degrades to emitting nothing
|
|
22
|
+
* (spec Applicable Conventions: absent column → emit nothing) — blast/test
|
|
23
|
+
* reachability are NOT cheaply recomputable in-rule, so there is no fallback.
|
|
24
|
+
*/
|
|
25
|
+
export declare const highBlastUntestedRule: import("../types.js").Rule;
|
|
26
|
+
//# sourceMappingURL=high-blast-untested.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high-blast-untested.d.ts","sourceRoot":"","sources":["../../src/rules/high-blast-untested.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,eAAO,MAAM,qBAAqB,4BAiDhC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:high-blast-untested (flagship) — flag high-reach functions that are
|
|
3
|
+
* NOT exercised by any test. The combination gate ADR-0001 sanctions: a raw
|
|
4
|
+
* metric (`blast`) gates only as an **ABSOLUTE-threshold input** to a bounded,
|
|
5
|
+
* actionable predicate, never as a ranking/percentile.
|
|
6
|
+
*
|
|
7
|
+
* Predicate (per occurrence): `blast.score >= absoluteThreshold && !testReachable`.
|
|
8
|
+
* - test-reachable → skip (a high-blast TESTED function emits nothing).
|
|
9
|
+
* - `blast.score < warn` → skip (a LOW-blast untested function emits nothing — noise).
|
|
10
|
+
* - `blast.score >= error` → base `high`; else (`[warn, error)`) → base `medium`.
|
|
11
|
+
*
|
|
12
|
+
* The count reaches zero once every high-blast function is test-covered →
|
|
13
|
+
* bounded → gateable. The fix is one verb: add a test. Thresholds are in-rule
|
|
14
|
+
* opinionated ABSOLUTE constants, overridable via `config.highBlastWarnThreshold`
|
|
15
|
+
* / `highBlastErrorThreshold` (Phase A). Emitted severity routes through the
|
|
16
|
+
* opt-in `applySeverityOverride` clamp (ADR-0005).
|
|
17
|
+
*
|
|
18
|
+
* Feature columns: `blast` (composite reach score `direct + 0.5 × transitive`)
|
|
19
|
+
* and `testReachable` (the boolean companion to `reachableOnlyFromTests`).
|
|
20
|
+
* Both are needed-only `featureDeps`. When the columns are absent (e.g. a
|
|
21
|
+
* 3/4-arg test call with no features), the rule degrades to emitting nothing
|
|
22
|
+
* (spec Applicable Conventions: absent column → emit nothing) — blast/test
|
|
23
|
+
* reachability are NOT cheaply recomputable in-rule, so there is no fallback.
|
|
24
|
+
*/
|
|
25
|
+
import { createGraphSignal } from './create-graph-signal.js';
|
|
26
|
+
import { defineRule } from './define-rule.js';
|
|
27
|
+
const DEFAULT_WARN_BLAST = 75;
|
|
28
|
+
const DEFAULT_ERROR_BLAST = 150;
|
|
29
|
+
export const highBlastUntestedRule = defineRule({
|
|
30
|
+
slug: 'graph:high-blast-untested',
|
|
31
|
+
defaultSeverity: 'warning',
|
|
32
|
+
featureDeps: ['blast', 'reachableOnlyFromTests'],
|
|
33
|
+
evaluate({ indexes, config, features }) {
|
|
34
|
+
// Absent feature table → emit nothing (no in-rule recompute of blast/test
|
|
35
|
+
// reachability; the canonical home is pipeline/features.ts).
|
|
36
|
+
if (!features)
|
|
37
|
+
return [];
|
|
38
|
+
const warn = config.highBlastWarnThreshold ?? DEFAULT_WARN_BLAST;
|
|
39
|
+
const error = config.highBlastErrorThreshold ?? DEFAULT_ERROR_BLAST;
|
|
40
|
+
const signals = [];
|
|
41
|
+
for (const occ of indexes.byBodyHash.values()) {
|
|
42
|
+
/* v8 ignore next */
|
|
43
|
+
if (!occ.filePath)
|
|
44
|
+
continue;
|
|
45
|
+
// A function DEFINED in a test file is itself test code — asking whether
|
|
46
|
+
// it "is reached by a test" is meaningless, so it must never be flagged
|
|
47
|
+
// as a high-blast untested production function. Skip test-file occurrences.
|
|
48
|
+
if (occ.inTestFile)
|
|
49
|
+
continue;
|
|
50
|
+
const row = features.function.get(occ.bodyHash);
|
|
51
|
+
const blast = row?.blast;
|
|
52
|
+
// Blast column absent for this row → can't gate → skip.
|
|
53
|
+
if (!blast)
|
|
54
|
+
continue;
|
|
55
|
+
// A high-blast TESTED function is not a defect — skip. `testReachable`
|
|
56
|
+
// absent ⇒ treat as not-reachable (the column was requested, so absence
|
|
57
|
+
// means the row genuinely has no production/test coverage signal).
|
|
58
|
+
if (row.testReachable === true)
|
|
59
|
+
continue;
|
|
60
|
+
const score = blast.score;
|
|
61
|
+
if (score < warn)
|
|
62
|
+
continue;
|
|
63
|
+
const base = score >= error ? 'high' : 'medium';
|
|
64
|
+
signals.push(createGraphSignal('graph:high-blast-untested', config, {
|
|
65
|
+
severity: base,
|
|
66
|
+
category: 'testing',
|
|
67
|
+
message: `${occ.simpleName} has a high blast radius (score ${String(score)}) but is not reached by any test.`,
|
|
68
|
+
code: { file: occ.filePath, line: occ.line, column: occ.column },
|
|
69
|
+
suggestion: 'Add a test that exercises this high-reach function.',
|
|
70
|
+
metadata: {
|
|
71
|
+
blast: score,
|
|
72
|
+
blastDirect: blast.direct,
|
|
73
|
+
blastTransitive: blast.transitive,
|
|
74
|
+
testReachable: false,
|
|
75
|
+
qualifiedName: occ.qualifiedName,
|
|
76
|
+
},
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
return signals;
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=high-blast-untested.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high-blast-untested.js","sourceRoot":"","sources":["../../src/rules/high-blast-untested.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;IAC9C,IAAI,EAAE,2BAA2B;IACjC,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QACpC,0EAA0E;QAC1E,6DAA6D;QAC7D,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,sBAAsB,IAAI,kBAAkB,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,uBAAuB,IAAI,mBAAmB,CAAC;QAEpE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,oBAAoB;YACpB,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAAE,SAAS;YAC5B,yEAAyE;YACzE,wEAAwE;YACxE,4EAA4E;YAC5E,IAAI,GAAG,CAAC,UAAU;gBAAE,SAAS;YAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,CAAC;YACzB,wDAAwD;YACxD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,uEAAuE;YACvE,wEAAwE;YACxE,mEAAmE;YACnE,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI;gBAAE,SAAS;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,IAAI,KAAK,GAAG,IAAI;gBAAE,SAAS;YAC3B,MAAM,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChD,OAAO,CAAC,IAAI,CACV,iBAAiB,CAAC,2BAA2B,EAAE,MAAM,EAAE;gBACrD,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG,GAAG,CAAC,UAAU,mCAAmC,MAAM,CAAC,KAAK,CAAC,mCAAmC;gBAC7G,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;gBAChE,UAAU,EAAE,qDAAqD;gBACjE,QAAQ,EAAE;oBACR,KAAK,EAAE,KAAK;oBACZ,WAAW,EAAE,KAAK,CAAC,MAAM;oBACzB,eAAe,EAAE,KAAK,CAAC,UAAU;oBACjC,aAAa,EAAE,KAAK;oBACpB,aAAa,EAAE,GAAG,CAAC,aAAa;iBACjC;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:large-function — flag functions whose body is large enough to be
|
|
3
|
+
* worth splitting. A two-band predicate over the `bodyLines` feature column
|
|
4
|
+
* (Phase C: `endLine − line + 1`).
|
|
5
|
+
*
|
|
6
|
+
* Bands (`bodyLines` is the PHYSICAL span `endLine − line + 1`, so it counts
|
|
7
|
+
* comments + blank lines). The gate defaults are calibrated higher than the
|
|
8
|
+
* dashboard's "~80 worth questioning / ~150 too much" heuristic so the gate
|
|
9
|
+
* flags genuinely oversized functions rather than every long-but-fine one
|
|
10
|
+
* (on a real codebase ~80/~150 floods the baseline). Override per-project via
|
|
11
|
+
* config:
|
|
12
|
+
* - `bodyLines <= warn` → no signal.
|
|
13
|
+
* - `(warn, error]` → base `medium`.
|
|
14
|
+
* - `> error` → base `high`.
|
|
15
|
+
*
|
|
16
|
+
* Thresholds are in-rule opinionated constants, overridable via
|
|
17
|
+
* `config.largeFunctionWarnLines` / `largeFunctionErrorLines` (Phase A). The
|
|
18
|
+
* emitted severity routes through the opt-in `applySeverityOverride` clamp
|
|
19
|
+
* (ADR-0005). Language-agnostic: every adapter emits `endLine`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const largeFunctionRule: import("../types.js").Rule;
|
|
22
|
+
//# sourceMappingURL=large-function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"large-function.d.ts","sourceRoot":"","sources":["../../src/rules/large-function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,eAAO,MAAM,iBAAiB,4BAsC5B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:large-function — flag functions whose body is large enough to be
|
|
3
|
+
* worth splitting. A two-band predicate over the `bodyLines` feature column
|
|
4
|
+
* (Phase C: `endLine − line + 1`).
|
|
5
|
+
*
|
|
6
|
+
* Bands (`bodyLines` is the PHYSICAL span `endLine − line + 1`, so it counts
|
|
7
|
+
* comments + blank lines). The gate defaults are calibrated higher than the
|
|
8
|
+
* dashboard's "~80 worth questioning / ~150 too much" heuristic so the gate
|
|
9
|
+
* flags genuinely oversized functions rather than every long-but-fine one
|
|
10
|
+
* (on a real codebase ~80/~150 floods the baseline). Override per-project via
|
|
11
|
+
* config:
|
|
12
|
+
* - `bodyLines <= warn` → no signal.
|
|
13
|
+
* - `(warn, error]` → base `medium`.
|
|
14
|
+
* - `> error` → base `high`.
|
|
15
|
+
*
|
|
16
|
+
* Thresholds are in-rule opinionated constants, overridable via
|
|
17
|
+
* `config.largeFunctionWarnLines` / `largeFunctionErrorLines` (Phase A). The
|
|
18
|
+
* emitted severity routes through the opt-in `applySeverityOverride` clamp
|
|
19
|
+
* (ADR-0005). Language-agnostic: every adapter emits `endLine`.
|
|
20
|
+
*/
|
|
21
|
+
import { createGraphSignal } from './create-graph-signal.js';
|
|
22
|
+
import { defineRule } from './define-rule.js';
|
|
23
|
+
const DEFAULT_WARN_LINES = 300;
|
|
24
|
+
const DEFAULT_ERROR_LINES = 500;
|
|
25
|
+
export const largeFunctionRule = defineRule({
|
|
26
|
+
slug: 'graph:large-function',
|
|
27
|
+
defaultSeverity: 'warning',
|
|
28
|
+
featureDeps: ['bodyLines'],
|
|
29
|
+
evaluate({ indexes, config, features }) {
|
|
30
|
+
const warn = config.largeFunctionWarnLines ?? DEFAULT_WARN_LINES;
|
|
31
|
+
const error = config.largeFunctionErrorLines ?? DEFAULT_ERROR_LINES;
|
|
32
|
+
const signals = [];
|
|
33
|
+
for (const occ of indexes.byBodyHash.values()) {
|
|
34
|
+
// Skip occurrences with empty filePath (defensive, as orphan-subtree does).
|
|
35
|
+
/* v8 ignore next */
|
|
36
|
+
if (!occ.filePath)
|
|
37
|
+
continue;
|
|
38
|
+
// The synthetic `<module-init>` occurrence is the file's whole top-level
|
|
39
|
+
// body, not a function — flagging it turns this into a "file too long"
|
|
40
|
+
// check (a signal that already lives in the fitness file-length check),
|
|
41
|
+
// and test files are not production functions to split. Skip both so this
|
|
42
|
+
// rule flags actual long FUNCTIONS in production code.
|
|
43
|
+
if (occ.kind === 'module-init' || occ.inTestFile)
|
|
44
|
+
continue;
|
|
45
|
+
const bodyLines = resolveBodyLines(occ, features);
|
|
46
|
+
if (bodyLines <= warn)
|
|
47
|
+
continue;
|
|
48
|
+
const base = bodyLines > error ? 'high' : 'medium';
|
|
49
|
+
signals.push(createGraphSignal('graph:large-function', config, {
|
|
50
|
+
severity: base,
|
|
51
|
+
category: 'quality',
|
|
52
|
+
message: `${occ.simpleName} is ${String(bodyLines)} lines long.`,
|
|
53
|
+
code: { file: occ.filePath, line: occ.line, column: occ.column },
|
|
54
|
+
suggestion: 'Split this function into smaller units.',
|
|
55
|
+
metadata: {
|
|
56
|
+
bodyLines,
|
|
57
|
+
qualifiedName: occ.qualifiedName,
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
return signals;
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Body length from the `bodyLines` feature column when present; otherwise the
|
|
66
|
+
* inline `endLine − line + 1` span (the single sanctioned graceful-degrade
|
|
67
|
+
* fallback — same formula the engine's feature derivation uses).
|
|
68
|
+
*/
|
|
69
|
+
function resolveBodyLines(occ, features) {
|
|
70
|
+
return features?.function.get(occ.bodyHash)?.bodyLines ?? occ.endLine - occ.line + 1;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=large-function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"large-function.js","sourceRoot":"","sources":["../../src/rules/large-function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,sBAAsB;IAC5B,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,sBAAsB,IAAI,kBAAkB,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,uBAAuB,IAAI,mBAAmB,CAAC;QAEpE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,4EAA4E;YAC5E,oBAAoB;YACpB,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAAE,SAAS;YAC5B,yEAAyE;YACzE,uEAAuE;YACvE,wEAAwE;YACxE,0EAA0E;YAC1E,uDAAuD;YACvD,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,UAAU;gBAAE,SAAS;YAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,SAAS,IAAI,IAAI;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,iBAAiB,CAAC,sBAAsB,EAAE,MAAM,EAAE;gBAChD,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG,GAAG,CAAC,UAAU,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc;gBAChE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;gBAChE,UAAU,EAAE,yCAAyC;gBACrD,QAAQ,EAAE;oBACR,SAAS;oBACT,aAAa,EAAE,GAAG,CAAC,aAAa;iBACjC;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAuB,EAAE,QAAkC;IACnF,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph:no-side-effect-path — flag functions that are pure-by-design
|
|
3
|
+
* AND whose return value is discarded by at least one caller, i.e.
|
|
4
|
+
* functions whose computation has no observable effect on the program.
|
|
5
|
+
*
|
|
6
|
+
* Heuristic, in order:
|
|
7
|
+
* 1. The function's entire transitive callee set is side-effect free
|
|
8
|
+
* (no I/O, logging, mutation, or unresolved edges).
|
|
9
|
+
* 2. At least one inbound caller invokes this function as an
|
|
10
|
+
* ExpressionStatement (its return value is discarded).
|
|
11
|
+
*
|
|
12
|
+
* Step 2 is what makes the signal actionable. A pure function that
|
|
13
|
+
* returns data is a feature when its return value is consumed
|
|
14
|
+
* (`const x = pureHelper(...)`); it is dead code when the value is
|
|
15
|
+
* thrown away (`pureHelper(...);` as a standalone statement).
|
|
16
|
+
*
|
|
17
|
+
* Catalogs from older runs that lack the `discarded` field on call
|
|
18
|
+
* edges fall back to the legacy "any pure callee" check.
|
|
19
|
+
*
|
|
20
|
+
* Side-effect primitives are language-specific. The active adapter
|
|
21
|
+
* supplies `ruleHints.sideEffectPrimitives` (e.g. `print`, `os.system`
|
|
22
|
+
* for Python; `println!`, `panic!` for Rust). When the hint is
|
|
23
|
+
* absent — older adapters, third-party adapters that don't populate
|
|
24
|
+
* it, unit tests that don't pass hints — we fall back to a
|
|
25
|
+
* TypeScript-shaped textual regex so the rule never silently goes
|
|
26
|
+
* dark on a TS project. The fidelity matrix in the graph
|
|
27
|
+
* rules-and-gating documentation enumerates which rules degrade
|
|
28
|
+
* gracefully when an adapter omits a given hint.
|
|
29
|
+
*/
|
|
30
|
+
export declare const noSideEffectPathRule: import("../types.js").Rule;
|
|
31
|
+
//# sourceMappingURL=no-side-effect-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-side-effect-path.d.ts","sourceRoot":"","sources":["../../src/rules/no-side-effect-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAyCH,eAAO,MAAM,oBAAoB,4BA8B/B,CAAC"}
|