nx-npm-tools 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/commands/gitSync.js +26 -0
- package/dist/commands/gitSync.js.map +1 -0
- package/dist/commands/publishOne.js +40 -0
- package/dist/commands/publishOne.js.map +1 -0
- package/dist/commands/publishStation.js +86 -0
- package/dist/commands/publishStation.js.map +1 -0
- package/dist/commands/reportStation.js +70 -0
- package/dist/commands/reportStation.js.map +1 -0
- package/dist/commands/runOnce.js +72 -0
- package/dist/commands/runOnce.js.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/station/discover.js +128 -0
- package/dist/station/discover.js.map +1 -0
- package/dist/station/graph.js +67 -0
- package/dist/station/graph.js.map +1 -0
- package/dist/station/types.js +2 -0
- package/dist/station/types.js.map +1 -0
- package/dist/utils/exec.js +9 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/fs.js +40 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/git.js +132 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/path.js +11 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/prometheus.js +14 -0
- package/dist/utils/prometheus.js.map +1 -0
- package/package.json +26 -0
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# nx-npm-tools
|
|
2
|
+
|
|
3
|
+
Install globally:
|
|
4
|
+
```bash
|
|
5
|
+
npm i -g nx-npm-tools
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
## Prometheus mode (default)
|
|
9
|
+
|
|
10
|
+
If you run commands without `--path`, it auto-walks upward until it finds a folder named `prometheus` and uses it as the station root.
|
|
11
|
+
|
|
12
|
+
Alias:
|
|
13
|
+
|
|
14
|
+
* `--pro` is the same as `--prometheus`
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
### runOnce (per-station setup)
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
nx-npm-tools runOnce --pro --add-ncu --commit
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### reportStation (visibility report)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
nx-npm-tools reportStation --pro --out station-report.md
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### publishStation (publish everything in dependency order)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
nx-npm-tools publishStation --pro --access public --bump patch
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Force clean install per package:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
nx-npm-tools publishStation --pro --forceInstall --access public --bump patch
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Publish one repo/package:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
nx-npm-tools publishOne --cwd . --access public --bump patch
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Git sync:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
nx-npm-tools gitSync --message "publishing"
|
|
52
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { gitAddCommitPush } from "../utils/git.js";
|
|
4
|
+
export function gitSyncCommand() {
|
|
5
|
+
return new Command("gitSync")
|
|
6
|
+
.description("git add . + git commit + git push (optional upstream forcing)")
|
|
7
|
+
.option("--cwd <path>", "Repo folder (default: current dir)", process.cwd())
|
|
8
|
+
.option("--message <msg>", "Commit message", "publishing")
|
|
9
|
+
.option("--no-push", "Don't push")
|
|
10
|
+
.option("--remote <name>", "Remote name", "origin")
|
|
11
|
+
.option("--branch <name>", "Branch name (optional)")
|
|
12
|
+
.option("--set-upstream", "Push with --set-upstream (needs --branch)")
|
|
13
|
+
.option("--force-upstream", "Push with --force-with-lease")
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
const cwd = path.resolve(opts.cwd);
|
|
16
|
+
await gitAddCommitPush(cwd, {
|
|
17
|
+
message: opts.message,
|
|
18
|
+
push: Boolean(opts.push),
|
|
19
|
+
remote: opts.remote,
|
|
20
|
+
branch: opts.branch,
|
|
21
|
+
setUpstream: Boolean(opts.setUpstream),
|
|
22
|
+
forceWithLease: Boolean(opts.forceUpstream)
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=gitSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitSync.js","sourceRoot":"","sources":["../../src/commands/gitSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,CAAC;SACzD,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,gBAAgB,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { publishPackageFlow } from "../utils/git.js";
|
|
4
|
+
export function publishOneCommand() {
|
|
5
|
+
return new Command("publishOne")
|
|
6
|
+
.description("Publish ONE package repo: install -> gitSync -> build -> dist check -> bump -> publish")
|
|
7
|
+
.option("--cwd <path>", "Package folder (default: current dir)", process.cwd())
|
|
8
|
+
.option("--message <msg>", "Git commit message", "publishing")
|
|
9
|
+
.option("--forceInstall", "Force reinstall (rm node_modules + lock + cache clean)")
|
|
10
|
+
.option("--no-push", "Don't push")
|
|
11
|
+
.option("--remote <name>", "Remote name", "origin")
|
|
12
|
+
.option("--branch <name>", "Branch name (optional)")
|
|
13
|
+
.option("--set-upstream", "Push with --set-upstream (needs --branch)")
|
|
14
|
+
.option("--force-upstream", "Push with --force-with-lease")
|
|
15
|
+
.option("--build-script <name>", "Build script name", "build")
|
|
16
|
+
.option("--dist-check <path>", "File to verify after build", "dist/index.js")
|
|
17
|
+
.option("--bump <type>", "npm version bump (patch|minor|major|none)", "patch")
|
|
18
|
+
.option("--access <type>", "npm publish access (public|restricted)", "public")
|
|
19
|
+
.option("--tag <name>", "npm dist-tag (optional)", "")
|
|
20
|
+
.option("--dry-run", "Don't execute commands", false)
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
const cwd = path.resolve(opts.cwd);
|
|
23
|
+
await publishPackageFlow(cwd, {
|
|
24
|
+
message: opts.message,
|
|
25
|
+
forceInstall: Boolean(opts.forceInstall),
|
|
26
|
+
push: Boolean(opts.push),
|
|
27
|
+
remote: opts.remote,
|
|
28
|
+
branch: opts.branch,
|
|
29
|
+
setUpstream: Boolean(opts.setUpstream),
|
|
30
|
+
forceWithLease: Boolean(opts.forceUpstream),
|
|
31
|
+
buildScript: opts.buildScript,
|
|
32
|
+
distCheck: opts.distCheck,
|
|
33
|
+
bump: opts.bump,
|
|
34
|
+
access: opts.access,
|
|
35
|
+
tag: String(opts.tag || ""),
|
|
36
|
+
dryRun: Boolean(opts.dryRun)
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=publishOne.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishOne.js","sourceRoot":"","sources":["../../src/commands/publishOne.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;SAC7B,WAAW,CAAC,wFAAwF,CAAC;SACrG,MAAM,CAAC,cAAc,EAAE,uCAAuC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC9E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,YAAY,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,wDAAwD,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,OAAO,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,eAAe,CAAC;SAC5E,MAAM,CAAC,eAAe,EAAE,2CAA2C,EAAE,OAAO,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,EAAE,QAAQ,CAAC;SAC7E,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,EAAE,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,kBAAkB,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;YACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { resolveStationRoot } from "../utils/path.js";
|
|
3
|
+
import { discoverStationInventory } from "../station/discover.js";
|
|
4
|
+
import { buildStationGraph } from "../station/graph.js";
|
|
5
|
+
import { publishPackageFlow } from "../utils/git.js";
|
|
6
|
+
export function publishStationCommand() {
|
|
7
|
+
return new Command("publishStation")
|
|
8
|
+
.description("Publish ALL station packages in dependency order (prometheus mode default).")
|
|
9
|
+
.option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
|
|
10
|
+
.option("--prometheus", "Use prometheus mode")
|
|
11
|
+
.option("--pro", "Alias of --prometheus")
|
|
12
|
+
.option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
|
|
13
|
+
.option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
|
|
14
|
+
.option("--message <msg>", "Git commit message", "publishing")
|
|
15
|
+
.option("--forceInstall", "Force reinstall per package")
|
|
16
|
+
.option("--no-push", "Don't push")
|
|
17
|
+
.option("--remote <name>", "Remote name", "origin")
|
|
18
|
+
.option("--branch <name>", "Branch name (optional)")
|
|
19
|
+
.option("--set-upstream", "Push with --set-upstream (needs --branch)")
|
|
20
|
+
.option("--force-upstream", "Push with --force-with-lease")
|
|
21
|
+
.option("--build-script <name>", "Build script name", "build")
|
|
22
|
+
.option("--dist-check <path>", "File to verify after build", "dist/index.js")
|
|
23
|
+
.option("--bump <type>", "npm version bump (patch|minor|major|none)", "patch")
|
|
24
|
+
.option("--access <type>", "npm publish access (public|restricted)", "public")
|
|
25
|
+
.option("--tag <name>", "npm dist-tag (optional)", "")
|
|
26
|
+
.option("--include-private", "Include packages marked private=true (NOT recommended)", false)
|
|
27
|
+
.option("--only <names>", "Comma-separated package names to publish (still ordered)", "")
|
|
28
|
+
.option("--dry-run", "Don't execute commands", false)
|
|
29
|
+
.action(async (opts) => {
|
|
30
|
+
const stationRoot = resolveStationRoot({
|
|
31
|
+
path: opts.path,
|
|
32
|
+
prometheus: opts.prometheus,
|
|
33
|
+
pro: opts.pro,
|
|
34
|
+
prometheusName: opts.prometheusName,
|
|
35
|
+
maxUp: opts.maxUp
|
|
36
|
+
});
|
|
37
|
+
console.log(`Station root: ${stationRoot}`);
|
|
38
|
+
const inv = await discoverStationInventory(stationRoot);
|
|
39
|
+
const graph = buildStationGraph(inv);
|
|
40
|
+
if (graph.issues.length) {
|
|
41
|
+
console.log("Graph issues:");
|
|
42
|
+
for (const i of graph.issues) {
|
|
43
|
+
if (i.type === "cycle")
|
|
44
|
+
console.log(`- cycle detected among: ${i.cycle.join(", ")}`);
|
|
45
|
+
if (i.type === "missingLocalDep")
|
|
46
|
+
console.log(`- ${i.package} missing local dep: ${i.missing}`);
|
|
47
|
+
}
|
|
48
|
+
console.log("");
|
|
49
|
+
}
|
|
50
|
+
let names = graph.topo;
|
|
51
|
+
if (!opts.includePrivate) {
|
|
52
|
+
names = names.filter(n => !(graph.nodes.get(n)?.private));
|
|
53
|
+
}
|
|
54
|
+
if (opts.only) {
|
|
55
|
+
const set = new Set(String(opts.only).split(",").map(s => s.trim()).filter(Boolean));
|
|
56
|
+
names = names.filter(n => set.has(n));
|
|
57
|
+
}
|
|
58
|
+
const publishables = names
|
|
59
|
+
.map(n => graph.nodes.get(n))
|
|
60
|
+
.filter(p => p.publishable);
|
|
61
|
+
console.log(`Publish order (${publishables.length}):`);
|
|
62
|
+
for (const p of publishables)
|
|
63
|
+
console.log(`- ${p.name} @ ${p.version} (${p.cwd})`);
|
|
64
|
+
console.log("");
|
|
65
|
+
for (const p of publishables) {
|
|
66
|
+
console.log(`\n=== Publishing: ${p.name} (${p.cwd}) ===`);
|
|
67
|
+
await publishPackageFlow(p.cwd, {
|
|
68
|
+
message: opts.message,
|
|
69
|
+
forceInstall: Boolean(opts.forceInstall),
|
|
70
|
+
push: Boolean(opts.push),
|
|
71
|
+
remote: opts.remote,
|
|
72
|
+
branch: opts.branch,
|
|
73
|
+
setUpstream: Boolean(opts.setUpstream),
|
|
74
|
+
forceWithLease: Boolean(opts.forceUpstream),
|
|
75
|
+
buildScript: opts.buildScript,
|
|
76
|
+
distCheck: opts.distCheck,
|
|
77
|
+
bump: opts.bump,
|
|
78
|
+
access: opts.access,
|
|
79
|
+
tag: String(opts.tag || ""),
|
|
80
|
+
dryRun: Boolean(opts.dryRun)
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
console.log("\n✅ Station publish finished.");
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=publishStation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishStation.js","sourceRoot":"","sources":["../../src/commands/publishStation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveStationRoot } from "../utils/path.js";
|
|
4
|
+
import { discoverStationInventory } from "../station/discover.js";
|
|
5
|
+
import { buildStationGraph } from "../station/graph.js";
|
|
6
|
+
import { writeText } from "../utils/fs.js";
|
|
7
|
+
export function reportStationCommand() {
|
|
8
|
+
return new Command("reportStation")
|
|
9
|
+
.description("Generate a Markdown report of station packages, relationships, and publish order.")
|
|
10
|
+
.option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
|
|
11
|
+
.option("--prometheus", "Use prometheus mode")
|
|
12
|
+
.option("--pro", "Alias of --prometheus")
|
|
13
|
+
.option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
|
|
14
|
+
.option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
|
|
15
|
+
.option("--out <file>", "Write report to file (otherwise prints to stdout)", "")
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
const stationRoot = resolveStationRoot({
|
|
18
|
+
path: opts.path,
|
|
19
|
+
prometheus: opts.prometheus,
|
|
20
|
+
pro: opts.pro,
|
|
21
|
+
prometheusName: opts.prometheusName,
|
|
22
|
+
maxUp: opts.maxUp
|
|
23
|
+
});
|
|
24
|
+
const inv = await discoverStationInventory(stationRoot);
|
|
25
|
+
const graph = buildStationGraph(inv);
|
|
26
|
+
const lines = [];
|
|
27
|
+
lines.push(`# Station Report`);
|
|
28
|
+
lines.push(`- Station root: \`${stationRoot}\``);
|
|
29
|
+
lines.push(`- Packages discovered: **${inv.packages.length}**`);
|
|
30
|
+
lines.push("");
|
|
31
|
+
if (graph.issues.length) {
|
|
32
|
+
lines.push(`## Issues`);
|
|
33
|
+
for (const i of graph.issues) {
|
|
34
|
+
if (i.type === "cycle")
|
|
35
|
+
lines.push(`- ⚠️ Cycle detected among: ${i.cycle.join(", ")}`);
|
|
36
|
+
if (i.type === "missingLocalDep")
|
|
37
|
+
lines.push(`- ⚠️ ${i.package} missing local dep: ${i.missing}`);
|
|
38
|
+
}
|
|
39
|
+
lines.push("");
|
|
40
|
+
}
|
|
41
|
+
lines.push(`## Publish order (deps first)`);
|
|
42
|
+
for (const name of graph.topo) {
|
|
43
|
+
const p = graph.nodes.get(name);
|
|
44
|
+
lines.push(`- ${p.private ? "🔒" : "📦"} \`${p.name}\` @ \`${p.version}\`${p.publishable ? "" : " (not publishable?)"} — \`${p.cwd}\``);
|
|
45
|
+
}
|
|
46
|
+
lines.push("");
|
|
47
|
+
lines.push(`## Packages`);
|
|
48
|
+
lines.push(`| Package | Version | Private | Publishable | Repo | Path | Local deps |`);
|
|
49
|
+
lines.push(`|---|---:|:---:|:---:|---|---|---|`);
|
|
50
|
+
for (const p of inv.packages) {
|
|
51
|
+
const localDeps = [...(graph.edges.get(p.name) ?? [])].sort().join(", ");
|
|
52
|
+
lines.push(`| \`${p.name}\` | \`${p.version}\` | ${p.private ? "yes" : "no"} | ${p.publishable ? "yes" : "no"} | \`${p.repoRoot}\` | \`${p.cwd}\` | ${localDeps ? localDeps : ""} |`);
|
|
53
|
+
}
|
|
54
|
+
lines.push("");
|
|
55
|
+
lines.push(`## Notes`);
|
|
56
|
+
lines.push(`- Local deps are inferred from dependencies/devDependencies/peerDependencies/optionalDependencies that match other discovered package names.`);
|
|
57
|
+
lines.push(`- Publish order is a topological sort (dependencies first). Cycles are reported and then appended in stable order.`);
|
|
58
|
+
lines.push("");
|
|
59
|
+
const out = lines.join("\n");
|
|
60
|
+
if (opts.out) {
|
|
61
|
+
const outPath = path.resolve(opts.out);
|
|
62
|
+
writeText(outPath, out);
|
|
63
|
+
console.log(`Wrote report: ${outPath}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(out);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=reportStation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportStation.js","sourceRoot":"","sources":["../../src/commands/reportStation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveStationRoot } from "../utils/path.js";
|
|
4
|
+
import { discoverStationInventory } from "../station/discover.js";
|
|
5
|
+
import { ensureRenovateConfig, ensureNcuScript } from "../utils/git.js";
|
|
6
|
+
export function runOnceCommand() {
|
|
7
|
+
const cmd = new Command("runOnce")
|
|
8
|
+
.description("Station-wide one-time setup: ensure renovate.json, optional deps:latest, optional commit+push.")
|
|
9
|
+
.option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
|
|
10
|
+
.option("--prometheus", "Use prometheus mode (walk up to folder named prometheus)")
|
|
11
|
+
.option("--pro", "Alias of --prometheus")
|
|
12
|
+
.option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
|
|
13
|
+
.option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
|
|
14
|
+
.option("--add-ncu", "Add deps:latest script (ncu)")
|
|
15
|
+
.option("--commit", "Commit changes (per repo) if any")
|
|
16
|
+
.option("--push", "Push changes (per repo) if any", true)
|
|
17
|
+
.option("--message <msg>", "Commit message", "chore: add/update renovate config")
|
|
18
|
+
.option("--dry-run", "No writes", false)
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
const stationRoot = resolveStationRoot({
|
|
21
|
+
path: opts.path,
|
|
22
|
+
prometheus: opts.prometheus,
|
|
23
|
+
pro: opts.pro,
|
|
24
|
+
prometheusName: opts.prometheusName,
|
|
25
|
+
maxUp: opts.maxUp
|
|
26
|
+
});
|
|
27
|
+
console.log(`Station root: ${stationRoot}`);
|
|
28
|
+
const inv = await discoverStationInventory(stationRoot);
|
|
29
|
+
// group by repoRoot
|
|
30
|
+
const repos = new Map(); // repoRoot -> packageJsonPaths under it
|
|
31
|
+
for (const p of inv.packages) {
|
|
32
|
+
const list = repos.get(p.repoRoot) ?? [];
|
|
33
|
+
list.push(p.packageJsonPath);
|
|
34
|
+
repos.set(p.repoRoot, list);
|
|
35
|
+
}
|
|
36
|
+
console.log(`Found ${repos.size} repo(s), ${inv.packages.length} package(s).`);
|
|
37
|
+
let ok = 0, fail = 0;
|
|
38
|
+
for (const [repoRoot, pkgJsonPaths] of repos) {
|
|
39
|
+
try {
|
|
40
|
+
if (opts.dryRun) {
|
|
41
|
+
console.log(`DRY ${repoRoot} -> would update renovate.json${opts.addNcu ? " + deps:latest" : ""}`);
|
|
42
|
+
ok++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const changedRenovate = await ensureRenovateConfig(repoRoot);
|
|
46
|
+
let changedNcu = false;
|
|
47
|
+
if (opts.addNcu) {
|
|
48
|
+
// apply deps:latest to all package.json that are in this repoRoot (root + workspaces)
|
|
49
|
+
for (const pkgJsonPath of pkgJsonPaths) {
|
|
50
|
+
changedNcu = (await ensureNcuScript(path.dirname(pkgJsonPath))) || changedNcu;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const changed = changedRenovate || changedNcu;
|
|
54
|
+
if (changed && opts.commit) {
|
|
55
|
+
await (await import("../utils/git.js")).gitAddCommitPush(repoRoot, {
|
|
56
|
+
message: opts.message,
|
|
57
|
+
push: Boolean(opts.push)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
console.log(`OK ${repoRoot}${changed ? " (changed)" : " (no-op)"}`);
|
|
61
|
+
ok++;
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.log(`FAIL ${repoRoot} - ${e?.message ?? String(e)}`);
|
|
65
|
+
fail++;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log(`\nSummary: OK=${ok}, FAIL=${fail}`);
|
|
69
|
+
});
|
|
70
|
+
return cmd;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=runOnce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runOnce.js","sourceRoot":"","sources":["../../src/commands/runOnce.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { runOnceCommand } from "./commands/runOnce.js";
|
|
4
|
+
import { gitSyncCommand } from "./commands/gitSync.js";
|
|
5
|
+
import { publishOneCommand } from "./commands/publishOne.js";
|
|
6
|
+
import { publishStationCommand } from "./commands/publishStation.js";
|
|
7
|
+
import { reportStationCommand } from "./commands/reportStation.js";
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name("nx-npm-tools")
|
|
11
|
+
.description("Renovate setup + station scan + dependency graph + ordered npm publishing.")
|
|
12
|
+
.version("0.2.0");
|
|
13
|
+
program.addCommand(runOnceCommand());
|
|
14
|
+
program.addCommand(gitSyncCommand());
|
|
15
|
+
program.addCommand(publishOneCommand());
|
|
16
|
+
program.addCommand(publishStationCommand());
|
|
17
|
+
program.addCommand(reportStationCommand());
|
|
18
|
+
program.parse(process.argv);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,4EAA4E,CAAC;KACzF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import fg from "fast-glob";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { exists, isDir, readJson } from "../utils/fs.js";
|
|
4
|
+
const IGNORE = [
|
|
5
|
+
"**/node_modules/**",
|
|
6
|
+
"**/.git/**",
|
|
7
|
+
"**/.pnpm-store/**",
|
|
8
|
+
"**/.yarn/**",
|
|
9
|
+
"**/.nx/**",
|
|
10
|
+
"**/dist/**",
|
|
11
|
+
"**/build/**",
|
|
12
|
+
"**/out/**",
|
|
13
|
+
"**/.next/**",
|
|
14
|
+
"**/coverage/**",
|
|
15
|
+
"**/.cache/**"
|
|
16
|
+
];
|
|
17
|
+
function normalizeWorkspaces(ws) {
|
|
18
|
+
if (!ws)
|
|
19
|
+
return [];
|
|
20
|
+
if (Array.isArray(ws))
|
|
21
|
+
return ws;
|
|
22
|
+
if (typeof ws === "object" && Array.isArray(ws.packages))
|
|
23
|
+
return ws.packages;
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
function isLikelyPublishable(pkg, cwd) {
|
|
27
|
+
// Heuristic: publishable if not private, has name+version, and has build script OR dist folder commonly used
|
|
28
|
+
if (!pkg.name || !pkg.version)
|
|
29
|
+
return false;
|
|
30
|
+
if (pkg.private === true)
|
|
31
|
+
return false;
|
|
32
|
+
if (pkg.scripts?.build)
|
|
33
|
+
return true;
|
|
34
|
+
if (exists(path.join(cwd, "dist")))
|
|
35
|
+
return true;
|
|
36
|
+
return true; // default permissive
|
|
37
|
+
}
|
|
38
|
+
function depsBlock(p) {
|
|
39
|
+
return {
|
|
40
|
+
dependencies: p.dependencies ?? {},
|
|
41
|
+
devDependencies: p.devDependencies ?? {},
|
|
42
|
+
peerDependencies: p.peerDependencies ?? {},
|
|
43
|
+
optionalDependencies: p.optionalDependencies ?? {}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function findGitRepoRoots(stationRoot) {
|
|
47
|
+
const gitDirs = await fg(["**/.git"], {
|
|
48
|
+
cwd: stationRoot,
|
|
49
|
+
onlyDirectories: true,
|
|
50
|
+
ignore: IGNORE,
|
|
51
|
+
followSymbolicLinks: false
|
|
52
|
+
});
|
|
53
|
+
const repoRoots = gitDirs
|
|
54
|
+
.map(g => path.resolve(stationRoot, path.dirname(g)))
|
|
55
|
+
.filter(r => isDir(r));
|
|
56
|
+
return [...new Set(repoRoots)].sort();
|
|
57
|
+
}
|
|
58
|
+
async function discoverWorkspacePackages(repoRoot) {
|
|
59
|
+
const rootPkgPath = path.join(repoRoot, "package.json");
|
|
60
|
+
if (!exists(rootPkgPath))
|
|
61
|
+
return [];
|
|
62
|
+
const rootPkg = readJson(rootPkgPath);
|
|
63
|
+
const patterns = normalizeWorkspaces(rootPkg.workspaces);
|
|
64
|
+
if (!patterns.length)
|
|
65
|
+
return [];
|
|
66
|
+
// Expand workspace patterns relative to repo root (e.g. "packages/*")
|
|
67
|
+
const matches = await fg(patterns.map(p => path.posix.join(p.replaceAll("\\", "/"), "package.json")), {
|
|
68
|
+
cwd: repoRoot,
|
|
69
|
+
onlyFiles: true,
|
|
70
|
+
ignore: IGNORE,
|
|
71
|
+
followSymbolicLinks: false
|
|
72
|
+
});
|
|
73
|
+
return matches.map(m => path.join(repoRoot, m));
|
|
74
|
+
}
|
|
75
|
+
export async function discoverStationInventory(stationRoot) {
|
|
76
|
+
const repoRoots = await findGitRepoRoots(stationRoot);
|
|
77
|
+
const packageJsonPaths = [];
|
|
78
|
+
for (const repoRoot of repoRoots) {
|
|
79
|
+
const rootPkg = path.join(repoRoot, "package.json");
|
|
80
|
+
if (exists(rootPkg))
|
|
81
|
+
packageJsonPaths.push(rootPkg);
|
|
82
|
+
const wsPkgs = await discoverWorkspacePackages(repoRoot);
|
|
83
|
+
for (const p of wsPkgs)
|
|
84
|
+
packageJsonPaths.push(p);
|
|
85
|
+
}
|
|
86
|
+
const uniqPkgJsonPaths = [...new Set(packageJsonPaths)];
|
|
87
|
+
const packages = [];
|
|
88
|
+
for (const pkgPath of uniqPkgJsonPaths) {
|
|
89
|
+
const cwd = path.dirname(pkgPath);
|
|
90
|
+
const pkg = readJson(pkgPath);
|
|
91
|
+
if (!pkg.name || !pkg.version)
|
|
92
|
+
continue;
|
|
93
|
+
// repoRoot = nearest ancestor containing .git (we already enumerated repo roots, so match by prefix)
|
|
94
|
+
const repoRoot = repoRoots.find(r => cwd === r || cwd.startsWith(r + path.sep));
|
|
95
|
+
if (!repoRoot)
|
|
96
|
+
continue;
|
|
97
|
+
packages.push({
|
|
98
|
+
name: pkg.name,
|
|
99
|
+
version: pkg.version,
|
|
100
|
+
private: pkg.private ?? false,
|
|
101
|
+
cwd,
|
|
102
|
+
repoRoot,
|
|
103
|
+
packageJsonPath: pkgPath,
|
|
104
|
+
scripts: pkg.scripts ?? {},
|
|
105
|
+
deps: depsBlock(pkg),
|
|
106
|
+
publishable: isLikelyPublishable(pkg, cwd)
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// De-dupe by name: prefer deeper package (workspace) over repo root if name collides (rare)
|
|
110
|
+
const byName = new Map();
|
|
111
|
+
for (const p of packages) {
|
|
112
|
+
const prev = byName.get(p.name);
|
|
113
|
+
if (!prev)
|
|
114
|
+
byName.set(p.name, p);
|
|
115
|
+
else {
|
|
116
|
+
// prefer the one that is not private, else prefer the one with build script
|
|
117
|
+
if (prev.private && !p.private)
|
|
118
|
+
byName.set(p.name, p);
|
|
119
|
+
else if (!prev.scripts.build && p.scripts.build)
|
|
120
|
+
byName.set(p.name, p);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
stationRoot,
|
|
125
|
+
packages: [...byName.values()].sort((a, b) => a.name.localeCompare(b.name))
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/station/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function collectAllDeps(p) {
|
|
2
|
+
return {
|
|
3
|
+
...p.deps.dependencies,
|
|
4
|
+
...p.deps.devDependencies,
|
|
5
|
+
...p.deps.peerDependencies,
|
|
6
|
+
...p.deps.optionalDependencies
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function buildStationGraph(inv) {
|
|
10
|
+
const nodes = new Map();
|
|
11
|
+
for (const p of inv.packages)
|
|
12
|
+
nodes.set(p.name, p);
|
|
13
|
+
const edges = new Map();
|
|
14
|
+
const issues = [];
|
|
15
|
+
for (const p of inv.packages) {
|
|
16
|
+
const deps = collectAllDeps(p);
|
|
17
|
+
const local = new Set();
|
|
18
|
+
for (const depName of Object.keys(deps)) {
|
|
19
|
+
if (nodes.has(depName))
|
|
20
|
+
local.add(depName);
|
|
21
|
+
}
|
|
22
|
+
edges.set(p.name, local);
|
|
23
|
+
// (optional) if you want to warn about @scope/* deps not found locally:
|
|
24
|
+
// for (const depName of Object.keys(deps)) {
|
|
25
|
+
// if (depName.startsWith("@athenices/") && !nodes.has(depName)) {
|
|
26
|
+
// issues.push({ type: "missingLocalDep", package: p.name, missing: depName });
|
|
27
|
+
// }
|
|
28
|
+
// }
|
|
29
|
+
}
|
|
30
|
+
// Toposort (Kahn)
|
|
31
|
+
const indeg = new Map();
|
|
32
|
+
for (const name of nodes.keys())
|
|
33
|
+
indeg.set(name, 0);
|
|
34
|
+
for (const [from, tos] of edges) {
|
|
35
|
+
for (const to of tos)
|
|
36
|
+
indeg.set(to, (indeg.get(to) ?? 0) + 1);
|
|
37
|
+
}
|
|
38
|
+
const q = [];
|
|
39
|
+
for (const [n, d] of indeg)
|
|
40
|
+
if (d === 0)
|
|
41
|
+
q.push(n);
|
|
42
|
+
const topo = [];
|
|
43
|
+
while (q.length) {
|
|
44
|
+
const n = q.shift();
|
|
45
|
+
topo.push(n);
|
|
46
|
+
for (const dep of edges.get(n) ?? []) {
|
|
47
|
+
const nd = (indeg.get(dep) ?? 0) - 1;
|
|
48
|
+
indeg.set(dep, nd);
|
|
49
|
+
if (nd === 0)
|
|
50
|
+
q.push(dep);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (topo.length !== nodes.size) {
|
|
54
|
+
// cycle exists; find a rough cycle by listing remaining nodes
|
|
55
|
+
const remaining = [...nodes.keys()].filter(n => !topo.includes(n));
|
|
56
|
+
issues.push({ type: "cycle", cycle: remaining });
|
|
57
|
+
// fallback: append remaining in stable order
|
|
58
|
+
remaining.sort();
|
|
59
|
+
topo.push(...remaining);
|
|
60
|
+
}
|
|
61
|
+
// We want publish order: dependencies first.
|
|
62
|
+
// Current topo puts zero-indeg first (packages that nothing depends on), which is reverse for publishing.
|
|
63
|
+
// So reverse it.
|
|
64
|
+
topo.reverse();
|
|
65
|
+
return { nodes, edges, topo, issues };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/station/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/station/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
export async function run(cmd, args, cwd, inherit = true) {
|
|
3
|
+
return execa(cmd, args, { cwd, stdio: inherit ? "inherit" : "pipe" });
|
|
4
|
+
}
|
|
5
|
+
export async function runCapture(cmd, args, cwd) {
|
|
6
|
+
const r = await execa(cmd, args, { cwd, stdio: "pipe" });
|
|
7
|
+
return (r.stdout ?? "").toString();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,OAAO,GAAG,IAAI;IAChF,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW;IACvE,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function readJson(filePath) {
|
|
4
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
5
|
+
return JSON.parse(raw);
|
|
6
|
+
}
|
|
7
|
+
export function writeJson(filePath, obj) {
|
|
8
|
+
const out = JSON.stringify(obj, null, 2) + "\n";
|
|
9
|
+
fs.writeFileSync(filePath, out, "utf8");
|
|
10
|
+
}
|
|
11
|
+
export function exists(p) {
|
|
12
|
+
try {
|
|
13
|
+
fs.accessSync(p);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function readText(p) {
|
|
21
|
+
return fs.readFileSync(p, "utf8");
|
|
22
|
+
}
|
|
23
|
+
export function writeText(p, s) {
|
|
24
|
+
fs.writeFileSync(p, s, "utf8");
|
|
25
|
+
}
|
|
26
|
+
export function isDir(p) {
|
|
27
|
+
try {
|
|
28
|
+
return fs.statSync(p).isDirectory();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function ensureDir(p) {
|
|
35
|
+
fs.mkdirSync(p, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
export function join(...parts) {
|
|
38
|
+
return path.join(...parts);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAY;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS;IAC5C,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,KAAe;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { run } from "./exec.js";
|
|
4
|
+
import { exists, readJson, writeJson, readText, writeText } from "./fs.js";
|
|
5
|
+
export async function gitAddCommitPush(cwd, opts) {
|
|
6
|
+
const remote = opts.remote ?? "origin";
|
|
7
|
+
await run("git", ["add", "."], cwd, true);
|
|
8
|
+
// commit may fail if nothing to commit; ignore
|
|
9
|
+
try {
|
|
10
|
+
await run("git", ["commit", "-m", opts.message], cwd, true);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// ignore
|
|
14
|
+
}
|
|
15
|
+
if (!opts.push)
|
|
16
|
+
return;
|
|
17
|
+
const args = ["push", remote];
|
|
18
|
+
if (opts.branch)
|
|
19
|
+
args.push(opts.branch);
|
|
20
|
+
if (opts.setUpstream && opts.branch)
|
|
21
|
+
args.push("--set-upstream");
|
|
22
|
+
if (opts.forceWithLease)
|
|
23
|
+
args.push("--force-with-lease");
|
|
24
|
+
await run("git", args, cwd, true);
|
|
25
|
+
}
|
|
26
|
+
export async function ensureRenovateConfig(repoRoot) {
|
|
27
|
+
const renovatePath = path.join(repoRoot, "renovate.json");
|
|
28
|
+
const existed = exists(renovatePath);
|
|
29
|
+
let cfg = {};
|
|
30
|
+
if (existed) {
|
|
31
|
+
cfg = readJson(renovatePath);
|
|
32
|
+
}
|
|
33
|
+
let ext = cfg.extends;
|
|
34
|
+
if (!ext)
|
|
35
|
+
ext = [];
|
|
36
|
+
if (typeof ext === "string")
|
|
37
|
+
ext = [ext];
|
|
38
|
+
if (!Array.isArray(ext))
|
|
39
|
+
ext = [];
|
|
40
|
+
if (!ext.includes("config:base"))
|
|
41
|
+
ext.unshift("config:base");
|
|
42
|
+
cfg.extends = ext;
|
|
43
|
+
cfg.dependencyDashboard = true;
|
|
44
|
+
if (cfg.packageRules == null) {
|
|
45
|
+
cfg.packageRules = [
|
|
46
|
+
{ matchUpdateTypes: ["minor", "patch", "pin", "digest"], groupName: "all non-major dependencies" }
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
const next = JSON.stringify(cfg, null, 2) + "\n";
|
|
50
|
+
const prev = existed ? readText(renovatePath) : "";
|
|
51
|
+
const changed = prev !== next;
|
|
52
|
+
if (changed)
|
|
53
|
+
writeText(renovatePath, next);
|
|
54
|
+
return changed;
|
|
55
|
+
}
|
|
56
|
+
export async function ensureNcuScript(pkgDir) {
|
|
57
|
+
const pkgPath = path.join(pkgDir, "package.json");
|
|
58
|
+
if (!exists(pkgPath))
|
|
59
|
+
return false;
|
|
60
|
+
const pkg = readJson(pkgPath);
|
|
61
|
+
pkg.scripts ||= {};
|
|
62
|
+
const before = pkg.scripts["deps:latest"];
|
|
63
|
+
pkg.scripts["deps:latest"] = "npx npm-check-updates -u && npm install";
|
|
64
|
+
const changed = before !== pkg.scripts["deps:latest"];
|
|
65
|
+
if (changed)
|
|
66
|
+
writeJson(pkgPath, pkg);
|
|
67
|
+
return changed;
|
|
68
|
+
}
|
|
69
|
+
async function forceCleanInstall(cwd) {
|
|
70
|
+
// Cross-platform remove node_modules + package-lock.json
|
|
71
|
+
const nm = path.join(cwd, "node_modules");
|
|
72
|
+
const lock = path.join(cwd, "package-lock.json");
|
|
73
|
+
try {
|
|
74
|
+
fs.rmSync(nm, { recursive: true, force: true });
|
|
75
|
+
}
|
|
76
|
+
catch { }
|
|
77
|
+
try {
|
|
78
|
+
fs.rmSync(lock, { force: true });
|
|
79
|
+
}
|
|
80
|
+
catch { }
|
|
81
|
+
await run("npm", ["cache", "clean", "--force"], cwd, true);
|
|
82
|
+
await run("npm", ["install"], cwd, true);
|
|
83
|
+
}
|
|
84
|
+
function mustExist(filePath, hint) {
|
|
85
|
+
if (!exists(filePath))
|
|
86
|
+
throw new Error(`${hint}\nMissing: ${filePath}`);
|
|
87
|
+
}
|
|
88
|
+
export async function publishPackageFlow(cwd, opts) {
|
|
89
|
+
if (opts.dryRun) {
|
|
90
|
+
console.log(`[dry-run] would publish from: ${cwd}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// install
|
|
94
|
+
if (opts.forceInstall)
|
|
95
|
+
await forceCleanInstall(cwd);
|
|
96
|
+
else
|
|
97
|
+
await run("npm", ["install"], cwd, true);
|
|
98
|
+
// git sync
|
|
99
|
+
await gitAddCommitPush(cwd, {
|
|
100
|
+
message: opts.message,
|
|
101
|
+
push: opts.push,
|
|
102
|
+
remote: opts.remote,
|
|
103
|
+
branch: opts.branch,
|
|
104
|
+
setUpstream: opts.setUpstream,
|
|
105
|
+
forceWithLease: opts.forceWithLease
|
|
106
|
+
});
|
|
107
|
+
// build
|
|
108
|
+
await run("npm", ["run", opts.buildScript], cwd, true);
|
|
109
|
+
// verify dist output exists
|
|
110
|
+
const distFile = path.resolve(cwd, opts.distCheck);
|
|
111
|
+
mustExist(distFile, "Build output check failed.");
|
|
112
|
+
// bump version (optional)
|
|
113
|
+
if (opts.bump !== "none") {
|
|
114
|
+
await run("npm", ["version", String(opts.bump)], cwd, true);
|
|
115
|
+
}
|
|
116
|
+
// publish
|
|
117
|
+
const publishArgs = ["publish"];
|
|
118
|
+
// access flag
|
|
119
|
+
if (opts.access)
|
|
120
|
+
publishArgs.push("--access", String(opts.access));
|
|
121
|
+
// tag flag
|
|
122
|
+
if (opts.tag && opts.tag.trim())
|
|
123
|
+
publishArgs.push("--tag", opts.tag.trim());
|
|
124
|
+
await run("npm", publishArgs, cwd, true);
|
|
125
|
+
// Show current package + version (best effort)
|
|
126
|
+
try {
|
|
127
|
+
const pkg = readJson(path.join(cwd, "package.json"));
|
|
128
|
+
console.log(`✅ Published: ${pkg.name} @ ${pkg.version}`);
|
|
129
|
+
}
|
|
130
|
+
catch { }
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { findAncestorFolderByName } from "./prometheus.js";
|
|
3
|
+
export function resolveStationRoot(opts) {
|
|
4
|
+
if (opts.path)
|
|
5
|
+
return path.resolve(opts.path);
|
|
6
|
+
// Default to prometheus mode
|
|
7
|
+
const folderName = opts.prometheusName ?? "prometheus";
|
|
8
|
+
const maxUp = opts.maxUp ?? 120;
|
|
9
|
+
return findAncestorFolderByName(process.cwd(), folderName, maxUp);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAU3D,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9C,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,IAAI,YAAY,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAEhC,OAAO,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export function findAncestorFolderByName(startDir, folderName = "prometheus", maxUp = 120) {
|
|
3
|
+
let cur = path.resolve(startDir);
|
|
4
|
+
for (let i = 0; i <= maxUp; i++) {
|
|
5
|
+
if (path.basename(cur) === folderName)
|
|
6
|
+
return cur;
|
|
7
|
+
const parent = path.dirname(cur);
|
|
8
|
+
if (parent === cur)
|
|
9
|
+
break;
|
|
10
|
+
cur = parent;
|
|
11
|
+
}
|
|
12
|
+
throw new Error(`Prometheus mode: couldn't find ancestor folder named "${folderName}" starting from: ${startDir}`);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=prometheus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prometheus.js","sourceRoot":"","sources":["../../src/utils/prometheus.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,UAAU,GAAG,YAAY,EACzB,KAAK,GAAG,GAAG;IAEX,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,UAAU;YAAE,OAAO,GAAG,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yDAAyD,UAAU,oBAAoB,QAAQ,EAAE,CAClG,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nx-npm-tools",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "CLI helpers for Renovate setup, station scanning, dependency graph, git sync, and ordered npm publishing.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"nx-npm-tools": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.json",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"commander": "^12.1.0",
|
|
19
|
+
"execa": "^9.5.0",
|
|
20
|
+
"fast-glob": "^3.3.2"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^25.0.3",
|
|
24
|
+
"typescript": "^5.5.4"
|
|
25
|
+
}
|
|
26
|
+
}
|