@effect-vfs/core 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/BytePath.d.ts +4 -1
  2. package/dist/BytePath.d.ts.map +1 -1
  3. package/dist/BytePath.js +6 -4
  4. package/dist/Caller.d.ts +105 -66
  5. package/dist/Caller.d.ts.map +1 -1
  6. package/dist/Caller.js +15 -87
  7. package/dist/LiveVolume.d.ts +6 -1
  8. package/dist/LiveVolume.d.ts.map +1 -1
  9. package/dist/LiveVolume.js +8 -1
  10. package/dist/Search.d.ts +32 -8
  11. package/dist/Search.d.ts.map +1 -1
  12. package/dist/Search.js +14 -13
  13. package/dist/SynchronousAdapter.d.ts +58 -0
  14. package/dist/SynchronousAdapter.d.ts.map +1 -0
  15. package/dist/SynchronousAdapter.js +116 -0
  16. package/dist/Target.d.ts +7 -91
  17. package/dist/Target.d.ts.map +1 -1
  18. package/dist/Target.js +7 -47
  19. package/dist/Testing.d.ts +5 -2
  20. package/dist/Testing.d.ts.map +1 -1
  21. package/dist/Testing.js +2 -1
  22. package/dist/VfsError.d.ts +1 -1
  23. package/dist/VfsError.d.ts.map +1 -1
  24. package/dist/VirtualFileSystem.d.ts +126 -43
  25. package/dist/VirtualFileSystem.d.ts.map +1 -1
  26. package/dist/VirtualFileSystem.js +25 -21
  27. package/dist/Volume.d.ts +6 -1
  28. package/dist/Volume.d.ts.map +1 -1
  29. package/dist/Volume.js +6 -2
  30. package/dist/internal/adapterBinding.d.ts +13 -0
  31. package/dist/internal/adapterBinding.d.ts.map +1 -0
  32. package/dist/internal/adapterBinding.js +13 -0
  33. package/dist/internal/bytePath.d.ts +6 -1
  34. package/dist/internal/bytePath.d.ts.map +1 -1
  35. package/dist/internal/callerWatch.d.ts +5 -1
  36. package/dist/internal/callerWatch.d.ts.map +1 -1
  37. package/dist/internal/callerWatch.js +4 -3
  38. package/dist/internal/engine.d.ts +1305 -0
  39. package/dist/internal/engine.d.ts.map +1 -0
  40. package/dist/internal/engine.js +3458 -0
  41. package/dist/internal/errors.d.ts +1 -33
  42. package/dist/internal/errors.d.ts.map +1 -1
  43. package/dist/internal/errors.js +1 -45
  44. package/dist/internal/fixture.d.ts +2 -1
  45. package/dist/internal/fixture.d.ts.map +1 -1
  46. package/dist/internal/fixture.js +7 -3
  47. package/dist/internal/image.d.ts +4 -1
  48. package/dist/internal/image.d.ts.map +1 -1
  49. package/dist/internal/image.js +6 -3
  50. package/dist/internal/lines.d.ts.map +1 -1
  51. package/dist/internal/lines.js +3 -2
  52. package/dist/internal/liveImage.d.ts +4 -2
  53. package/dist/internal/liveImage.d.ts.map +1 -1
  54. package/dist/internal/liveImage.js +3 -1
  55. package/dist/internal/merkle.d.ts +7 -4
  56. package/dist/internal/merkle.d.ts.map +1 -1
  57. package/dist/internal/merkle.js +6 -4
  58. package/dist/internal/search.d.ts +3 -1
  59. package/dist/internal/search.d.ts.map +1 -1
  60. package/dist/internal/search.js +4 -3
  61. package/dist/internal/snapshotDelta.d.ts +11 -7
  62. package/dist/internal/snapshotDelta.d.ts.map +1 -1
  63. package/dist/internal/snapshotDelta.js +15 -9
  64. package/dist/internal/snapshotMerge.d.ts +1 -1
  65. package/dist/internal/snapshotMerge.d.ts.map +1 -1
  66. package/dist/internal/snapshotMerge.js +5 -2
  67. package/dist/internal/tree.d.ts +4 -2
  68. package/dist/internal/tree.d.ts.map +1 -1
  69. package/dist/internal/tree.js +4 -2
  70. package/dist/internal/virtualFileSystem.d.ts +20 -49
  71. package/dist/internal/virtualFileSystem.d.ts.map +1 -1
  72. package/dist/internal/virtualFileSystem.js +75 -2082
  73. package/dist/internal/volumeLimits.d.ts +1 -0
  74. package/dist/internal/volumeLimits.d.ts.map +1 -1
  75. package/dist/internal/volumeLimits.js +3 -2
  76. package/dist/internal/volumeState.d.ts +10 -79
  77. package/dist/internal/volumeState.d.ts.map +1 -1
  78. package/dist/internal/volumeState.js +9 -79
  79. package/dist/internal/watchHub.d.ts +3 -3
  80. package/dist/internal/watchHub.d.ts.map +1 -1
  81. package/dist/internal/watchHub.js +4 -2
  82. package/package.json +14 -9
  83. package/dist/internal/confinement.d.ts +0 -16
  84. package/dist/internal/confinement.d.ts.map +0 -1
  85. package/dist/internal/confinement.js +0 -79
  86. package/dist/internal/directoryEntries.d.ts +0 -6
  87. package/dist/internal/directoryEntries.d.ts.map +0 -1
  88. package/dist/internal/directoryEntries.js +0 -79
  89. package/dist/internal/inodeTable.d.ts +0 -20
  90. package/dist/internal/inodeTable.d.ts.map +0 -1
  91. package/dist/internal/inodeTable.js +0 -48
  92. package/dist/internal/path.d.ts +0 -56
  93. package/dist/internal/path.d.ts.map +0 -1
  94. package/dist/internal/path.js +0 -141
  95. package/dist/internal/resolution.d.ts +0 -139
  96. package/dist/internal/resolution.d.ts.map +0 -1
  97. package/dist/internal/resolution.js +0 -332
  98. package/dist/internal/testSeams.d.ts +0 -17
  99. package/dist/internal/testSeams.d.ts.map +0 -1
  100. package/dist/internal/testSeams.js +0 -20
  101. package/dist/internal/tokenRegistry.d.ts +0 -83
  102. package/dist/internal/tokenRegistry.d.ts.map +0 -1
  103. package/dist/internal/tokenRegistry.js +0 -146
  104. package/dist/internal/turnstile.d.ts +0 -8
  105. package/dist/internal/turnstile.d.ts.map +0 -1
  106. package/dist/internal/turnstile.js +0 -43
