@effect-vfs/core 0.6.0 → 0.7.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.
Files changed (39) hide show
  1. package/README.md +14 -9
  2. package/dist/BytePath.d.ts +2 -1
  3. package/dist/BytePath.d.ts.map +1 -1
  4. package/dist/LiveVolume.d.ts +6 -3
  5. package/dist/LiveVolume.d.ts.map +1 -1
  6. package/dist/LiveVolume.js +2 -0
  7. package/dist/Snapshot.d.ts +2 -1
  8. package/dist/Snapshot.d.ts.map +1 -1
  9. package/dist/Snapshot.js +2 -1
  10. package/dist/Testing.d.ts +9 -5
  11. package/dist/Testing.d.ts.map +1 -1
  12. package/dist/Testing.js +7 -18
  13. package/dist/VfsError.d.ts +2 -1
  14. package/dist/VfsError.d.ts.map +1 -1
  15. package/dist/VfsError.js +2 -1
  16. package/dist/VirtualFileSystem.d.ts +89 -47
  17. package/dist/VirtualFileSystem.d.ts.map +1 -1
  18. package/dist/VirtualFileSystem.js +62 -29
  19. package/dist/internal/canonicalBase64.js +3 -3
  20. package/dist/internal/fixture.d.ts +1 -1
  21. package/dist/internal/fixture.d.ts.map +1 -1
  22. package/dist/internal/overlayDiff.d.ts.map +1 -1
  23. package/dist/internal/overlayDiff.js +6 -14
  24. package/dist/internal/path.d.ts.map +1 -1
  25. package/dist/internal/path.js +3 -3
  26. package/dist/internal/snapshotDelta.d.ts.map +1 -1
  27. package/dist/internal/snapshotDelta.js +9 -15
  28. package/dist/internal/tree.d.ts.map +1 -1
  29. package/dist/internal/tree.js +14 -14
  30. package/dist/internal/virtualFileSystem.d.ts +13 -7
  31. package/dist/internal/virtualFileSystem.d.ts.map +1 -1
  32. package/dist/internal/virtualFileSystem.js +442 -399
  33. package/dist/internal/volumeState.d.ts +3 -2
  34. package/dist/internal/volumeState.d.ts.map +1 -1
  35. package/dist/internal/volumeState.js +28 -30
  36. package/package.json +7 -7
  37. package/dist/internal/stagedState.d.ts +0 -18
  38. package/dist/internal/stagedState.d.ts.map +0 -1
  39. package/dist/internal/stagedState.js +0 -18
@@ -1,5 +1,6 @@
1
+ import * as Arr from "effect/Array";
1
2
  import * as Data from "effect/Data";
2
- import * as Encoding from "effect/Encoding";
3
+ import * as Hex from "effect/encoding/Hex";
3
4
  import * as Order from "effect/Order";
4
5
  import * as Predicate from "effect/Predicate";
5
6
  import { bytesOrder, sameBytes } from "./bytes.js";
@@ -22,7 +23,7 @@ const tagOrder = {
22
23
  Renamed: 3,
23
24
  Updated: 4
24
25
  };
25
- const key = Encoding.encodeHex;
26
+ const key = Hex.encode;
26
27
  const sourcePath = (change) => Predicate.isTagged("Renamed")(change) ? change.from : change.path;
27
28
  const changeOrder = Order.combine(Order.mapInput(bytesOrder, sourcePath), Order.mapInput(Order.Number, (change) => tagOrder[change._tag]));
