@zxyycom/vibe-check 0.0.2 → 0.0.3
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/README.md +36 -5
- package/dist/esm/check/check.mjs +4 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/flag-enablement.mjs +32 -0
- package/dist/esm/check/flag-enablement.mjs.map +1 -0
- package/dist/esm/check/handoff-provider-identity.mjs +18 -0
- package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check/project-changes.mjs +2 -0
- package/dist/esm/check/project-changes.mjs.map +1 -0
- package/dist/esm/check/project-context.mjs +2 -0
- package/dist/esm/check/project-context.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -1
- package/dist/esm/check-settlement/record-store.mjs +1 -1
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-data.mjs +36 -7
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +28 -4
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
- package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
- package/dist/esm/data-boundary/project-path.mjs +19 -0
- package/dist/esm/data-boundary/project-path.mjs.map +1 -0
- package/dist/esm/index.mjs +12 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/check-authoring.mjs +69 -0
- package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
- package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
- package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/contract.mjs +2 -0
- package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/execution.mjs +134 -0
- package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/options.mjs +284 -0
- package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
- package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs +11 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/path.mjs +1 -17
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/local-cache-options.mjs +28 -0
- package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
- package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +23 -19
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
- package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
- package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
- package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
- package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
- package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
- package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
- package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
- package/dist/esm/project-definition/project-changes.mjs +70 -0
- package/dist/esm/project-definition/project-changes.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +22 -15
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
- package/dist/esm/project-run/aggregation.mjs +42 -59
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/changes/git.mjs +161 -0
- package/dist/esm/project-run/changes/git.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +3 -2
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
- package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
- package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
- package/dist/esm/project-run/completion/completion.mjs +18 -1
- package/dist/esm/project-run/completion/completion.mjs.map +1 -1
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +7 -54
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidate.mjs +17 -13
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidates.mjs +26 -0
- package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +7 -3
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
- package/dist/esm/project-run/invocation/execution.mjs +98 -0
- package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
- package/dist/esm/project-run/invocation/run.mjs +13 -112
- package/dist/esm/project-run/invocation/run.mjs.map +1 -1
- package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
- package/dist/esm/project-run/outputs/status.mjs +12 -12
- package/dist/esm/project-run/outputs/status.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +2 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -2
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +147 -28
- package/docs/changelog.md +145 -2
- package/docs/checks/duplicate-detection.md +22 -3
- package/docs/checks/file-metrics.md +25 -6
- package/docs/checks/function-metrics.md +21 -2
- package/docs/checks/json-schema-validation.md +25 -4
- package/docs/checks/json-validation.md +24 -5
- package/docs/checks/maintenance-reminders.md +30 -6
- package/docs/checks/markdown-link-validation.md +24 -4
- package/docs/checks/markdown-lint.md +167 -0
- package/docs/checks/secret-detection.md +31 -7
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
- package/docs/guides/building-project-gate.md +706 -0
- package/docs/guides/callbacks.md +81 -22
- package/docs/guides/check-dependencies.md +41 -10
- package/docs/guides/collecting-project-files.md +7 -7
- package/docs/guides/command-check.md +155 -0
- package/docs/guides/data-boundaries.md +140 -0
- package/docs/guides/extending-check-lifecycle.md +77 -25
- package/docs/guides/finding-waivers.md +43 -1
- package/docs/guides/learned-scheduling.md +1 -1
- package/docs/guides/run-outputs.md +35 -9
- package/docs/guides/scheduling.md +15 -15
- package/docs/output.md +6 -5
- package/package.json +2 -1
- package/src/check/check.ts +332 -92
- package/src/check/flag-enablement.ts +76 -0
- package/src/check/handoff-provider-identity.ts +34 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check/project-changes.ts +14 -0
- package/src/check/project-context.ts +11 -0
- package/src/check-settlement/facts.ts +1 -1
- package/src/check-settlement/record-store.ts +1 -1
- package/src/data-boundary/canonical-data.ts +36 -9
- package/src/data-boundary/canonical-json.ts +18 -1
- package/src/data-boundary/closed-values.ts +26 -6
- package/src/data-boundary/config-glob.ts +17 -0
- package/src/data-boundary/project-path.ts +21 -0
- package/src/index.ts +72 -11
- package/src/machine-output/v4/atomic-publication.ts +3 -1
- package/src/package-checks/check-authoring.ts +136 -0
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
- package/src/package-checks/command-check/command-check.ts +152 -0
- package/src/package-checks/command-check/contract.ts +168 -0
- package/src/package-checks/command-check/execution.ts +211 -0
- package/src/package-checks/command-check/options.ts +331 -0
- package/src/package-checks/command-check/transcript.ts +35 -0
- package/src/package-checks/duplicate-detection/default-check.ts +37 -6
- package/src/package-checks/duplicate-detection/execution.ts +2 -4
- package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/options.ts +6 -3
- package/src/package-checks/duplicate-detection/records.ts +1 -1
- package/src/package-checks/file-metrics/constructor.ts +29 -6
- package/src/package-checks/file-metrics/execution.ts +2 -4
- package/src/package-checks/file-metrics/finding-messages.ts +1 -1
- package/src/package-checks/file-metrics/options.ts +6 -3
- package/src/package-checks/file-metrics/records.ts +1 -1
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
- package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
- package/src/package-checks/function-metrics/analysis.ts +7 -2
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
- package/src/package-checks/function-metrics/constructor.ts +30 -7
- package/src/package-checks/function-metrics/execution.ts +2 -4
- package/src/package-checks/function-metrics/finding-messages.ts +2 -2
- package/src/package-checks/function-metrics/measurement.ts +3 -1
- package/src/package-checks/function-metrics/options.ts +6 -3
- package/src/package-checks/function-metrics/records.ts +1 -1
- package/src/package-checks/host-environment/git.ts +11 -0
- package/src/package-checks/host-environment/path.ts +1 -20
- package/src/package-checks/host-environment/process/contract.ts +17 -9
- package/src/package-checks/host-environment/process/result.ts +48 -20
- package/src/package-checks/host-environment/process/runner.ts +8 -4
- package/src/package-checks/json-schema-validation/default-check.ts +38 -5
- package/src/package-checks/json-schema-validation/options.ts +4 -1
- package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
- package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
- package/src/package-checks/json-validation/default-check.ts +27 -6
- package/src/package-checks/json-validation/options.ts +4 -1
- package/src/package-checks/local-cache-options.ts +40 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
- package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
- package/src/package-checks/markdown-link-validation/execution.ts +1 -1
- package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
- package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
- package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
- package/src/package-checks/markdown-link-validation/options.ts +6 -7
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
- package/src/package-checks/markdown-lint/adapter.ts +167 -0
- package/src/package-checks/markdown-lint/default-check.ts +92 -0
- package/src/package-checks/markdown-lint/execution.ts +266 -0
- package/src/package-checks/markdown-lint/final-data.ts +33 -0
- package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
- package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
- package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
- package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
- package/src/package-checks/markdown-lint/options-validation.ts +50 -0
- package/src/package-checks/markdown-lint/options.ts +82 -0
- package/src/package-checks/markdown-lint/records.ts +132 -0
- package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
- package/src/package-checks/project-files/collection.ts +38 -22
- package/src/package-checks/project-files/config-glob.ts +1 -17
- package/src/package-checks/project-files/configuration.ts +1 -1
- package/src/package-checks/project-files/gitlink-revision.ts +4 -6
- package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
- package/src/package-checks/project-files/public-collection.ts +1 -1
- package/src/package-checks/project-files/revision-paths.ts +3 -3
- package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
- package/src/package-checks/secret-detection/default-check.ts +29 -6
- package/src/package-checks/secret-detection/execution.ts +2 -2
- package/src/package-checks/secret-detection/input-preparation.ts +64 -7
- package/src/package-checks/secret-detection/options.ts +5 -2
- package/src/package-checks/secret-detection/records.ts +1 -1
- package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
- package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
- package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
- package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
- package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
- package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
- package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
- package/src/project-definition/check-tree/authoring.ts +15 -8
- package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
- package/src/project-definition/check-tree/flag-conditions.ts +99 -0
- package/src/project-definition/check-tree/materialization.ts +12 -8
- package/src/project-definition/check-tree/resolution.ts +13 -15
- package/src/project-definition/declarative-snapshot.ts +9 -2
- package/src/project-definition/project-changes.ts +112 -0
- package/src/project-definition/project-definition-validation.ts +58 -10
- package/src/project-definition/project-definition.ts +41 -68
- package/src/project-definition/scheduler-policy.ts +6 -3
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
- package/src/project-run/aggregation.ts +51 -74
- package/src/project-run/changes/git.ts +206 -0
- package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
- package/src/project-run/check-execution/callback.ts +3 -2
- package/src/project-run/check-execution/dependencies.ts +120 -6
- package/src/project-run/check-execution/execution-finalization.ts +6 -4
- package/src/project-run/check-execution/execution-settlement.ts +88 -29
- package/src/project-run/check-execution/flag-controls.ts +22 -8
- package/src/project-run/check-execution/lifecycle.ts +14 -6
- package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
- package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
- package/src/project-run/check-execution/ready-check-execution.ts +97 -0
- package/src/project-run/check-execution/resolved-checks.ts +40 -219
- package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
- package/src/project-run/check-execution/terminal-result.ts +108 -29
- package/src/project-run/completion/completion.ts +17 -3
- package/src/project-run/controls/contract.ts +6 -16
- package/src/project-run/controls/validation.ts +7 -60
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
- package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
- package/src/project-run/invocation/candidate.ts +28 -15
- package/src/project-run/invocation/candidates.ts +56 -0
- package/src/project-run/invocation/creation.ts +7 -3
- package/src/project-run/invocation/execution.ts +136 -0
- package/src/project-run/invocation/run.ts +15 -179
- package/src/project-run/invocation/scheduler.ts +13 -6
- package/src/project-run/outputs/status.ts +15 -15
- package/src/project-run/progress-rendering/presentation.ts +35 -13
- package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
- package/src/project-run/progress-rendering/renderer.ts +10 -4
- package/src/project-run/project-context.ts +8 -4
- package/src/project-run/result.ts +5 -5
- package/src/project-run/run.ts +1 -1
- package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
- package/src/project-run/task-scheduler/execution-state.ts +4 -4
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
- package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
- package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
- package/src/project-run/task-scheduler/scheduler.ts +23 -6
- package/types/check/check.d.ts +178 -67
- package/types/check/flag-enablement.d.ts +42 -0
- package/types/check/handoff-provider-identity.d.ts +12 -0
- package/types/check/project-changes.d.ts +13 -0
- package/types/check/project-context.d.ts +10 -0
- package/types/check-settlement/facts.d.ts +1 -1
- package/types/data-boundary/canonical-data.d.ts +28 -5
- package/types/data-boundary/canonical-json.d.ts +18 -1
- package/types/data-boundary/closed-values.d.ts +17 -1
- package/types/data-boundary/config-glob.d.ts +5 -0
- package/types/data-boundary/project-path.d.ts +4 -0
- package/types/index.d.ts +27 -11
- package/types/package-checks/check-authoring.d.ts +45 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
- package/types/package-checks/command-check/command-check.d.ts +48 -0
- package/types/package-checks/command-check/contract.d.ts +108 -0
- package/types/package-checks/command-check/execution.d.ts +7 -0
- package/types/package-checks/command-check/options.d.ts +11 -0
- package/types/package-checks/command-check/transcript.d.ts +8 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +4 -3
- package/types/package-checks/duplicate-detection/records.d.ts +1 -1
- package/types/package-checks/file-metrics/constructor.d.ts +5 -2
- package/types/package-checks/file-metrics/options.d.ts +4 -3
- package/types/package-checks/file-metrics/records.d.ts +1 -1
- package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
- package/types/package-checks/function-metrics/constructor.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
- package/types/package-checks/function-metrics/options.d.ts +4 -3
- package/types/package-checks/function-metrics/records.d.ts +1 -1
- package/types/package-checks/host-environment/git.d.ts +2 -0
- package/types/package-checks/host-environment/path.d.ts +1 -3
- package/types/package-checks/host-environment/process/contract.d.ts +17 -9
- package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-schema-validation/options.d.ts +2 -1
- package/types/package-checks/json-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-validation/options.d.ts +2 -1
- package/types/package-checks/local-cache-options.d.ts +9 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
- package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
- package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
- package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
- package/types/package-checks/markdown-lint/execution.d.ts +24 -0
- package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
- package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
- package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
- package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-lint/options.d.ts +65 -0
- package/types/package-checks/markdown-lint/records.d.ts +39 -0
- package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
- package/types/package-checks/secret-detection/default-check.d.ts +4 -1
- package/types/package-checks/secret-detection/options.d.ts +3 -2
- package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
- package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
- package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
- package/types/project-definition/check-tree/authoring.d.ts +5 -3
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
- package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
- package/types/project-definition/check-tree/resolution.d.ts +6 -4
- package/types/project-definition/declarative-snapshot.d.ts +4 -1
- package/types/project-definition/project-changes.d.ts +30 -0
- package/types/project-definition/project-definition.d.ts +15 -30
- package/types/project-definition/scheduler-policy.d.ts +3 -3
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
- package/types/project-run/aggregation.d.ts +8 -6
- package/types/project-run/changes/git.d.ts +14 -0
- package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +3 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
- package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
- package/types/project-run/check-execution/flag-controls.d.ts +1 -1
- package/types/project-run/check-execution/lifecycle.d.ts +9 -5
- package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
- package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
- package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
- package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
- package/types/project-run/check-execution/terminal-result.d.ts +13 -1
- package/types/project-run/completion/completion.d.ts +3 -1
- package/types/project-run/controls/contract.d.ts +6 -16
- package/types/project-run/invocation/candidates.d.ts +8 -0
- package/types/project-run/invocation/execution.d.ts +5 -0
- package/types/project-run/invocation/run.d.ts +2 -2
- package/types/project-run/outputs/status.d.ts +4 -4
- package/types/project-run/progress-rendering/presentation.d.ts +4 -3
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
- package/types/project-run/progress-rendering/renderer.d.ts +4 -2
- package/types/project-run/project-context.d.ts +3 -3
- package/types/project-run/result.d.ts +3 -3
- package/types/project-run/run.d.ts +1 -1
- package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
- package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
- package/dist/esm/check/finding-presentation.mjs.map +0 -1
- package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
- package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
- package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
- package/types/package-checks/project-files/config-glob.d.ts +0 -5
- /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
- /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
- /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
- /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
- /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
- /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const TERMINAL_NUL_CODE_UNITS = 1;
|
|
2
|
+
/** SCC adapter 的私有 Windows argv 传输上限;不属于 scanner options。 */
|
|
3
|
+
export const SCC_BATCH_COMMAND_LINE_CEILING = 28_000;
|
|
4
|
+
/**
|
|
5
|
+
* 返回 Windows command-line serialization 的保守 UTF-16 code-unit 上界。
|
|
6
|
+
*
|
|
7
|
+
* 每个 argument 都按最多双倍转义并保留一对引号,arguments 之间保留一个分隔符,
|
|
8
|
+
* 最后保留 CreateProcessW 所需的终止 NUL。
|
|
9
|
+
*/
|
|
10
|
+
export function estimateSccCommandLineCodeUnits(argumentsToEstimate) {
|
|
11
|
+
return argumentsToEstimate.reduce((total, argument, index) => total + (index === 0 ? 0 : 1) + 2 * argument.length + 2, TERMINAL_NUL_CODE_UNITS);
|
|
12
|
+
}
|
|
13
|
+
/** 将已批准的 exact paths 按固定 SCC protocol 稳定地切为可传输 batches。 */
|
|
14
|
+
export function planSccBatches(executable, fixedArguments, includePaths, ceiling = SCC_BATCH_COMMAND_LINE_CEILING) {
|
|
15
|
+
const batches = [];
|
|
16
|
+
let currentBatch = [];
|
|
17
|
+
for (const includePath of includePaths) {
|
|
18
|
+
const singlePathArguments = [executable, ...fixedArguments, includePath];
|
|
19
|
+
if (estimateSccCommandLineCodeUnits(singlePathArguments) > ceiling) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
error: `scc exact path cannot fit command-line ceiling ${ceiling}: ${JSON.stringify(includePath)}`
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const candidateBatch = [...currentBatch, includePath];
|
|
26
|
+
if (currentBatch.length > 0 &&
|
|
27
|
+
estimateSccCommandLineCodeUnits([executable, ...fixedArguments, ...candidateBatch]) > ceiling) {
|
|
28
|
+
batches.push(currentBatch);
|
|
29
|
+
currentBatch = [includePath];
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
currentBatch = candidateBatch;
|
|
33
|
+
}
|
|
34
|
+
if (currentBatch.length > 0)
|
|
35
|
+
batches.push(currentBatch);
|
|
36
|
+
return { ok: true, batches };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=batch-planner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-planner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/batch-planner.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAMrD;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAAC,mBAAsC;IACpF,OAAO,mBAAmB,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EACnF,uBAAuB,CACxB,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,cAAiC,EACjC,YAA+B,EAC/B,OAAO,GAAG,8BAA8B;IAExC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,GAAG,cAAc,EAAE,WAAW,CAAC,CAAC;QACzE,IAAI,+BAA+B,CAAC,mBAAmB,CAAC,GAAG,OAAO,EAAE,CAAC;YACnE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,kDAAkD,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;aACnG,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,GAAG,YAAY,EAAE,WAAW,CAAC,CAAC;QACtD,IACE,YAAY,CAAC,MAAM,GAAG,CAAC;YACvB,+BAA+B,CAAC,CAAC,UAAU,EAAE,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,GAAG,OAAO,EAC7F,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,YAAY,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,YAAY,GAAG,cAAc,CAAC;IAChC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["const TERMINAL_NUL_CODE_UNITS = 1;\n\n/** SCC adapter 的私有 Windows argv 传输上限;不属于 scanner options。 */\nexport const SCC_BATCH_COMMAND_LINE_CEILING = 28_000;\n\nexport type SccBatchPlan =\n | { readonly batches: readonly (readonly string[])[]; readonly ok: true }\n | { readonly error: string; readonly ok: false };\n\n/**\n * 返回 Windows command-line serialization 的保守 UTF-16 code-unit 上界。\n *\n * 每个 argument 都按最多双倍转义并保留一对引号,arguments 之间保留一个分隔符,\n * 最后保留 CreateProcessW 所需的终止 NUL。\n */\nexport function estimateSccCommandLineCodeUnits(argumentsToEstimate: readonly string[]): number {\n return argumentsToEstimate.reduce(\n (total, argument, index) => total + (index === 0 ? 0 : 1) + 2 * argument.length + 2,\n TERMINAL_NUL_CODE_UNITS\n );\n}\n\n/** 将已批准的 exact paths 按固定 SCC protocol 稳定地切为可传输 batches。 */\nexport function planSccBatches(\n executable: string,\n fixedArguments: readonly string[],\n includePaths: readonly string[],\n ceiling = SCC_BATCH_COMMAND_LINE_CEILING\n): SccBatchPlan {\n const batches: string[][] = [];\n let currentBatch: string[] = [];\n\n for (const includePath of includePaths) {\n const singlePathArguments = [executable, ...fixedArguments, includePath];\n if (estimateSccCommandLineCodeUnits(singlePathArguments) > ceiling) {\n return {\n ok: false,\n error: `scc exact path cannot fit command-line ceiling ${ceiling}: ${JSON.stringify(includePath)}`\n };\n }\n\n const candidateBatch = [...currentBatch, includePath];\n if (\n currentBatch.length > 0 &&\n estimateSccCommandLineCodeUnits([executable, ...fixedArguments, ...candidateBatch]) > ceiling\n ) {\n batches.push(currentBatch);\n currentBatch = [includePath];\n continue;\n }\n currentBatch = candidateBatch;\n }\n\n if (currentBatch.length > 0) batches.push(currentBatch);\n return { ok: true, batches };\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DEFAULT_PROCESS_MAX_BUFFER_BYTES } from "../../host-environment/process.mjs";
|
|
2
|
+
export const SCC_LOGICAL_SCAN_TIMEOUT_MS = 300_000;
|
|
3
|
+
const NANOSECONDS_PER_MILLISECOND = 1000000n;
|
|
4
|
+
/** 为一次 logical SCC scan 建立共享 deadline 与 stdout/stderr 预算。 */
|
|
5
|
+
export function beginSccLogicalScanResources(startedNanoseconds, timeoutMilliseconds = SCC_LOGICAL_SCAN_TIMEOUT_MS, outputBudgetBytes = DEFAULT_PROCESS_MAX_BUFFER_BYTES) {
|
|
6
|
+
return {
|
|
7
|
+
deadlineNanoseconds: startedNanoseconds + BigInt(timeoutMilliseconds) * NANOSECONDS_PER_MILLISECOND,
|
|
8
|
+
stderrRemainingBytes: outputBudgetBytes,
|
|
9
|
+
stdoutRemainingBytes: outputBudgetBytes
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** 计算下一个 batch 可使用的完整毫秒数;deadline 到期时不再启动 process。 */
|
|
13
|
+
export function remainingSccBatchTimeoutMs(resources, nowNanoseconds) {
|
|
14
|
+
const remainingNanoseconds = resources.deadlineNanoseconds - nowNanoseconds;
|
|
15
|
+
const remainingMilliseconds = Number(remainingNanoseconds / NANOSECONDS_PER_MILLISECOND);
|
|
16
|
+
return remainingMilliseconds > 0 ? remainingMilliseconds : null;
|
|
17
|
+
}
|
|
18
|
+
/** 以两个 stream 中较小的余量限制本次 process 的 maxBuffer。 */
|
|
19
|
+
export function remainingSccBatchMaxBuffer(resources) {
|
|
20
|
+
const remainingBytes = Math.min(resources.stdoutRemainingBytes, resources.stderrRemainingBytes);
|
|
21
|
+
return remainingBytes > 0 ? remainingBytes : null;
|
|
22
|
+
}
|
|
23
|
+
/** 记录一次 process 的 UTF-8 output;任一 stream 超出完整 logical-scan 预算即失败。 */
|
|
24
|
+
export function consumeSccProcessOutput(resources, stdout, stderr) {
|
|
25
|
+
const stdoutBytes = Buffer.byteLength(stdout, "utf8");
|
|
26
|
+
const stderrBytes = Buffer.byteLength(stderr, "utf8");
|
|
27
|
+
if (stdoutBytes > resources.stdoutRemainingBytes ||
|
|
28
|
+
stderrBytes > resources.stderrRemainingBytes) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
resources.stdoutRemainingBytes -= stdoutBytes;
|
|
32
|
+
resources.stderrRemainingBytes -= stderrBytes;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=logical-scan-resources.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logical-scan-resources.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/logical-scan-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAC;AAErF,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC;AACnD,MAAM,2BAA2B,GAAG,QAAU,CAAC;AAQ/C,6DAA6D;AAC7D,MAAM,UAAU,4BAA4B,CAC1C,kBAA0B,EAC1B,mBAAmB,GAAG,2BAA2B,EACjD,iBAAiB,GAAG,gCAAgC;IAEpD,OAAO;QACL,mBAAmB,EACjB,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,2BAA2B;QAChF,oBAAoB,EAAE,iBAAiB;QACvC,oBAAoB,EAAE,iBAAiB;KACxC,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,0BAA0B,CACxC,SAAkC,EAClC,cAAsB;IAEtB,MAAM,oBAAoB,GAAG,SAAS,CAAC,mBAAmB,GAAG,cAAc,CAAC;IAC5E,MAAM,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,GAAG,2BAA2B,CAAC,CAAC;IACzF,OAAO,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,0BAA0B,CAAC,SAAkC;IAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAChG,OAAO,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,uBAAuB,CACrC,SAAkC,EAClC,MAAc,EACd,MAAc;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,IACE,WAAW,GAAG,SAAS,CAAC,oBAAoB;QAC5C,WAAW,GAAG,SAAS,CAAC,oBAAoB,EAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,SAAS,CAAC,oBAAoB,IAAI,WAAW,CAAC;IAC9C,SAAS,CAAC,oBAAoB,IAAI,WAAW,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { DEFAULT_PROCESS_MAX_BUFFER_BYTES } from \"../../host-environment/process.ts\";\n\nexport const SCC_LOGICAL_SCAN_TIMEOUT_MS = 300_000;\nconst NANOSECONDS_PER_MILLISECOND = 1_000_000n;\n\nexport interface SccLogicalScanResources {\n readonly deadlineNanoseconds: bigint;\n stderrRemainingBytes: number;\n stdoutRemainingBytes: number;\n}\n\n/** 为一次 logical SCC scan 建立共享 deadline 与 stdout/stderr 预算。 */\nexport function beginSccLogicalScanResources(\n startedNanoseconds: bigint,\n timeoutMilliseconds = SCC_LOGICAL_SCAN_TIMEOUT_MS,\n outputBudgetBytes = DEFAULT_PROCESS_MAX_BUFFER_BYTES\n): SccLogicalScanResources {\n return {\n deadlineNanoseconds:\n startedNanoseconds + BigInt(timeoutMilliseconds) * NANOSECONDS_PER_MILLISECOND,\n stderrRemainingBytes: outputBudgetBytes,\n stdoutRemainingBytes: outputBudgetBytes\n };\n}\n\n/** 计算下一个 batch 可使用的完整毫秒数;deadline 到期时不再启动 process。 */\nexport function remainingSccBatchTimeoutMs(\n resources: SccLogicalScanResources,\n nowNanoseconds: bigint\n): number | null {\n const remainingNanoseconds = resources.deadlineNanoseconds - nowNanoseconds;\n const remainingMilliseconds = Number(remainingNanoseconds / NANOSECONDS_PER_MILLISECOND);\n return remainingMilliseconds > 0 ? remainingMilliseconds : null;\n}\n\n/** 以两个 stream 中较小的余量限制本次 process 的 maxBuffer。 */\nexport function remainingSccBatchMaxBuffer(resources: SccLogicalScanResources): number | null {\n const remainingBytes = Math.min(resources.stdoutRemainingBytes, resources.stderrRemainingBytes);\n return remainingBytes > 0 ? remainingBytes : null;\n}\n\n/** 记录一次 process 的 UTF-8 output;任一 stream 超出完整 logical-scan 预算即失败。 */\nexport function consumeSccProcessOutput(\n resources: SccLogicalScanResources,\n stdout: string,\n stderr: string\n): boolean {\n const stdoutBytes = Buffer.byteLength(stdout, \"utf8\");\n const stderrBytes = Buffer.byteLength(stderr, \"utf8\");\n if (\n stdoutBytes > resources.stdoutRemainingBytes ||\n stderrBytes > resources.stderrRemainingBytes\n ) {\n return false;\n }\n resources.stdoutRemainingBytes -= stdoutBytes;\n resources.stderrRemainingBytes -= stderrBytes;\n return true;\n}\n"]}
|
|
@@ -5,40 +5,27 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { errorMessage } from "../../host-environment/error-message.mjs";
|
|
7
7
|
import { runProcessSync } from "../../host-environment/process.mjs";
|
|
8
|
+
import { acceptExactInputMeasurements } from "../../project-files/exact-input-measurement.mjs";
|
|
9
|
+
import { planSccBatches } from "./batch-planner.mjs";
|
|
10
|
+
import { beginSccLogicalScanResources, consumeSccProcessOutput, remainingSccBatchMaxBuffer, remainingSccBatchTimeoutMs } from "./logical-scan-resources.mjs";
|
|
8
11
|
import { parseSccCSV } from "./parser.mjs";
|
|
9
12
|
const SCC_BY_FILE_ARGUMENTS = Object.freeze(["--no-config", "--by-file", "--format", "csv"]);
|
|
10
|
-
const SCC_SCAN_TIMEOUT_MS = 300_000;
|
|
11
13
|
export function scanWithScc({ cwd, includePaths, scanner }) {
|
|
12
14
|
try {
|
|
13
15
|
if (includePaths.length === 0)
|
|
14
16
|
return { ok: true, measurements: [] };
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
error: `scc process error: ${commandResult.error.message}`,
|
|
26
|
-
reason: "execution"
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
if (commandResult.status !== 0) {
|
|
30
|
-
const stderr = (commandResult.stderr || "").trim();
|
|
31
|
-
const stdout = (commandResult.stdout || "").trim();
|
|
32
|
-
const termination = commandResult.status === null
|
|
33
|
-
? `signal ${commandResult.signal ?? "unknown"}`
|
|
34
|
-
: `exit ${commandResult.status}`;
|
|
35
|
-
return {
|
|
36
|
-
ok: false,
|
|
37
|
-
error: `scc ${termination}: ${stderr || stdout || "no output"}`,
|
|
38
|
-
reason: "execution"
|
|
39
|
-
};
|
|
17
|
+
const batchPlan = planSccBatches(scanner.executable, SCC_BY_FILE_ARGUMENTS, includePaths);
|
|
18
|
+
if (!batchPlan.ok)
|
|
19
|
+
return { ok: false, error: batchPlan.error, reason: "execution" };
|
|
20
|
+
const logicalScanResources = beginSccLogicalScanResources(process.hrtime.bigint());
|
|
21
|
+
const measurements = [];
|
|
22
|
+
for (const batch of batchPlan.batches) {
|
|
23
|
+
const batchResult = scanSccBatch({ batch, cwd, logicalScanResources, scanner });
|
|
24
|
+
if (!batchResult.ok)
|
|
25
|
+
return batchResult;
|
|
26
|
+
measurements.push(...batchResult.measurements);
|
|
40
27
|
}
|
|
41
|
-
return
|
|
28
|
+
return mergeSccBatchMeasurements(measurements);
|
|
42
29
|
}
|
|
43
30
|
catch (error) {
|
|
44
31
|
return {
|
|
@@ -48,7 +35,93 @@ export function scanWithScc({ cwd, includePaths, scanner }) {
|
|
|
48
35
|
};
|
|
49
36
|
}
|
|
50
37
|
}
|
|
51
|
-
function
|
|
52
|
-
|
|
38
|
+
function scanSccBatch({ batch, cwd, logicalScanResources, scanner }) {
|
|
39
|
+
const remainingTimeoutMs = remainingSccBatchTimeoutMs(logicalScanResources, process.hrtime.bigint());
|
|
40
|
+
if (remainingTimeoutMs === null)
|
|
41
|
+
return expiredSccDeadline();
|
|
42
|
+
const remainingMaxBufferBytes = remainingSccBatchMaxBuffer(logicalScanResources);
|
|
43
|
+
if (remainingMaxBufferBytes === null)
|
|
44
|
+
return exhaustedSccOutputBudget();
|
|
45
|
+
const commandResult = runProcessSync({
|
|
46
|
+
args: [...SCC_BY_FILE_ARGUMENTS, ...batch],
|
|
47
|
+
command: scanner.executable,
|
|
48
|
+
cwd,
|
|
49
|
+
maxBuffer: remainingMaxBufferBytes,
|
|
50
|
+
timeout: remainingTimeoutMs
|
|
51
|
+
});
|
|
52
|
+
const processFailure = sccBatchProcessFailure(commandResult, logicalScanResources);
|
|
53
|
+
if (processFailure !== null)
|
|
54
|
+
return processFailure;
|
|
55
|
+
return parseAcceptedSccBatch(commandResult.stdout, cwd, batch);
|
|
56
|
+
}
|
|
57
|
+
function expiredSccDeadline() {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
error: "scc logical scan exceeded its shared timeout before the next batch",
|
|
61
|
+
reason: "execution"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function exhaustedSccOutputBudget() {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
error: "scc logical scan exhausted its cumulative output budget before the next batch",
|
|
68
|
+
reason: "execution"
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function sccBatchProcessFailure(commandResult, logicalScanResources) {
|
|
72
|
+
if (!consumeSccProcessOutput(logicalScanResources, commandResult.stdout, commandResult.stderr)) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: "scc logical scan exceeded its cumulative stdout or stderr output budget",
|
|
76
|
+
reason: "execution"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (commandResult.error) {
|
|
80
|
+
return {
|
|
81
|
+
ok: false,
|
|
82
|
+
error: `scc process error: ${commandResult.error.message}`,
|
|
83
|
+
reason: "execution"
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (commandResult.status === 0)
|
|
87
|
+
return null;
|
|
88
|
+
const output = commandResult.stderr.trim() || commandResult.stdout.trim() || "no output";
|
|
89
|
+
const termination = commandResult.status === null
|
|
90
|
+
? `signal ${commandResult.signal ?? "unknown"}`
|
|
91
|
+
: `exit ${commandResult.status}`;
|
|
92
|
+
return { ok: false, error: `scc ${termination}: ${output}`, reason: "execution" };
|
|
93
|
+
}
|
|
94
|
+
function parseAcceptedSccBatch(stdout, cwd, batch) {
|
|
95
|
+
const parsed = parseSccCSV(stdout, cwd);
|
|
96
|
+
if (!parsed.ok)
|
|
97
|
+
return parsed;
|
|
98
|
+
const acceptedMeasurements = acceptExactInputMeasurements(parsed.measurements, batch);
|
|
99
|
+
return acceptedMeasurements.ok
|
|
100
|
+
? parsed
|
|
101
|
+
: { ok: false, error: acceptedMeasurements.error, reason: "invalid-result" };
|
|
102
|
+
}
|
|
103
|
+
function mergeSccBatchMeasurements(measurements) {
|
|
104
|
+
const measuredPaths = new Set();
|
|
105
|
+
for (const measurement of measurements) {
|
|
106
|
+
if (measuredPaths.has(measurement.payload.path)) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
error: `scc returned duplicate measurement path ${JSON.stringify(measurement.payload.path)}`,
|
|
110
|
+
reason: "invalid-result"
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
measuredPaths.add(measurement.payload.path);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
ok: true,
|
|
117
|
+
measurements: [...measurements].sort((left, right) => compareText(left.payload.path, right.payload.path))
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function compareText(left, right) {
|
|
121
|
+
if (left < right)
|
|
122
|
+
return -1;
|
|
123
|
+
if (left > right)
|
|
124
|
+
return 1;
|
|
125
|
+
return 0;
|
|
53
126
|
}
|
|
54
127
|
//# sourceMappingURL=scanner.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7F,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAQpC,MAAM,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAsB;IAC5E,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAErE,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,aAAa,GAAG,cAAc,CAAC;YACnC,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,GAAG;YACH,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,sBAAsB,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC1D,MAAM,EAAE,WAAW;aACpB,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,WAAW,GACf,aAAa,CAAC,MAAM,KAAK,IAAI;gBAC3B,CAAC,CAAC,UAAU,aAAa,CAAC,MAAM,IAAI,SAAS,EAAE;gBAC/C,CAAC,CAAC,QAAQ,aAAa,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,OAAO,WAAW,KAAK,MAAM,IAAI,MAAM,IAAI,WAAW,EAAE;gBAC/D,MAAM,EAAE,WAAW;aACpB,CAAC;QACJ,CAAC;QAED,OAAO,WAAW,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,sBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE;YAClD,MAAM,EAAE,WAAW;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,YAA+B;IACnD,OAAO,CAAC,GAAG,qBAAqB,EAAE,GAAG,YAAY,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/**\n * scc 文件级 code-line 指标 wrapper。\n *\n * 封装 adapter-owned CLI 调用,输出 exact-path code lines 与 decision-token count。\n */\n\nimport { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { runProcessSync } from \"../../host-environment/process.ts\";\nimport type { ResolvedFileMetricsScannerOptions } from \"../options.ts\";\nimport { parseSccCSV, type SccScanResult } from \"./parser.ts\";\n\nconst SCC_BY_FILE_ARGUMENTS = Object.freeze([\"--no-config\", \"--by-file\", \"--format\", \"csv\"]);\nconst SCC_SCAN_TIMEOUT_MS = 300_000;\n\ninterface ScanWithSccOptions {\n readonly cwd: string;\n readonly includePaths: readonly string[];\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}\n\nexport function scanWithScc({ cwd, includePaths, scanner }: ScanWithSccOptions): SccScanResult {\n try {\n if (includePaths.length === 0) return { ok: true, measurements: [] };\n\n const scanArguments = buildSccArgs(includePaths);\n\n const commandResult = runProcessSync({\n args: scanArguments,\n command: scanner.executable,\n cwd,\n timeout: SCC_SCAN_TIMEOUT_MS\n });\n\n if (commandResult.error) {\n return {\n ok: false,\n error: `scc process error: ${commandResult.error.message}`,\n reason: \"execution\"\n };\n }\n\n if (commandResult.status !== 0) {\n const stderr = (commandResult.stderr || \"\").trim();\n const stdout = (commandResult.stdout || \"\").trim();\n const termination =\n commandResult.status === null\n ? `signal ${commandResult.signal ?? \"unknown\"}`\n : `exit ${commandResult.status}`;\n return {\n ok: false,\n error: `scc ${termination}: ${stderr || stdout || \"no output\"}`,\n reason: \"execution\"\n };\n }\n\n return parseSccCSV(commandResult.stdout || \"\", cwd);\n } catch (error: unknown) {\n return {\n ok: false,\n error: `scc adapter error: ${errorMessage(error)}`,\n reason: \"execution\"\n };\n }\n}\n\nfunction buildSccArgs(includePaths: readonly string[]): string[] {\n return [...SCC_BY_FILE_ARGUMENTS, ...includePaths];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scanner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/scanner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * scc 文件级 code-line 指标 wrapper。\n *\n * 封装 adapter-owned CLI 调用,输出 exact-path code lines 与 decision-token count。\n */\n\nimport { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { runProcessSync, type ProcessResult } from \"../../host-environment/process.ts\";\nimport { acceptExactInputMeasurements } from \"../../project-files/exact-input-measurement.ts\";\nimport type { ExactInputMeasurement } from \"../../project-files/exact-input-measurement.ts\";\nimport type { FileMetric } from \"../measurement-model.ts\";\nimport type { ResolvedFileMetricsScannerOptions } from \"../options.ts\";\nimport { planSccBatches } from \"./batch-planner.ts\";\nimport {\n beginSccLogicalScanResources,\n consumeSccProcessOutput,\n remainingSccBatchMaxBuffer,\n remainingSccBatchTimeoutMs,\n type SccLogicalScanResources\n} from \"./logical-scan-resources.ts\";\nimport { parseSccCSV, type SccScanResult } from \"./parser.ts\";\n\nconst SCC_BY_FILE_ARGUMENTS = Object.freeze([\"--no-config\", \"--by-file\", \"--format\", \"csv\"]);\ntype SccMeasurement = ExactInputMeasurement<FileMetric>;\n\ninterface ScanWithSccOptions {\n readonly cwd: string;\n readonly includePaths: readonly string[];\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}\n\nexport function scanWithScc({ cwd, includePaths, scanner }: ScanWithSccOptions): SccScanResult {\n try {\n if (includePaths.length === 0) return { ok: true, measurements: [] };\n\n const batchPlan = planSccBatches(scanner.executable, SCC_BY_FILE_ARGUMENTS, includePaths);\n if (!batchPlan.ok) return { ok: false, error: batchPlan.error, reason: \"execution\" };\n\n const logicalScanResources = beginSccLogicalScanResources(process.hrtime.bigint());\n const measurements: SccMeasurement[] = [];\n\n for (const batch of batchPlan.batches) {\n const batchResult = scanSccBatch({ batch, cwd, logicalScanResources, scanner });\n if (!batchResult.ok) return batchResult;\n measurements.push(...batchResult.measurements);\n }\n\n return mergeSccBatchMeasurements(measurements);\n } catch (error: unknown) {\n return {\n ok: false,\n error: `scc adapter error: ${errorMessage(error)}`,\n reason: \"execution\"\n };\n }\n}\n\nfunction scanSccBatch({\n batch,\n cwd,\n logicalScanResources,\n scanner\n}: {\n readonly batch: readonly string[];\n readonly cwd: string;\n readonly logicalScanResources: SccLogicalScanResources;\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}): SccScanResult {\n const remainingTimeoutMs = remainingSccBatchTimeoutMs(\n logicalScanResources,\n process.hrtime.bigint()\n );\n if (remainingTimeoutMs === null) return expiredSccDeadline();\n const remainingMaxBufferBytes = remainingSccBatchMaxBuffer(logicalScanResources);\n if (remainingMaxBufferBytes === null) return exhaustedSccOutputBudget();\n\n const commandResult = runProcessSync({\n args: [...SCC_BY_FILE_ARGUMENTS, ...batch],\n command: scanner.executable,\n cwd,\n maxBuffer: remainingMaxBufferBytes,\n timeout: remainingTimeoutMs\n });\n const processFailure = sccBatchProcessFailure(commandResult, logicalScanResources);\n if (processFailure !== null) return processFailure;\n return parseAcceptedSccBatch(commandResult.stdout, cwd, batch);\n}\n\nfunction expiredSccDeadline(): SccScanResult {\n return {\n ok: false,\n error: \"scc logical scan exceeded its shared timeout before the next batch\",\n reason: \"execution\"\n };\n}\n\nfunction exhaustedSccOutputBudget(): SccScanResult {\n return {\n ok: false,\n error: \"scc logical scan exhausted its cumulative output budget before the next batch\",\n reason: \"execution\"\n };\n}\n\nfunction sccBatchProcessFailure(\n commandResult: ProcessResult,\n logicalScanResources: SccLogicalScanResources\n): SccScanResult | null {\n if (!consumeSccProcessOutput(logicalScanResources, commandResult.stdout, commandResult.stderr)) {\n return {\n ok: false,\n error: \"scc logical scan exceeded its cumulative stdout or stderr output budget\",\n reason: \"execution\"\n };\n }\n if (commandResult.error) {\n return {\n ok: false,\n error: `scc process error: ${commandResult.error.message}`,\n reason: \"execution\"\n };\n }\n if (commandResult.status === 0) return null;\n\n const output = commandResult.stderr.trim() || commandResult.stdout.trim() || \"no output\";\n const termination =\n commandResult.status === null\n ? `signal ${commandResult.signal ?? \"unknown\"}`\n : `exit ${commandResult.status}`;\n return { ok: false, error: `scc ${termination}: ${output}`, reason: \"execution\" };\n}\n\nfunction parseAcceptedSccBatch(\n stdout: string,\n cwd: string,\n batch: readonly string[]\n): SccScanResult {\n const parsed = parseSccCSV(stdout, cwd);\n if (!parsed.ok) return parsed;\n const acceptedMeasurements = acceptExactInputMeasurements(parsed.measurements, batch);\n return acceptedMeasurements.ok\n ? parsed\n : { ok: false, error: acceptedMeasurements.error, reason: \"invalid-result\" };\n}\n\nfunction mergeSccBatchMeasurements(measurements: readonly SccMeasurement[]): SccScanResult {\n const measuredPaths = new Set<string>();\n for (const measurement of measurements) {\n if (measuredPaths.has(measurement.payload.path)) {\n return {\n ok: false,\n error: `scc returned duplicate measurement path ${JSON.stringify(measurement.payload.path)}`,\n reason: \"invalid-result\"\n };\n }\n measuredPaths.add(measurement.payload.path);\n }\n return {\n ok: true,\n measurements: [...measurements].sort((left, right) =>\n compareText(left.payload.path, right.payload.path)\n )\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"]}
|
|
@@ -115,10 +115,15 @@ function compareFunctionMeasurements(left, right) {
|
|
|
115
115
|
function compareComplexityContributors(left, right) {
|
|
116
116
|
const commonLength = Math.min(left.length, right.length);
|
|
117
117
|
for (let index = 0; index < commonLength; index += 1) {
|
|
118
|
-
const
|
|
118
|
+
const leftContributor = left[index];
|
|
119
|
+
const rightContributor = right[index];
|
|
120
|
+
if (leftContributor === undefined || rightContributor === undefined) {
|
|
121
|
+
throw new Error(`Complexity contributor index is out of range: ${index}`);
|
|
122
|
+
}
|
|
123
|
+
const lineDifference = leftContributor.line - rightContributor.line;
|
|
119
124
|
if (lineDifference !== 0)
|
|
120
125
|
return lineDifference;
|
|
121
|
-
const tokenDifference = compareText(
|
|
126
|
+
const tokenDifference = compareText(leftContributor.token, rightContributor.token);
|
|
122
127
|
if (tokenDifference !== 0)
|
|
123
128
|
return tokenDifference;
|
|
124
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/analysis.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FunctionMetric } from \"./measurement-model.ts\";\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\n\nexport interface FunctionMetricInstance {\n readonly metric: FunctionMetric;\n readonly semanticSubject: string;\n}\n\nexport interface FunctionMetricAnalysis {\n readonly instances: readonly FunctionMetricInstance[];\n}\n\nexport function analyzeFunctionMetrics(\n metrics: readonly unknown[]\n): FunctionMetricAnalysis | undefined {\n const metricsByIdentity = groupValidMetrics(metrics);\n if (metricsByIdentity === undefined) {\n return undefined;\n }\n const instances: FunctionMetricInstance[] = [];\n for (const group of metricsByIdentity.values()) {\n const sortedGroup = [...group].sort(compareFunctionInstances);\n instances.push(...createFunctionInstances(sortedGroup));\n }\n instances.sort((left, right) => compareText(left.semanticSubject, right.semanticSubject));\n return Object.freeze({ instances: Object.freeze(instances) });\n}\n\nfunction groupValidMetrics(metrics: readonly unknown[]): Map<string, FunctionMetric[]> | undefined {\n const groups = new Map<string, FunctionMetric[]>();\n for (const metric of metrics) {\n if (!isValidFunctionMetric(metric)) {\n return undefined;\n }\n const key = functionIdentityKey(metric);\n const group = groups.get(key) ?? [];\n group.push(metric);\n groups.set(key, group);\n }\n return groups;\n}\n\nfunction createFunctionInstances(sortedGroup: readonly FunctionMetric[]): FunctionMetricInstance[] {\n return sortedGroup.map((metric, index) =>\n Object.freeze({\n metric,\n semanticSubject:\n isStableFunctionName(metric.name) && sortedGroup.length === 1\n ? functionSubject(metric)\n : ambiguousFunctionSubject(metric, index + 1)\n })\n );\n}\n\nfunction isValidFunctionMetric(metric: unknown): metric is FunctionMetric {\n if (!isRecord(metric)) return false;\n return (\n typeof metric.file === \"string\" &&\n metric.file.length > 0 &&\n typeof metric.name === \"string\" &&\n metric.name.length > 0 &&\n hasValidFunctionLocation(metric) &&\n hasValidFunctionMeasurements(metric)\n );\n}\n\nfunction hasValidFunctionLocation(metric: Readonly<Record<string, unknown>>): boolean {\n return (\n isPositiveSafeInteger(metric.startLine) &&\n isPositiveSafeInteger(metric.endLine) &&\n metric.endLine >= metric.startLine\n );\n}\n\nfunction hasValidFunctionMeasurements(metric: Readonly<Record<string, unknown>>): boolean {\n return (\n isValidNonNegativeInteger(metric.lines) &&\n isValidNonNegativeInteger(metric.parameterCount) &&\n validCyclomaticComplexity(metric.cyclomaticComplexity) &&\n validNestingDepth(metric.nestingDepth) &&\n validComplexityContributors(metric.complexityContributors)\n );\n}\n\nfunction validCyclomaticComplexity(value: unknown): boolean {\n if (!isRecord(value) || value.source !== \"typescript-analyzer\") return false;\n return value.value === null || isValidNonNegativeInteger(value.value);\n}\n\nfunction validNestingDepth(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.source === \"typescript-analyzer\" &&\n isValidNonNegativeInteger(value.value)\n );\n}\n\nfunction validComplexityContributors(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (contributor) =>\n isRecord(contributor) &&\n typeof contributor.token === \"string\" &&\n isPositiveSafeInteger(contributor.line)\n )\n );\n}\n\nfunction isValidNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction functionSubject(metric: Pick<FunctionMetric, \"file\" | \"name\">): string {\n const identity = new TextDecoder().decode(\n canonicalJsonBytes({\n file: metric.file,\n name: metric.name\n })\n );\n return `function:${identity}`;\n}\n\nfunction ambiguousFunctionSubject(\n metric: Pick<FunctionMetric, \"file\" | \"name\">,\n occurrence: number\n): string {\n const identity = new TextDecoder().decode(\n canonicalJsonBytes({\n file: metric.file,\n name: metric.name,\n occurrence\n })\n );\n return `function-instance:${identity}`;\n}\n\nfunction functionIdentityKey(metric: Pick<FunctionMetric, \"file\" | \"name\">): string {\n return `${metric.file}\\u0000${metric.name}`;\n}\n\nfunction compareFunctionInstances(left: FunctionMetric, right: FunctionMetric): number {\n return (\n compareFunctionLocation(left, right) ||\n compareFunctionMeasurements(left, right) ||\n compareComplexityContributors(left.complexityContributors, right.complexityContributors) ||\n left.parameterCount - right.parameterCount\n );\n}\n\nfunction compareFunctionLocation(left: FunctionMetric, right: FunctionMetric): number {\n return left.startLine - right.startLine || left.endLine - right.endLine;\n}\n\nfunction compareFunctionMeasurements(left: FunctionMetric, right: FunctionMetric): number {\n return (\n left.lines - right.lines ||\n (left.cyclomaticComplexity.value ?? -1) - (right.cyclomaticComplexity.value ?? -1) ||\n left.nestingDepth.value - right.nestingDepth.value\n );\n}\n\nfunction compareComplexityContributors(\n left: FunctionMetric[\"complexityContributors\"],\n right: FunctionMetric[\"complexityContributors\"]\n): number {\n const commonLength = Math.min(left.length, right.length);\n for (let index = 0; index < commonLength; index += 1) {\n const lineDifference = left[index].line - right[index].line;\n if (lineDifference !== 0) return lineDifference;\n const tokenDifference = compareText(left[index].token, right[index].token);\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.length - right.length;\n}\n\nexport function isStableFunctionName(name: string): boolean {\n return name.trim() !== \"\" && name !== \"(anonymous)\" && name !== \"unknown\";\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"]}
|
|
1
|
+
{"version":3,"file":"analysis.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/analysis.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FunctionMetric } from \"./measurement-model.ts\";\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\n\nexport interface FunctionMetricInstance {\n readonly metric: FunctionMetric;\n readonly semanticSubject: string;\n}\n\nexport interface FunctionMetricAnalysis {\n readonly instances: readonly FunctionMetricInstance[];\n}\n\nexport function analyzeFunctionMetrics(\n metrics: readonly unknown[]\n): FunctionMetricAnalysis | undefined {\n const metricsByIdentity = groupValidMetrics(metrics);\n if (metricsByIdentity === undefined) {\n return undefined;\n }\n const instances: FunctionMetricInstance[] = [];\n for (const group of metricsByIdentity.values()) {\n const sortedGroup = [...group].sort(compareFunctionInstances);\n instances.push(...createFunctionInstances(sortedGroup));\n }\n instances.sort((left, right) => compareText(left.semanticSubject, right.semanticSubject));\n return Object.freeze({ instances: Object.freeze(instances) });\n}\n\nfunction groupValidMetrics(metrics: readonly unknown[]): Map<string, FunctionMetric[]> | undefined {\n const groups = new Map<string, FunctionMetric[]>();\n for (const metric of metrics) {\n if (!isValidFunctionMetric(metric)) {\n return undefined;\n }\n const key = functionIdentityKey(metric);\n const group = groups.get(key) ?? [];\n group.push(metric);\n groups.set(key, group);\n }\n return groups;\n}\n\nfunction createFunctionInstances(sortedGroup: readonly FunctionMetric[]): FunctionMetricInstance[] {\n return sortedGroup.map((metric, index) =>\n Object.freeze({\n metric,\n semanticSubject:\n isStableFunctionName(metric.name) && sortedGroup.length === 1\n ? functionSubject(metric)\n : ambiguousFunctionSubject(metric, index + 1)\n })\n );\n}\n\nfunction isValidFunctionMetric(metric: unknown): metric is FunctionMetric {\n if (!isRecord(metric)) return false;\n return (\n typeof metric.file === \"string\" &&\n metric.file.length > 0 &&\n typeof metric.name === \"string\" &&\n metric.name.length > 0 &&\n hasValidFunctionLocation(metric) &&\n hasValidFunctionMeasurements(metric)\n );\n}\n\nfunction hasValidFunctionLocation(metric: Readonly<Record<string, unknown>>): boolean {\n return (\n isPositiveSafeInteger(metric.startLine) &&\n isPositiveSafeInteger(metric.endLine) &&\n metric.endLine >= metric.startLine\n );\n}\n\nfunction hasValidFunctionMeasurements(metric: Readonly<Record<string, unknown>>): boolean {\n return (\n isValidNonNegativeInteger(metric.lines) &&\n isValidNonNegativeInteger(metric.parameterCount) &&\n validCyclomaticComplexity(metric.cyclomaticComplexity) &&\n validNestingDepth(metric.nestingDepth) &&\n validComplexityContributors(metric.complexityContributors)\n );\n}\n\nfunction validCyclomaticComplexity(value: unknown): boolean {\n if (!isRecord(value) || value.source !== \"typescript-analyzer\") return false;\n return value.value === null || isValidNonNegativeInteger(value.value);\n}\n\nfunction validNestingDepth(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.source === \"typescript-analyzer\" &&\n isValidNonNegativeInteger(value.value)\n );\n}\n\nfunction validComplexityContributors(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (contributor) =>\n isRecord(contributor) &&\n typeof contributor.token === \"string\" &&\n isPositiveSafeInteger(contributor.line)\n )\n );\n}\n\nfunction isValidNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction functionSubject(metric: Pick<FunctionMetric, \"file\" | \"name\">): string {\n const identity = new TextDecoder().decode(\n canonicalJsonBytes({\n file: metric.file,\n name: metric.name\n })\n );\n return `function:${identity}`;\n}\n\nfunction ambiguousFunctionSubject(\n metric: Pick<FunctionMetric, \"file\" | \"name\">,\n occurrence: number\n): string {\n const identity = new TextDecoder().decode(\n canonicalJsonBytes({\n file: metric.file,\n name: metric.name,\n occurrence\n })\n );\n return `function-instance:${identity}`;\n}\n\nfunction functionIdentityKey(metric: Pick<FunctionMetric, \"file\" | \"name\">): string {\n return `${metric.file}\\u0000${metric.name}`;\n}\n\nfunction compareFunctionInstances(left: FunctionMetric, right: FunctionMetric): number {\n return (\n compareFunctionLocation(left, right) ||\n compareFunctionMeasurements(left, right) ||\n compareComplexityContributors(left.complexityContributors, right.complexityContributors) ||\n left.parameterCount - right.parameterCount\n );\n}\n\nfunction compareFunctionLocation(left: FunctionMetric, right: FunctionMetric): number {\n return left.startLine - right.startLine || left.endLine - right.endLine;\n}\n\nfunction compareFunctionMeasurements(left: FunctionMetric, right: FunctionMetric): number {\n return (\n left.lines - right.lines ||\n (left.cyclomaticComplexity.value ?? -1) - (right.cyclomaticComplexity.value ?? -1) ||\n left.nestingDepth.value - right.nestingDepth.value\n );\n}\n\nfunction compareComplexityContributors(\n left: FunctionMetric[\"complexityContributors\"],\n right: FunctionMetric[\"complexityContributors\"]\n): number {\n const commonLength = Math.min(left.length, right.length);\n for (let index = 0; index < commonLength; index += 1) {\n const leftContributor = left[index];\n const rightContributor = right[index];\n if (leftContributor === undefined || rightContributor === undefined) {\n throw new Error(`Complexity contributor index is out of range: ${index}`);\n }\n const lineDifference = leftContributor.line - rightContributor.line;\n if (lineDifference !== 0) return lineDifference;\n const tokenDifference = compareText(leftContributor.token, rightContributor.token);\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.length - right.length;\n}\n\nexport function isStableFunctionName(name: string): boolean {\n return name.trim() !== \"\" && name !== \"(anonymous)\" && name !== \"unknown\";\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"]}
|
|
@@ -214,7 +214,7 @@ export class FunctionInfo extends Nesting {
|
|
|
214
214
|
get parameters() {
|
|
215
215
|
return this.fullParameters.flatMap((parameter) => {
|
|
216
216
|
const match = /([\p{L}\p{N}_]+)(\s=.*)?(\s:.*)?$/u.exec(parameter);
|
|
217
|
-
return match?.[1] ? [match[1]] : [];
|
|
217
|
+
return match?.[1] !== undefined ? [match[1]] : [];
|
|
218
218
|
});
|
|
219
219
|
}
|
|
220
220
|
get length() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-model.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/analyzer/analysis-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAmB,UAAkB,EAAE,aAAqB;QAC1D,KAAK,CAAC,IAAI,UAAU,8BAA8B,aAAa,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,OAAO,OAAO;IAClB,IAAW,WAAW;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;AAE1C,wDAAwD;AACxD,MAAM,OAAO,SAAU,SAAQ,OAAO;IACpB,IAAI,CAAS;IAE7B,YAAmB,IAAY;QAC7B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAoB,WAAW;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,OAAO,YAAa,SAAQ,OAAO;IAChC,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,oBAAoB,CAAS;IAC7B,IAAI,GAAG,CAAC,CAAC;IACT,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,cAAc,GAAa,EAAE,CAAC;IAC9B,eAAe,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC;IACX,aAAa,GAAG,CAAC,CAAC;IAClB,eAAe,GAAG,CAAC,CAAC;IAC3B,wFAAwF;IACjF,WAAW,CAAiC;IACnD,iEAAiE;IAC1D,YAAY,GAAG,CAAC,CAAC;IACjB,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAG,KAAK,CAAC;IACpB,cAAc,GAAG,CAAC,CAAC;IACnB,oBAAoB,GAAG,KAAK,CAAC;IAC7B,WAAW,GAAG,KAAK,CAAC;IACpB,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,YAAmB,IAAY,EAAE,QAAgB,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;QACvE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,IAAW,qBAAqB,CAAC,KAAa;QAC5C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,QAAQ,CAAC,KAAa;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,eAAe,CAAC,KAAe;QACxC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACxC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAW,MAAM,CAAC,KAAa;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,OAAO,CAAC,KAAa;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACxC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAqC;QAC3D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QACpC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,cAAc,CAAC,KAAa;QACrC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,IAAW,sBAAsB,CAAC,KAAc;QAC9C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,aAAa,CAAC,KAAc;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAkB;QAC5C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAoB,WAAW;QAC7B,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;IACzB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5E,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,oCAAoC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3C,CAAC;IAEM,iBAAiB,CAAC,QAAgB;QACvC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC5B,CAAC;IAEM,oBAAoB,CAAC,QAAgB;QAC1C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEM,aAAa,CAAC,QAAgB;QACnC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC5B,CAAC;IAEM,gBAAgB,CAAC,QAAgB;QACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEM,YAAY,CAAC,KAAa;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,KAAa;QAChC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,eAAe;IACnB,QAAQ,CAAS;IACjB,IAAI,CAAS;IACb,YAAY,CAAiB;IAC7B,UAAU,GAAG,CAAC,CAAC;IAEtB,YAAmB,QAAgB,EAAE,IAAY,EAAE,YAAY,GAAmB,EAAE;QAClF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACpE,CAAC;IAED,gFAAgF;IAChF,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa,CAAC,KAAqB;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC;IAED,IAAW,6BAA6B;QACtC,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC1C,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,oBAAoB,EAClE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,eAAe,EAC7D,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAW,EAAE;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,gBAAgB,CAAC,SAAiB;QACvC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,GAAG,GAAG,gCAAgC,CAAC,YAAY,EAAE,SAAS,CAAC,EACtF,CAAC,CACF,CAAC;QACF,OAAO,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAC1C,CAAC;IAEM,iBAAiB,CAAC,SAAiB;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,gCAAgC,CAAC,YAA0B,EAAE,SAAiB;IACrF,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,2BAA2B,SAAS,mBAAmB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/**\n * Derived from terryyin/lizard 1.24.0.\n * Sources: lizard.py FunctionInfo and FileInformation; lizard_ext/lizardcomplextags.py\n * and lizard_ext/lizardnd.py FunctionInfo lifecycle seams.\n * Upstream revision: 308b1c3efd8c1c69bcc3eb82deeaec64fd3662ec.\n * SPDX-License-Identifier: Apache-2.0 AND MIT\n * Modified: mutable analysis result state isolated from execution and reporting.\n */\n\nexport class AttributeError extends Error {\n public constructor(targetName: string, attributeName: string) {\n super(`'${targetName}' object has no attribute '${attributeName}'`);\n this.name = \"AttributeError\";\n }\n}\n\n/** One lexical nesting level. */\nexport class Nesting {\n public get nameInSpace(): string {\n return \"\";\n }\n\n public get name_in_space(): string {\n return this.nameInSpace;\n }\n}\n\nexport const BARE_NESTING = new Nesting();\n\n/** A named namespace/class scope in a function name. */\nexport class Namespace extends Nesting {\n public readonly name: string;\n\n public constructor(name: string) {\n super();\n this.name = name;\n }\n\n public override get nameInSpace(): string {\n return this.name ? `${this.name}::` : \"\";\n }\n}\n\n/** Lizard's mutable per-function metrics model. */\nexport class FunctionInfo extends Nesting {\n public name: string;\n public filename: string;\n public startLine: number;\n public cyclomaticComplexity: number;\n public nloc = 1;\n public tokenCount = 1;\n public longName: string;\n public endLine: number;\n public fullParameters: string[] = [];\n public topNestingLevel = -1;\n public fanIn = 0;\n public fanOut = 0;\n public generalFanOut = 0;\n public maxNestingDepth = 0;\n /** Source lizardcomplextags.py storage; absent until its processor observes a token. */\n public complexTags: [string, number][] | undefined;\n /** Source lizardnd.py's per-function mutable processor state. */\n public nestingDepth = 0;\n public hiddenBracket = 0;\n public bracketLoop = false;\n public inCondition = false;\n public conditionDepth = 0;\n public logicalOperatorAdded = false;\n public prevWasElse = false;\n public forgivenMetrics = new Set<string>();\n\n public constructor(name: string, filename: string, startLine = 0, ccn = 1) {\n super();\n this.name = name;\n this.filename = filename;\n this.startLine = startLine;\n this.cyclomaticComplexity = ccn;\n this.longName = name;\n this.endLine = startLine;\n }\n\n /**\n * Source-name aliases share the camel-case storage above. They are an\n * analyzer-internal translation seam for extension bodies, not a Product API.\n */\n public get cyclomatic_complexity(): number {\n return this.cyclomaticComplexity;\n }\n\n public set cyclomatic_complexity(value: number) {\n this.cyclomaticComplexity = value;\n }\n\n public get token_count(): number {\n return this.tokenCount;\n }\n\n public set token_count(value: number) {\n this.tokenCount = value;\n }\n\n public get long_name(): string {\n return this.longName;\n }\n\n public set long_name(value: string) {\n this.longName = value;\n }\n\n public get start_line(): number {\n return this.startLine;\n }\n\n public set start_line(value: number) {\n this.startLine = value;\n }\n\n public get end_line(): number {\n return this.endLine;\n }\n\n public set end_line(value: number) {\n this.endLine = value;\n }\n\n public get full_parameters(): string[] {\n return this.fullParameters;\n }\n\n public set full_parameters(value: string[]) {\n this.fullParameters = value;\n }\n\n public get top_nesting_level(): number {\n return this.topNestingLevel;\n }\n\n public set top_nesting_level(value: number) {\n this.topNestingLevel = value;\n }\n\n public get fan_in(): number {\n return this.fanIn;\n }\n\n public set fan_in(value: number) {\n this.fanIn = value;\n }\n\n public get fan_out(): number {\n return this.fanOut;\n }\n\n public set fan_out(value: number) {\n this.fanOut = value;\n }\n\n public get general_fan_out(): number {\n return this.generalFanOut;\n }\n\n public set general_fan_out(value: number) {\n this.generalFanOut = value;\n }\n\n public get max_nesting_depth(): number {\n return this.maxNestingDepth;\n }\n\n public set max_nesting_depth(value: number) {\n this.maxNestingDepth = value;\n }\n\n public get complex_tags(): [string, number][] | undefined {\n return this.complexTags;\n }\n\n public set complex_tags(value: [string, number][] | undefined) {\n this.complexTags = value;\n }\n\n public get nesting_depth(): number {\n return this.nestingDepth;\n }\n\n public set nesting_depth(value: number) {\n this.nestingDepth = value;\n }\n\n public get hidden_bracket(): number {\n return this.hiddenBracket;\n }\n\n public set hidden_bracket(value: number) {\n this.hiddenBracket = value;\n }\n\n public get bracket_loop(): boolean {\n return this.bracketLoop;\n }\n\n public set bracket_loop(value: boolean) {\n this.bracketLoop = value;\n }\n\n public get in_condition(): boolean {\n return this.inCondition;\n }\n\n public set in_condition(value: boolean) {\n this.inCondition = value;\n }\n\n public get condition_depth(): number {\n return this.conditionDepth;\n }\n\n public set condition_depth(value: number) {\n this.conditionDepth = value;\n }\n\n public get logical_operator_added(): boolean {\n return this.logicalOperatorAdded;\n }\n\n public set logical_operator_added(value: boolean) {\n this.logicalOperatorAdded = value;\n }\n\n public get prev_was_else(): boolean {\n return this.prevWasElse;\n }\n\n public set prev_was_else(value: boolean) {\n this.prevWasElse = value;\n }\n\n public get forgiven_metrics(): Set<string> {\n return this.forgivenMetrics;\n }\n\n public set forgiven_metrics(value: Set<string>) {\n this.forgivenMetrics = value;\n }\n\n public override get nameInSpace(): string {\n return `${this.name}.`;\n }\n\n public get unqualifiedName(): string {\n return this.name.split(\"::\").at(-1) ?? this.name;\n }\n\n public get unqualified_name(): string {\n return this.unqualifiedName;\n }\n\n public get location(): string {\n return ` ${this.name}@${this.startLine}-${this.endLine}@${this.filename}`;\n }\n\n public get parameterCount(): number {\n return this.parameters.length;\n }\n\n public get parameter_count(): number {\n return this.parameterCount;\n }\n\n public get parameters(): string[] {\n return this.fullParameters.flatMap((parameter) => {\n const match = /([\\p{L}\\p{N}_]+)(\\s=.*)?(\\s:.*)?$/u.exec(parameter);\n return match?.[1] ? [match[1]] : [];\n });\n }\n\n public get length(): number {\n return this.endLine - this.startLine + 1;\n }\n\n public addToFunctionName(appended: string): void {\n this.name += appended;\n this.longName += appended;\n }\n\n public add_to_function_name(appended: string): void {\n this.addToFunctionName(appended);\n }\n\n public addToLongName(appended: string): void {\n const previousCharacter = Array.from(this.longName).at(-1);\n const nextCharacter = Array.from(appended)[0];\n if (/^\\p{L}$/u.test(previousCharacter ?? \"\") && /^\\p{L}$/u.test(nextCharacter ?? \"\")) {\n this.longName += \" \";\n }\n this.longName += appended;\n }\n\n public add_to_long_name(appended: string): void {\n this.addToLongName(appended);\n }\n\n public addParameter(token: string): void {\n this.addToLongName(` ${token}`);\n\n if (this.fullParameters.length === 0) {\n this.fullParameters.push(token);\n } else if (token === \",\") {\n this.fullParameters.push(\"\");\n } else {\n const lastParameter = this.fullParameters.length - 1;\n this.fullParameters[lastParameter] += ` ${token}`;\n }\n }\n\n public add_parameter(token: string): void {\n this.addParameter(token);\n }\n}\n\n/** Lizard's mutable aggregate for a single source file. */\nexport class FileInformation {\n public filename: string;\n public nloc: number;\n public functionList: FunctionInfo[];\n public tokenCount = 0;\n\n public constructor(filename: string, nloc: number, functionList: FunctionInfo[] = []) {\n this.filename = filename;\n this.nloc = nloc;\n this.functionList = functionList.length === 0 ? [] : functionList;\n }\n\n /** Source-name aliases share the camel-case storage for internal extensions. */\n public get function_list(): FunctionInfo[] {\n return this.functionList;\n }\n\n public set function_list(value: FunctionInfo[]) {\n this.functionList = value;\n }\n\n public get token_count(): number {\n return this.tokenCount;\n }\n\n public set token_count(value: number) {\n this.tokenCount = value;\n }\n\n public get averageNloc(): number {\n return this.functionsAverage(\"nloc\");\n }\n\n public get average_nloc(): number {\n return this.averageNloc;\n }\n\n public get averageTokenCount(): number {\n return this.functionsAverage(\"tokenCount\");\n }\n\n public get average_token_count(): number {\n return this.averageTokenCount;\n }\n\n public get averageCyclomaticComplexity(): number {\n return this.functionsAverage(\"cyclomaticComplexity\");\n }\n\n public get average_cyclomatic_complexity(): number {\n return this.averageCyclomaticComplexity;\n }\n\n public get ccn(): number {\n return this.functionList.reduce(\n (total, functionInfo) => total + functionInfo.cyclomaticComplexity,\n 0\n );\n }\n\n public get CCN(): number {\n return this.ccn;\n }\n\n public get nestingDepth(): number {\n return this.functionList.reduce(\n (total, functionInfo) => total + functionInfo.maxNestingDepth,\n 0\n );\n }\n\n public get ND(): number {\n return this.nestingDepth;\n }\n\n public functionsAverage(attribute: string): number {\n if (this.functionList.length === 0) return 0;\n const total = this.functionList.reduce(\n (sum, functionInfo) => sum + readNumericFunctionInfoAttribute(functionInfo, attribute),\n 0\n );\n return total / this.functionList.length;\n }\n\n public functions_average(attribute: string): number {\n return this.functionsAverage(attribute);\n }\n}\n\nfunction readNumericFunctionInfoAttribute(functionInfo: FunctionInfo, attribute: string): number {\n if (!(attribute in functionInfo)) {\n throw new AttributeError(\"FunctionInfo\", attribute);\n }\n\n const value: unknown = Reflect.get(functionInfo, attribute);\n if (typeof value !== \"number\") {\n throw new TypeError(`FunctionInfo attribute '${attribute}' is not numeric.`);\n }\n return value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"analysis-model.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/function-metrics/analyzer/analysis-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAmB,UAAkB,EAAE,aAAqB;QAC1D,KAAK,CAAC,IAAI,UAAU,8BAA8B,aAAa,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,OAAO,OAAO;IAClB,IAAW,WAAW;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;AAE1C,wDAAwD;AACxD,MAAM,OAAO,SAAU,SAAQ,OAAO;IACpB,IAAI,CAAS;IAE7B,YAAmB,IAAY;QAC7B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAoB,WAAW;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,OAAO,YAAa,SAAQ,OAAO;IAChC,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,oBAAoB,CAAS;IAC7B,IAAI,GAAG,CAAC,CAAC;IACT,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,cAAc,GAAa,EAAE,CAAC;IAC9B,eAAe,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC;IACX,aAAa,GAAG,CAAC,CAAC;IAClB,eAAe,GAAG,CAAC,CAAC;IAC3B,wFAAwF;IACjF,WAAW,CAAiC;IACnD,iEAAiE;IAC1D,YAAY,GAAG,CAAC,CAAC;IACjB,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAG,KAAK,CAAC;IACpB,cAAc,GAAG,CAAC,CAAC;IACnB,oBAAoB,GAAG,KAAK,CAAC;IAC7B,WAAW,GAAG,KAAK,CAAC;IACpB,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,YAAmB,IAAY,EAAE,QAAgB,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;QACvE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,IAAW,qBAAqB,CAAC,KAAa;QAC5C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,QAAQ,CAAC,KAAa;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,eAAe,CAAC,KAAe;QACxC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACxC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAW,MAAM,CAAC,KAAa;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,OAAO,CAAC,KAAa;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACxC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAqC;QAC3D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QACpC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,cAAc,CAAC,KAAa;QACrC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,IAAW,sBAAsB,CAAC,KAAc;QAC9C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,aAAa,CAAC,KAAc;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAkB;QAC5C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAoB,WAAW;QAC7B,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;IACzB,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5E,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,oCAAoC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3C,CAAC;IAEM,iBAAiB,CAAC,QAAgB;QACvC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC5B,CAAC;IAEM,oBAAoB,CAAC,QAAgB;QAC1C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEM,aAAa,CAAC,QAAgB;QACnC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC5B,CAAC;IAEM,gBAAgB,CAAC,QAAgB;QACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEM,YAAY,CAAC,KAAa;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,KAAa;QAChC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,eAAe;IACnB,QAAQ,CAAS;IACjB,IAAI,CAAS;IACb,YAAY,CAAiB;IAC7B,UAAU,GAAG,CAAC,CAAC;IAEtB,YAAmB,QAAgB,EAAE,IAAY,EAAE,YAAY,GAAmB,EAAE;QAClF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACpE,CAAC;IAED,gFAAgF;IAChF,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa,CAAC,KAAqB;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC;IAED,IAAW,6BAA6B;QACtC,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC1C,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,oBAAoB,EAClE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,eAAe,EAC7D,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAW,EAAE;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,gBAAgB,CAAC,SAAiB;QACvC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,GAAG,GAAG,gCAAgC,CAAC,YAAY,EAAE,SAAS,CAAC,EACtF,CAAC,CACF,CAAC;QACF,OAAO,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAC1C,CAAC;IAEM,iBAAiB,CAAC,SAAiB;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,gCAAgC,CAAC,YAA0B,EAAE,SAAiB;IACrF,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,2BAA2B,SAAS,mBAAmB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/**\n * Derived from terryyin/lizard 1.24.0.\n * Sources: lizard.py FunctionInfo and FileInformation; lizard_ext/lizardcomplextags.py\n * and lizard_ext/lizardnd.py FunctionInfo lifecycle seams.\n * Upstream revision: 308b1c3efd8c1c69bcc3eb82deeaec64fd3662ec.\n * SPDX-License-Identifier: Apache-2.0 AND MIT\n * Modified: mutable analysis result state isolated from execution and reporting.\n */\n\nexport class AttributeError extends Error {\n public constructor(targetName: string, attributeName: string) {\n super(`'${targetName}' object has no attribute '${attributeName}'`);\n this.name = \"AttributeError\";\n }\n}\n\n/** One lexical nesting level. */\nexport class Nesting {\n public get nameInSpace(): string {\n return \"\";\n }\n\n public get name_in_space(): string {\n return this.nameInSpace;\n }\n}\n\nexport const BARE_NESTING = new Nesting();\n\n/** A named namespace/class scope in a function name. */\nexport class Namespace extends Nesting {\n public readonly name: string;\n\n public constructor(name: string) {\n super();\n this.name = name;\n }\n\n public override get nameInSpace(): string {\n return this.name ? `${this.name}::` : \"\";\n }\n}\n\n/** Lizard's mutable per-function metrics model. */\nexport class FunctionInfo extends Nesting {\n public name: string;\n public filename: string;\n public startLine: number;\n public cyclomaticComplexity: number;\n public nloc = 1;\n public tokenCount = 1;\n public longName: string;\n public endLine: number;\n public fullParameters: string[] = [];\n public topNestingLevel = -1;\n public fanIn = 0;\n public fanOut = 0;\n public generalFanOut = 0;\n public maxNestingDepth = 0;\n /** Source lizardcomplextags.py storage; absent until its processor observes a token. */\n public complexTags: [string, number][] | undefined;\n /** Source lizardnd.py's per-function mutable processor state. */\n public nestingDepth = 0;\n public hiddenBracket = 0;\n public bracketLoop = false;\n public inCondition = false;\n public conditionDepth = 0;\n public logicalOperatorAdded = false;\n public prevWasElse = false;\n public forgivenMetrics = new Set<string>();\n\n public constructor(name: string, filename: string, startLine = 0, ccn = 1) {\n super();\n this.name = name;\n this.filename = filename;\n this.startLine = startLine;\n this.cyclomaticComplexity = ccn;\n this.longName = name;\n this.endLine = startLine;\n }\n\n /**\n * Source-name aliases share the camel-case storage above. They are an\n * analyzer-internal translation seam for extension bodies, not a Product API.\n */\n public get cyclomatic_complexity(): number {\n return this.cyclomaticComplexity;\n }\n\n public set cyclomatic_complexity(value: number) {\n this.cyclomaticComplexity = value;\n }\n\n public get token_count(): number {\n return this.tokenCount;\n }\n\n public set token_count(value: number) {\n this.tokenCount = value;\n }\n\n public get long_name(): string {\n return this.longName;\n }\n\n public set long_name(value: string) {\n this.longName = value;\n }\n\n public get start_line(): number {\n return this.startLine;\n }\n\n public set start_line(value: number) {\n this.startLine = value;\n }\n\n public get end_line(): number {\n return this.endLine;\n }\n\n public set end_line(value: number) {\n this.endLine = value;\n }\n\n public get full_parameters(): string[] {\n return this.fullParameters;\n }\n\n public set full_parameters(value: string[]) {\n this.fullParameters = value;\n }\n\n public get top_nesting_level(): number {\n return this.topNestingLevel;\n }\n\n public set top_nesting_level(value: number) {\n this.topNestingLevel = value;\n }\n\n public get fan_in(): number {\n return this.fanIn;\n }\n\n public set fan_in(value: number) {\n this.fanIn = value;\n }\n\n public get fan_out(): number {\n return this.fanOut;\n }\n\n public set fan_out(value: number) {\n this.fanOut = value;\n }\n\n public get general_fan_out(): number {\n return this.generalFanOut;\n }\n\n public set general_fan_out(value: number) {\n this.generalFanOut = value;\n }\n\n public get max_nesting_depth(): number {\n return this.maxNestingDepth;\n }\n\n public set max_nesting_depth(value: number) {\n this.maxNestingDepth = value;\n }\n\n public get complex_tags(): [string, number][] | undefined {\n return this.complexTags;\n }\n\n public set complex_tags(value: [string, number][] | undefined) {\n this.complexTags = value;\n }\n\n public get nesting_depth(): number {\n return this.nestingDepth;\n }\n\n public set nesting_depth(value: number) {\n this.nestingDepth = value;\n }\n\n public get hidden_bracket(): number {\n return this.hiddenBracket;\n }\n\n public set hidden_bracket(value: number) {\n this.hiddenBracket = value;\n }\n\n public get bracket_loop(): boolean {\n return this.bracketLoop;\n }\n\n public set bracket_loop(value: boolean) {\n this.bracketLoop = value;\n }\n\n public get in_condition(): boolean {\n return this.inCondition;\n }\n\n public set in_condition(value: boolean) {\n this.inCondition = value;\n }\n\n public get condition_depth(): number {\n return this.conditionDepth;\n }\n\n public set condition_depth(value: number) {\n this.conditionDepth = value;\n }\n\n public get logical_operator_added(): boolean {\n return this.logicalOperatorAdded;\n }\n\n public set logical_operator_added(value: boolean) {\n this.logicalOperatorAdded = value;\n }\n\n public get prev_was_else(): boolean {\n return this.prevWasElse;\n }\n\n public set prev_was_else(value: boolean) {\n this.prevWasElse = value;\n }\n\n public get forgiven_metrics(): Set<string> {\n return this.forgivenMetrics;\n }\n\n public set forgiven_metrics(value: Set<string>) {\n this.forgivenMetrics = value;\n }\n\n public override get nameInSpace(): string {\n return `${this.name}.`;\n }\n\n public get unqualifiedName(): string {\n return this.name.split(\"::\").at(-1) ?? this.name;\n }\n\n public get unqualified_name(): string {\n return this.unqualifiedName;\n }\n\n public get location(): string {\n return ` ${this.name}@${this.startLine}-${this.endLine}@${this.filename}`;\n }\n\n public get parameterCount(): number {\n return this.parameters.length;\n }\n\n public get parameter_count(): number {\n return this.parameterCount;\n }\n\n public get parameters(): string[] {\n return this.fullParameters.flatMap((parameter) => {\n const match = /([\\p{L}\\p{N}_]+)(\\s=.*)?(\\s:.*)?$/u.exec(parameter);\n return match?.[1] !== undefined ? [match[1]] : [];\n });\n }\n\n public get length(): number {\n return this.endLine - this.startLine + 1;\n }\n\n public addToFunctionName(appended: string): void {\n this.name += appended;\n this.longName += appended;\n }\n\n public add_to_function_name(appended: string): void {\n this.addToFunctionName(appended);\n }\n\n public addToLongName(appended: string): void {\n const previousCharacter = Array.from(this.longName).at(-1);\n const nextCharacter = Array.from(appended)[0];\n if (/^\\p{L}$/u.test(previousCharacter ?? \"\") && /^\\p{L}$/u.test(nextCharacter ?? \"\")) {\n this.longName += \" \";\n }\n this.longName += appended;\n }\n\n public add_to_long_name(appended: string): void {\n this.addToLongName(appended);\n }\n\n public addParameter(token: string): void {\n this.addToLongName(` ${token}`);\n\n if (this.fullParameters.length === 0) {\n this.fullParameters.push(token);\n } else if (token === \",\") {\n this.fullParameters.push(\"\");\n } else {\n const lastParameter = this.fullParameters.length - 1;\n this.fullParameters[lastParameter] += ` ${token}`;\n }\n }\n\n public add_parameter(token: string): void {\n this.addParameter(token);\n }\n}\n\n/** Lizard's mutable aggregate for a single source file. */\nexport class FileInformation {\n public filename: string;\n public nloc: number;\n public functionList: FunctionInfo[];\n public tokenCount = 0;\n\n public constructor(filename: string, nloc: number, functionList: FunctionInfo[] = []) {\n this.filename = filename;\n this.nloc = nloc;\n this.functionList = functionList.length === 0 ? [] : functionList;\n }\n\n /** Source-name aliases share the camel-case storage for internal extensions. */\n public get function_list(): FunctionInfo[] {\n return this.functionList;\n }\n\n public set function_list(value: FunctionInfo[]) {\n this.functionList = value;\n }\n\n public get token_count(): number {\n return this.tokenCount;\n }\n\n public set token_count(value: number) {\n this.tokenCount = value;\n }\n\n public get averageNloc(): number {\n return this.functionsAverage(\"nloc\");\n }\n\n public get average_nloc(): number {\n return this.averageNloc;\n }\n\n public get averageTokenCount(): number {\n return this.functionsAverage(\"tokenCount\");\n }\n\n public get average_token_count(): number {\n return this.averageTokenCount;\n }\n\n public get averageCyclomaticComplexity(): number {\n return this.functionsAverage(\"cyclomaticComplexity\");\n }\n\n public get average_cyclomatic_complexity(): number {\n return this.averageCyclomaticComplexity;\n }\n\n public get ccn(): number {\n return this.functionList.reduce(\n (total, functionInfo) => total + functionInfo.cyclomaticComplexity,\n 0\n );\n }\n\n public get CCN(): number {\n return this.ccn;\n }\n\n public get nestingDepth(): number {\n return this.functionList.reduce(\n (total, functionInfo) => total + functionInfo.maxNestingDepth,\n 0\n );\n }\n\n public get ND(): number {\n return this.nestingDepth;\n }\n\n public functionsAverage(attribute: string): number {\n if (this.functionList.length === 0) return 0;\n const total = this.functionList.reduce(\n (sum, functionInfo) => sum + readNumericFunctionInfoAttribute(functionInfo, attribute),\n 0\n );\n return total / this.functionList.length;\n }\n\n public functions_average(attribute: string): number {\n return this.functionsAverage(attribute);\n }\n}\n\nfunction readNumericFunctionInfoAttribute(functionInfo: FunctionInfo, attribute: string): number {\n if (!(attribute in functionInfo)) {\n throw new AttributeError(\"FunctionInfo\", attribute);\n }\n\n const value: unknown = Reflect.get(functionInfo, attribute);\n if (typeof value !== \"number\") {\n throw new TypeError(`FunctionInfo attribute '${attribute}' is not numeric.`);\n }\n return value;\n}\n"]}
|
|
@@ -12,9 +12,7 @@ export class LizardExtension {
|
|
|
12
12
|
const conditions = reader.conditions;
|
|
13
13
|
for (const token of tokens) {
|
|
14
14
|
yield token;
|
|
15
|
-
|
|
16
|
-
context.current_function.complex_tags = [];
|
|
17
|
-
}
|
|
15
|
+
context.current_function.complex_tags ??= [];
|
|
18
16
|
if (conditions.has(token)) {
|
|
19
17
|
context.current_function.complex_tags.push([token, context.current_line]);
|
|
20
18
|
}
|
package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lizardcomplextags.mjs","sourceRoot":"","sources":["../../../../../../src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,gFAAgF;AAChF,MAAM,OAAO,eAAe;IACnB,CAAC,QAAQ,CAAC,MAAmB,EAAE,MAAsB;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC;YACZ,
|
|
1
|
+
{"version":3,"file":"lizardcomplextags.mjs","sourceRoot":"","sources":["../../../../../../src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,gFAAgF;AAChF,MAAM,OAAO,eAAe;IACnB,CAAC,QAAQ,CAAC,MAAmB,EAAE,MAAsB;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC;YACZ,OAAO,CAAC,gBAAgB,CAAC,YAAY,KAAK,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Derived from terryyin/lizard 1.24.0.\n * Source: lizard_ext/lizardcomplextags.py.\n * Upstream revision: 308b1c3efd8c1c69bcc3eb82deeaec64fd3662ec.\n * SPDX-License-Identifier: MIT\n * Modified: mechanically translated to the Check-private TypeScript port.\n */\n\nimport type { AnalyzerReader, TokenStream } from \"../contracts.ts\";\nimport type { LizardExtension as LizardExtensionProtocol } from \"./protocol.ts\";\n\n/** Records every source reader condition token with its current source line. */\nexport class LizardExtension implements LizardExtensionProtocol {\n public *__call__(tokens: TokenStream, reader: AnalyzerReader): Generator<string> {\n const context = reader.context;\n const conditions = reader.conditions;\n for (const token of tokens) {\n yield token;\n context.current_function.complex_tags ??= [];\n if (conditions.has(token)) {\n context.current_function.complex_tags.push([token, context.current_line]);\n }\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.mjs","sourceRoot":"","sources":["../../../../../../src/package-checks/function-metrics/analyzer/extensions/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Derived from terryyin/lizard 1.24.0.\n * Sources: lizard_ext/extension_base.py and lizard_ext/lizard*.py extension\n * contracts.\n * Upstream revision: 308b1c3efd8c1c69bcc3eb82deeaec64fd3662ec.\n * SPDX-License-Identifier: MIT\n * Modified: translated to the analyzer-internal extension protocol; this is\n * not exported through the product API as a plugin surface.\n */\n\nimport type { AnalyzerReader, TokenStream } from \"../contracts.ts\";\nimport type { FileInformation } from \"../analysis-model.ts\";\n\n/** Metadata an extension contributes to FunctionInfo/report schemas. */\nexport interface FunctionInfoDefinition {\n readonly caption?: string;\n readonly average_caption?: string;\n}\n\n/** The source-aligned FUNCTION_INFO mapping owned by one extension. */\nexport type FunctionInfoDefinitions = Readonly<Record<string, FunctionInfoDefinition>>;\n\n/** Python `argparse.add_argument` keyword options used by translated bodies. */\nexport interface ExtensionArgumentKeywordOptions {\n readonly default?: number;\n readonly dest?: string;\n readonly help?: string;\n /** The source `type=int` conversion contract. */\n readonly type?: \"int\";\n}\n\n/** The minimal internal parser seam consumed by source set_args hooks. */\nexport interface ExtensionArgumentRegistrar {\n add_argument(...arguments_: readonly (string | ExtensionArgumentKeywordOptions)[]): void;\n}\n\n/** A source-aligned extension token processor. */\nexport type ExtensionCall = (tokens: TokenStream, reader: AnalyzerReader) => TokenStream;\n\n/** A source-aligned extension cross-file processor. */\nexport type ExtensionCrossFileProcess = {\n bivarianceHack(\n fileInfos: Iterable<FileInformation> | undefined\n ): Iterable<FileInformation> | undefined;\n}[\"bivarianceHack\"];\n\n/** Preserve the distinction between an absent hook and a present hook returning undefined. */\nexport type ExtensionCrossFileProcessOutcome =\n | { readonly hookPresent: false }\n | {\n readonly hookPresent: true;\n readonly result: Iterable<FileInformation> | undefined;\n };\n\n/** A source-aligned extension result printer. */\nexport type ExtensionPrintResult = () => void;\n\n/** A source-aligned extension argument registrar. */\nexport type ExtensionSetArgs = (parser: ExtensionArgumentRegistrar) => void;\n\n/**\n * The internal protocol shared by translated Lizard extension bodies. Hooks\n * are optional here because Python permits class-level static hooks that are\n * resolved from an instantiated extension.\n */\nexport interface LizardExtension {\n __call__?: ExtensionCall;\n readonly ordering_index?: number;\n readonly FUNCTION_INFO?: FunctionInfoDefinitions;\n readonly silent_all_others?: boolean;\n cross_file_process?: ExtensionCrossFileProcess;\n print_result?: ExtensionPrintResult;\n set_args?: ExtensionSetArgs;\n}\n\n/** Python resolves extension class attributes and static methods through instances. */\nexport interface LizardExtensionClassMetadata {\n readonly ordering_index?: number;\n readonly FUNCTION_INFO?: FunctionInfoDefinitions;\n readonly silent_all_others?: boolean;\n}\n\n/** A directly registered class is an opaque descriptor, not a constructor to invoke at load time. */\nexport type LizardExtensionConstructor = LizardExtensionClassMetadata & {\n readonly prototype: LizardExtension;\n};\n\n/** One non-string value retained verbatim by source-aligned registration. */\nexport type RegisteredLizardExtension = LizardExtension | LizardExtensionConstructor;\n\n/** Any processor object on which upstream performs hasattr-style lifecycle lookup. */\nexport type LizardExtensionDescriptor = object;\n\n/** Accepted internal extension registration inputs. */\nexport type ExtensionInput = string | RegisteredLizardExtension;\n\n/** Ordinary hook names resolved through Python's instance attribute lookup. */\nexport type ExtensionHookName = \"cross_file_process\" | \"print_result\" | \"set_args\";\n\n/** Resolve metadata with the same descriptor precedence used by extension hooks. */\nexport function extensionMetadata(\n extension: LizardExtensionDescriptor\n): LizardExtensionClassMetadata {\n return {\n get ordering_index(): number | undefined {\n const attribute = resolveExtensionAttribute(extension, \"ordering_index\");\n return attribute === undefined ? undefined : readOrderingIndex(attribute.value);\n },\n get FUNCTION_INFO(): FunctionInfoDefinitions | undefined {\n const attribute = resolveExtensionAttribute(extension, \"FUNCTION_INFO\");\n return attribute === undefined ? undefined : readFunctionInfoDefinitions(attribute.value);\n },\n get silent_all_others(): boolean | undefined {\n const attribute = resolveExtensionAttribute(extension, \"silent_all_others\");\n // Upstream tests presence with hasattr; the stored value is not interpreted.\n return attribute === undefined ? undefined : true;\n }\n };\n}\n\n/** Resolve a cross-file hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"cross_file_process\"\n): ExtensionCrossFileProcess | undefined;\n/** Resolve a result hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"print_result\"\n): ExtensionPrintResult | undefined;\n/** Resolve an argument hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"set_args\"\n): ExtensionSetArgs | undefined;\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: ExtensionHookName\n): ((...arguments_: never[]) => unknown) | undefined {\n const hook = resolveExtensionAttribute(extension, hookName);\n if (hook === undefined) return undefined;\n if (!isUnknownFunction(hook.value)) {\n throw new TypeError(`Lizard extension ${hookName} hook is not callable.`);\n }\n return hook.value.bind(hook.receiver);\n}\n\n/** Resolve Python's special __call__ lookup from the extension type, ignoring its own dictionary. */\nexport function resolveExtensionCall(\n extension: LizardExtensionDescriptor\n): ExtensionCall | undefined {\n const call = resolveExtensionSpecialMethod(extension, \"__call__\");\n if (call === undefined) return undefined;\n if (!isExtensionCall(call.value)) {\n throw new TypeError(\"Lizard extension __call__ hook is not callable.\");\n }\n return call.value.bind(call.receiver);\n}\n\n/** Invoke a token hook and reject an extension that supplies neither source hook form. */\nexport function invokeExtensionCall(\n extension: LizardExtensionDescriptor,\n tokens: TokenStream,\n reader: AnalyzerReader\n): TokenStream {\n const call = resolveExtensionCall(extension);\n if (call === undefined)\n throw new TypeError(\"Lizard extension is missing a callable __call__ hook.\");\n return call(tokens, reader);\n}\n\n/** Invoke an optional cross-file hook with source instance/static resolution. */\nexport function invokeExtensionCrossFileProcess(\n extension: LizardExtensionDescriptor,\n fileInfos: Iterable<FileInformation> | undefined\n): Iterable<FileInformation> | undefined {\n const outcome = invokeExtensionCrossFileProcessOutcome(extension, fileInfos);\n return outcome.hookPresent ? outcome.result : undefined;\n}\n\n/** Invoke a cross-file hook without collapsing a present undefined result into absence. */\nexport function invokeExtensionCrossFileProcessOutcome(\n extension: LizardExtensionDescriptor,\n fileInfos: Iterable<FileInformation> | undefined\n): ExtensionCrossFileProcessOutcome {\n const crossFileProcess = resolveExtensionHook(extension, \"cross_file_process\");\n if (crossFileProcess === undefined) return { hookPresent: false };\n return { hookPresent: true, result: crossFileProcess(fileInfos) };\n}\n\n/** Invoke an optional result hook with source instance/static resolution. */\nexport function invokeExtensionPrintResult(extension: LizardExtensionDescriptor): void {\n resolveExtensionHook(extension, \"print_result\")?.();\n}\n\n/** Invoke an optional argument hook with source instance/static resolution. */\nexport function invokeExtensionSetArgs(\n extension: LizardExtensionDescriptor,\n parser: ExtensionArgumentRegistrar\n): void {\n resolveExtensionHook(extension, \"set_args\")?.(parser);\n}\n\ninterface ResolvedExtensionAttribute {\n readonly receiver: object;\n readonly value: unknown;\n}\n\n/**\n * Model Python's per-class MRO precedence across TypeScript's split prototype\n * and static namespaces. An own instance member wins at its class level, while\n * a subclass static member still shadows an inherited instance member.\n */\nfunction resolveExtensionAttribute(\n extension: LizardExtensionDescriptor,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n if (typeof extension === \"function\") {\n return resolveClassAttribute(extension, attributeName);\n }\n\n const ownAttribute = readOwnAttribute(extension, extension, attributeName);\n if (ownAttribute !== undefined) return ownAttribute;\n\n return resolveInstanceTypeAttribute(extension, attributeName);\n}\n\nfunction resolveExtensionSpecialMethod(\n extension: LizardExtensionDescriptor,\n methodName: \"__call__\"\n): ResolvedExtensionAttribute | undefined {\n if (typeof extension === \"function\") {\n return resolveClassAttribute(extension, methodName);\n }\n return resolveInstanceTypeAttribute(extension, methodName);\n}\n\nfunction resolveInstanceTypeAttribute(\n extension: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n let prototype = readPrototype(extension);\n while (prototype !== null && prototype !== Object.prototype) {\n const instanceAttribute = readOwnAttribute(prototype, extension, attributeName);\n if (instanceAttribute !== undefined) return instanceAttribute;\n\n const constructorDescriptor = Object.getOwnPropertyDescriptor(prototype, \"constructor\");\n const extensionClass: unknown = constructorDescriptor?.value;\n if (isRecord(extensionClass)) {\n const staticAttribute = readOwnAttribute(extensionClass, extensionClass, attributeName);\n if (staticAttribute !== undefined) return staticAttribute;\n }\n\n prototype = readPrototype(prototype);\n }\n return undefined;\n}\n\nfunction resolveClassAttribute(\n extensionClass: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n let currentClass: object | null = extensionClass;\n while (currentClass !== null && currentClass !== Function.prototype) {\n const attribute = readOwnAttribute(currentClass, currentClass, attributeName);\n if (attribute !== undefined) return attribute;\n currentClass = readPrototype(currentClass);\n }\n return undefined;\n}\n\nfunction readOwnAttribute(\n owner: object,\n receiver: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n if (Object.getOwnPropertyDescriptor(owner, attributeName) === undefined) return undefined;\n const value: unknown = Reflect.get(owner, attributeName, receiver);\n return {\n receiver,\n value\n };\n}\n\nfunction readPrototype(value: object): object | null {\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype === null || isRecord(prototype)) return prototype;\n throw new TypeError(\"Lizard extension prototype must be an object or null.\");\n}\n\nfunction readOrderingIndex(value: unknown): number {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Lizard extension ordering_index metadata must be a number.\");\n }\n return value;\n}\n\nfunction readFunctionInfoDefinitions(value: unknown): FunctionInfoDefinitions {\n if (!isObjectRecord(value)) {\n throw new TypeError(\"Lizard extension FUNCTION_INFO metadata must be a record.\");\n }\n const definitions: Record<string, FunctionInfoDefinition> = {};\n for (const [name, definition] of Object.entries(value)) {\n if (!isObjectRecord(definition)) {\n throw new TypeError(`Lizard extension FUNCTION_INFO['${name}'] must be a record.`);\n }\n const caption = readOptionalCaption(definition.caption, name, \"caption\");\n const averageCaption = readOptionalCaption(definition.average_caption, name, \"average_caption\");\n definitions[name] = {\n ...(caption === undefined ? {} : { caption }),\n ...(averageCaption === undefined ? {} : { average_caption: averageCaption })\n };\n }\n return definitions;\n}\n\nfunction readOptionalCaption(\n value: unknown,\n definitionName: string,\n captionName: \"average_caption\" | \"caption\"\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n throw new TypeError(\n `Lizard extension FUNCTION_INFO['${definitionName}'].${captionName} must be a string.`\n );\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isUnknownFunction(value: unknown): value is (...arguments_: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction isExtensionCall(value: unknown): value is ExtensionCall {\n return typeof value === \"function\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"protocol.mjs","sourceRoot":"","sources":["../../../../../../src/package-checks/function-metrics/analyzer/extensions/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Derived from terryyin/lizard 1.24.0.\n * Sources: lizard_ext/extension_base.py and lizard_ext/lizard*.py extension\n * contracts.\n * Upstream revision: 308b1c3efd8c1c69bcc3eb82deeaec64fd3662ec.\n * SPDX-License-Identifier: MIT\n * Modified: translated to the analyzer-internal extension protocol; this is\n * not exported through the product API as a plugin surface.\n */\n\nimport type { AnalyzerReader, TokenStream } from \"../contracts.ts\";\nimport type { FileInformation } from \"../analysis-model.ts\";\n\n/** Metadata an extension contributes to FunctionInfo/report schemas. */\nexport interface FunctionInfoDefinition {\n readonly caption?: string;\n readonly average_caption?: string;\n}\n\n/** The source-aligned FUNCTION_INFO mapping owned by one extension. */\nexport type FunctionInfoDefinitions = Readonly<Record<string, FunctionInfoDefinition>>;\n\n/** Python `argparse.add_argument` keyword options used by translated bodies. */\nexport interface ExtensionArgumentKeywordOptions {\n readonly default?: number;\n readonly dest?: string;\n readonly help?: string;\n /** The source `type=int` conversion contract. */\n readonly type?: \"int\";\n}\n\n/** The minimal internal parser seam consumed by source set_args hooks. */\nexport interface ExtensionArgumentRegistrar {\n add_argument(...arguments_: readonly (string | ExtensionArgumentKeywordOptions)[]): void;\n}\n\n/** A source-aligned extension token processor. */\nexport type ExtensionCall = (tokens: TokenStream, reader: AnalyzerReader) => TokenStream;\n\n/** A source-aligned extension cross-file processor. */\nexport type ExtensionCrossFileProcess = {\n bivarianceHack(\n fileInfos: Iterable<FileInformation> | undefined\n ): Iterable<FileInformation> | undefined;\n}[\"bivarianceHack\"];\n\n/** Preserve the distinction between an absent hook and a present hook returning undefined. */\nexport type ExtensionCrossFileProcessOutcome =\n | { readonly hookPresent: false }\n | {\n readonly hookPresent: true;\n readonly result: Iterable<FileInformation> | undefined;\n };\n\n/** A source-aligned extension result printer. */\nexport type ExtensionPrintResult = () => void;\n\n/** A source-aligned extension argument registrar. */\nexport type ExtensionSetArgs = (parser: ExtensionArgumentRegistrar) => void;\n\n/**\n * The internal protocol shared by translated Lizard extension bodies. Hooks\n * are optional here because Python permits class-level static hooks that are\n * resolved from an instantiated extension.\n */\nexport interface LizardExtension {\n __call__?: ExtensionCall;\n readonly ordering_index?: number;\n readonly FUNCTION_INFO?: FunctionInfoDefinitions;\n readonly silent_all_others?: boolean;\n cross_file_process?: ExtensionCrossFileProcess;\n print_result?: ExtensionPrintResult;\n set_args?: ExtensionSetArgs;\n}\n\n/** Python resolves extension class attributes and static methods through instances. */\nexport interface LizardExtensionClassMetadata {\n readonly ordering_index?: number | undefined;\n readonly FUNCTION_INFO?: FunctionInfoDefinitions | undefined;\n readonly silent_all_others?: boolean | undefined;\n}\n\n/** A directly registered class is an opaque descriptor, not a constructor to invoke at load time. */\nexport type LizardExtensionConstructor = LizardExtensionClassMetadata & {\n readonly prototype: LizardExtension;\n};\n\n/** One non-string value retained verbatim by source-aligned registration. */\nexport type RegisteredLizardExtension = LizardExtension | LizardExtensionConstructor;\n\n/** Any processor object on which upstream performs hasattr-style lifecycle lookup. */\nexport type LizardExtensionDescriptor = object;\n\n/** Accepted internal extension registration inputs. */\nexport type ExtensionInput = string | RegisteredLizardExtension;\n\n/** Ordinary hook names resolved through Python's instance attribute lookup. */\nexport type ExtensionHookName = \"cross_file_process\" | \"print_result\" | \"set_args\";\n\n/** Resolve metadata with the same descriptor precedence used by extension hooks. */\nexport function extensionMetadata(\n extension: LizardExtensionDescriptor\n): LizardExtensionClassMetadata {\n return {\n get ordering_index(): number | undefined {\n const attribute = resolveExtensionAttribute(extension, \"ordering_index\");\n return attribute === undefined ? undefined : readOrderingIndex(attribute.value);\n },\n get FUNCTION_INFO(): FunctionInfoDefinitions | undefined {\n const attribute = resolveExtensionAttribute(extension, \"FUNCTION_INFO\");\n return attribute === undefined ? undefined : readFunctionInfoDefinitions(attribute.value);\n },\n get silent_all_others(): boolean | undefined {\n const attribute = resolveExtensionAttribute(extension, \"silent_all_others\");\n // Upstream tests presence with hasattr; the stored value is not interpreted.\n return attribute === undefined ? undefined : true;\n }\n };\n}\n\n/** Resolve a cross-file hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"cross_file_process\"\n): ExtensionCrossFileProcess | undefined;\n/** Resolve a result hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"print_result\"\n): ExtensionPrintResult | undefined;\n/** Resolve an argument hook through ordinary Python instance attribute lookup. */\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: \"set_args\"\n): ExtensionSetArgs | undefined;\nexport function resolveExtensionHook(\n extension: LizardExtensionDescriptor,\n hookName: ExtensionHookName\n): ((...arguments_: never[]) => unknown) | undefined {\n const hook = resolveExtensionAttribute(extension, hookName);\n if (hook === undefined) return undefined;\n if (!isUnknownFunction(hook.value)) {\n throw new TypeError(`Lizard extension ${hookName} hook is not callable.`);\n }\n return hook.value.bind(hook.receiver);\n}\n\n/** Resolve Python's special __call__ lookup from the extension type, ignoring its own dictionary. */\nexport function resolveExtensionCall(\n extension: LizardExtensionDescriptor\n): ExtensionCall | undefined {\n const call = resolveExtensionSpecialMethod(extension, \"__call__\");\n if (call === undefined) return undefined;\n if (!isExtensionCall(call.value)) {\n throw new TypeError(\"Lizard extension __call__ hook is not callable.\");\n }\n return call.value.bind(call.receiver);\n}\n\n/** Invoke a token hook and reject an extension that supplies neither source hook form. */\nexport function invokeExtensionCall(\n extension: LizardExtensionDescriptor,\n tokens: TokenStream,\n reader: AnalyzerReader\n): TokenStream {\n const call = resolveExtensionCall(extension);\n if (call === undefined)\n throw new TypeError(\"Lizard extension is missing a callable __call__ hook.\");\n return call(tokens, reader);\n}\n\n/** Invoke an optional cross-file hook with source instance/static resolution. */\nexport function invokeExtensionCrossFileProcess(\n extension: LizardExtensionDescriptor,\n fileInfos: Iterable<FileInformation> | undefined\n): Iterable<FileInformation> | undefined {\n const outcome = invokeExtensionCrossFileProcessOutcome(extension, fileInfos);\n return outcome.hookPresent ? outcome.result : undefined;\n}\n\n/** Invoke a cross-file hook without collapsing a present undefined result into absence. */\nexport function invokeExtensionCrossFileProcessOutcome(\n extension: LizardExtensionDescriptor,\n fileInfos: Iterable<FileInformation> | undefined\n): ExtensionCrossFileProcessOutcome {\n const crossFileProcess = resolveExtensionHook(extension, \"cross_file_process\");\n if (crossFileProcess === undefined) return { hookPresent: false };\n return { hookPresent: true, result: crossFileProcess(fileInfos) };\n}\n\n/** Invoke an optional result hook with source instance/static resolution. */\nexport function invokeExtensionPrintResult(extension: LizardExtensionDescriptor): void {\n resolveExtensionHook(extension, \"print_result\")?.();\n}\n\n/** Invoke an optional argument hook with source instance/static resolution. */\nexport function invokeExtensionSetArgs(\n extension: LizardExtensionDescriptor,\n parser: ExtensionArgumentRegistrar\n): void {\n resolveExtensionHook(extension, \"set_args\")?.(parser);\n}\n\ninterface ResolvedExtensionAttribute {\n readonly receiver: object;\n readonly value: unknown;\n}\n\n/**\n * Model Python's per-class MRO precedence across TypeScript's split prototype\n * and static namespaces. An own instance member wins at its class level, while\n * a subclass static member still shadows an inherited instance member.\n */\nfunction resolveExtensionAttribute(\n extension: LizardExtensionDescriptor,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n if (typeof extension === \"function\") {\n return resolveClassAttribute(extension, attributeName);\n }\n\n const ownAttribute = readOwnAttribute(extension, extension, attributeName);\n if (ownAttribute !== undefined) return ownAttribute;\n\n return resolveInstanceTypeAttribute(extension, attributeName);\n}\n\nfunction resolveExtensionSpecialMethod(\n extension: LizardExtensionDescriptor,\n methodName: \"__call__\"\n): ResolvedExtensionAttribute | undefined {\n if (typeof extension === \"function\") {\n return resolveClassAttribute(extension, methodName);\n }\n return resolveInstanceTypeAttribute(extension, methodName);\n}\n\nfunction resolveInstanceTypeAttribute(\n extension: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n let prototype = readPrototype(extension);\n while (prototype !== null && prototype !== Object.prototype) {\n const instanceAttribute = readOwnAttribute(prototype, extension, attributeName);\n if (instanceAttribute !== undefined) return instanceAttribute;\n\n const constructorDescriptor = Object.getOwnPropertyDescriptor(prototype, \"constructor\");\n const extensionClass: unknown = constructorDescriptor?.value;\n if (isRecord(extensionClass)) {\n const staticAttribute = readOwnAttribute(extensionClass, extensionClass, attributeName);\n if (staticAttribute !== undefined) return staticAttribute;\n }\n\n prototype = readPrototype(prototype);\n }\n return undefined;\n}\n\nfunction resolveClassAttribute(\n extensionClass: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n let currentClass: object | null = extensionClass;\n while (currentClass !== null && currentClass !== Function.prototype) {\n const attribute = readOwnAttribute(currentClass, currentClass, attributeName);\n if (attribute !== undefined) return attribute;\n currentClass = readPrototype(currentClass);\n }\n return undefined;\n}\n\nfunction readOwnAttribute(\n owner: object,\n receiver: object,\n attributeName: string\n): ResolvedExtensionAttribute | undefined {\n if (Object.getOwnPropertyDescriptor(owner, attributeName) === undefined) return undefined;\n const value: unknown = Reflect.get(owner, attributeName, receiver);\n return {\n receiver,\n value\n };\n}\n\nfunction readPrototype(value: object): object | null {\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype === null || isRecord(prototype)) return prototype;\n throw new TypeError(\"Lizard extension prototype must be an object or null.\");\n}\n\nfunction readOrderingIndex(value: unknown): number {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Lizard extension ordering_index metadata must be a number.\");\n }\n return value;\n}\n\nfunction readFunctionInfoDefinitions(value: unknown): FunctionInfoDefinitions {\n if (!isObjectRecord(value)) {\n throw new TypeError(\"Lizard extension FUNCTION_INFO metadata must be a record.\");\n }\n const definitions: Record<string, FunctionInfoDefinition> = {};\n for (const [name, definition] of Object.entries(value)) {\n if (!isObjectRecord(definition)) {\n throw new TypeError(`Lizard extension FUNCTION_INFO['${name}'] must be a record.`);\n }\n const caption = readOptionalCaption(definition.caption, name, \"caption\");\n const averageCaption = readOptionalCaption(definition.average_caption, name, \"average_caption\");\n definitions[name] = {\n ...(caption === undefined ? {} : { caption }),\n ...(averageCaption === undefined ? {} : { average_caption: averageCaption })\n };\n }\n return definitions;\n}\n\nfunction readOptionalCaption(\n value: unknown,\n definitionName: string,\n captionName: \"average_caption\" | \"caption\"\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n throw new TypeError(\n `Lizard extension FUNCTION_INFO['${definitionName}'].${captionName} must be a string.`\n );\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isUnknownFunction(value: unknown): value is (...arguments_: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction isExtensionCall(value: unknown): value is ExtensionCall {\n return typeof value === \"function\";\n}\n"]}
|
|
@@ -44,11 +44,12 @@ export function* commentCounter(tokens, reader) {
|
|
|
44
44
|
}
|
|
45
45
|
else if (strippedComment.startsWith("#lizard forgives(")) {
|
|
46
46
|
const metricMatch = /#lizard forgives?\(([^)]*)\)/u.exec(strippedComment);
|
|
47
|
-
if (metricMatch?.[1]) {
|
|
47
|
+
if (metricMatch?.[1] !== undefined) {
|
|
48
48
|
for (const metric of metricMatch[1].split(",")) {
|
|
49
49
|
const trimmedMetric = stripPythonWhitespace(metric);
|
|
50
|
-
if (trimmedMetric)
|
|
50
|
+
if (trimmedMetric.length > 0) {
|
|
51
51
|
reader.context.currentFunction.forgivenMetrics.add(trimmedMetric);
|
|
52
|
+
}
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
}
|