@@ -1,6 +1,8 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
+ import { dual } from "effect/Function";
3
4
  import * as Layer from "effect/Layer";
5
+ import * as Predicate from "effect/Predicate";
4
6
  import * as Result from "effect/Result";
5
7
  import * as Schema from "effect/Schema";
6
8
  import * as SchemaIssue from "effect/SchemaIssue";
@@ -16,17 +18,19 @@ import * as VolumeModule from "./Volume.js";
16
18
  import * as WatchModule from "./Watch.js";
17
19
  export { Entry, isEntry, isTarget, Name, Target } from "./Target.js";
18
20
  export { BytePath } from "./BytePath.js";
21
+ import { SnapshotTypeId } from "./Snapshot.js";
19
22
  export { DecodeLimits, SnapshotTypeId } from "./Snapshot.js";
20
23
  import { BudgetFromDecodeLimits, DeltaBudgetFromLimits } from "./internal/budget.js";
21
- import { decodeConfiguration, retargetFailure } from "./internal/errors.js";
24
+ import { retargetFailure } from "./internal/errors.js";
22
25
  import * as FixtureInternal from "./internal/fixture.js";
23
26
  import * as Image from "./internal/image.js";
24
- import * as Path from "./internal/path.js";
27
+ import { Errors, Paths as Path } from "./internal/engine.js";
25
28
  import * as SnapshotDeltaInternal from "./internal/snapshotDelta.js";
