dep-up-surgeon 2.2.1 → 2.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAuC;IAE7C,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaxD;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CA6Bd;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC;;;;;OAKG;IACH,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd"}
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAuC;IAE7C,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaxD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAEvD;;;;OAIG;IACG,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASpE;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CA6Bd;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC;;;;;OAKG;IACH,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd"}
@@ -24,6 +24,51 @@ export class AsyncMutex {
24
24
  return next;
25
25
  }
26
26
  }
27
+ /**
28
+ * A keyed asynchronous mutex — `runExclusive(key, fn)` serializes calls that share the same
29
+ * `key` while allowing callers with DIFFERENT keys to run concurrently.
30
+ *
31
+ * Why: in an isolated-lockfile monorepo (e.g. pnpm with `shared-workspace-lockfile=false`,
32
+ * or a folder of independent projects each with its own lockfile), installs into different
33
+ * workspace directories are independent — they only race when they touch the same directory.
34
+ * The keyed mutex lets the upgrader serialize "same install directory" operations while
35
+ * letting "different install directories" run in parallel, turning the full monorepo
36
+ * traversal from strictly serial into actually parallel.
37
+ *
38
+ * Keys are intended to be the **absolute install directory path** (the same thing the engine
39
+ * passes to `runInstall(cwd, …)`). When a single shared lockfile at the root is in play,
40
+ * every target's key will collapse to the same root path → behaviorally identical to the
41
+ * old single `AsyncMutex`. When keys differ, parallelism unlocks automatically — no explicit
42
+ * opt-in needed from the caller.
43
+ *
44
+ * Internally this is just a `Map<string, AsyncMutex>`; we create one mutex per observed key
45
+ * on first access. Entries are never evicted (there's at most one mutex per workspace member,
46
+ * which is bounded by the project size). The class is otherwise a drop-in for `AsyncMutex`
47
+ * when callers supply a stable key.
48
+ */
49
+ export class KeyedMutex {
50
+ locks = new Map();
51
+ /**
52
+ * Run `fn` with exclusive access to `key`. Calls with the same key are FIFO-serialized;
53
+ * calls with different keys run concurrently. A thrown `fn` releases its key's lock as
54
+ * usual (errors never poison the queue — see `AsyncMutex`).
55
+ */
56
+ async runExclusive(key, fn) {
57
+ let lock = this.locks.get(key);
58
+ if (!lock) {
59
+ lock = new AsyncMutex();
60
+ this.locks.set(key, lock);
61
+ }
62
+ return lock.runExclusive(fn);
63
+ }
64
+ /**
65
+ * Current number of tracked keys. Purely informational — used by the orchestrator's
66
+ * summary log line ("running across N install directories concurrently").
67
+ */
68
+ get keyCount() {
69
+ return this.locks.size;
70
+ }
71
+ }
27
72
  /**
28
73
  * Run `worker` for every item in `items` with at most `concurrency` in flight at any time.
29
74
  * Returns results in the **original input order** (not completion order) so callers can
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,MAAM,OAAO,UAAU;IACb,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEnD,KAAK,CAAC,YAAY,CAAI,EAAoB;QACxC,yFAAyF;QACzF,wEAAwE;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CACzB,GAAG,EAAE,CAAC,EAAE,EAAE,EACV,GAAG,EAAE,CAAC,EAAE,EAAE,CACX,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CACnB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,IAAkB,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,WAAmB,EACnB,MAA8C;IAE9C,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,IAAI,EAAE;YACV,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,EAAE,CACL,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAsCD,MAAM,UAAU,mBAAmB;IACjC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA0C;IAE1C,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dep-up-surgeon",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "Upgrade npm dependencies one-by-one with validation, rollback, and conflict reporting.",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -14,8 +14,8 @@
14
14
  "build": "tsc",
15
15
  "prepare": "npm run build",
16
16
  "start": "node dist/cli.js",
17
- "test": "npm run build && node --test test/unit/conflict-parser.test.mjs test/unit/npm-output-samples.test.mjs test/unit/workspaces.test.mjs test/unit/output-tail.test.mjs test/unit/upgrade-flow-targets.test.mjs test/unit/last-run-retry.test.mjs test/unit/summary.test.mjs test/unit/install-filter.test.mjs test/unit/concurrency.test.mjs test/unit/git.test.mjs test/unit/changelog.test.mjs test/unit/audit.test.mjs test/unit/policy.test.mjs test/unit/blast-radius.test.mjs test/unit/breaking-changes.test.mjs test/unit/open-pr.test.mjs test/unit/overrides.test.mjs test/unit/peer-resolver.test.mjs test/unit/lockfile-fix.test.mjs test/fixtures-runner.mjs",
18
- "test:unit": "npm run build && node --test test/unit/conflict-parser.test.mjs test/unit/npm-output-samples.test.mjs test/unit/workspaces.test.mjs test/unit/output-tail.test.mjs test/unit/upgrade-flow-targets.test.mjs test/unit/last-run-retry.test.mjs test/unit/summary.test.mjs test/unit/install-filter.test.mjs test/unit/concurrency.test.mjs test/unit/git.test.mjs test/unit/changelog.test.mjs test/unit/audit.test.mjs test/unit/policy.test.mjs test/unit/blast-radius.test.mjs test/unit/breaking-changes.test.mjs test/unit/open-pr.test.mjs test/unit/overrides.test.mjs test/unit/peer-resolver.test.mjs test/unit/lockfile-fix.test.mjs",
17
+ "test": "npm run build && node --test test/unit/conflict-parser.test.mjs test/unit/npm-output-samples.test.mjs test/unit/workspaces.test.mjs test/unit/output-tail.test.mjs test/unit/upgrade-flow-targets.test.mjs test/unit/last-run-retry.test.mjs test/unit/summary.test.mjs test/unit/install-filter.test.mjs test/unit/concurrency.test.mjs test/unit/git.test.mjs test/unit/changelog.test.mjs test/unit/audit.test.mjs test/unit/policy.test.mjs test/unit/blast-radius.test.mjs test/unit/breaking-changes.test.mjs test/unit/open-pr.test.mjs test/unit/overrides.test.mjs test/unit/peer-resolver.test.mjs test/unit/lockfile-fix.test.mjs test/unit/doctor.test.mjs test/fixtures-runner.mjs",
18
+ "test:unit": "npm run build && node --test test/unit/conflict-parser.test.mjs test/unit/npm-output-samples.test.mjs test/unit/workspaces.test.mjs test/unit/output-tail.test.mjs test/unit/upgrade-flow-targets.test.mjs test/unit/last-run-retry.test.mjs test/unit/summary.test.mjs test/unit/install-filter.test.mjs test/unit/concurrency.test.mjs test/unit/git.test.mjs test/unit/changelog.test.mjs test/unit/audit.test.mjs test/unit/policy.test.mjs test/unit/blast-radius.test.mjs test/unit/breaking-changes.test.mjs test/unit/open-pr.test.mjs test/unit/overrides.test.mjs test/unit/peer-resolver.test.mjs test/unit/lockfile-fix.test.mjs test/unit/doctor.test.mjs",
19
19
  "test:fixtures": "npm run build && node --test test/fixtures-runner.mjs"
20
20
  },
21
21
  "repository": {