@zxyycom/vibe-check 0.0.1
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 +21 -0
- package/README.md +154 -0
- package/dist/esm/check/check.mjs +5 -0
- package/dist/esm/check/check.mjs.map +1 -0
- package/dist/esm/check/descriptor-validation.mjs +37 -0
- package/dist/esm/check/descriptor-validation.mjs.map +1 -0
- package/dist/esm/check/descriptor.mjs +2 -0
- package/dist/esm/check/descriptor.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +62 -0
- package/dist/esm/check/inherited-collection.mjs.map +1 -0
- package/dist/esm/check/options-snapshot.mjs +75 -0
- package/dist/esm/check/options-snapshot.mjs.map +1 -0
- package/dist/esm/check-settlement/fact-validation.mjs +216 -0
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs +2 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs +80 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +59 -0
- package/dist/esm/check-settlement/record-store.mjs.map +1 -0
- package/dist/esm/check-settlement/session.mjs +179 -0
- package/dist/esm/check-settlement/session.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-data.mjs +159 -0
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-json.mjs +2 -0
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -0
- package/dist/esm/data-boundary/closed-values.mjs +98 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -0
- package/dist/esm/data-boundary/value-shapes.mjs +13 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -0
- package/dist/esm/finding-waivers/reconciliation.mjs +84 -0
- package/dist/esm/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/index.mjs +26 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +102 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs +14 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs.map +1 -0
- package/dist/esm/machine-output/v4/projection.mjs +23 -0
- package/dist/esm/machine-output/v4/projection.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs +59 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-model.mjs +19 -0
- package/dist/esm/machine-output/v4/publication-model.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publish.mjs +20 -0
- package/dist/esm/machine-output/v4/publish.mjs.map +1 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs +9 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs +8 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema.mjs +50 -0
- package/dist/esm/machine-output/v4/schema.mjs.map +1 -0
- package/dist/esm/machine-output/v4/serializers.mjs +9 -0
- package/dist/esm/machine-output/v4/serializers.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation-result.mjs +16 -0
- package/dist/esm/machine-output/v4/validation-result.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation.mjs +131 -0
- package/dist/esm/machine-output/v4/validation.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +49 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +71 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +37 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs +38 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs +47 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs +44 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +124 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +77 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +87 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +94 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +180 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs +10 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs +151 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +126 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +60 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs +5 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs +119 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs +39 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs +170 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs +33 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +82 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/records.mjs +109 -0
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +59 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs +17 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs +145 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +54 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/final-data-parsing.mjs +35 -0
- package/dist/esm/package-checks/final-data-parsing.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +43 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs +178 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +64 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +17 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +138 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +71 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/records.mjs +133 -0
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs +4 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs +81 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +51 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/path.mjs +18 -0
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs +13 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs +2 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs +19 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs +34 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs +33 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs +30 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs +163 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs +141 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs +64 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs +35 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs +118 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs +45 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +212 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +128 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs +71 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs +190 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +234 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs +27 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs +138 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs +33 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs +16 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs +73 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs +153 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +155 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +58 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs +125 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs +72 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +55 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +199 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +109 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs +28 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs +158 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +17 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +191 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +83 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +50 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs +2 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs +32 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +196 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs +23 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs +41 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +142 -0
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs +11 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/configuration.mjs +104 -0
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs +24 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs +36 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +57 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +72 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs +13 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs +30 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs +19 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +102 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +242 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +50 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs +60 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +7 -0
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -0
- package/dist/esm/project-definition/output-validation.mjs +44 -0
- package/dist/esm/project-definition/output-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +95 -0
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition.mjs +92 -0
- package/dist/esm/project-definition/project-definition.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +66 -0
- package/dist/esm/project-run/aggregation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +70 -0
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +50 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +103 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +90 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +38 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/plan.mjs +35 -0
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs +83 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight.mjs +186 -0
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +168 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +49 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -0
- package/dist/esm/project-run/completion.mjs +173 -0
- package/dist/esm/project-run/completion.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs +2 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +61 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation-result.mjs +2 -0
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation.mjs +156 -0
- package/dist/esm/project-run/controls/validation.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +182 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +242 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -0
- package/dist/esm/project-run/invocation-creation.mjs +111 -0
- package/dist/esm/project-run/invocation-creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation.mjs +195 -0
- package/dist/esm/project-run/invocation.mjs.map +1 -0
- package/dist/esm/project-run/machine-publication.mjs +16 -0
- package/dist/esm/project-run/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/output-configuration.mjs +17 -0
- package/dist/esm/project-run/output-configuration.mjs.map +1 -0
- package/dist/esm/project-run/output-status.mjs +43 -0
- package/dist/esm/project-run/output-status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +135 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +100 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +123 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs +12 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -0
- package/dist/esm/project-run/project-context.mjs +8 -0
- package/dist/esm/project-run/project-context.mjs.map +1 -0
- package/dist/esm/project-run/result.mjs +54 -0
- package/dist/esm/project-run/result.mjs.map +1 -0
- package/dist/esm/project-run/run.mjs +23 -0
- package/dist/esm/project-run/run.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +82 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +27 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +125 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +74 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +147 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -0
- package/docs/api-mechanics.md +205 -0
- package/docs/checks/duplicate-detection.md +195 -0
- package/docs/checks/file-metrics.md +229 -0
- package/docs/checks/function-metrics.md +222 -0
- package/docs/checks/json-schema-validation.md +190 -0
- package/docs/checks/json-validation.md +133 -0
- package/docs/checks/maintenance-reminders.md +158 -0
- package/docs/checks/markdown-link-validation.md +192 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +195 -0
- package/docs/examples/artifacts/mixed-outcomes/records.ndjson +2 -0
- package/docs/examples/artifacts/mixed-outcomes/run.json +70 -0
- package/docs/output.md +97 -0
- package/docs/schemas/vibe-check-record.schema.json +33 -0
- package/docs/schemas/vibe-check-run.schema.json +173 -0
- package/index.mjs +1 -0
- package/package.json +49 -0
- package/src/check/check.ts +497 -0
- package/src/check/descriptor-validation.ts +60 -0
- package/src/check/descriptor.ts +5 -0
- package/src/check/inherited-collection.ts +101 -0
- package/src/check/options-snapshot.ts +80 -0
- package/src/check-settlement/fact-validation.ts +289 -0
- package/src/check-settlement/facts.ts +27 -0
- package/src/check-settlement/outcome-normalization.ts +118 -0
- package/src/check-settlement/record-store.ts +73 -0
- package/src/check-settlement/session.ts +257 -0
- package/src/data-boundary/canonical-data.ts +188 -0
- package/src/data-boundary/canonical-json.ts +11 -0
- package/src/data-boundary/closed-values.ts +126 -0
- package/src/data-boundary/value-shapes.ts +15 -0
- package/src/finding-waivers/reconciliation.ts +176 -0
- package/src/index.ts +123 -0
- package/src/machine-output/v4/atomic-publication.ts +123 -0
- package/src/machine-output/v4/freeze-publication-value.ts +12 -0
- package/src/machine-output/v4/projection.ts +36 -0
- package/src/machine-output/v4/publication-invariants.ts +89 -0
- package/src/machine-output/v4/publication-model.ts +38 -0
- package/src/machine-output/v4/publish.ts +23 -0
- package/src/machine-output/v4/records-fingerprint.ts +12 -0
- package/src/machine-output/v4/schema-identities.ts +8 -0
- package/src/machine-output/v4/schema.ts +97 -0
- package/src/machine-output/v4/serializers.ts +18 -0
- package/src/machine-output/v4/validation-result.ts +59 -0
- package/src/machine-output/v4/validation.ts +166 -0
- package/src/package-checks/code-quality-findings/policy.ts +85 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +103 -0
- package/src/package-checks/duplicate-detection/cache/cache-contract.ts +49 -0
- package/src/package-checks/duplicate-detection/cache/identity.ts +61 -0
- package/src/package-checks/duplicate-detection/cache/key.ts +46 -0
- package/src/package-checks/duplicate-detection/cache/payload.ts +78 -0
- package/src/package-checks/duplicate-detection/cache/store.ts +77 -0
- package/src/package-checks/duplicate-detection/default-check.ts +50 -0
- package/src/package-checks/duplicate-detection/execution.ts +168 -0
- package/src/package-checks/duplicate-detection/final-data.ts +10 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/command-path.ts +8 -0
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +112 -0
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner-contract.ts +18 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +257 -0
- package/src/package-checks/duplicate-detection/jscpd/scoped-fragments.ts +17 -0
- package/src/package-checks/duplicate-detection/measurement-model.ts +44 -0
- package/src/package-checks/duplicate-detection/measurement.ts +223 -0
- package/src/package-checks/duplicate-detection/options-resolution.ts +162 -0
- package/src/package-checks/duplicate-detection/options-validation.ts +75 -0
- package/src/package-checks/duplicate-detection/options.ts +72 -0
- package/src/package-checks/duplicate-detection/project-revision.ts +5 -0
- package/src/package-checks/duplicate-detection/records.ts +171 -0
- package/src/package-checks/file-metrics/constructor.ts +46 -0
- package/src/package-checks/file-metrics/execution.ts +233 -0
- package/src/package-checks/file-metrics/final-data.ts +10 -0
- package/src/package-checks/file-metrics/measurement-model.ts +10 -0
- package/src/package-checks/file-metrics/measurement.ts +52 -0
- package/src/package-checks/file-metrics/options-resolution.ts +213 -0
- package/src/package-checks/file-metrics/options-validation.ts +104 -0
- package/src/package-checks/file-metrics/options.ts +91 -0
- package/src/package-checks/file-metrics/records.ts +182 -0
- package/src/package-checks/file-metrics/scc/availability.ts +100 -0
- package/src/package-checks/file-metrics/scc/csv.ts +20 -0
- package/src/package-checks/file-metrics/scc/parser.ts +223 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +68 -0
- package/src/package-checks/final-data-parsing.ts +49 -0
- package/src/package-checks/function-metrics/analysis.ts +138 -0
- package/src/package-checks/function-metrics/constructor.ts +55 -0
- package/src/package-checks/function-metrics/execution.ts +263 -0
- package/src/package-checks/function-metrics/final-data.ts +10 -0
- package/src/package-checks/function-metrics/lizard/availability.ts +90 -0
- package/src/package-checks/function-metrics/lizard/csv.ts +20 -0
- package/src/package-checks/function-metrics/lizard/parser.ts +179 -0
- package/src/package-checks/function-metrics/lizard/scanner.ts +62 -0
- package/src/package-checks/function-metrics/measurement-model.ts +30 -0
- package/src/package-checks/function-metrics/measurement.ts +57 -0
- package/src/package-checks/function-metrics/options-resolution.ts +215 -0
- package/src/package-checks/function-metrics/options-validation.ts +89 -0
- package/src/package-checks/function-metrics/options.ts +84 -0
- package/src/package-checks/function-metrics/records.ts +254 -0
- package/src/package-checks/function-metrics/target-files.ts +85 -0
- package/src/package-checks/host-environment/error-message.ts +3 -0
- package/src/package-checks/host-environment/filesystem.ts +110 -0
- package/src/package-checks/host-environment/git.ts +68 -0
- package/src/package-checks/host-environment/path.ts +20 -0
- package/src/package-checks/host-environment/process/command.ts +21 -0
- package/src/package-checks/host-environment/process/contract.ts +56 -0
- package/src/package-checks/host-environment/process/env.ts +25 -0
- package/src/package-checks/host-environment/process/failure.ts +40 -0
- package/src/package-checks/host-environment/process/result.ts +39 -0
- package/src/package-checks/host-environment/process/runner.ts +47 -0
- package/src/package-checks/json-document/strict-document.ts +209 -0
- package/src/package-checks/json-schema-validation/default-check.ts +54 -0
- package/src/package-checks/json-schema-validation/execution-stages.ts +230 -0
- package/src/package-checks/json-schema-validation/final-data.ts +115 -0
- package/src/package-checks/json-schema-validation/issue-collector.ts +43 -0
- package/src/package-checks/json-schema-validation/json-schema-validation.ts +191 -0
- package/src/package-checks/json-schema-validation/options-resolution.ts +61 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +256 -0
- package/src/package-checks/json-schema-validation/options.ts +66 -0
- package/src/package-checks/json-schema-validation/reference-resolver.ts +165 -0
- package/src/package-checks/json-schema-validation/remote-response.ts +84 -0
- package/src/package-checks/json-schema-validation/schema-engine.ts +263 -0
- package/src/package-checks/json-schema-validation/schema-policy.ts +275 -0
- package/src/package-checks/json-validation/default-check.ts +48 -0
- package/src/package-checks/json-validation/final-data.ts +46 -0
- package/src/package-checks/json-validation/json-validation.ts +212 -0
- package/src/package-checks/json-validation/options-resolution.ts +50 -0
- package/src/package-checks/json-validation/options-validation.ts +27 -0
- package/src/package-checks/json-validation/options.ts +18 -0
- package/src/package-checks/maintenance-reminders/assessment-results.ts +117 -0
- package/src/package-checks/maintenance-reminders/final-data.ts +239 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +264 -0
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +67 -0
- package/src/package-checks/maintenance-reminders/measurement.ts +183 -0
- package/src/package-checks/maintenance-reminders/options-validation.ts +88 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +70 -0
- package/src/package-checks/markdown-link-validation/execution.ts +325 -0
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +127 -0
- package/src/package-checks/markdown-link-validation/final-data.ts +47 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +306 -0
- package/src/package-checks/markdown-link-validation/local-resolver.ts +51 -0
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +302 -0
- package/src/package-checks/markdown-link-validation/options-resolution.ts +114 -0
- package/src/package-checks/markdown-link-validation/options-validation.ts +72 -0
- package/src/package-checks/markdown-link-validation/options.ts +50 -0
- package/src/package-checks/markdown-link-validation/records.ts +77 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +276 -0
- package/src/package-checks/markdown-link-validation/target-descriptor.ts +34 -0
- package/src/package-checks/markdown-link-validation/traversal-result.ts +58 -0
- package/src/package-checks/project-files/collection.ts +199 -0
- package/src/package-checks/project-files/config-glob.ts +17 -0
- package/src/package-checks/project-files/configuration.ts +152 -0
- package/src/package-checks/project-files/exact-input-measurement.ts +38 -0
- package/src/package-checks/project-files/file-fingerprint.ts +46 -0
- package/src/package-checks/project-files/gitlink-revision.ts +82 -0
- package/src/package-checks/project-files/gitlink-worktree.ts +106 -0
- package/src/package-checks/project-files/input-eligibility.ts +21 -0
- package/src/package-checks/project-files/reported-path.ts +35 -0
- package/src/package-checks/project-files/revision-paths.ts +34 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +148 -0
- package/src/project-definition/check-tree/authoring.ts +332 -0
- package/src/project-definition/check-tree/materialization.ts +56 -0
- package/src/project-definition/check-tree/resolution.ts +108 -0
- package/src/project-definition/output-defaults.ts +6 -0
- package/src/project-definition/output-validation.ts +54 -0
- package/src/project-definition/project-definition-validation.ts +123 -0
- package/src/project-definition/project-definition.ts +184 -0
- package/src/project-run/aggregation.ts +90 -0
- package/src/project-run/check-execution/callback.ts +106 -0
- package/src/project-run/check-execution/dependencies.ts +70 -0
- package/src/project-run/check-execution/execution-finalization.ts +177 -0
- package/src/project-run/check-execution/execution-settlement.ts +147 -0
- package/src/project-run/check-execution/messages.ts +46 -0
- package/src/project-run/check-execution/plan.ts +46 -0
- package/src/project-run/check-execution/preflight-result.ts +131 -0
- package/src/project-run/check-execution/preflight.ts +321 -0
- package/src/project-run/check-execution/resolved-checks.ts +285 -0
- package/src/project-run/check-execution/terminal-result.ts +74 -0
- package/src/project-run/completion.ts +263 -0
- package/src/project-run/controls/contract.ts +24 -0
- package/src/project-run/controls/outputs-override-validation.ts +86 -0
- package/src/project-run/controls/validation-result.ts +12 -0
- package/src/project-run/controls/validation.ts +176 -0
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +223 -0
- package/src/project-run/diagnostic-logging/logger.ts +325 -0
- package/src/project-run/invocation-creation.ts +160 -0
- package/src/project-run/invocation.ts +303 -0
- package/src/project-run/machine-publication.ts +23 -0
- package/src/project-run/output-configuration.ts +24 -0
- package/src/project-run/output-status.ts +69 -0
- package/src/project-run/progress-rendering/presentation.ts +189 -0
- package/src/project-run/progress-rendering/renderer-formatting.ts +141 -0
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +152 -0
- package/src/project-run/progress-rendering/renderer.ts +68 -0
- package/src/project-run/project-context.ts +11 -0
- package/src/project-run/result.ts +175 -0
- package/src/project-run/run.ts +50 -0
- package/src/project-run/task-scheduler/execution-state.ts +153 -0
- package/src/project-run/task-scheduler/graph-validation.ts +176 -0
- package/src/project-run/task-scheduler/graph.ts +185 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +177 -0
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +42 -0
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +199 -0
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +158 -0
- package/src/project-run/task-scheduler/scheduler-decision.ts +103 -0
- package/src/project-run/task-scheduler/scheduler.ts +228 -0
- package/third-party-licenses/momoa-3.3.12-LICENSE +201 -0
- package/types/check/check.d.ts +350 -0
- package/types/check/descriptor-validation.d.ts +18 -0
- package/types/check/descriptor.d.ts +5 -0
- package/types/check/inherited-collection.d.ts +35 -0
- package/types/check/options-snapshot.d.ts +2 -0
- package/types/check-settlement/fact-validation.d.ts +14 -0
- package/types/check-settlement/facts.d.ts +19 -0
- package/types/check-settlement/outcome-normalization.d.ts +9 -0
- package/types/check-settlement/record-store.d.ts +14 -0
- package/types/check-settlement/session.d.ts +41 -0
- package/types/data-boundary/canonical-data.d.ts +13 -0
- package/types/data-boundary/canonical-json.d.ts +6 -0
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +4 -0
- package/types/finding-waivers/reconciliation.d.ts +66 -0
- package/types/index.d.ts +57 -0
- package/types/machine-output/v4/atomic-publication.d.ts +9 -0
- package/types/machine-output/v4/freeze-publication-value.d.ts +6 -0
- package/types/machine-output/v4/projection.d.ts +7 -0
- package/types/machine-output/v4/publication-invariants.d.ts +3 -0
- package/types/machine-output/v4/publication-model.d.ts +15 -0
- package/types/machine-output/v4/publish.d.ts +7 -0
- package/types/machine-output/v4/records-fingerprint.d.ts +4 -0
- package/types/machine-output/v4/schema-identities.d.ts +7 -0
- package/types/machine-output/v4/schema.d.ts +44 -0
- package/types/machine-output/v4/serializers.d.ts +6 -0
- package/types/machine-output/v4/validation-result.d.ts +26 -0
- package/types/machine-output/v4/validation.d.ts +6 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +20 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +3 -0
- package/types/package-checks/duplicate-detection/cache/cache-contract.d.ts +48 -0
- package/types/package-checks/duplicate-detection/cache/identity.d.ts +17 -0
- package/types/package-checks/duplicate-detection/cache/key.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/payload.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/store.d.ts +18 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +11 -0
- package/types/package-checks/duplicate-detection/execution.d.ts +11 -0
- package/types/package-checks/duplicate-detection/final-data.d.ts +5 -0
- package/types/package-checks/duplicate-detection/jscpd/availability.d.ts +19 -0
- package/types/package-checks/duplicate-detection/jscpd/command-path.d.ts +1 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +23 -0
- package/types/package-checks/duplicate-detection/jscpd/json-report.d.ts +2 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner-contract.d.ts +11 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner.d.ts +21 -0
- package/types/package-checks/duplicate-detection/jscpd/scoped-fragments.d.ts +4 -0
- package/types/package-checks/duplicate-detection/measurement-model.d.ts +36 -0
- package/types/package-checks/duplicate-detection/measurement.d.ts +14 -0
- package/types/package-checks/duplicate-detection/options-resolution.d.ts +3 -0
- package/types/package-checks/duplicate-detection/options-validation.d.ts +1 -0
- package/types/package-checks/duplicate-detection/options.d.ts +65 -0
- package/types/package-checks/duplicate-detection/project-revision.d.ts +1 -0
- package/types/package-checks/duplicate-detection/records.d.ts +22 -0
- package/types/package-checks/file-metrics/constructor.d.ts +11 -0
- package/types/package-checks/file-metrics/execution.d.ts +11 -0
- package/types/package-checks/file-metrics/final-data.d.ts +5 -0
- package/types/package-checks/file-metrics/measurement-model.d.ts +12 -0
- package/types/package-checks/file-metrics/measurement.d.ts +13 -0
- package/types/package-checks/file-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/file-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/file-metrics/options.d.ts +75 -0
- package/types/package-checks/file-metrics/records.d.ts +43 -0
- package/types/package-checks/file-metrics/scc/availability.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/csv.d.ts +1 -0
- package/types/package-checks/file-metrics/scc/parser.d.ts +25 -0
- package/types/package-checks/file-metrics/scc/scanner.d.ts +14 -0
- package/types/package-checks/final-data-parsing.d.ts +9 -0
- package/types/package-checks/function-metrics/analysis.d.ts +10 -0
- package/types/package-checks/function-metrics/constructor.d.ts +11 -0
- package/types/package-checks/function-metrics/execution.d.ts +7 -0
- package/types/package-checks/function-metrics/final-data.d.ts +5 -0
- package/types/package-checks/function-metrics/lizard/availability.d.ts +11 -0
- package/types/package-checks/function-metrics/lizard/csv.d.ts +1 -0
- package/types/package-checks/function-metrics/lizard/parser.d.ts +17 -0
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +15 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +26 -0
- package/types/package-checks/function-metrics/measurement.d.ts +21 -0
- package/types/package-checks/function-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/function-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/function-metrics/options.d.ts +76 -0
- package/types/package-checks/function-metrics/records.d.ts +37 -0
- package/types/package-checks/function-metrics/target-files.d.ts +3 -0
- package/types/package-checks/host-environment/error-message.d.ts +1 -0
- package/types/package-checks/host-environment/filesystem.d.ts +19 -0
- package/types/package-checks/host-environment/git.d.ts +13 -0
- package/types/package-checks/host-environment/path.d.ts +3 -0
- package/types/package-checks/host-environment/process/command.d.ts +7 -0
- package/types/package-checks/host-environment/process/contract.d.ts +50 -0
- package/types/package-checks/host-environment/process/env.d.ts +16 -0
- package/types/package-checks/host-environment/process/failure.d.ts +4 -0
- package/types/package-checks/host-environment/process/result.d.ts +2 -0
- package/types/package-checks/host-environment/process/runner.d.ts +3 -0
- package/types/package-checks/json-document/strict-document.d.ts +35 -0
- package/types/package-checks/json-schema-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-schema-validation/execution-stages.d.ts +27 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +15 -0
- package/types/package-checks/json-schema-validation/issue-collector.d.ts +12 -0
- package/types/package-checks/json-schema-validation/json-schema-validation.d.ts +42 -0
- package/types/package-checks/json-schema-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-schema-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-schema-validation/options.d.ts +53 -0
- package/types/package-checks/json-schema-validation/reference-resolver.d.ts +23 -0
- package/types/package-checks/json-schema-validation/remote-response.d.ts +2 -0
- package/types/package-checks/json-schema-validation/schema-engine.d.ts +33 -0
- package/types/package-checks/json-schema-validation/schema-policy.d.ts +17 -0
- package/types/package-checks/json-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-validation/final-data.d.ts +10 -0
- package/types/package-checks/json-validation/json-validation.d.ts +28 -0
- package/types/package-checks/json-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-validation/options.d.ts +13 -0
- package/types/package-checks/maintenance-reminders/assessment-results.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +47 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +111 -0
- package/types/package-checks/maintenance-reminders/maintenance-support.d.ts +7 -0
- package/types/package-checks/maintenance-reminders/measurement.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/options-validation.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +27 -0
- package/types/package-checks/markdown-link-validation/execution.d.ts +12 -0
- package/types/package-checks/markdown-link-validation/filesystem-probes.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/final-data.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +92 -0
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/markdown-parser.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-link-validation/options.d.ts +43 -0
- package/types/package-checks/markdown-link-validation/records.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/target-descriptor.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/traversal-result.d.ts +12 -0
- package/types/package-checks/project-files/collection.d.ts +9 -0
- package/types/package-checks/project-files/config-glob.d.ts +5 -0
- package/types/package-checks/project-files/configuration.d.ts +31 -0
- package/types/package-checks/project-files/exact-input-measurement.d.ts +12 -0
- package/types/package-checks/project-files/file-fingerprint.d.ts +7 -0
- package/types/package-checks/project-files/gitlink-revision.d.ts +9 -0
- package/types/package-checks/project-files/gitlink-worktree.d.ts +26 -0
- package/types/package-checks/project-files/input-eligibility.d.ts +7 -0
- package/types/package-checks/project-files/reported-path.d.ts +1 -0
- package/types/package-checks/project-files/revision-paths.d.ts +12 -0
- package/types/package-checks/project-files/revision-worktree-files.d.ts +5 -0
- package/types/project-definition/check-tree/authoring.d.ts +41 -0
- package/types/project-definition/check-tree/materialization.d.ts +4 -0
- package/types/project-definition/check-tree/resolution.d.ts +25 -0
- package/types/project-definition/output-defaults.d.ts +14 -0
- package/types/project-definition/output-validation.d.ts +3 -0
- package/types/project-definition/project-definition-validation.d.ts +6 -0
- package/types/project-definition/project-definition.d.ts +88 -0
- package/types/project-run/aggregation.d.ts +7 -0
- package/types/project-run/check-execution/callback.d.ts +24 -0
- package/types/project-run/check-execution/dependencies.d.ts +9 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +18 -0
- package/types/project-run/check-execution/execution-settlement.d.ts +41 -0
- package/types/project-run/check-execution/messages.d.ts +3 -0
- package/types/project-run/check-execution/plan.d.ts +10 -0
- package/types/project-run/check-execution/preflight-result.d.ts +23 -0
- package/types/project-run/check-execution/preflight.d.ts +27 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +51 -0
- package/types/project-run/check-execution/terminal-result.d.ts +27 -0
- package/types/project-run/completion.d.ts +14 -0
- package/types/project-run/controls/contract.d.ts +24 -0
- package/types/project-run/controls/outputs-override-validation.d.ts +3 -0
- package/types/project-run/controls/validation-result.d.ts +14 -0
- package/types/project-run/controls/validation.d.ts +3 -0
- package/types/project-run/diagnostic-logging/diagnostic-detail-rendering.d.ts +11 -0
- package/types/project-run/diagnostic-logging/logger.d.ts +33 -0
- package/types/project-run/invocation-creation.d.ts +12 -0
- package/types/project-run/invocation.d.ts +34 -0
- package/types/project-run/machine-publication.d.ts +10 -0
- package/types/project-run/output-configuration.d.ts +3 -0
- package/types/project-run/output-status.d.ts +21 -0
- package/types/project-run/progress-rendering/presentation.d.ts +28 -0
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +23 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +24 -0
- package/types/project-run/progress-rendering/renderer.d.ts +44 -0
- package/types/project-run/project-context.d.ts +7 -0
- package/types/project-run/result.d.ts +99 -0
- package/types/project-run/run.d.ts +18 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +67 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +11 -0
- package/types/project-run/task-scheduler/graph.d.ts +40 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler-blocker-summary.d.ts +4 -0
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +24 -0
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +94 -0
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler.d.ts +3 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineCheck } from "../../check/check.mjs";
|
|
2
|
+
import { executeFunctionMetrics } from "./execution.mjs";
|
|
3
|
+
import { parseFunctionMetricsData } from "./final-data.mjs";
|
|
4
|
+
import { resolveFunctionMetricsOptions } from "./options-resolution.mjs";
|
|
5
|
+
import { validResolvedFunctionMetricsOptions } from "./options-validation.mjs";
|
|
6
|
+
const FUNCTION_METRICS_CHECK_DEFINITION = {
|
|
7
|
+
checkId: "function-metrics",
|
|
8
|
+
displayName: "Function metrics"
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 使用可省略的区域、阈值与 finding policy 构造一个完整 function-metrics Check。
|
|
12
|
+
*
|
|
13
|
+
* @param options - 省略字段由 package 补齐;显式 files 数组完整替换对应字段的默认数组。
|
|
14
|
+
* @returns 固定 `function-metrics` identity、完整冻结 options、preflight 与 execution。
|
|
15
|
+
* @throws {TypeError} input 含未知字段、空 area、非法 finding policy、非法 limit 或空 executable 时抛出。
|
|
16
|
+
*/
|
|
17
|
+
export function functionMetrics(options = {}) {
|
|
18
|
+
const resolvedOptions = resolveFunctionMetricsOptions(options);
|
|
19
|
+
if (resolvedOptions === undefined) {
|
|
20
|
+
throw new TypeError("functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies, positive safe-integer limits, and a non-empty scanner executable");
|
|
21
|
+
}
|
|
22
|
+
return defineCheck({
|
|
23
|
+
...FUNCTION_METRICS_CHECK_DEFINITION,
|
|
24
|
+
execution: executeFunctionMetrics,
|
|
25
|
+
parseData: parseFunctionMetricsData,
|
|
26
|
+
preflight: (preparedOptions) => validResolvedFunctionMetricsOptions(preparedOptions)
|
|
27
|
+
? { status: "success", preparedOptions }
|
|
28
|
+
: {
|
|
29
|
+
status: "failure",
|
|
30
|
+
action: "block",
|
|
31
|
+
reason: { code: "invalid-options" },
|
|
32
|
+
messages: [
|
|
33
|
+
{
|
|
34
|
+
code: "invalid-options",
|
|
35
|
+
level: "error",
|
|
36
|
+
message: "functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options."
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
options: resolvedOptions
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=constructor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAE9E,MAAM,iCAAiC,GAAG;IACxC,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,kBAAkB;CACvB,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAO,GAA2B,EAAE;IAMpC,MAAM,eAAe,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,oLAAoL,CACrL,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,iCAAiC;QACpC,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,wBAAwB;QACnC,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,mCAAmC,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,iIAAiI;qBACpI;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport { executeFunctionMetrics } from \"./execution.ts\";\nimport { parseFunctionMetricsData } from \"./final-data.ts\";\nimport type { FunctionMetricsOptions, ResolvedFunctionMetricsOptions } from \"./options.ts\";\nimport { resolveFunctionMetricsOptions } from \"./options-resolution.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\n\nconst FUNCTION_METRICS_CHECK_DEFINITION = {\n checkId: \"function-metrics\",\n displayName: \"Function metrics\"\n} as const;\n\n/**\n * 使用可省略的区域、阈值与 finding policy 构造一个完整 function-metrics Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组完整替换对应字段的默认数组。\n * @returns 固定 `function-metrics` identity、完整冻结 options、preflight 与 execution。\n * @throws {TypeError} input 含未知字段、空 area、非法 finding policy、非法 limit 或空 executable 时抛出。\n */\nexport function functionMetrics(\n options: FunctionMetricsOptions = {}\n): TypedCheckWithOptions<\n \"function-metrics\",\n ResolvedFunctionMetricsOptions,\n typeof parseFunctionMetricsData\n> {\n const resolvedOptions = resolveFunctionMetricsOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\n \"functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies, positive safe-integer limits, and a non-empty scanner executable\"\n );\n }\n return defineCheck({\n ...FUNCTION_METRICS_CHECK_DEFINITION,\n execution: executeFunctionMetrics,\n parseData: parseFunctionMetricsData,\n preflight: (preparedOptions) =>\n validResolvedFunctionMetricsOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { collectProjectFileSets, requireProjectFileSet } from "../project-files/collection.mjs";
|
|
2
|
+
import { partitionProjectFilesByEligibility } from "../project-files/input-eligibility.mjs";
|
|
3
|
+
import { settleFindings } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { analyzeFunctionMetrics } from "./analysis.mjs";
|
|
5
|
+
import { measureFunctionMetrics } from "./measurement.mjs";
|
|
6
|
+
import { validResolvedFunctionMetricsOptions } from "./options-validation.mjs";
|
|
7
|
+
import { buildFunctionInputRejectedCandidates, buildFunctionRecordCandidates } from "./records.mjs";
|
|
8
|
+
import { isLizardTarget } from "./target-files.mjs";
|
|
9
|
+
/** Default Check callback;一次扫描完整 area exact-input union。 */
|
|
10
|
+
export async function executeFunctionMetrics(context) {
|
|
11
|
+
if (!validResolvedFunctionMetricsOptions(context.options))
|
|
12
|
+
return unavailable("invalid-options");
|
|
13
|
+
if (context.signal.aborted)
|
|
14
|
+
return unavailable("cancelled");
|
|
15
|
+
let prepared;
|
|
16
|
+
try {
|
|
17
|
+
prepared = prepareFunctionInputs(context.project.root, context.options.codeAreas);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return unavailable("source-unavailable");
|
|
21
|
+
}
|
|
22
|
+
if (context.signal.aborted)
|
|
23
|
+
return unavailable("cancelled");
|
|
24
|
+
return executePreparedFunctionMetrics(context, prepared);
|
|
25
|
+
}
|
|
26
|
+
async function executePreparedFunctionMetrics(context, prepared) {
|
|
27
|
+
if (prepared.selectedPathCount === 0) {
|
|
28
|
+
return Object.freeze({ status: "not-applicable", reason: { code: "no-eligible-input" } });
|
|
29
|
+
}
|
|
30
|
+
reportInputRejections(context, prepared.rejectedCandidates);
|
|
31
|
+
if (prepared.exactInput.approvedExactPaths.length === 0) {
|
|
32
|
+
return settleFunctionFindings([], prepared.rejectedCandidates);
|
|
33
|
+
}
|
|
34
|
+
const measurement = await measureFunctionMetrics({
|
|
35
|
+
dependency: context.options.scanner,
|
|
36
|
+
input: prepared.exactInput,
|
|
37
|
+
signal: context.signal
|
|
38
|
+
});
|
|
39
|
+
if (measurement.kind !== "complete") {
|
|
40
|
+
return appendInputRejectedMessage(directMeasurementFailure(measurement), prepared.rejectedCandidates.length);
|
|
41
|
+
}
|
|
42
|
+
const analysis = analyzeFunctionMetrics(measurement.metrics);
|
|
43
|
+
if (analysis === undefined) {
|
|
44
|
+
return appendInputRejectedMessage(unavailable("external-result-invalid"), prepared.rejectedCandidates.length);
|
|
45
|
+
}
|
|
46
|
+
const candidates = buildFunctionRecordCandidates(analysis, prepared.exactInput.areas);
|
|
47
|
+
if (candidates === undefined) {
|
|
48
|
+
return appendInputRejectedMessage(unavailable("external-result-invalid"), prepared.rejectedCandidates.length);
|
|
49
|
+
}
|
|
50
|
+
for (const candidate of candidates) {
|
|
51
|
+
context.records.report({ id: candidate.id }, candidate.data);
|
|
52
|
+
}
|
|
53
|
+
return settleFunctionFindings(candidates, prepared.rejectedCandidates);
|
|
54
|
+
}
|
|
55
|
+
function prepareFunctionInputs(rootDir, codeAreas) {
|
|
56
|
+
const collected = collectAreaInputs(rootDir, codeAreas);
|
|
57
|
+
return Object.freeze({
|
|
58
|
+
exactInput: Object.freeze({
|
|
59
|
+
approvedExactPaths: Object.freeze(uniqueSorted(collected.areas.flatMap((area) => area.approvedExactPaths))),
|
|
60
|
+
areas: collected.areas,
|
|
61
|
+
rootDir
|
|
62
|
+
}),
|
|
63
|
+
rejectedCandidates: buildFunctionInputRejectedCandidates(new Map([...collected.rejectedCodeAreasByPath].map(([path, matchingAreas]) => [
|
|
64
|
+
path,
|
|
65
|
+
Object.freeze(matchingAreas)
|
|
66
|
+
]))),
|
|
67
|
+
selectedPathCount: collected.selectedPaths.size
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function collectAreaInputs(rootDir, codeAreas) {
|
|
71
|
+
const areas = [];
|
|
72
|
+
const rejectedCodeAreasByPath = new Map();
|
|
73
|
+
const selectedPaths = new Set();
|
|
74
|
+
const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) => compareText(left, right));
|
|
75
|
+
const filesByArea = collectProjectFileSets(rootDir, Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files])));
|
|
76
|
+
for (const [codeArea, policy] of orderedPolicies) {
|
|
77
|
+
const selectedForArea = requireProjectFileSet(filesByArea, codeArea);
|
|
78
|
+
for (const path of selectedForArea)
|
|
79
|
+
selectedPaths.add(path);
|
|
80
|
+
const partition = partitionProjectFilesByEligibility(selectedForArea, isLizardTarget);
|
|
81
|
+
for (const path of partition.rejectedPaths) {
|
|
82
|
+
const matchingAreas = rejectedCodeAreasByPath.get(path) ?? [];
|
|
83
|
+
matchingAreas.push(codeArea);
|
|
84
|
+
rejectedCodeAreasByPath.set(path, matchingAreas);
|
|
85
|
+
}
|
|
86
|
+
if (partition.acceptedPaths.length === 0)
|
|
87
|
+
continue;
|
|
88
|
+
areas.push(Object.freeze({
|
|
89
|
+
approvedExactPaths: partition.acceptedPaths,
|
|
90
|
+
codeArea,
|
|
91
|
+
findingPolicy: policy.findingPolicy,
|
|
92
|
+
limits: policy.limits
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
return Object.freeze({
|
|
96
|
+
areas: Object.freeze(areas),
|
|
97
|
+
rejectedCodeAreasByPath,
|
|
98
|
+
selectedPaths
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function reportInputRejections(context, candidates) {
|
|
102
|
+
for (const candidate of candidates) {
|
|
103
|
+
context.records.report({ id: candidate.id }, candidate.data);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function settleFunctionFindings(metricCandidates, rejectedCandidates) {
|
|
107
|
+
const settlement = settleFindings([
|
|
108
|
+
...metricCandidates.map((candidate) => ({
|
|
109
|
+
actionable: true,
|
|
110
|
+
blocking: candidate.data.blocking
|
|
111
|
+
})),
|
|
112
|
+
...rejectedCandidates.map(() => ({ actionable: false, blocking: false }))
|
|
113
|
+
]);
|
|
114
|
+
return appendInputRejectedMessage(settlement, rejectedCandidates.length);
|
|
115
|
+
}
|
|
116
|
+
function appendInputRejectedMessage(result, rejectedInputCount) {
|
|
117
|
+
if (rejectedInputCount === 0)
|
|
118
|
+
return result;
|
|
119
|
+
const message = Object.freeze({
|
|
120
|
+
code: "input-rejected",
|
|
121
|
+
level: "warning",
|
|
122
|
+
message: `${rejectedInputCount} selected functionMetrics input file(s) were rejected because their file type is unsupported; inspect this Check's Records and narrow files.include/exclude.`
|
|
123
|
+
});
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
...result,
|
|
126
|
+
messages: Object.freeze([...(result.messages ?? []), message])
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function directMeasurementFailure(measurement) {
|
|
130
|
+
switch (measurement.kind) {
|
|
131
|
+
case "cancelled":
|
|
132
|
+
return unavailable("cancelled");
|
|
133
|
+
case "execution-failed":
|
|
134
|
+
return unavailable("external-execution-failed");
|
|
135
|
+
case "invalid-result":
|
|
136
|
+
return unavailable("external-result-invalid");
|
|
137
|
+
case "unavailable":
|
|
138
|
+
return unavailable("external-dependency-unavailable");
|
|
139
|
+
}
|
|
140
|
+
const exhaustiveMeasurement = measurement;
|
|
141
|
+
return exhaustiveMeasurement;
|
|
142
|
+
}
|
|
143
|
+
function unavailable(code) {
|
|
144
|
+
return Object.freeze({
|
|
145
|
+
status: "unavailable",
|
|
146
|
+
reason: { code },
|
|
147
|
+
messages: Object.freeze([
|
|
148
|
+
Object.freeze({ code, level: "error", message: unavailableMessage(code) })
|
|
149
|
+
])
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function unavailableMessage(code) {
|
|
153
|
+
switch (code) {
|
|
154
|
+
case "invalid-options":
|
|
155
|
+
return "functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.";
|
|
156
|
+
case "cancelled":
|
|
157
|
+
return "Function metrics was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate.";
|
|
158
|
+
case "source-unavailable":
|
|
159
|
+
return "Function metrics could not collect its configured project files; check the project root, file permissions, and selected file source.";
|
|
160
|
+
case "external-dependency-unavailable":
|
|
161
|
+
return "The configured Lizard command is unavailable or incompatible; install Lizard 1.23.0 or configure a compatible executable.";
|
|
162
|
+
case "external-execution-failed":
|
|
163
|
+
return "Lizard did not complete successfully; run the configured command directly and inspect its environment.";
|
|
164
|
+
case "external-result-invalid":
|
|
165
|
+
return "Lizard output could not form a trusted complete result; check the executable version and CSV compatibility.";
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function uniqueSorted(values) {
|
|
169
|
+
return [...new Set(values)].sort(compareText);
|
|
170
|
+
}
|
|
171
|
+
function compareText(left, right) {
|
|
172
|
+
if (left < right)
|
|
173
|
+
return -1;
|
|
174
|
+
if (left > right)
|
|
175
|
+
return 1;
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=execution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,kCAAkC,EAAE,MAAM,uCAAuC,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAkC,MAAM,kBAAkB,CAAC;AAS1F,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAG9B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA8D;IAE9D,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;IAE5D,IAAI,QAAgC,CAAC;IACrC,IAAI,CAAC;QACH,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5D,OAAO,8BAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,OAA8D,EAC9D,QAAgC;IAEhC,IAAI,QAAQ,CAAC,iBAAiB,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC5D,IAAI,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC;QAC/C,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;QACnC,KAAK,EAAE,QAAQ,CAAC,UAAU;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,0BAA0B,CAC/B,wBAAwB,CAAC,WAAW,CAAC,EACrC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,0BAA0B,CAC/B,WAAW,CAAC,yBAAyB,CAAC,EACtC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACtF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,0BAA0B,CAC/B,WAAW,CAAC,yBAAyB,CAAC,EACtC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CACnC,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACzE,CAAC;AAQD,SAAS,qBAAqB,CAC5B,OAAe,EACf,SAAsD;IAEtD,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;YACxB,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAC/B,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CACzE;YACD,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO;SACR,CAAC;QACF,kBAAkB,EAAE,oCAAoC,CACtD,IAAI,GAAG,CACL,CAAC,GAAG,SAAS,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC;YACpE,IAAI;YACJ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;SAC7B,CAAC,CACH,CACF;QACD,iBAAiB,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI;KAChD,CAAC,CAAC;AACL,CAAC;AAQD,SAAS,iBAAiB,CACxB,OAAe,EACf,SAA2E;IAE3E,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CACzE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CACzB,CAAC;IACF,MAAM,WAAW,GAAG,sBAAsB,CACxC,OAAO,EACP,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACtF,CAAC;IACF,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QACjD,MAAM,eAAe,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,eAAe;YAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,kCAAkC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACtF,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9D,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnD,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,MAAM,CAAC;YACZ,kBAAkB,EAAE,SAAS,CAAC,aAAa;YAC3C,QAAQ;YACR,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,uBAAuB;QACvB,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAA8D,EAC9D,UAAqD;IAErD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,gBAAoD,EACpD,kBAA6D;IAE7D,MAAM,UAAU,GAAG,cAAc,CAAC;QAChC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ;SAClC,CAAC,CAAC;QACH,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;KAC1E,CAAC,CAAC;IACH,OAAO,0BAA0B,CAAC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,0BAA0B,CACjC,MAA6C,EAC7C,kBAA0B;IAE1B,IAAI,kBAAkB,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5C,MAAM,OAAO,GAAiB,MAAM,CAAC,MAAM,CAAC;QAC1C,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,GAAG,kBAAkB,8JAA8J;KAC7L,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,MAAM;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAC/B,WAAqE;IAErE,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;QAClC,KAAK,kBAAkB;YACrB,OAAO,WAAW,CAAC,2BAA2B,CAAC,CAAC;QAClD,KAAK,gBAAgB;YACnB,OAAO,WAAW,CAAC,yBAAyB,CAAC,CAAC;QAChD,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,qBAAqB,GAAU,WAAW,CAAC;IACjD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAClB,IAA0C;IAE1C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,EAAE,IAAI,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAgB,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;SACpF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA0C;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,iIAAiI,CAAC;QAC3I,KAAK,WAAW;YACd,OAAO,2IAA2I,CAAC;QACrJ,KAAK,oBAAoB;YACvB,OAAO,sIAAsI,CAAC;QAChJ,KAAK,iCAAiC;YACpC,OAAO,2HAA2H,CAAC;QACrI,KAAK,2BAA2B;YAC9B,OAAO,wGAAwG,CAAC;QAClH,KAAK,yBAAyB;YAC5B,OAAO,6GAA6G,CAAC;IACzH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB;IAC7C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport { analyzeFunctionMetrics } from \"./analysis.ts\";\nimport { measureFunctionMetrics, type FunctionMeasurementResult } from \"./measurement.ts\";\nimport type {\n FunctionMetricsAreaInput,\n FunctionMetricsExactInputSet\n} from \"./measurement-model.ts\";\nimport type {\n ResolvedFunctionMetricsCodeAreaOptions,\n ResolvedFunctionMetricsOptions\n} from \"./options.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFunctionInputRejectedCandidates,\n buildFunctionRecordCandidates,\n type FunctionInputRejectedCandidate,\n type FunctionRecordCandidate\n} from \"./records.ts\";\nimport { isLizardTarget } from \"./target-files.ts\";\nimport type { FunctionMetricsFinalData } from \"./final-data.ts\";\n\n/** `function-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FunctionMetricsUnavailableReasonCode =\n | \"cancelled\"\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\n/** Default Check callback;一次扫描完整 area exact-input union。 */\nexport async function executeFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (!validResolvedFunctionMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n if (context.signal.aborted) return unavailable(\"cancelled\");\n\n let prepared: PreparedFunctionInputs;\n try {\n prepared = prepareFunctionInputs(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (context.signal.aborted) return unavailable(\"cancelled\");\n return executePreparedFunctionMetrics(context, prepared);\n}\n\nasync function executePreparedFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n prepared: PreparedFunctionInputs\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (prepared.selectedPathCount === 0) {\n return Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } });\n }\n reportInputRejections(context, prepared.rejectedCandidates);\n if (prepared.exactInput.approvedExactPaths.length === 0) {\n return settleFunctionFindings([], prepared.rejectedCandidates);\n }\n const measurement = await measureFunctionMetrics({\n dependency: context.options.scanner,\n input: prepared.exactInput,\n signal: context.signal\n });\n if (measurement.kind !== \"complete\") {\n return appendInputRejectedMessage(\n directMeasurementFailure(measurement),\n prepared.rejectedCandidates.length\n );\n }\n const analysis = analyzeFunctionMetrics(measurement.metrics);\n if (analysis === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"external-result-invalid\"),\n prepared.rejectedCandidates.length\n );\n }\n const candidates = buildFunctionRecordCandidates(analysis, prepared.exactInput.areas);\n if (candidates === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"external-result-invalid\"),\n prepared.rejectedCandidates.length\n );\n }\n for (const candidate of candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n return settleFunctionFindings(candidates, prepared.rejectedCandidates);\n}\n\ninterface PreparedFunctionInputs {\n readonly exactInput: FunctionMetricsExactInputSet;\n readonly rejectedCandidates: readonly FunctionInputRejectedCandidate[];\n readonly selectedPathCount: number;\n}\n\nfunction prepareFunctionInputs(\n rootDir: string,\n codeAreas: ResolvedFunctionMetricsOptions[\"codeAreas\"]\n): PreparedFunctionInputs {\n const collected = collectAreaInputs(rootDir, codeAreas);\n return Object.freeze({\n exactInput: Object.freeze({\n approvedExactPaths: Object.freeze(\n uniqueSorted(collected.areas.flatMap((area) => area.approvedExactPaths))\n ),\n areas: collected.areas,\n rootDir\n }),\n rejectedCandidates: buildFunctionInputRejectedCandidates(\n new Map(\n [...collected.rejectedCodeAreasByPath].map(([path, matchingAreas]) => [\n path,\n Object.freeze(matchingAreas)\n ])\n )\n ),\n selectedPathCount: collected.selectedPaths.size\n });\n}\n\ninterface CollectedFunctionAreaInputs {\n readonly areas: readonly FunctionMetricsAreaInput[];\n readonly rejectedCodeAreasByPath: ReadonlyMap<string, readonly string[]>;\n readonly selectedPaths: ReadonlySet<string>;\n}\n\nfunction collectAreaInputs(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFunctionMetricsCodeAreaOptions>>\n): CollectedFunctionAreaInputs {\n const areas: FunctionMetricsAreaInput[] = [];\n const rejectedCodeAreasByPath = new Map<string, string[]>();\n const selectedPaths = new Set<string>();\n const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) =>\n compareText(left, right)\n );\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files]))\n );\n for (const [codeArea, policy] of orderedPolicies) {\n const selectedForArea = requireProjectFileSet(filesByArea, codeArea);\n for (const path of selectedForArea) selectedPaths.add(path);\n const partition = partitionProjectFilesByEligibility(selectedForArea, isLizardTarget);\n for (const path of partition.rejectedPaths) {\n const matchingAreas = rejectedCodeAreasByPath.get(path) ?? [];\n matchingAreas.push(codeArea);\n rejectedCodeAreasByPath.set(path, matchingAreas);\n }\n if (partition.acceptedPaths.length === 0) continue;\n areas.push(\n Object.freeze({\n approvedExactPaths: partition.acceptedPaths,\n codeArea,\n findingPolicy: policy.findingPolicy,\n limits: policy.limits\n })\n );\n }\n return Object.freeze({\n areas: Object.freeze(areas),\n rejectedCodeAreasByPath,\n selectedPaths\n });\n}\n\nfunction reportInputRejections(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n candidates: readonly FunctionInputRejectedCandidate[]\n): void {\n for (const candidate of candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n}\n\nfunction settleFunctionFindings(\n metricCandidates: readonly FunctionRecordCandidate[],\n rejectedCandidates: readonly FunctionInputRejectedCandidate[]\n): CheckResult<FunctionMetricsFinalData> {\n const settlement = settleFindings([\n ...metricCandidates.map((candidate) => ({\n actionable: true,\n blocking: candidate.data.blocking\n })),\n ...rejectedCandidates.map(() => ({ actionable: false, blocking: false }))\n ]);\n return appendInputRejectedMessage(settlement, rejectedCandidates.length);\n}\n\nfunction appendInputRejectedMessage(\n result: CheckResult<FunctionMetricsFinalData>,\n rejectedInputCount: number\n): CheckResult<FunctionMetricsFinalData> {\n if (rejectedInputCount === 0) return result;\n const message: CheckMessage = Object.freeze({\n code: \"input-rejected\",\n level: \"warning\",\n message: `${rejectedInputCount} selected functionMetrics input file(s) were rejected because their file type is unsupported; inspect this Check's Records and narrow files.include/exclude.`\n });\n return Object.freeze({\n ...result,\n messages: Object.freeze([...(result.messages ?? []), message])\n });\n}\n\nfunction directMeasurementFailure(\n measurement: Exclude<FunctionMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FunctionMetricsFinalData> {\n switch (measurement.kind) {\n case \"cancelled\":\n return unavailable(\"cancelled\");\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n const exhaustiveMeasurement: never = measurement;\n return exhaustiveMeasurement;\n}\n\nfunction unavailable(\n code: FunctionMetricsUnavailableReasonCode\n): CheckResult<FunctionMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FunctionMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\";\n case \"cancelled\":\n return \"Function metrics was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate.\";\n case \"source-unavailable\":\n return \"Function metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured Lizard command is unavailable or incompatible; install Lizard 1.23.0 or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"Lizard did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"Lizard output could not form a trusted complete result; check the executable version and CSV compatibility.\";\n }\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { parseFindingSummaryData } from "../final-data-parsing.mjs";
|
|
2
|
+
/** 验证并脱离一份 `function-metrics` canonical final-data object。 */
|
|
3
|
+
export function parseFunctionMetricsData(data) {
|
|
4
|
+
return parseFindingSummaryData(data, "functionMetrics");
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=final-data.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/final-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,8DAA8D;AAC9D,MAAM,UAAU,wBAAwB,CAAC,IAAa;IACpD,OAAO,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAC1D,CAAC","sourcesContent":["import type { FindingSummary } from \"../code-quality-findings/policy.ts\";\nimport { parseFindingSummaryData } from \"../final-data-parsing.ts\";\n\n/** `function-metrics` 在 passed/failed outcome 中发布的主数据。 */\nexport type FunctionMetricsFinalData = FindingSummary;\n\n/** 验证并脱离一份 `function-metrics` canonical final-data object。 */\nexport function parseFunctionMetricsData(data: unknown): FunctionMetricsFinalData {\n return parseFindingSummaryData(data, \"functionMetrics\");\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { errorMessage } from "../../host-environment/error-message.mjs";
|
|
2
|
+
import { runProcess } from "../../host-environment/process/command.mjs";
|
|
3
|
+
export async function checkLizard(rootDir, dependency) {
|
|
4
|
+
try {
|
|
5
|
+
const result = await runProcess({
|
|
6
|
+
args: ["--version"],
|
|
7
|
+
command: dependency.executable,
|
|
8
|
+
cwd: rootDir
|
|
9
|
+
});
|
|
10
|
+
return availabilityFromVersionResult(result);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return unavailableLizard({
|
|
14
|
+
error: `lizard version error: ${errorMessage(error)}`,
|
|
15
|
+
reason: "execution-error"
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function availabilityFromVersionResult(result) {
|
|
20
|
+
if (result.signal !== null) {
|
|
21
|
+
const output = commandOutput(result);
|
|
22
|
+
return unavailableLizard({
|
|
23
|
+
error: `lizard --version failed, signal ${result.signal}${output ? `: ${output}` : ""}`,
|
|
24
|
+
reason: "execution-error"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (result.error)
|
|
28
|
+
return processErrorAvailability(result.error);
|
|
29
|
+
const output = commandOutput(result);
|
|
30
|
+
if (result.status !== 0) {
|
|
31
|
+
return unavailableLizard({
|
|
32
|
+
error: `lizard --version failed, ${processTermination(result)}${output ? `: ${output}` : ""}`,
|
|
33
|
+
reason: "execution-error"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (output === "") {
|
|
37
|
+
return unavailableLizard({
|
|
38
|
+
error: "lizard --version returned empty output",
|
|
39
|
+
reason: "contract-error"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return Object.freeze({ available: true, version: output });
|
|
43
|
+
}
|
|
44
|
+
function processErrorAvailability(error) {
|
|
45
|
+
const isMissingTool = Object.hasOwn(error, "code") && Reflect.get(error, "code") === "ENOENT";
|
|
46
|
+
return unavailableLizard({
|
|
47
|
+
error: isMissingTool
|
|
48
|
+
? `lizard command unavailable: ${error.message}`
|
|
49
|
+
: `lizard version error: ${error.message}`,
|
|
50
|
+
reason: isMissingTool ? "tool-unavailable" : "execution-error"
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function unavailableLizard({ error, reason }) {
|
|
54
|
+
return Object.freeze({ available: false, error, reason });
|
|
55
|
+
}
|
|
56
|
+
function commandOutput(result) {
|
|
57
|
+
return (result.stdout || "").trim() || (result.stderr || "").trim();
|
|
58
|
+
}
|
|
59
|
+
function processTermination(result) {
|
|
60
|
+
return typeof result.status === "number"
|
|
61
|
+
? `exit ${result.status}`
|
|
62
|
+
: `signal ${result.signal || "unknown"}`;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=availability.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/lizard/availability.ts"],"names":[],"mappings":"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","sourcesContent":["import { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { runProcess } from \"../../host-environment/process/command.ts\";\nimport type { ResolvedFunctionMetricsScannerOptions } from \"../options.ts\";\n\ntype LizardAvailability = Readonly<\n | {\n readonly available: true;\n readonly version: string;\n }\n | {\n readonly available: false;\n readonly error: string;\n readonly reason: \"contract-error\" | \"execution-error\" | \"tool-unavailable\";\n }\n>;\n\ninterface UnavailableLizardInput {\n readonly error: string;\n readonly reason: Extract<LizardAvailability, { available: false }>[\"reason\"];\n}\n\ntype ToolCommandResult = Awaited<ReturnType<typeof runProcess>>;\n\nexport async function checkLizard(\n rootDir: string,\n dependency: ResolvedFunctionMetricsScannerOptions\n): Promise<LizardAvailability> {\n try {\n const result = await runProcess({\n args: [\"--version\"],\n command: dependency.executable,\n cwd: rootDir\n });\n return availabilityFromVersionResult(result);\n } catch (error: unknown) {\n return unavailableLizard({\n error: `lizard version error: ${errorMessage(error)}`,\n reason: \"execution-error\"\n });\n }\n}\n\nfunction availabilityFromVersionResult(result: ToolCommandResult): LizardAvailability {\n if (result.signal !== null) {\n const output = commandOutput(result);\n return unavailableLizard({\n error: `lizard --version failed, signal ${result.signal}${output ? `: ${output}` : \"\"}`,\n reason: \"execution-error\"\n });\n }\n if (result.error) return processErrorAvailability(result.error);\n const output = commandOutput(result);\n if (result.status !== 0) {\n return unavailableLizard({\n error: `lizard --version failed, ${processTermination(result)}${output ? `: ${output}` : \"\"}`,\n reason: \"execution-error\"\n });\n }\n if (output === \"\") {\n return unavailableLizard({\n error: \"lizard --version returned empty output\",\n reason: \"contract-error\"\n });\n }\n return Object.freeze({ available: true, version: output });\n}\n\nfunction processErrorAvailability(error: Error): LizardAvailability {\n const isMissingTool = Object.hasOwn(error, \"code\") && Reflect.get(error, \"code\") === \"ENOENT\";\n return unavailableLizard({\n error: isMissingTool\n ? `lizard command unavailable: ${error.message}`\n : `lizard version error: ${error.message}`,\n reason: isMissingTool ? \"tool-unavailable\" : \"execution-error\"\n });\n}\n\nfunction unavailableLizard({ error, reason }: UnavailableLizardInput): LizardAvailability {\n return Object.freeze({ available: false, error, reason });\n}\n\nfunction commandOutput(result: ToolCommandResult): string {\n return (result.stdout || \"\").trim() || (result.stderr || \"\").trim();\n}\n\nfunction processTermination(result: ToolCommandResult): string {\n return typeof result.status === \"number\"\n ? `exit ${result.status}`\n : `signal ${result.signal || \"unknown\"}`;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { parse } from "csv-parse/sync";
|
|
2
|
+
export function parseCsvRows(csv) {
|
|
3
|
+
const records = parse(csv, {
|
|
4
|
+
bom: true,
|
|
5
|
+
relax_column_count: true,
|
|
6
|
+
skip_empty_lines: true,
|
|
7
|
+
trim: true
|
|
8
|
+
});
|
|
9
|
+
if (!Array.isArray(records) || !records.every(isStringRow)) {
|
|
10
|
+
throw new Error("CSV parser returned non-string rows");
|
|
11
|
+
}
|
|
12
|
+
return records;
|
|
13
|
+
}
|
|
14
|
+
function isStringRow(value) {
|
|
15
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=csv.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/lizard/csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,OAAO,GAAY,KAAK,CAAC,GAAG,EAAE;QAClC,GAAG,EAAE,IAAI;QACT,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;QACtB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC","sourcesContent":["import { parse } from \"csv-parse/sync\";\n\nexport function parseCsvRows(csv: string): string[][] {\n const records: unknown = parse(csv, {\n bom: true,\n relax_column_count: true,\n skip_empty_lines: true,\n trim: true\n });\n\n if (!Array.isArray(records) || !records.every(isStringRow)) {\n throw new Error(\"CSV parser returned non-string rows\");\n }\n\n return records;\n}\n\nfunction isStringRow(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { errorMessage } from "../../host-environment/error-message.mjs";
|
|
2
|
+
import { parseCsvRows } from "./csv.mjs";
|
|
3
|
+
import { normalizeScannerReportedPath } from "../../project-files/reported-path.mjs";
|
|
4
|
+
const LIZARD_COLUMNS = {
|
|
5
|
+
nloc: 0,
|
|
6
|
+
ccn: 1,
|
|
7
|
+
parameterCount: 3,
|
|
8
|
+
filePath: 6,
|
|
9
|
+
functionName: 7,
|
|
10
|
+
startLine: 9,
|
|
11
|
+
endLine: 10
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* 将 Lizard CSV 输出解析为 FunctionMetric 数组。
|
|
15
|
+
*
|
|
16
|
+
* Lizard 1.23 CSV 列(--csv):
|
|
17
|
+
* NLOC,CCN,token count,parameter count,length,location,file path,function name,long name,start line,end line
|
|
18
|
+
*/
|
|
19
|
+
export function parseLizardCSV(csv, cwd) {
|
|
20
|
+
try {
|
|
21
|
+
const measurements = [];
|
|
22
|
+
for (const [index, row] of lizardDataRows(parseCsvRows(csv)).entries()) {
|
|
23
|
+
const measurement = functionMetricFromLizardRow(row, cwd);
|
|
24
|
+
if (!measurement) {
|
|
25
|
+
throw new Error(`invalid Lizard 1.23 CSV row ${index + 1}`);
|
|
26
|
+
}
|
|
27
|
+
measurements.push(measurement);
|
|
28
|
+
}
|
|
29
|
+
measurements.sort((a, b) => compareFunctionMetrics(a.payload, b.payload));
|
|
30
|
+
return { ok: true, measurements };
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
error: `Failed to parse lizard CSV: ${errorMessage(error)}`,
|
|
36
|
+
reason: "invalid-result"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function lizardDataRows(rows) {
|
|
41
|
+
const header = rows[0] ?? [];
|
|
42
|
+
return isLizard123Header(header) ? rows.slice(1) : rows;
|
|
43
|
+
}
|
|
44
|
+
function functionMetricFromLizardRow(parts, cwd) {
|
|
45
|
+
if (parts.length < 11) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const values = parseLizardMetricValues(parts);
|
|
49
|
+
if (!values) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const filePath = (parts[LIZARD_COLUMNS.filePath] ?? "").trim();
|
|
53
|
+
if (filePath.length === 0 || values.endLine < values.startLine) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const sourcePath = normalizeScannerReportedPath(filePath, cwd);
|
|
57
|
+
return {
|
|
58
|
+
sourcePaths: [sourcePath],
|
|
59
|
+
payload: {
|
|
60
|
+
name: parts[LIZARD_COLUMNS.functionName] || "unknown",
|
|
61
|
+
file: sourcePath,
|
|
62
|
+
startLine: values.startLine,
|
|
63
|
+
endLine: values.endLine,
|
|
64
|
+
lines: values.nloc,
|
|
65
|
+
parameterCount: values.parameterCount,
|
|
66
|
+
cyclomaticComplexity: {
|
|
67
|
+
value: values.ccn,
|
|
68
|
+
source: "lizard"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function parseLizardMetricValues(parts) {
|
|
74
|
+
const ccnText = parts[LIZARD_COLUMNS.ccn].trim();
|
|
75
|
+
const ccn = ccnText === "" ? null : parseInteger(ccnText, 0);
|
|
76
|
+
const endLine = parseInteger(parts[LIZARD_COLUMNS.endLine], 1);
|
|
77
|
+
const nloc = parseInteger(parts[LIZARD_COLUMNS.nloc], 0);
|
|
78
|
+
const parameterCount = parseInteger(parts[LIZARD_COLUMNS.parameterCount], 0);
|
|
79
|
+
const startLine = parseInteger(parts[LIZARD_COLUMNS.startLine], 1);
|
|
80
|
+
if ((ccnText !== "" && ccn === null) ||
|
|
81
|
+
endLine === null ||
|
|
82
|
+
nloc === null ||
|
|
83
|
+
parameterCount === null ||
|
|
84
|
+
startLine === null) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
ccn,
|
|
89
|
+
endLine,
|
|
90
|
+
nloc,
|
|
91
|
+
parameterCount,
|
|
92
|
+
startLine
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function compareFunctionMetrics(a, b) {
|
|
96
|
+
for (const comparison of functionMetricComparisons(a, b)) {
|
|
97
|
+
if (comparison !== 0)
|
|
98
|
+
return comparison;
|
|
99
|
+
}
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
function functionMetricComparisons(a, b) {
|
|
103
|
+
return [
|
|
104
|
+
compareText(a.file, b.file),
|
|
105
|
+
a.startLine - b.startLine,
|
|
106
|
+
a.endLine - b.endLine,
|
|
107
|
+
compareText(a.name, b.name),
|
|
108
|
+
a.lines - b.lines,
|
|
109
|
+
(a.cyclomaticComplexity.value ?? -1) - (b.cyclomaticComplexity.value ?? -1),
|
|
110
|
+
a.parameterCount - b.parameterCount
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
function compareText(left, right) {
|
|
114
|
+
if (left < right)
|
|
115
|
+
return -1;
|
|
116
|
+
if (left > right)
|
|
117
|
+
return 1;
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
function parseInteger(value, minimum) {
|
|
121
|
+
const text = (value ?? "").trim();
|
|
122
|
+
if (!/^\d+$/.test(text)) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const parsed = Number(text);
|
|
126
|
+
return Number.isSafeInteger(parsed) && parsed >= minimum ? parsed : null;
|
|
127
|
+
}
|
|
128
|
+
function isLizard123Header(parts) {
|
|
129
|
+
return (parts.length >= 11 &&
|
|
130
|
+
parts[LIZARD_COLUMNS.nloc] === "NLOC" &&
|
|
131
|
+
parts[LIZARD_COLUMNS.ccn] === "CCN" &&
|
|
132
|
+
parts[LIZARD_COLUMNS.parameterCount] === "parameter count" &&
|
|
133
|
+
parts[LIZARD_COLUMNS.filePath] === "file path" &&
|
|
134
|
+
parts[LIZARD_COLUMNS.functionName] === "function name" &&
|
|
135
|
+
parts[LIZARD_COLUMNS.startLine] === "start line" &&
|
|
136
|
+
parts[LIZARD_COLUMNS.endLine] === "end line");
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=parser.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/lizard/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FunctionMetric } from \"../measurement-model.ts\";\nimport type { ExactInputMeasurement } from \"../../project-files/exact-input-measurement.ts\";\nimport { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { parseCsvRows } from \"./csv.ts\";\nimport { normalizeScannerReportedPath } from \"../../project-files/reported-path.ts\";\n\nexport type LizardParseResult =\n | {\n readonly measurements: readonly ExactInputMeasurement<FunctionMetric>[];\n readonly ok: true;\n }\n | {\n readonly error: string;\n readonly ok: false;\n readonly reason: \"invalid-result\";\n };\n\nconst LIZARD_COLUMNS = {\n nloc: 0,\n ccn: 1,\n parameterCount: 3,\n filePath: 6,\n functionName: 7,\n startLine: 9,\n endLine: 10\n} as const;\n\n/**\n * 将 Lizard CSV 输出解析为 FunctionMetric 数组。\n *\n * Lizard 1.23 CSV 列(--csv):\n * NLOC,CCN,token count,parameter count,length,location,file path,function name,long name,start line,end line\n */\nexport function parseLizardCSV(csv: string, cwd: string): LizardParseResult {\n try {\n const measurements: ExactInputMeasurement<FunctionMetric>[] = [];\n\n for (const [index, row] of lizardDataRows(parseCsvRows(csv)).entries()) {\n const measurement = functionMetricFromLizardRow(row, cwd);\n if (!measurement) {\n throw new Error(`invalid Lizard 1.23 CSV row ${index + 1}`);\n }\n measurements.push(measurement);\n }\n\n measurements.sort((a, b) => compareFunctionMetrics(a.payload, b.payload));\n\n return { ok: true, measurements };\n } catch (error: unknown) {\n return {\n ok: false,\n error: `Failed to parse lizard CSV: ${errorMessage(error)}`,\n reason: \"invalid-result\"\n };\n }\n}\n\nfunction lizardDataRows(rows: string[][]): string[][] {\n const header = rows[0] ?? [];\n return isLizard123Header(header) ? rows.slice(1) : rows;\n}\n\nfunction functionMetricFromLizardRow(\n parts: string[],\n cwd: string\n): ExactInputMeasurement<FunctionMetric> | null {\n if (parts.length < 11) {\n return null;\n }\n\n const values = parseLizardMetricValues(parts);\n if (!values) {\n return null;\n }\n\n const filePath = (parts[LIZARD_COLUMNS.filePath] ?? \"\").trim();\n if (filePath.length === 0 || values.endLine < values.startLine) {\n return null;\n }\n const sourcePath = normalizeScannerReportedPath(filePath, cwd);\n\n return {\n sourcePaths: [sourcePath],\n payload: {\n name: parts[LIZARD_COLUMNS.functionName] || \"unknown\",\n file: sourcePath,\n startLine: values.startLine,\n endLine: values.endLine,\n lines: values.nloc,\n parameterCount: values.parameterCount,\n cyclomaticComplexity: {\n value: values.ccn,\n source: \"lizard\"\n }\n }\n };\n}\n\ninterface LizardMetricValues {\n readonly ccn: number | null;\n readonly endLine: number;\n readonly nloc: number;\n readonly parameterCount: number;\n readonly startLine: number;\n}\n\nfunction parseLizardMetricValues(parts: string[]): LizardMetricValues | null {\n const ccnText = parts[LIZARD_COLUMNS.ccn].trim();\n const ccn = ccnText === \"\" ? null : parseInteger(ccnText, 0);\n const endLine = parseInteger(parts[LIZARD_COLUMNS.endLine], 1);\n const nloc = parseInteger(parts[LIZARD_COLUMNS.nloc], 0);\n const parameterCount = parseInteger(parts[LIZARD_COLUMNS.parameterCount], 0);\n const startLine = parseInteger(parts[LIZARD_COLUMNS.startLine], 1);\n\n if (\n (ccnText !== \"\" && ccn === null) ||\n endLine === null ||\n nloc === null ||\n parameterCount === null ||\n startLine === null\n ) {\n return null;\n }\n\n return {\n ccn,\n endLine,\n nloc,\n parameterCount,\n startLine\n };\n}\n\nfunction compareFunctionMetrics(a: FunctionMetric, b: FunctionMetric): number {\n for (const comparison of functionMetricComparisons(a, b)) {\n if (comparison !== 0) return comparison;\n }\n return 0;\n}\n\nfunction functionMetricComparisons(a: FunctionMetric, b: FunctionMetric): readonly number[] {\n return [\n compareText(a.file, b.file),\n a.startLine - b.startLine,\n a.endLine - b.endLine,\n compareText(a.name, b.name),\n a.lines - b.lines,\n (a.cyclomaticComplexity.value ?? -1) - (b.cyclomaticComplexity.value ?? -1),\n a.parameterCount - b.parameterCount\n ];\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction parseInteger(value: string | undefined, minimum: number): number | null {\n const text = (value ?? \"\").trim();\n if (!/^\\d+$/.test(text)) {\n return null;\n }\n const parsed = Number(text);\n return Number.isSafeInteger(parsed) && parsed >= minimum ? parsed : null;\n}\n\nfunction isLizard123Header(parts: string[]): boolean {\n return (\n parts.length >= 11 &&\n parts[LIZARD_COLUMNS.nloc] === \"NLOC\" &&\n parts[LIZARD_COLUMNS.ccn] === \"CCN\" &&\n parts[LIZARD_COLUMNS.parameterCount] === \"parameter count\" &&\n parts[LIZARD_COLUMNS.filePath] === \"file path\" &&\n parts[LIZARD_COLUMNS.functionName] === \"function name\" &&\n parts[LIZARD_COLUMNS.startLine] === \"start line\" &&\n parts[LIZARD_COLUMNS.endLine] === \"end line\"\n );\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** 对 approved exact paths 执行 adapter-owned Lizard CSV 协议。 */
|
|
2
|
+
import { errorMessage } from "../../host-environment/error-message.mjs";
|
|
3
|
+
import { runProcessSync } from "../../host-environment/process/command.mjs";
|
|
4
|
+
import { parseLizardCSV } from "./parser.mjs";
|
|
5
|
+
export function scanWithLizard({ files, cwd, dependency }) {
|
|
6
|
+
try {
|
|
7
|
+
if (files.length === 0)
|
|
8
|
+
return { ok: true, measurements: [] };
|
|
9
|
+
const child = runProcessSync({
|
|
10
|
+
args: [...files, "--csv"],
|
|
11
|
+
command: dependency.executable,
|
|
12
|
+
cwd,
|
|
13
|
+
timeout: 300_000
|
|
14
|
+
});
|
|
15
|
+
if (child.signal !== null) {
|
|
16
|
+
return failedLizardScan(`lizard signal ${child.signal}: ${(child.stderr || child.stdout || "no output").trim()}`);
|
|
17
|
+
}
|
|
18
|
+
if (child.error) {
|
|
19
|
+
return failedLizardScan(`lizard process error: ${child.error.message}`);
|
|
20
|
+
}
|
|
21
|
+
if (child.status !== 0) {
|
|
22
|
+
const stderr = (child.stderr || "").trim();
|
|
23
|
+
const stdout = (child.stdout || "").trim();
|
|
24
|
+
return failedLizardScan(`lizard ${child.status === null ? "invalid process state" : `exit ${child.status}`}: ${stderr || stdout || "no output"}`);
|
|
25
|
+
}
|
|
26
|
+
return parseLizardCSV(child.stdout || "", cwd);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return failedLizardScan(`lizard adapter error: ${errorMessage(error)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function failedLizardScan(error) {
|
|
33
|
+
return Object.freeze({ error, ok: false, reason: "execution" });
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=scanner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/lizard/scanner.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAE3E,OAAO,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAgBrE,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,GAAG,EACH,UAAU,EACY;IACtB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAE9D,MAAM,KAAK,GAAG,cAAc,CAAC;YAC3B,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC;YACzB,OAAO,EAAE,UAAU,CAAC,UAAU;YAC9B,GAAG;YACH,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,gBAAgB,CACrB,iBAAiB,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,gBAAgB,CAAC,yBAAyB,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,gBAAgB,CACrB,UAAU,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,IAAI,MAAM,IAAI,WAAW,EAAE,CACzH,CAAC;QACJ,CAAC;QAED,OAAO,cAAc,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,gBAAgB,CAAC,yBAAyB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC","sourcesContent":["/** 对 approved exact paths 执行 adapter-owned Lizard CSV 协议。 */\n\nimport { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { runProcessSync } from \"../../host-environment/process/command.ts\";\nimport type { ResolvedFunctionMetricsScannerOptions } from \"../options.ts\";\nimport { parseLizardCSV, type LizardParseResult } from \"./parser.ts\";\n\nexport type LizardScanResult =\n | LizardParseResult\n | Readonly<{\n error: string;\n ok: false;\n reason: \"execution\";\n }>;\n\ninterface ScanWithLizardOptions {\n readonly cwd: string;\n readonly dependency: ResolvedFunctionMetricsScannerOptions;\n readonly files: readonly string[];\n}\n\nexport function scanWithLizard({\n files,\n cwd,\n dependency\n}: ScanWithLizardOptions): LizardScanResult {\n try {\n if (files.length === 0) return { ok: true, measurements: [] };\n\n const child = runProcessSync({\n args: [...files, \"--csv\"],\n command: dependency.executable,\n cwd,\n timeout: 300_000\n });\n\n if (child.signal !== null) {\n return failedLizardScan(\n `lizard signal ${child.signal}: ${(child.stderr || child.stdout || \"no output\").trim()}`\n );\n }\n if (child.error) {\n return failedLizardScan(`lizard process error: ${child.error.message}`);\n }\n\n if (child.status !== 0) {\n const stderr = (child.stderr || \"\").trim();\n const stdout = (child.stdout || \"\").trim();\n return failedLizardScan(\n `lizard ${child.status === null ? \"invalid process state\" : `exit ${child.status}`}: ${stderr || stdout || \"no output\"}`\n );\n }\n\n return parseLizardCSV(child.stdout || \"\", cwd);\n } catch (error: unknown) {\n return failedLizardScan(`lizard adapter error: ${errorMessage(error)}`);\n }\n}\n\nfunction failedLizardScan(error: string): LizardScanResult {\n return Object.freeze({ error, ok: false, reason: \"execution\" });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measurement-model.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/measurement-model.ts"],"names":[],"mappings":"","sourcesContent":["import type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { ResolvedFunctionMetricsLimits } from \"./options.ts\";\n\nexport interface MetricValue {\n readonly source: \"lizard\";\n readonly value: number | null;\n}\n\nexport interface FunctionMetric {\n readonly cyclomaticComplexity: MetricValue;\n readonly endLine: number;\n readonly file: string;\n readonly lines: number;\n readonly name: string;\n readonly parameterCount: number;\n readonly startLine: number;\n}\n\nexport interface FunctionMetricsAreaInput {\n readonly approvedExactPaths: readonly string[];\n readonly codeArea: string;\n readonly findingPolicy: FindingPolicy;\n readonly limits: ResolvedFunctionMetricsLimits;\n}\n\nexport interface FunctionMetricsExactInputSet {\n readonly approvedExactPaths: readonly string[];\n readonly areas: readonly FunctionMetricsAreaInput[];\n readonly rootDir: string;\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { acceptExactInputMeasurements } from "../project-files/exact-input-measurement.mjs";
|
|
2
|
+
import { checkLizard } from "./lizard/availability.mjs";
|
|
3
|
+
import { scanWithLizard } from "./lizard/scanner.mjs";
|
|
4
|
+
export async function measureFunctionMetrics({ dependency, input, signal }) {
|
|
5
|
+
if (signal.aborted)
|
|
6
|
+
return Object.freeze({ kind: "cancelled" });
|
|
7
|
+
if (input.approvedExactPaths.length === 0) {
|
|
8
|
+
return Object.freeze({ kind: "complete", metrics: Object.freeze([]) });
|
|
9
|
+
}
|
|
10
|
+
const availability = await checkLizard(input.rootDir, dependency);
|
|
11
|
+
if (signal.aborted)
|
|
12
|
+
return Object.freeze({ kind: "cancelled" });
|
|
13
|
+
if (!availability.available) {
|
|
14
|
+
return Object.freeze({ kind: "unavailable" });
|
|
15
|
+
}
|
|
16
|
+
const measurement = runFunctionScanner(input, dependency);
|
|
17
|
+
return signal.aborted ? Object.freeze({ kind: "cancelled" }) : measurement;
|
|
18
|
+
}
|
|
19
|
+
function runFunctionScanner(input, dependency) {
|
|
20
|
+
const result = scanWithLizard({
|
|
21
|
+
cwd: input.rootDir,
|
|
22
|
+
dependency,
|
|
23
|
+
files: input.approvedExactPaths
|
|
24
|
+
});
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
return Object.freeze({
|
|
27
|
+
kind: result.reason === "execution" ? "execution-failed" : "invalid-result"
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const accepted = acceptExactInputMeasurements(result.measurements, input.approvedExactPaths);
|
|
31
|
+
return accepted.ok
|
|
32
|
+
? Object.freeze({ kind: "complete", metrics: Object.freeze([...accepted.payloads]) })
|
|
33
|
+
: Object.freeze({ kind: "invalid-result" });
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=measurement.mjs.map
|