@intentius/chant 0.101.0 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/checks.d.ts.map +1 -1
- package/dist/attrref.d.ts.map +1 -1
- package/dist/audit/core.d.ts +2 -0
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/nginx.d.ts.map +1 -1
- package/dist/audit/prior-art.d.ts +48 -0
- package/dist/audit/prior-art.d.ts.map +1 -1
- package/dist/behaviour-kinds.d.ts.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/change-set.d.ts +232 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/cli/commands/audit.d.ts +7 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/carve-emit.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.d.ts +16 -0
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/import.d.ts +8 -0
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +9 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
- package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.d.ts +11 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -0
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.d.ts +33 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +16 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/pr.d.ts +31 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -0
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/lsp/server.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/tools/build.d.ts.map +1 -1
- package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
- package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
- package/dist/cli/mcp/tools/import.d.ts.map +1 -1
- package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
- package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
- package/dist/cli/mcp/tools/search.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.d.ts +4 -3
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +74 -3
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/codegen/naming.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.d.ts +67 -3
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/registry.d.ts.map +1 -1
- package/dist/components/auto-release.d.ts +16 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability.d.ts +53 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/changed-files.d.ts +31 -0
- package/dist/components/changed-files.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +9 -1
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +24 -0
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/driver.d.ts +13 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out-output.d.ts +6 -0
- package/dist/components/fan-out-output.d.ts.map +1 -1
- package/dist/components/fan-out-record.d.ts +41 -0
- package/dist/components/fan-out-record.d.ts.map +1 -0
- package/dist/components/fan-out-run.d.ts +65 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-support.d.ts +2 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out.d.ts +6 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/gated-wave-pipeline.d.ts +50 -0
- package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/layers.d.ts +25 -0
- package/dist/components/layers.d.ts.map +1 -0
- package/dist/components/pr-pipeline.d.ts +61 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -0
- package/dist/components/pr-run.d.ts +119 -0
- package/dist/components/pr-run.d.ts.map +1 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/verbs/process-runner.d.ts.map +1 -1
- package/dist/components/verbs/r2-sync.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
- package/dist/components/verbs/shell.d.ts.map +1 -1
- package/dist/components/verbs/sign.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts.map +1 -1
- package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
- package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
- package/dist/components/verbs/wrangler.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +49 -0
- package/dist/components/wave-plan.d.ts.map +1 -0
- package/dist/composite.d.ts.map +1 -1
- package/dist/config.d.ts +19 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/declarable.d.ts +16 -0
- package/dist/declarable.d.ts.map +1 -1
- package/dist/discovery/cache.d.ts.map +1 -1
- package/dist/discovery/fold-import.d.ts +15 -5
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +16 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
- package/dist/discovery/specifier-resolve.d.ts +37 -0
- package/dist/discovery/specifier-resolve.d.ts.map +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/fold/fold.d.ts +3 -1
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/gated-waves.d.ts +147 -0
- package/dist/gated-waves.d.ts.map +1 -0
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-layout.d.ts.map +1 -1
- package/dist/import/base-parser.d.ts.map +1 -1
- package/dist/import/embedded.d.ts +7 -0
- package/dist/import/embedded.d.ts.map +1 -1
- package/dist/import/parser-options.d.ts +14 -0
- package/dist/import/parser-options.d.ts.map +1 -0
- package/dist/import/parser.d.ts +17 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts.map +1 -1
- package/dist/lexicon-output.d.ts.map +1 -1
- package/dist/lexicon-schema.d.ts +3 -3
- package/dist/lexicon.d.ts +103 -3
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/assert-live.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +22 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +46 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/member-ledger.d.ts.map +1 -1
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/scenario.d.ts.map +1 -1
- package/dist/lifecycle/status.d.ts.map +1 -1
- package/dist/lifecycle/work-lease.d.ts +61 -2
- package/dist/lifecycle/work-lease.d.ts.map +1 -1
- package/dist/lint/config.d.ts +8 -8
- package/dist/lint/engine.d.ts +6 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +18 -0
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +137 -11
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/apply.d.ts +79 -9
- package/dist/op/activities/apply.d.ts.map +1 -1
- package/dist/op/activities/change-set.d.ts +62 -0
- package/dist/op/activities/change-set.d.ts.map +1 -0
- package/dist/op/activities/decide.d.ts +2 -0
- package/dist/op/activities/decide.d.ts.map +1 -1
- package/dist/op/activities/factory.d.ts +137 -0
- package/dist/op/activities/factory.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +5 -1
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
- package/dist/op/activity-contract.d.ts +1 -1
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts.map +1 -1
- package/dist/op/activity-profiles.d.ts.map +1 -1
- package/dist/op/builders.d.ts +11 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +12 -5
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
- package/dist/op/decide-backend.d.ts +5 -1
- package/dist/op/decide-backend.d.ts.map +1 -1
- package/dist/op/decide-read-inputs.d.ts +4 -2
- package/dist/op/decide-read-inputs.d.ts.map +1 -1
- package/dist/op/emulator-lifecycle.d.ts +21 -2
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/factory.d.ts +83 -0
- package/dist/op/factory.d.ts.map +1 -0
- package/dist/op/gate-approval.d.ts +5 -1
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-wait.d.ts.map +1 -1
- package/dist/op/gate.d.ts +19 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/index.d.ts +6 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +6 -0
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +2 -0
- package/dist/op/op-ir.d.ts.map +1 -1
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/run-context.d.ts +39 -0
- package/dist/op/run-context.d.ts.map +1 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/source-archive.d.ts.map +1 -1
- package/dist/op/steward-beside.d.ts.map +1 -1
- package/dist/op/steward-points.d.ts.map +1 -1
- package/dist/op/steward.d.ts.map +1 -1
- package/dist/op/types.d.ts +16 -3
- package/dist/op/types.d.ts.map +1 -1
- package/dist/op/work-lease-run.d.ts +24 -4
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/plan-summary.d.ts +207 -0
- package/dist/plan-summary.d.ts.map +1 -0
- package/dist/pr-forge.d.ts +105 -0
- package/dist/pr-forge.d.ts.map +1 -0
- package/dist/pr-loop.d.ts +178 -0
- package/dist/pr-loop.d.ts.map +1 -0
- package/dist/project-root.d.ts.map +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/pseudo-parameter.d.ts.map +1 -1
- package/dist/reconcile.d.ts.map +1 -1
- package/dist/secret-materialization.d.ts.map +1 -1
- package/dist/telemetry-attribution.d.ts +31 -0
- package/dist/telemetry-attribution.d.ts.map +1 -1
- package/dist/terraform/emit-source.d.ts.map +1 -1
- package/dist/terraform/hcl2json.d.ts +45 -0
- package/dist/terraform/hcl2json.d.ts.map +1 -0
- package/dist/terraform/parse.d.ts +4 -40
- package/dist/terraform/parse.d.ts.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
- package/dist/workspace/agent-cli.d.ts +5 -0
- package/dist/workspace/agent-cli.d.ts.map +1 -1
- package/dist/workspace/box-cli.d.ts +12 -0
- package/dist/workspace/box-cli.d.ts.map +1 -0
- package/dist/workspace/box-factory.d.ts +97 -0
- package/dist/workspace/box-factory.d.ts.map +1 -0
- package/dist/workspace/box-listing.d.ts +85 -0
- package/dist/workspace/box-listing.d.ts.map +1 -0
- package/dist/workspace/box-publish.d.ts +147 -0
- package/dist/workspace/box-publish.d.ts.map +1 -0
- package/dist/workspace/broker-protocol.d.ts +190 -0
- package/dist/workspace/broker-protocol.d.ts.map +1 -0
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
- package/dist/workspace/checks/boxes.d.ts.map +1 -1
- package/dist/workspace/checks.d.ts +5 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/compose-graph.d.ts +10 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +2 -2
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
- package/dist/workspace/conformance/broker.d.ts +202 -0
- package/dist/workspace/conformance/broker.d.ts.map +1 -0
- package/dist/workspace/conformance/index.d.ts +68 -6
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/vitest.d.ts +19 -3
- package/dist/workspace/conformance/vitest.d.ts.map +1 -1
- package/dist/workspace/conformance/writer.d.ts +462 -0
- package/dist/workspace/conformance/writer.d.ts.map +1 -0
- package/dist/workspace/decide.d.ts +126 -12
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/decision-points.schema.json +11 -4
- package/dist/workspace/declaration.d.ts +156 -4
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +383 -5
- package/dist/workspace/environments.d.ts +36 -10
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/factory-rules.d.ts +180 -0
- package/dist/workspace/factory-rules.d.ts.map +1 -0
- package/dist/workspace/generated-files.d.ts.map +1 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cli.d.ts +2 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/identity.d.ts +111 -0
- package/dist/workspace/identity.d.ts.map +1 -0
- package/dist/workspace/init.d.ts +21 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/intent-cli.d.ts +7 -4
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-record.d.ts +36 -2
- package/dist/workspace/intent-record.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +249 -8
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/json-edit.d.ts +24 -0
- package/dist/workspace/json-edit.d.ts.map +1 -0
- package/dist/workspace/jsonc.d.ts +11 -0
- package/dist/workspace/jsonc.d.ts.map +1 -1
- package/dist/workspace/kinds.d.ts +66 -4
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/lexicon-symbols.d.ts +29 -0
- package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
- package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
- package/dist/workspace/lineage-lock.d.ts +2 -2
- package/dist/workspace/lineage-lock.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.d.ts +31 -2
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/point-answer.schema.json +42 -2
- package/dist/workspace/points-cli.d.ts +10 -3
- package/dist/workspace/points-cli.d.ts.map +1 -1
- package/dist/workspace/points.d.ts +66 -5
- package/dist/workspace/points.d.ts.map +1 -1
- package/dist/workspace/principal-classes.d.ts +114 -0
- package/dist/workspace/principal-classes.d.ts.map +1 -0
- package/dist/workspace/reason-codes.d.ts +53 -4
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/record-assets.d.ts.map +1 -1
- package/dist/workspace/record-sessions.d.ts +5 -7
- package/dist/workspace/record-sessions.d.ts.map +1 -1
- package/dist/workspace/records-checkout.d.ts +54 -0
- package/dist/workspace/records-checkout.d.ts.map +1 -0
- package/dist/workspace/records-cli.d.ts +34 -1
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-close.d.ts +7 -3
- package/dist/workspace/records-close.d.ts.map +1 -1
- package/dist/workspace/records-since.d.ts.map +1 -1
- package/dist/workspace/records-write.d.ts +68 -7
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records.d.ts +43 -9
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/runs-cli.d.ts +296 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -0
- package/dist/workspace/runs.d.ts +544 -0
- package/dist/workspace/runs.d.ts.map +1 -0
- package/dist/workspace/session-kinds.d.ts +1 -1
- package/dist/workspace/session-kinds.d.ts.map +1 -1
- package/dist/workspace/source-block.d.ts +1 -1
- package/dist/workspace/source-block.d.ts.map +1 -1
- package/dist/workspace/squash.d.ts +80 -0
- package/dist/workspace/squash.d.ts.map +1 -0
- package/dist/workspace/status-gates.d.ts +17 -3
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +64 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/symbols.d.ts +63 -0
- package/dist/workspace/symbols.d.ts.map +1 -0
- package/dist/workspace/trailer-joins.d.ts +46 -0
- package/dist/workspace/trailer-joins.d.ts.map +1 -0
- package/dist/workspace/trailers.d.ts +89 -0
- package/dist/workspace/trailers.d.ts.map +1 -0
- package/dist/workspace/trust/attestor.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/run-commits.d.ts +46 -0
- package/dist/workspace/trust/run-commits.d.ts.map +1 -0
- package/dist/workspace/trust/run-statement.d.ts +128 -0
- package/dist/workspace/trust/run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/seal.d.ts +38 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/test-repo.d.ts.map +1 -1
- package/dist/workspace/trust/verify-cli.d.ts +1 -1
- package/dist/workspace/trust/verify.d.ts +16 -2
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/wip-cli.d.ts +21 -0
- package/dist/workspace/wip-cli.d.ts.map +1 -0
- package/dist/workspace/wip.d.ts +268 -0
- package/dist/workspace/wip.d.ts.map +1 -0
- package/dist/workspace/work-cli.d.ts +39 -3
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-evidence.d.ts +1 -1
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-size.d.ts +55 -0
- package/dist/workspace/work-size.d.ts.map +1 -0
- package/dist/workspace/work.d.ts +26 -1
- package/dist/workspace/work.d.ts.map +1 -1
- package/dist/workspace/workspace-kinds.schema.json +122 -0
- package/dist/workspace/workspace-principals.schema.json +60 -0
- package/dist/workspace/write-lock-cli.d.ts +60 -0
- package/dist/workspace/write-lock-cli.d.ts.map +1 -0
- package/dist/workspace/write-lock.d.ts +152 -0
- package/dist/workspace/write-lock.d.ts.map +1 -0
- package/dist/workspace/write-scope.d.ts +83 -19
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/yaml.d.ts +21 -39
- package/dist/yaml.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
- package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
- package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
- package/src/__fixtures__/change-set/warden.plan.json +44 -0
- package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
- package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
- package/src/audit/core.test.ts +15 -0
- package/src/audit/core.ts +8 -2
- package/src/audit/discover.test.ts +11 -0
- package/src/audit/discover.ts +7 -2
- package/src/audit/prior-art.ts +15 -0
- package/src/change-set-bundle.test.ts +57 -0
- package/src/change-set.test.ts +215 -0
- package/src/change-set.ts +445 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
- package/src/cli/commands/audit-opt-in.test.ts +54 -0
- package/src/cli/commands/audit.ts +29 -2
- package/src/cli/commands/build.test.ts +19 -0
- package/src/cli/commands/build.ts +3 -2
- package/src/cli/commands/carve-emit-state.test.ts +4 -0
- package/src/cli/commands/carve-emit.ts +5 -19
- package/src/cli/commands/check-lexicon.test.ts +62 -1
- package/src/cli/commands/check-lexicon.ts +36 -6
- package/src/cli/commands/import-live.test.ts +18 -0
- package/src/cli/commands/import-parser-options.test.ts +133 -0
- package/src/cli/commands/import.ts +21 -3
- package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
- package/src/cli/commands/init.test.ts +8 -1
- package/src/cli/commands/init.ts +23 -8
- package/src/cli/commands/lint.test.ts +37 -0
- package/src/cli/commands/onboard.test.ts +53 -3
- package/src/cli/commands/onboard.ts +52 -4
- package/src/cli/commands/pinned-upgrade.ts +73 -33
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
- package/src/cli/handlers/build.ts +13 -1
- package/src/cli/handlers/change-set.test.ts +56 -0
- package/src/cli/handlers/change-set.ts +44 -0
- package/src/cli/handlers/components.ts +2 -2
- package/src/cli/handlers/dev.ts +8 -6
- package/src/cli/handlers/fan-out.test.ts +221 -2
- package/src/cli/handlers/fan-out.ts +165 -75
- package/src/cli/handlers/graph.ts +3 -0
- package/src/cli/handlers/lifecycle.test.ts +67 -0
- package/src/cli/handlers/lifecycle.ts +6 -5
- package/src/cli/handlers/misc.ts +2 -0
- package/src/cli/handlers/operator.test.ts +21 -0
- package/src/cli/handlers/operator.ts +121 -6
- package/src/cli/handlers/pr.ts +373 -0
- package/src/cli/handlers/run.test.ts +111 -0
- package/src/cli/handlers/run.ts +86 -24
- package/src/cli/handlers/scenario.ts +2 -2
- package/src/cli/main.test.ts +21 -0
- package/src/cli/main.ts +246 -30
- package/src/cli/mcp/never-over-mcp.test.ts +101 -0
- package/src/cli/mcp/op-tools.ts +24 -2
- package/src/cli/mcp/workspace-tools.test.ts +5 -2
- package/src/cli/mcp/workspace-tools.ts +62 -7
- package/src/cli/registry.ts +74 -3
- package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
- package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
- package/src/codegen/pinned-upgrade.test.ts +104 -0
- package/src/codegen/pinned-upgrade.ts +250 -56
- package/src/codegen/testdata/postgres-tags.json +242 -0
- package/src/components/auto-release.ts +1 -1
- package/src/components/capability.ts +55 -0
- package/src/components/changed-files.ts +66 -0
- package/src/components/cli-support.ts +28 -5
- package/src/components/component.schema.json +17 -0
- package/src/components/component.ts +25 -0
- package/src/components/deploy-units.ts +3 -0
- package/src/components/driver.test.ts +52 -0
- package/src/components/driver.ts +31 -13
- package/src/components/fan-out-output.ts +42 -1
- package/src/components/fan-out-record.ts +69 -0
- package/src/components/fan-out-run.test.ts +17 -0
- package/src/components/fan-out-run.ts +304 -1
- package/src/components/fan-out-support.ts +3 -0
- package/src/components/fan-out-waves.test.ts +375 -0
- package/src/components/fan-out.ts +18 -17
- package/src/components/gated-wave-pipeline.ts +82 -0
- package/src/components/index.ts +1 -0
- package/src/components/layers.ts +30 -0
- package/src/components/pr-pipeline.ts +91 -0
- package/src/components/pr-run.test.ts +205 -0
- package/src/components/pr-run.ts +280 -0
- package/src/components/promote.ts +5 -0
- package/src/components/verbs/shell.test.ts +11 -0
- package/src/components/verbs/shell.ts +7 -3
- package/src/components/wave-plan.ts +124 -0
- package/src/config.test.ts +21 -0
- package/src/config.ts +15 -0
- package/src/declarable.test.ts +21 -0
- package/src/declarable.ts +19 -0
- package/src/discovery/fold-composite.test.ts +41 -5
- package/src/discovery/fold-import.test.ts +129 -0
- package/src/discovery/fold-import.ts +643 -131
- package/src/discovery/fold-package-composite.test.ts +264 -0
- package/src/discovery/fold-specifiers.test.ts +191 -0
- package/src/discovery/param-deps.test.ts +66 -1
- package/src/discovery/param-deps.ts +45 -0
- package/src/discovery/sandbox/bundle.ts +1 -1
- package/src/discovery/specifier-resolve.ts +344 -0
- package/src/fold/fold.test.ts +39 -1
- package/src/fold/fold.ts +83 -9
- package/src/fold-provenance.test.ts +140 -0
- package/src/gated-waves-bundle.test.ts +62 -0
- package/src/gated-waves.test.ts +118 -0
- package/src/gated-waves.ts +240 -0
- package/src/graph-ir.test.ts +83 -0
- package/src/graph-ir.ts +29 -0
- package/src/import/embedded.test.ts +20 -0
- package/src/import/embedded.ts +13 -0
- package/src/import/parser-options.ts +46 -0
- package/src/import/parser.ts +20 -0
- package/src/index.ts +1 -0
- package/src/lexicon.ts +106 -3
- package/src/lifecycle/gate-ledger.ts +23 -0
- package/src/lifecycle/git.ts +102 -16
- package/src/lifecycle/observe.test.ts +18 -0
- package/src/lifecycle/observe.ts +6 -4
- package/src/lifecycle/snapshot.ts +2 -2
- package/src/lifecycle/work-lease.test.ts +1 -1
- package/src/lifecycle/work-lease.ts +93 -2
- package/src/lint/engine.test.ts +55 -0
- package/src/lint/engine.ts +30 -4
- package/src/lint/output-docs.test.ts +59 -56
- package/src/lint/post-synth.test.ts +19 -0
- package/src/lint/post-synth.ts +19 -1
- package/src/meta/declared-imports.test.ts +1 -1
- package/src/op/activities/activity-contracts.ts +84 -0
- package/src/op/activities/apply.test.ts +189 -5
- package/src/op/activities/apply.ts +230 -8
- package/src/op/activities/change-set.ts +114 -0
- package/src/op/activities/decide.ts +3 -0
- package/src/op/activities/factory.ts +675 -0
- package/src/op/activities/index.ts +9 -0
- package/src/op/activities/lexicon-upgrade.test.ts +160 -6
- package/src/op/activities/lexicon-upgrade.ts +154 -51
- package/src/op/activity-contract.test.ts +21 -1
- package/src/op/activity-contract.ts +19 -9
- package/src/op/builders.ts +23 -0
- package/src/op/composites/apply-op.ts +12 -5
- package/src/op/composites/composites.test.ts +30 -3
- package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
- package/src/op/composites/lexicon-upgrade-op.ts +29 -8
- package/src/op/decide-backend.ts +5 -1
- package/src/op/decide-read-inputs.ts +33 -5
- package/src/op/emulator-lifecycle.test.ts +23 -0
- package/src/op/emulator-lifecycle.ts +52 -14
- package/src/op/factory.e2e.test.ts +232 -0
- package/src/op/factory.ts +118 -0
- package/src/op/gate-approval.test.ts +74 -0
- package/src/op/gate-approval.ts +5 -1
- package/src/op/gate.ts +31 -5
- package/src/op/index.ts +11 -1
- package/src/op/local-executor.test.ts +15 -0
- package/src/op/local-executor.ts +40 -12
- package/src/op/local-output.ts +1 -1
- package/src/op/op-ir.test.ts +9 -0
- package/src/op/op-ir.ts +4 -0
- package/src/op/op-verb-class.ts +3 -0
- package/src/op/operator.ts +4 -0
- package/src/op/run-context.test.ts +141 -0
- package/src/op/run-context.ts +51 -0
- package/src/op/runtimes/local.test.ts +14 -0
- package/src/op/runtimes/local.ts +2 -0
- package/src/op/steward-beside.ts +2 -0
- package/src/op/types.ts +16 -3
- package/src/op/work-lease-run.test.ts +47 -0
- package/src/op/work-lease-run.ts +76 -11
- package/src/plan-summary.test.ts +263 -0
- package/src/plan-summary.ts +845 -0
- package/src/pr-forge.test.ts +237 -0
- package/src/pr-forge.ts +332 -0
- package/src/pr-loop-bundle.test.ts +46 -0
- package/src/pr-loop.test.ts +171 -0
- package/src/pr-loop.ts +324 -0
- package/src/provenance.ts +35 -0
- package/src/telemetry-attribution.test.ts +23 -1
- package/src/telemetry-attribution.ts +51 -0
- package/src/terraform/hcl2json.test.ts +21 -0
- package/src/terraform/hcl2json.ts +81 -0
- package/src/terraform/parse.ts +11 -74
- package/src/workspace/agent-cli.ts +7 -3
- package/src/workspace/agent.schema.json +22 -0
- package/src/workspace/app-kind.test.ts +196 -0
- package/src/workspace/box-cli.ts +113 -0
- package/src/workspace/box-factory.test.ts +323 -0
- package/src/workspace/box-factory.ts +136 -0
- package/src/workspace/box-listing-write.schema.json +204 -0
- package/src/workspace/box-listing.test.ts +234 -0
- package/src/workspace/box-listing.ts +324 -0
- package/src/workspace/box-publish.schema.json +498 -0
- package/src/workspace/box-publish.test.ts +204 -0
- package/src/workspace/box-publish.ts +420 -0
- package/src/workspace/box-ship.test.ts +96 -0
- package/src/workspace/broker-protocol.schema.json +186 -0
- package/src/workspace/broker-protocol.test.ts +122 -0
- package/src/workspace/broker-protocol.ts +317 -0
- package/src/workspace/builder-tiers.test.ts +146 -0
- package/src/workspace/change-set.schema.json +460 -0
- package/src/workspace/changes.schema.json +12 -20
- package/src/workspace/changes.ts +4 -1
- package/src/workspace/chant-migrations.e2e.test.ts +17 -5
- package/src/workspace/checks/boxes.test.ts +5 -0
- package/src/workspace/checks.ts +39 -8
- package/src/workspace/component-environments.test.ts +105 -0
- package/src/workspace/compose-graph.ts +7 -0
- package/src/workspace/composites.schema.json +23 -4
- package/src/workspace/composites.test.ts +8 -8
- package/src/workspace/composites.ts +13 -2
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
- package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/src/workspace/conformance/broker.test.ts +122 -0
- package/src/workspace/conformance/broker.ts +792 -0
- package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
- package/src/workspace/conformance/index.mjs +51 -3
- package/src/workspace/conformance/index.ts +107 -15
- package/src/workspace/conformance/vitest.ts +76 -2
- package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
- package/src/workspace/conformance/writer.test.ts +186 -0
- package/src/workspace/conformance/writer.ts +1191 -0
- package/src/workspace/decide.test.ts +208 -4
- package/src/workspace/decide.ts +433 -73
- package/src/workspace/decision-points.schema.json +11 -4
- package/src/workspace/declaration.schema.json +383 -5
- package/src/workspace/declaration.ts +315 -10
- package/src/workspace/environments.ts +66 -14
- package/src/workspace/factory-rules.test.ts +62 -0
- package/src/workspace/factory-rules.ts +218 -0
- package/src/workspace/graph-cli.ts +6 -3
- package/src/workspace/graph.schema.json +314 -0
- package/src/workspace/identity.test.ts +219 -0
- package/src/workspace/identity.ts +186 -0
- package/src/workspace/init.ts +82 -2
- package/src/workspace/intent-cli.ts +84 -13
- package/src/workspace/intent-patch-id.test.ts +162 -0
- package/src/workspace/intent-record.schema.json +336 -1
- package/src/workspace/intent-record.ts +96 -16
- package/src/workspace/intent-reviews.test.ts +76 -0
- package/src/workspace/intent-squash.test.ts +213 -0
- package/src/workspace/intent-why.test.ts +274 -0
- package/src/workspace/intent.schema.json +950 -9
- package/src/workspace/intent.test.ts +11 -2
- package/src/workspace/intent.ts +722 -65
- package/src/workspace/json-edit.test.ts +121 -0
- package/src/workspace/json-edit.ts +142 -0
- package/src/workspace/jsonc.ts +20 -0
- package/src/workspace/kinds.ts +201 -39
- package/src/workspace/lexicon-symbols.test.ts +148 -0
- package/src/workspace/lexicon-symbols.ts +125 -0
- package/src/workspace/lineage-upgrade.test.ts +63 -0
- package/src/workspace/lineage-upgrade.ts +146 -5
- package/src/workspace/plan-summary.schema.json +155 -0
- package/src/workspace/point-answer.schema.json +42 -2
- package/src/workspace/points-cli.ts +42 -16
- package/src/workspace/points-write.schema.json +163 -4
- package/src/workspace/points.schema.json +157 -2
- package/src/workspace/points.test.ts +13 -1
- package/src/workspace/points.ts +118 -12
- package/src/workspace/pr-report.schema.json +95 -0
- package/src/workspace/principal-classes.test.ts +175 -0
- package/src/workspace/principal-classes.ts +307 -0
- package/src/workspace/profiles.test.ts +159 -0
- package/src/workspace/read-contract.test.ts +2 -2
- package/src/workspace/reason-codes.test.ts +23 -3
- package/src/workspace/reason-codes.ts +61 -4
- package/src/workspace/record-sessions.ts +9 -8
- package/src/workspace/records-amend.schema.json +80 -0
- package/src/workspace/records-checkout.ts +106 -0
- package/src/workspace/records-cli.ts +123 -17
- package/src/workspace/records-close.schema.json +79 -0
- package/src/workspace/records-close.ts +31 -7
- package/src/workspace/records-concurrent.e2e.test.ts +135 -0
- package/src/workspace/records-concurrent.test.ts +145 -0
- package/src/workspace/records-formats.test.ts +46 -10
- package/src/workspace/records-new.schema.json +9 -0
- package/src/workspace/records-review.schema.json +80 -0
- package/src/workspace/records-sessions-write.test.ts +69 -0
- package/src/workspace/records-sessions.test.ts +22 -0
- package/src/workspace/records-uncommitted.test.ts +171 -0
- package/src/workspace/records-write.ts +219 -30
- package/src/workspace/records.schema.json +88 -1
- package/src/workspace/records.ts +76 -8
- package/src/workspace/reference-kinds/app/package.json +10 -0
- package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/src/workspace/run-statement.schema.json +622 -0
- package/src/workspace/runs-cli.ts +710 -0
- package/src/workspace/runs-statement.test.ts +239 -0
- package/src/workspace/runs-write.schema.json +994 -0
- package/src/workspace/runs.schema.json +1257 -0
- package/src/workspace/runs.test.ts +281 -0
- package/src/workspace/runs.ts +970 -0
- package/src/workspace/session-kinds.ts +3 -3
- package/src/workspace/squash.ts +198 -0
- package/src/workspace/status-contract.test.ts +10 -2
- package/src/workspace/status-gates.ts +25 -9
- package/src/workspace/status.schema.json +252 -4
- package/src/workspace/status.ts +110 -1
- package/src/workspace/symbols.ts +191 -0
- package/src/workspace/trailer-joins.test.ts +171 -0
- package/src/workspace/trailer-joins.ts +82 -0
- package/src/workspace/trailers.ts +148 -0
- package/src/workspace/trust/run-commits.ts +115 -0
- package/src/workspace/trust/run-statement.ts +226 -0
- package/src/workspace/trust/seal.ts +58 -1
- package/src/workspace/trust/verify-cli.ts +6 -5
- package/src/workspace/trust/verify.ts +39 -6
- package/src/workspace/wip-cli.ts +97 -0
- package/src/workspace/wip-write.schema.json +504 -0
- package/src/workspace/wip.schema.json +334 -0
- package/src/workspace/wip.test.ts +294 -0
- package/src/workspace/wip.ts +753 -0
- package/src/workspace/work-cli.e2e.test.ts +28 -1
- package/src/workspace/work-cli.ts +136 -8
- package/src/workspace/work-evidence.schema.json +5 -0
- package/src/workspace/work-history.schema.json +73 -1
- package/src/workspace/work-history.test.ts +48 -5
- package/src/workspace/work-kind-fields.test.ts +154 -0
- package/src/workspace/work-lease.schema.json +14 -1
- package/src/workspace/work-size.test.ts +77 -0
- package/src/workspace/work-size.ts +93 -0
- package/src/workspace/work.ts +82 -0
- package/src/workspace/workspace-kinds.schema.json +122 -0
- package/src/workspace/workspace-principals.schema.json +60 -0
- package/src/workspace/write-lock-cli.ts +131 -0
- package/src/workspace/write-lock.schema.json +172 -0
- package/src/workspace/write-lock.test.ts +189 -0
- package/src/workspace/write-lock.ts +474 -0
- package/src/workspace/write-scope.test.ts +144 -3
- package/src/workspace/write-scope.ts +192 -45
- package/src/yaml.test.ts +111 -1
- package/src/yaml.ts +141 -549
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chant#3090 — the file-system half of fold's import resolution: which file a
|
|
3
|
+
* relative specifier names, which file a package's `exports` map names for a
|
|
4
|
+
* subpath, and which file a tsconfig `paths` entry names.
|
|
5
|
+
*
|
|
6
|
+
* The rules follow TypeScript's `bundler` resolution with `noDtsResolution`,
|
|
7
|
+
* the resolver `tsc` and the editor use for these specifiers:
|
|
8
|
+
*
|
|
9
|
+
* - `./x.js` names `./x.ts` (or `./x.tsx`) when that file exists, and the
|
|
10
|
+
* `.js` file only otherwise. `.mjs` maps to `.mts`, `.cjs` to `.cts` and
|
|
11
|
+
* `.jsx` to `.tsx` the same way.
|
|
12
|
+
* - A package's `exports` map is read for the root and for subpaths, with
|
|
13
|
+
* one `*` per pattern key, and its condition objects are read in key order
|
|
14
|
+
* against the `import`, `node` and `default` conditions, as an ESM import
|
|
15
|
+
* in Node reads them.
|
|
16
|
+
* - A `paths` entry from the nearest `tsconfig.json` resolves relative to
|
|
17
|
+
* `baseUrl` when the config chain sets one and to the directory of the
|
|
18
|
+
* config that declares `paths` otherwise.
|
|
19
|
+
*
|
|
20
|
+
* Nothing here calls Node's `Module._resolveFilename`: every answer comes from
|
|
21
|
+
* `statSync` and `readFileSync`, which is what keeps the cold-resolution cost
|
|
22
|
+
* of chant#1020 off this path.
|
|
23
|
+
*/
|
|
24
|
+
import * as ts from "typescript";
|
|
25
|
+
import { readFileSync, statSync } from "node:fs";
|
|
26
|
+
import { dirname, extname, isAbsolute, join, resolve as resolvePath } from "node:path";
|
|
27
|
+
|
|
28
|
+
/** True when `path` is an existing regular file. */
|
|
29
|
+
export function isFile(path: string): boolean {
|
|
30
|
+
try {
|
|
31
|
+
return statSync(path, { throwIfNoEntry: false })?.isFile() ?? false;
|
|
32
|
+
} catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** True when `path` is an existing directory. */
|
|
38
|
+
function isDirectory(path: string): boolean {
|
|
39
|
+
try {
|
|
40
|
+
return statSync(path, { throwIfNoEntry: false })?.isDirectory() ?? false;
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The TypeScript source extensions a JavaScript extension in a specifier stands for, in the order `tsc` tries them. */
|
|
47
|
+
const TS_SOURCE_FOR_JS_EXTENSION: Readonly<Record<string, readonly string[]>> = {
|
|
48
|
+
".js": [".ts", ".tsx"],
|
|
49
|
+
".jsx": [".tsx"],
|
|
50
|
+
".mjs": [".mts"],
|
|
51
|
+
".cjs": [".cts"],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The file an absolute module base path names, or `undefined` when none of
|
|
56
|
+
* the probed files exists. A JavaScript extension is first swapped for its
|
|
57
|
+
* TypeScript source extension. Then the path itself, the path with `.ts`,
|
|
58
|
+
* `.tsx`, `.js` and `.mjs` appended, and `index.ts` and `index.js` under it
|
|
59
|
+
* are tried in that order.
|
|
60
|
+
*/
|
|
61
|
+
export function probeModuleFile(base: string): string | undefined {
|
|
62
|
+
const ext = extname(base);
|
|
63
|
+
const sourceExts = TS_SOURCE_FOR_JS_EXTENSION[ext];
|
|
64
|
+
if (sourceExts) {
|
|
65
|
+
const stem = base.slice(0, -ext.length);
|
|
66
|
+
for (const sourceExt of sourceExts) {
|
|
67
|
+
if (isFile(stem + sourceExt)) return stem + sourceExt;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const candidates = [
|
|
71
|
+
base,
|
|
72
|
+
`${base}.ts`,
|
|
73
|
+
`${base}.tsx`,
|
|
74
|
+
`${base}.js`,
|
|
75
|
+
`${base}.mjs`,
|
|
76
|
+
join(base, "index.ts"),
|
|
77
|
+
join(base, "index.js"),
|
|
78
|
+
];
|
|
79
|
+
return candidates.find(isFile);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** A bare specifier split into its package name and the subpath after it (`"."` for the root). */
|
|
83
|
+
export function splitBareSpecifier(specifier: string): { name: string; subpath: string } | undefined {
|
|
84
|
+
const segments = specifier.split("/");
|
|
85
|
+
const nameLength = specifier.startsWith("@") ? 2 : 1;
|
|
86
|
+
if (segments.length < nameLength || segments.slice(0, nameLength).some((s) => s === "")) return undefined;
|
|
87
|
+
const name = segments.slice(0, nameLength).join("/");
|
|
88
|
+
const rest = segments.slice(nameLength).join("/");
|
|
89
|
+
return { name, subpath: rest === "" ? "." : `./${rest}` };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The conditions an ESM import in Node matches, which is what the run path does. */
|
|
93
|
+
const EXPORT_CONDITIONS: ReadonlySet<string> = new Set(["import", "node", "default"]);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The target an `exports` value selects, with `star` substituted for each `*`
|
|
97
|
+
* when it came from a pattern key. A string is the target; an array yields its
|
|
98
|
+
* first resolvable entry; a condition object is read in key order and the
|
|
99
|
+
* first matching condition that resolves wins. `null`, and a condition object
|
|
100
|
+
* with no matching condition, resolve to nothing.
|
|
101
|
+
*/
|
|
102
|
+
function exportsValueTarget(value: unknown, star: string | undefined): string | undefined {
|
|
103
|
+
if (typeof value === "string") return star === undefined ? value : value.split("*").join(star);
|
|
104
|
+
if (Array.isArray(value)) {
|
|
105
|
+
for (const entry of value) {
|
|
106
|
+
const target = exportsValueTarget(entry, star);
|
|
107
|
+
if (target !== undefined) return target;
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
if (typeof value !== "object" || value === null) return undefined;
|
|
112
|
+
for (const [condition, conditional] of Object.entries(value)) {
|
|
113
|
+
if (!EXPORT_CONDITIONS.has(condition)) continue;
|
|
114
|
+
const target = exportsValueTarget(conditional, star);
|
|
115
|
+
if (target !== undefined) return target;
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The target `exportsField` gives `subpath` (`"."` or `"./x"`), relative to
|
|
122
|
+
* the package directory, or `undefined` when the map does not export it. An
|
|
123
|
+
* exact key wins over a pattern; among patterns, the longest prefix before the
|
|
124
|
+
* `*` wins, as in Node's own resolver.
|
|
125
|
+
*/
|
|
126
|
+
export function packageExportsTarget(exportsField: unknown, subpath: string): string | undefined {
|
|
127
|
+
const isSubpathMap =
|
|
128
|
+
typeof exportsField === "object" &&
|
|
129
|
+
exportsField !== null &&
|
|
130
|
+
!Array.isArray(exportsField) &&
|
|
131
|
+
Object.keys(exportsField).some((k) => k.startsWith("."));
|
|
132
|
+
if (!isSubpathMap) return subpath === "." ? exportsValueTarget(exportsField, undefined) : undefined;
|
|
133
|
+
|
|
134
|
+
const map = exportsField as Record<string, unknown>;
|
|
135
|
+
if (Object.prototype.hasOwnProperty.call(map, subpath) && !subpath.includes("*")) return exportsValueTarget(map[subpath], undefined);
|
|
136
|
+
|
|
137
|
+
let bestKey: string | undefined;
|
|
138
|
+
let bestStar: string | undefined;
|
|
139
|
+
for (const key of Object.keys(map)) {
|
|
140
|
+
const starAt = key.indexOf("*");
|
|
141
|
+
if (starAt === -1 || key.indexOf("*", starAt + 1) !== -1) continue;
|
|
142
|
+
const prefix = key.slice(0, starAt);
|
|
143
|
+
const suffix = key.slice(starAt + 1);
|
|
144
|
+
if (!subpath.startsWith(prefix) || subpath === prefix) continue;
|
|
145
|
+
if (suffix !== "" && (!subpath.endsWith(suffix) || subpath.length < key.length)) continue;
|
|
146
|
+
if (bestKey === undefined || prefix.length > bestKey.indexOf("*") || (prefix.length === bestKey.indexOf("*") && key.length > bestKey.length)) {
|
|
147
|
+
bestKey = key;
|
|
148
|
+
bestStar = subpath.slice(prefix.length, subpath.length - suffix.length);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return bestKey === undefined ? undefined : exportsValueTarget(map[bestKey], bestStar);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
155
|
+
// tsconfig `paths`
|
|
156
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
157
|
+
|
|
158
|
+
/** One `paths` key, split at its `*`. */
|
|
159
|
+
interface PathsPattern {
|
|
160
|
+
key: string;
|
|
161
|
+
prefix: string;
|
|
162
|
+
/** `undefined` for a key with no `*`, which matches only itself. */
|
|
163
|
+
suffix: string | undefined;
|
|
164
|
+
substitutions: readonly string[];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** The `paths` a config chain ends with, ready to match. */
|
|
168
|
+
interface TsconfigPaths {
|
|
169
|
+
/** `baseUrl` when the chain sets one, else the directory of the config that declares `paths`. */
|
|
170
|
+
base: string;
|
|
171
|
+
patterns: readonly PathsPattern[];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** A parsed config chain, with the files it was read from and their modification times. */
|
|
175
|
+
interface CachedTsconfig {
|
|
176
|
+
stamps: ReadonlyArray<readonly [string, number]>;
|
|
177
|
+
paths: TsconfigPaths | undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Nearest `tsconfig.json` for a directory (`null` when there is none). */
|
|
181
|
+
const nearestTsconfigCache = new Map<string, string | null>();
|
|
182
|
+
/** Parsed config chains by leaf config path, re-read when a file in the chain changes. */
|
|
183
|
+
const tsconfigCache = new Map<string, CachedTsconfig>();
|
|
184
|
+
|
|
185
|
+
function nearestTsconfig(dir: string): string | null {
|
|
186
|
+
const cached = nearestTsconfigCache.get(dir);
|
|
187
|
+
if (cached !== undefined) return cached;
|
|
188
|
+
const candidate = join(dir, "tsconfig.json");
|
|
189
|
+
let found: string | null;
|
|
190
|
+
if (isFile(candidate)) found = candidate;
|
|
191
|
+
else {
|
|
192
|
+
const parent = dirname(dir);
|
|
193
|
+
found = parent === dir ? null : nearestTsconfig(parent);
|
|
194
|
+
}
|
|
195
|
+
nearestTsconfigCache.set(dir, found);
|
|
196
|
+
return found;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function mtimeOf(path: string): number {
|
|
200
|
+
try {
|
|
201
|
+
return statSync(path, { throwIfNoEntry: false })?.mtimeMs ?? -1;
|
|
202
|
+
} catch {
|
|
203
|
+
return -1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** The config file an `extends` entry names, or `undefined` when it cannot be found. */
|
|
208
|
+
function resolveExtends(entry: string, fromConfig: string): string | undefined {
|
|
209
|
+
const fromDir = dirname(fromConfig);
|
|
210
|
+
if (entry.startsWith(".") || isAbsolute(entry)) {
|
|
211
|
+
const path = resolvePath(fromDir, entry);
|
|
212
|
+
if (isFile(path)) return path;
|
|
213
|
+
if (!path.endsWith(".json") && isFile(`${path}.json`)) return `${path}.json`;
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
// A package's config, looked up in `node_modules` the way `tsc` does for
|
|
217
|
+
// the common shapes: the file itself, the file plus `.json`, or the
|
|
218
|
+
// package directory's `tsconfig.json`.
|
|
219
|
+
for (let dir = fromDir; ; ) {
|
|
220
|
+
const path = join(dir, "node_modules", entry);
|
|
221
|
+
if (isFile(path)) return path;
|
|
222
|
+
if (!path.endsWith(".json") && isFile(`${path}.json`)) return `${path}.json`;
|
|
223
|
+
if (isDirectory(path) && isFile(join(path, "tsconfig.json"))) return join(path, "tsconfig.json");
|
|
224
|
+
const parent = dirname(dir);
|
|
225
|
+
if (parent === dir) return undefined;
|
|
226
|
+
dir = parent;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
interface ChainOptions {
|
|
231
|
+
paths?: { value: Record<string, unknown>; declaredIn: string };
|
|
232
|
+
baseUrl?: string;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Read `configPath` and everything it extends, later configs overriding earlier ones. */
|
|
236
|
+
function readConfigChain(configPath: string, files: string[], seen: Set<string>): ChainOptions {
|
|
237
|
+
if (seen.has(configPath)) return {};
|
|
238
|
+
seen.add(configPath);
|
|
239
|
+
files.push(configPath);
|
|
240
|
+
let text: string;
|
|
241
|
+
try {
|
|
242
|
+
text = readFileSync(configPath, "utf-8");
|
|
243
|
+
} catch {
|
|
244
|
+
return {};
|
|
245
|
+
}
|
|
246
|
+
const { config } = ts.parseConfigFileTextToJson(configPath, text);
|
|
247
|
+
if (typeof config !== "object" || config === null) return {};
|
|
248
|
+
const raw = config as { extends?: unknown; compilerOptions?: { paths?: unknown; baseUrl?: unknown } };
|
|
249
|
+
|
|
250
|
+
const merged: ChainOptions = {};
|
|
251
|
+
const parents = typeof raw.extends === "string" ? [raw.extends] : Array.isArray(raw.extends) ? raw.extends : [];
|
|
252
|
+
for (const parent of parents) {
|
|
253
|
+
if (typeof parent !== "string") continue;
|
|
254
|
+
const parentPath = resolveExtends(parent, configPath);
|
|
255
|
+
if (parentPath === undefined) continue;
|
|
256
|
+
const inherited = readConfigChain(parentPath, files, seen);
|
|
257
|
+
if (inherited.paths) merged.paths = inherited.paths;
|
|
258
|
+
if (inherited.baseUrl !== undefined) merged.baseUrl = inherited.baseUrl;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const options = raw.compilerOptions;
|
|
262
|
+
if (options && typeof options.paths === "object" && options.paths !== null && !Array.isArray(options.paths)) {
|
|
263
|
+
merged.paths = { value: options.paths as Record<string, unknown>, declaredIn: dirname(configPath) };
|
|
264
|
+
}
|
|
265
|
+
if (options && typeof options.baseUrl === "string") merged.baseUrl = resolvePath(dirname(configPath), options.baseUrl);
|
|
266
|
+
return merged;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function parsePaths(chain: ChainOptions): TsconfigPaths | undefined {
|
|
270
|
+
if (!chain.paths) return undefined;
|
|
271
|
+
const patterns: PathsPattern[] = [];
|
|
272
|
+
for (const [key, value] of Object.entries(chain.paths.value)) {
|
|
273
|
+
if (!Array.isArray(value)) continue;
|
|
274
|
+
const substitutions = value.filter((s): s is string => typeof s === "string");
|
|
275
|
+
const starAt = key.indexOf("*");
|
|
276
|
+
if (starAt !== -1 && key.indexOf("*", starAt + 1) !== -1) continue;
|
|
277
|
+
patterns.push(
|
|
278
|
+
starAt === -1
|
|
279
|
+
? { key, prefix: key, suffix: undefined, substitutions }
|
|
280
|
+
: { key, prefix: key.slice(0, starAt), suffix: key.slice(starAt + 1), substitutions },
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
return { base: chain.baseUrl ?? chain.paths.declaredIn, patterns };
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function tsconfigPathsFor(configPath: string): TsconfigPaths | undefined {
|
|
287
|
+
const cached = tsconfigCache.get(configPath);
|
|
288
|
+
if (cached && cached.stamps.every(([file, mtime]) => mtimeOf(file) === mtime)) return cached.paths;
|
|
289
|
+
const files: string[] = [];
|
|
290
|
+
const paths = parsePaths(readConfigChain(configPath, files, new Set()));
|
|
291
|
+
tsconfigCache.set(configPath, { stamps: files.map((f) => [f, mtimeOf(f)] as const), paths });
|
|
292
|
+
return paths;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* The tsconfig `paths` entry that matches a bare `specifier` imported by
|
|
297
|
+
* `fromFile`, read from the nearest `tsconfig.json` above it, and the file it
|
|
298
|
+
* maps the specifier to (`target`, `undefined` when no substitution names an
|
|
299
|
+
* existing file). `undefined` when no entry matches. An exact key wins over a
|
|
300
|
+
* pattern, and among patterns the longest prefix wins, as in `tsc`.
|
|
301
|
+
* Substitutions are tried in order with {@link probeModuleFile}.
|
|
302
|
+
*/
|
|
303
|
+
export function tsconfigPathsMatch(
|
|
304
|
+
specifier: string,
|
|
305
|
+
fromFile: string,
|
|
306
|
+
): { key: string; target: string | undefined } | undefined {
|
|
307
|
+
const configPath = nearestTsconfig(dirname(fromFile));
|
|
308
|
+
if (configPath === null) return undefined;
|
|
309
|
+
const paths = tsconfigPathsFor(configPath);
|
|
310
|
+
if (!paths) return undefined;
|
|
311
|
+
|
|
312
|
+
let best: PathsPattern | undefined;
|
|
313
|
+
for (const pattern of paths.patterns) {
|
|
314
|
+
if (pattern.suffix === undefined) {
|
|
315
|
+
if (pattern.key === specifier) {
|
|
316
|
+
best = pattern;
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (
|
|
322
|
+
specifier.length >= pattern.prefix.length + pattern.suffix.length &&
|
|
323
|
+
specifier.startsWith(pattern.prefix) &&
|
|
324
|
+
specifier.endsWith(pattern.suffix) &&
|
|
325
|
+
(best === undefined || pattern.prefix.length > best.prefix.length)
|
|
326
|
+
) {
|
|
327
|
+
best = pattern;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (!best) return undefined;
|
|
331
|
+
|
|
332
|
+
const star =
|
|
333
|
+
best.suffix === undefined ? "" : specifier.slice(best.prefix.length, specifier.length - best.suffix.length);
|
|
334
|
+
for (const substitution of best.substitutions) {
|
|
335
|
+
const target = probeModuleFile(resolvePath(paths.base, substitution.split("*").join(star)));
|
|
336
|
+
if (target !== undefined) return { key: best.key, target };
|
|
337
|
+
}
|
|
338
|
+
return { key: best.key, target: undefined };
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** The file {@link tsconfigPathsMatch} maps `specifier` to, or `undefined`. */
|
|
342
|
+
export function tsconfigPathsTarget(specifier: string, fromFile: string): string | undefined {
|
|
343
|
+
return tsconfigPathsMatch(specifier, fromFile)?.target;
|
|
344
|
+
}
|
package/src/fold/fold.test.ts
CHANGED
|
@@ -492,6 +492,7 @@ describe("fold — intrinsic tagged templates", () => {
|
|
|
492
492
|
expect(fold(expr, consts, [SUB])).toEqual({
|
|
493
493
|
__intrinsic: "Sub",
|
|
494
494
|
strings: ["", "-data"],
|
|
495
|
+
raw: ["", "-data"],
|
|
495
496
|
values: ["prefix"],
|
|
496
497
|
});
|
|
497
498
|
});
|
|
@@ -504,6 +505,7 @@ describe("fold — intrinsic tagged templates", () => {
|
|
|
504
505
|
expect(fold(expr, consts, [INTRINSIC])).toEqual({
|
|
505
506
|
__intrinsic: "Intrinsic",
|
|
506
507
|
strings: ["", "-data"],
|
|
508
|
+
raw: ["", "-data"],
|
|
507
509
|
values: [{ __symbol: "Params.StackName" }],
|
|
508
510
|
});
|
|
509
511
|
});
|
|
@@ -519,6 +521,7 @@ describe("fold — intrinsic tagged templates", () => {
|
|
|
519
521
|
expect(fold(expr, consts, [SUB])).toEqual({
|
|
520
522
|
__intrinsic: "Sub",
|
|
521
523
|
strings: ["", "/*"],
|
|
524
|
+
raw: ["", "/*"],
|
|
522
525
|
values: [{ __attrRef: { entity: "bucket", attribute: "arn" } }],
|
|
523
526
|
});
|
|
524
527
|
});
|
|
@@ -527,7 +530,41 @@ describe("fold — intrinsic tagged templates", () => {
|
|
|
527
530
|
const consts = parseConsts("const x = Sub`plain-value`;");
|
|
528
531
|
const expr = consts.get("x");
|
|
529
532
|
if (!expr) throw new Error("fixture error");
|
|
530
|
-
expect(fold(expr, consts, [SUB])).toEqual({
|
|
533
|
+
expect(fold(expr, consts, [SUB])).toEqual({
|
|
534
|
+
__intrinsic: "Sub",
|
|
535
|
+
strings: ["plain-value"],
|
|
536
|
+
raw: ["plain-value"],
|
|
537
|
+
values: [],
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
// chant #3196 — the envelope carries the raw parts beside the cooked ones,
|
|
542
|
+
// exactly as the TemplateStringsArray running the tag would.
|
|
543
|
+
test("a backslash-bearing template carries both its cooked and raw parts", () => {
|
|
544
|
+
const consts = parseConsts("const x = Sub`DEFAULT '\\d+\\t' ${1} \\`q\\``;");
|
|
545
|
+
const expr = consts.get("x");
|
|
546
|
+
if (!expr) throw new Error("fixture error");
|
|
547
|
+
const run = ((s: TemplateStringsArray, ..._values: unknown[]) => ({ strings: [...s], raw: [...s.raw] }))`DEFAULT '\d+\t' ${1} \`q\``;
|
|
548
|
+
expect(fold(expr, consts, [SUB])).toEqual({ __intrinsic: "Sub", ...run, values: [1] });
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
test("raw parts normalize CRLF line endings the way the language does", () => {
|
|
552
|
+
const consts = parseConsts("const x = Sub`a\r\nb\rc${1}d`;");
|
|
553
|
+
const expr = consts.get("x");
|
|
554
|
+
if (!expr) throw new Error("fixture error");
|
|
555
|
+
expect(fold(expr, consts, [SUB])).toMatchObject({ strings: ["a\nb\nc", "d"], raw: ["a\nb\nc", "d"] });
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
test("a template whose escape has no cooked value is refused, not folded to a different string", () => {
|
|
559
|
+
for (const body of ["\\u{zz}", "\\xg1", "\\1", "\\01"]) {
|
|
560
|
+
const consts = parseConsts(`const x = Sub\`a\${1}${body}\`;`);
|
|
561
|
+
const expr = consts.get("x");
|
|
562
|
+
if (!expr) throw new Error("fixture error");
|
|
563
|
+
expect(() => fold(expr, consts, [SUB])).toThrow(/no cooked value/);
|
|
564
|
+
}
|
|
565
|
+
const ok = parseConsts("const x = Sub`\\0 \\x41 \\u0041 \\u{1F600} \\\\1`;").get("x");
|
|
566
|
+
if (!ok) throw new Error("fixture error");
|
|
567
|
+
expect(fold(ok, new Map(), [SUB])).toMatchObject({ strings: ["\0 A A \u{1F600} \\1"] });
|
|
531
568
|
});
|
|
532
569
|
|
|
533
570
|
test("an unregistered tagged template is rejected with a located FoldError", () => {
|
|
@@ -588,6 +625,7 @@ describe("fold — registered call-form intrinsics (#1044)", () => {
|
|
|
588
625
|
expect(fold(expr, consts, [SUB, REF])).toEqual({
|
|
589
626
|
__intrinsic: "Sub",
|
|
590
627
|
strings: ["", "-fn"],
|
|
628
|
+
raw: ["", "-fn"],
|
|
591
629
|
values: [{ __intrinsic: "Ref", args: ["prod"] }],
|
|
592
630
|
});
|
|
593
631
|
});
|
package/src/fold/fold.ts
CHANGED
|
@@ -198,7 +198,7 @@ export interface AttrRefValue {
|
|
|
198
198
|
/**
|
|
199
199
|
* The result of folding a registered lexicon intrinsic tagged template
|
|
200
200
|
* (e.g. `Sub\`${AWS.StackName}-x\``) to its node form: tag name, cooked
|
|
201
|
-
* template string parts, and folded interpolated values (in order).
|
|
201
|
+
* and raw template string parts, and folded interpolated values (in order).
|
|
202
202
|
* Mirrors the runtime call shape `Tag(strings, ...values)` so a later
|
|
203
203
|
* build path can replay it into the real intrinsic object (#1022).
|
|
204
204
|
*/
|
|
@@ -208,6 +208,8 @@ export type FoldedIntrinsic = FoldedIntrinsicTag | FoldedIntrinsicCall;
|
|
|
208
208
|
export interface FoldedIntrinsicTag {
|
|
209
209
|
__intrinsic: string;
|
|
210
210
|
strings: string[];
|
|
211
|
+
/** The raw parts (`TemplateStringsArray.raw`), so the revived call sees what a real tagged call sees. */
|
|
212
|
+
raw: string[];
|
|
211
213
|
values: FoldedValue[];
|
|
212
214
|
}
|
|
213
215
|
|
|
@@ -1117,6 +1119,51 @@ function foldIntrinsicValue(
|
|
|
1117
1119
|
return fold(node, consts, intrinsics, externals);
|
|
1118
1120
|
}
|
|
1119
1121
|
|
|
1122
|
+
/**
|
|
1123
|
+
* A template part's raw text, as `TemplateStringsArray.raw` holds it. The
|
|
1124
|
+
* parser sets `rawText` on every literal it reads; the fallback takes the
|
|
1125
|
+
* source between the delimiters for a node without one. Line terminators are
|
|
1126
|
+
* normalized the way the language does for `raw` (`\r\n` and `\r` become
|
|
1127
|
+
* `\n`), which TypeScript's `rawText` does not do.
|
|
1128
|
+
*/
|
|
1129
|
+
function rawTemplateText(
|
|
1130
|
+
part: ts.NoSubstitutionTemplateLiteral | ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail,
|
|
1131
|
+
): string {
|
|
1132
|
+
let raw = part.rawText;
|
|
1133
|
+
if (raw === undefined) {
|
|
1134
|
+
const text = part.getText();
|
|
1135
|
+
const close = ts.isTemplateHead(part) || ts.isTemplateMiddle(part) ? 2 : 1;
|
|
1136
|
+
raw = text.slice(1, text.length - close);
|
|
1137
|
+
}
|
|
1138
|
+
return raw.replace(/\r\n?/g, "\n");
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
/**
|
|
1142
|
+
* True when a raw template part holds an escape a tagged template allows but
|
|
1143
|
+
* cannot cook (`\u{zz}`, `\xg`, `\1`, `\01`). Its cooked string is
|
|
1144
|
+
* `undefined` at run time, while TypeScript's `text` carries a string, so
|
|
1145
|
+
* folding it would hand the tag something running never does.
|
|
1146
|
+
*/
|
|
1147
|
+
function hasInvalidTemplateEscape(raw: string): boolean {
|
|
1148
|
+
for (let i = 0; i < raw.length; i++) {
|
|
1149
|
+
if (raw[i] !== "\\") continue;
|
|
1150
|
+
const rest = raw.slice(i + 1);
|
|
1151
|
+
const c = rest[0];
|
|
1152
|
+
if (c === "x") {
|
|
1153
|
+
if (!/^x[0-9a-fA-F]{2}/.test(rest)) return true;
|
|
1154
|
+
} else if (c === "u") {
|
|
1155
|
+
const m = /^u(?:[0-9a-fA-F]{4}|\{([0-9a-fA-F]+)\})/.exec(rest);
|
|
1156
|
+
if (!m || (m[1] !== undefined && parseInt(m[1], 16) > 0x10ffff)) return true;
|
|
1157
|
+
} else if (c !== undefined && c >= "1" && c <= "9") {
|
|
1158
|
+
return true;
|
|
1159
|
+
} else if (c === "0" && rest[1] !== undefined && rest[1] >= "0" && rest[1] <= "9") {
|
|
1160
|
+
return true;
|
|
1161
|
+
}
|
|
1162
|
+
i += 1;
|
|
1163
|
+
}
|
|
1164
|
+
return false;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1120
1167
|
/**
|
|
1121
1168
|
* Fold a `TaggedTemplateExpression` whose tag is a registered, foldable
|
|
1122
1169
|
* lexicon intrinsic ({@link intrinsicTagFolds}, `../lexicon.ts`) to its node
|
|
@@ -1126,6 +1173,11 @@ function foldIntrinsicValue(
|
|
|
1126
1173
|
* Checks the TAG-form predicate specifically (chant #1044): an intrinsic
|
|
1127
1174
|
* whose lexicon opted its plain-call form in is not thereby usable as a
|
|
1128
1175
|
* tagged template, and `` Ref`...` `` stays a rejection.
|
|
1176
|
+
*
|
|
1177
|
+
* The envelope carries both the cooked parts and the raw ones (#3196), so the
|
|
1178
|
+
* revived call receives the `TemplateStringsArray` a real tagged call does. A
|
|
1179
|
+
* tag that reads `strings.raw` (a SQL tag keeping `'\d+'` as written) would
|
|
1180
|
+
* otherwise build different text folded than run.
|
|
1129
1181
|
*/
|
|
1130
1182
|
function foldTaggedTemplate(
|
|
1131
1183
|
node: ts.TaggedTemplateExpression,
|
|
@@ -1140,15 +1192,21 @@ function foldTaggedTemplate(
|
|
|
1140
1192
|
}
|
|
1141
1193
|
|
|
1142
1194
|
const template = node.template;
|
|
1143
|
-
|
|
1144
|
-
|
|
1195
|
+
const parts = ts.isNoSubstitutionTemplateLiteral(template)
|
|
1196
|
+
? [template]
|
|
1197
|
+
: [template.head, ...template.templateSpans.map((span) => span.literal)];
|
|
1198
|
+
const raw = parts.map(rawTemplateText);
|
|
1199
|
+
if (raw.some(hasInvalidTemplateEscape)) {
|
|
1200
|
+
throw foldError(
|
|
1201
|
+
node,
|
|
1202
|
+
`${briefNodeText(node.tag)}\`...\` holds an escape sequence with no cooked value — not foldable, falls back to run`,
|
|
1203
|
+
);
|
|
1145
1204
|
}
|
|
1146
|
-
|
|
1147
|
-
const
|
|
1148
|
-
|
|
1149
|
-
foldIntrinsicValue(span.expression, consts, intrinsics, externals)
|
|
1150
|
-
|
|
1151
|
-
return { __intrinsic: tagName, strings, values };
|
|
1205
|
+
const strings = parts.map((part) => part.text);
|
|
1206
|
+
const values = ts.isNoSubstitutionTemplateLiteral(template)
|
|
1207
|
+
? []
|
|
1208
|
+
: template.templateSpans.map((span) => foldIntrinsicValue(span.expression, consts, intrinsics, externals));
|
|
1209
|
+
return { __intrinsic: tagName, strings, raw, values };
|
|
1152
1210
|
}
|
|
1153
1211
|
|
|
1154
1212
|
/**
|
|
@@ -1336,6 +1394,22 @@ export function fold(
|
|
|
1336
1394
|
// property-access branch below consults `consts` first, so a sibling
|
|
1337
1395
|
// attribute reference is still the symbolic `{__attrRef}` the serializer
|
|
1338
1396
|
// resolves by NAME. Nothing about the existing envelope changes.
|
|
1397
|
+
//
|
|
1398
|
+
// chant #3196 — the same holds for a same-file `const x = tag\`...\``
|
|
1399
|
+
// whose tag returns an entity (a SQL `table`): re-folding the initializer
|
|
1400
|
+
// would call the tag again and build a second entity discovery never
|
|
1401
|
+
// registers. The caller pre-resolves those too; without it the
|
|
1402
|
+
// initializer re-folds as before.
|
|
1403
|
+
//
|
|
1404
|
+
// chant#3325 — and a same-file `const x = Composite({...})` that a
|
|
1405
|
+
// composite call's props name: the caller resolves it on the live spine
|
|
1406
|
+
// and puts the instance here. Without it the call is refused below.
|
|
1407
|
+
if (
|
|
1408
|
+
(ts.isTaggedTemplateExpression(initializer) || ts.isCallExpression(initializer)) &&
|
|
1409
|
+
externals?.has(node.text)
|
|
1410
|
+
) {
|
|
1411
|
+
return externals.get(node.text) as FoldedValue;
|
|
1412
|
+
}
|
|
1339
1413
|
if (ts.isNewExpression(initializer)) {
|
|
1340
1414
|
if (externals?.has(node.text)) return externals.get(node.text) as FoldedValue;
|
|
1341
1415
|
throw foldError(
|