@automaton-labs/aib 0.0.7 → 0.0.8
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 -257
- package/config/agent-dx-policy.default.json +31 -0
- package/config/control-plane-client.default.json +3 -0
- package/dist/agent-dx/agent-dx.js +805 -0
- package/dist/agent-dx/presentation.js +32 -0
- package/dist/alias-advisor/analyze.js +982 -0
- package/dist/alias-advisor/exact-text-cost.js +74 -0
- package/dist/alias-advisor/lexical.js +240 -0
- package/dist/alias-advisor/model.js +2 -0
- package/dist/alias-advisor/path-identity.js +49 -0
- package/dist/alias-advisor/ranking.js +171 -0
- package/dist/alias-advisor/token-estimator.js +85 -0
- package/dist/bin/aib.js +5 -1
- package/dist/bin/cli.js +811 -4
- package/dist/commands/add-missing-imports-preview-cache.js +99 -2
- package/dist/commands/add-missing-imports.js +241 -2
- package/dist/commands/apply-module-plan.js +1319 -3
- package/dist/commands/background-command.js +378 -2
- package/dist/commands/captured-input.js +74 -1
- package/dist/commands/config-command.js +314 -2
- package/dist/commands/config-output.js +357 -10
- package/dist/commands/control-plane-command.js +183 -1
- package/dist/commands/declaration-command.js +1209 -7
- package/dist/commands/declaration-execution-cache.js +79 -1
- package/dist/commands/declaration-format.js +221 -1
- package/dist/commands/declaration-preview-cache.js +114 -2
- package/dist/commands/diagnostics-command.js +70 -3
- package/dist/commands/doctor.js +137 -3
- package/dist/commands/execution-command.js +117 -1
- package/dist/commands/exports-star-collapse-command.js +178 -0
- package/dist/commands/exports-star-command.js +252 -0
- package/dist/commands/exports-star-preview-cache.js +84 -0
- package/dist/commands/feedback-command.js +176 -3
- package/dist/commands/file-move-to-dir-execution-cache.js +92 -1
- package/dist/commands/file-move-to-dir-preview-cache.js +125 -2
- package/dist/commands/file-move-to-dir-worker.js +54 -0
- package/dist/commands/file-move-to-dir.js +1073 -5
- package/dist/commands/file-mutation-runtime.js +102 -1
- package/dist/commands/file-mutation-worker-apply.js +180 -0
- package/dist/commands/file-refactor-batch-execution-cache.js +90 -1
- package/dist/commands/file-refactor-batch-preview-cache.js +125 -2
- package/dist/commands/file-refactor-batch-worker.js +54 -0
- package/dist/commands/file-refactor-batch.js +1154 -5
- package/dist/commands/file-rename-execution-cache.js +92 -1
- package/dist/commands/file-rename-preview-cache.js +125 -2
- package/dist/commands/file-rename-worker.js +54 -0
- package/dist/commands/file-rename.js +1053 -5
- package/dist/commands/file-text-edit-executor.js +205 -0
- package/dist/commands/find-importers.js +52 -1
- package/dist/commands/find-unused-imports.js +55 -1
- package/dist/commands/generate-docs-command.js +244 -6
- package/dist/commands/help-command.js +460 -7
- package/dist/commands/import-specifier-policy.js +391 -0
- package/dist/commands/imports-command.js +68 -1
- package/dist/commands/imports-rebase.js +1138 -0
- package/dist/commands/init-skill-usage.js +92 -3
- package/dist/commands/init-workspace.js +30 -1
- package/dist/commands/inspect-alias-candidates.js +413 -0
- package/dist/commands/inspect-cycles.js +811 -5
- package/dist/commands/inspect-direct-usages.js +98 -0
- package/dist/commands/inspect-duplicates-format.js +229 -0
- package/dist/commands/inspect-format-primitives.js +127 -0
- package/dist/commands/inspect-format.js +1590 -18
- package/dist/commands/inspect-graph.js +1553 -9
- package/dist/commands/inspect-imports.js +339 -2
- package/dist/commands/inspect-mixed-format.js +524 -0
- package/dist/commands/inspect-module-plan-format.js +216 -0
- package/dist/commands/inspect-module-plan-serialization.js +402 -0
- package/dist/commands/inspect-reference-path-format.js +157 -0
- package/dist/commands/inspect-request-values.js +599 -0
- package/dist/commands/inspect-selector-kind.js +21 -0
- package/dist/commands/inspect-selector.js +50 -0
- package/dist/commands/inspect-symbol-format.js +90 -0
- package/dist/commands/inspect-topology.js +435 -0
- package/dist/commands/inspect-tree.js +827 -5
- package/dist/commands/inspect-usages-detail.js +793 -0
- package/dist/commands/inspect-usages-evidence.js +31 -0
- package/dist/commands/inspect-usages-format.js +367 -0
- package/dist/commands/inspect.js +1450 -16
- package/dist/commands/internal-command.js +64 -0
- package/dist/commands/json-file-input.js +60 -1
- package/dist/commands/module-plan-cache.js +156 -2
- package/dist/commands/module-plan-standalone.js +208 -0
- package/dist/commands/module-plan-timeout.js +77 -1
- package/dist/commands/move-preview-cache.js +101 -2
- package/dist/commands/mutate-aggregate-output.js +996 -0
- package/dist/commands/mutate-child-execution.js +374 -0
- package/dist/commands/mutate-command.js +1394 -0
- package/dist/commands/mutate-declaration-output.js +313 -0
- package/dist/commands/mutate-domain-adapters.js +638 -0
- package/dist/commands/mutate-execution-cache.js +114 -0
- package/dist/commands/mutate-execution-status.js +598 -0
- package/dist/commands/mutate-failure-output.js +531 -0
- package/dist/commands/mutate-file-view.js +151 -0
- package/dist/commands/mutate-object-output.js +91 -0
- package/dist/commands/mutate-output-values.js +97 -0
- package/dist/commands/mutate-preview-cache.js +86 -0
- package/dist/commands/mutate-response-replay.js +153 -0
- package/dist/commands/mutate-result-projection.js +818 -0
- package/dist/commands/mutation-eta.js +28 -0
- package/dist/commands/mutation-execution-cache.js +140 -3
- package/dist/commands/mutation-recovery-journal.js +195 -0
- package/dist/commands/normalize-imports.js +1120 -4
- package/dist/commands/object-pack-command.js +546 -0
- package/dist/commands/object-pack-preview-cache.js +88 -0
- package/dist/commands/observability-command.js +47 -3
- package/dist/commands/ota-command.js +403 -2
- package/dist/commands/print-config.js +10 -1
- package/dist/commands/quick-read.js +1113 -11
- package/dist/commands/refactor-batch-builder.js +265 -1
- package/dist/commands/refactor-batch-execution-cache.js +85 -1
- package/dist/commands/refactor-batch-preview-cache.js +96 -2
- package/dist/commands/refactor-batch.js +461 -4
- package/dist/commands/rename-entities.js +794 -4
- package/dist/commands/rename-execution-cache.js +49 -1
- package/dist/commands/rename-input.js +22 -1
- package/dist/commands/rename-polling-policy.js +68 -0
- package/dist/commands/rename-preview-cache.js +96 -2
- package/dist/commands/result-view.js +993 -7
- package/dist/commands/reveal-command.js +445 -5
- package/dist/commands/selector-suggestions.js +93 -0
- package/dist/commands/session-workspace.js +1836 -31
- package/dist/commands/shared.js +2 -1
- package/dist/commands/skills-command.js +315 -0
- package/dist/commands/sync-command.js +59 -2
- package/dist/commands/worker-command.js +173 -1
- package/dist/commands/workspace-cache.js +55 -1
- package/dist/config/defaults.js +26 -1
- package/dist/config/env-vars.js +77 -1
- package/dist/config/glob-match.js +44 -1
- package/dist/config/import-rules.js +165 -1
- package/dist/config/local-config.js +293 -3
- package/dist/config/mutation-comments.js +51 -1
- package/dist/config/path-aliases.js +165 -1
- package/dist/config/path-display.js +84 -1
- package/dist/config/product-storage.js +37 -1
- package/dist/config/request-env.js +21 -0
- package/dist/config/request-routing-context.js +23 -0
- package/dist/config/resolve-command-alias.js +74 -1
- package/dist/config/resolve.js +24 -1
- package/dist/config/tsconfig-discovery.js +113 -1
- package/dist/config/typescript-preferences.js +131 -0
- package/dist/config/workspace-root.js +310 -3
- package/dist/config/workspace-state.js +254 -1
- package/dist/content/content-bundle.js +88 -1
- package/dist/diagnostics/module-plan-timeline.js +75 -2
- package/dist/diagnostics/readiness-text.js +45 -8
- package/dist/dsl/aib-dsl.js +838 -1
- package/dist/dsl/declaration-dsl.js +264 -1
- package/dist/dsl/file-move-to-dir-dsl.js +123 -1
- package/dist/dsl/file-refactor-batch-dsl.js +203 -1
- package/dist/dsl/file-rename-dsl.js +135 -1
- package/dist/dsl/mutate-dsl.js +746 -0
- package/dist/help/bootstrap.bash.md +176 -341
- package/dist/help/bootstrap.md +175 -340
- package/dist/help/bootstrap.pwsh.md +176 -341
- package/dist/help/docs/basics.md +1 -1
- package/dist/help/docs/config-setup.import-normalize.md +65 -65
- package/dist/help/docs/config-setup.import-rules.md +6 -5
- package/dist/help/docs/first-setup.md +6 -5
- package/dist/help/docs/help-protocol.md +4 -3
- package/dist/help/docs/import.base.md +38 -0
- package/dist/help/docs/import.rebase.md +85 -0
- package/dist/help/docs/inspect.aliasCandidates.md +39 -0
- package/dist/help/docs/inspect.code.md +1 -7
- package/dist/help/docs/inspect.file.md +10 -19
- package/dist/help/docs/inspect.graph.md +3 -17
- package/dist/help/{dsl/docs/inspect.md → docs/inspect.shared.md} +13 -12
- package/dist/help/docs/modulePlan.md +24 -28
- package/dist/help/docs/move.md +19 -22
- package/dist/help/{dsl/topics/file.move.md → docs/moveToDir.md} +36 -34
- package/dist/help/docs/mutate.mixed.md +34 -0
- package/dist/help/docs/mutation.shared.md +55 -0
- package/dist/help/docs/patterns.md +3 -12
- package/dist/help/docs/qr.md +12 -6
- package/dist/help/docs/quick-map.md +36 -24
- package/dist/help/docs/recipe.file-layout.md +10 -10
- package/dist/help/docs/recipe.import-boundary.md +92 -0
- package/dist/help/docs/recipe.safe-artifact-probing.md +68 -0
- package/dist/help/docs/recipe.unfamiliar-area.md +64 -0
- package/dist/help/docs/recipes.md +20 -0
- package/dist/help/docs/rename.md +19 -27
- package/dist/help/docs/renameFile.md +36 -0
- package/dist/help/docs/rules.md +26 -0
- package/dist/help/dsl/bootstrap.bash.md +176 -341
- package/dist/help/dsl/bootstrap.md +175 -340
- package/dist/help/dsl/bootstrap.pwsh.md +176 -341
- package/dist/help/dsl/docs/basics.md +1 -1
- package/dist/help/dsl/docs/config-setup.import-normalize.md +65 -65
- package/dist/help/dsl/docs/config-setup.import-rules.md +6 -5
- package/dist/help/dsl/docs/first-setup.md +6 -5
- package/dist/help/dsl/docs/help-protocol.md +4 -3
- package/dist/help/dsl/docs/import.base.md +38 -0
- package/dist/help/dsl/docs/import.rebase.md +85 -0
- package/dist/help/dsl/docs/inspect.aliasCandidates.md +39 -0
- package/dist/help/dsl/docs/inspect.code.md +1 -7
- package/dist/help/dsl/docs/inspect.file.md +10 -19
- package/dist/help/dsl/docs/inspect.graph.md +3 -17
- package/dist/help/{docs/inspect.md → dsl/docs/inspect.shared.md} +13 -12
- package/dist/help/dsl/docs/modulePlan.md +24 -28
- package/dist/help/dsl/docs/move.md +19 -22
- package/dist/help/{topics/file.move.md → dsl/docs/moveToDir.md} +36 -34
- package/dist/help/dsl/docs/mutate.mixed.md +34 -0
- package/dist/help/dsl/docs/mutation.shared.md +55 -0
- package/dist/help/dsl/docs/patterns.md +3 -12
- package/dist/help/dsl/docs/qr.md +12 -6
- package/dist/help/dsl/docs/quick-map.md +36 -24
- package/dist/help/dsl/docs/recipe.file-layout.md +10 -10
- package/dist/help/dsl/docs/recipe.import-boundary.md +92 -0
- package/dist/help/dsl/docs/recipe.safe-artifact-probing.md +68 -0
- package/dist/help/dsl/docs/recipe.unfamiliar-area.md +64 -0
- package/dist/help/dsl/docs/recipes.md +20 -0
- package/dist/help/dsl/docs/rename.md +19 -27
- package/dist/help/dsl/docs/renameFile.md +36 -0
- package/dist/help/dsl/docs/rules.md +26 -0
- package/dist/help/dsl/full.md +175 -340
- package/dist/help/dsl/help-index.md +48 -43
- package/dist/help/dsl/snippets/agents.md +2 -2
- package/dist/help/dsl/tokens/qr.inline.examples.md +1 -1
- package/dist/help/dsl/topics/basics.md +1 -1
- package/dist/help/dsl/topics/config-setup.import-normalize.md +65 -65
- package/dist/help/dsl/topics/config-setup.import-rules.md +6 -5
- package/dist/help/dsl/topics/first-setup.md +6 -5
- package/dist/help/dsl/topics/help-protocol.md +4 -3
- package/dist/help/dsl/topics/import.base.md +36 -0
- package/dist/help/dsl/topics/import.rebase.md +83 -0
- package/dist/help/dsl/topics/inspect.aliasCandidates.md +37 -0
- package/dist/help/dsl/topics/inspect.code.md +1 -7
- package/dist/help/dsl/topics/inspect.file.md +10 -19
- package/dist/help/dsl/topics/inspect.graph.md +3 -17
- package/dist/help/dsl/topics/{inspect.md → inspect.shared.md} +13 -12
- package/dist/help/dsl/topics/modulePlan.md +21 -26
- package/dist/help/dsl/topics/move.md +17 -18
- package/dist/help/{docs/file.move.md → dsl/topics/moveToDir.md} +33 -35
- package/dist/help/dsl/topics/mutate.mixed.md +32 -0
- package/dist/help/dsl/topics/mutation.shared.md +53 -0
- package/dist/help/dsl/topics/patterns.md +3 -12
- package/dist/help/dsl/topics/qr.md +12 -6
- package/dist/help/dsl/topics/quick-map.md +36 -24
- package/dist/help/dsl/topics/recipe.file-layout.md +10 -10
- package/dist/help/dsl/topics/recipe.import-boundary.md +90 -0
- package/dist/help/dsl/topics/recipe.safe-artifact-probing.md +66 -0
- package/dist/help/dsl/topics/recipe.unfamiliar-area.md +62 -0
- package/dist/help/dsl/topics/recipes.md +18 -0
- package/dist/help/dsl/topics/rename.md +15 -15
- package/dist/help/dsl/topics/renameFile.md +34 -0
- package/dist/help/dsl/topics/rules.md +24 -0
- package/dist/help/full.md +175 -340
- package/dist/help/help-index.md +48 -43
- package/dist/help/help-meta.json +98 -48
- package/dist/help/index.md +52 -20
- package/dist/help/snippets/agents.md +2 -2
- package/dist/help/tokens/qr.inline.examples.md +1 -1
- package/dist/help/topics/basics.md +1 -1
- package/dist/help/topics/config-setup.import-normalize.md +65 -65
- package/dist/help/topics/config-setup.import-rules.md +6 -5
- package/dist/help/topics/first-setup.md +6 -5
- package/dist/help/topics/help-protocol.md +4 -3
- package/dist/help/topics/import.base.md +36 -0
- package/dist/help/topics/import.rebase.md +83 -0
- package/dist/help/topics/inspect.aliasCandidates.md +37 -0
- package/dist/help/topics/inspect.code.md +1 -7
- package/dist/help/topics/inspect.file.md +10 -19
- package/dist/help/topics/inspect.graph.md +3 -17
- package/dist/help/topics/{inspect.md → inspect.shared.md} +13 -12
- package/dist/help/topics/modulePlan.md +21 -26
- package/dist/help/topics/move.md +17 -18
- package/dist/help/{dsl/docs/file.move.md → topics/moveToDir.md} +33 -35
- package/dist/help/topics/mutate.mixed.md +32 -0
- package/dist/help/topics/mutation.shared.md +53 -0
- package/dist/help/topics/patterns.md +3 -12
- package/dist/help/topics/qr.md +12 -6
- package/dist/help/topics/quick-map.md +36 -24
- package/dist/help/topics/recipe.file-layout.md +10 -10
- package/dist/help/topics/recipe.import-boundary.md +90 -0
- package/dist/help/topics/recipe.safe-artifact-probing.md +66 -0
- package/dist/help/topics/recipe.unfamiliar-area.md +62 -0
- package/dist/help/topics/recipes.md +18 -0
- package/dist/help/topics/rename.md +15 -15
- package/dist/help/topics/renameFile.md +34 -0
- package/dist/help/topics/rules.md +24 -0
- package/dist/host/capabilities.js +56 -1
- package/dist/imports/standalone-import-analysis.js +602 -0
- package/dist/imports/standalone-import-model.js +2 -0
- package/dist/imports/standalone-import-process.js +66 -0
- package/dist/imports/standalone-import-worker.js +27 -0
- package/dist/imports/standalone-ts-project.js +147 -0
- package/dist/inspect/inspect-duplicates-service.js +526 -0
- package/dist/inspect/inspect-reverse-module-closure.js +338 -0
- package/dist/inspect/inspect-source-ranges.js +82 -0
- package/dist/inspect/inspect-source-shape.js +649 -0
- package/dist/inspect/standalone-inspect-analysis.js +319 -0
- package/dist/inspect/standalone-inspect-model.js +9 -0
- package/dist/inspect/standalone-inspect-process.js +55 -0
- package/dist/inspect/standalone-inspect-usages.js +274 -0
- package/dist/inspect/standalone-inspect-worker.js +13 -0
- package/dist/metrics/central-metrics.js +101 -2
- package/dist/mutation/concrete-edit-plan.js +157 -0
- package/dist/mutation/exports-star-collapse-preview.js +361 -0
- package/dist/mutation/exports-star-expand-apply.js +373 -0
- package/dist/mutation/exports-star-expand-preview.js +807 -0
- package/dist/mutation/file-impact-scan.js +182 -0
- package/dist/mutation/file-mutation-discovery.js +674 -0
- package/dist/mutation/file-mutation-eta.js +99 -0
- package/dist/mutation/file-mutation-standalone-apply.js +584 -0
- package/dist/mutation/file-mutation-standalone-planner.js +500 -0
- package/dist/mutation/file-mutation-tsserver-session.js +473 -0
- package/dist/mutation/mutation-estimate.js +45 -0
- package/dist/mutation/mutation-plan.js +467 -0
- package/dist/mutation/object-mutation-foundation.js +2 -0
- package/dist/mutation/object-mutation-partition.js +148 -0
- package/dist/mutation/object-pack-semantic-apply.js +507 -0
- package/dist/mutation/object-pack-semantic-preview.js +984 -0
- package/dist/mutation/object-unpack-semantic-preview.js +993 -0
- package/dist/mutation/package-manifest-impact.js +176 -0
- package/dist/mutation/rename-owner-worker-child.js +37 -0
- package/dist/mutation/rename-owner-worker.js +122 -0
- package/dist/mutation/runtime-cycle-query.js +66 -0
- package/dist/mutation/semantic-execution-progress.js +63 -0
- package/dist/mutation/semantic-export-index.js +474 -0
- package/dist/mutation/semantic-impact-scan.js +434 -0
- package/dist/mutation/semantic-model.js +2 -0
- package/dist/mutation/semantic-move-best-effort-planner.js +209 -0
- package/dist/mutation/semantic-move-config-worker-child.js +61 -0
- package/dist/mutation/semantic-move-config-worker.js +449 -0
- package/dist/mutation/semantic-move-declarations.js +94 -0
- package/dist/mutation/semantic-move-metrics.js +119 -0
- package/dist/mutation/semantic-move-model.js +2 -0
- package/dist/mutation/semantic-move-owner-authority.js +122 -0
- package/dist/mutation/semantic-move-owner-candidates.js +300 -0
- package/dist/mutation/semantic-move-owner-divergence-harness.js +474 -0
- package/dist/mutation/semantic-move-owner-divergence-runner.js +162 -0
- package/dist/mutation/semantic-move-plan-hash.js +56 -0
- package/dist/mutation/semantic-move-policy.js +360 -0
- package/dist/mutation/semantic-move-process.js +218 -0
- package/dist/mutation/semantic-move-provider-diagnostics.js +27 -0
- package/dist/mutation/semantic-move-standalone-engine.js +919 -0
- package/dist/mutation/semantic-move-standalone-planner.js +1553 -0
- package/dist/mutation/semantic-move-transaction.js +639 -0
- package/dist/mutation/semantic-mutation-engine.js +478 -0
- package/dist/mutation/semantic-mutation-runtime.js +521 -0
- package/dist/mutation/semantic-planner-retry.js +26 -0
- package/dist/mutation/semantic-program-roots.js +69 -0
- package/dist/mutation/semantic-rename-commonjs.js +229 -0
- package/dist/mutation/semantic-rename-config-worker-child.js +46 -0
- package/dist/mutation/semantic-rename-config-worker.js +498 -0
- package/dist/mutation/semantic-rename-locations.js +192 -0
- package/dist/mutation/semantic-rename-model.js +2 -0
- package/dist/mutation/semantic-rename-process.js +210 -0
- package/dist/mutation/semantic-rename-standalone-engine.js +302 -0
- package/dist/mutation/semantic-rename-standalone-planner.js +567 -0
- package/dist/mutation/semantic-rename-transaction.js +333 -0
- package/dist/mutation/semantic-unused-import-cleanup.js +248 -0
- package/dist/mutation/semantic-worker-retry.js +40 -0
- package/dist/mutation/semantic-workspace.js +804 -0
- package/dist/mutation/targeted-import-canonicalizer.js +359 -0
- package/dist/observability/config.js +206 -1
- package/dist/observability/context.js +59 -1
- package/dist/observability/failure-snapshot.js +124 -2
- package/dist/observability/recent.js +63 -2
- package/dist/payloads/read-stdin-json.js +212 -1
- package/dist/rg-wrapper/core.js +714 -6
- package/dist/rg-wrapper/options.js +125 -1
- package/dist/rtk-wrapper/core.js +144 -2
- package/dist/rtk-wrapper/git-safety.js +203 -0
- package/dist/rtk-wrapper/output-adapter.js +106 -0
- package/dist/runtime/buffered-process.js +114 -0
- package/dist/runtime/bundled-node.js +97 -1
- package/dist/runtime/command-lifecycle.js +2 -0
- package/dist/runtime/input-source.js +238 -1
- package/dist/runtime/node-cli-identity.js +37 -0
- package/dist/runtime/run-command.js +191 -1
- package/dist/selectors/parse-entities.js +84 -1
- package/dist/semantic/semantic-context-pool.js +830 -0
- package/dist/semantic/semantic-context-provider.js +416 -0
- package/dist/semantic/semantic-resident-admission.js +38 -0
- package/dist/semantic/semantic-worker-child.js +40 -0
- package/dist/semantic/semantic-worker-manager.js +460 -0
- package/dist/semantic/semantic-worker-protocol.js +2 -0
- package/dist/semantic/semantic-worker-runtime.js +38 -0
- package/dist/semantic/workspace-semantic-context-pools.js +136 -0
- package/dist/session/client.js +359 -1
- package/dist/session/daemon-state.js +185 -2
- package/dist/session/external-tool-coordinator.js +88 -0
- package/dist/session/external-tool-request.js +52 -0
- package/dist/session/lane-owner.js +116 -0
- package/dist/session/paths.js +71 -1
- package/dist/session/runtime-lifecycle.js +225 -0
- package/dist/session/runtime-shutdown.js +95 -0
- package/dist/session/server.js +1194 -7
- package/dist/session/session-health.js +27 -0
- package/dist/shared/agent-text.js +29 -1
- package/dist/shared/errors.js +496 -30
- package/dist/shared/event-loop.js +6 -1
- package/dist/shared/hints.js +37 -1
- package/dist/shared/metrics.js +43 -1
- package/dist/shared/presentation.js +69 -4
- package/dist/shared/stdin-examples.js +77 -1
- package/dist/shared/stdout.js +6 -2
- package/dist/shared/types.js +23 -1
- package/dist/tool-runtime/runtime-tools.js +120 -1
- package/dist/topology/availability.js +663 -0
- package/dist/topology/cache.js +130 -0
- package/dist/topology/candidates.js +372 -0
- package/dist/topology/core.js +903 -0
- package/dist/topology/dependency-snapshot.js +189 -0
- package/dist/topology/model.js +2 -0
- package/dist/topology/scope.js +100 -0
- package/dist/topology/ts-oracle-batch.js +529 -0
- package/dist/topology/ts-oracle-host.js +69 -0
- package/dist/topology/ts-oracle-model.js +2 -0
- package/dist/topology/ts-oracle.js +224 -0
- package/dist/topology/tsconfig-loader.js +105 -0
- package/dist/topology/workspace-project-index.js +542 -0
- package/dist/tracing/config.js +192 -2
- package/dist/tracing/failure-summary.js +100 -0
- package/dist/tracing/trace.js +318 -5
- package/dist/tsc-wrapper/core.js +697 -0
- package/dist/workers/control-plane/aib-control-plane-worker.cjs +32 -32
- package/dist/workers/control-plane/client-config.default.json +3 -3
- package/dist/workers/lexical-worker-child.js +27 -0
- package/dist/workers/lexical-worker-manager.js +394 -0
- package/dist/workers/lexical-worker-protocol.js +2 -0
- package/dist/workers/lexical-worker-runtime.js +25 -0
- package/dist/workers/owned-one-shot-process.js +115 -0
- package/dist/workers/product-storage.js +23 -1
- package/dist/workers/registry.js +241 -1
- package/package.json +8 -13
- package/scripts/postinstall.cjs +29 -29
- package/scripts/provision-runtime.cjs +411 -459
- package/dist/client/http-client.js +0 -1
- package/dist/client/transport-options.js +0 -1
- package/dist/client/websocket-client.js +0 -1
- package/dist/commands/entity-resolution.js +0 -1
- package/dist/commands/file-command.js +0 -1
- package/dist/commands/host-command.js +0 -1
- package/dist/commands/inspect-symbol-query.js +0 -1
- package/dist/commands/list-instances.js +0 -1
- package/dist/commands/module-plan-command.js +0 -1
- package/dist/commands/move-command.js +0 -1
- package/dist/commands/move-to-file.js +0 -2
- package/dist/commands/ping.js +0 -1
- package/dist/commands/refactor-command.js +0 -1
- package/dist/commands/rename-command.js +0 -1
- package/dist/commands/runtime-command.js +0 -4
- package/dist/commands/runtime-info.js +0 -1
- package/dist/commands/validate-module-plan.js +0 -2
- package/dist/compatibility/policy.js +0 -1
- package/dist/config/auto-start-ide.js +0 -1
- package/dist/discovery/registry.js +0 -1
- package/dist/discovery/select-instance.js +0 -1
- package/dist/help/docs/file.rename.md +0 -35
- package/dist/help/docs/mutation.md +0 -60
- package/dist/help/docs/refactor.batch.md +0 -44
- package/dist/help/dsl/docs/file.rename.md +0 -35
- package/dist/help/dsl/docs/mutation.md +0 -60
- package/dist/help/dsl/docs/refactor.batch.md +0 -44
- package/dist/help/dsl/topics/file.rename.md +0 -33
- package/dist/help/dsl/topics/mutation.md +0 -58
- package/dist/help/dsl/topics/refactor.batch.md +0 -33
- package/dist/help/topics/file.rename.md +0 -33
- package/dist/help/topics/mutation.md +0 -58
- package/dist/help/topics/refactor.batch.md +0 -33
- package/dist/ide-launch/common.cjs +0 -162
- package/dist/managed-host/extension-vsix-resolver.js +0 -1
- package/dist/managed-host/manage-serve-web-host.cjs +0 -141
- package/dist/managed-host/serve-web-autostart.js +0 -1
- package/dist/managed-host/serve-web-host.cjs +0 -2115
- package/dist/runtime/managed-runtime-provisioning.js +0 -1
- package/dist/shared/diagnostic-catalog.js +0 -1
- package/dist/shared/diagnostics.js +0 -1
- package/dist/shared/operations.js +0 -1
- package/dist/shared/protocol.js +0 -1
- package/dist/shared/routes.js +0 -1
- package/extension/vscode-refactor-bridge-extension.vsix +0 -0
- package/runtimes/launcher/linux-x64/aib +0 -0
- package/runtimes/launcher/win-x64/aib.exe +0 -0
|
@@ -0,0 +1,984 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.planObjectPackSemanticPreview = planObjectPackSemanticPreview;
|
|
40
|
+
exports.validateVirtualProjectDiagnostics = validateVirtualProjectDiagnostics;
|
|
41
|
+
const crypto = __importStar(require("node:crypto"));
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
45
|
+
const targeted_import_canonicalizer_1 = require("./targeted-import-canonicalizer");
|
|
46
|
+
const concrete_edit_plan_1 = require("./concrete-edit-plan");
|
|
47
|
+
const object_mutation_partition_1 = require("./object-mutation-partition");
|
|
48
|
+
const semantic_workspace_1 = require("./semantic-workspace");
|
|
49
|
+
const runtime_cycle_query_1 = require("./runtime-cycle-query");
|
|
50
|
+
function planObjectPackSemanticPreview(cwd, input) {
|
|
51
|
+
return (0, object_mutation_partition_1.planBestEffortObjectMutation)(input.rows, (rows) => planObjectPackSemanticPreviewStrict(cwd, { sourceFile: input.sourceFile, rows }), { blocksWholeGroup: (issue) => !issue.selector });
|
|
52
|
+
}
|
|
53
|
+
function planObjectPackSemanticPreviewStrict(cwd, input) {
|
|
54
|
+
const root = path.resolve(cwd);
|
|
55
|
+
const sourceFile = path.resolve(root, input.sourceFile);
|
|
56
|
+
const displaySource = toRepoPath(root, sourceFile);
|
|
57
|
+
const rows = input.rows.map((row) => ({
|
|
58
|
+
objectName: row.objectName,
|
|
59
|
+
selectors: [...new Set(row.selectors)].sort()
|
|
60
|
+
})).sort((left, right) => left.objectName.localeCompare(right.objectName));
|
|
61
|
+
const unsupported = [];
|
|
62
|
+
if (!isSupportedSourceExtension(sourceFile)) {
|
|
63
|
+
unsupported.push({
|
|
64
|
+
code: "OBJECT_PACK_SOURCE_KIND_UNSUPPORTED",
|
|
65
|
+
message: "object.pack semantic preview supports TS/TSX/MTS ESM sources only",
|
|
66
|
+
file: displaySource
|
|
67
|
+
});
|
|
68
|
+
return failure(displaySource, rows, unsupported);
|
|
69
|
+
}
|
|
70
|
+
const workspace = (0, semantic_workspace_1.createSemanticWorkspace)({ workspaceRoot: root, focusFiles: [sourceFile] });
|
|
71
|
+
const moduleCollection = (0, semantic_workspace_1.collectSemanticModuleEdges)(workspace);
|
|
72
|
+
let moduleScope = (0, semantic_workspace_1.scopeRelevantSemanticModuleEdges)(workspace, moduleCollection, {
|
|
73
|
+
sourceFiles: [displaySource]
|
|
74
|
+
});
|
|
75
|
+
if (!moduleScope.coverage.complete) {
|
|
76
|
+
unsupported.push(...moduleScope.coverage.incompleteReasons.map(toCoverageEvidence));
|
|
77
|
+
unsupported.push({
|
|
78
|
+
code: "OBJECT_PACK_CYCLE_EVIDENCE_UNAVAILABLE",
|
|
79
|
+
message: "runtime cycle evidence is unavailable because semantic coverage is incomplete",
|
|
80
|
+
file: displaySource
|
|
81
|
+
});
|
|
82
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
83
|
+
}
|
|
84
|
+
const sourceProjects = (0, semantic_workspace_1.ownersForSemanticFile)(workspace, sourceFile);
|
|
85
|
+
if (sourceProjects.length > 1) {
|
|
86
|
+
unsupported.push({
|
|
87
|
+
code: "OBJECT_PACK_MULTIPLE_OWNERS_UNSUPPORTED",
|
|
88
|
+
message: "object.pack semantic preview requires exactly one owning project in M2",
|
|
89
|
+
file: displaySource,
|
|
90
|
+
details: sourceProjects.map((project) => toRepoPath(root, project.config.file))
|
|
91
|
+
});
|
|
92
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
93
|
+
}
|
|
94
|
+
if (sourceProjects.length === 0 || sourceProjects.some((project) => {
|
|
95
|
+
const source = project.program.getSourceFile(sourceFile);
|
|
96
|
+
return !source || !isEsmSourceFile(project, source);
|
|
97
|
+
})) {
|
|
98
|
+
unsupported.push({
|
|
99
|
+
code: "OBJECT_PACK_ESM_REQUIRED",
|
|
100
|
+
message: "object.pack semantic preview requires an ESM source in its owning project",
|
|
101
|
+
file: displaySource
|
|
102
|
+
});
|
|
103
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
104
|
+
}
|
|
105
|
+
const sourceProject = sourceProjects[0];
|
|
106
|
+
const source = sourceProject.program.getSourceFile(sourceFile);
|
|
107
|
+
const selected = resolveSelectedMembers(workspace, sourceProject, source, rows, unsupported);
|
|
108
|
+
validateVariableStatements(selected, unsupported, displaySource);
|
|
109
|
+
if (unsupported.length > 0) {
|
|
110
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
111
|
+
}
|
|
112
|
+
const selectedByKey = new Map(selected.map((member) => [member.symbol.key, member]));
|
|
113
|
+
const usageReplacements = new Map();
|
|
114
|
+
const externalReferenceCounts = new Map();
|
|
115
|
+
for (const member of selected) {
|
|
116
|
+
member.usages = (0, semantic_workspace_1.findSemanticReferences)(workspace, member.symbol);
|
|
117
|
+
}
|
|
118
|
+
moduleScope = (0, semantic_workspace_1.scopeRelevantSemanticModuleEdges)(workspace, moduleCollection, {
|
|
119
|
+
sourceFiles: [displaySource],
|
|
120
|
+
affectedFiles: selected.flatMap((member) => member.usages.map((usage) => usage.file))
|
|
121
|
+
});
|
|
122
|
+
if (!moduleScope.coverage.complete) {
|
|
123
|
+
unsupported.push(...moduleScope.coverage.incompleteReasons.map(toCoverageEvidence));
|
|
124
|
+
unsupported.push({
|
|
125
|
+
code: "OBJECT_PACK_CYCLE_EVIDENCE_UNAVAILABLE",
|
|
126
|
+
message: "runtime cycle evidence is unavailable because relevant module resolution is incomplete",
|
|
127
|
+
file: displaySource
|
|
128
|
+
});
|
|
129
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
130
|
+
}
|
|
131
|
+
if (moduleScope.edges.some((edge) => edge.kind === "dynamic" && edge.toFile === displaySource)) {
|
|
132
|
+
unsupported.push({
|
|
133
|
+
code: "OBJECT_PACK_DYNAMIC_IMPORT_UNSUPPORTED",
|
|
134
|
+
message: "dynamic imports of the packed source are not supported",
|
|
135
|
+
file: displaySource
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (moduleScope.edges.some((edge) => edge.kind === "require" && edge.toFile === displaySource)) {
|
|
139
|
+
unsupported.push({
|
|
140
|
+
code: "OBJECT_PACK_REQUIRE_UNSUPPORTED",
|
|
141
|
+
message: "CommonJS require of the packed source is not supported",
|
|
142
|
+
file: displaySource
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
validateRequireConsumers(workspace, sourceFile, unsupported);
|
|
146
|
+
const cycleEvidence = (0, runtime_cycle_query_1.queryRuntimeCycleEvidence)(moduleScope.edges, [displaySource]);
|
|
147
|
+
if (cycleEvidence.cycles.length > 0) {
|
|
148
|
+
unsupported.push({
|
|
149
|
+
code: "OBJECT_PACK_RUNTIME_CYCLE_UNSUPPORTED",
|
|
150
|
+
message: "packed source participates in a runtime import cycle; initialization order cannot be preserved safely",
|
|
151
|
+
file: displaySource,
|
|
152
|
+
details: cycleEvidence.cycles
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
validateAffectedFileOwnership(workspace, sourceFile, selected, moduleScope.edges, unsupported);
|
|
156
|
+
if (unsupported.length > 0) {
|
|
157
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
158
|
+
}
|
|
159
|
+
for (const member of selected) {
|
|
160
|
+
validateAndPlanUsages(workspace, sourceFile, member, usageReplacements, externalReferenceCounts, unsupported);
|
|
161
|
+
}
|
|
162
|
+
const importTransforms = planConsumerImports(workspace, sourceFile, selectedByKey, unsupported);
|
|
163
|
+
validateReExports(workspace, sourceFile, selectedByKey, unsupported);
|
|
164
|
+
if (unsupported.length > 0) {
|
|
165
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
166
|
+
}
|
|
167
|
+
const sourceText = fs.readFileSync(sourceFile, "utf8");
|
|
168
|
+
const sourceNext = buildSourceText(source, sourceText, selected, rows);
|
|
169
|
+
const virtualTexts = new Map([[displaySource, sourceNext]]);
|
|
170
|
+
const consumerSummaries = [];
|
|
171
|
+
const consumerFiles = new Set([
|
|
172
|
+
...usageReplacements.keys(),
|
|
173
|
+
...importTransforms.keys()
|
|
174
|
+
]);
|
|
175
|
+
for (const file of [...consumerFiles].sort()) {
|
|
176
|
+
if ((0, semantic_workspace_1.canonicalPathIdentity)(path.resolve(root, file)) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const absolute = path.resolve(root, file);
|
|
180
|
+
const original = fs.readFileSync(absolute, "utf8");
|
|
181
|
+
const replacements = [
|
|
182
|
+
...(usageReplacements.get(file) ?? []),
|
|
183
|
+
...(importTransforms.get(file)?.replacements ?? [])
|
|
184
|
+
];
|
|
185
|
+
const rewritten = applyReplacements(original, replacements);
|
|
186
|
+
const canonicalized = (0, targeted_import_canonicalizer_1.formatChangedNamedImports)(original, rewritten, absolute).text;
|
|
187
|
+
if (canonicalized !== original) {
|
|
188
|
+
virtualTexts.set(file, canonicalized);
|
|
189
|
+
consumerSummaries.push({
|
|
190
|
+
file,
|
|
191
|
+
text: canonicalized,
|
|
192
|
+
objectNames: importTransforms.get(file)?.objectNames ?? [],
|
|
193
|
+
selectors: importTransforms.get(file)?.selectors ?? [],
|
|
194
|
+
referenceCount: externalReferenceCounts.get(file) ?? 0
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!moduleShapesUnchanged(root, virtualTexts)) {
|
|
199
|
+
unsupported.push({
|
|
200
|
+
code: "OBJECT_PACK_MODULE_EDGE_CHANGE_UNSUPPORTED",
|
|
201
|
+
message: "planned edits change module edge shape; cycle evidence is no longer sufficient",
|
|
202
|
+
file: displaySource
|
|
203
|
+
});
|
|
204
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
205
|
+
}
|
|
206
|
+
const diagnostics = validateVirtualProjectDiagnostics(workspace, virtualTexts);
|
|
207
|
+
if (diagnostics.added.length > 0) {
|
|
208
|
+
unsupported.push({
|
|
209
|
+
code: "OBJECT_PACK_NEW_DIAGNOSTICS",
|
|
210
|
+
message: "virtual object.pack edits introduce new project diagnostics",
|
|
211
|
+
file: displaySource,
|
|
212
|
+
details: diagnostics.added
|
|
213
|
+
});
|
|
214
|
+
return failure(displaySource, rows, unsupported, moduleScope.coverage);
|
|
215
|
+
}
|
|
216
|
+
const edits = [...virtualTexts.entries()].map(([file, text]) => ({
|
|
217
|
+
file,
|
|
218
|
+
start: 0,
|
|
219
|
+
end: fs.readFileSync(path.resolve(root, file), "utf8").length,
|
|
220
|
+
text,
|
|
221
|
+
reason: file === displaySource ? "object.pack source preview" : "object.pack consumer preview"
|
|
222
|
+
})).sort((left, right) => left.file.localeCompare(right.file));
|
|
223
|
+
const beforeHashes = (0, concrete_edit_plan_1.createConcretePreconditions)(root, edits);
|
|
224
|
+
const symbols = selected.map((member) => member.symbol).sort((left, right) => left.key.localeCompare(right.key));
|
|
225
|
+
const usages = selected.flatMap((member) => member.usages).sort(compareUsages);
|
|
226
|
+
const fingerprintModuleEdges = collectFingerprintModuleEdges(moduleScope.edges, displaySource);
|
|
227
|
+
const rowFingerprints = rows.map((row) => {
|
|
228
|
+
const rowMembers = selected.filter((member) => member.objectName === row.objectName);
|
|
229
|
+
const rowKeys = new Set(rowMembers.map((member) => member.symbol.key));
|
|
230
|
+
return (0, concrete_edit_plan_1.createSemanticFingerprint)({
|
|
231
|
+
intent: {
|
|
232
|
+
operation: "object.pack",
|
|
233
|
+
sourceFile: displaySource,
|
|
234
|
+
objectName: row.objectName,
|
|
235
|
+
members: row.selectors,
|
|
236
|
+
exportMode: "named"
|
|
237
|
+
},
|
|
238
|
+
projects: moduleScope.coverage.projects,
|
|
239
|
+
symbols: rowMembers.map((member) => member.symbol),
|
|
240
|
+
references: usages.filter((usage) => rowKeys.has(usage.symbol.key)),
|
|
241
|
+
moduleEdges: fingerprintModuleEdges
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
const semanticFingerprint = sha256(rowFingerprints.join("\0"));
|
|
245
|
+
return {
|
|
246
|
+
ok: true,
|
|
247
|
+
operation: "exports.object.pack.preview",
|
|
248
|
+
sourceFile: displaySource,
|
|
249
|
+
objectCount: rows.length,
|
|
250
|
+
memberCount: selected.length,
|
|
251
|
+
importerCount: consumerSummaries.length,
|
|
252
|
+
referenceCount: consumerSummaries.reduce((sum, item) => sum + item.referenceCount, 0),
|
|
253
|
+
objects: rows,
|
|
254
|
+
importers: consumerSummaries.map((item) => ({
|
|
255
|
+
file: item.file,
|
|
256
|
+
objectNames: item.objectNames,
|
|
257
|
+
selectors: item.selectors,
|
|
258
|
+
referenceCount: item.referenceCount
|
|
259
|
+
})),
|
|
260
|
+
filesTouched: edits.map((edit) => edit.file),
|
|
261
|
+
filesWritten: [],
|
|
262
|
+
semanticFingerprint,
|
|
263
|
+
rowFingerprints,
|
|
264
|
+
edits,
|
|
265
|
+
beforeHashes,
|
|
266
|
+
coverage: moduleScope.coverage,
|
|
267
|
+
symbols,
|
|
268
|
+
usages,
|
|
269
|
+
moduleEdges: fingerprintModuleEdges,
|
|
270
|
+
cycleEvidence,
|
|
271
|
+
diagnostics,
|
|
272
|
+
unsupported: []
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function validateVirtualProjectDiagnostics(workspace, virtualTexts) {
|
|
276
|
+
const overrides = new Map([...virtualTexts.entries()].map(([file, text]) => [
|
|
277
|
+
(0, semantic_workspace_1.canonicalPathIdentity)(path.resolve(workspace.root, file)),
|
|
278
|
+
text
|
|
279
|
+
]));
|
|
280
|
+
const baseline = new Map();
|
|
281
|
+
const next = new Map();
|
|
282
|
+
for (const project of workspace.projects) {
|
|
283
|
+
for (const diagnostic of typescript_1.default.getPreEmitDiagnostics(project.program)) {
|
|
284
|
+
baseline.set(diagnosticKey(workspace.root, diagnostic), diagnostic);
|
|
285
|
+
}
|
|
286
|
+
const options = project.config.parsed.options;
|
|
287
|
+
const host = typescript_1.default.createCompilerHost(options);
|
|
288
|
+
const originalReadFile = host.readFile.bind(host);
|
|
289
|
+
host.readFile = (file) => overrides.get((0, semantic_workspace_1.canonicalPathIdentity)(file)) ?? originalReadFile(file);
|
|
290
|
+
host.getSourceFile = (file, languageVersion, onError) => {
|
|
291
|
+
const text = host.readFile(file);
|
|
292
|
+
if (text === undefined) {
|
|
293
|
+
onError?.(`Unable to read ${file}`);
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
return typescript_1.default.createSourceFile(file, text, languageVersion, true, scriptKindForFile(file));
|
|
297
|
+
};
|
|
298
|
+
const program = typescript_1.default.createProgram({
|
|
299
|
+
rootNames: project.program.getRootFileNames(),
|
|
300
|
+
options,
|
|
301
|
+
host
|
|
302
|
+
});
|
|
303
|
+
for (const diagnostic of typescript_1.default.getPreEmitDiagnostics(program)) {
|
|
304
|
+
next.set(diagnosticKey(workspace.root, diagnostic), diagnostic);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const added = [...next.entries()]
|
|
308
|
+
.filter(([key]) => !baseline.has(key))
|
|
309
|
+
.map(([, diagnostic]) => toObjectDiagnostic(workspace.root, diagnostic))
|
|
310
|
+
.sort((left, right) => (left.file ?? "").localeCompare(right.file ?? "") || left.code.localeCompare(right.code));
|
|
311
|
+
return { baselineCount: baseline.size, nextCount: next.size, added };
|
|
312
|
+
}
|
|
313
|
+
function resolveSelectedMembers(workspace, sourceProject, source, rows, unsupported) {
|
|
314
|
+
const selected = [];
|
|
315
|
+
const selectorOwners = new Map();
|
|
316
|
+
const objectNames = new Set();
|
|
317
|
+
for (const row of rows) {
|
|
318
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(row.objectName)) {
|
|
319
|
+
unsupported.push({ code: "OBJECT_PACK_OBJECT_NAME_INVALID", message: "object name must be a valid identifier", objectName: row.objectName });
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (objectNames.has(row.objectName)) {
|
|
323
|
+
unsupported.push({ code: "OBJECT_PACK_DUPLICATE_OBJECT", message: "object name is used by more than one row", objectName: row.objectName });
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
objectNames.add(row.objectName);
|
|
327
|
+
if (sourceProject.checker.resolveName(row.objectName, source, typescript_1.default.SymbolFlags.Value | typescript_1.default.SymbolFlags.Type | typescript_1.default.SymbolFlags.Namespace, false)) {
|
|
328
|
+
unsupported.push({
|
|
329
|
+
code: "OBJECT_PACK_OBJECT_COLLISION",
|
|
330
|
+
message: "object name already resolves in source scope",
|
|
331
|
+
objectName: row.objectName,
|
|
332
|
+
file: toRepoPath(workspace.root, source.fileName)
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
for (const selector of row.selectors) {
|
|
336
|
+
if (selectorOwners.has(selector)) {
|
|
337
|
+
unsupported.push({
|
|
338
|
+
code: "OBJECT_PACK_SELECTOR_OVERLAP",
|
|
339
|
+
message: `selector is already assigned to ${selectorOwners.get(selector)}`,
|
|
340
|
+
selector,
|
|
341
|
+
objectName: row.objectName
|
|
342
|
+
});
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
selectorOwners.set(selector, row.objectName);
|
|
346
|
+
const resolution = (0, semantic_workspace_1.resolveExportedSemanticSymbol)(workspace, source.fileName, selector);
|
|
347
|
+
if (resolution.status !== "resolved" || !resolution.symbol) {
|
|
348
|
+
unsupported.push({
|
|
349
|
+
code: resolution.status === "ambiguous" ? "OBJECT_PACK_SELECTOR_AMBIGUOUS" : "OBJECT_PACK_SELECTOR_NOT_FOUND",
|
|
350
|
+
message: resolution.status === "ambiguous" ? "exported selector resolves differently across owning projects" : "exported selector was not found",
|
|
351
|
+
selector,
|
|
352
|
+
objectName: row.objectName,
|
|
353
|
+
details: resolution.reason
|
|
354
|
+
});
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
if ((resolution.symbol.flags & (typescript_1.default.SymbolFlags.Class | typescript_1.default.SymbolFlags.Enum | typescript_1.default.SymbolFlags.NamespaceModule |
|
|
358
|
+
typescript_1.default.SymbolFlags.ValueModule | typescript_1.default.SymbolFlags.TypeAlias | typescript_1.default.SymbolFlags.Interface)) !== 0) {
|
|
359
|
+
unsupported.push({
|
|
360
|
+
code: "OBJECT_PACK_DUAL_NAMESPACE_UNSUPPORTED",
|
|
361
|
+
message: "selected export participates in a type, class, enum, or namespace merge",
|
|
362
|
+
selector,
|
|
363
|
+
objectName: row.objectName
|
|
364
|
+
});
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
const declaration = findDeclarationByIdentity(source, resolution.symbol);
|
|
368
|
+
if (declaration && typescript_1.default.isFunctionDeclaration(declaration) && source.statements.filter((statement) => typescript_1.default.isFunctionDeclaration(statement) && statement.name?.text === selector).length > 1) {
|
|
369
|
+
unsupported.push({
|
|
370
|
+
code: "OBJECT_PACK_OVERLOAD_UNSUPPORTED",
|
|
371
|
+
message: "overload declaration sets are not supported",
|
|
372
|
+
selector,
|
|
373
|
+
objectName: row.objectName
|
|
374
|
+
});
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
const validated = validateSelectedDeclaration(declaration, selector, row.objectName, unsupported, source);
|
|
378
|
+
if (validated) {
|
|
379
|
+
selected.push({
|
|
380
|
+
objectName: row.objectName,
|
|
381
|
+
selector,
|
|
382
|
+
symbol: resolution.symbol,
|
|
383
|
+
declaration: validated.declaration,
|
|
384
|
+
statement: validated.statement,
|
|
385
|
+
usages: []
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return selected;
|
|
391
|
+
}
|
|
392
|
+
function validateSelectedDeclaration(declaration, selector, objectName, unsupported, source) {
|
|
393
|
+
if (declaration && typescript_1.default.isFunctionDeclaration(declaration) && declaration.name) {
|
|
394
|
+
if (!hasExportModifier(declaration) || hasDefaultModifier(declaration)) {
|
|
395
|
+
unsupported.push({ code: "OBJECT_PACK_NAMED_EXPORT_REQUIRED", message: "selected function must be a named export declaration", selector, objectName });
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
if (containsThisSensitiveSyntax(declaration)) {
|
|
399
|
+
unsupported.push({ code: "OBJECT_PACK_THIS_SENSITIVE", message: "selected function contains this/super-sensitive semantics", selector, objectName, file: source.fileName });
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
return { declaration, statement: declaration };
|
|
403
|
+
}
|
|
404
|
+
if (declaration && typescript_1.default.isVariableDeclaration(declaration) && typescript_1.default.isIdentifier(declaration.name)) {
|
|
405
|
+
const list = declaration.parent;
|
|
406
|
+
const statement = list.parent;
|
|
407
|
+
if (!typescript_1.default.isVariableDeclarationList(list) || !typescript_1.default.isVariableStatement(statement) ||
|
|
408
|
+
(list.flags & typescript_1.default.NodeFlags.Const) === 0 || !declaration.initializer || !hasExportModifier(statement) || hasDefaultModifier(statement)) {
|
|
409
|
+
unsupported.push({ code: "OBJECT_PACK_CONST_EXPORT_REQUIRED", message: "selected value must be an initialized exported const", selector, objectName });
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
if (containsThisSensitiveSyntax(declaration.initializer)) {
|
|
413
|
+
unsupported.push({ code: "OBJECT_PACK_THIS_SENSITIVE", message: "selected const initializer contains this/super-sensitive semantics", selector, objectName });
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
return { declaration, statement };
|
|
417
|
+
}
|
|
418
|
+
unsupported.push({
|
|
419
|
+
code: "OBJECT_PACK_DECLARATION_KIND_UNSUPPORTED",
|
|
420
|
+
message: "object.pack supports named function declarations and initialized const values only",
|
|
421
|
+
selector,
|
|
422
|
+
objectName
|
|
423
|
+
});
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
function validateVariableStatements(selected, unsupported, sourceFile) {
|
|
427
|
+
const selectedDeclarations = new Set(selected.map((member) => `${member.declaration.getStart()}\0${member.declaration.end}`));
|
|
428
|
+
const seen = new Set();
|
|
429
|
+
for (const member of selected) {
|
|
430
|
+
if (!typescript_1.default.isVariableStatement(member.statement) || seen.has(member.statement)) {
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
seen.add(member.statement);
|
|
434
|
+
const missing = member.statement.declarationList.declarations.filter((declaration) => !selectedDeclarations.has(`${declaration.getStart()}\0${declaration.end}`));
|
|
435
|
+
if (missing.length > 0) {
|
|
436
|
+
unsupported.push({
|
|
437
|
+
code: "OBJECT_PACK_PARTIAL_VARIABLE_STATEMENT_UNSUPPORTED",
|
|
438
|
+
message: "all declarations in an exported const statement must be selected",
|
|
439
|
+
file: sourceFile,
|
|
440
|
+
details: missing.map((declaration) => declaration.name.getText())
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
function validateAndPlanUsages(workspace, sourceFile, member, replacements, externalReferenceCounts, unsupported) {
|
|
446
|
+
for (const usage of member.usages) {
|
|
447
|
+
const project = workspace.projects.find((candidate) => toRepoPath(workspace.root, candidate.config.file) === usage.project);
|
|
448
|
+
const source = project?.program.getSourceFile(path.resolve(workspace.root, usage.file));
|
|
449
|
+
const node = source ? findIdentifierAt(source, usage.start, usage.end) : null;
|
|
450
|
+
if (!project || !source || !node) {
|
|
451
|
+
unsupported.push({ code: "OBJECT_PACK_REFERENCE_NODE_UNRESOLVED", message: "checker reference could not be mapped back to syntax", selector: member.selector, file: usage.file });
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
if (isDeclarationName(node) || findAncestor(node, typescript_1.default.isImportSpecifier)) {
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
if (findAncestor(node, typescript_1.default.isExportSpecifier)) {
|
|
458
|
+
unsupported.push({ code: "OBJECT_PACK_REEXPORT_UNSUPPORTED", message: "re-export of a selected symbol is unsupported", selector: member.selector, file: usage.file });
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
const sourceLocal = (0, semantic_workspace_1.canonicalPathIdentity)(source.fileName) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile);
|
|
462
|
+
const rejectedKinds = usage.kinds.filter((kind) => [
|
|
463
|
+
"property-write",
|
|
464
|
+
"update/delete",
|
|
465
|
+
"destructure",
|
|
466
|
+
"namespace",
|
|
467
|
+
"re-export",
|
|
468
|
+
"type-position/type-query",
|
|
469
|
+
"escape/identity",
|
|
470
|
+
"dynamic/require"
|
|
471
|
+
].includes(kind));
|
|
472
|
+
if (isNamespaceQualifiedReference(node, project.checker)) {
|
|
473
|
+
rejectedKinds.push("namespace");
|
|
474
|
+
}
|
|
475
|
+
if (rejectedKinds.length > 0) {
|
|
476
|
+
unsupported.push({
|
|
477
|
+
code: "OBJECT_PACK_USAGE_UNSUPPORTED",
|
|
478
|
+
message: "selected symbol has an unsupported reference flow",
|
|
479
|
+
selector: member.selector,
|
|
480
|
+
file: usage.file,
|
|
481
|
+
usageKinds: [...new Set(rejectedKinds)].sort()
|
|
482
|
+
});
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
if (usage.kinds.includes("direct-call") && !supportsPropertyCall(member)) {
|
|
486
|
+
unsupported.push({
|
|
487
|
+
code: "OBJECT_PACK_CALL_BINDING_UNPROVEN",
|
|
488
|
+
message: "callable const initializer is not proven safe when invoked as an object property",
|
|
489
|
+
selector: member.selector,
|
|
490
|
+
file: usage.file,
|
|
491
|
+
usageKinds: usage.kinds
|
|
492
|
+
});
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
if (sourceLocal) {
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
if (project.checker.resolveName(member.objectName, node, typescript_1.default.SymbolFlags.Value, false)) {
|
|
499
|
+
unsupported.push({
|
|
500
|
+
code: "OBJECT_PACK_SCOPED_OBJECT_COLLISION",
|
|
501
|
+
message: "object import name is shadowed at a selected reference site",
|
|
502
|
+
selector: member.selector,
|
|
503
|
+
objectName: member.objectName,
|
|
504
|
+
file: usage.file
|
|
505
|
+
});
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
const replacement = `${member.objectName}.${member.selector}`;
|
|
509
|
+
const shorthand = findAncestor(node, typescript_1.default.isShorthandPropertyAssignment);
|
|
510
|
+
if (shorthand) {
|
|
511
|
+
addReplacement(replacements, usage.file, {
|
|
512
|
+
start: shorthand.getStart(source),
|
|
513
|
+
end: shorthand.end,
|
|
514
|
+
text: `${node.text}: ${replacement}`,
|
|
515
|
+
reason: `object.pack shorthand ${member.selector}`
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
else if (usage.kinds.every((kind) => kind === "direct-call" || kind === "value-pass")) {
|
|
519
|
+
addReplacement(replacements, usage.file, {
|
|
520
|
+
start: node.getStart(source),
|
|
521
|
+
end: node.end,
|
|
522
|
+
text: replacement,
|
|
523
|
+
reason: `object.pack reference ${member.selector}`
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
unsupported.push({
|
|
528
|
+
code: "OBJECT_PACK_USAGE_UNCLASSIFIED",
|
|
529
|
+
message: "reference flow was not classified as a supported concrete rewrite",
|
|
530
|
+
selector: member.selector,
|
|
531
|
+
file: usage.file,
|
|
532
|
+
usageKinds: usage.kinds
|
|
533
|
+
});
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
externalReferenceCounts.set(usage.file, (externalReferenceCounts.get(usage.file) ?? 0) + 1);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
function validateRequireConsumers(workspace, sourceFile, unsupported) {
|
|
540
|
+
const seenFiles = new Set();
|
|
541
|
+
for (const project of workspace.projects) {
|
|
542
|
+
for (const file of project.config.parsed.fileNames) {
|
|
543
|
+
const fileKey = (0, semantic_workspace_1.canonicalPathIdentity)(file);
|
|
544
|
+
if (seenFiles.has(fileKey)) {
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
seenFiles.add(fileKey);
|
|
548
|
+
const source = project.program.getSourceFile(file);
|
|
549
|
+
if (!source) {
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
const visit = (node) => {
|
|
553
|
+
if (typescript_1.default.isCallExpression(node) && typescript_1.default.isIdentifier(node.expression) && node.expression.text === "require" &&
|
|
554
|
+
node.arguments.length === 1 && typescript_1.default.isStringLiteralLike(node.arguments[0]) &&
|
|
555
|
+
resolvesToFile(project, source.fileName, node.arguments[0].text, sourceFile)) {
|
|
556
|
+
const symbol = project.checker.getSymbolAtLocation(node.expression);
|
|
557
|
+
const declarations = symbol?.getDeclarations() ?? [];
|
|
558
|
+
const provenModuleRequire = declarations.some((declaration) => declaration.getSourceFile().isDeclarationFile || modifiersOf(declaration).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.DeclareKeyword));
|
|
559
|
+
if (!symbol) {
|
|
560
|
+
unsupported.push({
|
|
561
|
+
code: "OBJECT_PACK_REQUIRE_EVIDENCE_UNAVAILABLE",
|
|
562
|
+
message: "require-like call resolves to packed source but global require identity is unavailable",
|
|
563
|
+
file: toRepoPath(workspace.root, file)
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
else if (provenModuleRequire) {
|
|
567
|
+
unsupported.push({
|
|
568
|
+
code: "OBJECT_PACK_REQUIRE_UNSUPPORTED",
|
|
569
|
+
message: "CommonJS require of packed source is unsupported",
|
|
570
|
+
file: toRepoPath(workspace.root, file)
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
typescript_1.default.forEachChild(node, visit);
|
|
575
|
+
};
|
|
576
|
+
visit(source);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
function collectFingerprintModuleEdges(edges, sourceFile) {
|
|
581
|
+
return edges.filter((edge) => edge.fromFile === sourceFile || edge.toFile === sourceFile);
|
|
582
|
+
}
|
|
583
|
+
function validateAffectedFileOwnership(workspace, sourceFile, selected, moduleEdges, unsupported) {
|
|
584
|
+
const sourceDisplay = toRepoPath(workspace.root, sourceFile);
|
|
585
|
+
const affected = new Set();
|
|
586
|
+
for (const usage of selected.flatMap((member) => member.usages)) {
|
|
587
|
+
affected.add(usage.file);
|
|
588
|
+
}
|
|
589
|
+
for (const edge of moduleEdges) {
|
|
590
|
+
if (edge.toFile === sourceDisplay) {
|
|
591
|
+
affected.add(edge.fromFile);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
affected.delete(sourceDisplay);
|
|
595
|
+
for (const file of [...affected].sort()) {
|
|
596
|
+
const owners = (0, semantic_workspace_1.ownersForSemanticFile)(workspace, file);
|
|
597
|
+
if (owners.length <= 1) {
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
unsupported.push({
|
|
601
|
+
code: "OBJECT_PACK_MULTIPLE_OWNERS_UNSUPPORTED",
|
|
602
|
+
message: "affected object.pack file belongs to multiple owning projects in M2",
|
|
603
|
+
file,
|
|
604
|
+
details: owners.map((project) => toRepoPath(workspace.root, project.config.file))
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
function supportsPropertyCall(member) {
|
|
609
|
+
if (typescript_1.default.isFunctionDeclaration(member.declaration)) {
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
612
|
+
const initializer = member.declaration.initializer;
|
|
613
|
+
return Boolean(initializer && (typescript_1.default.isArrowFunction(initializer) || typescript_1.default.isFunctionExpression(initializer)));
|
|
614
|
+
}
|
|
615
|
+
function planConsumerImports(workspace, sourceFile, selectedByKey, unsupported) {
|
|
616
|
+
const result = new Map();
|
|
617
|
+
const seenFiles = new Set();
|
|
618
|
+
for (const project of workspace.projects) {
|
|
619
|
+
for (const file of project.config.parsed.fileNames) {
|
|
620
|
+
if ((0, semantic_workspace_1.canonicalPathIdentity)(file) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile) || seenFiles.has((0, semantic_workspace_1.canonicalPathIdentity)(file))) {
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
seenFiles.add((0, semantic_workspace_1.canonicalPathIdentity)(file));
|
|
624
|
+
const source = project.program.getSourceFile(file);
|
|
625
|
+
if (!source) {
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
const selectedImports = [];
|
|
629
|
+
for (const statement of source.statements) {
|
|
630
|
+
if (!typescript_1.default.isImportDeclaration(statement) || !typescript_1.default.isStringLiteralLike(statement.moduleSpecifier) ||
|
|
631
|
+
!resolvesToFile(project, source.fileName, statement.moduleSpecifier.text, sourceFile)) {
|
|
632
|
+
continue;
|
|
633
|
+
}
|
|
634
|
+
const clause = statement.importClause;
|
|
635
|
+
const bindings = clause?.namedBindings;
|
|
636
|
+
if (!clause || !bindings || !typescript_1.default.isNamedImports(bindings)) {
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
const selected = [];
|
|
640
|
+
for (const element of bindings.elements) {
|
|
641
|
+
const identity = (0, semantic_workspace_1.resolveSemanticNodeIdentity)(workspace, project, element.name);
|
|
642
|
+
const member = identity ? selectedByKey.get(identity.key) : undefined;
|
|
643
|
+
if (member) {
|
|
644
|
+
selected.push({ element, member });
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (selected.length === 0) {
|
|
648
|
+
continue;
|
|
649
|
+
}
|
|
650
|
+
if (clause.isTypeOnly || selected.some((item) => item.element.isTypeOnly)) {
|
|
651
|
+
for (const item of selected) {
|
|
652
|
+
unsupported.push({ code: "OBJECT_PACK_TYPE_IMPORT_UNSUPPORTED", message: "selected symbol is imported as type-only", selector: item.member.selector, file: toRepoPath(workspace.root, file) });
|
|
653
|
+
}
|
|
654
|
+
continue;
|
|
655
|
+
}
|
|
656
|
+
if (statement.attributes) {
|
|
657
|
+
unsupported.push({ code: "OBJECT_PACK_IMPORT_ATTRIBUTES_UNSUPPORTED", message: "selected import uses import attributes", file: toRepoPath(workspace.root, file) });
|
|
658
|
+
continue;
|
|
659
|
+
}
|
|
660
|
+
selectedImports.push({ statement, selected });
|
|
661
|
+
}
|
|
662
|
+
if (selectedImports.length === 0) {
|
|
663
|
+
continue;
|
|
664
|
+
}
|
|
665
|
+
const fileDisplay = toRepoPath(workspace.root, file);
|
|
666
|
+
const objectNames = [...new Set(selectedImports.flatMap((entry) => entry.selected.map((item) => item.member.objectName)))].sort();
|
|
667
|
+
for (const objectName of objectNames) {
|
|
668
|
+
if (project.checker.resolveName(objectName, source, typescript_1.default.SymbolFlags.Value, false)) {
|
|
669
|
+
unsupported.push({ code: "OBJECT_PACK_CONSUMER_OBJECT_COLLISION", message: "object import name already resolves in consumer scope", objectName, file: fileDisplay });
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
const firstStatementByObject = new Map();
|
|
673
|
+
for (const objectName of objectNames) {
|
|
674
|
+
firstStatementByObject.set(objectName, selectedImports.find((entry) => entry.selected.some((item) => item.member.objectName === objectName)).statement);
|
|
675
|
+
}
|
|
676
|
+
const replacements = [];
|
|
677
|
+
for (const entry of selectedImports) {
|
|
678
|
+
const selectedElements = new Set(entry.selected.map((item) => item.element));
|
|
679
|
+
const remaining = entry.statement.importClause.namedBindings && typescript_1.default.isNamedImports(entry.statement.importClause.namedBindings)
|
|
680
|
+
? entry.statement.importClause.namedBindings.elements.filter((element) => !selectedElements.has(element)).map((element) => element.getText(source))
|
|
681
|
+
: [];
|
|
682
|
+
const added = objectNames.filter((objectName) => firstStatementByObject.get(objectName) === entry.statement);
|
|
683
|
+
const replacementText = renderImportDeclaration(source, entry.statement, [...remaining, ...added].sort());
|
|
684
|
+
replacements.push({
|
|
685
|
+
start: entry.statement.getStart(source),
|
|
686
|
+
end: replacementText ? entry.statement.end : statementEndWithTrailingNewline(source.text, entry.statement.end),
|
|
687
|
+
text: replacementText,
|
|
688
|
+
reason: "object.pack import rewrite"
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
result.set(fileDisplay, {
|
|
692
|
+
replacements,
|
|
693
|
+
objectNames,
|
|
694
|
+
selectors: [...new Set(selectedImports.flatMap((entry) => entry.selected.map((item) => item.member.selector)))].sort()
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return result;
|
|
699
|
+
}
|
|
700
|
+
function validateReExports(workspace, sourceFile, selectedByKey, unsupported) {
|
|
701
|
+
const seenFiles = new Set();
|
|
702
|
+
for (const project of workspace.projects) {
|
|
703
|
+
for (const file of project.config.parsed.fileNames) {
|
|
704
|
+
if (seenFiles.has((0, semantic_workspace_1.canonicalPathIdentity)(file))) {
|
|
705
|
+
continue;
|
|
706
|
+
}
|
|
707
|
+
seenFiles.add((0, semantic_workspace_1.canonicalPathIdentity)(file));
|
|
708
|
+
const source = project.program.getSourceFile(file);
|
|
709
|
+
if (!source) {
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
for (const statement of source.statements) {
|
|
713
|
+
if (!typescript_1.default.isExportDeclaration(statement) || !statement.moduleSpecifier || !typescript_1.default.isStringLiteralLike(statement.moduleSpecifier) ||
|
|
714
|
+
!resolvesToFile(project, source.fileName, statement.moduleSpecifier.text, sourceFile)) {
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
if (!statement.exportClause) {
|
|
718
|
+
unsupported.push({ code: "OBJECT_PACK_EXPORT_STAR_UNSUPPORTED", message: "export-star from packed source is unsupported", file: toRepoPath(workspace.root, file) });
|
|
719
|
+
continue;
|
|
720
|
+
}
|
|
721
|
+
if (typescript_1.default.isNamespaceExport(statement.exportClause)) {
|
|
722
|
+
unsupported.push({ code: "OBJECT_PACK_NAMESPACE_REEXPORT_UNSUPPORTED", message: "namespace re-export from packed source is unsupported", file: toRepoPath(workspace.root, file) });
|
|
723
|
+
continue;
|
|
724
|
+
}
|
|
725
|
+
if (typescript_1.default.isNamedExports(statement.exportClause)) {
|
|
726
|
+
for (const element of statement.exportClause.elements) {
|
|
727
|
+
const identity = (0, semantic_workspace_1.resolveSemanticNodeIdentity)(workspace, project, element.propertyName ?? element.name);
|
|
728
|
+
const member = identity ? selectedByKey.get(identity.key) : undefined;
|
|
729
|
+
if (member) {
|
|
730
|
+
unsupported.push({ code: "OBJECT_PACK_REEXPORT_UNSUPPORTED", message: "re-export of selected symbol is unsupported", selector: member.selector, file: toRepoPath(workspace.root, file) });
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
function buildSourceText(source, text, selected, rows) {
|
|
739
|
+
const replacements = [];
|
|
740
|
+
const seenStatements = new Set();
|
|
741
|
+
for (const member of selected) {
|
|
742
|
+
if (seenStatements.has(member.statement)) {
|
|
743
|
+
continue;
|
|
744
|
+
}
|
|
745
|
+
seenStatements.add(member.statement);
|
|
746
|
+
const exportModifier = modifiersOf(member.statement).find((modifier) => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword);
|
|
747
|
+
let end = exportModifier.end;
|
|
748
|
+
while (end < text.length && (text[end] === " " || text[end] === "\t")) {
|
|
749
|
+
end += 1;
|
|
750
|
+
}
|
|
751
|
+
replacements.push({ start: exportModifier.getStart(source), end, text: "", reason: "object.pack localize export" });
|
|
752
|
+
}
|
|
753
|
+
let next = applyReplacements(text, replacements);
|
|
754
|
+
const objectStatements = rows.map((row) => `export const ${row.objectName} = { ${row.selectors.join(", ")} };`).join("\n");
|
|
755
|
+
next = `${next}${next.endsWith("\n") ? "" : "\n"}${next.trim().length > 0 ? "\n" : ""}${objectStatements}\n`;
|
|
756
|
+
return next;
|
|
757
|
+
}
|
|
758
|
+
function renderImportDeclaration(source, statement, elements) {
|
|
759
|
+
const clause = statement.importClause;
|
|
760
|
+
const defaultName = clause.name?.getText(source);
|
|
761
|
+
if (elements.length === 0) {
|
|
762
|
+
return defaultName ? `import ${defaultName} from ${statement.moduleSpecifier.getText(source)};` : "";
|
|
763
|
+
}
|
|
764
|
+
return `import ${defaultName ? `${defaultName}, ` : ""}{ ${elements.join(", ")} } from ${statement.moduleSpecifier.getText(source)};`;
|
|
765
|
+
}
|
|
766
|
+
function moduleShapesUnchanged(root, virtualTexts) {
|
|
767
|
+
for (const [file, nextText] of virtualTexts) {
|
|
768
|
+
const absolute = path.resolve(root, file);
|
|
769
|
+
const before = moduleShape(fs.readFileSync(absolute, "utf8"), absolute);
|
|
770
|
+
const after = moduleShape(nextText, absolute);
|
|
771
|
+
if (before.join("\0") !== after.join("\0")) {
|
|
772
|
+
return false;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
return true;
|
|
776
|
+
}
|
|
777
|
+
function moduleShape(text, file) {
|
|
778
|
+
const source = typescript_1.default.createSourceFile(file, text, typescript_1.default.ScriptTarget.Latest, true, scriptKindForFile(file));
|
|
779
|
+
const shape = [];
|
|
780
|
+
const visit = (node) => {
|
|
781
|
+
if (typescript_1.default.isImportDeclaration(node) && typescript_1.default.isStringLiteralLike(node.moduleSpecifier)) {
|
|
782
|
+
const clause = node.importClause;
|
|
783
|
+
shape.push(`import:${clause?.isTypeOnly ? "type" : "runtime"}:${node.moduleSpecifier.text}`);
|
|
784
|
+
}
|
|
785
|
+
else if (typescript_1.default.isExportDeclaration(node) && node.moduleSpecifier && typescript_1.default.isStringLiteralLike(node.moduleSpecifier)) {
|
|
786
|
+
shape.push(`export:${node.isTypeOnly ? "type" : "runtime"}:${node.moduleSpecifier.text}`);
|
|
787
|
+
}
|
|
788
|
+
else if (typescript_1.default.isCallExpression(node) && node.expression.kind === typescript_1.default.SyntaxKind.ImportKeyword &&
|
|
789
|
+
node.arguments.length === 1 && typescript_1.default.isStringLiteralLike(node.arguments[0])) {
|
|
790
|
+
shape.push(`dynamic:${node.arguments[0].text}`);
|
|
791
|
+
}
|
|
792
|
+
typescript_1.default.forEachChild(node, visit);
|
|
793
|
+
};
|
|
794
|
+
visit(source);
|
|
795
|
+
return [...new Set(shape)].sort();
|
|
796
|
+
}
|
|
797
|
+
function failure(sourceFile, rows, unsupported, coverage) {
|
|
798
|
+
return {
|
|
799
|
+
ok: false,
|
|
800
|
+
operation: "exports.object.pack.preview",
|
|
801
|
+
code: "OBJECT_PACK_SEMANTIC_PREVIEW_REJECTED",
|
|
802
|
+
sourceFile,
|
|
803
|
+
objectCount: rows.length,
|
|
804
|
+
memberCount: rows.reduce((sum, row) => sum + row.selectors.length, 0),
|
|
805
|
+
filesTouched: [],
|
|
806
|
+
filesWritten: [],
|
|
807
|
+
...(coverage ? { coverage } : {}),
|
|
808
|
+
unsupportedCount: unsupported.length,
|
|
809
|
+
unsupported: unsupported.sort(compareUnsupported)
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
function findDeclarationByIdentity(source, identity) {
|
|
813
|
+
let found = null;
|
|
814
|
+
const visit = (node) => {
|
|
815
|
+
if (found) {
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
if (node.getStart(source) === identity.declarationStart && node.end === identity.declarationEnd) {
|
|
819
|
+
found = node;
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
typescript_1.default.forEachChild(node, visit);
|
|
823
|
+
};
|
|
824
|
+
visit(source);
|
|
825
|
+
return found;
|
|
826
|
+
}
|
|
827
|
+
function findIdentifierAt(source, start, end) {
|
|
828
|
+
let found = null;
|
|
829
|
+
const visit = (node) => {
|
|
830
|
+
if (found || node.end < start || node.getStart(source) > end) {
|
|
831
|
+
return;
|
|
832
|
+
}
|
|
833
|
+
if (typescript_1.default.isIdentifier(node) && node.getStart(source) === start && node.end === end) {
|
|
834
|
+
found = node;
|
|
835
|
+
return;
|
|
836
|
+
}
|
|
837
|
+
typescript_1.default.forEachChild(node, visit);
|
|
838
|
+
};
|
|
839
|
+
visit(source);
|
|
840
|
+
return found;
|
|
841
|
+
}
|
|
842
|
+
function isDeclarationName(node) {
|
|
843
|
+
const parent = node.parent;
|
|
844
|
+
return typescript_1.default.isFunctionDeclaration(parent) && parent.name === node ||
|
|
845
|
+
typescript_1.default.isVariableDeclaration(parent) && parent.name === node;
|
|
846
|
+
}
|
|
847
|
+
function isNamespaceQualifiedReference(node, checker) {
|
|
848
|
+
const parent = node.parent;
|
|
849
|
+
if (!typescript_1.default.isPropertyAccessExpression(parent) || parent.name !== node) {
|
|
850
|
+
return false;
|
|
851
|
+
}
|
|
852
|
+
const receiver = checker.getSymbolAtLocation(parent.expression);
|
|
853
|
+
return Boolean(receiver?.getDeclarations()?.some(typescript_1.default.isNamespaceImport));
|
|
854
|
+
}
|
|
855
|
+
function resolvesToFile(project, fromFile, specifier, targetFile) {
|
|
856
|
+
const resolved = typescript_1.default.resolveModuleName(specifier, fromFile, project.config.parsed.options, typescript_1.default.sys).resolvedModule?.resolvedFileName;
|
|
857
|
+
return Boolean(resolved && (0, semantic_workspace_1.canonicalPathIdentity)(resolved) === (0, semantic_workspace_1.canonicalPathIdentity)(targetFile));
|
|
858
|
+
}
|
|
859
|
+
function containsThisSensitiveSyntax(node) {
|
|
860
|
+
let sensitive = false;
|
|
861
|
+
const visit = (current) => {
|
|
862
|
+
if (current.kind === typescript_1.default.SyntaxKind.ThisKeyword || current.kind === typescript_1.default.SyntaxKind.SuperKeyword) {
|
|
863
|
+
sensitive = true;
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
typescript_1.default.forEachChild(current, visit);
|
|
867
|
+
};
|
|
868
|
+
visit(node);
|
|
869
|
+
return sensitive;
|
|
870
|
+
}
|
|
871
|
+
function hasExportModifier(node) {
|
|
872
|
+
return modifiersOf(node).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword);
|
|
873
|
+
}
|
|
874
|
+
function hasDefaultModifier(node) {
|
|
875
|
+
return modifiersOf(node).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.DefaultKeyword);
|
|
876
|
+
}
|
|
877
|
+
function modifiersOf(node) {
|
|
878
|
+
return typescript_1.default.canHaveModifiers(node) ? typescript_1.default.getModifiers(node) ?? [] : [];
|
|
879
|
+
}
|
|
880
|
+
function applyReplacements(text, replacements) {
|
|
881
|
+
const sorted = [...replacements].sort((left, right) => right.start - left.start || right.end - left.end || left.text.localeCompare(right.text));
|
|
882
|
+
for (let index = 1; index < sorted.length; index += 1) {
|
|
883
|
+
const right = sorted[index - 1];
|
|
884
|
+
const left = sorted[index];
|
|
885
|
+
if (left.end > right.start) {
|
|
886
|
+
throw new Error(`Overlapping object.pack replacements: ${left.start}-${left.end} and ${right.start}-${right.end}.`);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
let next = text;
|
|
890
|
+
for (const replacement of sorted) {
|
|
891
|
+
next = `${next.slice(0, replacement.start)}${replacement.text}${next.slice(replacement.end)}`;
|
|
892
|
+
}
|
|
893
|
+
return next;
|
|
894
|
+
}
|
|
895
|
+
function addReplacement(target, file, replacement) {
|
|
896
|
+
const values = target.get(file) ?? [];
|
|
897
|
+
if (!values.some((item) => item.start === replacement.start && item.end === replacement.end && item.text === replacement.text)) {
|
|
898
|
+
values.push(replacement);
|
|
899
|
+
}
|
|
900
|
+
target.set(file, values);
|
|
901
|
+
}
|
|
902
|
+
function diagnosticKey(root, diagnostic) {
|
|
903
|
+
return [
|
|
904
|
+
diagnostic.code,
|
|
905
|
+
diagnostic.file ? toRepoPath(root, diagnostic.file.fileName) : "",
|
|
906
|
+
diagnostic.start ?? -1,
|
|
907
|
+
diagnostic.length ?? -1,
|
|
908
|
+
typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n")
|
|
909
|
+
].join("\0");
|
|
910
|
+
}
|
|
911
|
+
function toObjectDiagnostic(root, diagnostic) {
|
|
912
|
+
return {
|
|
913
|
+
code: `TS${diagnostic.code}`,
|
|
914
|
+
severity: diagnostic.category === typescript_1.default.DiagnosticCategory.Error ? "error" : "warning",
|
|
915
|
+
message: typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
|
|
916
|
+
...(diagnostic.file ? { file: toRepoPath(root, diagnostic.file.fileName) } : {})
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
function toCoverageEvidence(reason) {
|
|
920
|
+
const record = reason;
|
|
921
|
+
return {
|
|
922
|
+
code: `OBJECT_PACK_COVERAGE_${reason.code}`,
|
|
923
|
+
message: "semantic reference coverage is incomplete",
|
|
924
|
+
...(typeof record.file === "string" ? { file: record.file } : {}),
|
|
925
|
+
details: reason
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
function isSupportedSourceExtension(file) {
|
|
929
|
+
return [".ts", ".tsx", ".mts"].includes(path.extname(file).toLowerCase());
|
|
930
|
+
}
|
|
931
|
+
function isEsmSourceFile(project, source) {
|
|
932
|
+
const kind = project.config.parsed.options.module;
|
|
933
|
+
if (kind === undefined || [
|
|
934
|
+
typescript_1.default.ModuleKind.None,
|
|
935
|
+
typescript_1.default.ModuleKind.CommonJS,
|
|
936
|
+
typescript_1.default.ModuleKind.AMD,
|
|
937
|
+
typescript_1.default.ModuleKind.UMD,
|
|
938
|
+
typescript_1.default.ModuleKind.System
|
|
939
|
+
].includes(kind)) {
|
|
940
|
+
return false;
|
|
941
|
+
}
|
|
942
|
+
if ([typescript_1.default.ModuleKind.Node16, typescript_1.default.ModuleKind.NodeNext].includes(kind)) {
|
|
943
|
+
return source.impliedNodeFormat === typescript_1.default.ModuleKind.ESNext;
|
|
944
|
+
}
|
|
945
|
+
return true;
|
|
946
|
+
}
|
|
947
|
+
function statementEndWithTrailingNewline(text, end) {
|
|
948
|
+
if (text[end] === "\r" && text[end + 1] === "\n") {
|
|
949
|
+
return end + 2;
|
|
950
|
+
}
|
|
951
|
+
return text[end] === "\n" ? end + 1 : end;
|
|
952
|
+
}
|
|
953
|
+
function scriptKindForFile(file) {
|
|
954
|
+
const extension = path.extname(file).toLowerCase();
|
|
955
|
+
return extension === ".tsx" ? typescript_1.default.ScriptKind.TSX : extension === ".jsx" ? typescript_1.default.ScriptKind.JSX :
|
|
956
|
+
[".js", ".mjs", ".cjs"].includes(extension) ? typescript_1.default.ScriptKind.JS : typescript_1.default.ScriptKind.TS;
|
|
957
|
+
}
|
|
958
|
+
function findAncestor(node, predicate) {
|
|
959
|
+
let current = node.parent;
|
|
960
|
+
while (current) {
|
|
961
|
+
if (predicate(current)) {
|
|
962
|
+
return current;
|
|
963
|
+
}
|
|
964
|
+
if (typescript_1.default.isStatement(current)) {
|
|
965
|
+
break;
|
|
966
|
+
}
|
|
967
|
+
current = current.parent;
|
|
968
|
+
}
|
|
969
|
+
return undefined;
|
|
970
|
+
}
|
|
971
|
+
function toRepoPath(root, file) {
|
|
972
|
+
return path.relative(root, path.resolve(file)).replace(/\\/g, "/") || ".";
|
|
973
|
+
}
|
|
974
|
+
function compareUsages(left, right) {
|
|
975
|
+
return left.file.localeCompare(right.file) || left.start - right.start || left.end - right.end ||
|
|
976
|
+
left.symbol.key.localeCompare(right.symbol.key) || left.project.localeCompare(right.project);
|
|
977
|
+
}
|
|
978
|
+
function compareUnsupported(left, right) {
|
|
979
|
+
return (left.file ?? "").localeCompare(right.file ?? "") || (left.selector ?? "").localeCompare(right.selector ?? "") ||
|
|
980
|
+
(left.objectName ?? "").localeCompare(right.objectName ?? "") || left.code.localeCompare(right.code);
|
|
981
|
+
}
|
|
982
|
+
function sha256(value) {
|
|
983
|
+
return crypto.createHash("sha256").update(value).digest("hex");
|
|
984
|
+
}
|