nx 23.1.0 → 23.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/nx.js +2 -1
- package/dist/release/changelog-renderer/index.js +4 -5
- package/dist/release/index.d.ts +1 -1
- package/dist/src/ai/configure-ai-agents-disclaimer.d.ts +5 -0
- package/dist/src/ai/configure-ai-agents-disclaimer.js +31 -0
- package/dist/src/analytics/analytics.d.ts +6 -0
- package/dist/src/analytics/analytics.js +16 -8
- 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 +13 -1
- package/dist/src/command-line/affected/affected.js +1 -0
- package/dist/src/command-line/configure-ai-agents/configure-ai-agents.js +2 -2
- 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 +2 -3
- package/dist/src/command-line/init/ai-agent-prompts.d.ts +1 -1
- package/dist/src/command-line/init/ai-agent-prompts.js +7 -6
- package/dist/src/command-line/init/command-object.js +10 -2
- package/dist/src/command-line/init/configure-plugins.js +3 -2
- package/dist/src/command-line/init/implementation/add-nx-to-monorepo.js +4 -2
- package/dist/src/command-line/init/implementation/add-nx-to-nest.js +4 -3
- package/dist/src/command-line/init/implementation/add-nx-to-npm-repo.js +4 -3
- package/dist/src/command-line/init/implementation/add-nx-to-turborepo.js +4 -3
- package/dist/src/command-line/init/implementation/angular/index.js +4 -2
- 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 +3 -0
- package/dist/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +4 -1
- package/dist/src/command-line/init/implementation/utils.d.ts +3 -3
- package/dist/src/command-line/init/implementation/utils.js +22 -3
- package/dist/src/command-line/init/init-v2.js +4 -5
- package/dist/src/command-line/migrate/execute-migration.d.ts +72 -0
- package/dist/src/command-line/migrate/execute-migration.js +389 -0
- package/dist/src/command-line/migrate/migrate-ui-api.js +17 -12
- package/dist/src/command-line/migrate/migrate.d.ts +5 -45
- package/dist/src/command-line/migrate/migrate.js +122 -402
- package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +1 -1
- package/dist/src/command-line/nx-cloud/connect/view-logs.js +2 -0
- package/dist/src/command-line/release/changelog.js +5 -0
- package/dist/src/command-line/release/index.d.ts +1 -1
- package/dist/src/command-line/release/utils/git.js +7 -3
- package/dist/src/command-line/release/utils/release-graph.d.ts +19 -2
- package/dist/src/command-line/release/utils/release-graph.js +71 -19
- package/dist/src/command-line/release/utils/remote-release-clients/github.js +7 -1
- package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +1 -1
- package/dist/src/command-line/release/utils/shared.d.ts +2 -2
- 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/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 +9 -5
- 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/info.js +11 -2
- 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 +1 -1
- package/dist/src/commands-runner/create-command-graph.js +5 -0
- package/dist/src/config/nx-json.d.ts +5 -3
- 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 -3
- package/dist/src/daemon/client/client.js +177 -55
- 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 +96 -3
- package/dist/src/devkit-internals.js +200 -4
- package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.d.ts +5 -0
- package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.js +9 -2
- package/dist/src/generators/tree.d.ts +4 -2
- package/dist/src/generators/utils/nx-json.js +13 -3
- 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-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 +31 -2
- 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/utilities/get-cloud-options.js +5 -2
- package/dist/src/nx-cloud/utilities/onboarding.js +5 -2
- package/dist/src/plugins/js/lock-file/bun-parser.js +43 -10
- package/dist/src/plugins/js/lock-file/npm-parser.js +71 -27
- package/dist/src/plugins/js/lock-file/pnpm-parser.js +110 -17
- package/dist/src/plugins/js/lock-file/project-graph-pruning.js +15 -9
- package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.js +3 -0
- package/dist/src/plugins/js/lock-file/yarn-parser.js +32 -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/plugins/js/utils/register.d.ts +18 -0
- package/dist/src/plugins/js/utils/register.js +81 -0
- package/dist/src/plugins/js/utils/typescript.d.ts +9 -0
- package/dist/src/plugins/js/utils/typescript.js +15 -0
- 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 +68 -3
- package/dist/src/project-graph/file-utils.js +6 -1
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.d.ts +1 -0
- package/dist/src/project-graph/plugins/isolation/isolated-plugin.js +22 -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/plugins/transpiler.js +4 -0
- package/dist/src/project-graph/project-graph.js +23 -0
- package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.d.ts +10 -12
- package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.js +93 -63
- package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.d.ts +5 -8
- package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.js +16 -15
- 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 -101
- package/dist/src/tasks-runner/life-cycles/performance-analysis.d.ts +11 -4
- package/dist/src/tasks-runner/life-cycles/performance-analysis.js +15 -6
- package/dist/src/tasks-runner/life-cycles/performance-life-cycle.js +5 -4
- package/dist/src/tasks-runner/life-cycles/performance-report.d.ts +18 -8
- package/dist/src/tasks-runner/life-cycles/performance-report.js +66 -29
- package/dist/src/tasks-runner/run-command.js +4 -2
- 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 +4 -1
- package/dist/src/tasks-runner/task-orchestrator.js +23 -10
- package/dist/src/tasks-runner/utils.js +2 -6
- package/dist/src/utils/acknowledge-build-scripts.d.ts +13 -0
- package/dist/src/utils/acknowledge-build-scripts.js +102 -0
- package/dist/src/utils/analytics-prompt.d.ts +0 -6
- package/dist/src/utils/analytics-prompt.js +0 -51
- package/dist/src/utils/assert-workspace-validity.js +7 -2
- package/dist/src/utils/catalog/manager-utils.d.ts +1 -2
- package/dist/src/utils/catalog/manager-utils.js +22 -5
- package/dist/src/utils/catalog/pnpm-manager.d.ts +1 -0
- package/dist/src/utils/catalog/pnpm-manager.js +3 -15
- package/dist/src/utils/catalog/yarn-manager.d.ts +1 -0
- package/dist/src/utils/catalog/yarn-manager.js +3 -15
- package/dist/src/utils/command-line-utils.js +30 -20
- package/dist/src/utils/fileutils.d.ts +5 -0
- package/dist/src/utils/fileutils.js +7 -2
- package/dist/src/utils/git-revision.d.ts +12 -0
- package/dist/src/utils/git-revision.js +25 -0
- package/dist/src/utils/git-utils.d.ts +16 -3
- package/dist/src/utils/git-utils.js +146 -52
- package/dist/src/utils/git-worktrees.d.ts +30 -0
- package/dist/src/utils/git-worktrees.js +212 -0
- package/dist/src/utils/ignore.d.ts +128 -1
- package/dist/src/utils/ignore.js +182 -12
- 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/behavior/pnpm.js +9 -7
- package/dist/src/utils/min-release-age/packument.js +1 -1
- 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/owned-private-dir.d.ts +132 -0
- package/dist/src/utils/owned-private-dir.js +323 -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 +264 -43
- package/dist/src/utils/provenance.js +18 -16
- 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/migrations.json +13 -1
- package/package.json +22 -17
- package/dist/src/migrations/update-17-3-0/nx-release-path.d.ts +0 -3
- package/dist/src/migrations/update-17-3-0/nx-release-path.js +0 -47
- package/dist/src/utils/min-release-age/npmrc.d.ts +0 -15
- package/dist/src/utils/min-release-age/npmrc.js +0 -45
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChildProcess, ExecFileSyncOptions, SpawnOptions } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Spawn a binary that may be a Windows `.cmd`/`.bat` shim, without letting its
|
|
4
|
+
* arguments become shell syntax.
|
|
5
|
+
*
|
|
6
|
+
* Off Windows, and for a `.exe`, no shell is involved at all. Where one is —
|
|
7
|
+
* a shim or a bare name — the binary and every argument are quoted for cmd.exe.
|
|
8
|
+
*
|
|
9
|
+
* Not a complete guarantee: cmd.exe expands `%VAR%` in the binary or any
|
|
10
|
+
* argument whether or not it is quoted, so a caller with untrusted arguments
|
|
11
|
+
* inherits that gap (NXC-4798). See the note on `LINE_BREAK` above.
|
|
12
|
+
*
|
|
13
|
+
* @throws on Windows when the binary or an argument contains a line break, or a
|
|
14
|
+
* literal `"` (via `quoteShellArg`). Those are the only refusals — the `%`
|
|
15
|
+
* expansion above is not one of them.
|
|
16
|
+
*/
|
|
17
|
+
export declare function safeSpawn(binary: string, args: readonly string[], options?: Omit<SpawnOptions, 'shell'>): ChildProcess;
|
|
18
|
+
/**
|
|
19
|
+
* Synchronous {@link safeSpawn}, returning the child's stdout.
|
|
20
|
+
*
|
|
21
|
+
* Carries the same Windows caveats: `%VAR%` is expanded quoted or not
|
|
22
|
+
* (NXC-4798), and a line break or literal `"` throws.
|
|
23
|
+
*/
|
|
24
|
+
export declare function safeExecFileSync(binary: string, args: readonly string[], options?: Omit<ExecFileSyncOptions, 'encoding' | 'shell'>): string;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeSpawn = safeSpawn;
|
|
4
|
+
exports.safeExecFileSync = safeExecFileSync;
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const shell_quoting_1 = require("./shell-quoting");
|
|
8
|
+
// Node refuses to launch a Windows `.cmd`/`.bat` shim without a shell
|
|
9
|
+
// (CVE-2024-27980). A bare name takes the shell for the same reason, one step
|
|
10
|
+
// removed: libuv walks PATH and PATHEXT itself, so no shell is needed to *find*
|
|
11
|
+
// the binary — but the walk may land on a `.cmd`/`.bat`, and this cannot know
|
|
12
|
+
// which in advance, so it is deliberately conservative. Everything else,
|
|
13
|
+
// including a `.exe`, spawns directly, so the shell and the quoting below reach
|
|
14
|
+
// only the invocations that cannot do without them.
|
|
15
|
+
//
|
|
16
|
+
// Deliberately a function: a module-level const is fixed at import time, which
|
|
17
|
+
// would make the Windows branch untestable.
|
|
18
|
+
function needsShell(binary) {
|
|
19
|
+
if (process.platform !== 'win32') {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// win32.extname, not the platform default: this branch only runs on Windows,
|
|
23
|
+
// where `path` is win32 anyway, and pinning it lets a test model the real
|
|
24
|
+
// parse rather than posix's (which reads `C:\ws\my.app\gradlew` as `.app\gradlew`).
|
|
25
|
+
const ext = path_1.win32.extname(binary).toLowerCase();
|
|
26
|
+
return ext === '' || ext === '.cmd' || ext === '.bat';
|
|
27
|
+
}
|
|
28
|
+
// A line break ends the command line whatever the quoting, so nothing can carry
|
|
29
|
+
// one.
|
|
30
|
+
//
|
|
31
|
+
// `%` is deliberately NOT refused, and this is a known gap rather than a safe
|
|
32
|
+
// case. cmd.exe expands `%VAR%` whether or not the value is quoted — see
|
|
33
|
+
// `quoteShellArg`'s own docstring in ./shell-quoting, which says so and pins it
|
|
34
|
+
// with a test — so quoting contains nothing here. It applies to the binary path
|
|
35
|
+
// as much as to the arguments, and an expansion yielding a `"` defeats the
|
|
36
|
+
// literal-quote refusal below, because that inspects the pre-expansion bytes.
|
|
37
|
+
// `bin/nx.ts` loads the workspace's own `.env` before the graph is built, so a
|
|
38
|
+
// repo can set the variable too.
|
|
39
|
+
//
|
|
40
|
+
// Refusing `%` is what an earlier revision did, and it made any workspace under
|
|
41
|
+
// a `%` path — a legal Windows directory name — fail graph construction. The gap
|
|
42
|
+
// is bounded by the argument that bounds this whole class: a repo that can reach
|
|
43
|
+
// here already has `mvnw` / `pom.xml` executing on its behalf. Closing it
|
|
44
|
+
// properly is tracked as NXC-4798.
|
|
45
|
+
const LINE_BREAK = /[\r\n]/;
|
|
46
|
+
/**
|
|
47
|
+
* Spawn a binary that may be a Windows `.cmd`/`.bat` shim, without letting its
|
|
48
|
+
* arguments become shell syntax.
|
|
49
|
+
*
|
|
50
|
+
* Off Windows, and for a `.exe`, no shell is involved at all. Where one is —
|
|
51
|
+
* a shim or a bare name — the binary and every argument are quoted for cmd.exe.
|
|
52
|
+
*
|
|
53
|
+
* Not a complete guarantee: cmd.exe expands `%VAR%` in the binary or any
|
|
54
|
+
* argument whether or not it is quoted, so a caller with untrusted arguments
|
|
55
|
+
* inherits that gap (NXC-4798). See the note on `LINE_BREAK` above.
|
|
56
|
+
*
|
|
57
|
+
* @throws on Windows when the binary or an argument contains a line break, or a
|
|
58
|
+
* literal `"` (via `quoteShellArg`). Those are the only refusals — the `%`
|
|
59
|
+
* expansion above is not one of them.
|
|
60
|
+
*/
|
|
61
|
+
function safeSpawn(binary, args, options = {}) {
|
|
62
|
+
const shell = needsShell(binary);
|
|
63
|
+
return (0, child_process_1.spawn)(quoteBinary(binary, shell), quoteArgs(args, shell), {
|
|
64
|
+
...options,
|
|
65
|
+
windowsHide: true,
|
|
66
|
+
shell,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Synchronous {@link safeSpawn}, returning the child's stdout.
|
|
71
|
+
*
|
|
72
|
+
* Carries the same Windows caveats: `%VAR%` is expanded quoted or not
|
|
73
|
+
* (NXC-4798), and a line break or literal `"` throws.
|
|
74
|
+
*/
|
|
75
|
+
function safeExecFileSync(binary, args, options = {}) {
|
|
76
|
+
const shell = needsShell(binary);
|
|
77
|
+
return (0, child_process_1.execFileSync)(quoteBinary(binary, shell), quoteArgs(args, shell), {
|
|
78
|
+
stdio: 'pipe',
|
|
79
|
+
...options,
|
|
80
|
+
windowsHide: true,
|
|
81
|
+
shell,
|
|
82
|
+
encoding: 'utf-8',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// The binary needs quoting too: Node joins it into the same command line, so a
|
|
86
|
+
// path holding a space or an `&` would split there.
|
|
87
|
+
function quoteBinary(binary, shell) {
|
|
88
|
+
if (!shell) {
|
|
89
|
+
return binary;
|
|
90
|
+
}
|
|
91
|
+
return quoteForCmd(binary, `the path ${JSON.stringify(binary)}`);
|
|
92
|
+
}
|
|
93
|
+
function quoteForCmd(value, described, remedy = '') {
|
|
94
|
+
if (LINE_BREAK.test(value)) {
|
|
95
|
+
throw new Error(`Cannot pass ${described} to cmd.exe: a line break inside it would end the command line before cmd.exe reached the rest of it.${remedy}`);
|
|
96
|
+
}
|
|
97
|
+
return (0, shell_quoting_1.quoteShellArg)(value);
|
|
98
|
+
}
|
|
99
|
+
function quoteArgs(args, shell) {
|
|
100
|
+
if (!shell) {
|
|
101
|
+
return [...args];
|
|
102
|
+
}
|
|
103
|
+
return args.map((arg) => quoteForCmd(arg, `the argument ${JSON.stringify(arg)}`, ' Remove it from your Nx configuration and try again.'));
|
|
104
|
+
}
|
|
@@ -8,3 +8,18 @@ export declare function needsShellQuoting(str: string): boolean;
|
|
|
8
8
|
* Check if a string is already wrapped in matching quotes (single or double).
|
|
9
9
|
*/
|
|
10
10
|
export declare function isAlreadyQuoted(str: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Quote a string so it survives being interpolated into a shell command line
|
|
13
|
+
* as a single argument.
|
|
14
|
+
*
|
|
15
|
+
* On Windows the safety boundary is one unbroken double-quoted run: it keeps
|
|
16
|
+
* `^`, `&`, `|`, `<` and `>` literal through cmd.exe's parse and a `.cmd`
|
|
17
|
+
* shim's re-parse of `%*`, but not `%`, which cmd.exe expands inside double
|
|
18
|
+
* quotes too.
|
|
19
|
+
*
|
|
20
|
+
* @throws on Windows when the argument contains a double quote, which ends that
|
|
21
|
+
* run, since cmd.exe recognizes no backslash escape. Carrying one means
|
|
22
|
+
* caret-escaping every metacharacter instead, doubled for a `.cmd` shim, which
|
|
23
|
+
* this path does not implement.
|
|
24
|
+
*/
|
|
25
|
+
export declare function quoteShellArg(arg: string): string;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.needsShellQuoting = needsShellQuoting;
|
|
4
4
|
exports.isAlreadyQuoted = isAlreadyQuoted;
|
|
5
|
+
exports.quoteShellArg = quoteShellArg;
|
|
5
6
|
/**
|
|
6
7
|
* Shell metacharacters that have special meaning and require quoting.
|
|
7
8
|
*
|
|
@@ -39,3 +40,37 @@ function isAlreadyQuoted(str) {
|
|
|
39
40
|
((str[0] === "'" && str[str.length - 1] === "'") ||
|
|
40
41
|
(str[0] === '"' && str[str.length - 1] === '"')));
|
|
41
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Quote a string so it survives being interpolated into a shell command line
|
|
45
|
+
* as a single argument.
|
|
46
|
+
*
|
|
47
|
+
* On Windows the safety boundary is one unbroken double-quoted run: it keeps
|
|
48
|
+
* `^`, `&`, `|`, `<` and `>` literal through cmd.exe's parse and a `.cmd`
|
|
49
|
+
* shim's re-parse of `%*`, but not `%`, which cmd.exe expands inside double
|
|
50
|
+
* quotes too.
|
|
51
|
+
*
|
|
52
|
+
* @throws on Windows when the argument contains a double quote, which ends that
|
|
53
|
+
* run, since cmd.exe recognizes no backslash escape. Carrying one means
|
|
54
|
+
* caret-escaping every metacharacter instead, doubled for a `.cmd` shim, which
|
|
55
|
+
* this path does not implement.
|
|
56
|
+
*/
|
|
57
|
+
function quoteShellArg(arg) {
|
|
58
|
+
const isWindows = process.platform === 'win32';
|
|
59
|
+
if (isWindows && arg.includes('"')) {
|
|
60
|
+
throw new Error(`Cannot safely pass ${arg} to cmd.exe as a single argument: a double quote inside it would end the quoting and leave the rest of the argument to be read as commands. Remove the double quote and run the command again.`);
|
|
61
|
+
}
|
|
62
|
+
if (arg === '') {
|
|
63
|
+
// an unquoted empty string would vanish when joined into a command line
|
|
64
|
+
return isWindows ? '""' : "''";
|
|
65
|
+
}
|
|
66
|
+
// `^` is cmd.exe syntax rather than shell syntax, so it earns quoting only
|
|
67
|
+
// where cmd.exe parses the command line.
|
|
68
|
+
if (!needsShellQuoting(arg) && !(isWindows && arg.includes('^'))) {
|
|
69
|
+
return arg;
|
|
70
|
+
}
|
|
71
|
+
return isWindows
|
|
72
|
+
? // MSVCRT reads the backslashes that precede the closing quote as escapes,
|
|
73
|
+
// so they have to be doubled to survive as themselves.
|
|
74
|
+
`"${arg.replace(/(\\+)$/, '$1$1')}"`
|
|
75
|
+
: `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
76
|
+
}
|
|
@@ -12,4 +12,15 @@ export declare function waitForSocketConnection(socketPath: string | (() => stri
|
|
|
12
12
|
signal?: AbortSignal;
|
|
13
13
|
maxAttempts?: number;
|
|
14
14
|
delayMs?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Called with the errno of each failed connect and the path it was made
|
|
17
|
+
* against. Return `true` to stop polling: a permission refusal does not
|
|
18
|
+
* heal by retrying, and without a way out the caller waits the full budget
|
|
19
|
+
* and then cannot say why.
|
|
20
|
+
*
|
|
21
|
+
* The path is passed rather than left to the caller to recompute — with a
|
|
22
|
+
* resolver it can differ per attempt, and the caller that reports the
|
|
23
|
+
* refusal may no longer be able to resolve one at all.
|
|
24
|
+
*/
|
|
25
|
+
onConnectError?: (error: NodeJS.ErrnoException, socketPath: string) => boolean | void;
|
|
15
26
|
}): Promise<Socket | null>;
|
|
@@ -26,9 +26,15 @@ async function waitForSocketConnection(socketPath, options) {
|
|
|
26
26
|
return null;
|
|
27
27
|
const path = typeof socketPath === 'function' ? socketPath() : socketPath;
|
|
28
28
|
if (path) {
|
|
29
|
-
const
|
|
30
|
-
if (socket) {
|
|
31
|
-
return socket;
|
|
29
|
+
const result = await tryConnect(path);
|
|
30
|
+
if (result.socket) {
|
|
31
|
+
return result.socket;
|
|
32
|
+
}
|
|
33
|
+
// The caller may need the errno this attempt produced — a refused
|
|
34
|
+
// connection is reported very differently from a socket that is not
|
|
35
|
+
// there yet, and polling past it only delays the same answer.
|
|
36
|
+
if (result.error && options?.onConnectError?.(result.error, path)) {
|
|
37
|
+
return null;
|
|
32
38
|
}
|
|
33
39
|
}
|
|
34
40
|
attempts++;
|
|
@@ -39,15 +45,15 @@ function tryConnect(socketPath) {
|
|
|
39
45
|
return new Promise((resolve) => {
|
|
40
46
|
try {
|
|
41
47
|
const socket = (0, net_1.connect)(socketPath, () => {
|
|
42
|
-
resolve(socket);
|
|
48
|
+
resolve({ socket });
|
|
43
49
|
});
|
|
44
|
-
socket.once('error', () => {
|
|
50
|
+
socket.once('error', (error) => {
|
|
45
51
|
socket.destroy();
|
|
46
|
-
resolve(
|
|
52
|
+
resolve({ error });
|
|
47
53
|
});
|
|
48
54
|
}
|
|
49
|
-
catch {
|
|
50
|
-
resolve(
|
|
55
|
+
catch (error) {
|
|
56
|
+
resolve({ error: error });
|
|
51
57
|
}
|
|
52
58
|
});
|
|
53
59
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NxJsonConfiguration } from '../config/nx-json';
|
|
2
|
+
/**
|
|
3
|
+
* The workspace's analytics identity: the Nx Cloud id when the workspace has
|
|
4
|
+
* one (most stable — it survives repo moves and renames), else the repo key.
|
|
5
|
+
* Null when neither is available, in which case nothing is reported.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateWorkspaceId(root: string, nxJson: NxJsonConfiguration | null): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Derive the stable, unsalted key identifying this workspace in the
|
|
10
|
+
* repoTelemetry registry: `sha256(<repo identity> + '#' + <workspace path
|
|
11
|
+
* relative to the git root>)`.
|
|
12
|
+
*
|
|
13
|
+
* The repo identity is the normalized `domain/slug` from the git remote
|
|
14
|
+
* (protocol-independent: ssh, https, and token-authenticated URLs of the
|
|
15
|
+
* same repo produce the same key), falling back to the first-commit SHA
|
|
16
|
+
* when no remote exists. Returns null when no identity is derivable — not
|
|
17
|
+
* a git repository, or a shallow clone without a remote.
|
|
18
|
+
*/
|
|
19
|
+
export declare function deriveRepoKey(directory: string): string | null;
|
|
20
|
+
export declare function computeRepoKey(identity: string, relativePath: string): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateWorkspaceId = generateWorkspaceId;
|
|
4
|
+
exports.deriveRepoKey = deriveRepoKey;
|
|
5
|
+
exports.computeRepoKey = computeRepoKey;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const git_utils_1 = require("./git-utils");
|
|
8
|
+
/**
|
|
9
|
+
* The workspace's analytics identity: the Nx Cloud id when the workspace has
|
|
10
|
+
* one (most stable — it survives repo moves and renames), else the repo key.
|
|
11
|
+
* Null when neither is available, in which case nothing is reported.
|
|
12
|
+
*/
|
|
13
|
+
function generateWorkspaceId(root, nxJson) {
|
|
14
|
+
const nxCloudId = nxJson?.nxCloudId ?? nxJson?.nxCloudAccessToken;
|
|
15
|
+
if (nxCloudId) {
|
|
16
|
+
return nxCloudId;
|
|
17
|
+
}
|
|
18
|
+
return deriveRepoKey(root);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Derive the stable, unsalted key identifying this workspace in the
|
|
22
|
+
* repoTelemetry registry: `sha256(<repo identity> + '#' + <workspace path
|
|
23
|
+
* relative to the git root>)`.
|
|
24
|
+
*
|
|
25
|
+
* The repo identity is the normalized `domain/slug` from the git remote
|
|
26
|
+
* (protocol-independent: ssh, https, and token-authenticated URLs of the
|
|
27
|
+
* same repo produce the same key), falling back to the first-commit SHA
|
|
28
|
+
* when no remote exists. Returns null when no identity is derivable — not
|
|
29
|
+
* a git repository, or a shallow clone without a remote.
|
|
30
|
+
*/
|
|
31
|
+
function deriveRepoKey(directory) {
|
|
32
|
+
const identity = getRepoIdentity(directory);
|
|
33
|
+
if (!identity) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return computeRepoKey(identity, (0, git_utils_1.getGitRootRelativePath)(directory) ?? '');
|
|
37
|
+
}
|
|
38
|
+
function computeRepoKey(identity, relativePath) {
|
|
39
|
+
return (0, crypto_1.createHash)('sha256')
|
|
40
|
+
.update(`${identity}#${relativePath}`)
|
|
41
|
+
.digest('hex');
|
|
42
|
+
}
|
|
43
|
+
function getRepoIdentity(directory) {
|
|
44
|
+
const remote = (0, git_utils_1.getVcsRemoteInfo)(directory);
|
|
45
|
+
if (remote) {
|
|
46
|
+
// Hosts route case-insensitively and hold one canonical casing, so a
|
|
47
|
+
// hand-typed remote must key the same as the canonical one the claim
|
|
48
|
+
// flow derives from the host's API.
|
|
49
|
+
return `${remote.domain}/${remote.slug}`.toLowerCase().replace(/\/+$/, '');
|
|
50
|
+
}
|
|
51
|
+
// Without a remote the first commit is the only stable identity, and a
|
|
52
|
+
// shallow clone doesn't have a real one.
|
|
53
|
+
return (0, git_utils_1.isShallowRepository)(directory) ? null : (0, git_utils_1.getFirstCommitSha)(directory);
|
|
54
|
+
}
|
package/migrations.json
CHANGED
|
@@ -160,7 +160,13 @@
|
|
|
160
160
|
"cli": "nx",
|
|
161
161
|
"version": "22.6.0-rc.0",
|
|
162
162
|
"description": "Adds .claude/settings.local.json to .gitignore",
|
|
163
|
-
"implementation": "./dist/src/migrations/update-
|
|
163
|
+
"implementation": "./dist/src/migrations/update-22-6-0/add-claude-settings-local-to-git-ignore"
|
|
164
|
+
},
|
|
165
|
+
"22-6-0-enable-analytics-prompt": {
|
|
166
|
+
"cli": "nx",
|
|
167
|
+
"version": "22.6.0-beta.11",
|
|
168
|
+
"description": "Prompts to enable usage analytics",
|
|
169
|
+
"implementation": "./dist/src/migrations/update-22-6-0/enable-analytics-prompt"
|
|
164
170
|
},
|
|
165
171
|
"22-7-0-add-self-healing-to-gitignore": {
|
|
166
172
|
"cli": "nx",
|
|
@@ -178,6 +184,12 @@
|
|
|
178
184
|
"version": "23.0.0-beta.18",
|
|
179
185
|
"description": "Adds .nx/migrate-runs to .gitignore",
|
|
180
186
|
"implementation": "./dist/src/migrations/update-23-0-0/add-migrate-runs-to-git-ignore"
|
|
187
|
+
},
|
|
188
|
+
"23-2-0-set-cache-on-executor-target-defaults": {
|
|
189
|
+
"version": "23.2.0-beta.8",
|
|
190
|
+
"description": "Sets \"cache\" on some executor-based target defaults whose caching was previously enabled by a target name default, maintaining compatibility with how cacheability resolved before Nx 23. Keys the migration cannot decide are left alone and keep working through a deprecated runtime fallback.",
|
|
191
|
+
"implementation": "./dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults",
|
|
192
|
+
"documentation": "./dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.md"
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nx",
|
|
3
|
-
"version": "23.1.
|
|
3
|
+
"version": "23.1.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"description": "The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.",
|
|
@@ -61,12 +61,13 @@
|
|
|
61
61
|
"ansi-styles": "4.3.0",
|
|
62
62
|
"argparse": "2.0.1",
|
|
63
63
|
"asynckit": "0.4.0",
|
|
64
|
-
"axios": "1.
|
|
64
|
+
"axios": "1.18.1",
|
|
65
65
|
"balanced-match": "4.0.3",
|
|
66
66
|
"base64-js": "1.5.1",
|
|
67
67
|
"bl": "4.1.0",
|
|
68
|
-
"brace-expansion": "5.0.
|
|
68
|
+
"brace-expansion": "5.0.9",
|
|
69
69
|
"buffer": "5.7.1",
|
|
70
|
+
"bundle-name": "4.1.0",
|
|
70
71
|
"call-bind-apply-helpers": "1.0.2",
|
|
71
72
|
"chalk": "4.1.2",
|
|
72
73
|
"cli-cursor": "3.1.0",
|
|
@@ -77,8 +78,10 @@
|
|
|
77
78
|
"color-name": "1.1.4",
|
|
78
79
|
"combined-stream": "1.0.8",
|
|
79
80
|
"debug": "4.4.3",
|
|
81
|
+
"default-browser": "5.2.1",
|
|
82
|
+
"default-browser-id": "5.0.0",
|
|
80
83
|
"defaults": "1.0.4",
|
|
81
|
-
"define-lazy-prop": "
|
|
84
|
+
"define-lazy-prop": "3.0.0",
|
|
82
85
|
"delayed-stream": "1.0.0",
|
|
83
86
|
"dotenv": "16.4.7",
|
|
84
87
|
"dotenv-expand": "12.0.3",
|
|
@@ -111,11 +114,12 @@
|
|
|
111
114
|
"ieee754": "1.2.1",
|
|
112
115
|
"ignore": "7.0.5",
|
|
113
116
|
"inherits": "2.0.4",
|
|
114
|
-
"is-docker": "
|
|
117
|
+
"is-docker": "3.0.0",
|
|
115
118
|
"is-fullwidth-code-point": "3.0.0",
|
|
119
|
+
"is-inside-container": "1.0.0",
|
|
116
120
|
"is-interactive": "1.0.0",
|
|
117
121
|
"is-unicode-supported": "0.1.0",
|
|
118
|
-
"is-wsl": "
|
|
122
|
+
"is-wsl": "3.1.0",
|
|
119
123
|
"isexe": "2.0.0",
|
|
120
124
|
"json5": "2.2.3",
|
|
121
125
|
"jsonc-parser": "3.3.1",
|
|
@@ -131,7 +135,7 @@
|
|
|
131
135
|
"npm-run-path": "4.0.1",
|
|
132
136
|
"once": "1.4.0",
|
|
133
137
|
"onetime": "5.1.2",
|
|
134
|
-
"open": "
|
|
138
|
+
"open": "10.1.0",
|
|
135
139
|
"ora": "5.4.1",
|
|
136
140
|
"path-key": "3.1.1",
|
|
137
141
|
"picocolors": "1.1.1",
|
|
@@ -140,6 +144,7 @@
|
|
|
140
144
|
"require-directory": "2.1.1",
|
|
141
145
|
"resolve.exports": "2.0.3",
|
|
142
146
|
"restore-cursor": "3.1.0",
|
|
147
|
+
"run-applescript": "7.0.0",
|
|
143
148
|
"safe-buffer": "5.2.1",
|
|
144
149
|
"semver": "7.8.4",
|
|
145
150
|
"signal-exit": "3.0.7",
|
|
@@ -176,16 +181,16 @@
|
|
|
176
181
|
}
|
|
177
182
|
},
|
|
178
183
|
"optionalDependencies": {
|
|
179
|
-
"@nx/nx-darwin-arm64": "23.1.
|
|
180
|
-
"@nx/nx-darwin-x64": "23.1.
|
|
181
|
-
"@nx/nx-freebsd-x64": "23.1.
|
|
182
|
-
"@nx/nx-linux-arm-gnueabihf": "23.1.
|
|
183
|
-
"@nx/nx-linux-arm64-gnu": "23.1.
|
|
184
|
-
"@nx/nx-linux-arm64-musl": "23.1.
|
|
185
|
-
"@nx/nx-linux-x64-gnu": "23.1.
|
|
186
|
-
"@nx/nx-linux-x64-musl": "23.1.
|
|
187
|
-
"@nx/nx-win32-arm64-msvc": "23.1.
|
|
188
|
-
"@nx/nx-win32-x64-msvc": "23.1.
|
|
184
|
+
"@nx/nx-darwin-arm64": "23.1.2",
|
|
185
|
+
"@nx/nx-darwin-x64": "23.1.2",
|
|
186
|
+
"@nx/nx-freebsd-x64": "23.1.2",
|
|
187
|
+
"@nx/nx-linux-arm-gnueabihf": "23.1.2",
|
|
188
|
+
"@nx/nx-linux-arm64-gnu": "23.1.2",
|
|
189
|
+
"@nx/nx-linux-arm64-musl": "23.1.2",
|
|
190
|
+
"@nx/nx-linux-x64-gnu": "23.1.2",
|
|
191
|
+
"@nx/nx-linux-x64-musl": "23.1.2",
|
|
192
|
+
"@nx/nx-win32-arm64-msvc": "23.1.2",
|
|
193
|
+
"@nx/nx-win32-x64-msvc": "23.1.2"
|
|
189
194
|
},
|
|
190
195
|
"nx-migrations": {
|
|
191
196
|
"migrations": "./migrations.json",
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = nxReleasePath;
|
|
4
|
-
exports.visitNotIgnoredFiles = visitNotIgnoredFiles;
|
|
5
|
-
const node_path_1 = require("node:path");
|
|
6
|
-
const ignore_1 = require("../../utils/ignore");
|
|
7
|
-
function nxReleasePath(tree) {
|
|
8
|
-
visitNotIgnoredFiles(tree, '', (file) => {
|
|
9
|
-
const contents = tree.read(file).toString('utf-8');
|
|
10
|
-
if (
|
|
11
|
-
// the deep import usage should be replaced by the new location
|
|
12
|
-
contents.includes('nx/src/command-line/release') ||
|
|
13
|
-
// changelog-renderer has moved into nx/release
|
|
14
|
-
contents.includes('nx/changelog-renderer')) {
|
|
15
|
-
const finalContents = contents
|
|
16
|
-
// replace instances of old changelog renderer location
|
|
17
|
-
.replace(/nx\/changelog-renderer/g, 'nx/release/changelog-renderer')
|
|
18
|
-
// replace instances of deep import for programmatic API (only perform the replacement if an actual import by checking for trailing ' or ")
|
|
19
|
-
.replace(/nx\/src\/command-line\/release(['"])/g, 'nx/release$1');
|
|
20
|
-
tree.write(file, finalContents);
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
// Adapted from devkit
|
|
25
|
-
function visitNotIgnoredFiles(tree, dirPath = tree.root, visitor) {
|
|
26
|
-
const ig = (0, ignore_1.getIgnoreObject)();
|
|
27
|
-
dirPath = normalizePathRelativeToRoot(dirPath, tree.root);
|
|
28
|
-
if (dirPath !== '' && ig?.ignores(dirPath)) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
for (const child of tree.children(dirPath)) {
|
|
32
|
-
const fullPath = (0, node_path_1.join)(dirPath, child);
|
|
33
|
-
if (ig?.ignores(fullPath)) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
if (tree.isFile(fullPath)) {
|
|
37
|
-
visitor(fullPath);
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
visitNotIgnoredFiles(tree, fullPath, visitor);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// Copied from devkit
|
|
45
|
-
function normalizePathRelativeToRoot(path, root) {
|
|
46
|
-
return (0, node_path_1.relative)(root, (0, node_path_1.join)(root, path)).split(node_path_1.sep).join('/');
|
|
47
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface NpmrcEntry {
|
|
2
|
-
key: string;
|
|
3
|
-
value: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Parses an .npmrc file into its `key = value` entries the way npm/npm-conf do:
|
|
7
|
-
* skip blank lines and `#`/`;` comments, split on the first `=`, and trim both
|
|
8
|
-
* sides. The value is returned raw (quote stripping is the caller's concern).
|
|
9
|
-
* Returns null when the file is missing or unreadable so callers can distinguish
|
|
10
|
-
* "no file" from "file with no relevant keys". Shared by the npm and pnpm
|
|
11
|
-
* cooldown readers.
|
|
12
|
-
*/
|
|
13
|
-
export declare function readNpmrcEntries(path: string): NpmrcEntry[] | null;
|
|
14
|
-
/** The parsing half of {@link readNpmrcEntries}, usable without a filesystem. */
|
|
15
|
-
export declare function parseNpmrcContent(raw: string): NpmrcEntry[];
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.readNpmrcEntries = readNpmrcEntries;
|
|
4
|
-
exports.parseNpmrcContent = parseNpmrcContent;
|
|
5
|
-
const fs_1 = require("fs");
|
|
6
|
-
/**
|
|
7
|
-
* Parses an .npmrc file into its `key = value` entries the way npm/npm-conf do:
|
|
8
|
-
* skip blank lines and `#`/`;` comments, split on the first `=`, and trim both
|
|
9
|
-
* sides. The value is returned raw (quote stripping is the caller's concern).
|
|
10
|
-
* Returns null when the file is missing or unreadable so callers can distinguish
|
|
11
|
-
* "no file" from "file with no relevant keys". Shared by the npm and pnpm
|
|
12
|
-
* cooldown readers.
|
|
13
|
-
*/
|
|
14
|
-
function readNpmrcEntries(path) {
|
|
15
|
-
if (!(0, fs_1.existsSync)(path)) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
let raw;
|
|
19
|
-
try {
|
|
20
|
-
raw = (0, fs_1.readFileSync)(path, 'utf-8');
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
return parseNpmrcContent(raw);
|
|
26
|
-
}
|
|
27
|
-
/** The parsing half of {@link readNpmrcEntries}, usable without a filesystem. */
|
|
28
|
-
function parseNpmrcContent(raw) {
|
|
29
|
-
const entries = [];
|
|
30
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
31
|
-
const trimmed = line.trim();
|
|
32
|
-
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
const eq = trimmed.indexOf('=');
|
|
36
|
-
if (eq === -1) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
entries.push({
|
|
40
|
-
key: trimmed.slice(0, eq).trim(),
|
|
41
|
-
value: trimmed.slice(eq + 1).trim(),
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return entries;
|
|
45
|
-
}
|