@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,903 @@
|
|
|
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.buildProjectTopologySnapshot = buildProjectTopologySnapshot;
|
|
40
|
+
exports.describeTopologyFile = describeTopologyFile;
|
|
41
|
+
exports.resolveTopologyReachability = resolveTopologyReachability;
|
|
42
|
+
exports.buildBoundaryRelations = buildBoundaryRelations;
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
46
|
+
const tsconfig_discovery_1 = require("../config/tsconfig-discovery");
|
|
47
|
+
const errors_1 = require("../shared/errors");
|
|
48
|
+
const dependency_snapshot_1 = require("./dependency-snapshot");
|
|
49
|
+
const scope_1 = require("./scope");
|
|
50
|
+
const SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
|
|
51
|
+
const EXCLUDED_DIRS = new Set(["node_modules", ".git", ".tmp", ".next", "dist", "out", "coverage"]);
|
|
52
|
+
function buildProjectTopologySnapshot(root, options = {}) {
|
|
53
|
+
const startedAt = Date.now();
|
|
54
|
+
const workspaceRoot = path.resolve(root);
|
|
55
|
+
const diagnostics = [];
|
|
56
|
+
const scope = (0, scope_1.createTopologyScope)(workspaceRoot, options.scope);
|
|
57
|
+
const tsconfigStartedAt = Date.now();
|
|
58
|
+
const tsconfigResult = readTsConfigSnapshots(workspaceRoot, diagnostics, scope);
|
|
59
|
+
const tsconfigs = tsconfigResult.configs;
|
|
60
|
+
const tsconfigMs = Date.now() - tsconfigStartedAt;
|
|
61
|
+
const packageStartedAt = Date.now();
|
|
62
|
+
const packages = readPackageSnapshots(workspaceRoot, diagnostics, scope);
|
|
63
|
+
const packageMs = Date.now() - packageStartedAt;
|
|
64
|
+
const dependencyStartedAt = Date.now();
|
|
65
|
+
const dependencySnapshot = (0, dependency_snapshot_1.buildTopologyDependencySnapshot)(workspaceRoot, packages);
|
|
66
|
+
const dependencyMs = Date.now() - dependencyStartedAt;
|
|
67
|
+
const totalMs = Date.now() - startedAt;
|
|
68
|
+
return {
|
|
69
|
+
operation: "inspect.topology",
|
|
70
|
+
version: 1,
|
|
71
|
+
root: workspaceRoot,
|
|
72
|
+
mode: "lazy",
|
|
73
|
+
builtAt: new Date().toISOString(),
|
|
74
|
+
buildMs: totalMs,
|
|
75
|
+
timings: {
|
|
76
|
+
scopeMs: scope.timings.totalMs,
|
|
77
|
+
tsconfigDiscoveryMs: tsconfigResult.discoveryMs,
|
|
78
|
+
tsconfigMs,
|
|
79
|
+
packageMs,
|
|
80
|
+
dependencyMs,
|
|
81
|
+
totalMs
|
|
82
|
+
},
|
|
83
|
+
scope: {
|
|
84
|
+
mode: scope.mode,
|
|
85
|
+
defaultExcludes: scope.defaultExcludes,
|
|
86
|
+
configExcludes: scope.configExcludes
|
|
87
|
+
},
|
|
88
|
+
dependencySnapshot,
|
|
89
|
+
tsconfigs,
|
|
90
|
+
packages,
|
|
91
|
+
diagnostics
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function describeTopologyFile(snapshot, filePath) {
|
|
95
|
+
return describeFileOwnership(snapshot, resolveInsideRoot(snapshot.root, filePath));
|
|
96
|
+
}
|
|
97
|
+
function resolveTopologyReachability(snapshot, fromFile, toFile) {
|
|
98
|
+
const from = resolveInsideRoot(snapshot.root, fromFile);
|
|
99
|
+
const to = resolveInsideRoot(snapshot.root, toFile);
|
|
100
|
+
const diagnostics = [];
|
|
101
|
+
if (!fs.existsSync(from)) {
|
|
102
|
+
diagnostics.push({ code: "TOPOLOGY_FROM_NOT_FOUND", message: "Importer file does not exist.", file: toDisplayPath(snapshot.root, from) });
|
|
103
|
+
}
|
|
104
|
+
if (!fs.existsSync(to)) {
|
|
105
|
+
diagnostics.push({ code: "TOPOLOGY_TO_NOT_FOUND", message: "Target file does not exist.", file: toDisplayPath(snapshot.root, to) });
|
|
106
|
+
}
|
|
107
|
+
const owner = {
|
|
108
|
+
from: describeFileOwnership(snapshot, from),
|
|
109
|
+
to: describeFileOwnership(snapshot, to)
|
|
110
|
+
};
|
|
111
|
+
const candidates = buildImportSpecifierCandidates(snapshot, from, to, owner);
|
|
112
|
+
return {
|
|
113
|
+
from: toDisplayPath(snapshot.root, from),
|
|
114
|
+
to: toDisplayPath(snapshot.root, to),
|
|
115
|
+
reachable: candidates.some((candidate) => candidate.valid),
|
|
116
|
+
owner,
|
|
117
|
+
candidates,
|
|
118
|
+
diagnostics: [...diagnostics, ...owner.from.diagnostics, ...owner.to.diagnostics]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function buildBoundaryRelations(snapshot, boundaryPath) {
|
|
122
|
+
const target = resolveInsideRoot(snapshot.root, boundaryPath);
|
|
123
|
+
const targetPackage = findOwningPackage(snapshot, target);
|
|
124
|
+
const targetRoot = targetPackage?.root ?? target;
|
|
125
|
+
const diagnostics = [];
|
|
126
|
+
if (!targetPackage) {
|
|
127
|
+
diagnostics.push({
|
|
128
|
+
code: "TOPOLOGY_BOUNDARY_PACKAGE_NOT_FOUND",
|
|
129
|
+
message: "Boundary path is not inside a discovered package.",
|
|
130
|
+
file: toDisplayPath(snapshot.root, target)
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
const canImport = [];
|
|
134
|
+
const canBeImportedBy = [];
|
|
135
|
+
for (const pkg of snapshot.packages) {
|
|
136
|
+
if (pkg.root === targetRoot) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
canImport.push(packageRelation(snapshot.root, targetPackage ?? undefined, pkg));
|
|
140
|
+
canBeImportedBy.push(packageRelation(snapshot.root, pkg, targetPackage ?? undefined));
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
boundary: toDisplayPath(snapshot.root, targetRoot),
|
|
144
|
+
...(targetPackage?.root ? { packageRoot: toDisplayPath(snapshot.root, targetPackage.root) } : {}),
|
|
145
|
+
...(targetPackage?.name ? { packageName: targetPackage.name } : {}),
|
|
146
|
+
canImport: canImport.sort(compareBoundaryRelations),
|
|
147
|
+
canBeImportedBy: canBeImportedBy.sort(compareBoundaryRelations),
|
|
148
|
+
diagnostics
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function readTsConfigSnapshots(root, diagnostics, scope) {
|
|
152
|
+
const discovery = (0, tsconfig_discovery_1.discoverTsconfigFiles)(root, {
|
|
153
|
+
includeDefaultExcluded: true,
|
|
154
|
+
includeConfigExcluded: true
|
|
155
|
+
});
|
|
156
|
+
const cache = new Map();
|
|
157
|
+
const configs = discovery.visible
|
|
158
|
+
.filter((file) => scope.isPathInScope(file))
|
|
159
|
+
.map((file) => readEffectiveTsConfig(file, cache, diagnostics))
|
|
160
|
+
.filter((config) => config !== null)
|
|
161
|
+
.map((config) => ({
|
|
162
|
+
file: toDisplayPath(root, config.file),
|
|
163
|
+
baseUrl: toDisplayPath(root, config.baseUrl),
|
|
164
|
+
paths: config.paths.map((mapping) => ({
|
|
165
|
+
...mapping,
|
|
166
|
+
baseUrl: toDisplayPath(root, mapping.baseUrl)
|
|
167
|
+
})),
|
|
168
|
+
...(config.extends ? { extends: toDisplayPath(root, config.extends) } : {}),
|
|
169
|
+
...(config.files ? { files: config.files } : {}),
|
|
170
|
+
...(config.include ? { include: config.include } : {}),
|
|
171
|
+
...(config.exclude ? { exclude: config.exclude } : {}),
|
|
172
|
+
...(config.references ? { references: config.references.map((reference) => toDisplayPath(root, reference)) } : {}),
|
|
173
|
+
...(typeof config.composite === "boolean" ? { composite: config.composite } : {}),
|
|
174
|
+
...(config.module ? { module: config.module } : {}),
|
|
175
|
+
...(config.moduleResolution ? { moduleResolution: config.moduleResolution } : {}),
|
|
176
|
+
...(config.customConditions ? { customConditions: config.customConditions } : {}),
|
|
177
|
+
...(config.rootDir ? { rootDir: toDisplayPath(root, config.rootDir) } : {}),
|
|
178
|
+
...(config.rootDirs ? { rootDirs: config.rootDirs.map((entry) => toDisplayPath(root, entry)) } : {})
|
|
179
|
+
}))
|
|
180
|
+
.sort((left, right) => left.file.localeCompare(right.file));
|
|
181
|
+
return { configs, discoveryMs: discovery.durationMs };
|
|
182
|
+
}
|
|
183
|
+
function readPackageSnapshots(root, diagnostics, scope) {
|
|
184
|
+
const packages = [];
|
|
185
|
+
const workspaceFilter = readWorkspacePackageFilter(root, diagnostics);
|
|
186
|
+
for (const packageJson of walkPackageJson(root)) {
|
|
187
|
+
if (!scope.isPathInScope(packageJson)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (workspaceFilter && !workspaceFilter(packageJson)) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const raw = parseJsoncObject(fs.readFileSync(packageJson, "utf8"));
|
|
195
|
+
const dependencies = dependencyNames(raw);
|
|
196
|
+
const name = typeof raw.name === "string" && raw.name.trim() !== "" ? raw.name.trim() : undefined;
|
|
197
|
+
const exportsValue = normalizePackageMapValue(raw.exports);
|
|
198
|
+
const importsValue = normalizePackageMapValue(raw.imports);
|
|
199
|
+
packages.push({
|
|
200
|
+
root: path.dirname(packageJson),
|
|
201
|
+
packageJson,
|
|
202
|
+
...(name ? { name } : {}),
|
|
203
|
+
...(typeof raw.main === "string" ? { main: raw.main } : {}),
|
|
204
|
+
...(typeof raw.module === "string" ? { module: raw.module } : {}),
|
|
205
|
+
...(typeof raw.types === "string" ? { types: raw.types } : {}),
|
|
206
|
+
...(typeof raw.typings === "string" ? { typings: raw.typings } : {}),
|
|
207
|
+
dependencies,
|
|
208
|
+
...(exportsValue ? { exports: exportsValue } : {}),
|
|
209
|
+
...(importsValue ? { imports: importsValue } : {}),
|
|
210
|
+
...(typeof raw.private === "boolean" ? { private: raw.private } : {})
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
diagnostics.push({
|
|
215
|
+
code: "TOPOLOGY_PACKAGE_JSON_UNREADABLE",
|
|
216
|
+
message: error instanceof Error ? error.message : "Could not read package.json.",
|
|
217
|
+
file: toDisplayPath(root, packageJson)
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return packages.sort((left, right) => toDisplayPath(root, left.root).localeCompare(toDisplayPath(root, right.root)));
|
|
222
|
+
}
|
|
223
|
+
function buildImportSpecifierCandidates(snapshot, fromFile, toFile, owner) {
|
|
224
|
+
const candidates = [];
|
|
225
|
+
const fromPackageRoot = owner.from.packageRoot;
|
|
226
|
+
const toPackageRoot = owner.to.packageRoot;
|
|
227
|
+
const samePackage = Boolean(fromPackageRoot && toPackageRoot && fromPackageRoot === toPackageRoot);
|
|
228
|
+
candidates.push({
|
|
229
|
+
specifier: relativeSpecifier(fromFile, toFile),
|
|
230
|
+
kind: "relative",
|
|
231
|
+
valid: fs.existsSync(toFile),
|
|
232
|
+
reason: samePackage ? "relative path inside same package" : "relative path can reach target; cross-package relative is discouraged",
|
|
233
|
+
policy: samePackage ? "allowed" : "discouraged"
|
|
234
|
+
});
|
|
235
|
+
const fromTsConfig = owner.from.tsconfig
|
|
236
|
+
? snapshot.tsconfigs.find((config) => config.file === owner.from.tsconfig)
|
|
237
|
+
: undefined;
|
|
238
|
+
if (fromTsConfig) {
|
|
239
|
+
for (const candidate of aliasCandidates(snapshot.root, fromTsConfig, toFile)) {
|
|
240
|
+
candidates.push(candidate);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const targetPackage = owner.to.packageRoot
|
|
244
|
+
? snapshot.packages.find((pkg) => toDisplayPath(snapshot.root, pkg.root) === owner.to.packageRoot)
|
|
245
|
+
: undefined;
|
|
246
|
+
const fromPackage = owner.from.packageRoot
|
|
247
|
+
? snapshot.packages.find((pkg) => toDisplayPath(snapshot.root, pkg.root) === owner.from.packageRoot)
|
|
248
|
+
: undefined;
|
|
249
|
+
if (targetPackage?.name) {
|
|
250
|
+
const dependencyAllowsPackage = fromPackage?.root === targetPackage.root ||
|
|
251
|
+
Boolean(fromPackage?.dependencies.includes(targetPackage.name));
|
|
252
|
+
const subpath = packageSubpath(targetPackage.root, toFile);
|
|
253
|
+
const exportAllowsSubpath = subpath === "" || packageExportsSubpath(targetPackage, subpath);
|
|
254
|
+
const valid = Boolean(dependencyAllowsPackage && exportAllowsSubpath);
|
|
255
|
+
candidates.push({
|
|
256
|
+
specifier: subpath ? `${targetPackage.name}/${subpath}` : targetPackage.name,
|
|
257
|
+
kind: "package",
|
|
258
|
+
valid,
|
|
259
|
+
packageName: targetPackage.name,
|
|
260
|
+
reason: !dependencyAllowsPackage
|
|
261
|
+
? "importing package does not declare target package dependency"
|
|
262
|
+
: exportAllowsSubpath
|
|
263
|
+
? "package dependency/self import is present and subpath is public"
|
|
264
|
+
: "package dependency exists, but target subpath is not proven public by package exports"
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (fromPackage?.root === targetPackage?.root && fromPackage?.imports) {
|
|
268
|
+
const importCandidate = packageImportCandidate(fromPackage, toFile);
|
|
269
|
+
if (importCandidate) {
|
|
270
|
+
candidates.push(importCandidate);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return uniqueCandidates(candidates);
|
|
274
|
+
}
|
|
275
|
+
function aliasCandidates(root, config, toFile) {
|
|
276
|
+
const targetNoExt = withoutSourceExtension(toFile);
|
|
277
|
+
const candidates = [];
|
|
278
|
+
for (const mapping of config.paths) {
|
|
279
|
+
for (const rawTarget of mapping.targets) {
|
|
280
|
+
const specifier = aliasCandidate(targetNoExt, {
|
|
281
|
+
...mapping,
|
|
282
|
+
baseUrl: path.resolve(root, mapping.baseUrl)
|
|
283
|
+
}, rawTarget);
|
|
284
|
+
if (specifier) {
|
|
285
|
+
candidates.push({
|
|
286
|
+
specifier,
|
|
287
|
+
kind: "tsconfig-path",
|
|
288
|
+
valid: true,
|
|
289
|
+
reason: `matched tsconfig paths pattern ${mapping.pattern}`,
|
|
290
|
+
tsconfig: config.file
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return candidates.sort((left, right) => left.specifier.length - right.specifier.length || left.specifier.localeCompare(right.specifier));
|
|
296
|
+
}
|
|
297
|
+
function describeFileOwnership(snapshot, file) {
|
|
298
|
+
const tsconfig = findOwningTsConfig(snapshot, file);
|
|
299
|
+
const pkg = findOwningPackage(snapshot, file);
|
|
300
|
+
const diagnostics = [];
|
|
301
|
+
if (!tsconfig) {
|
|
302
|
+
diagnostics.push({
|
|
303
|
+
code: "TOPOLOGY_TSCONFIG_NOT_FOUND",
|
|
304
|
+
message: "No discovered tsconfig owns this file.",
|
|
305
|
+
file: toDisplayPath(snapshot.root, file)
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (!pkg) {
|
|
309
|
+
diagnostics.push({
|
|
310
|
+
code: "TOPOLOGY_PACKAGE_NOT_FOUND",
|
|
311
|
+
message: "No discovered package.json owns this file.",
|
|
312
|
+
file: toDisplayPath(snapshot.root, file)
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
file: toDisplayPath(snapshot.root, file),
|
|
317
|
+
...(tsconfig ? { tsconfig: tsconfig.file } : {}),
|
|
318
|
+
...(pkg ? { packageRoot: toDisplayPath(snapshot.root, pkg.root) } : {}),
|
|
319
|
+
...(pkg?.name ? { packageName: pkg.name } : {}),
|
|
320
|
+
diagnostics
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function findOwningTsConfig(snapshot, file) {
|
|
324
|
+
const absolute = path.resolve(file);
|
|
325
|
+
return snapshot.tsconfigs
|
|
326
|
+
.map((config) => ({ config, dir: path.dirname(path.resolve(snapshot.root, config.file)) }))
|
|
327
|
+
.filter((item) => isPathInsideOrEqual(absolute, item.dir) && fileMatchesTsConfig(snapshot.root, absolute, item.config))
|
|
328
|
+
.sort((left, right) => right.dir.length - left.dir.length ||
|
|
329
|
+
tsconfigOwnerRank(left.config.file) - tsconfigOwnerRank(right.config.file) ||
|
|
330
|
+
left.config.file.localeCompare(right.config.file))[0]?.config ?? null;
|
|
331
|
+
}
|
|
332
|
+
function findOwningPackage(snapshot, file) {
|
|
333
|
+
const absolute = path.resolve(file);
|
|
334
|
+
return snapshot.packages
|
|
335
|
+
.filter((pkg) => isPathInsideOrEqual(absolute, pkg.root))
|
|
336
|
+
.sort((left, right) => right.root.length - left.root.length)[0] ?? null;
|
|
337
|
+
}
|
|
338
|
+
function readEffectiveTsConfig(configPath, cache, diagnostics) {
|
|
339
|
+
const normalized = path.resolve(configPath);
|
|
340
|
+
if (cache.has(normalized)) {
|
|
341
|
+
return cache.get(normalized) ?? null;
|
|
342
|
+
}
|
|
343
|
+
cache.set(normalized, null);
|
|
344
|
+
const raw = readRawTsConfig(normalized, diagnostics);
|
|
345
|
+
if (!raw) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
const parentPath = raw.extends ? resolveExtendsTsConfig(normalized, raw.extends) : null;
|
|
349
|
+
const parent = parentPath ? readEffectiveTsConfig(parentPath, cache, diagnostics) : null;
|
|
350
|
+
const configDir = path.dirname(normalized);
|
|
351
|
+
const baseUrl = raw.compilerOptions?.baseUrl
|
|
352
|
+
? path.resolve(configDir, raw.compilerOptions.baseUrl)
|
|
353
|
+
: parent?.baseUrl ?? configDir;
|
|
354
|
+
const localPaths = raw.compilerOptions?.paths;
|
|
355
|
+
const paths = localPaths
|
|
356
|
+
? Object.entries(localPaths)
|
|
357
|
+
.flatMap(([pattern, targets]) => createPathMappings(pattern, targets, baseUrl))
|
|
358
|
+
.sort(compareMappings)
|
|
359
|
+
: parent?.paths ?? [];
|
|
360
|
+
const result = {
|
|
361
|
+
file: normalized,
|
|
362
|
+
baseUrl,
|
|
363
|
+
paths,
|
|
364
|
+
...(raw.files ? { files: raw.files } : {}),
|
|
365
|
+
...(raw.include ? { include: raw.include } : {}),
|
|
366
|
+
...(raw.exclude ? { exclude: raw.exclude } : {}),
|
|
367
|
+
...(raw.references ? { references: raw.references.map((reference) => path.resolve(configDir, reference)) } : {}),
|
|
368
|
+
...(typeof raw.compilerOptions?.composite === "boolean" ? { composite: raw.compilerOptions.composite } : typeof parent?.composite === "boolean" ? { composite: parent.composite } : {}),
|
|
369
|
+
...(raw.compilerOptions?.module ? { module: raw.compilerOptions.module } : parent?.module ? { module: parent.module } : {}),
|
|
370
|
+
...(raw.compilerOptions?.moduleResolution ? { moduleResolution: raw.compilerOptions.moduleResolution } : parent?.moduleResolution ? { moduleResolution: parent.moduleResolution } : {}),
|
|
371
|
+
...(raw.compilerOptions?.customConditions ? { customConditions: raw.compilerOptions.customConditions } : parent?.customConditions ? { customConditions: parent.customConditions } : {}),
|
|
372
|
+
...(raw.compilerOptions?.rootDir ? { rootDir: path.resolve(configDir, raw.compilerOptions.rootDir) } : parent?.rootDir ? { rootDir: parent.rootDir } : {}),
|
|
373
|
+
...(raw.compilerOptions?.rootDirs ? { rootDirs: raw.compilerOptions.rootDirs.map((entry) => path.resolve(configDir, entry)) } : parent?.rootDirs ? { rootDirs: parent.rootDirs } : {}),
|
|
374
|
+
...(parentPath ? { extends: parentPath } : {})
|
|
375
|
+
};
|
|
376
|
+
cache.set(normalized, result);
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
function readRawTsConfig(file, diagnostics) {
|
|
380
|
+
try {
|
|
381
|
+
const parsed = typescript_1.default.parseConfigFileTextToJson(file, fs.readFileSync(file, "utf8"));
|
|
382
|
+
if (parsed.error) {
|
|
383
|
+
diagnostics.push({
|
|
384
|
+
code: "TOPOLOGY_TSCONFIG_PARSE_FAILED",
|
|
385
|
+
message: typescript_1.default.flattenDiagnosticMessageText(parsed.error.messageText, "\n"),
|
|
386
|
+
file
|
|
387
|
+
});
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
const raw = isRecord(parsed.config) ? parsed.config : {};
|
|
391
|
+
const compilerOptions = isRecord(raw.compilerOptions) ? raw.compilerOptions : {};
|
|
392
|
+
const paths = isRecord(compilerOptions.paths) ? readPathsObject(compilerOptions.paths) : undefined;
|
|
393
|
+
return {
|
|
394
|
+
file,
|
|
395
|
+
...(typeof raw.extends === "string" ? { extends: raw.extends } : {}),
|
|
396
|
+
...(Array.isArray(raw.files) ? { files: readStringArray(raw.files) } : {}),
|
|
397
|
+
...(Array.isArray(raw.include) ? { include: readStringArray(raw.include) } : {}),
|
|
398
|
+
...(Array.isArray(raw.exclude) ? { exclude: readStringArray(raw.exclude) } : {}),
|
|
399
|
+
...(Array.isArray(raw.references) ? { references: readTsConfigReferencePaths(raw.references) } : {}),
|
|
400
|
+
compilerOptions: {
|
|
401
|
+
...(typeof compilerOptions.baseUrl === "string" ? { baseUrl: compilerOptions.baseUrl } : {}),
|
|
402
|
+
...(paths ? { paths } : {}),
|
|
403
|
+
...(typeof compilerOptions.composite === "boolean" ? { composite: compilerOptions.composite } : {}),
|
|
404
|
+
...(typeof compilerOptions.module === "string" ? { module: compilerOptions.module } : {}),
|
|
405
|
+
...(typeof compilerOptions.moduleResolution === "string" ? { moduleResolution: compilerOptions.moduleResolution } : {}),
|
|
406
|
+
...(Array.isArray(compilerOptions.customConditions) ? { customConditions: readStringArray(compilerOptions.customConditions) } : {}),
|
|
407
|
+
...(typeof compilerOptions.rootDir === "string" ? { rootDir: compilerOptions.rootDir } : {}),
|
|
408
|
+
...(Array.isArray(compilerOptions.rootDirs) ? { rootDirs: readStringArray(compilerOptions.rootDirs) } : {})
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
diagnostics.push({
|
|
414
|
+
code: "TOPOLOGY_TSCONFIG_UNREADABLE",
|
|
415
|
+
message: error instanceof Error ? error.message : "Could not read tsconfig.",
|
|
416
|
+
file
|
|
417
|
+
});
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function createPathMappings(pattern, targets, baseUrl) {
|
|
422
|
+
return [{
|
|
423
|
+
pattern,
|
|
424
|
+
targets,
|
|
425
|
+
baseUrl,
|
|
426
|
+
specificity: pattern.replace("*", "").length
|
|
427
|
+
}];
|
|
428
|
+
}
|
|
429
|
+
function aliasCandidate(targetNoExt, mapping, rawTarget) {
|
|
430
|
+
const starIndex = rawTarget.indexOf("*");
|
|
431
|
+
if (starIndex < 0) {
|
|
432
|
+
const absoluteTarget = withoutSourceExtension(path.resolve(mapping.baseUrl, rawTarget));
|
|
433
|
+
return absoluteTarget === targetNoExt && !mapping.pattern.includes("*") ? mapping.pattern : null;
|
|
434
|
+
}
|
|
435
|
+
const targetPrefix = withoutSourceExtension(path.resolve(mapping.baseUrl, rawTarget.slice(0, starIndex)));
|
|
436
|
+
const targetSuffix = withoutSourceExtension(rawTarget.slice(starIndex + 1));
|
|
437
|
+
if (!targetNoExt.startsWith(targetPrefix) || (targetSuffix && !targetNoExt.endsWith(targetSuffix))) {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
const wildcard = targetNoExt.slice(targetPrefix.length, targetSuffix ? -targetSuffix.length : undefined).replace(/^[/\\]/, "");
|
|
441
|
+
return mapping.pattern.replace("*", wildcard.replace(/\\/g, "/"));
|
|
442
|
+
}
|
|
443
|
+
function packageRelation(root, from, to) {
|
|
444
|
+
const fromLabel = from ? toDisplayPath(root, from.root) : "<unknown>";
|
|
445
|
+
const toLabel = to ? toDisplayPath(root, to.root) : "<unknown>";
|
|
446
|
+
if (!from || !to) {
|
|
447
|
+
return {
|
|
448
|
+
from: fromLabel,
|
|
449
|
+
to: toLabel,
|
|
450
|
+
reachable: false,
|
|
451
|
+
reasons: ["package boundary is unknown"]
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
if (from.root === to.root) {
|
|
455
|
+
return {
|
|
456
|
+
from: fromLabel,
|
|
457
|
+
to: toLabel,
|
|
458
|
+
reachable: true,
|
|
459
|
+
reasons: ["same package"]
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
if (to.name && from.dependencies.includes(to.name)) {
|
|
463
|
+
return {
|
|
464
|
+
from: fromLabel,
|
|
465
|
+
to: toLabel,
|
|
466
|
+
reachable: true,
|
|
467
|
+
reasons: [`${from.name ?? fromLabel} declares dependency ${to.name}`]
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
const referenceReason = tsconfigReferenceReason(root, from, to);
|
|
471
|
+
if (referenceReason) {
|
|
472
|
+
return {
|
|
473
|
+
from: fromLabel,
|
|
474
|
+
to: toLabel,
|
|
475
|
+
reachable: true,
|
|
476
|
+
reasons: [referenceReason]
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
return {
|
|
480
|
+
from: fromLabel,
|
|
481
|
+
to: toLabel,
|
|
482
|
+
reachable: false,
|
|
483
|
+
reasons: to.name ? [`missing dependency ${to.name}`] : ["target package has no name"]
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function walkPackageJson(root) {
|
|
487
|
+
const results = [];
|
|
488
|
+
visit(root);
|
|
489
|
+
return results;
|
|
490
|
+
function visit(dir) {
|
|
491
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
492
|
+
const full = path.join(dir, entry.name);
|
|
493
|
+
if (entry.isDirectory()) {
|
|
494
|
+
if (!EXCLUDED_DIRS.has(entry.name)) {
|
|
495
|
+
visit(full);
|
|
496
|
+
}
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
if (entry.isFile() && entry.name === "package.json") {
|
|
500
|
+
results.push(full);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
function readWorkspacePackageFilter(root, diagnostics) {
|
|
506
|
+
const rootPackageJson = path.join(root, "package.json");
|
|
507
|
+
const patterns = [
|
|
508
|
+
...readPackageJsonWorkspacePatterns(rootPackageJson, diagnostics),
|
|
509
|
+
...readPnpmWorkspacePatterns(path.join(root, "pnpm-workspace.yaml"), diagnostics)
|
|
510
|
+
];
|
|
511
|
+
const positives = uniqueStrings(patterns.filter((pattern) => !pattern.startsWith("!")));
|
|
512
|
+
const negatives = uniqueStrings(patterns.filter((pattern) => pattern.startsWith("!")).map((pattern) => pattern.slice(1)));
|
|
513
|
+
if (positives.length === 0) {
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
return (packageJson) => {
|
|
517
|
+
if (path.resolve(packageJson) === path.resolve(rootPackageJson)) {
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
const packageDir = toDisplayPath(root, path.dirname(packageJson));
|
|
521
|
+
return positives.some((pattern) => workspacePatternMatches(packageDir, pattern)) &&
|
|
522
|
+
!negatives.some((pattern) => workspacePatternMatches(packageDir, pattern));
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
function workspacePatternMatches(packageDir, pattern) {
|
|
526
|
+
const normalizedPattern = pattern.replace(/\\/g, "/").replace(/\/$/, "");
|
|
527
|
+
if (!containsGlob(normalizedPattern)) {
|
|
528
|
+
return packageDir === normalizedPattern;
|
|
529
|
+
}
|
|
530
|
+
return globToRegExp(normalizedPattern).test(packageDir);
|
|
531
|
+
}
|
|
532
|
+
function readPackageJsonWorkspacePatterns(file, diagnostics) {
|
|
533
|
+
if (!fs.existsSync(file)) {
|
|
534
|
+
return [];
|
|
535
|
+
}
|
|
536
|
+
try {
|
|
537
|
+
const raw = parseJsoncObject(fs.readFileSync(file, "utf8"));
|
|
538
|
+
const workspaces = raw.workspaces;
|
|
539
|
+
if (Array.isArray(workspaces)) {
|
|
540
|
+
return readStringArray(workspaces);
|
|
541
|
+
}
|
|
542
|
+
if (isRecord(workspaces) && Array.isArray(workspaces.packages)) {
|
|
543
|
+
return readStringArray(workspaces.packages);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
catch (error) {
|
|
547
|
+
diagnostics.push({
|
|
548
|
+
code: "TOPOLOGY_WORKSPACE_PACKAGE_JSON_UNREADABLE",
|
|
549
|
+
message: error instanceof Error ? error.message : "Could not read package workspaces.",
|
|
550
|
+
file: toDisplayPath(path.dirname(file), file)
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
return [];
|
|
554
|
+
}
|
|
555
|
+
function readPnpmWorkspacePatterns(file, diagnostics) {
|
|
556
|
+
if (!fs.existsSync(file)) {
|
|
557
|
+
return [];
|
|
558
|
+
}
|
|
559
|
+
try {
|
|
560
|
+
const patterns = [];
|
|
561
|
+
const lines = fs.readFileSync(file, "utf8").split(/\r?\n/);
|
|
562
|
+
let inPackages = false;
|
|
563
|
+
for (const line of lines) {
|
|
564
|
+
if (/^\s*packages\s*:\s*$/.test(line)) {
|
|
565
|
+
inPackages = true;
|
|
566
|
+
continue;
|
|
567
|
+
}
|
|
568
|
+
if (inPackages && /^\S/.test(line) && !/^\s*-/.test(line)) {
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
if (!inPackages) {
|
|
572
|
+
continue;
|
|
573
|
+
}
|
|
574
|
+
const match = line.match(/^\s*-\s*['"]?([^'"]+?)['"]?\s*(?:#.*)?$/);
|
|
575
|
+
if (match?.[1]) {
|
|
576
|
+
patterns.push(match[1].trim());
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
return patterns;
|
|
580
|
+
}
|
|
581
|
+
catch (error) {
|
|
582
|
+
diagnostics.push({
|
|
583
|
+
code: "TOPOLOGY_PNPM_WORKSPACE_UNREADABLE",
|
|
584
|
+
message: error instanceof Error ? error.message : "Could not read pnpm workspace.",
|
|
585
|
+
file: toDisplayPath(path.dirname(file), file)
|
|
586
|
+
});
|
|
587
|
+
return [];
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
function dependencyNames(raw) {
|
|
591
|
+
return uniqueStrings([
|
|
592
|
+
...objectKeys(raw.dependencies),
|
|
593
|
+
...objectKeys(raw.devDependencies),
|
|
594
|
+
...objectKeys(raw.peerDependencies),
|
|
595
|
+
...objectKeys(raw.optionalDependencies)
|
|
596
|
+
]);
|
|
597
|
+
}
|
|
598
|
+
function normalizePackageMapValue(value) {
|
|
599
|
+
if (isRecord(value)) {
|
|
600
|
+
return value;
|
|
601
|
+
}
|
|
602
|
+
if (typeof value === "string" || Array.isArray(value)) {
|
|
603
|
+
return { ".": value };
|
|
604
|
+
}
|
|
605
|
+
return undefined;
|
|
606
|
+
}
|
|
607
|
+
function objectKeys(value) {
|
|
608
|
+
return isRecord(value) ? Object.keys(value).sort() : [];
|
|
609
|
+
}
|
|
610
|
+
function readPathsObject(value) {
|
|
611
|
+
const paths = {};
|
|
612
|
+
for (const [key, rawTargets] of Object.entries(value)) {
|
|
613
|
+
if (!Array.isArray(rawTargets)) {
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
const targets = rawTargets.filter((target) => typeof target === "string" && target.trim() !== "");
|
|
617
|
+
if (targets.length > 0) {
|
|
618
|
+
paths[key] = targets;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
return Object.keys(paths).length > 0 ? paths : undefined;
|
|
622
|
+
}
|
|
623
|
+
function resolveExtendsTsConfig(configPath, rawExtends) {
|
|
624
|
+
const configDir = path.dirname(configPath);
|
|
625
|
+
const base = rawExtends.startsWith(".") || path.isAbsolute(rawExtends)
|
|
626
|
+
? path.resolve(configDir, rawExtends)
|
|
627
|
+
: path.resolve(configDir, "node_modules", rawExtends);
|
|
628
|
+
const candidates = path.extname(base)
|
|
629
|
+
? [base]
|
|
630
|
+
: [`${base}.json`, path.join(base, "tsconfig.json")];
|
|
631
|
+
return candidates.find((candidate) => fs.existsSync(candidate) && fs.statSync(candidate).isFile()) ?? null;
|
|
632
|
+
}
|
|
633
|
+
function resolveInsideRoot(root, value) {
|
|
634
|
+
const resolved = path.resolve(root, value);
|
|
635
|
+
if (!isPathInsideOrEqual(resolved, root)) {
|
|
636
|
+
throw new errors_1.CliError("TOPOLOGY_PATH_OUTSIDE_WORKSPACE", "Topology paths must stay inside the workspace.", {
|
|
637
|
+
root,
|
|
638
|
+
path: value
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
return resolved;
|
|
642
|
+
}
|
|
643
|
+
function relativeSpecifier(fromFile, toFile) {
|
|
644
|
+
let specifier = withoutSourceExtension(path.relative(path.dirname(fromFile), toFile)).replace(/\\/g, "/");
|
|
645
|
+
if (!specifier.startsWith(".")) {
|
|
646
|
+
specifier = `./${specifier}`;
|
|
647
|
+
}
|
|
648
|
+
return specifier;
|
|
649
|
+
}
|
|
650
|
+
function packageSubpath(packageRoot, toFile) {
|
|
651
|
+
const relative = withoutSourceExtension(path.relative(packageRoot, toFile)).replace(/\\/g, "/");
|
|
652
|
+
const withoutSrc = relative.replace(/^src\//, "");
|
|
653
|
+
return withoutSrc === "index" ? "" : withoutSrc;
|
|
654
|
+
}
|
|
655
|
+
function packageExportsSubpath(pkg, subpath) {
|
|
656
|
+
if (!pkg.exports) {
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
const key = `./${subpath}`;
|
|
660
|
+
return packageMapAllowsSubpath(pkg.exports, key);
|
|
661
|
+
}
|
|
662
|
+
function packageMapAllowsSubpath(map, key) {
|
|
663
|
+
if (Object.prototype.hasOwnProperty.call(map, key) ||
|
|
664
|
+
Object.prototype.hasOwnProperty.call(map, `${key}.js`) ||
|
|
665
|
+
Object.prototype.hasOwnProperty.call(map, `${key}.ts`)) {
|
|
666
|
+
return true;
|
|
667
|
+
}
|
|
668
|
+
for (const pattern of Object.keys(map)) {
|
|
669
|
+
if (!pattern.includes("*")) {
|
|
670
|
+
continue;
|
|
671
|
+
}
|
|
672
|
+
const [prefix = "", suffix = ""] = pattern.split("*");
|
|
673
|
+
if (key.startsWith(prefix) && key.endsWith(suffix)) {
|
|
674
|
+
return true;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
function packageImportCandidate(pkg, toFile) {
|
|
680
|
+
if (!pkg.imports) {
|
|
681
|
+
return null;
|
|
682
|
+
}
|
|
683
|
+
const relative = withoutSourceExtension(path.relative(pkg.root, toFile)).replace(/\\/g, "/");
|
|
684
|
+
for (const [pattern, rawTarget] of Object.entries(pkg.imports)) {
|
|
685
|
+
if (!pattern.startsWith("#")) {
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
const specifier = packageImportSpecifierForTarget(pattern, rawTarget, relative);
|
|
689
|
+
if (specifier) {
|
|
690
|
+
return {
|
|
691
|
+
specifier,
|
|
692
|
+
kind: "package-import",
|
|
693
|
+
valid: true,
|
|
694
|
+
...(pkg.name ? { packageName: pkg.name } : {}),
|
|
695
|
+
reason: `matched package imports pattern ${pattern}`
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return null;
|
|
700
|
+
}
|
|
701
|
+
function packageImportSpecifierForTarget(pattern, rawTarget, relativeTargetNoExt) {
|
|
702
|
+
const targets = flattenPackageTargetStrings(rawTarget);
|
|
703
|
+
for (const target of targets) {
|
|
704
|
+
const normalized = withoutSourceExtension(target.replace(/^\.\//, "")).replace(/\\/g, "/");
|
|
705
|
+
const starIndex = normalized.indexOf("*");
|
|
706
|
+
if (starIndex < 0) {
|
|
707
|
+
if (normalized === relativeTargetNoExt && !pattern.includes("*")) {
|
|
708
|
+
return pattern;
|
|
709
|
+
}
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
const prefix = normalized.slice(0, starIndex);
|
|
713
|
+
const suffix = normalized.slice(starIndex + 1);
|
|
714
|
+
if (!relativeTargetNoExt.startsWith(prefix) || (suffix && !relativeTargetNoExt.endsWith(suffix))) {
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
const wildcard = relativeTargetNoExt.slice(prefix.length, suffix ? -suffix.length : undefined).replace(/^[/\\]/, "");
|
|
718
|
+
return pattern.replace("*", wildcard);
|
|
719
|
+
}
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
function flattenPackageTargetStrings(value) {
|
|
723
|
+
if (typeof value === "string") {
|
|
724
|
+
return [value];
|
|
725
|
+
}
|
|
726
|
+
if (Array.isArray(value)) {
|
|
727
|
+
return value.flatMap(flattenPackageTargetStrings);
|
|
728
|
+
}
|
|
729
|
+
if (isRecord(value)) {
|
|
730
|
+
return Object.values(value).flatMap(flattenPackageTargetStrings);
|
|
731
|
+
}
|
|
732
|
+
return [];
|
|
733
|
+
}
|
|
734
|
+
function withoutSourceExtension(file) {
|
|
735
|
+
const ext = path.extname(file);
|
|
736
|
+
return SOURCE_EXTENSIONS.includes(ext) ? file.slice(0, -ext.length) : file;
|
|
737
|
+
}
|
|
738
|
+
function compareMappings(left, right) {
|
|
739
|
+
return right.specificity - left.specificity || left.pattern.localeCompare(right.pattern);
|
|
740
|
+
}
|
|
741
|
+
function compareBoundaryRelations(left, right) {
|
|
742
|
+
return Number(right.reachable) - Number(left.reachable) || left.from.localeCompare(right.from) || left.to.localeCompare(right.to);
|
|
743
|
+
}
|
|
744
|
+
function tsconfigOwnerRank(file) {
|
|
745
|
+
return path.basename(file).toLowerCase() === "tsconfig.json" ? 0 : 1;
|
|
746
|
+
}
|
|
747
|
+
function tsconfigReferenceReason(root, from, to) {
|
|
748
|
+
if (!from || !to) {
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
const fromConfig = path.join(from.root, "tsconfig.json");
|
|
752
|
+
if (!fs.existsSync(fromConfig)) {
|
|
753
|
+
return null;
|
|
754
|
+
}
|
|
755
|
+
const raw = readRawTsConfig(fromConfig, []);
|
|
756
|
+
if (!raw?.references) {
|
|
757
|
+
return null;
|
|
758
|
+
}
|
|
759
|
+
const targetConfig = path.join(to.root, "tsconfig.json");
|
|
760
|
+
const referenced = raw.references.some((reference) => {
|
|
761
|
+
const resolved = path.resolve(path.dirname(fromConfig), reference);
|
|
762
|
+
return path.resolve(resolved) === path.resolve(to.root) ||
|
|
763
|
+
path.resolve(resolved, "tsconfig.json") === path.resolve(targetConfig) ||
|
|
764
|
+
path.resolve(resolved) === path.resolve(targetConfig);
|
|
765
|
+
});
|
|
766
|
+
return referenced ? `${toDisplayPath(root, fromConfig)} references ${toDisplayPath(root, targetConfig)}` : null;
|
|
767
|
+
}
|
|
768
|
+
function fileMatchesTsConfig(root, file, config) {
|
|
769
|
+
const configPath = path.resolve(root, config.file);
|
|
770
|
+
const configDir = path.dirname(configPath);
|
|
771
|
+
const relative = path.relative(configDir, file).replace(/\\/g, "/");
|
|
772
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
if (config.files && config.files.length > 0) {
|
|
776
|
+
return config.files.some((entry) => path.resolve(configDir, entry) === file);
|
|
777
|
+
}
|
|
778
|
+
const include = config.include && config.include.length > 0 ? config.include : ["**/*"];
|
|
779
|
+
const exclude = config.exclude ?? ["node_modules", "bower_components", "jspm_packages"];
|
|
780
|
+
return include.some((pattern) => globMatches(relative, pattern)) &&
|
|
781
|
+
!exclude.some((pattern) => globMatches(relative, pattern) || relative === pattern || relative.startsWith(`${pattern.replace(/\/$/, "")}/`));
|
|
782
|
+
}
|
|
783
|
+
function globMatches(relativePath, pattern) {
|
|
784
|
+
const normalizedPattern = pattern.replace(/\\/g, "/").replace(/\/$/, "");
|
|
785
|
+
if (normalizedPattern === relativePath) {
|
|
786
|
+
return true;
|
|
787
|
+
}
|
|
788
|
+
if (!containsGlob(normalizedPattern)) {
|
|
789
|
+
return relativePath === normalizedPattern || relativePath.startsWith(`${normalizedPattern}/`);
|
|
790
|
+
}
|
|
791
|
+
return globToRegExp(normalizedPattern).test(relativePath);
|
|
792
|
+
}
|
|
793
|
+
function containsGlob(value) {
|
|
794
|
+
return value.includes("*") || value.includes("?");
|
|
795
|
+
}
|
|
796
|
+
function globToRegExp(pattern) {
|
|
797
|
+
let source = "^";
|
|
798
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
799
|
+
const char = pattern[index];
|
|
800
|
+
const next = pattern[index + 1];
|
|
801
|
+
const nextNext = pattern[index + 2];
|
|
802
|
+
if (char === "*" && next === "*" && nextNext === "/") {
|
|
803
|
+
source += "(?:.*/)?";
|
|
804
|
+
index += 2;
|
|
805
|
+
continue;
|
|
806
|
+
}
|
|
807
|
+
if (char === "*" && next === "*") {
|
|
808
|
+
source += ".*";
|
|
809
|
+
index += 1;
|
|
810
|
+
continue;
|
|
811
|
+
}
|
|
812
|
+
if (char === "*") {
|
|
813
|
+
source += "[^/]*";
|
|
814
|
+
continue;
|
|
815
|
+
}
|
|
816
|
+
if (char === "?") {
|
|
817
|
+
source += "[^/]";
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
820
|
+
source += escapeRegExp(char ?? "");
|
|
821
|
+
}
|
|
822
|
+
source += "$";
|
|
823
|
+
return new RegExp(source);
|
|
824
|
+
}
|
|
825
|
+
function readStringArray(value) {
|
|
826
|
+
return value.filter((item) => typeof item === "string" && item.trim() !== "");
|
|
827
|
+
}
|
|
828
|
+
function readTsConfigReferencePaths(value) {
|
|
829
|
+
return value.flatMap((item) => isRecord(item) && typeof item.path === "string" ? [item.path] : []);
|
|
830
|
+
}
|
|
831
|
+
function uniqueCandidates(candidates) {
|
|
832
|
+
const byKey = new Map();
|
|
833
|
+
for (const candidate of candidates) {
|
|
834
|
+
byKey.set(`${candidate.kind}\n${candidate.specifier}`, candidate);
|
|
835
|
+
}
|
|
836
|
+
return Array.from(byKey.values()).sort((left, right) => left.kind.localeCompare(right.kind) ||
|
|
837
|
+
left.specifier.length - right.specifier.length ||
|
|
838
|
+
left.specifier.localeCompare(right.specifier));
|
|
839
|
+
}
|
|
840
|
+
function uniqueStrings(values) {
|
|
841
|
+
return Array.from(new Set(values.filter((value) => value !== ""))).sort();
|
|
842
|
+
}
|
|
843
|
+
function isPathInsideOrEqual(candidate, parent) {
|
|
844
|
+
const relative = path.relative(path.resolve(parent), path.resolve(candidate));
|
|
845
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
846
|
+
}
|
|
847
|
+
function toDisplayPath(root, file) {
|
|
848
|
+
const relative = path.relative(root, file).replace(/\\/g, "/");
|
|
849
|
+
return relative === "" ? "." : relative;
|
|
850
|
+
}
|
|
851
|
+
function parseJsoncObject(text) {
|
|
852
|
+
return JSON.parse(stripJsonComments(text));
|
|
853
|
+
}
|
|
854
|
+
function stripJsonComments(text) {
|
|
855
|
+
let result = "";
|
|
856
|
+
let inString = false;
|
|
857
|
+
let escaped = false;
|
|
858
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
859
|
+
const char = text[index] ?? "";
|
|
860
|
+
const next = text[index + 1] ?? "";
|
|
861
|
+
if (inString) {
|
|
862
|
+
result += char;
|
|
863
|
+
if (escaped) {
|
|
864
|
+
escaped = false;
|
|
865
|
+
}
|
|
866
|
+
else if (char === "\\") {
|
|
867
|
+
escaped = true;
|
|
868
|
+
}
|
|
869
|
+
else if (char === "\"") {
|
|
870
|
+
inString = false;
|
|
871
|
+
}
|
|
872
|
+
continue;
|
|
873
|
+
}
|
|
874
|
+
if (char === "\"") {
|
|
875
|
+
inString = true;
|
|
876
|
+
result += char;
|
|
877
|
+
continue;
|
|
878
|
+
}
|
|
879
|
+
if (char === "/" && next === "/") {
|
|
880
|
+
while (index < text.length && text[index] !== "\n") {
|
|
881
|
+
index += 1;
|
|
882
|
+
}
|
|
883
|
+
result += "\n";
|
|
884
|
+
continue;
|
|
885
|
+
}
|
|
886
|
+
if (char === "/" && next === "*") {
|
|
887
|
+
index += 2;
|
|
888
|
+
while (index < text.length && !(text[index] === "*" && text[index + 1] === "/")) {
|
|
889
|
+
index += 1;
|
|
890
|
+
}
|
|
891
|
+
index += 1;
|
|
892
|
+
continue;
|
|
893
|
+
}
|
|
894
|
+
result += char;
|
|
895
|
+
}
|
|
896
|
+
return result;
|
|
897
|
+
}
|
|
898
|
+
function isRecord(value) {
|
|
899
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
900
|
+
}
|
|
901
|
+
function escapeRegExp(value) {
|
|
902
|
+
return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
|
|
903
|
+
}
|