@metreeca/rack 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,24 +1,6 @@
1
- /**
2
- * Unix-like command line tools for npm package scripts.
3
- *
4
- * Each tool is installed as a command alongside the package and behaves the same on every platform and shell. Inside
5
- * npm scripts, these commands take precedence over system commands with the same name, such as the Unix `cp`.
6
- *
7
- * Every tool lists the paths it acts on to stdout, one per line, so that a script log shows what changed on disk. It
8
- * prints its usage with `--help`, and exits with a non-zero status after printing an error message to stderr.
9
- *
10
- * | Command | Purpose |
11
- * |---------------------------------------|--------------------------------------------------------------------------|
12
- * | {@link cp `cp <target> <pattern>...`} | Copies files matching glob patterns to a directory, keeping their layout |
13
- * | {@link rm `rm <pattern>...`} | Removes files and directories matching glob patterns, with their content |
14
- * | {@link ln `ln [<deps>]...`} | Links dependencies to their local checkouts instead of registry releases |
15
- *
16
- * Build scripts can call the same tools as functions, passing the command operands as arguments: a function throws on
17
- * failure instead of printing an error message to stderr and setting a non-zero exit status for the process.
18
- *
19
- * @module
20
- */
21
- export { cp } from "./cp.js";
22
- export { ln } from "./ln.js";
23
- export { rm } from "./rm.js";
1
+ #!/usr/bin/env node
2
+ import { cp } from "./cp.js";
3
+ import { ln } from "./ln.js";
4
+ import { rm } from "./rm.js";
5
+ export { cp, ln, rm };
24
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool/index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool/index.ts"],"names":[],"mappings":";AAoCA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,CAAC"}
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  /*
2
3
  * Copyright © 2026 Metreeca srl
3
4
  *
@@ -16,24 +17,57 @@
16
17
  /**
17
18
  * Unix-like command line tools for npm package scripts.
18
19
  *
19
- * Each tool is installed as a command alongside the package and behaves the same on every platform and shell. Inside
20
- * npm scripts, these commands take precedence over system commands with the same name, such as the Unix `cp`.
20
+ * Each tool runs as a subcommand of the `ush` command installed with the package, as in `ush <tool> <operand>...`.
21
+ * Tools behave the same on every platform and shell, and leave system commands with the same name untouched.
22
+ * `ush --help` lists the available tools, and `ush <tool> --help` prints the usage of a single tool.
21
23
  *
22
- * Every tool lists the paths it acts on to stdout, one per line, so that a script log shows what changed on disk. It
23
- * prints its usage with `--help`, and exits with a non-zero status after printing an error message to stderr.
24
- *
25
- * | Command | Purpose |
26
- * |---------------------------------------|--------------------------------------------------------------------------|
27
- * | {@link cp `cp <target> <pattern>...`} | Copies files matching glob patterns to a directory, keeping their layout |
28
- * | {@link rm `rm <pattern>...`} | Removes files and directories matching glob patterns, with their content |
29
- * | {@link ln `ln [<deps>]...`} | Links dependencies to their local checkouts instead of registry releases |
24
+ * Tools list the paths they act on to stdout, one per line prefixed with the tool name, so that a script log shows
25
+ * what changed on disk and which command changed it. A failing tool exits with a non-zero status after printing an
26
+ * error message to stderr, prefixed with its full command so that the log points to the command that failed.
30
27
  *
31
28
  * Build scripts can call the same tools as functions, passing the command operands as arguments: a function throws on
32
29
  * failure instead of printing an error message to stderr and setting a non-zero exit status for the process.
33
30
  *
34
31
  * @module
35
32
  */