28
29
  const differences = (before, after, includeTimestamps) => Object.freeze(differenceOrder.filter((field) => {
@@ -59,16 +60,8 @@ export const compareOverlay = (base, current, includeTimestamps = false) => {
59
60
  const afterEntries = currentLineages.get(lineage);
60
61
  if (afterEntries === undefined)
61
62
  continue;
62
- const removed = [];
63
- for (const [pathKey, entry] of beforeEntries) {
64
- if (!afterEntries.has(pathKey))
65
- removed.push(entry);
66
- }
67
- const added = [];
68
- for (const [pathKey, entry] of afterEntries) {
69
- if (!beforeEntries.has(pathKey))
70
- added.push(entry);
71
- }
63
+ const removed = Arr.filter(beforeEntries, ([pathKey]) => !afterEntries.has(pathKey)).map(([, entry]) => entry);
64
+ const added = Arr.filter(afterEntries, ([pathKey]) => !beforeEntries.has(pathKey)).map(([, entry]) => entry);
72
65
  if (removed.length !== 1 || added.length !== 1)
73
66
  continue;
74
67
  const before = removed[0];
@@ -111,7 +104,6 @@ export const compareOverlay = (base, current, includeTimestamps = false) => {
111
104
  changes.push(RawOverlayChange.Added({ path: after.path.slice(), kind: after.kind }));
112
105
  }
113
106
  }
114
- changes.sort(changeOrder);
115
107
  // Every record owns its byte buffers and is frozen, so callers may wrap paths without copying.
116
- return Object.freeze(changes.map((change) => Object.freeze(change)));
108
+ return Object.freeze(Arr.sort(changes, changeOrder).map((change) => Object.freeze(change)));
117
109
  };
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/internal/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,gBAAgB;AAChB,eAAO,MAAM,SAAS,OAAO,CAAA;AAC7B,gBAAgB;AAChB,eAAO,MAAM,OAAO,OAAO,CAAA;AAC3B,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAS,CAAA;AACjC,gBAAgB;AAChB,eAAO,MAAM,UAAU,KAAK,CAAA;AAE5B,gBAAgB;AAChB,eAAO,MAAM,QAAQ,IAAI,CAAA;AACzB,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,gBAAgB;AAChB,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAU,UAAU,KAAG,OAEuE,CAAA;AAEtH,gBAAgB;AAChB,eAAO,MAAM,SAAS,yBAA+B,CAAA;AAErD,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,UAAU,QAAQ,UAAU,KAAG,UAS/D,CAAA;AAGD,gBAAgB;AAChB,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,SAAS,KAAG,IAAI,IAAI,SAAS,GAAG,OAAO,OAAO,GAAG,OAAO,WACtC,CAAA;AAEhE,gBAAgB;AAChB,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,QAA+B,CAAA;AAE7E,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,UAAU,aAAa,MAAM,4CAI7D,CAAA;AAEJ,gBAAgB;AAChB,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,UAAyD,CAAA;AAelG,gBAAgB;AAChB,eAAO,MAAM,eAAe,UAAW,UAAU,KAAG,OAC2C,CAAA;AAE/F,gBAAgB;AAChB,eAAO,MAAM,aAAa,mFASxB,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,WAAW,8EAMtB,CAAA;AAEF,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAGD,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,OAY5C,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,UAAU,UAAW,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,iBAAiB,CAG5B,CAAA;AAErF,gBAAgB;AAChB,eAAO,MAAM,WAAW,UACf,SAAS,aACL,MAAM,gBACH,QAAQ,CAAC,QAAQ,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAgDvC,CAAA"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/internal/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,gBAAgB;AAChB,eAAO,MAAM,SAAS,OAAO,CAAA;AAC7B,gBAAgB;AAChB,eAAO,MAAM,OAAO,OAAO,CAAA;AAC3B,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAS,CAAA;AACjC,gBAAgB;AAChB,eAAO,MAAM,UAAU,KAAK,CAAA;AAE5B,gBAAgB;AAChB,eAAO,MAAM,QAAQ,IAAI,CAAA;AACzB,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,gBAAgB;AAChB,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAU,UAAU,KAAG,OAEuE,CAAA;AAEtH,gBAAgB;AAChB,eAAO,MAAM,SAAS,yBAA+B,CAAA;AAErD,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,UAAU,QAAQ,UAAU,KAAG,UAS/D,CAAA;AAGD,gBAAgB;AAChB,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,SAAS,KAAG,IAAI,IAAI,SAAS,GAAG,OAAO,OAAO,GAAG,OAAO,WACtC,CAAA;AAEhE,gBAAgB;AAChB,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,QAA+B,CAAA;AAE7E,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,UAAU,aAAa,MAAM,4CAI7D,CAAA;AAEJ,gBAAgB;AAChB,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,UAAiD,CAAA;AAe1F,gBAAgB;AAChB,eAAO,MAAM,eAAe,UAAW,UAAU,KAAG,OAC2C,CAAA;AAE/F,gBAAgB;AAChB,eAAO,MAAM,aAAa,mFASxB,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,WAAW,8EAMtB,CAAA;AAEF,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAGD,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,OAY5C,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,UAAU,UAAW,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,iBAAiB,CAG5B,CAAA;AAErF,gBAAgB;AAChB,eAAO,MAAM,WAAW,UACf,SAAS,aACL,MAAM,gBACH,QAAQ,CAAC,QAAQ,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAgDvC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import * as ByteSize from "effect/ByteSize";
2
2
  import * as Effect from "effect/Effect";
3
- import * as Encoding from "effect/Encoding";
3
+ import * as Hex from "effect/encoding/Hex";
4
4
  import * as Predicate from "effect/Predicate";
5
5
  import * as Result from "effect/Result";
6
6
  import { getBytes as getBytePathBytes, make as makeBytePath } from "./bytePath.js";
@@ -46,7 +46,7 @@ export const strictString = (bytes, operation) => Effect.try({
46
46
  catch: () => fsFailure("UnrepresentableName", operation)
47
47
  });
48
48
  /** @internal */
49
- export const nameBytes = (name) => Result.getOrThrow(Encoding.decodeHex(name));
49
+ export const nameBytes = (name) => Result.getOrThrow(Hex.decode(name));
50
50
  // Constructing a view detects detached buffers, including empty ones.
51
51
  const attachedBuffer = (bytes) => {
52
52
  try {
@@ -125,7 +125,7 @@ export const preparePath = (input, operation, maxPathBytes) => {
125
125
  if (index - start > MAX_NAME_BYTES) {
126
126
  return Result.fail(fsFailure("PathTooLong", operation, { path: input }));
127
127
  }
128
- components.push(Encoding.encodeHex(bytes.subarray(start, index)));
128
+ components.push(Hex.encode(bytes.subarray(start, index)));
129
129
  suffixes.push(bytes.subarray(index));
130
130
  }
131
131
  start = index + 1;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotDelta.d.ts","sourceRoot":"","sources":["../../src/internal/snapshotDelta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAKlD,OAAO,EAA4C,QAAQ,EAAE,MAAM,aAAa,CAAA;AA01BhF,gBAAgB;AAChB,eAAO,MAAM,aAAa;;;;;;;;;;;+HA2BxB,CAAA;AA2BF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;8FAchC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,kBAAkB;;;;;;;;;;;sHAI9B,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iEAe9B,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;uDAyB9B,CAAA"}
1
+ {"version":3,"file":"snapshotDelta.d.ts","sourceRoot":"","sources":["../../src/internal/snapshotDelta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAKlD,OAAO,EAA4C,QAAQ,EAAE,MAAM,aAAa,CAAA;AA61BhF,gBAAgB;AAChB,eAAO,MAAM,aAAa;;;;;;;;;;;+HA2BxB,CAAA;AA2BF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;8FAchC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,kBAAkB;;;;;;;;;;;sHAI9B,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iEAe9B,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;uDAyB9B,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import * as ByteSize from "effect/ByteSize";
2
2
  import * as Effect from "effect/Effect";
3
- import * as Encoding from "effect/Encoding";
3
+ import * as Hex from "effect/encoding/Hex";
4
+ import * as Match from "effect/Match";
5
+ import * as Order from "effect/Order";
4
6
  import * as Result from "effect/Result";
5
7
  import * as Schema from "effect/Schema";
6
8
  import { SnapshotChange, SnapshotDifference, SnapshotNodeKind } from "../SnapshotDelta.js";
@@ -52,7 +54,7 @@ const VersionProbe = Schema.Struct({
52
54
  });
53
55
  const differenceOrder = SnapshotDifference.literals;
54
56
  const timestampFields = new Set(["atimeNs", "mtimeNs", "ctimeNs", "birthtimeNs"]);
55
- const key = Encoding.encodeHex;
57
+ const key = Hex.encode;
56
58
  const validPath = (path) => {
57
59
  if (path[0] !== SLASH_BYTE)
58
60
  return false;
@@ -261,17 +263,9 @@ const deltaNode = (target, path, node, withPayload) => {
261
263
  return DeltaNode.cases.link.make({ to: CanonicalBase64.encode(first) }, UNCHECKED);
262
264
  }
263
265
  const metadata = storedMetadata(node.metadata);
264
- if (node.kind === "directory")
265
- return DeltaNode.cases.directory.make({ metadata }, UNCHECKED);
266
- if (!withPayload) {
267
- return node.kind === "file"
268
- ? DeltaNode.cases.file.make({ metadata }, UNCHECKED)
269
- : DeltaNode.cases.symlink.make({ metadata }, UNCHECKED);
270
- }
271
- const bytes = CanonicalBase64.encode(payloadOf(node));
272
- return node.kind === "file"
273
- ? DeltaNode.cases.file.make({ metadata, content: InlineContent.make({ bytes }, UNCHECKED) }, UNCHECKED)
274
- : DeltaNode.cases.symlink.make({ metadata, target: bytes }, UNCHECKED);
266
+ return Match.value(node).pipe(Match.discriminator("kind")("directory", () => DeltaNode.cases.directory.make({ metadata }, UNCHECKED)), Match.discriminator("kind")("file", (file) => DeltaNode.cases.file.make(withPayload
267
+ ? { metadata, content: InlineContent.make({ bytes: CanonicalBase64.encode(file.data) }, UNCHECKED) }
268
+ : { metadata }, UNCHECKED)), Match.discriminator("kind")("symlink", (symlink) => DeltaNode.cases.symlink.make(withPayload ? { metadata, target: CanonicalBase64.encode(symlink.target) } : { metadata }, UNCHECKED)), Match.exhaustive);
275
269
  };
276
270
  const lookup = (get, entriesOf, path) => {
277
271
  let parent = ROOT_INO;
@@ -365,7 +359,7 @@ const compare = (base, target) => {
365
359
  }
366
360
  }
367
361
  }
368
- return changes.sort((a, b) => bytesOrder(a.path, b.path)).map(({ change }) => change);
362
+ return changes.sort(Order.mapInput(bytesOrder, (entry) => entry.path)).map(({ change }) => change);
369
363
  };
370
364
  const getDocument = (delta) => Effect.suspend(() => {
371
365
  const value = SnapshotDeltaModel.value(delta);
@@ -622,7 +616,7 @@ const foldedIdentity = Effect.fnUntraced(function* (base, folded, identity, limi
622
616
  // Digest children before their directories.
623
617
  const ordered = [
624
618
  ...nodes.filter((node) => node.kind !== "directory"),
625
- ...directories.sort((a, b) => depth(b) - depth(a))
619
+ ...directories.sort(Order.flip(Order.mapInput(Order.Number, depth)))
626
620
  ];
627
621
  for (const node of ordered)
628
622
  digests.set(node.ino, yield* Merkle.nodeDigest(node, digestOf, measure));
@@ -1 +1 @@
1
- {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/internal/tree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/internal/tree.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  // Validate each tree line as it arrives; check cross-node graph rules after the final line.
2
2
  import * as Effect from "effect/Effect";
3
- import * as Encoding from "effect/Encoding";
3
+ import * as Hex from "effect/encoding/Hex";
4
+ import * as Match from "effect/Match";
4
5
  import * as Predicate from "effect/Predicate";
5
6
  import * as Result from "effect/Result";
6
7
  import * as Schema from "effect/Schema";
@@ -147,7 +148,7 @@ const makeReader = (options, decodeHeader, decodeNode, runtimeOf) => {
147
148
  if (bytes === undefined || !isNameBytes(bytes)) {
148
149
  return broken(at([...path, "name"], "a name is 1 to 255 bytes without a NUL or a slash, and neither . nor .."));
149
150
  }
150
- const key = Encoding.encodeHex(bytes);
151
+ const key = Hex.encode(bytes);
151
152
  names.push({ parent, key, bytes: bytes.length, path, directory });
152
153
  entries++;
153
154
  return Result.succeed(key);
@@ -323,18 +324,17 @@ export const UNCHECKED = { disableChecks: true };
323
324
  /** @internal */
324
325
  export const treeNode = (node) => {
325
326
  const metadata = storedMetadata(node.metadata);
326
- if (node.kind === "directory") {
327
- return TreeNode.cases.directory.make({ ino: node.ino, parent: node.parent, name: encodeName(node.name), metadata }, UNCHECKED);
328
- }
329
- const named = node.links.map((link) => ({ parent: link.parent, name: encodeName(link.name) }));
330
- return node.kind === "file"
331
- ? TreeNode.cases.file.make({
332
- ino: node.ino,
333
- links: named,
334
- content: TreeContent.cases.Inline.make({ bytes: CanonicalBase64.encode(node.data) }, UNCHECKED),
335
- metadata
336
- }, UNCHECKED)
337
- : TreeNode.cases.symlink.make({ ino: node.ino, links: named, target: CanonicalBase64.encode(node.target), metadata }, UNCHECKED);
327
+ return Match.value(node).pipe(Match.discriminator("kind")("directory", (directory) => TreeNode.cases.directory.make({ ino: directory.ino, parent: directory.parent, name: encodeName(directory.name), metadata }, UNCHECKED)), Match.discriminator("kind")("file", (file) => TreeNode.cases.file.make({
328
+ ino: file.ino,
329
+ links: file.links.map((link) => ({ parent: link.parent, name: encodeName(link.name) })),
330
+ content: TreeContent.cases.Inline.make({ bytes: CanonicalBase64.encode(file.data) }, UNCHECKED),
331
+ metadata
332
+ }, UNCHECKED)), Match.discriminator("kind")("symlink", (symlink) => TreeNode.cases.symlink.make({
333
+ ino: symlink.ino,
334
+ links: symlink.links.map((link) => ({ parent: link.parent, name: encodeName(link.name) })),
335
+ target: CanonicalBase64.encode(symlink.target),
336
+ metadata
337
+ }, UNCHECKED)), Match.exhaustive);
338
338
  };
339
339
  /** @internal */
340
340
  export const treeNodes = Effect.fnUntraced(function* (value, extra = []) {
@@ -1,4 +1,5 @@
1
1
  import * as ByteSize from "effect/ByteSize";
2
+ import * as Crypto from "effect/Crypto";
2
3
  import * as Data from "effect/Data";
3
4
  import * as Effect from "effect/Effect";
4
5
  import type { Snapshot } from "../Snapshot.js";
@@ -6,8 +7,13 @@ import { type FsFailure, type ImageFailure } from "../VfsError.js";
6
7
  import type { OverlayVolume, Volume, VolumeLimits } from "../VirtualFileSystem.js";
7
8
  import * as LiveImage from "./liveImage.js";
8
9
  import { type ObservationEntry } from "./overlayDiff.js";
9
- import { type CommitProvider } from "./stagedState.js";
10
10
  import { type VolumeState } from "./volumeState.js";
11
+ type CommitOutcome = "committed" | "rejected" | "unknown";
12
+ interface CommitProvider<State> {
13
+ /** Preparation failures leave the volume available. */
14
+ readonly prepare?: (candidate: State) => Effect.Effect<void, FsFailure>;
15
+ readonly commit: (candidate: State) => Effect.Effect<CommitOutcome>;
16
+ }
11
17
  type VolumeSource = {
12
18
  readonly _tag: "Empty";
13
19
  } | {
@@ -74,7 +80,7 @@ export declare const makeVolume: (source: VolumeSource, options?: {
74
80
  observation: ObservationEntry[];
75
81
  }, FsFailure, never>;
76
82
  }>;
77
- }>, import("../VfsError.js").ArgumentFailure | ImageFailure, never>;
83
+ }>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
78
84
  /** @internal */
79
85
  export declare const make: (options?: {
80
86
  readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
@@ -84,7 +90,7 @@ export declare const make: (options?: {
84
90
  readonly maxBytes?: ByteSize.ByteSize;
85
91
  readonly maxFileBytes?: ByteSize.ByteSize;
86
92
  readonly maxPathBytes?: ByteSize.ByteSize;
87
- } | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure, never>;
93
+ } | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure, Crypto.Crypto>;
88
94
  /** @internal */
89
95
  export declare const prepareEmptyLiveImage: (options?: {
90
96
  readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
@@ -94,12 +100,12 @@ export declare const prepareEmptyLiveImage: (options?: {
94
100
  readonly maxBytes?: ByteSize.ByteSize;
95
101
  readonly maxFileBytes?: ByteSize.ByteSize;
96
102
  readonly maxPathBytes?: ByteSize.ByteSize;
97
- } | undefined) => Effect.Effect<Uint8Array<ArrayBufferLike>, import("../VfsError.js").ArgumentFailure | ImageFailure, never>;
103
+ } | undefined) => Effect.Effect<Uint8Array<ArrayBufferLike>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
98
104
  /** @internal */
99
105
  export declare const openImageVolume: (image: Uint8Array<ArrayBufferLike>, maxImageBytes: ByteSize.ByteSize, commit: (image: Uint8Array) => Effect.Effect<"committed" | "rejected" | "unknown">, durability?: "memory-only" | "survives-operating-system-crash" | "survives-power-loss" | "survives-process-crash" | undefined) => Effect.Effect<Readonly<{
100
106
  volume: Volume;
101
107
  shutdown: Effect.Effect<void, never, never>;
102
- }>, import("../VfsError.js").ArgumentFailure | ImageFailure, never>;
108
+ }>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
103
109
  /** @internal */
104
110
  export declare const fromSnapshot: (snapshot: Snapshot, options?: {
105
111
  readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
@@ -109,7 +115,7 @@ export declare const fromSnapshot: (snapshot: Snapshot, options?: {
109
115
  readonly maxBytes?: ByteSize.ByteSize;
110
116
  readonly maxFileBytes?: ByteSize.ByteSize;
111
117
  readonly maxPathBytes?: ByteSize.ByteSize;
112
- } | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure | ImageFailure, never>;
118
+ } | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
113
119
  /** @internal */
114
120
  export declare const makeOverlay: (base: Snapshot, options?: {
115
121
  readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
@@ -119,6 +125,6 @@ export declare const makeOverlay: (base: Snapshot, options?: {
119
125
  readonly maxBytes?: ByteSize.ByteSize;
120
126
  readonly maxFileBytes?: ByteSize.ByteSize;
121
127
  readonly maxPathBytes?: ByteSize.ByteSize;
122
- } | undefined) => Effect.Effect<OverlayVolume, import("../VfsError.js").ArgumentFailure | ImageFailure, never>;
128
+ } | undefined) => Effect.Effect<OverlayVolume, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
123
129
  export {};
124
130
  //# sourceMappingURL=virtualFileSystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AA4BvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAqB,MAAM,gBAAgB,CAAA;AACrF,OAAO,KAAK,EAMV,aAAa,EAEb,MAAM,EACN,YAAY,EAIb,MAAM,yBAAyB,CAAA;AA2BhC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAkB,KAAK,gBAAgB,EAAyB,MAAM,kBAAkB,CAAA;AAmB/F,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,kBAAkB,CAAA;AAGnE,OAAO,EAeL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAA;AA+RzB,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAE9D,gBAAgB;AAChB,eAAO,MAAM,YAAY;;uBALJ,OAAO;;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;;uBAC7C,UAAU;wBAAkB,WAAW;;;;;;;;;;;;;uBAFvC,OAAO;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;uBAC7C,UAAU;wBAAkB,WAAW;;CAGD,CAAA;AA4E3D,gBAAgB;AAChB,eAAO,MAAM,UAAU;;;;;;;;mGAMV,WAAW,UACV,SAAS,CAAC,MAAM,UAChB,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;;;;;;;;;;;mEAkmG/C,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI;;;;;;;;wFAIf,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,qBAAqB;;;;;;;;4HAShC,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,eAAe,yFAGV,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;;;mEA+ClF,CAAA;AAeF,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;;;;uGAKxB,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;;;;;;8GAkCvB,CAAA"}
1
+ {"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AA6BvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAqB,MAAM,gBAAgB,CAAA;AACrF,OAAO,KAAK,EAMV,aAAa,EAEb,MAAM,EACN,YAAY,EAIb,MAAM,yBAAyB,CAAA;AA2BhC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAkB,KAAK,gBAAgB,EAAyB,MAAM,kBAAkB,CAAA;AAqB/F,OAAO,EAgBL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAA;AAWzB,KAAK,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD,UAAU,cAAc,CAAC,KAAK;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACvE,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;CACpE;AAqXD,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAE9D,gBAAgB;AAChB,eAAO,MAAM,YAAY;;uBALJ,OAAO;;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;;uBAC7C,UAAU;wBAAkB,WAAW;;;;;;;;;;;;;uBAFvC,OAAO;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;uBAC7C,UAAU;wBAAkB,WAAW;;CAGD,CAAA;AAsD3D,gBAAgB;AAChB,eAAO,MAAM,UAAU;;;;;;;;mGAMV,WAAW,UACV,SAAS,CAAC,MAAM,UAChB,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;;;;;;;;;;;2EA+pG/C,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI;;;;;;;;gGAIf,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,qBAAqB;;;;;;;;oIAShC,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,eAAe,yFAGV,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;;;2EA+ClF,CAAA;AAeF,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;;;;+GAKxB,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;;;;;;sHAkCvB,CAAA"}