26
29
  import * as SnapshotMergeInternal from "./internal/snapshotMerge.js";
27
30
  import * as VfsModel from "./internal/virtualFileSystem.js";
28
31
  import { open as openLiveVolume } from "./LiveVolume.js";
29
32
  import * as SnapshotDeltaModel from "./SnapshotDelta.js";
33
+ const decodeConfiguration = Errors.decodeConfiguration;
30
34
  export { MergeConflict, MergeConflictReason, MergeOptions, MergeResolution, MergeResult, MergeSideChange, MergeTake, SnapshotChange, SnapshotChangesOptions, SnapshotDeltaLimits, SnapshotDeltaTypeId, SnapshotDifference, SnapshotNodeKind } from "./SnapshotDelta.js";
31
35
  /**
32
36
  * Schema for portable virtual filesystem error codes.
@@ -663,9 +667,9 @@ export const OverlayChangesOptions = VolumeModule.OverlayChangesOptions;
663
667
  */
664
668
  export const Volume = Object.assign(Context.Service("@effect-vfs/core/Volume"), {
665
669
  layer: (options) => Layer.effect(Volume, VfsModel.make(options)),
666
- layerFromSnapshot: (snapshot, options) => Layer.effect(Volume, VfsModel.fromSnapshot(snapshot, options)),
667
- layerFromFixture: (fixture, options) => Layer.effect(Volume, FixtureInternal.fromFixture(fixture, options)),
668
- layerOverlay: (base, options) => Layer.effect(Volume, VfsModel.makeOverlay(base, options)),
670
+ layerFromSnapshot: dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), (snapshot, options) => Layer.effect(Volume, VfsModel.fromSnapshot(snapshot, options))),
671
+ layerFromFixture: dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], "entries"), (fixture, options) => Layer.effect(Volume, FixtureInternal.fromFixture(fixture, options))),
672
+ layerOverlay: dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), (base, options) => Layer.effect(Volume, VfsModel.makeOverlay(base, options))),
669
673
  layerLive: (options) => Layer.effect(Volume, openLiveVolume(options))
670
674
  });
671
675
  /**
@@ -727,7 +731,7 @@ const optionalBudget = (operation, limits) => limits === undefined ? Effect.unde
727
731
  * @category serialization
728
732
  * @since 0.6.0
729
733
  */
730
- export const encodeSnapshotStream = (snapshot, limits) => Stream.unwrap(Effect.map(optionalBudget("encodeSnapshotStream", limits), (budget) => Image.encodeSnapshotStream(snapshot, budget))).pipe(Stream.mapError((error) => retargetFailure("encodeSnapshotStream", error)));
734
+ export const encodeSnapshotStream = dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), (snapshot, limits) => Stream.unwrap(Effect.map(optionalBudget("encodeSnapshotStream", limits), (budget) => Image.encodeSnapshotStream(snapshot, budget))).pipe(Stream.mapError((error) => retargetFailure("encodeSnapshotStream", error))));
731
735
  /**
732
736
  * Encodes a snapshot as owned UTF-8 bytes in the version 1 snapshot format.
733
737
  *
@@ -768,7 +772,7 @@ export const encodeSnapshotStream = (snapshot, limits) => Stream.unwrap(Effect.m
768
772
  * @category serialization
769
773
  * @since 0.1.0
770
774
  */
771
- export const encodeSnapshot = (snapshot, limits) => Effect.flatMap(optionalBudget("encodeSnapshot", limits), (budget) => Image.encodeSnapshot(snapshot, budget)).pipe(Effect.mapError((error) => retargetFailure("encodeSnapshot", error)));
775
+ export const encodeSnapshot = dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), (snapshot, limits) => Effect.flatMap(optionalBudget("encodeSnapshot", limits), (budget) => Image.encodeSnapshot(snapshot, budget)).pipe(Effect.mapError((error) => retargetFailure("encodeSnapshot", error))));
772
776
  /**
773
777
  * A sink that decodes a stream of version 1 snapshot chunks while enforcing
774
778
  * explicit input and payload limits.
@@ -862,7 +866,7 @@ export const decodeSnapshotSink = (limits) => Sink.unwrap(Effect.map(snapshotBud
862
866
  * @category serialization
863
867
  * @since 0.1.0
864
868
  */