36
- export { cp } from "./cp.js";
37
- export { ln } from "./ln.js";
38
- export { rm } from "./rm.js";
33
+ import { parse } from "node:path";
34
+ import { cp } from "./cp.js";
35
+ import { cli } from "./index.core.js";
36
+ import { ln } from "./ln.js";
37
+ import { rm } from "./rm.js";
38
+ export { cp, ln, rm };
39
+ const commands = [
40
+ cp,
41
+ ln,
42
+ rm
43
+ ];
44
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45
+ if (import.meta.main) {
46
+ process.exitCode = ush();
47
+ }
48
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
49
+ /**
50
+ * Runs the tool named on a command line, as in `ush rm dist`, with GNU-style help and error messages.
51
+ *
52
+ * `ush --help` lists every tool with its operands, and `ush <tool> --help` prints the usage of a single tool. Messages
53
+ * are prefixed with the command as invoked, as in `ush cp: missing target operand`, and messages about a malformed
54
+ * command line also point to the help of the command that received it, either `ush --help` or `ush <tool> --help`.
55
+ *
56
+ * @param args The script path, followed by the tool name and its operands; defaults to the process command line
57
+ *
58
+ * @returns The process exit status: `0` on success, `1` on failure
59
+ */
60
+ function ush([path, name, ...operands] = process.argv.slice(1)) {
61
+ const program = parse(path).name;
62
+ const command = commands.find(tool => tool.name === name);
63
+ return command
64
+ ? cli(command, command.usage, `${program} ${name}`, operands)
65
+ : cli(reject, "<command> [<operand>]...", program, name === undefined ? [] : [name, ...operands], listing());
66
+ function listing() {
67
+ return ["Commands:", ...commands.map(tool => ` ${tool.name} ${tool.usage}`)].join("\n");
68
+ }
69
+ function reject(operand) {
70
+ throw new TypeError(operand === undefined ? "missing command operand" : `unknown command <${operand}>`);
71
+ }
72
+ }
39
73
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,CAAC;AAGF,MAAM,QAAQ,GAAG;IAChB,EAAE;IACF,EAAE;IACF,EAAE;CACF,CAAC;AAGF,wHAAwH;AAExH,IAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAG,CAAC;IACxB,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;AAC1B,CAAC;AAGD,wHAAwH;AAExH;;;;;;;;;;GAUG;AACH,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,IAAuB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAE1D,OAAO,OAAO;QACb,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAG9G,SAAS,OAAO;QACf,OAAO,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,SAAS,MAAM,CAAC,OAAgB;QAC/B,MAAM,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;IACzG,CAAC;AAEF,CAAC"}
package/dist/tool/ln.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- #!/usr/bin/env node
2
1
  /**
3
2
  * Links the local checkouts of the dependencies of the package in the current folder into its `node_modules`.
4
3
  *
4
+ * Runs on the command line as `ush ln [<deps>]...`.
5
+ *
5
6
  * The current package, and in a monorepo each of its workspace members, then builds and runs against the working
6
7
  * trees of its dependencies instead of their registry releases. Dependencies are matched to checkouts by package name.
7
8
  *
@@ -11,32 +12,37 @@
11
12
  * `optionalDependencies` of the current package or its members. Each linked package then brings in the checkouts
12
13
  * named in its own `dependencies`, `peerDependencies` or `optionalDependencies`. A package shared along the chain
13
14
  * is thus loaded once from its working tree, never also as a registry copy with distinct classes and symbols
14
- * - **Copies**: installed copies of a linked package are replaced with links at any depth, both in the current
15
- * package and in linked checkouts, since a linked package resolves its own imports from its checkout
15
+ * - **Copies**: installed copies of a linked package nested at any depth in the current package, and in a monorepo
16
+ * in its workspace members, are replaced with links, so that no registry copy is loaded next to the working tree
16
17
  * - **Commands**: the `bin` commands of each linked package are linked into the `.bin` folder next to it and made
17
18
  * executable, so that npm scripts run the working tree version of a command rather than its registry release
18
19
  * - **Precedence**: where a name is found in more than one folder, the folder listed first wins
19
20
  * - **Versions**: version ranges are ignored, as a working tree may carry a version that is not released yet
20
21
  *
21
- * Links replace whatever the current package has installed under the same name. Inside a linked checkout, they only
22
- * replace installed copies and never add new packages. Missing folders are skipped, so the same command runs
23
- * unchanged on every machine, including machines where some of the named folders hold no local checkouts at all.
22
+ * Links replace whatever the current package has installed under the same name, and nothing outside the current
23
+ * package is touched: a linked checkout keeps resolving its own dependencies and peers from its own `node_modules`,
24
+ * as settled by its own setup, so that an install in one checkout never changes what another project loads, and a
25
+ * checkout shared by several projects serves all of them alike. Projects load a single copy of the packages a linked
26
+ * checkout shares with them through the `symlinks` hooks of `@metreeca/rack/node` when running under Node, and
27
+ * through the `symlinks` plugin of `@metreeca/rack/vite` when running under Vite or Vitest.
28
+ * Missing folders are skipped, so the same command runs unchanged on every machine, including machines where some of
29
+ * the named folders hold no local checkouts at all and the package runs against its registry dependencies.
24
30
  *
25
- * Each package link is printed on stdout, relative to the current package, such as `node_modules/@scope/name`; links
26
- * to `bin` commands are created silently, since they follow from the package links already listed.
31
+ * Each package link is printed on stdout relative to the current package, as in `ln node_modules/@scope/name`;
32
+ * links to `bin` commands are created silently, since they follow from the package links already listed above.
27
33
  *
28
34
  * @example
29
35
  *
30
36
  * Linking the sibling checkouts of a package after a clean install, from an npm script:
31
37
  *
32
38
  * ```shell
33
- * npm ci && ln
39
+ * npm ci && ush ln
34
40
  * ```
35
41
  *
36
42
  * Linking from a folder of local dependencies elsewhere:
37
43
  *
38
44
  * ```shell
39
- * npm ci && ln ~/Metreeca/Packages
45
+ * npm ci && ush ln ~/Metreeca/Packages
40
46
  * ```
41
47
  *
42
48
  * @param deps The folders searched for local dependencies, in order of precedence; defaults to the parent folder (`..`)
@@ -44,4 +50,7 @@
44
50
  * @throws Error If the current folder holds no `package.json`
45
51
  */
