@savvy-web/silk 3.7.12 → 3.8.1

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.
@@ -2335,7 +2335,7 @@ var GlobSet = class GlobSet extends effect.Schema.Class("GlobSet")(effect.Schema
2335
2335
  }
2336
2336
  };
2337
2337
  //#endregion
2338
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/BunExtension.js
2338
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/BunExtension.js
2339
2339
  /**
2340
2340
  * Extension data specific to bun lockfiles, attached to `Lockfile.extension`
2341
2341
  * when the format is `"bun"`.
@@ -5569,7 +5569,7 @@ var ReleaseAgeGate = class ReleaseAgeGate extends effect.Schema.Class("ReleaseAg
5569
5569
  }
5570
5570
  };
5571
5571
  //#endregion
5572
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/ImporterDependency.js
5572
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/ImporterDependency.js
5573
5573
  /**
5574
5574
  * One declared dependency of one workspace importer, as the lockfile records it.
5575
5575
  *
@@ -5607,7 +5607,7 @@ var ImporterDependency = class extends effect.Schema.Class("ImporterDependency")
5607
5607
  depType: DependencyField
5608
5608
  }) {};
5609
5609
  //#endregion
5610
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/LockfileImporter.js
5610
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/LockfileImporter.js
5611
5611
  /**
5612
5612
  * One workspace importer's declared dependencies, as the lockfile records them.
5613
5613
  *
@@ -5631,14 +5631,23 @@ var LockfileImporter = class extends effect.Schema.Class("LockfileImporter")({
5631
5631
  dependencies: effect.Schema.Array(ImporterDependency)
5632
5632
  }) {};
5633
5633
  //#endregion
5634
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/ResolvedPackage.js
5634
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/ResolvedPackage.js
5635
5635
  const EMPTY_DEPENDENCIES = {};
5636
+ const EMPTY_PEER_META = {};
5637
+ const EMPTY_EDGE_NAMES = [];
5636
5638
  /**
5637
5639
  * A package resolved from a lockfile.
5638
5640
  *
5639
5641
  * @remarks
5640
5642
  * The common shape every format's entries normalize into:
5641
5643
  *
5644
+ * - `instanceId` — the lockfile-native identity of this *instance*, verbatim:
5645
+ * pnpm's snapshot key (`react-dom@18.3.1(react@17.0.2)`), npm's full entry
5646
+ * key (`node_modules/express/node_modules/debug`), bun's `packages` key
5647
+ * (`@acme/lib/react-dom`) or yarn's locator (`react-dom@npm:18.3.1`). It is
5648
+ * **opaque** — no scheme is synthesized and none should be parsed by a
5649
+ * consumer; it exists so `resolved` can name an instance, and so two
5650
+ * peer-resolved variants of one `name@version` stay distinguishable.
5642
5651
  * - `name` — the resolved package name. For pnpm *workspace* packages
5643
5652
  * straight out of `Lockfile.parse` this is the importer path until
5644
5653
  * `Lockfile#withImporterNames` rewrites it.
@@ -5654,19 +5663,65 @@ const EMPTY_DEPENDENCIES = {};
5654
5663
  * packages, when the lockfile records one.
5655
5664
  * - `dependencies` — the package's own dependency map, defaulting to `{}`
5656
5665
  * both at construction and when decoding serialized data.
5666
+ * - `peerDependencies` — the package's *declared* peer ranges, keyed by peer
5667
+ * name. Every format records them (pnpm and npm as their own section, bun
5668
+ * inline in the package tuple's info object, yarn Berry as an entry
5669
+ * section), so this is populated across all four. Declarations only: what
5670
+ * the package *asks for*, never what actually resolved.
5671
+ * - `peerDependenciesMeta` — the per-peer flags, normalized to
5672
+ * `{ optional: boolean }`. bun spells optional peers as an `optionalPeers`
5673
+ * array of names rather than a meta object; that spelling is normalized
5674
+ * into this shape so one consumer algorithm serves every format. A peer
5675
+ * with no meta entry is required.
5676
+ * - `resolved` — this instance's *outgoing edges*: dependency (and, where the
5677
+ * format records it, peer) name → the `instanceId` that name actually
5678
+ * resolved to in this instance's context. This is the answer to "which
5679
+ * concrete version of P did X get", which `peerDependencies` deliberately
5680
+ * does not answer.
5681
+ *
5682
+ * Every entry is **verified**: an edge is emitted only when the composed or
5683
+ * walked-up identity matches a real instance in the same lockfile. An edge
5684
+ * that cannot be resolved honestly is *omitted*, never guessed — a wrong
5685
+ * resolved edge is a silent wrong answer, an absent one is a visible gap.
5686
+ * yarn records peer resolution virtually and is therefore dependency-edges
5687
+ * only.
5688
+ *
5689
+ * - `unresolvedEdges` — dependency names whose edge the lockfile **records**
5690
+ * but this model could not name: a `link:` target that is not a workspace
5691
+ * importer, a composed identity matching no instance. It is the companion
5692
+ * `resolved` needs to be honest, because an absent key in `resolved` would
5693
+ * otherwise mean two different things — "nothing is there" and "something is
5694
+ * there that I could not name" — and a consumer reading the first meaning
5695
+ * for the second turns this package's gap into its own false positive.
5696
+ *
5697
+ * A dependency the lockfile simply does not record is **not** an unresolved
5698
+ * edge; it is an absence, and must not appear here. npm and bun contribute
5699
+ * nothing at all: their sections are *declarations* resolved positionally, so
5700
+ * "the walk found nothing" is genuine absence. A fail-closed signal that is
5701
+ * always on is a signal nobody reads.
5702
+ *
5703
+ * All four record fields — `dependencies`, `peerDependencies`,
5704
+ * `peerDependenciesMeta` and `resolved` — default to `{}` at construction and
5705
+ * when decoding, and `unresolvedEdges` defaults to `[]`. An absent section is
5706
+ * therefore an empty collection, never `undefined`.
5657
5707
  *
5658
5708
  * @public
5659
5709
  */
5660
5710
  var ResolvedPackage = class extends effect.Schema.Class("ResolvedPackage")({
5661
5711
  name: effect.Schema.NonEmptyString,
5662
5712
  version: effect.Schema.String,
5713
+ instanceId: effect.Schema.NonEmptyString,
5663
5714
  integrity: effect.Schema.optionalKey(IntegrityHash),
5664
5715
  isWorkspace: effect.Schema.Boolean,
5665
5716
  relativePath: effect.Schema.optionalKey(effect.Schema.String),
5666
- dependencies: effect.Schema.Record(effect.Schema.String, effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_DEPENDENCIES)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_DEPENDENCIES)))
5717
+ dependencies: effect.Schema.Record(effect.Schema.String, effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_DEPENDENCIES)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_DEPENDENCIES))),
5718
+ peerDependencies: effect.Schema.Record(effect.Schema.String, effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_DEPENDENCIES)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_DEPENDENCIES))),
5719
+ peerDependenciesMeta: effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({ optional: effect.Schema.Boolean })).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_PEER_META)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_PEER_META))),
5720
+ resolved: effect.Schema.Record(effect.Schema.String, effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_DEPENDENCIES)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_DEPENDENCIES))),
5721
+ unresolvedEdges: effect.Schema.Array(effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY_EDGE_NAMES)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY_EDGE_NAMES)))
5667
5722
  }) {};
5668
5723
  //#endregion
5669
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/WorkspaceDependency.js
5724
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/WorkspaceDependency.js
5670
5725
  /**
5671
5726
  * A directed dependency edge between two workspace packages as recorded in
5672
5727
  * the lockfile.
@@ -5688,7 +5743,7 @@ var WorkspaceDependency = class extends effect.Schema.Class("WorkspaceDependency
5688
5743
  constraint: effect.Schema.String
5689
5744
  }) {};
5690
5745
  //#endregion
5691
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/PnpmExtension.js
5746
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/PnpmExtension.js
5692
5747
  /**
5693
5748
  * Extension data specific to pnpm lockfiles, attached to `Lockfile.extension`
5694
5749
  * when the format is `"pnpm"`.
@@ -5713,10 +5768,10 @@ var PnpmExtension = class extends effect.Schema.Class("PnpmExtension")({
5713
5768
  }))
5714
5769
  }) {};
5715
5770
  //#endregion
5716
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/LockfileFormat.js
5771
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/LockfileFormat.js
5717
5772
  /**
5718
5773
  * The lockfile formats this package parses: bun's `bun.lock` (JSONC), npm's
5719
- * `package-lock.json` (v2/v3 JSON), pnpm's `pnpm-lock.yaml` and yarn Berry's
5774
+ * `package-lock.json` (JSON), pnpm's `pnpm-lock.yaml` and yarn Berry's
5720
5775
  * `yarn.lock` (both YAML).
5721
5776
  *
5722
5777
  * @remarks
@@ -5725,6 +5780,10 @@ var PnpmExtension = class extends effect.Schema.Class("PnpmExtension")({
5725
5780
  * Berry only; classic (v1) `yarn.lock` is not YAML and fails
5726
5781
  * `Lockfile.parse` with a typed `LockfileParseError`.
5727
5782
  *
5783
+ * The format literal says nothing about which *versions* of that format are
5784
+ * supported: pnpm `lockfileVersion` 9+ and npm `lockfileVersion` 3+ parse,
5785
+ * and older ones fail typed. See `Lockfile.parse`.
5786
+ *
5728
5787
  * @public
5729
5788
  */