865
- export const decodeSnapshot = (input, limits) => Stream.run(Stream.succeed(input), decodeSnapshotSink(limits));
869
+ export const decodeSnapshot = dual(2, (input, limits) => Stream.run(Stream.succeed(input), decodeSnapshotSink(limits)));
866
870
  const deltaLimits = (operation, limits) => Effect.fromResult(decodeConfiguration(DeltaBudgetFromLimits, limits ?? SnapshotDeltaModel.SnapshotDeltaLimits.default, operation));
867
871
  /**
868
872
  * Computes an exact portable delta between two immutable snapshots.
@@ -902,10 +906,10 @@ const deltaLimits = (operation, limits) => Effect.fromResult(decodeConfiguration
902
906
  * @category snapshots
903
907
  * @since 0.1.0
904
908
  */
905
- export const diffSnapshots = Effect.fnUntraced(function* (base, target, limits) {
909
+ export const diffSnapshots = dual((args) => args.length >= 3 || Predicate.hasProperty(args[1], SnapshotTypeId), Effect.fnUntraced(function* (base, target, limits) {
906
910
  // The delta codec fails under its own name; the public entry point names itself.
907
911
  return yield* SnapshotDeltaInternal.diffSnapshots(base, target, yield* deltaLimits("diffSnapshots", limits)).pipe(Effect.mapError((error) => retargetFailure("diffSnapshots", error)));
908
- });
912
+ }));
909
913
  /**
910
914
  * Verifies an exact snapshot delta against its base and derives an owned path-oriented summary.
911
915
  * Requires the platform-neutral `Crypto.Crypto` service for base identity. Provide
@@ -941,10 +945,10 @@ export const diffSnapshots = Effect.fnUntraced(function* (base, target, limits)
941
945
  * @category snapshots
942
946
  * @since 0.1.0
943
947
  */
944
- export const inspectSnapshotDelta = Effect.fnUntraced(function* (base, delta, options, limits) {
948
+ export const inspectSnapshotDelta = dual((args) => args.length >= 4 || Predicate.hasProperty(args[0], SnapshotTypeId), Effect.fnUntraced(function* (base, delta, options, limits) {
945
949
  const decoded = yield* Effect.fromResult(decodeConfiguration(SnapshotDeltaModel.SnapshotChangesOptions, options ?? {}, "inspectSnapshotDelta"));
946
950
  return yield* SnapshotDeltaInternal.inspectSnapshotDelta(base, delta, decoded, yield* deltaLimits("inspectSnapshotDelta", limits)).pipe(Effect.mapError((error) => retargetFailure("inspectSnapshotDelta", error)));
947
- });
951
+ }));
948
952
  /**
949
953
  * Applies an exact delta to its semantically matching base and returns a new snapshot.
950
954
  * Requires the platform-neutral `Crypto.Crypto` service for base identity. Provide
@@ -985,9 +989,9 @@ export const inspectSnapshotDelta = Effect.fnUntraced(function* (base, delta, op
985
989
  * @category snapshots
986
990
  * @since 0.1.0
987
991
  */