46
52
  export declare function ln(...deps: readonly string[]): void;
53
+ export declare namespace ln {
54
+ var usage: string;
55
+ }
47
56
  //# sourceMappingURL=ln.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ln.d.ts","sourceRoot":"","sources":["../../src/tool/ln.ts"],"names":[],"mappings":";AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CA+LnD"}
1
+ {"version":3,"file":"ln.d.ts","sourceRoot":"","sources":["../../src/tool/ln.ts"],"names":[],"mappings":"AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CA0JnD;yBA1Je,EAAE"}
package/dist/tool/ln.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  /*
3
2
  * Copyright © 2026 Metreeca srl
4
3
  *
@@ -14,16 +13,19 @@
14
13
  * See the License for the specific language governing permissions and
15
14
  * limitations under the License.
16
15
  */
17
- import { chmodSync, existsSync, globSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, symlinkSync } from "node:fs";
18
- import { dirname, join, parse, relative, resolve, sep } from "node:path";
19
- import { cli } from "./index.core.js";
20
- if (import.meta.main) {
21
- process.exitCode = cli(ln, "[<deps>]...");
22
- }
16
+ import { chmodSync, existsSync, globSync, lstatSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync, symlinkSync } from "node:fs";
17
+ import { dirname, join, relative, resolve } from "node:path";
18
+ import { manifest } from "../symlinks.js";
19
+ /**
20
+ * The command line synopsis of {@link ln}, printed by `ush ln --help`.
21
+ */
22
+ ln.usage = "[<deps>]...";
23
23
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
24
24
  /**
25
25
  * Links the local checkouts of the dependencies of the package in the current folder into its `node_modules`.
26
26
  *
27
+ * Runs on the command line as `ush ln [<deps>]...`.
28
+ *
27
29
  * The current package, and in a monorepo each of its workspace members, then builds and runs against the working
28
30
  * trees of its dependencies instead of their registry releases. Dependencies are matched to checkouts by package name.
29
31
  *
@@ -33,32 +35,37 @@ if (import.meta.main) {
33
35
  * `optionalDependencies` of the current package or its members. Each linked package then brings in the checkouts
34
36
  * named in its own `dependencies`, `peerDependencies` or `optionalDependencies`. A package shared along the chain
35
37
  * is thus loaded once from its working tree, never also as a registry copy with distinct classes and symbols
36
- * - **Copies**: installed copies of a linked package are replaced with links at any depth, both in the current
37
- * package and in linked checkouts, since a linked package resolves its own imports from its checkout
38
+ * - **Copies**: installed copies of a linked package nested at any depth in the current package, and in a monorepo
39
+ * in its workspace members, are replaced with links, so that no registry copy is loaded next to the working tree
38
40
  * - **Commands**: the `bin` commands of each linked package are linked into the `.bin` folder next to it and made
39
41
  * executable, so that npm scripts run the working tree version of a command rather than its registry release
40
42
  * - **Precedence**: where a name is found in more than one folder, the folder listed first wins
41
43
  * - **Versions**: version ranges are ignored, as a working tree may carry a version that is not released yet
42
44
  *
43
- * Links replace whatever the current package has installed under the same name. Inside a linked checkout, they only
44
- * replace installed copies and never add new packages. Missing folders are skipped, so the same command runs
45
- * unchanged on every machine, including machines where some of the named folders hold no local checkouts at all.
45
+ * Links replace whatever the current package has installed under the same name, and nothing outside the current
46
+ * package is touched: a linked checkout keeps resolving its own dependencies and peers from its own `node_modules`,
47
+ * as settled by its own setup, so that an install in one checkout never changes what another project loads, and a
48
+ * checkout shared by several projects serves all of them alike. Projects load a single copy of the packages a linked
49
+ * checkout shares with them through the `symlinks` hooks of `@metreeca/rack/node` when running under Node, and
50
+ * through the `symlinks` plugin of `@metreeca/rack/vite` when running under Vite or Vitest.
51
+ * Missing folders are skipped, so the same command runs unchanged on every machine, including machines where some of
52
+ * the named folders hold no local checkouts at all and the package runs against its registry dependencies.
46
53
  *
47
- * Each package link is printed on stdout, relative to the current package, such as `node_modules/@scope/name`; links
48
- * to `bin` commands are created silently, since they follow from the package links already listed.
54
+ * Each package link is printed on stdout relative to the current package, as in `ln node_modules/@scope/name`;
55
+ * links to `bin` commands are created silently, since they follow from the package links already listed above.
49
56
  *
50
57
  * @example
51
58
  *
52
59
  * Linking the sibling checkouts of a package after a clean install, from an npm script:
53
60
  *
54
61
  * ```shell
55
- * npm ci && ln
62
+ * npm ci && ush ln
56
63
  * ```
57
64
  *
58
65
  * Linking from a folder of local dependencies elsewhere:
59
66
  *
60
67
  * ```shell
61
- * npm ci && ln ~/Metreeca/Packages
68
+ * npm ci && ush ln ~/Metreeca/Packages
62
69
  * ```
63
70
  *
64
71
  * @param deps The folders searched for local dependencies, in order of precedence; defaults to the parent folder (`..`)
@@ -84,16 +91,14 @@ export function ln(...deps) {
84
91
  .reverse() // later entries override earlier ones, so that the folder listed first wins
85
92
  );
86
93
  const linked = closure(own.flatMap(path => dependencies(path, true)));
87
- const roots = new Set([home, ...[...linked.values()].map(path => checkout(path))]);
88
94
  linked.forEach((path, name) => link({ modules: join(home, "node_modules"), name, path }));
89
- [...roots]
90
- .flatMap(packages)
95
+ own
91
96
  .flatMap(path => copies(join(path, "node_modules")))
92
97
  .forEach(link);
93
98
  function link({ modules, name, path }) {
94
99
  const target = join(modules, name);
95
100
  replace(target, path);
96
- console.log(relative(home, target));
101
+ console.log(`ln ${relative(home, target)}`);
97
102
  commands(path, name).forEach(([command, script]) => {
98
103
  replace(join(modules, ".bin", command), join(target, script));
99
104
  if (existsSync(join(path, script))) {
@@ -129,7 +134,7 @@ export function ln(...deps) {
129
134
  }];
130
135
  }
131
136
  else if (lstatSync(copy).isSymbolicLink()) {
132
- return []; // a link into another checkout, inspected as a root of its own when linked
137
+ return []; // a link into a checkout, whose own setup settles its copies
133
138
  }
134
139
  else {
135
140
  return copies(join(copy, "node_modules"));
@@ -143,16 +148,6 @@ export function ln(...deps) {
143
148
  .filter(member => existsSync(join(member, "package.json")))
144
149
  ] : [];
145
150
  }
146
- function checkout(path) {
147
- const parent = ancestors(path).find(ancestor => existsSync(join(ancestor, "package.json")));
148
- return parent !== undefined && packages(parent).includes(path) ? parent : path;
149
- }
150
- function ancestors(path) {
151
- const { root } = parse(path);
152
- return relative(root, dirname(path)).split(sep).filter(Boolean)
153
- .map((_, index, segments) => join(root, ...segments.slice(0, index + 1)))
154
- .reverse();
155
- }
156
151
  function children(path) {
157
152
  return folder(path) ? readdirSync(path) : [];
158
153
  }
@@ -177,8 +172,5 @@ export function ln(...deps) {
177
172
  ...optionalDependencies
178
173
  });
179
174
  }
180
- function manifest(path) {
181
- return JSON.parse(readFileSync(join(path, "package.json"), "utf8")); // trusted local file, not validated
182
- }
183
175
  }
184
176
  //# sourceMappingURL=ln.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ln.js","sourceRoot":"","sources":["../../src/tool/ln.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ln.js","sourceRoot":"","sources":["../../src/tool/ln.ts"],"names":[],"mappings":"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"}
package/dist/tool/rm.d.ts CHANGED
@@ -1,18 +1,19 @@
1
- #!/usr/bin/env node
2
1
  /**
3
2
  * Removes the files and directories matching a set of glob patterns, with their whole content.
4
3
  *
4
+ * Runs on the command line as `ush rm <pattern>...`.
5
+ *
5
6
  * Patterns matching nothing are ignored, so that the same command can run again on an already clean tree.
6
7
  *
7
- * Each removed file or directory is printed on stdout once, relative to the current folder. Matches inside a removed
8
- * directory are not listed, even where a pattern selects them explicitly, as they go along with their ancestor.
8
+ * Each removed file or directory is printed on stdout once as `rm <path>`, relative to the current folder. Matches
9
+ * inside a removed directory go along with it and are not listed, even where a pattern selects them explicitly.
9
10
  *
10
11
  * @example
11
12
  *
12
13
  * Removing build outputs, from an npm script:
13
14
  *
14
15
  * ```shell
15
- * rm dist docs 'src/**\/*.tsbuildinfo'
16
+ * ush rm dist docs 'src/**\/*.tsbuildinfo'
16
17
  * ```
17
18
  *
18
19
  * Patterns are quoted so that they reach the tool unexpanded, as shells differ in their glob support.
@@ -22,4 +23,7 @@
22
23
  * @throws TypeError If no pattern is provided
23
24
  */