5730
5789
  const LockfileFormat = effect.Schema.Literals([
@@ -5751,7 +5810,7 @@ const FILENAMES = {
5751
5810
  */
5752
5811
  const filenameFor = (format) => FILENAMES[format][0];
5753
5812
  //#endregion
5754
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/shared.js
5813
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/shared.js
5755
5814
  /**
5756
5815
  * The four dependency sections of a manifest, in a stable order — the shared
5757
5816
  * dependency-sections table (v3's `DEP_SECTIONS`). Each entry is both the
@@ -5862,6 +5921,79 @@ const importerDependencies = (entry, read) => {
5862
5921
  }
5863
5922
  return deps;
5864
5923
  };
5924
+ const EMPTY_PEERS = {
5925
+ peerDependencies: {},
5926
+ peerDependenciesMeta: {}
5927
+ };
5928
+ /**
5929
+ * Normalize one format's peer declarations into the unified pair.
5930
+ *
5931
+ * Every format records the ranges the same way (a name→range map), but the
5932
+ * optional flag has two spellings: a `peerDependenciesMeta` object (pnpm, npm,
5933
+ * yarn Berry) and bun's `optionalPeers` array of names. Both are accepted and
5934
+ * collapse to `{ optional: boolean }` per peer, so a consumer reads one shape
5935
+ * regardless of which manager wrote the lockfile.
5936
+ *
5937
+ * Absence yields empty records, never `undefined` — an absent section means
5938
+ * "declares no peers", which is a fact, not a gap. Records are built with
5939
+ * `Object.fromEntries` (own-property semantics), so a `__proto__` peer name
5940
+ * neither pollutes nor drops.
5941
+ *
5942
+ * @internal
5943
+ */
5944
+ const peerDeclarations = (peers, meta, optionalPeers) => {
5945
+ if (peers === void 0 && meta === void 0 && optionalPeers === void 0) return EMPTY_PEERS;
5946
+ const flags = /* @__PURE__ */ new Map();
5947
+ if (meta !== void 0) for (const [name, value] of Object.entries(meta)) flags.set(name, value?.optional === true);
5948
+ if (optionalPeers !== void 0) for (const name of optionalPeers) flags.set(name, true);
5949
+ return {
5950
+ peerDependencies: peers === void 0 ? {} : Object.fromEntries(Object.entries(peers)),
5951
+ peerDependenciesMeta: Object.fromEntries([...flags].map(([name, optional]) => [name, { optional }]))
5952
+ };
5953
+ };
5954
+ /**
5955
+ * The minimum lockfile-format version each gated format is parsed at.
5956
+ *
5957
+ * This is a deliberate narrowing of the supported input domain, not an
5958
+ * implementation detail: an older lockfile fails typed rather than parsing
5959
+ * into a model that cannot answer resolution questions. Note the gate is on
5960
+ * the **lockfile format version**, which is the only version a lockfile
5961
+ * records — the writing package manager's version is not recoverable from the
5962
+ * file, so no manager-version claim could be enforced here.
5963
+ *
5964
+ * @internal
5965
+ */
5966
+ const MINIMUM_LOCKFILE_VERSION = {
5967
+ pnpm: 9,
5968
+ npm: 3
5969
+ };
5970
+ /**
5971
+ * Fail typed when a lockfile predates the supported format version.
5972
+ *
5973
+ * Routed through {@link validationFailure} rather than {@link framingFailure}:
5974
+ * the document was located perfectly well, so this is a shape judgement about
5975
+ * a located document, not a framing problem. The cause is a structured record
5976
+ * rather than an engine error, so a consumer can tell "your lockfile is too
5977
+ * old" from "your lockfile is malformed" without parsing a message.
5978
+ *
5979
+ * A version that is not a number at all (`lockfileVersion: "next"`) is not a
5980
+ * supported version either, and fails the same way.
5981
+ *
5982
+ * @internal
5983
+ */
5984
+ const requireLockfileVersion = (format, raw) => {
5985
+ const minimum = MINIMUM_LOCKFILE_VERSION[format];
5986
+ const parsed = typeof raw === "number" ? raw : Number.parseFloat(raw);
5987
+ if (Number.isFinite(parsed) && parsed >= minimum) return effect.Effect.void;
5988
+ const cause = {
5989
+ _tag: "UnsupportedLockfileVersion",
5990
+ format,
5991
+ lockfileVersion: raw,
5992
+ minimumSupported: minimum,
5993
+ message: `${format} lockfileVersion ${JSON.stringify(raw)} is not supported: @effected/lockfiles parses ${format} lockfileVersion ${minimum} and newer`
5994
+ };
5995
+ return effect.Effect.fail(validationFailure(cause));
5996
+ };
5865
5997
  /** @internal */
5866
5998
  const syntaxFailure = (cause) => ({
5867
5999
  stage: "syntax",
@@ -7680,16 +7812,38 @@ var JsoncModifier = class {
7680
7812
  });
7681
7813
  };
7682
7814
  //#endregion
7683
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/bun.js
7815
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/bun.js
7684
7816
  const DepRecord$2 = effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String));
7817
+ const OptionalPeers = effect.Schema.optionalKey(effect.Schema.Array(effect.Schema.String));
7685
7818
  const BunWorkspaceEntry = effect.Schema.Struct({
7686
7819
  name: effect.Schema.optionalKey(effect.Schema.String),
7687
7820
  version: effect.Schema.optionalKey(effect.Schema.String),
7688
7821
  dependencies: DepRecord$2,
7689
7822
  devDependencies: DepRecord$2,
7690
7823
  peerDependencies: DepRecord$2,
7691
- optionalDependencies: DepRecord$2
7824
+ optionalDependencies: DepRecord$2,
7825
+ optionalPeers: OptionalPeers
7826
+ });
7827
+ /**
7828
+ * The info object at package-tuple index 2. bun's tuple shape is
7829
+ * under-documented upstream, so it is read permissively and *out of band*: a
7830
+ * shape that does not decode is skipped (the package still lands, with no
7831
+ * peers) rather than failing the whole parse.
7832
+ *
7833
+ * @internal
7834
+ */
7835
+ const BunPackageInfo = effect.Schema.Struct({
7836
+ dependencies: DepRecord$2,
7837
+ devDependencies: DepRecord$2,
7838
+ optionalDependencies: DepRecord$2,
7839
+ peerDependencies: DepRecord$2,
7840
+ optionalPeers: OptionalPeers
7692
7841
  });
7842
+ const decodeBunPackageInfo = effect.Schema.decodeUnknownExit(BunPackageInfo);
7843
+ const readBunPackageInfo = (value) => {
7844
+ const exit = decodeBunPackageInfo(value);
7845
+ return effect.Exit.isSuccess(exit) ? exit.value : void 0;
7846
+ };
7693
7847
  const BunLockfileRaw = effect.Schema.Struct({
7694
7848
  lockfileVersion: effect.Schema.Number,
7695
7849
  workspaces: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, BunWorkspaceEntry)),
@@ -7712,8 +7866,60 @@ const parseBun = (content) => effect.Effect.gen(function* () {
7712
7866
  const validated = yield* effect.Schema.decodeUnknownEffect(BunLockfileRaw)(parsed).pipe(effect.Effect.mapError(validationFailure));
7713
7867
  return yield* toFields$3(validated);
7714
7868
  });
7869
+ /**
7870
+ * Resolve one entry's outgoing edges by replaying bun's own key scheme.
7871
+ *
7872
+ * bun encodes install position in the `packages` key: a nested install is
7873
+ * keyed `<parent-key>/<name>`, so `"react-dom/react"` is literally "the react
7874
+ * react-dom got". Package names are themselves slash-bearing when scoped, so
7875
+ * the parent chain is **not** computed by splitting on `/` — it is read off
7876
+ * the key space, taking those prefixes of the key that are themselves keys,
7877
+ * longest first. Deepest wins; the root (`<name>` alone) is tried last.
7878
+ *
7879
+ * Only keys that exist are emitted, so an edge bun did not record is omitted
7880
+ * rather than invented.
7881
+ *
7882
+ * @internal
7883
+ */
7884
+ const resolveBunEdges = (key, sections, keys) => {
7885
+ const names = /* @__PURE__ */ new Set();
7886
+ for (const section of sections) {
7887
+ if (!section) continue;
7888
+ for (const name of Object.keys(section)) if (name !== "") names.add(name);
7889
+ }
7890
+ if (names.size === 0) return {};
7891
+ const prefixes = [key];
7892
+ for (let i = key.indexOf("/"); i !== -1; i = key.indexOf("/", i + 1)) {
7893
+ const candidate = key.slice(0, i);
7894
+ if (keys.has(candidate)) prefixes.push(candidate);
7895
+ }
7896
+ prefixes.sort((a, b) => b.length - a.length);
7897
+ prefixes.push("");
7898
+ const edges = /* @__PURE__ */ new Map();
7899
+ for (const name of names) for (const prefix of prefixes) {
7900
+ const candidate = prefix === "" ? name : `${prefix}/${name}`;
7901
+ if (keys.has(candidate)) {
7902
+ edges.set(name, candidate);
7903
+ break;
7904
+ }
7905
+ }
7906
+ return Object.fromEntries(edges);
7907
+ };
7908
+ const infoSections = (info) => [
7909
+ info?.dependencies,
7910
+ info?.devDependencies,
7911
+ info?.optionalDependencies,
7912
+ info?.peerDependencies
7913
+ ];
7914
+ const workspaceSections = (entry) => [
7915
+ entry.dependencies,
7916
+ entry.devDependencies,
7917
+ entry.optionalDependencies,
7918
+ entry.peerDependencies
7919
+ ];
7715
7920
  const toFields$3 = (raw) => effect.Effect.gen(function* () {
7716
7921
  const packages = [];
7922
+ const keys = new Set(raw.packages ? Object.keys(raw.packages) : []);
7717
7923
  const workspaceNames = /* @__PURE__ */ new Set();
7718
7924
  const workspaceEntries = /* @__PURE__ */ new Map();
7719
7925
  const importers = [];
@@ -7726,11 +7932,16 @@ const toFields$3 = (raw) => effect.Effect.gen(function* () {
7726
7932
  if (wsPath === "") continue;
7727
7933
  const name = wsEntry.name === void 0 || wsEntry.name === "" ? wsPath : wsEntry.name;
7728
7934
  workspaceNames.add(name);
7935
+ const instanceId = keys.has(name) ? name : wsPath;
7936
+ if (instanceId === "") continue;
7729
7937
  packages.push(ResolvedPackage.make({
7730
7938
  name,
7731
7939
  version: wsEntry.version ?? "0.0.0",
7940
+ instanceId,
7732
7941
  isWorkspace: true,
7733
- relativePath: wsPath
7942
+ relativePath: wsPath,
7943
+ ...peerDeclarations(wsEntry.peerDependencies, void 0, wsEntry.optionalPeers),
7944
+ resolved: resolveBunEdges(instanceId, workspaceSections(wsEntry), keys)
7734
7945
  }));
7735
7946
  workspaceEntries.set(name, {
7736
7947
  ...wsEntry.dependencies ? { dependencies: wsEntry.dependencies } : {},
@@ -7740,7 +7951,8 @@ const toFields$3 = (raw) => effect.Effect.gen(function* () {
7740
7951
  });
7741
7952
  }
7742
7953
  }
7743
- if (raw.packages) for (const tuple of Object.values(raw.packages)) {
7954
+ if (raw.packages) for (const [key, tuple] of Object.entries(raw.packages)) {
7955
+ if (key === "") continue;
7744
7956
  if (tuple.length < 1) continue;
7745
7957
  const first = tuple[0];
7746
7958
  if (typeof first !== "string") continue;
@@ -7750,11 +7962,15 @@ const toFields$3 = (raw) => effect.Effect.gen(function* () {
7750
7962
  const version = first.slice(atIdx + 1);
7751
7963
  if (workspaceNames.has(name)) continue;
7752
7964
  const integrity = yield* toIntegrityHash(tuple.length >= 4 && typeof tuple[3] === "string" ? tuple[3] : void 0);
7965
+ const info = tuple.length >= 3 ? readBunPackageInfo(tuple[2]) : void 0;
7753
7966
  packages.push(ResolvedPackage.make({
7754
7967
  name,
7755
7968
  version,
7969
+ instanceId: key,
7756
7970
  ...integrity !== void 0 ? { integrity } : {},
7757
- isWorkspace: false
7971
+ isWorkspace: false,
7972
+ ...peerDeclarations(info?.peerDependencies, void 0, info?.optionalPeers),
7973
+ resolved: resolveBunEdges(key, infoSections(info), keys)
7758
7974
  }));
7759
7975
  }
7760
7976
  const workspaceDependencies = extractWorkspaceDeps(workspaceEntries, workspaceNames);
@@ -7773,8 +7989,9 @@ const toFields$3 = (raw) => effect.Effect.gen(function* () {
7773
7989
  };
7774
7990
  });
7775
7991
  //#endregion
7776
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/npm.js
7992
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/npm.js
7777
7993
  const DepRecord$1 = effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String));
7994
+ const PeerMetaRecord = effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({ optional: effect.Schema.optionalKey(effect.Schema.Boolean) })));
7778
7995
  const NpmPackageEntry = effect.Schema.Struct({
7779
7996
  name: effect.Schema.optionalKey(effect.Schema.String),
7780
7997
  version: effect.Schema.optionalKey(effect.Schema.String),
@@ -7785,8 +8002,22 @@ const NpmPackageEntry = effect.Schema.Struct({
7785
8002
  dependencies: DepRecord$1,
7786
8003
  devDependencies: DepRecord$1,
7787
8004
  peerDependencies: DepRecord$1,
8005
+ peerDependenciesMeta: PeerMetaRecord,
7788
8006
  optionalDependencies: DepRecord$1
7789
8007
  });
8008
+ /**
8009
+ * The version gate's own input: `lockfileVersion` and nothing else.
8010
+ *
8011
+ * The gate has to read the version *before* the shape decode, because the
8012
+ * shape it would decode against is the shape of a supported version. `packages`
8013
+ * is a required key here and a v1 tree does not have one, so a shape-first
8014
+ * order reports npm v1 as **malformed** rather than as **too old** — losing
8015
+ * exactly the distinction the `UnsupportedLockfileVersion` cause exists to
8016
+ * carry.
8017
+ *
8018
+ * @internal
8019
+ */
8020
+ const NpmVersionProbe = effect.Schema.Struct({ lockfileVersion: effect.Schema.Union([effect.Schema.Number, effect.Schema.String]) });
7790
8021
  const NpmLockfileRaw = effect.Schema.Struct({
7791
8022
  name: effect.Schema.optionalKey(effect.Schema.String),
7792
8023
  version: effect.Schema.optionalKey(effect.Schema.String),
@@ -7795,10 +8026,73 @@ const NpmLockfileRaw = effect.Schema.Struct({
7795
8026
  packages: effect.Schema.Record(effect.Schema.String, NpmPackageEntry)
7796
8027
  });
7797
8028
  const NODE_MODULES_PREFIX = "node_modules/";
8029
+ const NESTED_NODE_MODULES = "/node_modules/";
8030
+ /**
8031
+ * Where a `packages` key's package name starts: after the **last**
8032
+ * `node_modules/` segment, not the first.
8033
+ *
8034
+ * npm encodes the whole install position in the key, so
8035
+ * `node_modules/express/node_modules/debug` is *debug*, nested under express —
8036
+ * and `packages/lib/node_modules/react` is *react*, nested under a workspace
8037
+ * directory and carrying no `node_modules/` prefix at all. Returns `-1` for a
8038
+ * key that is not a package position (the root `""` entry, a workspace path
8039
+ * entry), which the caller skips.
8040
+ *
8041
+ * @internal
8042
+ */
8043
+ const packageNameIndex = (key) => {
8044
+ const nested = key.lastIndexOf(NESTED_NODE_MODULES);
8045
+ if (nested !== -1) return nested + 14;
8046
+ return key.startsWith(NODE_MODULES_PREFIX) ? 13 : -1;
8047
+ };
7798
8048
  /**
7799
- * Parse npm `package-lock.json` (v2/v3) content into the unified field
7800
- * bundle. Native `JSON.parse` inside `Effect.try` its throw on hostile
7801
- * input (including V8's `RangeError` on pathological depth) lands typed as
8049
+ * Resolve one entry's outgoing edges by replaying node resolution over the key
8050
+ * space: from the depending package's own directory, try
8051
+ * `<prefix>/node_modules/<name>`, then strip one path segment and try again,
8052
+ * out to the root — **deepest first**, first hit wins. That order is the whole
8053
+ * algorithm: outermost-first would return the hoisted copy and silently
8054
+ * mis-report every shadowed dependency.
8055
+ *
8056
+ * Only keys that actually exist in the lockfile are emitted, so an edge npm
8057
+ * did not record is omitted rather than invented.
8058
+ *
8059
+ * @internal
8060
+ */
8061
+ const resolveNpmEdges = (start, sections, packages) => {
8062
+ const names = /* @__PURE__ */ new Set();
8063
+ for (const section of sections) {
8064
+ if (!section) continue;
8065
+ for (const name of Object.keys(section)) if (name !== "") names.add(name);
8066
+ }
8067
+ if (names.size === 0) return {};
8068
+ const prefixes = [];
8069
+ for (let prefix = start;;) {
8070
+ prefixes.push(prefix);
8071
+ if (prefix === "") break;
8072
+ const slash = prefix.lastIndexOf("/");
8073
+ prefix = slash === -1 ? "" : prefix.slice(0, slash);
8074
+ }
8075
+ const edges = /* @__PURE__ */ new Map();
8076
+ for (const name of names) for (const prefix of prefixes) {
8077
+ const candidate = prefix === "" ? `${NODE_MODULES_PREFIX}${name}` : `${prefix}${NESTED_NODE_MODULES}${name}`;
8078
+ if (Object.hasOwn(packages, candidate)) {
8079
+ edges.set(name, candidate);
8080
+ break;
8081
+ }
8082
+ }
8083
+ return Object.fromEntries(edges);
8084
+ };
8085
+ const entrySections = (entry) => [
8086
+ entry?.dependencies,
8087
+ entry?.devDependencies,
8088
+ entry?.optionalDependencies,
8089
+ entry?.peerDependencies
8090
+ ];
8091
+ /**
8092
+ * Parse npm `package-lock.json` content into the unified field bundle —
8093
+ * `lockfileVersion` 3 and newer; v2 and older fail typed at validation.
8094
+ * Native `JSON.parse` inside `Effect.try` — its throw on hostile input
8095
+ * (including V8's `RangeError` on pathological depth) lands typed as
7802
8096
  * `stage: "syntax"`.
7803
8097
  *
7804
8098
  * @internal
@@ -7808,6 +8102,8 @@ const parseNpm = (content) => effect.Effect.gen(function* () {
7808
8102
  try: () => JSON.parse(content),
7809
8103
  catch: syntaxFailure
7810
8104
  });
8105
+ const probe = yield* effect.Schema.decodeUnknownEffect(NpmVersionProbe)(raw).pipe(effect.Effect.mapError(validationFailure));
8106
+ yield* requireLockfileVersion("npm", probe.lockfileVersion);
7811
8107
  const validated = yield* effect.Schema.decodeUnknownEffect(NpmLockfileRaw)(raw).pipe(effect.Effect.mapError(validationFailure));
7812
8108
  return yield* toFields$2(validated);
7813
8109
  });
@@ -7821,22 +8117,30 @@ const toFields$2 = (raw) => effect.Effect.gen(function* () {
7821
8117
  path: ".",
7822
8118
  dependencies: importerDependencies(rootEntry, (s) => ({ specifier: s }))
7823
8119
  }));
7824
- for (const [key, entry] of Object.entries(raw.packages)) if (key.startsWith(NODE_MODULES_PREFIX) && entry.link === true) {
7825
- const name = (entry.resolved !== void 0 ? raw.packages[entry.resolved] : void 0)?.name ?? entry.name ?? key.slice(13);
7826
- if (name !== "") workspaceNames.add(name);
8120
+ for (const [key, entry] of Object.entries(raw.packages)) {
8121
+ const nameIndex = packageNameIndex(key);
8122
+ if (nameIndex !== -1 && entry.link === true) {
8123
+ const name = (entry.resolved !== void 0 ? raw.packages[entry.resolved] : void 0)?.name ?? entry.name ?? key.slice(nameIndex);
8124
+ if (name !== "") workspaceNames.add(name);
8125
+ }
7827
8126
  }
7828
8127
  for (const [key, entry] of Object.entries(raw.packages)) {
7829
8128
  if (key === "") continue;
7830
- if (key.startsWith(NODE_MODULES_PREFIX) && entry.link === true) {
8129
+ const nameIndex = packageNameIndex(key);
8130
+ if (nameIndex === -1) continue;
8131
+ if (entry.link === true) {
7831
8132
  const resolved = entry.resolved;
7832
8133
  const wsEntry = resolved !== void 0 ? raw.packages[resolved] : void 0;
7833
- const name = wsEntry?.name ?? entry.name ?? key.slice(13);
8134
+ const name = wsEntry?.name ?? entry.name ?? key.slice(nameIndex);
7834
8135
  if (name === "") continue;
7835
8136
  packages.push(ResolvedPackage.make({
7836
8137
  name,
7837
8138
  version: wsEntry?.version ?? "0.0.0",
8139
+ instanceId: key,
7838
8140
  isWorkspace: true,
7839
- ...resolved !== void 0 ? { relativePath: resolved } : {}
8141
+ ...resolved !== void 0 ? { relativePath: resolved } : {},
8142
+ ...peerDeclarations(wsEntry?.peerDependencies, wsEntry?.peerDependenciesMeta),
8143
+ resolved: resolveNpmEdges(resolved !== void 0 && resolved !== "" ? resolved : key, entrySections(wsEntry), raw.packages)
7840
8144
  }));
7841
8145
  if (wsEntry) workspaceEntries.set(name, {
7842
8146
  ...wsEntry.dependencies ? { dependencies: wsEntry.dependencies } : {},
@@ -7848,16 +8152,19 @@ const toFields$2 = (raw) => effect.Effect.gen(function* () {
7848
8152
  path: resolved,
7849
8153
  dependencies: wsEntry ? importerDependencies(wsEntry, (s) => ({ specifier: s })) : []
7850
8154
  }));
7851
- } else if (key.startsWith(NODE_MODULES_PREFIX)) {
7852
- const name = key.slice(13);
8155
+ } else {
8156
+ const name = key.slice(nameIndex);
7853
8157
  if (name !== "" && entry.version !== void 0) {
7854
8158
  const integrity = yield* toIntegrityHash(entry.integrity);
7855
8159
  packages.push(ResolvedPackage.make({
7856
8160
  name,
7857
8161
  version: entry.version,
8162
+ instanceId: key,
7858
8163
  ...integrity !== void 0 ? { integrity } : {},
7859
8164
  isWorkspace: false,
7860
- dependencies: entry.dependencies ?? {}
8165
+ dependencies: entry.dependencies ?? {},
8166
+ ...peerDeclarations(entry.peerDependencies, entry.peerDependenciesMeta),
8167
+ resolved: resolveNpmEdges(key, entrySections(entry), raw.packages)
7861
8168
  }));
7862
8169
  }
7863
8170
  }
@@ -15550,7 +15857,7 @@ function deepEqualValues(a, b) {
15550
15857
  return false;
15551
15858
  }
15552
15859
  //#endregion
15553
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/documents.js
15860
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/documents.js
15554
15861
  /**
15555
15862
  * An empty YAML document composes to `null` (`Yaml.parseAll("")` is `[null]`,
15556
15863
  * and the trailing document of an env-only `pnpm-lock.yaml` is `null` too).
@@ -15620,7 +15927,7 @@ const selectSoleDocument = (content) => effect.Effect.gen(function* () {
15620
15927
  };
15621
15928
  });
15622
15929
  //#endregion
15623
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/pnpm.js
15930
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/pnpm.js
15624
15931
  const PnpmImporterDeps = effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({
15625
15932
  specifier: effect.Schema.String,
15626
15933
  version: effect.Schema.String
@@ -15631,6 +15938,18 @@ const PnpmImporter = effect.Schema.Struct({
15631
15938
  peerDependencies: PnpmImporterDeps,
15632
15939
  optionalDependencies: PnpmImporterDeps
15633
15940
  });
15941
+ /**
15942
+ * The version gate's own input: `lockfileVersion` and nothing else.
15943
+ *
15944
+ * The gate has to read the version *before* the shape decode, because the
15945
+ * shape it decodes against is the shape of a supported version. `importers` is
15946
+ * a required key here and a pre-v9 single-project lockfile has none — it
15947
+ * records its dependencies at the top level — so a shape-first order reports a
15948
+ * lockfile we reject for being too old as merely malformed instead.
15949
+ *
15950
+ * @internal
15951
+ */
15952
+ const PnpmVersionProbe = effect.Schema.Struct({ lockfileVersion: effect.Schema.Union([effect.Schema.String, effect.Schema.Number]) });
15634
15953
  const PnpmLockfileRaw = effect.Schema.Struct({
15635
15954
  lockfileVersion: effect.Schema.Union([effect.Schema.String, effect.Schema.Number]),
15636
15955
  settings: effect.Schema.optionalKey(effect.Schema.Struct({
@@ -15643,7 +15962,17 @@ const PnpmLockfileRaw = effect.Schema.Struct({
15643
15962
  version: effect.Schema.String
15644
15963
  })])))),
15645
15964
  importers: effect.Schema.Record(effect.Schema.String, PnpmImporter),
15646
- packages: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({ resolution: effect.Schema.optionalKey(effect.Schema.Struct({ integrity: effect.Schema.optionalKey(effect.Schema.String) })) })))
15965
+ packages: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({
15966
+ resolution: effect.Schema.optionalKey(effect.Schema.Struct({ integrity: effect.Schema.optionalKey(effect.Schema.String) })),
15967
+ peerDependencies: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String)),
15968
+ peerDependenciesMeta: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({ optional: effect.Schema.optionalKey(effect.Schema.Boolean) }))),
15969
+ dependencies: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String)),
15970
+ optionalDependencies: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String))
15971
+ }))),
15972
+ snapshots: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({
15973
+ dependencies: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String)),
15974
+ optionalDependencies: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String))
15975
+ })))
15647
15976
  });