988
- export const applySnapshotDelta = Effect.fnUntraced(function* (base, delta, limits) {
992
+ export const applySnapshotDelta = dual((args) => args.length >= 3 || Predicate.hasProperty(args[0], SnapshotTypeId), Effect.fnUntraced(function* (base, delta, limits) {
989
993
  return yield* SnapshotDeltaInternal.applySnapshotDelta(base, delta, yield* deltaLimits("applySnapshotDelta", limits)).pipe(Effect.mapError((error) => retargetFailure("applySnapshotDelta", error)));
990
- });
994
+ }));
991
995
  /**
992
996
  * Merges two snapshot deltas that share one base into a single delta, reporting path-level conflicts as data.
993
997
  *
@@ -1025,7 +1029,7 @@ export const applySnapshotDelta = Effect.fnUntraced(function* (base, delta, limi
1025
1029
  * )
1026
1030
  *
1027
1031
  * // Disjoint changes merge without conflicts; the delta applies to the shared base.
1028
- * const merged = yield* Vfs.fromSnapshot(yield* Vfs.applySnapshotDelta(base, result.delta))
1032
+ * const merged = yield* Vfs.applySnapshotDelta(base, result.delta).pipe(Effect.flatMap(Vfs.fromSnapshot()))
1029
1033
  * const reader = yield* merged.caller()
1030
1034
  *
1031
1035
  * return [result.conflicts.length, new TextDecoder().decode(yield* reader.readFile("/shared.txt"))]
@@ -1039,12 +1043,12 @@ export const applySnapshotDelta = Effect.fnUntraced(function* (base, delta, limi
1039
1043
  * @category snapshots
1040
1044
  * @since 0.8.0
1041
1045
  */
1042
- export const mergeSnapshotDeltas = Effect.fnUntraced(function* (base, ours, theirs, options) {
1046
+ export const mergeSnapshotDeltas = dual((args) => args.length >= 4 || Predicate.hasProperty(args[0], SnapshotTypeId), Effect.fnUntraced(function* (base, ours, theirs, options) {
1043
1047
  // Limits decode first so a bad limit names its own field; the rest of the options decode as one.
1044
1048
  const limits = yield* deltaLimits("mergeSnapshotDeltas", options?.limits);
1045
1049
  const decoded = yield* Effect.fromResult(decodeConfiguration(SnapshotDeltaModel.MergeOptions, options ?? {}, "mergeSnapshotDeltas"));
1046
1050
  return yield* SnapshotMergeInternal.mergeSnapshotDeltas(base, ours, theirs, decoded.resolutions ?? [], limits).pipe(Effect.mapError((error) => retargetFailure("mergeSnapshotDeltas", error)));
1047
- });
1051
+ }));
1048
1052
  const deltaSchemaIssue = (cause, input, options) => new SchemaIssue.InvalidValue({ message: `Snapshot delta ${cause.code}${cause.field === undefined ? "" : ` at ${cause.field}`}` }, input, options);
1049
1053
  /**
1050
1054
  * Creates an Effect Schema codec between owned bytes and opaque snapshot deltas.
@@ -1246,7 +1250,7 @@ export const make = VfsModel.make;
1246
1250
  * @category snapshots
1247
1251
  * @since 0.6.0
1248
1252
  */
1249
- export const snapshotEntries = Image.snapshotEntries;
1253
+ export const snapshotEntries = dual(2, Image.snapshotEntries);
1250
1254
  /**
1251
1255
  * Restores a fresh volume from an opaque snapshot under the supplied destination limits.
1252
1256
  *
@@ -1289,7 +1293,7 @@ export const snapshotEntries = Image.snapshotEntries;
1289
1293
  * @category constructors
1290
1294
  * @since 0.1.0
1291
1295
  */
1292
- export const fromSnapshot = VfsModel.fromSnapshot;
1296
+ export const fromSnapshot = dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), VfsModel.fromSnapshot);
1293
1297
  /**
1294
1298
  * Creates an isolated writable volume relative to one immutable snapshot base.
1295
1299
  *
@@ -1341,7 +1345,7 @@ export const fromSnapshot = VfsModel.fromSnapshot;
1341
1345
  * @category constructors
1342
1346
  * @since 0.1.0
1343
1347
  */