24
25
  export declare function rm(...patterns: readonly string[]): void;
26
+ export declare namespace rm {
27
+ var usage: string;
28
+ }
25
29
  //# sourceMappingURL=rm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rm.d.ts","sourceRoot":"","sources":["../../src/tool/rm.ts"],"names":[],"mappings":";AA8BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,EAAE,CAAC,GAAG,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAcvD"}
1
+ {"version":3,"file":"rm.d.ts","sourceRoot":"","sources":["../../src/tool/rm.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,EAAE,CAAC,GAAG,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAcvD;yBAde,EAAE"}
package/dist/tool/rm.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  /*
3
2
  * Copyright © 2026 Metreeca srl
4
3
  *
@@ -16,25 +15,27 @@
16
15
  */
17
16
  import { globSync, rmSync } from "node:fs";
18
17
  import { relative, resolve, sep } from "node:path";
19
- import { cli } from "./index.core.js";
20
- if (import.meta.main) {
21
- process.exitCode = cli(rm, "<pattern>...");
22
- }
18
+ /**
19
+ * The command line synopsis of {@link rm}, printed by `ush rm --help`.
20
+ */
21
+ rm.usage = "<pattern>...";
23
22
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
24
23
  /**
25
24
  * Removes the files and directories matching a set of glob patterns, with their whole content.
26
25
  *
26
+ * Runs on the command line as `ush rm <pattern>...`.
27
+ *
27
28
  * Patterns matching nothing are ignored, so that the same command can run again on an already clean tree.
28
29
  *
29
- * Each removed file or directory is printed on stdout once, relative to the current folder. Matches inside a removed
30
- * directory are not listed, even where a pattern selects them explicitly, as they go along with their ancestor.
30
+ * Each removed file or directory is printed on stdout once as `rm <path>`, relative to the current folder. Matches
31
+ * inside a removed directory go along with it and are not listed, even where a pattern selects them explicitly.
31
32
  *
32
33
  * @example
33
34
  *
34
35
  * Removing build outputs, from an npm script:
35
36
  *
36
37
  * ```shell
37
- * rm dist docs 'src/**\/*.tsbuildinfo'
38
+ * ush rm dist docs 'src/**\/*.tsbuildinfo'
38
39
  * ```
39
40
  *
40
41
  * Patterns are quoted so that they reach the tool unexpanded, as shells differ in their glob support.
@@ -51,7 +52,7 @@ export function rm(...patterns) {
51
52
  const paths = matches.filter(path => !matches.some(match => path.startsWith(match + sep))); // gone with ancestors
52
53
  paths.forEach(path => {
53
54
  rmSync(path, { recursive: true, force: true });
54
- console.log(relative(".", path));
55
+ console.log(`rm ${relative(".", path)}`);
55
56
  });
56
57
  }
57
58
  //# sourceMappingURL=rm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/tool/rm.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAGtC,IAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAG,CAAC;IACxB,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC;AAGD,wHAAwH;AAExH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,EAAE,CAAC,GAAG,QAA2B;IAEhD,IAAK,CAAC,QAAQ,CAAC,MAAM,EAAG,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;IAElH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACpB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AAEJ,CAAC"}
1
+ {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/tool/rm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGnD;;GAEG;AACH,EAAE,CAAC,KAAK,GAAG,cAAc,CAAC;AAG1B,wHAAwH;AAExH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,EAAE,CAAC,GAAG,QAA2B;IAEhD,IAAK,CAAC,QAAQ,CAAC,MAAM,EAAG,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;IAElH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACpB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AAEJ,CAAC"}
@@ -7,11 +7,14 @@ import type { Plugin } from "vite";
7
7
  *
8
8
  * Packages are looked up as Node does, from the `node_modules` nearest to the importer up through its ancestors, so
9
9
  * links hoisted to a workspace root are found from any member; imports with no importer start from the Vite root.
10
+ * A package the importer resolves to an installed copy is looked up again from the Vite root, so a linked checkout
11
+ * importing a package the project links as well loads the linked source rather than its own registry copy.
10
12
  *
11
- * The `peerDependencies` of linked packages are shared with the project: they resolve from the Vite root whoever the
12
- * importer is, also from registry packages installed in a checkout, so that the project and its linked packages load a
13
- * single copy of them, as libraries holding module state such as Preact hooks require. Only peers of packages already
14
- * resolved through the plugin are shared; all other imports keep resolving from the checkout they are found in.
13
+ * The project and its linked packages load a single copy of every linked package and of each of their
14
+ * `peerDependencies`, as libraries holding module state such as Preact hooks require: the links found in the
15
+ * `node_modules` of the Vite root, of its ancestors and of its workspace members extend `resolve.dedupe`, so that
16
+ * those packages always resolve from the project, dependencies prebundled by the optimizer included, whatever copies
17
+ * a linked checkout installs. Other dependencies of a linked package resolve from its checkout, as Node does.
15
18
  *
16
19
  * The plugin replaces `resolve.conditions`, which breaks registry packages whose exports name a condition without
17
20
  * publishing its target: Vite does not fall back to `default` when that target is missing from the installed files.
@@ -41,7 +44,8 @@ import type { Plugin } from "vite";
41
44
  *
42
45
  * @param options The resolution settings
43
46
  *
44
- * @returns A plugin resolving linked imports to source and leaving all others to the default resolution
47
+ * @returns A plugin resolving linked imports to source, deduplicating linked packages and their peers, and leaving all
48
+ * other imports to the default resolution
45
49
  */
46
50
  export declare function symlinks({ conditions }: {
47
51
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"symlinks.d.ts","sourceRoot":"","sources":["../../src/vite/symlinks.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,QAAQ,CAAC,EAExB,UAAU,EAEV,EAAE;IAEF;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;CAEtC,GAAG,MAAM,CAiFT"}
1
+ {"version":3,"file":"symlinks.d.ts","sourceRoot":"","sources":["../../src/vite/symlinks.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,QAAQ,CAAC,EAExB,UAAU,EAEV,EAAE;IAEF;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;CAEtC,GAAG,MAAM,CA6CT"}
@@ -13,10 +13,10 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { lstatSync, readFileSync, realpathSync } from "node:fs";
17
- import { createRequire } from "node:module";
18
- import { dirname, isAbsolute, join, resolve, sep } from "node:path";
16
+ import { realpathSync } from "node:fs";
17
+ import { dirname, isAbsolute, resolve } from "node:path";
19
18
  import { exports } from "resolve.exports";
19
+ import { bare, lookup, manifest, shared } from "../symlinks.js";
20
20
  /**
21
21
  * Creates a plugin running tests against the live source of locally linked packages, with no rebuild.
22
22
  *
@@ -25,11 +25,14 @@ import { exports } from "resolve.exports";
25
25
  *
26
26
  * Packages are looked up as Node does, from the `node_modules` nearest to the importer up through its ancestors, so
27
27
  * links hoisted to a workspace root are found from any member; imports with no importer start from the Vite root.
28
+ * A package the importer resolves to an installed copy is looked up again from the Vite root, so a linked checkout
29
+ * importing a package the project links as well loads the linked source rather than its own registry copy.
28
30
  *
29
- * The `peerDependencies` of linked packages are shared with the project: they resolve from the Vite root whoever the
30
- * importer is, also from registry packages installed in a checkout, so that the project and its linked packages load a
31
- * single copy of them, as libraries holding module state such as Preact hooks require. Only peers of packages already
32
- * resolved through the plugin are shared; all other imports keep resolving from the checkout they are found in.
31
+ * The project and its linked packages load a single copy of every linked package and of each of their
32
+ * `peerDependencies`, as libraries holding module state such as Preact hooks require: the links found in the
33
+ * `node_modules` of the Vite root, of its ancestors and of its workspace members extend `resolve.dedupe`, so that
34
+ * those packages always resolve from the project, dependencies prebundled by the optimizer included, whatever copies
35
+ * a linked checkout installs. Other dependencies of a linked package resolve from its checkout, as Node does.
33
36
  *
34
37
  * The plugin replaces `resolve.conditions`, which breaks registry packages whose exports name a condition without
35
38
  * publishing its target: Vite does not fall back to `default` when that target is missing from the installed files.
@@ -59,20 +62,22 @@ import { exports } from "resolve.exports";
59
62
  *
60
63
  * @param options The resolution settings
61
64
  *
62
- * @returns A plugin resolving linked imports to source and leaving all others to the default resolution
65
+ * @returns A plugin resolving linked imports to source, deduplicating linked packages and their peers, and leaving all
66
+ * other imports to the default resolution
63
67
  */
64
68
  export function symlinks({ conditions }) {
65
69
  const $conditions = typeof conditions === "string" ? [conditions] : conditions;
66
- const manifests = new Map(); // memoised by link real path, also tracking the peers to share
67
70
  return {
68
71
  name: "symlinks",
69
72
  enforce: "pre",
70
- resolveId(id, importer, options) {
73
+ config({ root }) {
74
+ return { resolve: { dedupe: [...shared(resolve(root ?? ""))] } };
75
+ },
76
+ resolveId(id, importer) {
71
77
  const root = this.environment.config.root;
72
- const name = id.match(/^(@[^/]+\/)?[^/]+/)?.[0];
73
- const peer = name !== undefined && [...manifests.values()].some(({ peerDependencies }) => peerDependencies !== undefined && Object.hasOwn(peerDependencies, name));
74
- const base = !peer && importer && isAbsolute(importer) ? dirname(importer) : root;
75
- const link = name && lookup(name, base);
78
+ const name = bare(id);
79
+ const base = importer && isAbsolute(importer) ? dirname(importer) : root;
80
+ const link = name && (lookup(name, base) ?? lookup(name, root));
76
81
  if (link) {
77
82
  try {
78
83
  const path = realpathSync(link);
@@ -83,30 +88,10 @@ export function symlinks({ conditions }) {
83
88
  return null;
84
89
  }
85
90
  }
86
- else if (peer) { // falls back to the default resolution if missing from the project
87
- return this.resolve(id, join(root, "package.json"), { ...options, skipSelf: true });
88
- }
89
91
  else {
90
92
  return null;
91
93
  }
92
94
  }
93
95
  };
94
- function lookup(name, directory) {
95
- const path = (createRequire(join(directory, sep)).resolve.paths(name) ?? [])
96
- .map(modules => join(modules, name))
97
- .find(candidate => lstatSync(candidate, { throwIfNoEntry: false }));
98
- return path !== undefined && lstatSync(path).isSymbolicLink() ? path : undefined;
99
- }
100
- function manifest(path) {
101
- const cached = manifests.get(path);
102
- if (cached === undefined) {
103
- const loaded = JSON.parse(readFileSync(join(path, "package.json"), "utf8"));
104
- manifests.set(path, loaded);
105
- return loaded;
106
- }
107
- else {
108
- return cached;
109
- }
110
- }
111
96
  }
112
97
  //# sourceMappingURL=symlinks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symlinks.js","sourceRoot":"","sources":["../../src/vite/symlinks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"symlinks.js","sourceRoot":"","sources":["../../src/vite/symlinks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,UAAU,QAAQ,CAAC,EAExB,UAAU,EAUV;IAEA,MAAM,WAAW,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAE/E,OAAO;QAEN,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QAEd,MAAM,CAAC,EAAE,IAAI,EAAE;YACd,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,SAAS,CAAC,EAAE,EAAE,QAAQ;YAErB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAEhE,IAAK,IAAI,EAAG,CAAC;gBAEZ,IAAI,CAAC;oBAEJ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;oBAChC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAE7E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAE5D,CAAC;gBAAC,MAAM,CAAC,CAAC,oDAAoD;oBAE7D,OAAO,IAAI,CAAC;gBAEb,CAAC;YAEF,CAAC;iBAAM,CAAC;gBAEP,OAAO,IAAI,CAAC;YAEb,CAAC;QAEF,CAAC;KAED,CAAC;AAEH,CAAC"}