nx 23.2.0-beta.1 → 23.2.0-beta.11
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 +2 -2
- package/dist/bin/init-local.js +3 -5
- package/dist/bin/nx.js +2 -0
- package/dist/release/changelog-renderer/index.js +4 -5
- package/dist/release/index.d.ts +1 -1
- package/dist/src/adapter/ngcli-adapter.js +60 -1
- package/dist/src/ai/set-up-ai-agents/set-up-ai-agents.js +35 -15
- package/dist/src/analytics/analytics.d.ts +6 -0
- package/dist/src/analytics/analytics.js +16 -10
- package/dist/src/analytics/index.d.ts +1 -1
- package/dist/src/analytics/index.js +2 -1
- package/dist/src/command-line/add/add.js +5 -0
- package/dist/src/command-line/affected/affected.js +1 -0
- package/dist/src/command-line/completion/command-object.js +7 -12
- package/dist/src/command-line/configure-ai-agents/configure-ai-agents.js +19 -25
- package/dist/src/command-line/format/format.js +84 -101
- package/dist/src/command-line/generate/generate.js +35 -35
- package/dist/src/command-line/graph/graph.d.ts +1 -0
- package/dist/src/command-line/graph/graph.js +15 -6
- package/dist/src/command-line/import/import.js +30 -40
- package/dist/src/command-line/init/ai-agent-prompts.js +5 -11
- package/dist/src/command-line/init/command-object.js +4 -2
- package/dist/src/command-line/init/configure-plugins.js +4 -1
- package/dist/src/command-line/init/implementation/add-nx-to-monorepo.js +12 -32
- package/dist/src/command-line/init/implementation/add-nx-to-nest.js +17 -21
- package/dist/src/command-line/init/implementation/add-nx-to-npm-repo.js +8 -21
- package/dist/src/command-line/init/implementation/add-nx-to-turborepo.js +3 -17
- package/dist/src/command-line/init/implementation/angular/index.js +10 -15
- package/dist/src/command-line/init/implementation/angular/integrated-workspace.js +2 -5
- package/dist/src/command-line/init/implementation/angular/legacy-angular-versions.js +5 -0
- package/dist/src/command-line/init/implementation/angular/standalone-workspace.js +8 -2
- package/dist/src/command-line/init/implementation/check-compatible-with-plugins.js +2 -0
- package/dist/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +9 -1
- package/dist/src/command-line/init/implementation/format.d.ts +18 -0
- package/dist/src/command-line/init/implementation/format.js +114 -0
- package/dist/src/command-line/init/implementation/utils.js +8 -0
- package/dist/src/command-line/init/init-v1.js +15 -18
- package/dist/src/command-line/init/init-v2.js +40 -57
- package/dist/src/command-line/migrate/agentic/definitions.js +36 -9
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.d.ts +37 -22
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.js +30 -39
- package/dist/src/command-line/migrate/agentic/handoff.d.ts +7 -7
- package/dist/src/command-line/migrate/agentic/handoff.js +13 -10
- package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.d.ts +7 -12
- package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.js +7 -0
- package/dist/src/command-line/migrate/agentic/run-step.d.ts +10 -0
- package/dist/src/command-line/migrate/agentic/run-step.js +1 -0
- package/dist/src/command-line/migrate/agentic/runner.js +24 -24
- package/dist/src/command-line/migrate/agentic/select.d.ts +10 -2
- package/dist/src/command-line/migrate/agentic/select.js +30 -32
- package/dist/src/command-line/migrate/agentic/types.d.ts +33 -3
- package/dist/src/command-line/migrate/agentic/types.js +35 -0
- package/dist/src/command-line/migrate/command-object.d.ts +6 -0
- package/dist/src/command-line/migrate/command-object.js +19 -1
- package/dist/src/command-line/migrate/execute-migration.d.ts +28 -9
- package/dist/src/command-line/migrate/execute-migration.js +112 -27
- package/dist/src/command-line/migrate/migrate-analytics.d.ts +35 -0
- package/dist/src/command-line/migrate/migrate-analytics.js +64 -0
- package/dist/src/command-line/migrate/migrate-commits.d.ts +38 -8
- package/dist/src/command-line/migrate/migrate-commits.js +130 -15
- package/dist/src/command-line/migrate/migrate-config.d.ts +13 -12
- package/dist/src/command-line/migrate/migrate-config.js +22 -14
- package/dist/src/command-line/migrate/migrate-output.d.ts +45 -7
- package/dist/src/command-line/migrate/migrate-output.js +52 -8
- package/dist/src/command-line/migrate/migrate-ui-api.d.ts +2 -1
- package/dist/src/command-line/migrate/migrate-ui-api.js +16 -7
- package/dist/src/command-line/migrate/migrate.d.ts +28 -68
- package/dist/src/command-line/migrate/migrate.js +657 -293
- package/dist/src/command-line/migrate/migration-shape.d.ts +8 -0
- package/dist/src/command-line/migrate/multi-major.js +7 -10
- package/dist/src/command-line/migrate/resolve-package-version.js +4 -8
- package/dist/src/command-line/migrate/run/agent-output.d.ts +20 -0
- package/dist/src/command-line/migrate/run/agent-output.js +65 -0
- package/dist/src/command-line/migrate/run/index.d.ts +9 -0
- package/dist/src/command-line/migrate/run/index.js +23 -0
- package/dist/src/command-line/migrate/run/orchestrator.d.ts +20 -0
- package/dist/src/command-line/migrate/run/orchestrator.js +1200 -0
- package/dist/src/command-line/migrate/run/run-id.d.ts +16 -0
- package/dist/src/command-line/migrate/run/run-id.js +56 -0
- package/dist/src/command-line/migrate/run/run-state.d.ts +157 -0
- package/dist/src/command-line/migrate/run/run-state.js +438 -0
- package/dist/src/command-line/migrate/run/state-lock.d.ts +25 -0
- package/dist/src/command-line/migrate/run/state-lock.js +76 -0
- package/dist/src/command-line/migrate/run/state-machine.d.ts +84 -0
- package/dist/src/command-line/migrate/run/state-machine.js +315 -0
- package/dist/src/command-line/migrate/run/util.d.ts +59 -0
- package/dist/src/command-line/migrate/run/util.js +148 -0
- package/dist/src/command-line/migrate/run/worker.d.ts +16 -0
- package/dist/src/command-line/migrate/run/worker.js +682 -0
- package/dist/src/command-line/migrate/run-migration-process.js +6 -5
- package/dist/src/command-line/migrate/safe-prompt.d.ts +14 -26
- package/dist/src/command-line/migrate/safe-prompt.js +32 -43
- package/dist/src/command-line/migrate/sort-migrations.d.ts +16 -0
- package/dist/src/command-line/migrate/sort-migrations.js +32 -0
- package/dist/src/command-line/migrate/step-actions.d.ts +5 -0
- package/dist/src/command-line/migrate/step-actions.js +12 -0
- package/dist/src/command-line/migrate/text.d.ts +18 -0
- package/dist/src/command-line/migrate/text.js +26 -0
- package/dist/src/command-line/migrate/version-skew-guard.d.ts +60 -0
- package/dist/src/command-line/migrate/version-skew-guard.js +175 -0
- package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +17 -21
- package/dist/src/command-line/nx-cloud/connect/view-logs.js +2 -0
- package/dist/src/command-line/nx-cloud/start-nx-agents/command-object.d.ts +2 -0
- package/dist/src/command-line/nx-cloud/start-nx-agents/command-object.js +16 -0
- package/dist/src/command-line/nx-cloud/start-nx-agents/start-nx-agents.d.ts +4 -0
- package/dist/src/command-line/nx-cloud/start-nx-agents/start-nx-agents.js +13 -0
- package/dist/src/command-line/nx-commands.js +26 -24
- package/dist/src/command-line/release/changelog.js +11 -17
- package/dist/src/command-line/release/index.d.ts +1 -1
- package/dist/src/command-line/release/plan.js +15 -28
- package/dist/src/command-line/release/publish.js +5 -0
- package/dist/src/command-line/release/release.js +6 -17
- package/dist/src/command-line/release/utils/git.js +1 -1
- package/dist/src/command-line/release/utils/release-graph.d.ts +18 -0
- package/dist/src/command-line/release/utils/release-graph.js +81 -21
- package/dist/src/command-line/release/utils/remote-release-clients/github.js +17 -23
- package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +14 -23
- package/dist/src/command-line/release/utils/resolve-semver-specifier.js +19 -41
- package/dist/src/command-line/release/version/release-group-processor.d.ts +24 -0
- package/dist/src/command-line/release/version/release-group-processor.js +80 -6
- package/dist/src/command-line/release/version/resolve-current-version.js +7 -10
- package/dist/src/command-line/release/version/version-actions.d.ts +27 -2
- package/dist/src/command-line/release/version/version-actions.js +9 -1
- package/dist/src/command-line/release/version.js +10 -6
- package/dist/src/command-line/reset/reset.js +6 -1
- package/dist/src/command-line/run/run-one.js +1 -0
- package/dist/src/command-line/run-many/run-many.js +1 -0
- package/dist/src/command-line/show/show-target/inputs.js +50 -153
- package/dist/src/command-line/show/show-target/outputs.js +48 -173
- package/dist/src/command-line/show/show-target/utils.d.ts +28 -0
- package/dist/src/command-line/show/show-target/utils.js +83 -3
- package/dist/src/command-line/watch/watch.js +13 -0
- package/dist/src/command-line/yargs-utils/shared-options.d.ts +2 -2
- package/dist/src/command-line/yargs-utils/shared-options.js +3 -1
- package/dist/src/config/misc-interfaces.d.ts +19 -7
- package/dist/src/config/nx-json.d.ts +4 -2
- package/dist/src/core/graph/main.js +1 -1
- package/dist/src/core/graph/styles.js +1 -1
- package/dist/src/daemon/client/client.d.ts +52 -1
- package/dist/src/daemon/client/client.js +160 -36
- package/dist/src/daemon/client/daemon-environment.d.ts +17 -0
- package/dist/src/daemon/client/daemon-environment.js +110 -2
- package/dist/src/daemon/client/daemon-socket-messenger.js +4 -0
- package/dist/src/daemon/message-types/daemon-message.d.ts +32 -0
- package/dist/src/daemon/message-types/daemon-message.js +25 -0
- package/dist/src/daemon/server/file-watching/file-watcher-sockets.d.ts +5 -0
- package/dist/src/daemon/server/file-watching/file-watcher-sockets.js +16 -0
- package/dist/src/daemon/server/handle-tasks-execution-hooks.d.ts +1 -1
- package/dist/src/daemon/server/latest-nx.js +5 -2
- package/dist/src/daemon/server/server.js +31 -4
- package/dist/src/daemon/server/shutdown-utils.d.ts +5 -0
- package/dist/src/daemon/server/shutdown-utils.js +11 -4
- package/dist/src/daemon/socket-utils.d.ts +1 -0
- package/dist/src/daemon/socket-utils.js +24 -3
- package/dist/src/daemon/tmp-dir.d.ts +43 -3
- package/dist/src/daemon/tmp-dir.js +437 -15
- package/dist/src/devkit-internals.d.ts +106 -8
- package/dist/src/devkit-internals.js +225 -7
- package/dist/src/executors/run-commands/running-tasks.js +46 -29
- package/dist/src/generators/internal-utils/format-changed-files.d.ts +24 -0
- package/dist/src/generators/internal-utils/format-changed-files.js +163 -0
- package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.d.ts +15 -0
- package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.js +21 -3
- package/dist/src/generators/tree.d.ts +4 -2
- package/dist/src/hasher/check-task-files.d.ts +86 -0
- package/dist/src/hasher/check-task-files.js +378 -0
- package/dist/src/migrations/update-15-0-0/prefix-outputs.js +2 -2
- package/dist/src/migrations/update-16-0-0/remove-nrwl-cli.js +2 -2
- package/dist/src/migrations/update-16-0-0/update-depends-on-to-tokens.js +2 -2
- package/dist/src/migrations/update-16-0-0/update-nx-cloud-runner.js +2 -2
- package/dist/src/migrations/update-16-2-0/remove-run-commands-output-path.js +2 -2
- package/dist/src/migrations/update-17-0-0/rm-default-collection-npm-scope.js +2 -2
- package/dist/src/migrations/update-17-0-0/use-minimal-config-for-tasks-runner-options.js +2 -2
- package/dist/src/migrations/update-17-2-0/move-default-base.js +2 -2
- package/dist/src/migrations/update-18-0-0/disable-crystal-for-existing-workspaces.js +2 -2
- package/dist/src/migrations/update-19-2-4/set-project-name.js +2 -2
- package/dist/src/migrations/update-20-0-0/move-use-daemon-process.js +2 -2
- package/dist/src/migrations/update-20-0-1/use-legacy-cache.js +2 -2
- package/dist/src/migrations/update-21-0-0/release-changelog-config-changes.js +2 -2
- package/dist/src/migrations/update-21-0-0/release-version-config-changes.js +2 -2
- package/dist/src/migrations/update-21-0-0/remove-custom-tasks-runner.js +2 -2
- package/dist/src/migrations/update-21-0-0/remove-legacy-cache.js +2 -2
- package/dist/src/migrations/update-22-0-0/consolidate-release-tag-config.js +2 -2
- package/dist/src/migrations/update-22-0-0/release-version-config-changes.js +2 -2
- package/dist/src/migrations/update-22-2-0/add-self-healing-to-gitignore.js +2 -2
- package/dist/src/migrations/update-22-6-0/add-claude-settings-local-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-22-6-0/add-claude-worktrees-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-22-7-0/add-polygraph-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-23-0-0/add-migrate-runs-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.d.ts +12 -0
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.js +250 -0
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.md +50 -0
- package/dist/src/native/index.d.ts +37 -4
- package/dist/src/native/index.js +71 -28
- package/dist/src/native/native-bindings.js +3 -0
- package/dist/src/native/native-file-cache-location.d.ts +17 -1
- package/dist/src/native/native-file-cache-location.js +86 -12
- package/dist/src/native/nx.wasm32-wasi.debug.wasm +0 -0
- package/dist/src/native/nx.wasm32-wasi.wasm +0 -0
- package/dist/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +3 -3
- package/dist/src/nx-cloud/utilities/get-cloud-options.js +5 -2
- package/dist/src/nx-cloud/utilities/onboarding.js +5 -2
- package/dist/src/nx-cloud/utilities/url-shorten.d.ts +1 -4
- package/dist/src/nx-cloud/utilities/url-shorten.js +9 -8
- package/dist/src/plugins/js/lock-file/bun-parser.js +43 -10
- package/dist/src/plugins/js/lock-file/lock-file.d.ts +46 -4
- package/dist/src/plugins/js/lock-file/lock-file.js +192 -15
- package/dist/src/plugins/js/lock-file/pnpm-parser.js +420 -64
- package/dist/src/plugins/js/lock-file/project-graph-pruning.d.ts +25 -1
- package/dist/src/plugins/js/lock-file/project-graph-pruning.js +92 -12
- package/dist/src/plugins/js/lock-file/pruned-output.d.ts +330 -0
- package/dist/src/plugins/js/lock-file/pruned-output.js +1441 -0
- package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.d.ts +1 -0
- package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.js +9 -5
- package/dist/src/plugins/js/project-graph/affected/npm-packages.js +51 -20
- package/dist/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +14 -4
- package/dist/src/project-graph/affected/affected-project-graph-models.d.ts +1 -1
- package/dist/src/project-graph/affected/affected-project-graph.d.ts +1 -1
- package/dist/src/project-graph/affected/affected-project-graph.js +2 -2
- package/dist/src/project-graph/affected/locators/project-glob-changes.js +5 -2
- package/dist/src/project-graph/build-project-graph.js +7 -1
- package/dist/src/project-graph/error-types.d.ts +12 -1
- package/dist/src/project-graph/error-types.js +27 -2
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.d.ts +1 -0
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.js +18 -1
- package/dist/src/project-graph/plugins/isolation/messaging.d.ts +16 -3
- package/dist/src/project-graph/plugins/isolation/messaging.js +3 -0
- package/dist/src/project-graph/plugins/isolation/plugin-worker.js +58 -8
- package/dist/src/project-graph/plugins/loaded-nx-plugin.js +1 -0
- package/dist/src/project-graph/project-graph.js +23 -0
- package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.d.ts +1 -0
- package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.js +16 -2
- package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.d.ts +12 -8
- package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.js +30 -21
- package/dist/src/project-graph/utils/project-configuration/source-maps.d.ts +12 -5
- package/dist/src/project-graph/utils/project-configuration/source-maps.js +21 -7
- package/dist/src/project-graph/utils/project-configuration/target-defaults.d.ts +1 -1
- package/dist/src/project-graph/utils/project-configuration/target-defaults.js +26 -27
- package/dist/src/project-graph/utils/project-configuration/target-merging.js +50 -8
- package/dist/src/project-graph/utils/project-configuration/target-normalization.js +149 -6
- package/dist/src/project-graph/utils/project-configuration/utils.d.ts +15 -0
- package/dist/src/project-graph/utils/project-configuration/utils.js +42 -6
- package/dist/src/project-graph/utils/project-configuration-utils.d.ts +15 -12
- package/dist/src/project-graph/utils/project-configuration-utils.js +79 -99
- package/dist/src/tasks-runner/is-tui-enabled.js +3 -1
- package/dist/src/tasks-runner/life-cycle.d.ts +2 -2
- package/dist/src/tasks-runner/life-cycle.js +2 -2
- package/dist/src/tasks-runner/life-cycles/performance-report.d.ts +12 -0
- package/dist/src/tasks-runner/life-cycles/performance-report.js +62 -3
- package/dist/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.d.ts +26 -1
- package/dist/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js +99 -5
- package/dist/src/tasks-runner/life-cycles/static-run-one-terminal-output-life-cycle.d.ts +26 -0
- package/dist/src/tasks-runner/life-cycles/static-run-one-terminal-output-life-cycle.js +113 -17
- package/dist/src/tasks-runner/pseudo-terminal.d.ts +17 -3
- package/dist/src/tasks-runner/pseudo-terminal.js +22 -10
- package/dist/src/tasks-runner/run-command.js +28 -35
- package/dist/src/tasks-runner/running-tasks/batch-process.d.ts +55 -0
- package/dist/src/tasks-runner/running-tasks/batch-process.js +161 -8
- package/dist/src/tasks-runner/task-env.d.ts +9 -0
- package/dist/src/tasks-runner/task-env.js +31 -4
- package/dist/src/tasks-runner/task-orchestrator.d.ts +72 -1
- package/dist/src/tasks-runner/task-orchestrator.js +182 -18
- package/dist/src/tasks-runner/utils.js +2 -6
- package/dist/src/utils/acknowledge-build-scripts.js +7 -5
- package/dist/src/utils/analytics-enabled.d.ts +7 -0
- package/dist/src/utils/analytics-enabled.js +11 -0
- package/dist/src/utils/analytics-prompt.d.ts +0 -6
- package/dist/src/utils/analytics-prompt.js +4 -58
- package/dist/src/utils/assert-workspace-validity.js +7 -2
- package/dist/src/utils/catalog/bun-manager-utils.d.ts +8 -0
- package/dist/src/utils/catalog/bun-manager-utils.js +174 -0
- package/dist/src/utils/catalog/bun-manager.d.ts +28 -0
- package/dist/src/utils/catalog/bun-manager.js +130 -0
- package/dist/src/utils/catalog/index.d.ts +1 -1
- package/dist/src/utils/catalog/index.js +1 -1
- package/dist/src/utils/catalog/manager-factory.js +3 -0
- package/dist/src/utils/catalog/manager-utils.d.ts +8 -1
- package/dist/src/utils/catalog/manager-utils.js +9 -4
- package/dist/src/utils/catalog/manager.d.ts +13 -1
- package/dist/src/utils/catalog/manager.js +30 -0
- package/dist/src/utils/catalog/pnpm-manager.d.ts +2 -1
- package/dist/src/utils/catalog/pnpm-manager.js +3 -0
- package/dist/src/utils/catalog/types.d.ts +4 -0
- package/dist/src/utils/catalog/yarn-manager.d.ts +6 -2
- package/dist/src/utils/catalog/yarn-manager.js +23 -32
- package/dist/src/utils/child-process.d.ts +31 -1
- package/dist/src/utils/child-process.js +103 -0
- package/dist/src/utils/chunkify.d.ts +7 -1
- package/dist/src/utils/chunkify.js +10 -3
- package/dist/src/utils/exit-codes.d.ts +9 -0
- package/dist/src/utils/exit-codes.js +19 -0
- package/dist/src/utils/fileutils.d.ts +5 -0
- package/dist/src/utils/fileutils.js +7 -2
- package/dist/src/utils/formatters/index.d.ts +13 -0
- package/dist/src/utils/formatters/index.js +74 -0
- package/dist/src/utils/formatters/oxfmt.d.ts +32 -0
- package/dist/src/utils/formatters/oxfmt.js +764 -0
- package/dist/src/utils/formatters/prettier.d.ts +26 -0
- package/dist/src/utils/formatters/prettier.js +201 -0
- package/dist/src/utils/formatters/shared.d.ts +5 -0
- package/dist/src/utils/formatters/shared.js +8 -0
- package/dist/src/utils/git-utils.d.ts +48 -2
- package/dist/src/utils/git-utils.js +220 -14
- package/dist/src/utils/git-worktrees.d.ts +30 -0
- package/dist/src/utils/git-worktrees.js +212 -0
- package/dist/src/utils/has-nx-js-plugin.d.ts +1 -1
- package/dist/src/utils/has-nx-js-plugin.js +1 -1
- package/dist/src/utils/ignore.d.ts +170 -1
- package/dist/src/utils/ignore.js +263 -11
- package/dist/src/utils/kill-child-on-host-exit.d.ts +7 -0
- package/dist/src/utils/kill-child-on-host-exit.js +42 -0
- package/dist/src/utils/long-running-target.d.ts +10 -0
- package/dist/src/utils/long-running-target.js +19 -0
- package/dist/src/utils/min-release-age/behavior/bun.js +7 -11
- package/dist/src/utils/min-release-age/behavior/npm.js +5 -2
- package/dist/src/utils/min-release-age/packument.js +1 -1
- package/dist/src/utils/nx-console-prompt.js +3 -6
- package/dist/src/utils/nx-tmp-dir.d.ts +18 -0
- package/dist/src/utils/nx-tmp-dir.js +40 -0
- package/dist/src/utils/output.d.ts +153 -0
- package/dist/src/utils/output.js +289 -5
- package/dist/src/utils/owned-private-dir.d.ts +132 -0
- package/dist/src/utils/owned-private-dir.js +323 -0
- package/dist/src/utils/package-json.d.ts +2 -0
- package/dist/src/utils/package-json.js +11 -7
- package/dist/src/utils/package-manager-config/bunfig.d.ts +14 -0
- package/dist/src/utils/package-manager-config/bunfig.js +49 -0
- package/dist/src/utils/package-manager-config/npmrc.d.ts +23 -0
- package/dist/src/utils/package-manager-config/npmrc.js +124 -0
- package/dist/src/utils/package-manager-config/pnpm-config.d.ts +17 -0
- package/dist/src/utils/package-manager-config/pnpm-config.js +60 -0
- package/dist/src/utils/package-manager.d.ts +23 -2
- package/dist/src/utils/package-manager.js +262 -42
- package/dist/src/utils/params.d.ts +7 -1
- package/dist/src/utils/params.js +64 -6
- package/dist/src/utils/plugins/core-plugins.js +4 -0
- package/dist/src/utils/prompt-helpers.d.ts +53 -0
- package/dist/src/utils/prompt-helpers.js +111 -0
- package/dist/src/utils/provenance.js +6 -14
- package/dist/src/utils/registry-config/bun.d.ts +2 -0
- package/dist/src/utils/registry-config/bun.js +257 -0
- package/dist/src/utils/registry-config/index.d.ts +13 -0
- package/dist/src/utils/registry-config/index.js +102 -0
- package/dist/src/utils/registry-config/pnpm.d.ts +2 -0
- package/dist/src/utils/registry-config/pnpm.js +1551 -0
- package/dist/src/utils/registry-config/utils.d.ts +195 -0
- package/dist/src/utils/registry-config/utils.js +496 -0
- package/dist/src/utils/registry-config/yarn-berry.d.ts +2 -0
- package/dist/src/utils/registry-config/yarn-berry.js +612 -0
- package/dist/src/utils/registry-config/yarn-classic.d.ts +2 -0
- package/dist/src/utils/registry-config/yarn-classic.js +1001 -0
- package/dist/src/utils/safe-spawn.d.ts +24 -0
- package/dist/src/utils/safe-spawn.js +104 -0
- package/dist/src/utils/shell-quoting.d.ts +15 -0
- package/dist/src/utils/shell-quoting.js +35 -0
- package/dist/src/utils/wait-for-socket-connection.d.ts +11 -0
- package/dist/src/utils/wait-for-socket-connection.js +14 -8
- package/dist/src/utils/workspace-id.d.ts +20 -0
- package/dist/src/utils/workspace-id.js +54 -0
- package/dist/src/utils/write-formatted-json-file.d.ts +3 -2
- package/dist/src/utils/write-formatted-json-file.js +5 -4
- package/migrations.json +6 -0
- package/package.json +29 -19
- package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.d.ts +0 -19
- package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.js +0 -81
- package/dist/src/utils/is-using-prettier.d.ts +0 -3
- package/dist/src/utils/is-using-prettier.js +0 -62
- package/dist/src/utils/min-release-age/npmrc.d.ts +0 -15
- package/dist/src/utils/min-release-age/npmrc.js +0 -45
|
@@ -1,5 +1,65 @@
|
|
|
1
1
|
import { WriteStream } from 'tty';
|
|
2
2
|
import type { TaskStatus } from '../tasks-runner/tasks-runner';
|
|
3
|
+
/**
|
|
4
|
+
* The statuses whose output can be collapsed to a single line: the task did the
|
|
5
|
+
* work, or the cache stood in for it.
|
|
6
|
+
*/
|
|
7
|
+
export type CollapsibleTaskStatus = Extract<TaskStatus, 'success' | 'local-cache' | 'local-cache-kept-existing' | 'remote-cache'>;
|
|
8
|
+
/**
|
|
9
|
+
* `static-failures-only` is `static` with successful tasks collapsed to a single
|
|
10
|
+
* line. They select the same life cycle and differ only in what it prints, so
|
|
11
|
+
* everywhere the life cycle is chosen, the TUI is ruled out, or output is
|
|
12
|
+
* routed, the two behave identically.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isStaticOutputStyle(outputStyle: string | undefined): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Whether a run prints every task's output in full rather than collapsing the
|
|
17
|
+
* ones that succeeded. Both static life cycles and the batch renderer have to
|
|
18
|
+
* agree on this, so they read it from here rather than each deriving it.
|
|
19
|
+
*
|
|
20
|
+
* Exactly one style collapses, and it is also what a run that named no style
|
|
21
|
+
* gets. Every other style prints in full because it was asked for explicitly,
|
|
22
|
+
* so none may quietly withhold output. Note the static life cycles serve more
|
|
23
|
+
* styles than the static-sounding ones: `shouldUseDynamicLifeCycle` bails on
|
|
24
|
+
* `isCI()` before it looks at the style at all, so in CI `dynamic` and `tui`
|
|
25
|
+
* land here too. This is written as a deny-list for that reason — a new style
|
|
26
|
+
* prints in full until someone decides otherwise, rather than silently
|
|
27
|
+
* collapsing because an allow-list did not list it.
|
|
28
|
+
*
|
|
29
|
+
* Resolving the absent case here rather than assigning `outputStyle` upstream is
|
|
30
|
+
* deliberate: the value is also read by the orchestrator to decide whether a
|
|
31
|
+
* task streams, and naming the default there stops `shouldStreamOutput` from
|
|
32
|
+
* ever being consulted — including for the continuous tasks that must stream.
|
|
33
|
+
*/
|
|
34
|
+
export declare function printsFullTaskOutput(args: {
|
|
35
|
+
verbose?: boolean;
|
|
36
|
+
outputStyle?: string;
|
|
37
|
+
}): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Whether task output should be wrapped in collapsible log groups. Grouping
|
|
40
|
+
* requires each task's output to be written as one contiguous block, which is
|
|
41
|
+
* why batch mode's implicit streaming backs off when this is on. It does not
|
|
42
|
+
* govern streaming in general — an explicit `--output-style`, the TUI, and
|
|
43
|
+
* long running tasks all still stream.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isLogGroupingEnabled(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Whether a batch task's output should be held back from the live stream and
|
|
48
|
+
* rendered inside a fold instead. A batch worker writes to stdout/stderr live,
|
|
49
|
+
* so forwarding that copy would put its bytes outside the group and defeat the
|
|
50
|
+
* fold; what is held back is written to a file and rendered by the orchestrator.
|
|
51
|
+
*
|
|
52
|
+
* Note it is the captured file, not each task's `terminalOutput`, that makes
|
|
53
|
+
* this lossless. A worker is free to write bytes it attributes to no task —
|
|
54
|
+
* `@nx/maven`'s exit-code dump, `@nx/gradle`'s configuration phase — and those
|
|
55
|
+
* appear in no `terminalOutput` at all, so the fold has to be able to fall back
|
|
56
|
+
* to the file. See `TaskOrchestrator.printGroupedBatchOutput` for when it does.
|
|
57
|
+
*
|
|
58
|
+
* This is only worth doing when grouping is on and the user has not asked to
|
|
59
|
+
* stream — an explicit stream style (which sets NX_STREAM_OUTPUT) wants the
|
|
60
|
+
* live copy, folds or not.
|
|
61
|
+
*/
|
|
62
|
+
export declare function shouldGroupBatchOutput(): boolean;
|
|
3
63
|
export interface CLIErrorMessageConfig {
|
|
4
64
|
title: string;
|
|
5
65
|
bodyLines?: string[];
|
|
@@ -48,7 +108,66 @@ declare class CLIOutput {
|
|
|
48
108
|
bold: import("picocolors/types").Formatter;
|
|
49
109
|
underline: import("picocolors/types").Formatter;
|
|
50
110
|
dim: import("picocolors/types").Formatter;
|
|
111
|
+
/**
|
|
112
|
+
* Whether the terminal is positioned at the start of a line. Task output does
|
|
113
|
+
* not reliably end in a newline, so writers that must begin on a fresh line
|
|
114
|
+
* ask for one via {@link ensureLineStart} rather than guessing.
|
|
115
|
+
*
|
|
116
|
+
* Holding that true means a writer that can leave the cursor mid-line has to
|
|
117
|
+
* be routed through this class or declared to it. The ones that exist today:
|
|
118
|
+
*
|
|
119
|
+
* - This class's own writes, via {@link writeToStream}.
|
|
120
|
+
* - A batch worker's live output, via {@link writeTaskOutputChunk}.
|
|
121
|
+
* - `nx:run-commands`, which is the only executor that runs in the main
|
|
122
|
+
* process (`task-orchestrator.ts` gates that on the executor name), and
|
|
123
|
+
* whose raw writes go through {@link writeTaskOutputChunk} for this reason.
|
|
124
|
+
* Its `addColorAndPrefix` splits on newlines without ever appending one, so
|
|
125
|
+
* its chunks routinely end mid-line.
|
|
126
|
+
* - A pseudo-terminal task, which cannot be routed: the native side writes to
|
|
127
|
+
* this process's stdout from Rust, at arbitrary PTY read boundaries. It
|
|
128
|
+
* declares itself via {@link noteExternalWrite} instead, which is why that
|
|
129
|
+
* exists.
|
|
130
|
+
*
|
|
131
|
+
* Two bypasses are deliberate and safe, both because they re-emit output a
|
|
132
|
+
* whole line at a time via `formatPrefixedLines`, which appends `EOL` to every
|
|
133
|
+
* line it writes: forked task streaming through
|
|
134
|
+
* `NodeChildProcessWithNonDirectOutput`'s `addPrefixTransformer`, and
|
|
135
|
+
* `writePrefixedLines` for a main-process `nx:run-commands` under
|
|
136
|
+
* `NX_PREFIX_OUTPUT`.
|
|
137
|
+
*
|
|
138
|
+
* One bypass is known and is NOT safe. With `NX_NATIVE_COMMAND_RUNNER=false`,
|
|
139
|
+
* `forkProcessLegacy` forks with inherited stdio and yields
|
|
140
|
+
* `NodeChildProcessWithDirectOutput`, whose child writes straight to this
|
|
141
|
+
* process's fd 1 at arbitrary boundaries — unroutable and undeclarable from
|
|
142
|
+
* here. Line tracking is simply wrong on that path; it degrades to the
|
|
143
|
+
* pre-tracking behavior of a glued marker rather than to anything new. Do not
|
|
144
|
+
* read this list as closed: it is what is known, and the way to tell you are
|
|
145
|
+
* adding to it is that you are writing to stdout during a run without going
|
|
146
|
+
* through {@link writeToStream}, {@link writeTaskOutputChunk} or
|
|
147
|
+
* {@link noteExternalWrite}.
|
|
148
|
+
*/
|
|
149
|
+
private atLineStart;
|
|
51
150
|
private writeToStream;
|
|
151
|
+
/**
|
|
152
|
+
* Forwards a chunk of a task's output live, keeping {@link atLineStart}
|
|
153
|
+
* accurate. Batch workers write raw chunks that routinely end mid-line, and a
|
|
154
|
+
* collapsed summary line must not be glued onto one.
|
|
155
|
+
*
|
|
156
|
+
* @internal Not part of the output API plugins may rely on.
|
|
157
|
+
*/
|
|
158
|
+
writeTaskOutputChunk(chunk: string | Buffer, stream?: WriteStream): void;
|
|
159
|
+
/**
|
|
160
|
+
* Declares output this class could not route — a pseudo-terminal task's, which
|
|
161
|
+
* the native side writes straight to our stdout — so the next writer needing a
|
|
162
|
+
* fresh line asks for one instead of trusting a stale position.
|
|
163
|
+
*
|
|
164
|
+
* The chunk is inspected rather than assumed mid-line, so output that did end
|
|
165
|
+
* on a line boundary does not cost a blank line. PTY chunks often end in an
|
|
166
|
+
* escape sequence after the newline, and that reads as mid-line, which is the
|
|
167
|
+
* safe direction to be wrong in: a spare newline, never a glued one.
|
|
168
|
+
*/
|
|
169
|
+
noteExternalWrite(chunk?: string | Buffer): void;
|
|
170
|
+
private ensureLineStart;
|
|
52
171
|
overwriteLine(lineText?: string): void;
|
|
53
172
|
private writeOutputTitle;
|
|
54
173
|
private writeOptionalOutputBody;
|
|
@@ -66,6 +185,40 @@ declare class CLIOutput {
|
|
|
66
185
|
logRawLine(message: string): void;
|
|
67
186
|
logCommand(message: string, taskStatus?: TaskStatus): void;
|
|
68
187
|
logCommandOutput(message: string, taskStatus: TaskStatus, output: string): void;
|
|
188
|
+
/**
|
|
189
|
+
* A single line standing in for a task's full output, used when the output
|
|
190
|
+
* itself carries no information worth printing (a success, or a cache hit).
|
|
191
|
+
* Statuses that carry a diagnosable body are deliberately not accepted here.
|
|
192
|
+
*/
|
|
193
|
+
logCommandSummary(message: string, taskStatus: CollapsibleTaskStatus): void;
|
|
194
|
+
/**
|
|
195
|
+
* A one-line stand-in for a task whose full output is shown elsewhere — used
|
|
196
|
+
* for the tasks of a batch rendered as a single log group rather than per
|
|
197
|
+
* task. `note` points the reader at that group.
|
|
198
|
+
*/
|
|
199
|
+
logCommandRedirect(message: string, taskStatus: Exclude<TaskStatus, 'skipped'>, note: string): void;
|
|
200
|
+
/**
|
|
201
|
+
* Prints a batch's combined output as one log group. A batch runner's
|
|
202
|
+
* diagnostics — a crash, a config-phase error, a runner summary — belong to no
|
|
203
|
+
* single task, so the group is labelled with the batch rather than a task.
|
|
204
|
+
*
|
|
205
|
+
* The batch's own output is copied straight from the file it was captured
|
|
206
|
+
* into, so an arbitrarily long log costs a fixed amount of memory here.
|
|
207
|
+
* Nothing is withheld: this rendering is chosen because the whole log was
|
|
208
|
+
* asked for, because no task claimed any of it, or because a task failed or
|
|
209
|
+
* was stopped — in which case repeating claimed bytes beside the per-task
|
|
210
|
+
* blocks is deliberate (see TaskOrchestrator.printGroupedBatchOutput).
|
|
211
|
+
*/
|
|
212
|
+
logBatchGroup(label: string, body: {
|
|
213
|
+
capturedOutputPath?: string;
|
|
214
|
+
trailer?: string;
|
|
215
|
+
}, taskStatus: TaskStatus): void;
|
|
216
|
+
/**
|
|
217
|
+
* Copies a file to stdout a chunk at a time. Reading it into one string would
|
|
218
|
+
* reintroduce the unbounded growth that writing it to disk avoided, and a
|
|
219
|
+
* long batch log can exceed the maximum length of a JS string.
|
|
220
|
+
*/
|
|
221
|
+
private copyFileToStream;
|
|
69
222
|
private getCommandWithStatus;
|
|
70
223
|
private getStatusIcon;
|
|
71
224
|
private normalizeMessage;
|
package/dist/src/utils/output.js
CHANGED
|
@@ -1,13 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.output = void 0;
|
|
4
|
+
exports.isStaticOutputStyle = isStaticOutputStyle;
|
|
5
|
+
exports.printsFullTaskOutput = printsFullTaskOutput;
|
|
6
|
+
exports.isLogGroupingEnabled = isLogGroupingEnabled;
|
|
7
|
+
exports.shouldGroupBatchOutput = shouldGroupBatchOutput;
|
|
4
8
|
exports.orange = orange;
|
|
5
9
|
const tslib_1 = require("tslib");
|
|
10
|
+
const figures = tslib_1.__importStar(require("figures"));
|
|
11
|
+
const fs_1 = require("fs");
|
|
6
12
|
const os_1 = require("os");
|
|
7
13
|
const pc = tslib_1.__importStar(require("picocolors"));
|
|
8
14
|
const readline = tslib_1.__importStar(require("readline"));
|
|
9
15
|
const GH_GROUP_PREFIX = '::group::';
|
|
10
16
|
const GH_GROUP_SUFFIX = '::endgroup::';
|
|
17
|
+
/**
|
|
18
|
+
* `static-failures-only` is `static` with successful tasks collapsed to a single
|
|
19
|
+
* line. They select the same life cycle and differ only in what it prints, so
|
|
20
|
+
* everywhere the life cycle is chosen, the TUI is ruled out, or output is
|
|
21
|
+
* routed, the two behave identically.
|
|
22
|
+
*/
|
|
23
|
+
function isStaticOutputStyle(outputStyle) {
|
|
24
|
+
return outputStyle === 'static' || outputStyle === 'static-failures-only';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether a run prints every task's output in full rather than collapsing the
|
|
28
|
+
* ones that succeeded. Both static life cycles and the batch renderer have to
|
|
29
|
+
* agree on this, so they read it from here rather than each deriving it.
|
|
30
|
+
*
|
|
31
|
+
* Exactly one style collapses, and it is also what a run that named no style
|
|
32
|
+
* gets. Every other style prints in full because it was asked for explicitly,
|
|
33
|
+
* so none may quietly withhold output. Note the static life cycles serve more
|
|
34
|
+
* styles than the static-sounding ones: `shouldUseDynamicLifeCycle` bails on
|
|
35
|
+
* `isCI()` before it looks at the style at all, so in CI `dynamic` and `tui`
|
|
36
|
+
* land here too. This is written as a deny-list for that reason — a new style
|
|
37
|
+
* prints in full until someone decides otherwise, rather than silently
|
|
38
|
+
* collapsing because an allow-list did not list it.
|
|
39
|
+
*
|
|
40
|
+
* Resolving the absent case here rather than assigning `outputStyle` upstream is
|
|
41
|
+
* deliberate: the value is also read by the orchestrator to decide whether a
|
|
42
|
+
* task streams, and naming the default there stops `shouldStreamOutput` from
|
|
43
|
+
* ever being consulted — including for the continuous tasks that must stream.
|
|
44
|
+
*/
|
|
45
|
+
function printsFullTaskOutput(args) {
|
|
46
|
+
return (!!args.verbose ||
|
|
47
|
+
(args.outputStyle ?? 'static-failures-only') !== 'static-failures-only');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Whether task output should be wrapped in collapsible log groups. Grouping
|
|
51
|
+
* requires each task's output to be written as one contiguous block, which is
|
|
52
|
+
* why batch mode's implicit streaming backs off when this is on. It does not
|
|
53
|
+
* govern streaming in general — an explicit `--output-style`, the TUI, and
|
|
54
|
+
* long running tasks all still stream.
|
|
55
|
+
*/
|
|
56
|
+
function isLogGroupingEnabled() {
|
|
57
|
+
return (process.env.NX_SKIP_LOG_GROUPING !== 'true' && !!process.env.GITHUB_ACTIONS);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether a batch task's output should be held back from the live stream and
|
|
61
|
+
* rendered inside a fold instead. A batch worker writes to stdout/stderr live,
|
|
62
|
+
* so forwarding that copy would put its bytes outside the group and defeat the
|
|
63
|
+
* fold; what is held back is written to a file and rendered by the orchestrator.
|
|
64
|
+
*
|
|
65
|
+
* Note it is the captured file, not each task's `terminalOutput`, that makes
|
|
66
|
+
* this lossless. A worker is free to write bytes it attributes to no task —
|
|
67
|
+
* `@nx/maven`'s exit-code dump, `@nx/gradle`'s configuration phase — and those
|
|
68
|
+
* appear in no `terminalOutput` at all, so the fold has to be able to fall back
|
|
69
|
+
* to the file. See `TaskOrchestrator.printGroupedBatchOutput` for when it does.
|
|
70
|
+
*
|
|
71
|
+
* This is only worth doing when grouping is on and the user has not asked to
|
|
72
|
+
* stream — an explicit stream style (which sets NX_STREAM_OUTPUT) wants the
|
|
73
|
+
* live copy, folds or not.
|
|
74
|
+
*/
|
|
75
|
+
function shouldGroupBatchOutput() {
|
|
76
|
+
return isLogGroupingEnabled() && process.env.NX_STREAM_OUTPUT !== 'true';
|
|
77
|
+
}
|
|
11
78
|
/**
|
|
12
79
|
* Custom orange color using ANSI 256-color code 214.
|
|
13
80
|
* picocolors does not support keyword-based colors like chalk,
|
|
@@ -50,6 +117,45 @@ class CLIOutput {
|
|
|
50
117
|
this.bold = pc.bold;
|
|
51
118
|
this.underline = pc.underline;
|
|
52
119
|
this.dim = pc.dim;
|
|
120
|
+
/**
|
|
121
|
+
* Whether the terminal is positioned at the start of a line. Task output does
|
|
122
|
+
* not reliably end in a newline, so writers that must begin on a fresh line
|
|
123
|
+
* ask for one via {@link ensureLineStart} rather than guessing.
|
|
124
|
+
*
|
|
125
|
+
* Holding that true means a writer that can leave the cursor mid-line has to
|
|
126
|
+
* be routed through this class or declared to it. The ones that exist today:
|
|
127
|
+
*
|
|
128
|
+
* - This class's own writes, via {@link writeToStream}.
|
|
129
|
+
* - A batch worker's live output, via {@link writeTaskOutputChunk}.
|
|
130
|
+
* - `nx:run-commands`, which is the only executor that runs in the main
|
|
131
|
+
* process (`task-orchestrator.ts` gates that on the executor name), and
|
|
132
|
+
* whose raw writes go through {@link writeTaskOutputChunk} for this reason.
|
|
133
|
+
* Its `addColorAndPrefix` splits on newlines without ever appending one, so
|
|
134
|
+
* its chunks routinely end mid-line.
|
|
135
|
+
* - A pseudo-terminal task, which cannot be routed: the native side writes to
|
|
136
|
+
* this process's stdout from Rust, at arbitrary PTY read boundaries. It
|
|
137
|
+
* declares itself via {@link noteExternalWrite} instead, which is why that
|
|
138
|
+
* exists.
|
|
139
|
+
*
|
|
140
|
+
* Two bypasses are deliberate and safe, both because they re-emit output a
|
|
141
|
+
* whole line at a time via `formatPrefixedLines`, which appends `EOL` to every
|
|
142
|
+
* line it writes: forked task streaming through
|
|
143
|
+
* `NodeChildProcessWithNonDirectOutput`'s `addPrefixTransformer`, and
|
|
144
|
+
* `writePrefixedLines` for a main-process `nx:run-commands` under
|
|
145
|
+
* `NX_PREFIX_OUTPUT`.
|
|
146
|
+
*
|
|
147
|
+
* One bypass is known and is NOT safe. With `NX_NATIVE_COMMAND_RUNNER=false`,
|
|
148
|
+
* `forkProcessLegacy` forks with inherited stdio and yields
|
|
149
|
+
* `NodeChildProcessWithDirectOutput`, whose child writes straight to this
|
|
150
|
+
* process's fd 1 at arbitrary boundaries — unroutable and undeclarable from
|
|
151
|
+
* here. Line tracking is simply wrong on that path; it degrades to the
|
|
152
|
+
* pre-tracking behavior of a glued marker rather than to anything new. Do not
|
|
153
|
+
* read this list as closed: it is what is known, and the way to tell you are
|
|
154
|
+
* adding to it is that you are writing to stdout during a run without going
|
|
155
|
+
* through {@link writeToStream}, {@link writeTaskOutputChunk} or
|
|
156
|
+
* {@link noteExternalWrite}.
|
|
157
|
+
*/
|
|
158
|
+
this.atLineStart = true;
|
|
53
159
|
}
|
|
54
160
|
/**
|
|
55
161
|
* Longer dash character which forms more of a continuous line when place side to side
|
|
@@ -63,8 +169,59 @@ class CLIOutput {
|
|
|
63
169
|
return divider;
|
|
64
170
|
}
|
|
65
171
|
writeToStream(str, stream = process.stdout) {
|
|
172
|
+
// stdout and stderr share one cursor wherever this matters — a CI log, a
|
|
173
|
+
// terminal — so a write to either moves it.
|
|
174
|
+
if ((stream === process.stdout || stream === process.stderr) &&
|
|
175
|
+
str.length > 0) {
|
|
176
|
+
this.atLineStart = str.endsWith('\n');
|
|
177
|
+
}
|
|
66
178
|
stream.write(str);
|
|
67
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Forwards a chunk of a task's output live, keeping {@link atLineStart}
|
|
182
|
+
* accurate. Batch workers write raw chunks that routinely end mid-line, and a
|
|
183
|
+
* collapsed summary line must not be glued onto one.
|
|
184
|
+
*
|
|
185
|
+
* @internal Not part of the output API plugins may rely on.
|
|
186
|
+
*/
|
|
187
|
+
writeTaskOutputChunk(chunk, stream = process.stdout) {
|
|
188
|
+
if (chunk.length > 0 &&
|
|
189
|
+
(stream === process.stdout || stream === process.stderr)) {
|
|
190
|
+
// A Buffer is written through undecoded so a chunk that splits a
|
|
191
|
+
// multi-byte character is not mangled; 0x0a only ever encodes a newline
|
|
192
|
+
// in UTF-8, so its last byte answers the question on its own.
|
|
193
|
+
this.atLineStart =
|
|
194
|
+
typeof chunk === 'string'
|
|
195
|
+
? chunk.endsWith('\n')
|
|
196
|
+
: chunk[chunk.length - 1] === 0x0a;
|
|
197
|
+
}
|
|
198
|
+
stream.write(chunk);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Declares output this class could not route — a pseudo-terminal task's, which
|
|
202
|
+
* the native side writes straight to our stdout — so the next writer needing a
|
|
203
|
+
* fresh line asks for one instead of trusting a stale position.
|
|
204
|
+
*
|
|
205
|
+
* The chunk is inspected rather than assumed mid-line, so output that did end
|
|
206
|
+
* on a line boundary does not cost a blank line. PTY chunks often end in an
|
|
207
|
+
* escape sequence after the newline, and that reads as mid-line, which is the
|
|
208
|
+
* safe direction to be wrong in: a spare newline, never a glued one.
|
|
209
|
+
*/
|
|
210
|
+
noteExternalWrite(chunk) {
|
|
211
|
+
if (chunk === undefined || chunk.length === 0) {
|
|
212
|
+
this.atLineStart = false;
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.atLineStart =
|
|
216
|
+
typeof chunk === 'string'
|
|
217
|
+
? chunk.endsWith('\n')
|
|
218
|
+
: chunk[chunk.length - 1] === 0x0a;
|
|
219
|
+
}
|
|
220
|
+
ensureLineStart() {
|
|
221
|
+
if (!this.atLineStart) {
|
|
222
|
+
this.addNewline();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
68
225
|
overwriteLine(lineText = '') {
|
|
69
226
|
// Ensure we always start writing from column 0.
|
|
70
227
|
readline.cursorTo(process.stdout, 0);
|
|
@@ -182,8 +339,8 @@ class CLIOutput {
|
|
|
182
339
|
}
|
|
183
340
|
logCommandOutput(message, taskStatus, output) {
|
|
184
341
|
let commandOutputWithStatus = this.getCommandWithStatus(message, taskStatus);
|
|
185
|
-
|
|
186
|
-
|
|
342
|
+
const grouped = isLogGroupingEnabled();
|
|
343
|
+
if (grouped) {
|
|
187
344
|
const icon = this.getStatusIcon(taskStatus);
|
|
188
345
|
commandOutputWithStatus = `${GH_GROUP_PREFIX}${icon} ${commandOutputWithStatus}`;
|
|
189
346
|
}
|
|
@@ -192,9 +349,120 @@ class CLIOutput {
|
|
|
192
349
|
this.addNewline();
|
|
193
350
|
this.addNewline();
|
|
194
351
|
this.writeToStream(output);
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
|
|
352
|
+
if (grouped) {
|
|
353
|
+
// GitHub only recognizes ::endgroup:: as a workflow command when it
|
|
354
|
+
// starts a line, and task output routinely lacks a trailing newline.
|
|
355
|
+
this.ensureLineStart();
|
|
356
|
+
this.writeToStream(`${GH_GROUP_SUFFIX}${os_1.EOL}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* A single line standing in for a task's full output, used when the output
|
|
361
|
+
* itself carries no information worth printing (a success, or a cache hit).
|
|
362
|
+
* Statuses that carry a diagnosable body are deliberately not accepted here.
|
|
363
|
+
*/
|
|
364
|
+
logCommandSummary(message, taskStatus) {
|
|
365
|
+
// The preceding task may have left the cursor mid-line, and this line must
|
|
366
|
+
// not be glued onto the end of that task's output.
|
|
367
|
+
this.ensureLineStart();
|
|
368
|
+
const icon = pc.green(figures.tick);
|
|
369
|
+
const command = this.addTaskStatus(taskStatus, this.formatCommand(this.normalizeMessage(message)));
|
|
370
|
+
this.writeToStream(`${icon} ${command}${os_1.EOL}`);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* A one-line stand-in for a task whose full output is shown elsewhere — used
|
|
374
|
+
* for the tasks of a batch rendered as a single log group rather than per
|
|
375
|
+
* task. `note` points the reader at that group.
|
|
376
|
+
*/
|
|
377
|
+
logCommandRedirect(message,
|
|
378
|
+
// A skipped task never ran, so it has no fold to be redirected to - and the
|
|
379
|
+
// icon ladder below would render it with the success tick. Excluding it
|
|
380
|
+
// makes the call site's `status !== 'skipped'` check a consequence of the
|
|
381
|
+
// type rather than a convention to remember.
|
|
382
|
+
taskStatus, note) {
|
|
383
|
+
this.ensureLineStart();
|
|
384
|
+
// A stopped task did not fail; it never got to finish. The TUI summary
|
|
385
|
+
// already draws that distinction, so use the same glyph.
|
|
386
|
+
const icon = taskStatus === 'stopped'
|
|
387
|
+
? pc.cyan(figures.squareSmallFilled)
|
|
388
|
+
: taskStatus === 'failure'
|
|
389
|
+
? pc.red(figures.cross)
|
|
390
|
+
: pc.green(figures.tick);
|
|
391
|
+
const command = this.formatCommand(this.normalizeMessage(message));
|
|
392
|
+
this.writeToStream(`${icon} ${command} ${pc.dim(note)}${os_1.EOL}`);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Prints a batch's combined output as one log group. A batch runner's
|
|
396
|
+
* diagnostics — a crash, a config-phase error, a runner summary — belong to no
|
|
397
|
+
* single task, so the group is labelled with the batch rather than a task.
|
|
398
|
+
*
|
|
399
|
+
* The batch's own output is copied straight from the file it was captured
|
|
400
|
+
* into, so an arbitrarily long log costs a fixed amount of memory here.
|
|
401
|
+
* Nothing is withheld: this rendering is chosen because the whole log was
|
|
402
|
+
* asked for, because no task claimed any of it, or because a task failed or
|
|
403
|
+
* was stopped — in which case repeating claimed bytes beside the per-task
|
|
404
|
+
* blocks is deliberate (see TaskOrchestrator.printGroupedBatchOutput).
|
|
405
|
+
*/
|
|
406
|
+
logBatchGroup(label, body, taskStatus) {
|
|
407
|
+
const grouped = isLogGroupingEnabled();
|
|
408
|
+
let header = `${pc.dim('> ')}${pc.bold(label)}`;
|
|
409
|
+
if (grouped) {
|
|
410
|
+
header = `${GH_GROUP_PREFIX}${this.getStatusIcon(taskStatus)} ${header}`;
|
|
411
|
+
}
|
|
412
|
+
this.addNewline();
|
|
413
|
+
this.writeToStream(header);
|
|
414
|
+
this.addNewline();
|
|
415
|
+
this.addNewline();
|
|
416
|
+
try {
|
|
417
|
+
if (body.capturedOutputPath) {
|
|
418
|
+
this.copyFileToStream(body.capturedOutputPath);
|
|
419
|
+
}
|
|
420
|
+
if (body.trailer) {
|
|
421
|
+
this.ensureLineStart();
|
|
422
|
+
this.writeToStream(`${body.trailer}${os_1.EOL}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
// The header is already on the stream, so an exception while rendering
|
|
427
|
+
// the body must not skip the terminator: GitHub would fold every line
|
|
428
|
+
// after this point into a group that never closes, swallowing the rest of
|
|
429
|
+
// the run's output rather than just this batch's.
|
|
430
|
+
if (grouped) {
|
|
431
|
+
this.ensureLineStart();
|
|
432
|
+
this.writeToStream(`${GH_GROUP_SUFFIX}${os_1.EOL}`);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.ensureLineStart();
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Copies a file to stdout a chunk at a time. Reading it into one string would
|
|
441
|
+
* reintroduce the unbounded growth that writing it to disk avoided, and a
|
|
442
|
+
* long batch log can exceed the maximum length of a JS string.
|
|
443
|
+
*/
|
|
444
|
+
copyFileToStream(path) {
|
|
445
|
+
let fd;
|
|
446
|
+
try {
|
|
447
|
+
fd = (0, fs_1.openSync)(path, 'r');
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
// The batch left nothing behind, or it is already cleaned up. The tasks'
|
|
451
|
+
// own redirect lines still point at this group.
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
try {
|
|
455
|
+
const buffer = Buffer.allocUnsafe(64 * 1024);
|
|
456
|
+
let bytesRead;
|
|
457
|
+
while ((bytesRead = (0, fs_1.readSync)(fd, buffer, 0, buffer.length, null)) > 0) {
|
|
458
|
+
// Copy before writing. `stream.write` queues a Buffer by reference, and
|
|
459
|
+
// stdout is a pipe wherever grouping is on, so a backed-up write would
|
|
460
|
+
// still be holding this memory when the next read overwrites it.
|
|
461
|
+
this.writeTaskOutputChunk(Buffer.from(buffer.subarray(0, bytesRead)));
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
finally {
|
|
465
|
+
(0, fs_1.closeSync)(fd);
|
|
198
466
|
}
|
|
199
467
|
}
|
|
200
468
|
getCommandWithStatus(message, taskStatus) {
|
|
@@ -207,12 +475,28 @@ class CLIOutput {
|
|
|
207
475
|
return '✅';
|
|
208
476
|
case 'failure':
|
|
209
477
|
return '❌';
|
|
478
|
+
case 'stopped':
|
|
479
|
+
return '⏹️';
|
|
210
480
|
case 'skipped':
|
|
211
481
|
case 'local-cache-kept-existing':
|
|
212
482
|
return '⏩';
|
|
213
483
|
case 'local-cache':
|
|
214
484
|
case 'remote-cache':
|
|
215
485
|
return '🔁';
|
|
486
|
+
default: {
|
|
487
|
+
// The repo compiles with `strict: false`, so a `: string` return type
|
|
488
|
+
// alone does not reject a fallthrough - `undefined` stays assignable.
|
|
489
|
+
// This does: a new `TaskStatus` member fails to narrow to `never` here.
|
|
490
|
+
// Worth the lines because the gap already shipped once, rendering
|
|
491
|
+
// `::group::undefined > nx run ...` for a stopped task.
|
|
492
|
+
const unhandled = taskStatus;
|
|
493
|
+
void unhandled;
|
|
494
|
+
// Returning `unhandled` would print the status text where an icon goes
|
|
495
|
+
// (`::group::queued > nx run ...`) for a value that reached us over IPC
|
|
496
|
+
// or from cache metadata without passing the compiler. No icon reads
|
|
497
|
+
// better than a wrong one.
|
|
498
|
+
return '';
|
|
499
|
+
}
|
|
216
500
|
}
|
|
217
501
|
}
|
|
218
502
|
normalizeMessage(message) {
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
declare const safeSharedRootBrand: unique symbol;
|
|
2
|
+
declare const sharedRootEstablishedBrand: unique symbol;
|
|
3
|
+
declare const ownedRealDirBrand: unique symbol;
|
|
4
|
+
declare const ownedPrivateDirBrand: unique symbol;
|
|
5
|
+
/** Verified safe to keep an owner-only directory under. Not created. */
|
|
6
|
+
export type SafeSharedRoot = string & {
|
|
7
|
+
readonly [safeSharedRootBrand]: true;
|
|
8
|
+
};
|
|
9
|
+
/** Created if absent, then verified safe as above. */
|
|
10
|
+
export type EstablishedSharedRoot = string & {
|
|
11
|
+
readonly [sharedRootEstablishedBrand]: true;
|
|
12
|
+
};
|
|
13
|
+
/** An existing real directory owned by us. Mode is *not* checked. */
|
|
14
|
+
export type OwnedRealDir = string & {
|
|
15
|
+
readonly [ownedRealDirBrand]: true;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* POSIX: created if absent, owned by us, and carrying no group or other bits —
|
|
19
|
+
* re-locked first if it was looser. The mode is checked on whichever branch
|
|
20
|
+
* produced it, so the brand does not depend on who created the directory.
|
|
21
|
+
*
|
|
22
|
+
* Windows: only *is a real directory*. `getuid` is unavailable there, so
|
|
23
|
+
* neither ownership nor mode is checked; `%TMP%` is already per-account.
|
|
24
|
+
*/
|
|
25
|
+
export type OwnedPrivateDir = string & {
|
|
26
|
+
readonly [ownedPrivateDirBrand]: true;
|
|
27
|
+
};
|
|
28
|
+
/** Why a guard refused a directory. Data, not a sentence: `remedyFor` decides on it. */
|
|
29
|
+
export type DirRefusal = {
|
|
30
|
+
kind: 'not-created';
|
|
31
|
+
dir: string;
|
|
32
|
+
code?: string;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'not-inspectable';
|
|
35
|
+
dir: string;
|
|
36
|
+
code?: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'not-a-directory';
|
|
39
|
+
dir: string;
|
|
40
|
+
symlink?: true;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'foreign-owner';
|
|
43
|
+
dir: string;
|
|
44
|
+
uid: number;
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'foreign-shared-container';
|
|
47
|
+
dir: string;
|
|
48
|
+
uid: number;
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'not-tightenable';
|
|
51
|
+
dir: string;
|
|
52
|
+
mode: number;
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'peer-writable-not-sticky';
|
|
55
|
+
dir: string;
|
|
56
|
+
mode: number;
|
|
57
|
+
};
|
|
58
|
+
/** A guard's verdict. */
|
|
59
|
+
export type GuardResult<T> = {
|
|
60
|
+
status: 'ok';
|
|
61
|
+
path: T;
|
|
62
|
+
} | {
|
|
63
|
+
status: 'refused';
|
|
64
|
+
refusal: DirRefusal;
|
|
65
|
+
};
|
|
66
|
+
/** The user-facing sentence for a refusal. The only place wording is decided. */
|
|
67
|
+
export declare function describeRefusal(r: DirRefusal): string;
|
|
68
|
+
/** What the user can do about a refusal, or `undefined` when there is nothing. */
|
|
69
|
+
export declare function remedyFor(r: DirRefusal): string | undefined;
|
|
70
|
+
/** One refusal as an `Error`, so several can travel in an `AggregateError`. */
|
|
71
|
+
export declare class DirectoryRefusedError extends Error {
|
|
72
|
+
readonly refusal: DirRefusal;
|
|
73
|
+
constructor(refusal: DirRefusal);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Whether a shared container is safe to keep an owner-only directory under.
|
|
77
|
+
*
|
|
78
|
+
* On POSIX, a container writable by other users must be sticky, and it must be
|
|
79
|
+
* owned by either root or the current user. Windows short-circuits after the
|
|
80
|
+
* directory test — the OS temp root is already scoped to one account, so there
|
|
81
|
+
* is no shared level whose ownership could matter.
|
|
82
|
+
*
|
|
83
|
+
* Sticky directories still let the directory's own owner rename entries, so a
|
|
84
|
+
* container owned by another unprivileged user could replace a previously
|
|
85
|
+
* verified private directory beneath it.
|
|
86
|
+
*/
|
|
87
|
+
export declare function isSafeSharedRoot(dir: string): GuardResult<SafeSharedRoot>;
|
|
88
|
+
/**
|
|
89
|
+
* Whether other users on this machine can write into `dir`. Gates whether a
|
|
90
|
+
* refusal message may cite other users, so it must not over-report: `false` on
|
|
91
|
+
* Windows, where libuv synthesizes `st_mode` from the READONLY attribute and
|
|
92
|
+
* reports an ordinary per-account directory as `0666`, and `false` on a path
|
|
93
|
+
* that cannot be inspected.
|
|
94
|
+
*
|
|
95
|
+
* `statSync`, not `lstatSync`: the question is about the directory that will be
|
|
96
|
+
* used, not the link pointing at it. Link modes mislead in both directions —
|
|
97
|
+
* Linux creates symlinks `0777`, macOS applies the umask. Nothing here decides
|
|
98
|
+
* whether a path is accepted, so following the link costs nothing the guards
|
|
99
|
+
* do not already re-check.
|
|
100
|
+
*/
|
|
101
|
+
export declare function isPeerWritable(dir: string): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Create a shared container as sticky + world-writable if it does not exist,
|
|
104
|
+
* and report whether the resulting path is safe for the current user.
|
|
105
|
+
*
|
|
106
|
+
* **A container that already exists is never modified — only judged.** Do not
|
|
107
|
+
* chmod before deciding trust: `CAP_FOWNER` (root's default in Docker and most
|
|
108
|
+
* CI images) can chmod a directory it does not own, so a peer-owned root would
|
|
109
|
+
* be widened to `1777` and then refused, and an operator who deliberately
|
|
110
|
+
* tightened this root would have it re-widened on every `nx` process.
|
|
111
|
+
*/
|
|
112
|
+
export declare function ensureSafeSharedRoot(dir: string): GuardResult<EstablishedSharedRoot>;
|
|
113
|
+
/**
|
|
114
|
+
* Whether `dir` is an existing real directory owned by us. Unlike
|
|
115
|
+
* `ensureOwnedPrivateDir` it creates nothing and repairs nothing — for callers
|
|
116
|
+
* that only want to know whether a path is safe to act on, such as deleting.
|
|
117
|
+
*/
|
|
118
|
+
export declare function isOwnedRealDirectory(dir: string): OwnedRealDir | null;
|
|
119
|
+
/** The path segment separating one user's Nx runtime state from another's. */
|
|
120
|
+
export declare function getUserSegment(): string;
|
|
121
|
+
/**
|
|
122
|
+
* Ensure `dir` exists, is a real directory owned by us, and carries no group or
|
|
123
|
+
* other bits at all — read and search alone reach a socket inside it, so 0755 is
|
|
124
|
+
* re-locked rather than accepted. A `refused` status carries which check said
|
|
125
|
+
* no — usually `foreign-owner` for a directory another user planted, but also
|
|
126
|
+
* `not-created`/`not-inspectable` for a filesystem error, `not-a-directory`, or
|
|
127
|
+
* `not-tightenable` when the re-lock did not land.
|
|
128
|
+
*
|
|
129
|
+
* Node builtins only: reached from the native binding loader.
|
|
130
|
+
*/
|
|
131
|
+
export declare function ensureOwnedPrivateDir(dir: string): GuardResult<OwnedPrivateDir>;
|
|
132
|
+
export {};
|