1344
- export const makeOverlay = VfsModel.makeOverlay;
1348
+ export const makeOverlay = dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], SnapshotTypeId), VfsModel.makeOverlay);
1345
1349
  /**
1346
1350
  * Builds a fresh volume from a validated final-state fixture.
1347
1351
  *
@@ -1382,4 +1386,4 @@ export const makeOverlay = VfsModel.makeOverlay;
1382
1386
  * @category constructors
1383
1387
  * @since 0.1.0
1384
1388
  */
1385
- export const fromFixture = FixtureInternal.fromFixture;
1389
+ export const fromFixture = dual((args) => args.length >= 2 || Predicate.hasProperty(args[0], "entries"), FixtureInternal.fromFixture);
package/dist/Volume.d.ts CHANGED
@@ -42,7 +42,10 @@ export declare const VolumeDurabilityOrder: Order.Order<VolumeDurability>;
42
42
  * @category predicates
43
43
  * @since 0.6.0
44
44
  */
45
- export declare const isVolumeDurabilityAtLeast: (actual: VolumeDurability, required: VolumeDurability) => boolean;
45
+ export declare const isVolumeDurabilityAtLeast: {
46
+ (required: VolumeDurability): (actual: VolumeDurability) => boolean;
47
+ (actual: VolumeDurability, required: VolumeDurability): boolean;
48
+ };
46
49
  /**
47
50
  * Schema for a volume identity: 128 bits as lowercase hexadecimal, stable
48
51
  * across restarts of a durable volume.
@@ -115,6 +118,8 @@ export type ReferenceKey = typeof ReferenceKey.Type;
115
118
  * @since 0.6.0
116
119
  */