15648
15977
  /**
15649
15978
  * Parse pnpm `pnpm-lock.yaml` content into the unified field bundle.
@@ -15663,10 +15992,103 @@ const PnpmLockfileRaw = effect.Schema.Struct({
15663
15992
  */
15664
15993
  const parsePnpm = (content) => effect.Effect.gen(function* () {
15665
15994
  const { document, documents } = yield* selectPnpmDocument(content);
15995
+ const probe = yield* effect.Schema.decodeUnknownEffect(PnpmVersionProbe)(document).pipe(effect.Effect.mapError(validationFailure));
15996
+ yield* requireLockfileVersion("pnpm", probe.lockfileVersion);
15666
15997
  const validated = yield* effect.Schema.decodeUnknownEffect(PnpmLockfileRaw)(document).pipe(effect.Effect.mapError(validationFailure));
15667
15998
  if (Object.keys(validated.importers).length === 0) return yield* effect.Effect.fail(framingFailure("noImporters", documents));
15668
15999
  return yield* toFields$1(validated);
15669
16000
  });
16001
+ /**
16002
+ * Resolve one instance's outgoing edges to instance ids.
16003
+ *
16004
+ * pnpm names a resolved dependency as `name` → `version`, where the version may
16005
+ * itself carry a peer suffix (`1.6.0(react@17.0.2)`); the referenced instance's
16006
+ * key is those two composed back together. The composition is *verified*
16007
+ * against the lockfile's own key set rather than trusted — the composed key is
16008
+ * v9's bare `name@version` and nothing else, because the format gate admits no
16009
+ * lockfile that spells keys the pre-v9 leading-slash way — and an edge that
16010
+ * matches nothing is **omitted**. That is what keeps a `link:`/`file:`
16011
+ * resolution, which names no instance in this lockfile, from becoming a
16012
+ * plausible lie.
16013
+ *
16014
+ * @internal
16015
+ */
16016
+ const resolveEdges = (sections, instanceIds) => {
16017
+ const edges = /* @__PURE__ */ new Map();
16018
+ const unnameable = /* @__PURE__ */ new Set();
16019
+ for (const section of sections) {
16020
+ if (!section) continue;
16021
+ for (const [name, version] of Object.entries(section)) {
16022
+ if (name === "") continue;
16023
+ if (version.startsWith(LINK_PREFIX)) {
16024
+ const target = resolveLinkTarget("", version.slice(LINK_PREFIX.length));
16025
+ if (target !== void 0 && instanceIds.has(target)) edges.set(name, target);
16026
+ else unnameable.add(name);
16027
+ continue;
16028
+ }
16029
+ const bare = `${name}@${version}`;
16030
+ if (instanceIds.has(bare)) edges.set(name, bare);
16031
+ else unnameable.add(name);
16032
+ }
16033
+ }
16034
+ return {
16035
+ resolved: Object.fromEntries(edges),
16036
+ unresolvedEdges: [...unnameable].sort()
16037
+ };
16038
+ };
16039
+ /** The protocol pnpm records a workspace-directory resolution under. @internal */
16040
+ const LINK_PREFIX = "link:";
16041
+ /**
16042
+ * Normalize a `link:` target against the linking importer's path, so a
16043
+ * workspace edge can name the workspace importer's instance id.
16044
+ * Total: a target that walks above the root yields `undefined`.
16045
+ *
16046
+ * @internal
16047
+ */
16048
+ const resolveLinkTarget = (importerPath, target) => {
16049
+ const segments = [];
16050
+ for (const segment of `${importerPath}/${target}`.split("/")) {
16051
+ if (segment === "" || segment === ".") continue;
16052
+ if (segment === "..") {
16053
+ if (segments.pop() === void 0) return void 0;
16054
+ continue;
16055
+ }
16056
+ segments.push(segment);
16057
+ }
16058
+ return segments.length === 0 ? void 0 : segments.join("/");
16059
+ };
16060
+ /**
16061
+ * Resolve one importer's outgoing edges. pnpm records `{ specifier, version }`
16062
+ * per importer dependency, where the version is either a registry version (the
16063
+ * instance-id composition {@link resolveEdges} performs) or a `link:` target
16064
+ * naming another importer — normalized against this importer's own path. Both
16065
+ * are checked against the lockfile's instance ids before being emitted.
16066
+ *
16067
+ * @internal
16068
+ */
16069
+ const resolveImporterEdges = (importer, importerPath, instanceIds) => {
16070
+ const edges = /* @__PURE__ */ new Map();
16071
+ const unnameable = /* @__PURE__ */ new Set();
16072
+ for (const group of importerDepGroups(importer)) {
16073
+ if (!group) continue;
16074
+ for (const [name, info] of Object.entries(group)) {
16075
+ if (name === "") continue;
16076
+ if (info.version.startsWith(LINK_PREFIX)) {
16077
+ const target = resolveLinkTarget(importerPath, info.version.slice(5));
16078
+ if (target !== void 0 && instanceIds.has(target)) edges.set(name, target);
16079
+ else unnameable.add(name);
16080
+ continue;
16081
+ }
16082
+ const bare = `${name}@${info.version}`;
16083
+ if (instanceIds.has(bare)) edges.set(name, bare);
16084
+ else unnameable.add(name);
16085
+ }
16086
+ }
16087
+ return {
16088
+ resolved: Object.fromEntries(edges),
16089
+ unresolvedEdges: [...unnameable].sort()
16090
+ };
16091
+ };
15670
16092
  const toVersionMap = (deps) => {
15671
16093
  if (!deps) return void 0;
15672
16094
  return Object.fromEntries(Object.entries(deps).map(([name, info]) => [name, info.specifier]));
@@ -15707,28 +16129,50 @@ const toFields$1 = (raw) => effect.Effect.gen(function* () {
15707
16129
  }
15708
16130
  for (const path of Object.keys(raw.importers)) if (path !== "." && path !== "") workspaceNames.add(path);
15709
16131
  const packages = [];
15710
- for (const importerPath of Object.keys(raw.importers)) {
16132
+ const snapshots = raw.snapshots;
16133
+ const instanceIds = /* @__PURE__ */ new Set([
16134
+ ...snapshots ? Object.keys(snapshots) : [],
16135
+ ...raw.packages ? Object.keys(raw.packages) : [],
16136
+ ...Object.keys(raw.importers)
16137
+ ]);
16138
+ const emitted = /* @__PURE__ */ new Set();
16139
+ for (const [importerPath, importer] of Object.entries(raw.importers)) {
15711
16140
  if (importerPath === "." || importerPath === "") continue;
15712
16141
  packages.push(ResolvedPackage.make({
15713
16142
  name: importerPath,
15714
16143
  version: "0.0.0",
16144
+ instanceId: importerPath,
15715
16145
  isWorkspace: true,
15716
- relativePath: importerPath
16146
+ relativePath: importerPath,
16147
+ ...resolveImporterEdges(importer, importerPath, instanceIds)
15717
16148
  }));
15718
16149
  }
15719
- if (raw.packages) for (const [key, pkg] of Object.entries(raw.packages)) {
15720
- const { plain: bare } = splitPeerSuffix(key);
16150
+ const emit = (instanceId, meta, edges) => effect.Effect.gen(function* () {
16151
+ const { plain: bare } = splitPeerSuffix(instanceId);
15721
16152
  const atIndex = bare.lastIndexOf("@");
15722
- if (atIndex <= 0) continue;
16153
+ if (atIndex <= 0) return;
15723
16154
  const name = bare.slice(0, atIndex);
15724
16155
  const version = bare.slice(atIndex + 1);
15725
- const integrity = yield* toIntegrityHash(pkg.resolution?.integrity);
16156
+ const integrity = yield* toIntegrityHash(meta?.resolution?.integrity);
16157
+ emitted.add(instanceId);
15726
16158
  packages.push(ResolvedPackage.make({
15727
16159
  name,
15728
16160
  version,
16161
+ instanceId,
15729
16162
  ...integrity !== void 0 ? { integrity } : {},
15730
- isWorkspace: false
16163
+ isWorkspace: false,
16164
+ ...peerDeclarations(meta?.peerDependencies, meta?.peerDependenciesMeta),
16165
+ ...resolveEdges(edges, instanceIds)
15731
16166
  }));
16167
+ });
16168
+ if (snapshots) for (const [key, snapshot] of Object.entries(snapshots)) {
16169
+ const plain = splitPeerSuffix(key).plain;
16170
+ yield* emit(key, raw.packages !== void 0 && Object.hasOwn(raw.packages, plain) ? raw.packages[plain] : void 0, [snapshot.dependencies, snapshot.optionalDependencies]);
16171
+ }
16172
+ const covered = new Set([...emitted].map((key) => splitPeerSuffix(key).plain));
16173
+ if (raw.packages) for (const [key, pkg] of Object.entries(raw.packages)) {
16174
+ if (covered.has(key)) continue;
16175
+ yield* emit(key, pkg, [pkg.dependencies, pkg.optionalDependencies]);
15732
16176
  }
15733
16177
  const workspaceDependencies = extractWorkspaceDeps(workspaceEntries, workspaceNames);
15734
16178
  const extension = PnpmExtension.make({
@@ -15745,7 +16189,7 @@ const toFields$1 = (raw) => effect.Effect.gen(function* () {
15745
16189
  };
15746
16190
  });
15747
16191
  //#endregion
15748
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/internal/yarn.js
16192
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/internal/yarn.js
15749
16193
  const YarnLockfileRaw = effect.Schema.Record(effect.Schema.String, effect.Schema.Unknown);
15750
16194
  const DepRecord = effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.String));
15751
16195
  const YarnEntry = effect.Schema.Struct({
@@ -15754,6 +16198,7 @@ const YarnEntry = effect.Schema.Struct({
15754
16198
  dependencies: DepRecord,
15755
16199
  devDependencies: DepRecord,
15756
16200
  peerDependencies: DepRecord,
16201
+ peerDependenciesMeta: effect.Schema.optionalKey(effect.Schema.Record(effect.Schema.String, effect.Schema.Struct({ optional: effect.Schema.optionalKey(effect.Schema.Boolean) }))),
15757
16202
  optionalDependencies: DepRecord,
15758
16203
  checksum: effect.Schema.optionalKey(effect.Schema.String),
15759
16204
  languageName: effect.Schema.optionalKey(effect.Schema.String),
@@ -15787,6 +16232,13 @@ const toFields = (lockfileVersion, decoded) => effect.Effect.gen(function* () {
15787
16232
  const packages = [];
15788
16233
  const workspaceNames = /* @__PURE__ */ new Set();
15789
16234
  const workspaceEntries = /* @__PURE__ */ new Map();
16235
+ const locators = /* @__PURE__ */ new Map();
16236
+ for (const [key, entry] of decoded) {
16237
+ const descriptors = key.split(", ");
16238
+ const locator = entry.resolution ?? descriptors[0];
16239
+ if (locator === void 0 || locator === "") continue;
16240
+ for (const descriptor of descriptors) if (descriptor !== "") locators.set(descriptor, locator);
16241
+ }
15790
16242
  for (const [key, entry] of decoded) if (entry.linkType === "soft") {
15791
16243
  const name = extractYarnPackageName(key);
15792
16244
  if (name !== void 0) workspaceNames.add(name);
@@ -15797,12 +16249,17 @@ const toFields = (lockfileVersion, decoded) => effect.Effect.gen(function* () {
15797
16249
  const isWorkspace = entry.linkType === "soft";
15798
16250
  const relativePath = isWorkspace ? extractYarnWorkspacePath(key) : void 0;
15799
16251
  const integrity = yield* toIntegrityHash(entry.checksum);
16252
+ const instanceId = entry.resolution ?? key.split(", ")[0] ?? "";
16253
+ if (instanceId === "") continue;
15800
16254
  packages.push(ResolvedPackage.make({
15801
16255
  name,
15802
16256
  version: entry.version ?? "0.0.0",
16257
+ instanceId,
15803
16258
  ...integrity !== void 0 ? { integrity } : {},
15804
16259
  isWorkspace,
15805
- ...relativePath !== void 0 ? { relativePath } : {}
16260
+ ...relativePath !== void 0 ? { relativePath } : {},
16261
+ ...peerDeclarations(entry.peerDependencies, entry.peerDependenciesMeta),
16262
+ ...resolveYarnEdges(entry, locators)
15806
16263
  }));
15807
16264
  if (isWorkspace) {
15808
16265
  const deps = cleanYarnDeps(entry.dependencies);
@@ -15825,6 +16282,46 @@ const toFields = (lockfileVersion, decoded) => effect.Effect.gen(function* () {
15825
16282
  };
15826
16283
  });
15827
16284
  /**
16285
+ * Resolve one entry's outgoing edges through the descriptor→locator index.
16286
+ *
16287
+ * A yarn dependency value is a *descriptor* range (`"npm:5.3.0"`), and the
16288
+ * lockfile keys enumerate exactly which descriptors resolve to which locator,
16289
+ * so the lookup is exact rather than reconstructed.
16290
+ *
16291
+ * **`devDependencies` is not a section a Berry lockfile has.** yarn folds a
16292
+ * workspace's dev declarations into the entry's `dependencies` map — the
16293
+ * lockfile a project produces is byte-identical whether a dependency is
16294
+ * declared under `dependencies` or `devDependencies` (probed against yarn
16295
+ * 4.9.1). Dev edges are therefore already resolved here; iterating
16296
+ * `entry.devDependencies` would be dead code, and the schema keeps the field
16297
+ * only as permissive scaffolding for hand-edited input.
16298
+ *
16299
+ * **Dependency edges only.** yarn resolves peers virtually — a peer-bearing
16300
+ * package gets a `@virtual:` locator per consumer, and this lockfile shape does
16301
+ * not record which one satisfied which peer. Emitting a peer edge here would
16302
+ * mean guessing, so peers are left out: an absent edge is a true statement, a
16303
+ * plausible one would not be.
16304
+ *
16305
+ * @internal
16306
+ */
16307
+ const resolveYarnEdges = (entry, locators) => {
16308
+ const edges = /* @__PURE__ */ new Map();
16309
+ const unnameable = /* @__PURE__ */ new Set();
16310
+ for (const section of [entry.dependencies, entry.optionalDependencies]) {
16311
+ if (!section) continue;
16312
+ for (const [name, range] of Object.entries(section)) {
16313
+ if (name === "") continue;
16314
+ const locator = locators.get(`${name}@${range}`);
16315
+ if (locator !== void 0) edges.set(name, locator);
16316
+ else unnameable.add(name);
16317
+ }
16318
+ }
16319
+ return {
16320
+ resolved: Object.fromEntries(edges),
16321
+ unresolvedEdges: [...unnameable].sort()
16322
+ };
16323
+ };
16324
+ /**
15828
16325
  * Extract the package name from a yarn lockfile key. Handles compound keys
15829
16326
  * (`"a@workspace:*, a@workspace:packages/a"`) via the first descriptor and
15830
16327
  * `@patch:` descriptors (which embed `@npm:` inside). Total: malformed keys
@@ -15868,7 +16365,7 @@ const cleanYarnDeps = (deps) => {
15868
16365
  return Object.fromEntries(Object.entries(deps).map(([name, value]) => [name, value.startsWith("npm:") ? value.slice(4) : value]));
15869
16366
  };
15870
16367
  //#endregion
15871
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/Lockfile.js
16368
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/Lockfile.js
15872
16369
  const EMPTY_IMPORTERS = [];
15873
16370
  /**
15874
16371
  * Failure of `Lockfile.parse`: the given content is not a valid lockfile of
@@ -16040,10 +16537,15 @@ var Lockfile = class Lockfile extends effect.Schema.Class("Lockfile")({
16040
16537
  return ResolvedPackage.make({
16041
16538
  name: realName,
16042
16539
  version: pkg.version,
16540
+ instanceId: pkg.instanceId,
16043
16541
  ...pkg.integrity !== void 0 ? { integrity: pkg.integrity } : {},
16044
16542
  isWorkspace: pkg.isWorkspace,
16045
16543
  relativePath: pkg.relativePath,
16046
- dependencies: pkg.dependencies
16544
+ dependencies: pkg.dependencies,
16545
+ peerDependencies: pkg.peerDependencies,
16546
+ peerDependenciesMeta: pkg.peerDependenciesMeta,
16547
+ resolved: pkg.resolved,
16548
+ unresolvedEdges: pkg.unresolvedEdges
16047
16549
  });
16048
16550
  });
16049
16551
  const workspaceDependencies = this.workspaceDependencies.map((dep) => {
@@ -16112,7 +16614,7 @@ var Lockfile = class Lockfile extends effect.Schema.Class("Lockfile")({
16112
16614
  }
16113
16615
  };
16114
16616
  //#endregion
16115
- //#region ../../node_modules/.pnpm/@effected+lockfiles@0.5.1_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_d53253b32eb6a388ea04dc81d5e132f1/node_modules/@effected/lockfiles/LockfileIntegrity.js
16617
+ //#region ../../node_modules/.pnpm/@effected+lockfiles@0.6.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__@effected+npm@0.11_060c8bbc0d868c806eb6e32fbf3c19ea/node_modules/@effected/lockfiles/LockfileIntegrity.js
16116
16618
  /**
16117
16619
  * The minimal manifest shape {@link LockfileIntegrity.compare} checks a
16118
16620
  * lockfile against: a package name plus the four optional dependency maps.
@@ -18925,7 +19427,7 @@ var Package = class Package extends effect.Schema.Class("Package")({
18925
19427
  }
18926
19428
  };
18927
19429
  //#endregion
18928
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspacePackage.js
19430
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspacePackage.js
18929
19431
  const EMPTY$1 = Object.freeze(Object.create(null));
18930
19432
  const EMPTY_MANIFEST = Object.freeze(Object.create(null));
18931
19433
  /**
@@ -19523,7 +20025,7 @@ var Walker$1 = class {
19523
20025
  static findRoot = findRoot$1;
19524
20026
  };
19525
20027
  //#endregion
19526
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceRoot.js
20028
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceRoot.js
19527
20029
  /**
19528
20030
  * The marker filenames {@link WorkspaceRoot} probes for, in priority order.
19529
20031
  *
@@ -19710,7 +20212,7 @@ var WorkspaceRoot = class WorkspaceRoot extends effect.Context.Service()("@effec
19710
20212
  static layerTest = (root) => effect.Layer.effect(WorkspaceRoot, WorkspaceRoot.makeTest(root)).pipe(effect.Layer.provide(effect.Path.layer));
19711
20213
  };
19712
20214
  //#endregion
19713
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/limits.js
20215
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/limits.js
19714
20216
  /**
19715
20217
  * Hard ceiling on directories the enumerator will visit for one pattern set.
19716
20218
  * Guards the pathological case a depth cap alone does not: a wide, shallow
@@ -19728,7 +20230,7 @@ const MAX_ENUMERATION_ENTRIES = 1e5;
19728
20230
  */
19729
20231
  const PRUNED_DIRECTORIES = /* @__PURE__ */ new Set([".git", "node_modules"]);
19730
20232
  //#endregion
19731
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/traverse.js
20233
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/traverse.js
19732
20234
  /** Directory names never descended into. */
19733
20235
  const isPruned = (entry) => PRUNED_DIRECTORIES.has(entry);
19734
20236
  /** Join root-relative POSIX segments; `""` is the root itself. */
@@ -19818,7 +20320,7 @@ var Traversal = class {
19818
20320
  }
19819
20321
  };
19820
20322
  //#endregion
19821
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/enumerate.js
20323
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/enumerate.js
19822
20324
  /** Strip a trailing slash from `GlobPattern.enumerationPrefix` to get a relative directory. */
19823
20325
  const baseOf = (pattern) => pattern.enumerationPrefix.replace(/\/$/, "");
19824
20326
  /**
@@ -19835,6 +20337,8 @@ const enumerate = (root, globs, options) => effect.Effect.gen(function* () {
19835
20337
  if (!isValidMaxDepth(maxDepth)) return yield* effect.Effect.die(/* @__PURE__ */ new Error(`enumerate: ${badMaxDepthMessage(maxDepth)}`));
19836
20338
  const isPackage = (absolute) => fs.exists(path.join(absolute, "package.json")).pipe(effect.Effect.orElseSucceed(() => false));
19837
20339
  const isDirectory = (absolute) => fs.stat(absolute).pipe(effect.Effect.map((info) => info.type === "Directory"), effect.Effect.orElseSucceed(() => false));
20340
+ const excludes = globs.excludes;
20341
+ const isExcluded = excludes.length === 0 ? (_) => false : (relative) => excludes.some((exclude) => exclude.matches(relative));
19838
20342
  const included = /* @__PURE__ */ new Map();
19839
20343
  /** A shared-traversal stop, materialized as this module's failure record. */
19840
20344
  const failureOf = (stop, pattern) => ({
@@ -19843,6 +20347,7 @@ const enumerate = (root, globs, options) => effect.Effect.gen(function* () {
19843
20347
  detail: stop.detail
19844
20348
  });
19845
20349
  for (const literal of globs.literals) {
20350
+ if (isExcluded(literal)) continue;
19846
20351
  const absolute = path.join(root, literal);
19847
20352
  if (yield* isPackage(absolute)) included.set(literal, absolute);
19848
20353
  }
@@ -19870,25 +20375,22 @@ const enumerate = (root, globs, options) => effect.Effect.gen(function* () {
19870
20375
  const absolute = path.join(frame.absolute, entry);
19871
20376
  if (!(yield* isDirectory(absolute))) continue;
19872
20377
  if (wildcard.crossesSegments && !traversal.admits(frame)) return yield* effect.Effect.fail(failureOf(traversal.depthStop(), wildcard.source));
19873
- if (wildcard.matches(relative) && (yield* isPackage(absolute))) included.set(relative, absolute);
20378
+ if (wildcard.matches(relative) && !isExcluded(relative) && (yield* isPackage(absolute))) included.set(relative, absolute);
19874
20379
  if (!wildcard.crossesSegments) continue;
19875
20380
  traversal.push(frame, relative, absolute);
19876
20381
  }
19877
20382
  }
19878
20383
  }
19879
20384
  const results = [];
19880
- for (const [relativePath, absolute] of included) {
19881
- if (globs.excludes.some((exclude) => exclude.matches(relativePath))) continue;
19882
- results.push({
19883
- relativePath,
19884
- path: absolute
19885
- });
19886
- }
20385
+ for (const [relativePath, absolute] of included) results.push({
20386
+ relativePath,
20387
+ path: absolute
20388
+ });
19887
20389
  results.sort((a, b) => a.relativePath < b.relativePath ? -1 : a.relativePath > b.relativePath ? 1 : 0);
19888
20390
  return results;
19889
20391
  });
19890
20392
  //#endregion
19891
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/patterns.js
20393
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/patterns.js
19892
20394
  const stringsOf = (value) => Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : void 0;
19893
20395
  /** The `packages:` list of a `pnpm-workspace.yaml` document. Total on a parsed document. */
19894
20396
  const pnpmPatternsOf = (document) => {
@@ -19945,7 +20447,7 @@ const readPatterns = (root) => effect.Effect.gen(function* () {
19945
20447
  return manifestPatternsOf(manifest);
19946
20448
  });
19947
20449
  //#endregion
19948
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceDiscovery.js
20450
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceDiscovery.js
19949
20451
  /**
19950
20452
  * Raised when a workspace member's `package.json` cannot be read, parsed, or
19951
20453
  * used — it is missing, malformed, or lacks a `name` or `version`.
@@ -20401,7 +20903,7 @@ var WorkspaceDiscovery = class WorkspaceDiscovery extends effect.Context.Service
20401
20903
  };
20402
20904
  const isStringRecord$2 = (value) => value !== null && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((entry) => typeof entry === "string");
20403
20905
  //#endregion
20404
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/DependencyGraph.js
20906
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/DependencyGraph.js
20405
20907
  /**
20406
20908
  * Raised when the workspace dependency graph cannot be topologically ordered
20407
20909
  * because it contains a cycle.
@@ -24097,7 +24599,7 @@ var Git = class Git extends effect.Context.Service()("@effected/git/Git") {
24097
24599
  static layerTest = (overrides = {}) => effect.Layer.succeed(Git, Git.makeTest(overrides));
24098
24600
  };
24099
24601
  //#endregion
24100
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/ChangeDetector.js
24602
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/ChangeDetector.js
24101
24603
  /**
24102
24604
  * Which git refs to compare, and whether to fold in the working tree.
24103
24605
  *
@@ -24353,7 +24855,7 @@ function resolveFromCatalog(catalogs, wantedDependency) {
24353
24855
  };
24354
24856
  }
24355
24857
  //#endregion
24356
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/catalogs.js
24858
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/catalogs.js
24357
24859
  /** Project a pnpm-workspace manifest's `catalog` / `catalogs` fields into a `Catalogs` map. */
24358
24860
  const inlineCatalogs = (manifest) => {
24359
24861
  if (manifest.catalog === void 0 && manifest.catalogs === void 0) return {};
@@ -24416,8 +24918,12 @@ const rangeOf = (catalogs, dependency, specifier) => {
24416
24918
  unused: () => void 0
24417
24919
  });
24418
24920
  };
24419
- //#endregion
24420
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/ConfigDependencyHooks.js
24921
+ /** Internal alias, kept short at the many call sites in this module. */
24922
+ const NO_PEER_RULES = Object.freeze({
24923
+ allowedVersions: Object.freeze({}),
24924
+ ignoreMissing: Object.freeze([]),
24925
+ allowAny: Object.freeze([])
24926
+ });
24421
24927
  /** Whether `value` is a non-null, non-array object. */
24422
24928
  const isObject$2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
24423
24929
  /**
@@ -24445,7 +24951,7 @@ const moduleNotFoundUrl = (cause) => isObject$2(cause) && cause.code === "ERR_MO
24445
24951
  */
24446
24952
  const hasTraversalSegment = (name) => name.split(/[/\\]/).includes("..");
24447
24953
  /** Turn the seed record into the pnpm hook config, with the default catalog split out under `catalog`. */
24448
- const seedToConfig = (seed) => {
24954
+ const seedToConfig = (seed, rules) => {
24449
24955
  const catalogs = {};
24450
24956
  let catalog = {};
24451
24957
  for (const [name, entries] of Object.entries(seed)) if (name === "default") catalog = { ...entries };
@@ -24454,7 +24960,8 @@ const seedToConfig = (seed) => {
24454
24960
  catalog,
24455
24961
  catalogs,
24456
24962
  minimumReleaseAge: void 0,
24457
- minimumReleaseAgeExclude: void 0
24963
+ minimumReleaseAgeExclude: void 0,
24964
+ peerDependencyRules: rules
24458
24965
  };
24459
24966
  };
24460
24967
  /** A finite number if `value` is one, else the prior threaded value — a garbage age is dropped, not fatal. */
@@ -24479,10 +24986,33 @@ const configOf = (value, fallback) => {
24479
24986
  catalog: isObject$2(value.catalog) ? value.catalog : fallback.catalog,
24480
24987
  catalogs: isObject$2(value.catalogs) ? value.catalogs : fallback.catalogs,
24481
24988
  minimumReleaseAge: finiteNumberOr(value.minimumReleaseAge, fallback.minimumReleaseAge),
24482
- minimumReleaseAgeExclude: stringArrayOr(value.minimumReleaseAgeExclude, fallback.minimumReleaseAgeExclude)
24989
+ minimumReleaseAgeExclude: stringArrayOr(value.minimumReleaseAgeExclude, fallback.minimumReleaseAgeExclude),
24990
+ peerDependencyRules: peerRulesOr(value.peerDependencyRules, fallback.peerDependencyRules)
24483
24991
  };
24484
24992
  };
24485
24993
  /**
24994
+ * A peer-rules block if `value` is one, else the prior threaded value — a
24995
+ * malformed block is dropped, not fatal, matching the other slices.
24996
+ *
24997
+ * Each axis is normalized independently: a hook that rewrites `allowedVersions`
24998
+ * and leaves `ignoreMissing` alone must not blank the latter.
24999
+ */
25000
+ const stringRecordOr = (value, fallback) => isObject$2(value) && Object.values(value).every((entry) => typeof entry === "string") ? value : fallback;
25001
+ const peerRulesOr = (value, fallback) => {
25002
+ if (!isObject$2(value)) return fallback;
25003
+ const allowed = stringRecordOr(value.allowedVersions, fallback?.allowedVersions);
25004
+ const ignoreMissing = stringArrayOr(value.ignoreMissing, fallback?.ignoreMissing);
25005
+ const allowAny = stringArrayOr(value.allowAny, fallback?.allowAny);
25006
+ if (allowed === void 0 && ignoreMissing === void 0 && allowAny === void 0) return fallback;
25007
+ return {
25008
+ allowedVersions: allowed ?? {},
25009
+ ignoreMissing: ignoreMissing ?? [],
25010
+ allowAny: allowAny ?? []
25011
+ };
25012
+ };
25013
+ /** Project the threaded config's rules into the slice, defaulting every axis to empty. */
25014
+ const peerRulesOf = (config) => config.peerDependencyRules ?? NO_PEER_RULES;
25015
+ /**
24486
25016
  * Project the threaded config's release-age keys into a partial gate
24487
25017
  * contribution, omitting a key the hooks never set (never an explicit
24488
25018
  * `undefined` — the fields are `optionalKey`).
@@ -24535,13 +25065,23 @@ const updateConfigOf = (mod) => {
24535
25065
  * noise on stdout.
24536
25066
  */
24537
25067
  const REPLAY_SCRIPT = `
24538
- const [root, seedJson, ...names] = process.argv.slice(1);
25068
+ const [root, seedJson, rulesJson, ...names] = process.argv.slice(1);
24539
25069
  const { pathToFileURL } = await import("node:url");
24540
25070
  const { join } = await import("node:path");
24541
25071
  const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
24542
25072
  const finiteNumberOr = (value, fallback) => (typeof value === "number" && Number.isFinite(value) ? value : fallback);
24543
25073
  const stringArrayOr = (value, fallback) =>
24544
25074
  Array.isArray(value) && value.every((entry) => typeof entry === "string") ? value : fallback;
25075
+ const stringRecordOr = (value, fallback) =>
25076
+ isObject(value) && Object.values(value).every((entry) => typeof entry === "string") ? value : fallback;
25077
+ const peerRulesOr = (value, fallback) => {
25078
+ if (!isObject(value)) return fallback;
25079
+ const allowed = stringRecordOr(value.allowedVersions, fallback && fallback.allowedVersions);
25080
+ const ignoreMissing = stringArrayOr(value.ignoreMissing, fallback && fallback.ignoreMissing);
25081
+ const allowAny = stringArrayOr(value.allowAny, fallback && fallback.allowAny);
25082
+ if (allowed === undefined && ignoreMissing === undefined && allowAny === undefined) return fallback;
25083
+ return { allowedVersions: allowed || {}, ignoreMissing: ignoreMissing || [], allowAny: allowAny || [] };
25084
+ };
24545
25085
  const configOf = (value, fallback) =>
24546
25086
  isObject(value)
24547
25087
  ? {
@@ -24549,6 +25089,7 @@ const configOf = (value, fallback) =>
24549
25089
  catalogs: isObject(value.catalogs) ? value.catalogs : fallback.catalogs,
24550
25090
  minimumReleaseAge: finiteNumberOr(value.minimumReleaseAge, fallback.minimumReleaseAge),
24551
25091
  minimumReleaseAgeExclude: stringArrayOr(value.minimumReleaseAgeExclude, fallback.minimumReleaseAgeExclude),
25092
+ peerDependencyRules: peerRulesOr(value.peerDependencyRules, fallback.peerDependencyRules),
24552
25093
  }
24553
25094
  : fallback;
24554
25095
  const failure = (name, cause) => ({
@@ -24564,7 +25105,13 @@ const replay = async () => {
24564
25105
  if (name === "default") catalog = { ...entries };
24565
25106
  else catalogs[name] = { ...entries };
24566
25107
  }
24567
- let config = { catalog, catalogs, minimumReleaseAge: undefined, minimumReleaseAgeExclude: undefined };
25108
+ let config = {
25109
+ catalog,
25110
+ catalogs,
25111
+ minimumReleaseAge: undefined,
25112
+ minimumReleaseAgeExclude: undefined,
25113
+ peerDependencyRules: JSON.parse(rulesJson),
25114
+ };
24568
25115
  for (const name of names) {
24569
25116
  let loaded;
24570
25117
  let found = false;
@@ -24665,9 +25212,10 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24665
25212
  * config dependency. The default {@link WorkspaceCatalogs} layer wires this, so
24666
25213
  * the default catalog path provably executes no config-dependency code.
24667
25214
  */
24668
- static layerNoop = effect.Layer.succeed(ConfigDependencyHooks, { inject: (_root, _configDependencies, seed) => effect.Effect.succeed({
25215
+ static layerNoop = effect.Layer.succeed(ConfigDependencyHooks, { inject: (_root, _configDependencies, seed, rules) => effect.Effect.succeed({
24669
25216
  catalogs: seed,
24670
- releaseAge: {}
25217
+ releaseAge: {},
25218
+ peerDependencyRules: rules ?? NO_PEER_RULES
24671
25219
  }) });
24672
25220
  /**
24673
25221
  * The live layer: dynamically imports each config dependency's `pnpmfile.cjs`
@@ -24685,13 +25233,14 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24685
25233
  * import, so this layer runs on either runtime. Only ever wired by
24686
25234
  * `WorkspaceCatalogs.layerWithConfigDependencies`.
24687
25235
  */
24688
- static layerLive = effect.Layer.succeed(ConfigDependencyHooks, { inject: (root, configDependencies, seed) => effect.Effect.gen(function* () {
25236
+ static layerLive = effect.Layer.succeed(ConfigDependencyHooks, { inject: (root, configDependencies, seed, rules) => effect.Effect.gen(function* () {
24689
25237
  const names = Object.keys(configDependencies);
24690
25238
  if (names.length === 0) return {
24691
25239
  catalogs: seed,
24692
- releaseAge: {}
25240
+ releaseAge: {},
25241
+ peerDependencyRules: rules ?? NO_PEER_RULES
24693
25242
  };
24694
- let config = seedToConfig(seed);
25243
+ let config = seedToConfig(seed, rules);
24695
25244
  for (const name of names) {
24696
25245
  if (hasTraversalSegment(name)) return yield* effect.Effect.fail(new CatalogAssemblyError({
24697
25246
  source: "hooks",
@@ -24737,7 +25286,8 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24737
25286
  }
24738
25287
  return {
24739
25288
  catalogs: configToEntries(config),
24740
- releaseAge: releaseAgeOf(config)
25289
+ releaseAge: releaseAgeOf(config),
25290
+ peerDependencyRules: peerRulesOf(config)
24741
25291
  };
24742
25292
  }) });
24743
25293
  /**
@@ -24793,11 +25343,12 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24793
25343
  */
24794
25344
  static layerSubprocess = effect.Layer.effect(ConfigDependencyHooks, effect.Effect.gen(function* () {
24795
25345
  const spawner = yield* effect_unstable_process.ChildProcessSpawner.ChildProcessSpawner;
24796
- return { inject: (root, configDependencies, seed) => effect.Effect.gen(function* () {
25346
+ return { inject: (root, configDependencies, seed, rules) => effect.Effect.gen(function* () {
24797
25347
  const names = Object.keys(configDependencies);
24798
25348
  if (names.length === 0) return {
24799
25349
  catalogs: seed,
24800
- releaseAge: {}
25350
+ releaseAge: {},
25351
+ peerDependencyRules: rules ?? NO_PEER_RULES
24801
25352
  };
24802
25353
  for (const name of names) if (hasTraversalSegment(name)) return yield* effect.Effect.fail(new CatalogAssemblyError({
24803
25354
  source: "hooks",
@@ -24810,6 +25361,7 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24810
25361
  REPLAY_SCRIPT,
24811
25362
  root,
24812
25363
  JSON.stringify(seed),
25364
+ JSON.stringify(rules ?? NO_PEER_RULES),
24813
25365
  ...names
24814
25366
  ]);
24815
25367
  const payload = yield* Run.jsonLine(command, ReplayPayload, { timeout: REPLAY_TIMEOUT }).pipe(effect.Effect.provideService(effect_unstable_process.ChildProcessSpawner.ChildProcessSpawner, spawner), effect.Effect.catch((cause) => effect.Effect.fail(new CatalogAssemblyError({
@@ -24822,16 +25374,17 @@ var ConfigDependencyHooks = class ConfigDependencyHooks extends effect.Context.S
24822
25374
  path: payload.name ?? root,
24823
25375
  cause: replayFailureCause(payload)
24824
25376
  }));
24825
- const config = configOf(payload.config, seedToConfig(seed));
25377
+ const config = configOf(payload.config, seedToConfig(seed, rules));
24826
25378
  return {
24827
25379
  catalogs: configToEntries(config),
24828
- releaseAge: releaseAgeOf(config)
25380
+ releaseAge: releaseAgeOf(config),
25381
+ peerDependencyRules: peerRulesOf(config)
24829
25382
  };
24830
25383
  }) };
24831
25384
  }));
24832
25385
  };
24833
25386
  //#endregion
24834
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/PackageManagerName.js
25387
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/PackageManagerName.js
24835
25388
  /**
24836
25389
  * The four package managers this package understands.
24837
25390
  *
@@ -25206,7 +25759,7 @@ var PackageManagerDetector = class PackageManagerDetector extends effect.Context
25206
25759
  static layerTest = (overrides = {}) => effect.Layer.succeed(PackageManagerDetector, PackageManagerDetector.makeTest(overrides));
25207
25760
  };
25208
25761
  //#endregion
25209
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/LockfileReader.js
25762
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/LockfileReader.js
25210
25763
  /**
25211
25764
  * Raised when the workspace's lockfile cannot be read off disk.
25212
25765
  *
@@ -25386,7 +25939,7 @@ var LockfileReader = class LockfileReader extends effect.Context.Service()("@eff
25386
25939
  static layerTest = (overrides = {}) => effect.Layer.succeed(LockfileReader, LockfileReader.makeTest(overrides));
25387
25940
  };
25388
25941
  //#endregion
25389
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/Publishability.js
25942
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/Publishability.js
25390
25943
  /** The public npm registry, used when `publishConfig.registry` says nothing. */
25391
25944
  const DEFAULT_REGISTRY = "https://registry.npmjs.org/";
25392
25945
  /**
@@ -25545,7 +26098,7 @@ var PublishabilityDetector = class extends effect.Context.Service()("@effected/w
25545
26098
  static layerNone = effect.Layer.succeed(this, this.none);
25546
26099
  };
25547
26100
  //#endregion
25548
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/importerVersions.js
26101
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/internal/importerVersions.js
25549
26102
  /**
25550
26103
  * Strip pnpm's peer-disambiguation suffix from a recorded importer version.
25551
26104
  *
@@ -25631,7 +26184,7 @@ const unanimousVersionOf = (index, dependency) => {
25631
26184
  return agreed;
25632
26185
  };
25633
26186
  //#endregion
25634
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceCatalogs.js
26187
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceCatalogs.js
25635
26188
  /**
25636
26189
  * An immutable, fully-normalized catalog collection — the one catalog
25637
26190
  * resolution semantic in the package.
@@ -25835,6 +26388,41 @@ const inlineReleaseAge = (document) => {
25835
26388
  cause
25836
26389
  })));
25837
26390
  };
26391
+ /**
26392
+ * The `peerDependencyRules` a `pnpm-workspace.yaml` declares inline — the half
26393
+ * `pnpm:export` materializes into the file, as opposed to the half a config
26394
+ * dependency injects at replay time.
26395
+ *
26396
+ * @remarks
26397
+ * **Tolerant, unlike the catalog blocks**, and the asymmetry is deliberate: a
26398
+ * malformed catalog block must hard-fail because a silently-empty catalog makes
26399
+ * every dependency look newly added, whereas a malformed rules block costs only
26400
+ * suppression — the failure mode is reporting a peer pnpm would have hidden,
26401
+ * which is visible and safe. Failing the whole assembly over it would take the
26402
+ * catalogs down with it.
26403
+ *
26404
+ * Every axis is read independently, so a malformed `ignoreMissing` does not
26405
+ * discard a well-formed `allowedVersions`.
26406
+ */
26407
+ const EMPTY_PEER_RULES = {
26408
+ allowedVersions: {},
26409
+ ignoreMissing: [],
26410
+ allowAny: []
26411
+ };
26412
+ const inlinePeerDependencyRules = (document) => {
26413
+ if (!isObject$1(document) || !isObject$1(document.peerDependencyRules)) return EMPTY_PEER_RULES;
26414
+ const block = document.peerDependencyRules;
26415
+ const allowedVersions = {};
26416
+ if (isObject$1(block.allowedVersions)) {
26417
+ for (const [key, value] of Object.entries(block.allowedVersions)) if (typeof value === "string") allowedVersions[key] = value;
26418
+ }
26419
+ const strings = (value) => Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
26420
+ return {
26421
+ allowedVersions,
26422
+ ignoreMissing: strings(block.ignoreMissing),
26423
+ allowAny: strings(block.allowAny)
26424
+ };
26425
+ };
25838
26426
  /** A hard-fail catalog-assembly failure naming the malformed part of a `workspaces` field. */
25839
26427
  const malformed = (source, path, detail) => new CatalogAssemblyError({
25840
26428
  source,
@@ -25967,6 +26555,7 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
25967
26555
  let injected;
25968
26556
  let inlineGate = {};
25969
26557
  let hookGate = {};
26558
+ let peerDependencyRules = EMPTY_PEER_RULES;
25970
26559
  if (hasPnpmWorkspace) {
25971
26560
  const text = yield* fs.readFileString(workspaceYaml).pipe(effect.Effect.mapError((cause) => new CatalogAssemblyError({
25972
26561
  source: "manifest",
@@ -25981,15 +26570,17 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
25981
26570
  yield* validatePnpmWorkspaceCatalogs(document);
25982
26571
  inline = CatalogSet.fromCatalogs(inlineCatalogs(catalogBlocksOf(document)));
25983
26572
  inlineGate = yield* inlineReleaseAge(document);
25984
- const injection = yield* hooks.inject(root, configDependenciesOf(document), inline.entries);
26573
+ const injection = yield* hooks.inject(root, configDependenciesOf(document), inline.entries, inlinePeerDependencyRules(document));
25985
26574
  injected = CatalogSet.fromCatalogs(injection.catalogs);
25986
26575
  hookGate = injection.releaseAge;
26576
+ peerDependencyRules = injection.peerDependencyRules;
25987
26577
  } else {
25988
26578
  const manifestPath = path.join(root, "package.json");
25989
26579
  if (!(yield* probeExists(manifestPath))) return {
25990
26580
  catalogs: fromLockfile,
25991
26581
  releaseAgeGate: ReleaseAgeGate.combine(),
25992
- importerVersions
26582
+ importerVersions,
26583
+ peerDependencyRules: EMPTY_PEER_RULES
25993
26584
  };
25994
26585
  const text = yield* fs.readFileString(manifestPath).pipe(effect.Effect.mapError((cause) => new CatalogAssemblyError({
25995
26586
  source: "manifest",
@@ -26009,7 +26600,8 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
26009
26600
  return {
26010
26601
  catalogs: assembled,
26011
26602
  releaseAgeGate,
26012
- importerVersions
26603
+ importerVersions,
26604
+ peerDependencyRules
26013
26605
  };
26014
26606
  });
26015
26607
  const [resolveOnce, invalidate] = yield* effect.Effect.cachedInvalidateWithTTL(assemble, effect.Duration.infinity);
@@ -26021,6 +26613,9 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
26021
26613
  resolveSpecifier: effect.Effect.fn("WorkspaceCatalogs.resolveSpecifier")(function* (dependency, specifier) {
26022
26614
  return (yield* memo).catalogs.resolveSpecifier(dependency, specifier);
26023
26615
  }),
26616
+ peerDependencyRules: effect.Effect.fn("WorkspaceCatalogs.peerDependencyRules")(function* () {
26617
+ return (yield* memo).peerDependencyRules;
26618
+ }),
26024
26619
  releaseAgeGate: effect.Effect.fn("WorkspaceCatalogs.releaseAgeGate")(function* () {
26025
26620
  return (yield* memo).releaseAgeGate;
26026
26621
  }),
@@ -26107,6 +26702,7 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
26107
26702
  return {
26108
26703
  set: () => unstubbed$1("set"),
26109
26704
  resolveSpecifier: set !== void 0 ? (dependency, specifier) => effect.Effect.map(set(), (catalogs) => catalogs.resolveSpecifier(dependency, specifier)) : () => unstubbed$1("resolveSpecifier"),
26705
+ peerDependencyRules: () => unstubbed$1("peerDependencyRules"),
26110
26706
  releaseAgeGate: () => unstubbed$1("releaseAgeGate"),
26111
26707
  importerVersions: () => unstubbed$1("importerVersions"),
26112
26708
  ...overrides
@@ -26158,7 +26754,7 @@ var WorkspaceCatalogs = class WorkspaceCatalogs extends effect.Context.Service()
26158
26754
  }));
26159
26755
  };
26160
26756
  //#endregion
26161
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceStateSnapshot.js
26757
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceStateSnapshot.js
26162
26758
  const EMPTY = Object.freeze(Object.create(null));
26163
26759
  const DependencyMap = effect.Schema.Record(effect.Schema.String, effect.Schema.String).pipe(effect.Schema.withDecodingDefaultKey(effect.Effect.succeed(EMPTY)), effect.Schema.withConstructorDefault(effect.Effect.succeed(EMPTY)));
26164
26760
  /**
@@ -26381,7 +26977,7 @@ var WorkspaceStateSnapshot = class extends effect.Schema.Class("WorkspaceStateSn
26381
26977
  }
26382
26978
  };
26383
26979
  //#endregion
26384
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceSnapshots.js
26980
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/WorkspaceSnapshots.js
26385
26981
  /** Whether `value` is a non-null, non-array object. */
26386
26982
  const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
26387
26983
  /** Whether every value in a record is a string — a usable dependency map. */
@@ -26658,7 +27254,7 @@ var WorkspaceSnapshots = class WorkspaceSnapshots extends effect.Context.Service
26658
27254
  static layerTest = (overrides = {}) => effect.Layer.succeed(WorkspaceSnapshots, WorkspaceSnapshots.makeTest(overrides));
26659
27255
  };
26660
27256
  //#endregion
26661
- //#region ../../node_modules/.pnpm/@effected+workspaces@0.14.2_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/Workspaces.js
27257
+ //#region ../../node_modules/.pnpm/@effected+workspaces@0.15.0_@effected+jsonc@0.7.0_effect@4.0.0-rc.109__effect@4.0.0-rc.109/node_modules/@effected/workspaces/Workspaces.js
26662
27258
  const compose = (options, catalogsFactory) => {
26663
27259
  const roots = WorkspaceRoot.layer;
26664
27260
  const detector = PackageManagerDetector.layer;