@depup/nx 23.2.1-depup.7 → 23.3.0-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -19
- package/changes.json +10 -54
- package/dist/bin/init-local.js +7 -1
- package/dist/nx-cloud-internals.d.ts +1 -0
- package/dist/nx-cloud-internals.js +9 -0
- package/dist/plugins/package-json.js +1 -1
- package/dist/src/command-line/add/add.js +5 -1
- package/dist/src/command-line/affected/affected.js +70 -9
- package/dist/src/command-line/affected/command-object.js +1 -1
- package/dist/src/command-line/format/format.js +2 -18
- package/dist/src/command-line/graph/graph.d.ts +31 -0
- package/dist/src/command-line/graph/graph.js +113 -20
- package/dist/src/command-line/init/implementation/add-nx-to-monorepo.js +0 -3
- package/dist/src/command-line/init/implementation/add-nx-to-nest.js +0 -3
- package/dist/src/command-line/init/implementation/add-nx-to-npm-repo.js +0 -3
- package/dist/src/command-line/init/implementation/angular/index.js +0 -3
- package/dist/src/command-line/init/implementation/angular/legacy-angular-versions.js +0 -3
- package/dist/src/command-line/init/implementation/format.js +2 -3
- package/dist/src/command-line/init/implementation/utils.d.ts +0 -1
- package/dist/src/command-line/init/implementation/utils.js +6 -9
- package/dist/src/command-line/init/init-v2.js +0 -3
- package/dist/src/command-line/migrate/agentic/capture-generator-output.d.ts +25 -0
- package/dist/src/command-line/migrate/agentic/capture-generator-output.js +121 -5
- package/dist/src/command-line/migrate/agentic/close-agent-session.d.ts +21 -0
- package/dist/src/command-line/migrate/agentic/close-agent-session.js +126 -0
- package/dist/src/command-line/migrate/agentic/definitions.d.ts +24 -0
- package/dist/src/command-line/migrate/agentic/definitions.js +79 -20
- package/dist/src/command-line/migrate/agentic/format-command.d.ts +14 -0
- package/dist/src/command-line/migrate/agentic/format-command.js +44 -0
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.d.ts +3 -3
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.js +3 -3
- package/dist/src/command-line/migrate/agentic/handoff.d.ts +50 -17
- package/dist/src/command-line/migrate/agentic/handoff.js +166 -24
- package/dist/src/command-line/migrate/agentic/instruction-files.d.ts +23 -0
- package/dist/src/command-line/migrate/agentic/instruction-files.js +41 -0
- package/dist/src/command-line/migrate/agentic/master/invocations.d.ts +12 -0
- package/dist/src/command-line/migrate/agentic/master/invocations.js +54 -0
- package/dist/src/command-line/migrate/agentic/master/run-master-session.d.ts +16 -0
- package/dist/src/command-line/migrate/agentic/master/run-master-session.js +175 -0
- package/dist/src/command-line/migrate/agentic/master/spawn-master.d.ts +31 -0
- package/dist/src/command-line/migrate/agentic/master/spawn-master.js +222 -0
- package/dist/src/command-line/migrate/agentic/prompts/final-validation.d.ts +13 -0
- package/dist/src/command-line/migrate/agentic/prompts/final-validation.js +41 -0
- package/dist/src/command-line/migrate/agentic/prompts/fragments.d.ts +17 -0
- package/dist/src/command-line/migrate/agentic/prompts/fragments.js +90 -0
- package/dist/src/command-line/migrate/agentic/prompts/generic-validation.js +4 -3
- package/dist/src/command-line/migrate/agentic/prompts/system-prompt.d.ts +25 -1
- package/dist/src/command-line/migrate/agentic/prompts/system-prompt.js +57 -34
- package/dist/src/command-line/migrate/agentic/run-step.js +28 -4
- package/dist/src/command-line/migrate/agentic/runner.d.ts +3 -15
- package/dist/src/command-line/migrate/agentic/runner.js +57 -239
- package/dist/src/command-line/migrate/agentic/terminal-repair.d.ts +1 -0
- package/dist/src/command-line/migrate/agentic/terminal-repair.js +27 -0
- package/dist/src/command-line/migrate/agentic/types.d.ts +23 -8
- package/dist/src/command-line/migrate/agentic/types.js +10 -7
- package/dist/src/command-line/migrate/agentic/windows-cmd.d.ts +33 -0
- package/dist/src/command-line/migrate/agentic/windows-cmd.js +88 -0
- package/dist/src/command-line/migrate/command-object.d.ts +2 -0
- package/dist/src/command-line/migrate/command-object.js +11 -1
- package/dist/src/command-line/migrate/deferred-output.d.ts +44 -0
- package/dist/src/command-line/migrate/deferred-output.js +92 -0
- package/dist/src/command-line/migrate/execute-migration.d.ts +9 -3
- package/dist/src/command-line/migrate/execute-migration.js +53 -16
- package/dist/src/command-line/migrate/migrate-analytics.d.ts +34 -9
- package/dist/src/command-line/migrate/migrate-analytics.js +71 -10
- package/dist/src/command-line/migrate/migrate-commits.d.ts +5 -4
- package/dist/src/command-line/migrate/migrate-commits.js +16 -6
- package/dist/src/command-line/migrate/migrate-config.d.ts +5 -2
- package/dist/src/command-line/migrate/migrate-config.js +19 -11
- package/dist/src/command-line/migrate/migrate-output.d.ts +3 -7
- package/dist/src/command-line/migrate/migrate-output.js +3 -7
- package/dist/src/command-line/migrate/migrate.d.ts +3 -0
- package/dist/src/command-line/migrate/migrate.js +183 -46
- package/dist/src/command-line/migrate/resolve-package-version.js +2 -19
- package/dist/src/command-line/migrate/run/agent-output.d.ts +11 -0
- package/dist/src/command-line/migrate/run/agent-output.js +21 -2
- package/dist/src/command-line/migrate/run/agent-work-payload.d.ts +37 -0
- package/dist/src/command-line/migrate/run/agent-work-payload.js +156 -0
- package/dist/src/command-line/migrate/run/atomic-write.d.ts +8 -0
- package/dist/src/command-line/migrate/run/atomic-write.js +17 -0
- package/dist/src/command-line/migrate/run/broker.d.ts +150 -0
- package/dist/src/command-line/migrate/run/broker.js +568 -0
- package/dist/src/command-line/migrate/run/clean-retry.d.ts +12 -0
- package/dist/src/command-line/migrate/run/clean-retry.js +99 -0
- package/dist/src/command-line/migrate/run/existing-run-report.d.ts +55 -0
- package/dist/src/command-line/migrate/run/existing-run-report.js +227 -0
- package/dist/src/command-line/migrate/run/give-up.d.ts +41 -0
- package/dist/src/command-line/migrate/run/give-up.js +148 -0
- package/dist/src/command-line/migrate/run/index.d.ts +9 -6
- package/dist/src/command-line/migrate/run/index.js +21 -2
- package/dist/src/command-line/migrate/run/issues.d.ts +127 -0
- package/dist/src/command-line/migrate/run/issues.js +1121 -0
- package/dist/src/command-line/migrate/run/orchestrator.d.ts +59 -1
- package/dist/src/command-line/migrate/run/orchestrator.js +1529 -457
- package/dist/src/command-line/migrate/run/run-id.d.ts +0 -8
- package/dist/src/command-line/migrate/run/run-id.js +0 -30
- package/dist/src/command-line/migrate/run/run-state.d.ts +77 -17
- package/dist/src/command-line/migrate/run/run-state.js +263 -32
- package/dist/src/command-line/migrate/run/runbook.d.ts +18 -0
- package/dist/src/command-line/migrate/run/runbook.js +118 -0
- package/dist/src/command-line/migrate/run/state-lock.d.ts +33 -2
- package/dist/src/command-line/migrate/run/state-lock.js +128 -2
- package/dist/src/command-line/migrate/run/state-machine.d.ts +50 -1
- package/dist/src/command-line/migrate/run/state-machine.js +339 -26
- package/dist/src/command-line/migrate/run/util.d.ts +3 -1
- package/dist/src/command-line/migrate/run/util.js +24 -3
- package/dist/src/command-line/migrate/run/worker.js +290 -129
- package/dist/src/command-line/migrate/step-actions.d.ts +1 -1
- package/dist/src/command-line/migrate/step-actions.js +7 -1
- package/dist/src/command-line/migrate/text.d.ts +6 -0
- package/dist/src/command-line/migrate/text.js +25 -0
- package/dist/src/command-line/migrate/version-skew-guard.js +2 -0
- package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +5 -11
- package/dist/src/command-line/release/publish.js +11 -8
- package/dist/src/command-line/release/utils/get-touched-projects-for-group.js +3 -3
- package/dist/src/command-line/release/utils/release-graph.js +1 -1
- package/dist/src/command-line/release/utils/remote-release-clients/github.js +5 -8
- package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +3 -3
- package/dist/src/command-line/release/utils/remote-release-clients/remote-release-client.d.ts +4 -2
- package/dist/src/command-line/release/utils/remote-release-clients/remote-release-client.js +37 -3
- package/dist/src/command-line/release/version/version-actions.d.ts +3 -0
- package/dist/src/command-line/reset/reset.js +10 -4
- package/dist/src/command-line/run/run-one.js +5 -1
- package/dist/src/command-line/run-many/run-many.js +6 -12
- package/dist/src/command-line/show/command-object.js +1 -1
- package/dist/src/command-line/show/projects.js +52 -1
- package/dist/src/command-line/yargs-utils/shared-options.d.ts +5 -1
- package/dist/src/command-line/yargs-utils/shared-options.js +38 -4
- package/dist/src/config/task-graph.d.ts +1 -1
- package/dist/src/config/workspace-json-project-json.d.ts +23 -1
- package/dist/src/core/graph/main.js +1 -1
- package/dist/src/core/graph/runtime.js +1 -1
- package/dist/src/core/graph/styles.js +1 -1
- package/dist/src/daemon/client/client.d.ts +14 -8
- package/dist/src/daemon/client/client.js +41 -12
- package/dist/src/daemon/message-types/get-plugin-capabilities.d.ts +5 -0
- package/dist/src/daemon/message-types/get-plugin-capabilities.js +11 -0
- package/dist/src/daemon/message-types/run-tasks-execution-hooks.d.ts +3 -2
- package/dist/src/daemon/message-types/select-affected-tasks.d.ts +21 -0
- package/dist/src/daemon/message-types/select-affected-tasks.js +11 -0
- package/dist/src/daemon/message-types/ultracache-configuration-version.d.ts +8 -0
- package/dist/src/daemon/message-types/ultracache-configuration-version.js +2 -0
- package/dist/src/daemon/server/dotenv-graph-changes.d.ts +1 -1
- package/dist/src/daemon/server/dotenv-graph-changes.js +2 -2
- package/dist/src/daemon/server/handle-get-plugin-capabilities.d.ts +2 -0
- package/dist/src/daemon/server/handle-get-plugin-capabilities.js +13 -0
- package/dist/src/daemon/server/handle-hash-tasks.d.ts +10 -2
- package/dist/src/daemon/server/handle-hash-tasks.js +18 -3
- package/dist/src/daemon/server/handle-select-affected-tasks.d.ts +3 -0
- package/dist/src/daemon/server/handle-select-affected-tasks.js +26 -0
- package/dist/src/daemon/server/handle-tasks-execution-hooks.d.ts +3 -2
- package/dist/src/daemon/server/{handle-outputs-changes.d.ts → handle-watch-events.d.ts} +4 -4
- package/dist/src/daemon/server/{handle-outputs-changes.js → handle-watch-events.js} +36 -37
- package/dist/src/daemon/server/outputs-tracking.d.ts +7 -19
- package/dist/src/daemon/server/outputs-tracking.js +7 -107
- package/dist/src/daemon/server/planning-context.d.ts +8 -0
- package/dist/src/daemon/server/planning-context.js +18 -0
- package/dist/src/daemon/server/project-graph-incremental-recomputation.d.ts +22 -7
- package/dist/src/daemon/server/project-graph-incremental-recomputation.js +104 -74
- package/dist/src/daemon/server/restart-checks.d.ts +22 -0
- package/dist/src/daemon/server/restart-checks.js +77 -0
- package/dist/src/daemon/server/server.d.ts +1 -0
- package/dist/src/daemon/server/server.js +54 -30
- package/dist/src/daemon/server/shutdown-utils.d.ts +0 -5
- package/dist/src/daemon/server/shutdown-utils.js +3 -26
- package/dist/src/daemon/server/ultracache-configuration-state.d.ts +7 -0
- package/dist/src/daemon/server/ultracache-configuration-state.js +36 -0
- package/dist/src/devkit-internals.d.ts +3 -1
- package/dist/src/devkit-internals.js +8 -3
- package/dist/src/executors/run-commands/run-commands.impl.d.ts +2 -1
- package/dist/src/executors/run-commands/run-commands.impl.js +19 -5
- package/dist/src/executors/run-commands/running-tasks.d.ts +5 -4
- package/dist/src/executors/run-commands/running-tasks.js +13 -13
- package/dist/src/hasher/create-task-hasher.d.ts +8 -1
- package/dist/src/hasher/create-task-hasher.js +13 -3
- package/dist/src/hasher/hash-plan-inspector.js +2 -2
- package/dist/src/hasher/hash-task.d.ts +2 -2
- package/dist/src/hasher/hash-task.js +28 -17
- package/dist/src/hasher/native-task-hasher-impl.d.ts +20 -4
- package/dist/src/hasher/native-task-hasher-impl.js +75 -9
- package/dist/src/hasher/task-hasher.d.ts +24 -7
- package/dist/src/hasher/task-hasher.js +27 -8
- package/dist/src/hasher/task-planning-context.d.ts +13 -0
- package/dist/src/hasher/task-planning-context.js +12 -0
- package/dist/src/native/index.d.ts +582 -21
- package/dist/src/native/index.js +3 -3
- package/dist/src/native/native-bindings.js +13 -1
- package/dist/src/native/nx.wasm32-wasi.debug.wasm +0 -0
- package/dist/src/native/nx.wasm32-wasi.wasm +0 -0
- package/dist/src/native/transform-objects.d.ts +11 -2
- package/dist/src/native/transform-objects.js +46 -0
- package/dist/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +15 -8
- package/dist/src/nx-cloud/update-manager.d.ts +3 -0
- package/dist/src/nx-cloud/update-manager.js +19 -13
- package/dist/src/nx-cloud/utilities/client.d.ts +1 -1
- package/dist/src/nx-cloud/utilities/client.js +1 -1
- package/dist/src/nx-cloud/utilities/is-workspace-claimed.js +2 -1
- package/dist/src/nx-cloud/utilities/nx-cloud-http-client.d.ts +5 -0
- package/dist/src/nx-cloud/utilities/nx-cloud-http-client.js +16 -0
- package/dist/src/nx-cloud/utilities/url-shorten.js +17 -10
- package/dist/src/plugins/js/index.js +45 -64
- package/dist/src/plugins/js/lock-file/lock-file.d.ts +4 -4
- package/dist/src/plugins/js/lock-file/lock-file.js +6 -7
- package/dist/src/plugins/js/lock-file/pnpm-parser.js +1 -1
- package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.d.ts +2 -0
- package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.js +22 -0
- package/dist/src/plugins/js/project-graph/affected/lock-file-changes.d.ts +10 -2
- package/dist/src/plugins/js/project-graph/affected/lock-file-changes.js +51 -29
- package/dist/src/plugins/js/project-graph/affected/npm-packages.d.ts +10 -2
- package/dist/src/plugins/js/project-graph/affected/npm-packages.js +32 -11
- package/dist/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +22 -18
- package/dist/src/plugins/js/utils/register.js +13 -4
- package/dist/src/plugins/package-json/create-nodes.d.ts +2 -2
- package/dist/src/plugins/package-json/create-nodes.js +13 -13
- package/dist/src/project-graph/affected/affected-project-graph-models.d.ts +14 -0
- package/dist/src/project-graph/affected/affected-project-graph.js +5 -18
- package/dist/src/project-graph/affected/affected-projects.d.ts +7 -0
- package/dist/src/project-graph/affected/affected-projects.js +42 -0
- package/dist/src/project-graph/affected/affected-reasons.d.ts +116 -0
- package/dist/src/project-graph/affected/affected-reasons.js +459 -0
- package/dist/src/project-graph/affected/affected-tasks.d.ts +103 -0
- package/dist/src/project-graph/affected/affected-tasks.js +386 -0
- package/dist/src/project-graph/affected/print-explanation.d.ts +11 -0
- package/dist/src/project-graph/affected/print-explanation.js +44 -0
- package/dist/src/project-graph/error-types.d.ts +5 -0
- package/dist/src/project-graph/error-types.js +44 -5
- package/dist/src/project-graph/file-utils.d.ts +2 -0
- package/dist/src/project-graph/file-utils.js +12 -3
- package/dist/src/project-graph/nx-deps-cache.d.ts +5 -2
- package/dist/src/project-graph/nx-deps-cache.js +4 -4
- package/dist/src/project-graph/plugins/get-plugins.d.ts +3 -1
- package/dist/src/project-graph/plugins/get-plugins.js +60 -82
- package/dist/src/project-graph/plugins/in-process-loader.d.ts +1 -1
- package/dist/src/project-graph/plugins/in-process-loader.js +1 -4
- package/dist/src/project-graph/plugins/isolation/index.d.ts +1 -1
- package/dist/src/project-graph/plugins/isolation/index.js +3 -1
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.d.ts +8 -0
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.js +42 -6
- package/dist/src/project-graph/plugins/isolation/load-isolated-plugin.d.ts +10 -1
- package/dist/src/project-graph/plugins/isolation/load-isolated-plugin.js +67 -17
- package/dist/src/project-graph/plugins/isolation/messaging.d.ts +3 -2
- package/dist/src/project-graph/plugins/isolation/plugin-worker.js +5 -1
- package/dist/src/project-graph/plugins/loaded-nx-plugin.d.ts +5 -2
- package/dist/src/project-graph/plugins/loaded-nx-plugin.js +14 -1
- package/dist/src/project-graph/plugins/nx-plugin-capabilities.d.ts +6 -0
- package/dist/src/project-graph/plugins/nx-plugin-capabilities.js +28 -0
- package/dist/src/project-graph/plugins/task-results-stub.d.ts +50 -0
- package/dist/src/project-graph/plugins/task-results-stub.js +111 -0
- package/dist/src/project-graph/plugins/tasks-execution-hooks.d.ts +3 -2
- package/dist/src/project-graph/plugins/tasks-execution-hooks.js +14 -1
- package/dist/src/project-graph/project-graph.js +43 -42
- package/dist/src/project-graph/utils/project-configuration/target-merging.js +67 -0
- package/dist/src/project-graph/utils/project-configuration/target-normalization.js +83 -0
- package/dist/src/project-graph/utils/project-configuration/utils.d.ts +1 -0
- package/dist/src/project-graph/utils/project-configuration/utils.js +1 -0
- package/dist/src/tasks-runner/batch/run-batch.js +15 -0
- package/dist/src/tasks-runner/cache.d.ts +37 -2
- package/dist/src/tasks-runner/cache.js +42 -1
- package/dist/src/tasks-runner/create-task-graph.d.ts +24 -1
- package/dist/src/tasks-runner/create-task-graph.js +57 -2
- package/dist/src/tasks-runner/default-tasks-runner.js +1 -1
- package/dist/src/tasks-runner/forked-process-task-runner.d.ts +1 -1
- package/dist/src/tasks-runner/forked-process-task-runner.js +11 -10
- package/dist/src/tasks-runner/init-tasks-runner.d.ts +7 -2
- package/dist/src/tasks-runner/init-tasks-runner.js +15 -7
- package/dist/src/tasks-runner/is-tui-enabled.js +4 -3
- package/dist/src/tasks-runner/life-cycle.d.ts +7 -0
- package/dist/src/tasks-runner/life-cycle.js +7 -0
- package/dist/src/tasks-runner/life-cycles/summary-terminal-output-life-cycle.d.ts +35 -0
- package/dist/src/tasks-runner/life-cycles/summary-terminal-output-life-cycle.js +146 -0
- package/dist/src/tasks-runner/prune-task-graph.d.ts +17 -0
- package/dist/src/tasks-runner/prune-task-graph.js +45 -0
- package/dist/src/tasks-runner/run-command.d.ts +41 -5
- package/dist/src/tasks-runner/run-command.js +98 -22
- package/dist/src/tasks-runner/running-tasks/batch-process.d.ts +93 -19
- package/dist/src/tasks-runner/running-tasks/batch-process.js +184 -88
- package/dist/src/tasks-runner/task-io-service.d.ts +11 -3
- package/dist/src/tasks-runner/task-io-service.js +14 -5
- package/dist/src/tasks-runner/task-orchestrator.d.ts +71 -4
- package/dist/src/tasks-runner/task-orchestrator.js +266 -66
- package/dist/src/tasks-runner/tasks-runner.d.ts +2 -0
- package/dist/src/tasks-runner/terminal-output-path.d.ts +11 -0
- package/dist/src/tasks-runner/terminal-output-path.js +18 -0
- package/dist/src/tasks-runner/utils.d.ts +5 -0
- package/dist/src/tasks-runner/utils.js +14 -2
- package/dist/src/ultracache/config.d.ts +21 -0
- package/dist/src/ultracache/config.js +29 -0
- package/dist/src/ultracache/fetch.d.ts +21 -0
- package/dist/src/ultracache/fetch.js +43 -0
- package/dist/src/ultracache/overrides.d.ts +17 -0
- package/dist/src/ultracache/overrides.js +61 -0
- package/dist/src/ultracache/report.d.ts +13 -0
- package/dist/src/ultracache/report.js +62 -0
- package/dist/src/ultracache/store.d.ts +41 -0
- package/dist/src/ultracache/store.js +158 -0
- package/dist/src/utils/ab-testing.d.ts +4 -1
- package/dist/src/utils/ab-testing.js +22 -19
- package/dist/src/utils/chunkify.d.ts +1 -7
- package/dist/src/utils/chunkify.js +2 -8
- package/dist/src/utils/command-line-utils.d.ts +20 -0
- package/dist/src/utils/command-line-utils.js +10 -3
- package/dist/src/utils/create-cli-options.d.ts +6 -0
- package/dist/src/utils/create-cli-options.js +29 -0
- package/dist/src/utils/db-connection.d.ts +2 -0
- package/dist/src/utils/db-connection.js +2 -0
- package/dist/src/utils/formatters/index.d.ts +6 -0
- package/dist/src/utils/formatters/index.js +5 -0
- package/dist/src/utils/formatters/prettier.d.ts +0 -8
- package/dist/src/utils/formatters/prettier.js +4 -26
- package/dist/src/utils/git-utils.d.ts +19 -0
- package/dist/src/utils/git-utils.js +97 -39
- package/dist/src/utils/handle-errors.js +5 -43
- package/dist/src/utils/http-client.d.ts +27 -0
- package/dist/src/utils/http-client.js +193 -0
- package/dist/src/utils/installed-nx-version.js +2 -48
- package/dist/src/utils/json-diff.d.ts +4 -2
- package/dist/src/utils/json-diff.js +6 -94
- package/dist/src/utils/min-release-age/packument.js +1 -1
- package/dist/src/utils/nx-cloud-utils.d.ts +2 -0
- package/dist/src/utils/nx-cloud-utils.js +6 -1
- package/dist/src/utils/output.d.ts +22 -3
- package/dist/src/utils/output.js +28 -5
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +49 -6
- package/dist/src/utils/package-manager.d.ts +6 -0
- package/dist/src/utils/package-manager.js +10 -0
- package/dist/src/utils/plugins/plugin-capabilities.js +7 -2
- package/dist/src/utils/project-graph-utils.d.ts +2 -0
- package/dist/src/utils/project-graph-utils.js +12 -0
- package/dist/src/utils/provenance.js +20 -4
- package/dist/src/utils/serialize-overrides-into-command-line.js +2 -4
- package/dist/src/utils/workspace-context.d.ts +51 -3
- package/dist/src/utils/workspace-context.js +174 -10
- package/package.json +38 -100
- package/schemas/nx-schema.json +38 -0
- package/schemas/project-schema.json +35 -0
- package/dist/src/daemon/server/file-watching/route-workspace-changes.d.ts +0 -9
- package/dist/src/daemon/server/file-watching/route-workspace-changes.js +0 -76
- package/dist/src/daemon/server/watcher.d.ts +0 -18
- package/dist/src/daemon/server/watcher.js +0 -126
- package/dist/src/nx-cloud/utilities/axios.d.ts +0 -4
- package/dist/src/nx-cloud/utilities/axios.js +0 -17
- package/dist/src/project-graph/affected/locators/project-glob-changes.d.ts +0 -2
- package/dist/src/project-graph/affected/locators/project-glob-changes.js +0 -47
- package/dist/src/project-graph/affected/locators/workspace-json-changes.d.ts +0 -4
- package/dist/src/project-graph/affected/locators/workspace-json-changes.js +0 -47
- package/dist/src/project-graph/affected/locators/workspace-projects.d.ts +0 -3
- package/dist/src/project-graph/affected/locators/workspace-projects.js +0 -74
- package/dist/src/utils/collapse-expanded-outputs.d.ts +0 -10
- package/dist/src/utils/collapse-expanded-outputs.js +0 -72
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WINDOWS_COMMAND_LINE_BUDGET = exports.WINDOWS_COMMAND_LINE_LIMIT = void 0;
|
|
4
|
+
exports.quoteCmdArg = quoteCmdArg;
|
|
5
|
+
exports.caretEscape = caretEscape;
|
|
6
|
+
exports.neutralizePercent = neutralizePercent;
|
|
7
|
+
exports.withinCommandLineBudget = withinCommandLineBudget;
|
|
8
|
+
exports.adaptSpawnForWindowsShim = adaptSpawnForWindowsShim;
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
// Backslash-escape embedded quotes per MS C runtime convention, then wrap in
|
|
11
|
+
// quotes. Callers caret-escape cmd.exe metacharacters on top.
|
|
12
|
+
function quoteCmdArg(arg) {
|
|
13
|
+
return `"${arg.replace(/(\\*)"/g, '$1$1\\"').replace(/(\\*)$/, '$1$1')}"`;
|
|
14
|
+
}
|
|
15
|
+
const CMD_META_CHARS = /([()\][!^"`<>&|;, ])/g;
|
|
16
|
+
function caretEscape(quoted) {
|
|
17
|
+
return quoted.replace(CMD_META_CHARS, '^$1');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Stops cmd.exe expanding `%VAR%` inside an argument. A caret cannot escape
|
|
21
|
+
* `%`, since expansion runs before caret processing, so each `%` becomes
|
|
22
|
+
* `%%cd:~,%`: `%cd:~,%` is a zero-length substring of a built-in and expands to
|
|
23
|
+
* nothing, leaving the leading `%`. Runs after the caret passes so the `,` it
|
|
24
|
+
* introduces stays uncareted, which the substring syntax requires.
|
|
25
|
+
*/
|
|
26
|
+
function neutralizePercent(escaped) {
|
|
27
|
+
return escaped.replace(/%/g, '%%cd:~,%');
|
|
28
|
+
}
|
|
29
|
+
// "The maximum length of the string that you can use at the command prompt is
|
|
30
|
+
// 8191 characters".
|
|
31
|
+
// https://learn.microsoft.com/troubleshoot/windows-client/shell-experience/command-line-string-limitation
|
|
32
|
+
exports.WINDOWS_COMMAND_LINE_LIMIT = 8191;
|
|
33
|
+
// Absorbs cmd.exe's own accounting of the string, which cannot be measured
|
|
34
|
+
// from here.
|
|
35
|
+
const WINDOWS_COMMAND_LINE_RESERVE = 1000;
|
|
36
|
+
exports.WINDOWS_COMMAND_LINE_BUDGET = exports.WINDOWS_COMMAND_LINE_LIMIT - WINDOWS_COMMAND_LINE_RESERVE;
|
|
37
|
+
function withinCommandLineBudget(adapted) {
|
|
38
|
+
return (adapted.commandLineLength === undefined ||
|
|
39
|
+
adapted.commandLineLength <= exports.WINDOWS_COMMAND_LINE_BUDGET);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Node's `spawn` cannot directly execute `.cmd` / `.bat` shims on Windows;
|
|
43
|
+
* `which` resolves to those when an agent was installed via npm. Wrap them in
|
|
44
|
+
* a `cmd.exe /c` invocation with `windowsVerbatimArguments` so quoting follows
|
|
45
|
+
* the cmd.exe convention rather than Node's default cooking.
|
|
46
|
+
*
|
|
47
|
+
* On non-Windows or for non-shim binaries this is a passthrough.
|
|
48
|
+
*/
|
|
49
|
+
function adaptSpawnForWindowsShim(binary, args, options) {
|
|
50
|
+
if (process.platform !== 'win32') {
|
|
51
|
+
return { binary, args: [...args], options };
|
|
52
|
+
}
|
|
53
|
+
const ext = (0, path_1.extname)(binary).toLowerCase();
|
|
54
|
+
if (ext !== '.cmd' && ext !== '.bat') {
|
|
55
|
+
return { binary, args: [...args], options };
|
|
56
|
+
}
|
|
57
|
+
assertNoLineBreaks(binary, args);
|
|
58
|
+
const cmdLine = [escapeCmdCommand(binary), ...args.map(escapeCmdArg)].join(' ');
|
|
59
|
+
const comspec = process.env.comspec || 'cmd.exe';
|
|
60
|
+
// Both modes are set rather than inherited, since a machine-wide registry
|
|
61
|
+
// setting can flip either: `/e:on` for the `%cd:~,%` substring, `/v:off` so a
|
|
62
|
+
// `!` stays literal. The outer quotes stop `cmd.exe /c` stripping the inner
|
|
63
|
+
// ones around the binary path.
|
|
64
|
+
const cmdArgs = ['/e:on', '/v:off', '/d', '/s', '/c', `"${cmdLine}"`];
|
|
65
|
+
return {
|
|
66
|
+
binary: comspec,
|
|
67
|
+
args: cmdArgs,
|
|
68
|
+
options: { ...options, windowsVerbatimArguments: true },
|
|
69
|
+
// `windowsVerbatimArguments` makes the command line the argv joined by
|
|
70
|
+
// single spaces, so this is what CreateProcess and then cmd.exe see.
|
|
71
|
+
commandLineLength: [comspec, ...cmdArgs].join(' ').length,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// No escaping reproduces a line break on the other side, and cmd.exe truncates
|
|
75
|
+
// the command line at it, so the call is refused.
|
|
76
|
+
function assertNoLineBreaks(binary, args) {
|
|
77
|
+
const offending = [binary, ...args].find((value) => /[\r\n]/.test(value));
|
|
78
|
+
if (offending !== undefined) {
|
|
79
|
+
throw new Error(`Cannot pass a multi-line argument to "${binary}" on Windows: cmd.exe truncates the command line at the line break. Offending argument: ${JSON.stringify(offending.slice(0, 120))}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function escapeCmdArg(arg) {
|
|
83
|
+
return neutralizePercent(caretEscape(quoteCmdArg(arg)));
|
|
84
|
+
}
|
|
85
|
+
// cmd.exe parses the command portion twice, so it is caret-escaped twice.
|
|
86
|
+
function escapeCmdCommand(arg) {
|
|
87
|
+
return neutralizePercent(caretEscape(caretEscape(quoteCmdArg(arg))));
|
|
88
|
+
}
|
|
@@ -21,6 +21,7 @@ export interface MigrateArgs {
|
|
|
21
21
|
runMigration?: string;
|
|
22
22
|
runId?: string;
|
|
23
23
|
stepAction?: StepAction;
|
|
24
|
+
startFresh?: boolean;
|
|
24
25
|
include?: MigrateInclude;
|
|
25
26
|
/**
|
|
26
27
|
* nx.json `migrate.include` default. Consumed by `resolveInclude` only when the
|
|
@@ -34,6 +35,7 @@ export interface MigrateArgs {
|
|
|
34
35
|
commitPrefix?: string;
|
|
35
36
|
agentic?: AgenticArg;
|
|
36
37
|
validate?: boolean;
|
|
38
|
+
finalValidation?: boolean;
|
|
37
39
|
ifExists?: boolean;
|
|
38
40
|
interactive?: boolean;
|
|
39
41
|
[key: string]: any;
|
|
@@ -60,7 +60,7 @@ function withMigrationOptions(yargs) {
|
|
|
60
60
|
})
|
|
61
61
|
.option('runId', {
|
|
62
62
|
// Hidden with the orchestrator itself.
|
|
63
|
-
describe: 'The orchestrated migrate run to record a single migration into, or to reconcile when given
|
|
63
|
+
describe: 'The orchestrated migrate run to record a single migration into, to continue with --run-migrations, or to reconcile when given alone.',
|
|
64
64
|
type: 'string',
|
|
65
65
|
hidden: true,
|
|
66
66
|
})
|
|
@@ -69,6 +69,11 @@ function withMigrationOptions(yargs) {
|
|
|
69
69
|
choices: step_actions_1.STEP_ACTIONS,
|
|
70
70
|
type: 'string',
|
|
71
71
|
hidden: true,
|
|
72
|
+
})
|
|
73
|
+
.option('startFresh', {
|
|
74
|
+
describe: 'With --run-migrations and --run-id=<id> under the orchestrator: delete the record of the active migrate run the id names and start a new run over the whole plan. Migrations the deleted run applied stay applied.',
|
|
75
|
+
type: 'boolean',
|
|
76
|
+
hidden: true,
|
|
72
77
|
})
|
|
73
78
|
.option('ifExists', {
|
|
74
79
|
describe: `Run migrations only if the migrations file exists, if not continues successfully.`,
|
|
@@ -124,6 +129,11 @@ function withMigrationOptions(yargs) {
|
|
|
124
129
|
.option('validate', {
|
|
125
130
|
describe: 'When `--agentic` resolves to an enabled agent, run agent-driven validation after generator-only migrations that have no `prompt:` field. Defaults to on; pass `--no-validate` to opt out. Has no effect when `--agentic` is disabled, when running inside an outer agent, or when running non-interactively without an explicit agent.',
|
|
126
131
|
type: 'boolean',
|
|
132
|
+
})
|
|
133
|
+
.option('finalValidation', {
|
|
134
|
+
describe: 'With --run-migrations under the orchestrator: end the run with an agent validation pass over the whole workspace once every migration has run. On by default; pass --no-final-validation to opt out.',
|
|
135
|
+
type: 'boolean',
|
|
136
|
+
hidden: true,
|
|
127
137
|
})
|
|
128
138
|
.check(({ createCommits, commitPrefix, from, excludeAppliedMigrations, include, agentic, }) => {
|
|
129
139
|
// Only an explicit `--no-create-commits` is decidable here, before the
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type NoticeLevel = 'log' | 'warn' | 'error';
|
|
2
|
+
export type LineColor = 'dim' | 'yellow' | 'red';
|
|
3
|
+
export interface MigrateOutputSink {
|
|
4
|
+
notice(level: NoticeLevel, message: {
|
|
5
|
+
title: string;
|
|
6
|
+
bodyLines?: string[];
|
|
7
|
+
}): void;
|
|
8
|
+
line(color: LineColor, text: string): void;
|
|
9
|
+
/** A chunk of a package manager's own output. */
|
|
10
|
+
raw(chunk: string): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const terminalOutput: MigrateOutputSink;
|
|
13
|
+
export type DeferredOutputRecord = {
|
|
14
|
+
kind: 'notice';
|
|
15
|
+
level: NoticeLevel;
|
|
16
|
+
title: string;
|
|
17
|
+
bodyLines?: string[];
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'line';
|
|
20
|
+
color: LineColor;
|
|
21
|
+
text: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'raw';
|
|
24
|
+
text: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Collects the output as records that `replayDeferredOutput` prints later.
|
|
28
|
+
* The notices and lines are always kept; package manager output is bounded
|
|
29
|
+
* like generator output and rendered only on request. Render once the output
|
|
30
|
+
* is complete: a rendered collector accepts nothing more.
|
|
31
|
+
*/
|
|
32
|
+
export declare class DeferredOutputCollector implements MigrateOutputSink {
|
|
33
|
+
private readonly records;
|
|
34
|
+
private rendered;
|
|
35
|
+
private assertOpen;
|
|
36
|
+
notice(level: NoticeLevel, message: {
|
|
37
|
+
title: string;
|
|
38
|
+
bodyLines?: string[];
|
|
39
|
+
}): void;
|
|
40
|
+
line(color: LineColor, text: string): void;
|
|
41
|
+
raw(chunk: string): void;
|
|
42
|
+
render(rawOutput: 'keep' | 'drop'): DeferredOutputRecord[];
|
|
43
|
+
}
|
|
44
|
+
export declare function replayDeferredOutput(records: DeferredOutputRecord[], to?: MigrateOutputSink): void;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeferredOutputCollector = exports.terminalOutput = void 0;
|
|
4
|
+
exports.replayDeferredOutput = replayDeferredOutput;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const pc = tslib_1.__importStar(require("picocolors"));
|
|
7
|
+
const logger_1 = require("../../utils/logger");
|
|
8
|
+
const output_1 = require("../../utils/output");
|
|
9
|
+
exports.terminalOutput = {
|
|
10
|
+
notice: (level, message) => output_1.output[level](message),
|
|
11
|
+
line: (color, text) => logger_1.logger.info(pc[color](text)),
|
|
12
|
+
raw: (chunk) => process.stdout.write(chunk),
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Collects the output as records that `replayDeferredOutput` prints later.
|
|
16
|
+
* The notices and lines are always kept; package manager output is bounded
|
|
17
|
+
* like generator output and rendered only on request. Render once the output
|
|
18
|
+
* is complete: a rendered collector accepts nothing more.
|
|
19
|
+
*/
|
|
20
|
+
class DeferredOutputCollector {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.records = [];
|
|
23
|
+
this.rendered = false;
|
|
24
|
+
}
|
|
25
|
+
assertOpen() {
|
|
26
|
+
if (this.rendered) {
|
|
27
|
+
throw new Error('The deferred output was already rendered.');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
notice(level, message) {
|
|
31
|
+
this.assertOpen();
|
|
32
|
+
this.records.push({ kind: 'notice', level, ...message });
|
|
33
|
+
}
|
|
34
|
+
line(color, text) {
|
|
35
|
+
this.assertOpen();
|
|
36
|
+
this.records.push({ kind: 'line', color, text });
|
|
37
|
+
}
|
|
38
|
+
raw(chunk) {
|
|
39
|
+
this.assertOpen();
|
|
40
|
+
let block = this.records[this.records.length - 1];
|
|
41
|
+
if (block?.kind !== 'raw-block') {
|
|
42
|
+
// Lazy: the non-agentic migrate path must not load the agentic chain.
|
|
43
|
+
const { BoundedChunks } = require('./agentic/capture-generator-output');
|
|
44
|
+
block = { kind: 'raw-block', buffer: new BoundedChunks() };
|
|
45
|
+
this.records.push(block);
|
|
46
|
+
}
|
|
47
|
+
block.buffer.append(chunk);
|
|
48
|
+
}
|
|
49
|
+
render(rawOutput) {
|
|
50
|
+
this.rendered = true;
|
|
51
|
+
const records = [];
|
|
52
|
+
for (const record of this.records) {
|
|
53
|
+
if (record.kind !== 'raw-block') {
|
|
54
|
+
records.push(record);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (rawOutput === 'drop')
|
|
58
|
+
continue;
|
|
59
|
+
// The replay adds the final newline back.
|
|
60
|
+
const text = record.buffer.render();
|
|
61
|
+
records.push({
|
|
62
|
+
kind: 'raw',
|
|
63
|
+
text: text.endsWith('\n') ? text.slice(0, -1) : text,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return records;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.DeferredOutputCollector = DeferredOutputCollector;
|
|
70
|
+
function replayDeferredOutput(records, to = exports.terminalOutput) {
|
|
71
|
+
for (const record of records) {
|
|
72
|
+
switch (record.kind) {
|
|
73
|
+
case 'notice':
|
|
74
|
+
to.notice(record.level, {
|
|
75
|
+
title: record.title,
|
|
76
|
+
bodyLines: record.bodyLines,
|
|
77
|
+
});
|
|
78
|
+
break;
|
|
79
|
+
case 'line':
|
|
80
|
+
to.line(record.color, record.text);
|
|
81
|
+
break;
|
|
82
|
+
case 'raw':
|
|
83
|
+
if (record.text)
|
|
84
|
+
to.raw(`${record.text}\n`);
|
|
85
|
+
break;
|
|
86
|
+
default: {
|
|
87
|
+
const exhaustive = record;
|
|
88
|
+
throw new Error(`Unhandled output record: ${JSON.stringify(exhaustive)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { MigrationsJson } from '../../config/misc-interfaces';
|
|
2
2
|
import { FileChange } from '../../generators/tree';
|
|
3
3
|
import { ArrayPackageGroup, NxMigrationsConfiguration, PackageJson } from '../../utils/package-json';
|
|
4
|
+
import { type MigrateOutputSink } from './deferred-output';
|
|
4
5
|
interface PackageMigrationConfig extends NxMigrationsConfiguration {
|
|
5
6
|
packageJson: PackageJson;
|
|
6
7
|
packageGroup: ArrayPackageGroup;
|
|
7
8
|
}
|
|
8
9
|
export declare function readPackageMigrationConfig(packageName: string, dir: string): PackageMigrationConfig;
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* With a `sink`, stdin is ignored and stdout and stderr are collected for a
|
|
12
|
+
* caller sharing the terminal. On POSIX the child stays in nx's process
|
|
13
|
+
* group. Without a sink, the install owns the terminal.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runInstall(nxWorkspaceRoot?: string, phase?: MigrationInstallPhase, rerunCommand?: string, sink?: MigrateOutputSink): Promise<void>;
|
|
10
16
|
export type MigrationInstallPhase = 'pre-migration' | 'post-migration';
|
|
11
17
|
export declare class NpmPeerDepsInstallError extends Error {
|
|
12
18
|
constructor();
|
|
@@ -20,8 +26,8 @@ export declare class NpmPeerDepsInstallError extends Error {
|
|
|
20
26
|
*/
|
|
21
27
|
export declare function isNpmPeerDepsError(stderr: string): boolean;
|
|
22
28
|
export declare function formatSingleMigrationRerunCommand(migrationId: string): string;
|
|
23
|
-
export declare function logNpmPeerDepsError(phase: MigrationInstallPhase, rerunCommand?: string): void;
|
|
24
|
-
export declare function logSkippedPostMigrationInstall(root: string): void;
|
|
29
|
+
export declare function logNpmPeerDepsError(phase: MigrationInstallPhase, rerunCommand?: string, out?: MigrateOutputSink): void;
|
|
30
|
+
export declare function logSkippedPostMigrationInstall(root: string, out?: MigrateOutputSink): void;
|
|
25
31
|
export declare class ChangedDepInstaller {
|
|
26
32
|
private readonly root;
|
|
27
33
|
private readonly shouldSkipInstall;
|
|
@@ -20,6 +20,7 @@ exports.isAngularMigration = isAngularMigration;
|
|
|
20
20
|
const tslib_1 = require("tslib");
|
|
21
21
|
const pc = tslib_1.__importStar(require("picocolors"));
|
|
22
22
|
const child_process_1 = require("child_process");
|
|
23
|
+
const string_decoder_1 = require("string_decoder");
|
|
23
24
|
const path_1 = require("path");
|
|
24
25
|
const semver_1 = require("semver");
|
|
25
26
|
const handle_import_1 = require("../../utils/handle-import");
|
|
@@ -29,12 +30,12 @@ const logger_1 = require("../../utils/logger");
|
|
|
29
30
|
const text_1 = require("./text");
|
|
30
31
|
const package_json_1 = require("../../utils/package-json");
|
|
31
32
|
const package_manager_1 = require("../../utils/package-manager");
|
|
32
|
-
const output_1 = require("../../utils/output");
|
|
33
33
|
const fs_1 = require("fs");
|
|
34
34
|
const installation_directory_1 = require("../../utils/installation-directory");
|
|
35
35
|
const shell_quoting_1 = require("../../utils/shell-quoting");
|
|
36
36
|
const project_graph_1 = require("../../project-graph/project-graph");
|
|
37
37
|
const version_utils_1 = require("./version-utils");
|
|
38
|
+
const deferred_output_1 = require("./deferred-output");
|
|
38
39
|
function readPackageMigrationConfig(packageName, dir) {
|
|
39
40
|
const { path: packageJsonPath, packageJson: json } = (0, package_json_1.readModulePackageJson)(packageName, (0, installation_directory_1.getNxRequirePaths)(dir));
|
|
40
41
|
const config = (0, package_json_1.readNxMigrateConfig)(json);
|
|
@@ -61,32 +62,68 @@ function readPackageMigrationConfig(packageName, dir) {
|
|
|
61
62
|
};
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
+
/**
|
|
66
|
+
* With a `sink`, stdin is ignored and stdout and stderr are collected for a
|
|
67
|
+
* caller sharing the terminal. On POSIX the child stays in nx's process
|
|
68
|
+
* group. Without a sink, the install owns the terminal.
|
|
69
|
+
*/
|
|
70
|
+
function runInstall(nxWorkspaceRoot, phase = 'pre-migration', rerunCommand, sink) {
|
|
65
71
|
const cwd = nxWorkspaceRoot ?? process.cwd();
|
|
66
72
|
const packageManager = (0, package_manager_1.detectPackageManager)(cwd);
|
|
67
73
|
const pmCommands = (0, package_manager_1.getPackageManagerCommand)(packageManager, cwd);
|
|
74
|
+
const out = sink ?? deferred_output_1.terminalOutput;
|
|
68
75
|
const installCommand = `${pmCommands.install} ${pmCommands.ignoreScriptsFlag ?? ''}`;
|
|
69
|
-
|
|
76
|
+
out.notice('log', {
|
|
70
77
|
title: `Running '${installCommand}' to make sure necessary packages are installed`,
|
|
71
78
|
});
|
|
72
79
|
return new Promise((resolve, reject) => {
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
// stderr directly since
|
|
80
|
+
// npm's stderr is piped so peer dependency errors can be detected in it.
|
|
81
|
+
// Without a sink it is mirrored live and other package managers inherit
|
|
82
|
+
// stderr directly, since their output is not inspected.
|
|
76
83
|
const shouldCaptureStderr = packageManager === 'npm';
|
|
77
84
|
const child = (0, child_process_1.spawn)(installCommand, {
|
|
78
85
|
shell: true,
|
|
79
|
-
stdio:
|
|
86
|
+
stdio: sink
|
|
87
|
+
? ['ignore', 'pipe', 'pipe']
|
|
88
|
+
: ['inherit', 'inherit', shouldCaptureStderr ? 'pipe' : 'inherit'],
|
|
80
89
|
windowsHide: true,
|
|
81
90
|
cwd,
|
|
82
91
|
});
|
|
92
|
+
// Decoded per stream: a chunk boundary can split a multi-byte character,
|
|
93
|
+
// and a sequence still incomplete at the end is what `end()` returns.
|
|
94
|
+
const stdoutText = new string_decoder_1.StringDecoder('utf8');
|
|
95
|
+
const stderrText = new string_decoder_1.StringDecoder('utf8');
|
|
96
|
+
child.stdout?.on('data', (chunk) => out.raw(stdoutText.write(chunk)));
|
|
97
|
+
child.stdout?.on('end', () => out.raw(stdoutText.end()));
|
|
83
98
|
const stderrChunks = [];
|
|
84
99
|
child.stderr?.on('data', (chunk) => {
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
if (sink) {
|
|
101
|
+
out.raw(stderrText.write(chunk));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
process.stderr.write(chunk);
|
|
105
|
+
}
|
|
106
|
+
if (shouldCaptureStderr)
|
|
107
|
+
stderrChunks.push(chunk);
|
|
108
|
+
});
|
|
109
|
+
if (sink)
|
|
110
|
+
child.stderr.on('end', () => out.raw(stderrText.end()));
|
|
111
|
+
// With a sink the rejection waits for `close`, which follows the streams'
|
|
112
|
+
// `end`: a caller must be able to render what it collected on rejection.
|
|
113
|
+
let spawnError = null;
|
|
114
|
+
child.on('error', (error) => {
|
|
115
|
+
if (sink) {
|
|
116
|
+
spawnError = error;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
reject(error);
|
|
120
|
+
}
|
|
87
121
|
});
|
|
88
|
-
child.on('error', reject);
|
|
89
122
|
child.on('close', (code) => {
|
|
123
|
+
if (spawnError) {
|
|
124
|
+
reject(spawnError);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
90
127
|
if (code === 0) {
|
|
91
128
|
resolve();
|
|
92
129
|
return;
|
|
@@ -98,7 +135,7 @@ function runInstall(nxWorkspaceRoot, phase = 'pre-migration', rerunCommand) {
|
|
|
98
135
|
// (CLI migrate, `nx repair`, single-migration runner, etc.) surfaces
|
|
99
136
|
// it consistently. Top-level callers catch `NpmPeerDepsInstallError`
|
|
100
137
|
// and return a non-zero exit code without re-logging.
|
|
101
|
-
logNpmPeerDepsError(phase, rerunCommand);
|
|
138
|
+
logNpmPeerDepsError(phase, rerunCommand, out);
|
|
102
139
|
reject(new NpmPeerDepsInstallError());
|
|
103
140
|
return;
|
|
104
141
|
}
|
|
@@ -143,7 +180,7 @@ function formatSingleMigrationRerunCommand(migrationId) {
|
|
|
143
180
|
: migrationId;
|
|
144
181
|
return `nx migrate --run-migration=${id}`;
|
|
145
182
|
}
|
|
146
|
-
function logNpmPeerDepsError(phase, rerunCommand = 'nx migrate --run-migrations') {
|
|
183
|
+
function logNpmPeerDepsError(phase, rerunCommand = 'nx migrate --run-migrations', out = deferred_output_1.terminalOutput) {
|
|
147
184
|
const peerDepsResolutionSteps = [
|
|
148
185
|
'Recommended approaches (in order of preference):',
|
|
149
186
|
'',
|
|
@@ -160,7 +197,7 @@ function logNpmPeerDepsError(phase, rerunCommand = 'nx migrate --run-migrations'
|
|
|
160
197
|
` ${rerunCommand} --skip-install`,
|
|
161
198
|
];
|
|
162
199
|
if (phase === 'pre-migration') {
|
|
163
|
-
|
|
200
|
+
out.notice('error', {
|
|
164
201
|
title: 'You need to resolve the peer dependency conflicts before the migration can continue',
|
|
165
202
|
bodyLines: [
|
|
166
203
|
...peerDepsResolutionSteps,
|
|
@@ -173,7 +210,7 @@ function logNpmPeerDepsError(phase, rerunCommand = 'nx migrate --run-migrations'
|
|
|
173
210
|
});
|
|
174
211
|
}
|
|
175
212
|
else {
|
|
176
|
-
|
|
213
|
+
out.notice('error', {
|
|
177
214
|
title: 'Some migrations have been applied, but installing the updated dependencies failed',
|
|
178
215
|
bodyLines: [
|
|
179
216
|
...peerDepsResolutionSteps,
|
|
@@ -187,10 +224,10 @@ function logNpmPeerDepsError(phase, rerunCommand = 'nx migrate --run-migrations'
|
|
|
187
224
|
});
|
|
188
225
|
}
|
|
189
226
|
}
|
|
190
|
-
function logSkippedPostMigrationInstall(root) {
|
|
227
|
+
function logSkippedPostMigrationInstall(root, out = deferred_output_1.terminalOutput) {
|
|
191
228
|
const packageManager = (0, package_manager_1.detectPackageManager)(root);
|
|
192
229
|
const installCommand = (0, package_manager_1.getPackageManagerCommand)(packageManager, root).install;
|
|
193
|
-
|
|
230
|
+
out.notice('warn', {
|
|
194
231
|
title: 'Migrations updated your dependencies, but the install was skipped',
|
|
195
232
|
bodyLines: [`Run "${installCommand}" to install the updated dependencies.`],
|
|
196
233
|
});
|
|
@@ -72,23 +72,48 @@ export declare function reportMigrateOrchestratorInit(opts: {
|
|
|
72
72
|
createCommits: boolean;
|
|
73
73
|
}): void;
|
|
74
74
|
/**
|
|
75
|
-
* One event per
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* `attempt` rides the
|
|
75
|
+
* One event per dispense response, repeated on every reconcile until the
|
|
76
|
+
* step moves. The `action` (dispense case) is a closed enum carried on a
|
|
77
|
+
* reused dimension, read conditioned on the event name (the same
|
|
78
|
+
* multiplexing pattern as {@link reportMigratePrompt}); `attempt` rides the
|
|
79
|
+
* migration-count dimension and `ordinal` (the run's dispense count) the
|
|
80
|
+
* task-count one.
|
|
79
81
|
*/
|
|
80
82
|
export declare function reportMigrateOrchestratorDispense(opts: {
|
|
81
83
|
action: string;
|
|
82
84
|
attempt: number;
|
|
85
|
+
ordinal?: number;
|
|
83
86
|
}): void;
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
/** Once per durable dispense transition. */
|
|
88
|
+
export declare function reportMigrateOrchestratorStepDispensed(opts: {
|
|
89
|
+
attempt: number;
|
|
90
|
+
ordinal: number;
|
|
91
|
+
}): void;
|
|
92
|
+
export interface MigrateOrchestratorTallies {
|
|
89
93
|
completed: number;
|
|
90
94
|
skipped: number;
|
|
95
|
+
unresolved: number;
|
|
91
96
|
dispenseCount: number;
|
|
97
|
+
}
|
|
98
|
+
export declare function reportMigrateOrchestratorComplete(opts: MigrateOrchestratorTallies): void;
|
|
99
|
+
/** The agent session nx spawned ended with the run still active. */
|
|
100
|
+
export declare function reportMigrateOrchestratorAbandoned(opts: MigrateOrchestratorTallies & {
|
|
101
|
+
agentUsed: string;
|
|
102
|
+
}): void;
|
|
103
|
+
/**
|
|
104
|
+
* An explicit continue (`--run-migrations --run-id`, or "continue" at the
|
|
105
|
+
* master prompt) took up an active run; every resume reports. A bare
|
|
106
|
+
* `--run-id` reconcile is not a resume: nothing in run state marks the first
|
|
107
|
+
* call after a lost session.
|
|
108
|
+
*/
|
|
109
|
+
export declare function reportMigrateOrchestratorResume(opts: MigrateOrchestratorTallies): void;
|
|
110
|
+
/**
|
|
111
|
+
* An invocation found an active run and started nothing. `activity` says
|
|
112
|
+
* whether another nx migrate process held the run; 'unknown' where nx cannot
|
|
113
|
+
* tell.
|
|
114
|
+
*/
|
|
115
|
+
export declare function reportMigrateOrchestratorExistingRun(opts: MigrateOrchestratorTallies & {
|
|
116
|
+
activity: 'idle' | 'held' | 'unknown';
|
|
92
117
|
}): void;
|
|
93
118
|
/**
|
|
94
119
|
* Counts invocations, not completions: emitted as soon as the migration id
|
|
@@ -13,7 +13,11 @@ exports.reportMigrateRunComplete = reportMigrateRunComplete;
|
|
|
13
13
|
exports.reportMigrateRunError = reportMigrateRunError;
|
|
14
14
|
exports.reportMigrateOrchestratorInit = reportMigrateOrchestratorInit;
|
|
15
15
|
exports.reportMigrateOrchestratorDispense = reportMigrateOrchestratorDispense;
|
|
16
|
+
exports.reportMigrateOrchestratorStepDispensed = reportMigrateOrchestratorStepDispensed;
|
|
16
17
|
exports.reportMigrateOrchestratorComplete = reportMigrateOrchestratorComplete;
|
|
18
|
+
exports.reportMigrateOrchestratorAbandoned = reportMigrateOrchestratorAbandoned;
|
|
19
|
+
exports.reportMigrateOrchestratorResume = reportMigrateOrchestratorResume;
|
|
20
|
+
exports.reportMigrateOrchestratorExistingRun = reportMigrateOrchestratorExistingRun;
|
|
17
21
|
exports.reportMigrateSingleMigrationInvocation = reportMigrateSingleMigrationInvocation;
|
|
18
22
|
exports.computeMajorsCrossed = computeMajorsCrossed;
|
|
19
23
|
exports.safeReport = safeReport;
|
|
@@ -195,10 +199,12 @@ function reportMigrateOrchestratorInit(opts) {
|
|
|
195
199
|
});
|
|
196
200
|
}
|
|
197
201
|
/**
|
|
198
|
-
* One event per
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
* `attempt` rides the
|
|
202
|
+
* One event per dispense response, repeated on every reconcile until the
|
|
203
|
+
* step moves. The `action` (dispense case) is a closed enum carried on a
|
|
204
|
+
* reused dimension, read conditioned on the event name (the same
|
|
205
|
+
* multiplexing pattern as {@link reportMigratePrompt}); `attempt` rides the
|
|
206
|
+
* migration-count dimension and `ordinal` (the run's dispense count) the
|
|
207
|
+
* task-count one.
|
|
202
208
|
*/
|
|
203
209
|
function reportMigrateOrchestratorDispense(opts) {
|
|
204
210
|
safeReport(() => {
|
|
@@ -207,21 +213,76 @@ function reportMigrateOrchestratorDispense(opts) {
|
|
|
207
213
|
(0, analytics_1.reportEvent)('migrate_orchestrator_dispense', {
|
|
208
214
|
[analytics_1.customDimensions.promptChoice]: opts.action,
|
|
209
215
|
[analytics_1.customDimensions.migrationCount]: opts.attempt,
|
|
216
|
+
[analytics_1.customDimensions.taskCount]: opts.ordinal,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/** Once per durable dispense transition. */
|
|
221
|
+
function reportMigrateOrchestratorStepDispensed(opts) {
|
|
222
|
+
safeReport(() => {
|
|
223
|
+
if (!analytics_1.customDimensions)
|
|
224
|
+
return;
|
|
225
|
+
(0, analytics_1.reportEvent)('migrate_orchestrator_step_dispensed', {
|
|
226
|
+
[analytics_1.customDimensions.migrationCount]: opts.attempt,
|
|
227
|
+
[analytics_1.customDimensions.taskCount]: opts.ordinal,
|
|
210
228
|
});
|
|
211
229
|
});
|
|
212
230
|
}
|
|
213
231
|
/**
|
|
214
|
-
*
|
|
215
|
-
*
|
|
232
|
+
* The three step tallies and the total dispense count ride reused numeric
|
|
233
|
+
* dimensions, read conditioned on the event name.
|
|
216
234
|
*/
|
|
235
|
+
function orchestratorTallyParams(tallies) {
|
|
236
|
+
return {
|
|
237
|
+
[analytics_1.customDimensions.appliedCount]: tallies.completed,
|
|
238
|
+
[analytics_1.customDimensions.taskCount]: tallies.skipped,
|
|
239
|
+
[analytics_1.customDimensions.majorsCrossed]: tallies.unresolved,
|
|
240
|
+
[analytics_1.customDimensions.migrationCount]: tallies.dispenseCount,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
217
243
|
function reportMigrateOrchestratorComplete(opts) {
|
|
218
244
|
safeReport(() => {
|
|
219
245
|
if (!analytics_1.customDimensions)
|
|
220
246
|
return;
|
|
221
|
-
(0, analytics_1.reportEvent)('migrate_orchestrator_complete',
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
247
|
+
(0, analytics_1.reportEvent)('migrate_orchestrator_complete', orchestratorTallyParams(opts));
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
/** The agent session nx spawned ended with the run still active. */
|
|
251
|
+
function reportMigrateOrchestratorAbandoned(opts) {
|
|
252
|
+
safeReport(() => {
|
|
253
|
+
if (!analytics_1.customDimensions)
|
|
254
|
+
return;
|
|
255
|
+
(0, analytics_1.reportEvent)('migrate_orchestrator_abandoned', {
|
|
256
|
+
...orchestratorTallyParams(opts),
|
|
257
|
+
[analytics_1.customDimensions.agentUsed]: opts.agentUsed,
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* An explicit continue (`--run-migrations --run-id`, or "continue" at the
|
|
263
|
+
* master prompt) took up an active run; every resume reports. A bare
|
|
264
|
+
* `--run-id` reconcile is not a resume: nothing in run state marks the first
|
|
265
|
+
* call after a lost session.
|
|
266
|
+
*/
|
|
267
|
+
function reportMigrateOrchestratorResume(opts) {
|
|
268
|
+
safeReport(() => {
|
|
269
|
+
if (!analytics_1.customDimensions)
|
|
270
|
+
return;
|
|
271
|
+
(0, analytics_1.reportEvent)('migrate_orchestrator_resume', orchestratorTallyParams(opts));
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* An invocation found an active run and started nothing. `activity` says
|
|
276
|
+
* whether another nx migrate process held the run; 'unknown' where nx cannot
|
|
277
|
+
* tell.
|
|
278
|
+
*/
|
|
279
|
+
function reportMigrateOrchestratorExistingRun(opts) {
|
|
280
|
+
safeReport(() => {
|
|
281
|
+
if (!analytics_1.customDimensions)
|
|
282
|
+
return;
|
|
283
|
+
(0, analytics_1.reportEvent)('migrate_orchestrator_existing_run', {
|
|
284
|
+
...orchestratorTallyParams(opts),
|
|
285
|
+
[analytics_1.customDimensions.promptChoice]: opts.activity,
|
|
225
286
|
});
|
|
226
287
|
});
|
|
227
288
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ResolvedAgentic } from './agentic/types';
|
|
2
|
+
import { type MigrateOutputSink } from './deferred-output';
|
|
2
3
|
/**
|
|
3
4
|
* Discriminated result for `commitMigrationIfRequested`. Distinguishes the
|
|
4
5
|
* shapes the executor needs to react to:
|
|
@@ -7,9 +8,8 @@ import type { ResolvedAgentic } from './agentic/types';
|
|
|
7
8
|
* HEAD` failed transiently — by contract the diff is no longer in the
|
|
8
9
|
* working tree.
|
|
9
10
|
* - `no-changes`: commits were requested but there was nothing to commit.
|
|
10
|
-
* - `failed`: the
|
|
11
|
-
*
|
|
12
|
-
* so the next successful commit can annotate its body.
|
|
11
|
+
* - `failed`: the attempt errored, possibly after the commit landed; tracked
|
|
12
|
+
* as pending so the next successful commit can annotate its body.
|
|
13
13
|
* - `disabled`: commits are off for this run.
|
|
14
14
|
*/
|
|
15
15
|
export type CommitResult = {
|
|
@@ -37,7 +37,7 @@ export declare function commitMigrationIfRequested(root: string, migration: {
|
|
|
37
37
|
}, shouldCreateCommits: boolean, commitPrefix: string, installDepsIfChanged: () => Promise<void>, pendingMigrations?: ReadonlyArray<{
|
|
38
38
|
package: string;
|
|
39
39
|
name: string;
|
|
40
|
-
}>, failureGuidance?: string): Promise<CommitResult>;
|
|
40
|
+
}>, failureGuidance?: string, out?: MigrateOutputSink): Promise<CommitResult>;
|
|
41
41
|
/**
|
|
42
42
|
* Commits any pre-existing working-tree state into a dedicated "checkpoint"
|
|
43
43
|
* commit before the first migration runs. Without this, the first migration's
|
|
@@ -64,6 +64,7 @@ export declare function resolveCreateCommits(args: {
|
|
|
64
64
|
warning?: string;
|
|
65
65
|
error?: string;
|
|
66
66
|
};
|
|
67
|
+
export declare function currentBranchIfDefault(root: string): string | null;
|
|
67
68
|
/**
|
|
68
69
|
* Asks before a run starts committing on the workspace's default branch, and
|
|
69
70
|
* reports the decision when the answer is no. Returns whether to proceed.
|