117
120
  export declare const VolumeOptions: Schema.Struct<{
121
+ /** Selects live-volume scheduling; omitted means cooperative. Never stored in images. */
122
+ readonly execution: Schema.optionalKey<Schema.Literals<readonly ["cooperative", "sync"]>>;
118
123
  readonly identity: Schema.optionalKey<Schema.brand<Schema.String, "@effect-vfs/core/VolumeIdentity">>;
119
124
  readonly maxEntries: Schema.optionalKey<Schema.Natural>;
120
125
  readonly maxPendingOperations: Schema.optionalKey<Schema.Int>;
@@ -1 +1 @@
1
- {"version":3,"file":"Volume.d.ts","sourceRoot":"","sources":["../src/Volume.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAIxC;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,MAA8C,CAAA;AAE5E;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,+HAK3B,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;AAS3D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAG/D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,WAAY,gBAAgB,YAAY,gBAAgB,KAAG,OACnD,CAAA;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,gEAA+D,CAAA;AAE1F;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,mEAAkE,CAAA;AAEhG;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAO7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY;;;;;EAKvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;;;;;;EAsBxB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,4DAAoD,CAAA;AAEhF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,6GAS5B,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAM7D;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;IAgBxB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;EAEhC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAA"}
1
+ {"version":3,"file":"Volume.d.ts","sourceRoot":"","sources":["../src/Volume.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAMxC;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,MAA8C,CAAA;AAE5E;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,+HAK3B,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;AAS3D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAG/D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE;IACtC,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAA;IACnE,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAA;CAIhE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,gEAA+D,CAAA;AAE1F;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,mEAAkE,CAAA;AAEhG;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAO7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY;;;;;EAKvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,aAAa;IACxB,yFAAyF;;;;;;;;;EAuBzF,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,4DAAoD,CAAA;AAEhF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,6GAS5B,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAM7D;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;IAgBxB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;EAEhC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAA"}
package/dist/Volume.js CHANGED
@@ -6,11 +6,13 @@
6
6
  * @since 0.6.0
7
7
  */
8
8
  import * as ByteSize from "effect/ByteSize";
9
+ import { dual } from "effect/Function";
9
10
  import * as Order from "effect/Order";
10
11
  import * as Schema from "effect/Schema";
11
12
  import { BytePath } from "./BytePath.js";
13
+ import { State } from "./internal/engine.js";
12
14
  import { Hex128 } from "./internal/hex128.js";
13
- import { MAX_FILE_BYTES, MAX_INO, ROOT_INO } from "./internal/volumeState.js";
15
+ const { MAX_FILE_BYTES, MAX_INO, ROOT_INO } = State;
14
16
  /**
15
17
  * Brand key that marks a volume.
16
18
  *
@@ -49,7 +51,7 @@ export const VolumeDurabilityOrder = Order.mapInput(Order.Number, (durability) =
49
51
  * @category predicates
50
52
  * @since 0.6.0
51
53
  */
52
- export const isVolumeDurabilityAtLeast = (actual, required) => VolumeDurabilityOrder(actual, required) >= 0;
54
+ export const isVolumeDurabilityAtLeast = dual(2, (actual, required) => VolumeDurabilityOrder(actual, required) >= 0);
53
55
  /**
54
56
  * Schema for a volume identity: 128 bits as lowercase hexadecimal, stable
55
57
  * across restarts of a durable volume.
@@ -103,6 +105,8 @@ export const ReferenceKey = Schema.Struct({
103
105
  * @since 0.6.0
104
106
  */
105
107
  export const VolumeOptions = Schema.Struct({
108
+ /** Selects live-volume scheduling; omitted means cooperative. Never stored in images. */
109
+ execution: Schema.optionalKey(Schema.Literals(["cooperative", "sync"])),
106
110
  identity: Schema.optionalKey(VolumeIdentity),
107
111
  maxEntries: Schema.optionalKey(Schema.Natural),
108
112
  maxPendingOperations: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),
@@ -0,0 +1,13 @@
1
+ /** Core-owned identity shared by volume construction and native adapters. @internal */
2
+ import type * as Effect from "effect/Effect";
3
+ import type { Volume } from "../VirtualFileSystem.js";
4
+ import type { makeEngine } from "./engine.js";
5
+ type Engine = Effect.Success<ReturnType<typeof makeEngine>>;
6
+ /** @internal */
7
+ export declare const register: (volume: Volume, engine: Engine) => void;
8
+ /** @internal */
9
+ export declare const engineOf: (volume: Volume) => Engine | undefined;
10
+ /** @internal */
11
+ export declare const alias: (volume: Volume, original: Volume) => void;
12
+ export {};
13
+ //# sourceMappingURL=adapterBinding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapterBinding.d.ts","sourceRoot":"","sources":["../../src/internal/adapterBinding.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,KAAK,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAA;AAI3D,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,MAAM,UAAU,MAAM,KAAG,IAEzD,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,MAAM,KAAG,MAAM,GAAG,SAAgC,CAAA;AAEnF,gBAAgB;AAChB,eAAO,MAAM,KAAK,WAAY,MAAM,YAAY,MAAM,KAAG,IAIxD,CAAA"}
@@ -0,0 +1,13 @@
1
+ const engines = new WeakMap();
2
+ /** @internal */
3
+ export const register = (volume, engine) => {
4
+ engines.set(volume, engine);
5
+ };
6
+ /** @internal */
7
+ export const engineOf = (volume) => engines.get(volume);
8
+ /** @internal */
9
+ export const alias = (volume, original) => {
10
+ const engine = engines.get(original);
11
+ if (engine !== undefined)
12
+ engines.set(volume, engine);
13
+ };
@@ -1,7 +1,12 @@
1
- import type { BytePath } from "../BytePath.js";
1
+ import * as Equal from "effect/Equal";
2
+ import { type Pipeable } from "effect/Pipeable";
2
3
  /** @internal */
3
4
  export declare const BytePathId: "@effect-vfs/core/BytePath";
4
5
  /** @internal */
6
+ export interface BytePath extends Equal.Equal, Pipeable {
7
+ readonly [BytePathId]: typeof BytePathId;
8
+ }
9
+ /** @internal */
5
10
  export declare const isBytePath: (value: unknown) => value is BytePath;
6
11
  /** @internal */
7
12
  export declare const isPathBytes: (bytes: Uint8Array) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"bytePath.d.ts","sourceRoot":"","sources":["../../src/internal/bytePath.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,gBAAgB;AAChB,eAAO,MAAM,UAAU,EAAG,2BAAoC,CAAA;AA6B9D,gBAAgB;AAChB,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAA6D,CAAA;AAElH,gBAAgB;AAChB,eAAO,MAAM,WAAW,UAAW,UAAU,KAAG,OAAiD,CAAA;AAEjG,gBAAgB;AAChB,eAAO,MAAM,IAAI,UAAW,UAAU,KAAG,QAMxC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,UAAU,GAAG,SAAgC,CAAA"}
1
+ {"version":3,"file":"bytePath.d.ts","sourceRoot":"","sources":["../../src/internal/bytePath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,iBAAiB,CAAA;AAI9D,gBAAgB;AAChB,eAAO,MAAM,UAAU,EAAG,2BAAoC,CAAA;AAE9D,gBAAgB;AAChB,MAAM,WAAW,QAAS,SAAQ,KAAK,CAAC,KAAK,EAAE,QAAQ;IACrD,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,UAAU,CAAA;CACzC;AA6BD,gBAAgB;AAChB,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAA6D,CAAA;AAElH,gBAAgB;AAChB,eAAO,MAAM,WAAW,UAAW,UAAU,KAAG,OAAiD,CAAA;AAEjG,gBAAgB;AAChB,eAAO,MAAM,IAAI,UAAW,UAAU,KAAG,QAMxC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,UAAU,GAAG,SAAgC,CAAA"}
@@ -1,7 +1,10 @@
1
1
  import type { FsFailure } from "../VfsError.js";
2
2
  import { Change } from "../Watch.js";
3
- import { type Ino, type Link, type VolumeState } from "./volumeState.js";
3
+ import { State } from "./engine.js";
4
4
  import type { Selection } from "./watchHub.js";
5
+ type Ino = State.Ino;
6
+ type Link = State.Link;
7
+ type VolumeState = State.VolumeState;
5
8
  /** @internal */
6
9
  export interface WatchEvent {
7
10
  readonly change: Change;
@@ -29,4 +32,5 @@ export declare const make: (options: {
29
32
  readonly recursive: boolean;
30
33
  readonly selected?: Link;
31
34
  }) => Selection<WatchEvent, Installation, FsFailure>;
35
+ export {};
32
36
  //# sourceMappingURL=callerWatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"callerWatch.d.ts","sourceRoot":"","sources":["../../src/internal/callerWatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAIpC,OAAO,EAAW,KAAK,GAAG,EAAE,KAAK,IAAI,EAAY,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,gBAAgB;AAChB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,gBAAgB;AAChB,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAClB;AAED,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACzC;AA6ED,iGAAiG;AACjG,eAAO,MAAM,IAAI,YAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;CACzB,KAAG,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,CA6IhD,CAAA"}
1
+ {"version":3,"file":"callerWatch.d.ts","sourceRoot":"","sources":["../../src/internal/callerWatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAiB,KAAK,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQ9C,KAAK,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;AAEpB,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;AAEtB,KAAK,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;AAEpC,gBAAgB;AAChB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,gBAAgB;AAChB,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAClB;AAED,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACzC;AA6ED,iGAAiG;AACjG,eAAO,MAAM,IAAI,YAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;CACzB,KAAG,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,CA6IhD,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import * as Predicate from "effect/Predicate";
2
2
  import { Change } from "../Watch.js";
3
3
  import { getBytes } from "./bytePath.js";
4
- import { fsFailure } from "./errors.js";
5
- import { nameBytes, ownedPath, SLASH_HEX } from "./path.js";
6
- import { getNode, ROOT_INO } from "./volumeState.js";
4
+ import { Errors, Paths, State } from "./engine.js";
5
+ const fsFailure = Errors.fsFailure;
6
+ const { nameBytes, ownedPath, SLASH_HEX } = Paths;
7
+ const { getNode, ROOT_INO } = State;
7
8
  const directoryPath = (state, ino) => {
8
9
  const names = [];
9
10
  const visited = new Set();