@effect-vfs/core 0.3.0 → 0.3.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 (53) hide show
  1. package/dist/BytePath.d.ts +33 -2
  2. package/dist/BytePath.d.ts.map +1 -1
  3. package/dist/BytePath.js +1 -1
  4. package/dist/Snapshot.d.ts +58 -2
  5. package/dist/Snapshot.d.ts.map +1 -1
  6. package/dist/Snapshot.js +57 -1
  7. package/dist/SnapshotDelta.d.ts +113 -3
  8. package/dist/SnapshotDelta.d.ts.map +1 -1
  9. package/dist/SnapshotDelta.js +112 -2
  10. package/dist/VirtualFileSystem.d.ts +919 -10
  11. package/dist/VirtualFileSystem.d.ts.map +1 -1
  12. package/dist/VirtualFileSystem.js +575 -7
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/internal/bytePath.d.ts.map +1 -1
  16. package/dist/internal/bytePath.js +5 -10
  17. package/dist/internal/bytes.d.ts +6 -0
  18. package/dist/internal/bytes.d.ts.map +1 -0
  19. package/dist/internal/bytes.js +17 -0
  20. package/dist/internal/canonicalBase64.d.ts +13 -5
  21. package/dist/internal/canonicalBase64.d.ts.map +1 -1
  22. package/dist/internal/canonicalBase64.js +28 -6
  23. package/dist/internal/image.d.ts +76 -90
  24. package/dist/internal/image.d.ts.map +1 -1
  25. package/dist/internal/image.js +98 -89
  26. package/dist/internal/metadata.d.ts +28 -0
  27. package/dist/internal/metadata.d.ts.map +1 -0
  28. package/dist/internal/metadata.js +29 -0
  29. package/dist/internal/snapshotDelta.d.ts.map +1 -1
  30. package/dist/internal/snapshotDelta.js +346 -300
  31. package/dist/internal/snapshotDeltaModel.d.ts +2 -2
  32. package/dist/internal/snapshotDeltaModel.d.ts.map +1 -1
  33. package/dist/internal/snapshotDeltaModel.js +3 -1
  34. package/dist/internal/virtualFileSystem/errors.d.ts +5 -0
  35. package/dist/internal/virtualFileSystem/errors.d.ts.map +1 -1
  36. package/dist/internal/virtualFileSystem/errors.js +19 -0
  37. package/dist/internal/virtualFileSystem/fixture.d.ts.map +1 -1
  38. package/dist/internal/virtualFileSystem/fixture.js +74 -74
  39. package/dist/internal/virtualFileSystem/overlayContent.d.ts.map +1 -1
  40. package/dist/internal/virtualFileSystem/overlayContent.js +9 -2
  41. package/dist/internal/virtualFileSystem/overlayDiff.d.ts +2 -11
  42. package/dist/internal/virtualFileSystem/overlayDiff.d.ts.map +1 -1
  43. package/dist/internal/virtualFileSystem/overlayDiff.js +45 -71
  44. package/dist/internal/virtualFileSystem/path.d.ts +15 -14
  45. package/dist/internal/virtualFileSystem/path.d.ts.map +1 -1
  46. package/dist/internal/virtualFileSystem/path.js +57 -54
  47. package/dist/internal/virtualFileSystem/testHooks.d.ts.map +1 -1
  48. package/dist/internal/virtualFileSystem/watchHub.d.ts.map +1 -1
  49. package/dist/internal/virtualFileSystem/watchHub.js +13 -13
  50. package/dist/internal/virtualFileSystem.d.ts +91 -15
  51. package/dist/internal/virtualFileSystem.d.ts.map +1 -1
  52. package/dist/internal/virtualFileSystem.js +470 -392
  53. package/package.json +15 -5
@@ -2,33 +2,41 @@
2
2
  import * as ByteSize from "effect/ByteSize";
3
3
  import * as Effect from "effect/Effect";
4
4
  import * as Encoding from "effect/Encoding";
5
+ import * as Predicate from "effect/Predicate";
5
6
  import * as Result from "effect/Result";
6
- import * as Schema from "effect/Schema";
7
- import * as SchemaIssue from "effect/SchemaIssue";
8
- import {} from "../../BytePath.js";
9
7
  import { getBytes as getBytePathBytes, make as makeBytePath } from "../bytePath.js";
10
- import { ConfigurationError, FsError } from "./errors.js";
8
+ import { FsError } from "./errors.js";
9
+ // Components are hex-encoded bytes so names compare as bytes, not text: 2f is "/", 2e is ".", 2e2e is "..".
11
10
  /** @internal */
12
- export const failure = (code, operation, path) => new FsError({ code, operation, ...(path === undefined ? {} : { path }) });
11
+ export const SLASH_HEX = "2f";
13
12
  /** @internal */
14
- export const ownedPath = (bytes) => {
15
- return makeBytePath(bytes);
16
- };
13
+ export const DOT_HEX = "2e";
14
+ /** @internal */
15
+ export const DOT_DOT_HEX = "2e2e";
16
+ /** @internal */
17
+ export const SLASH_BYTE = 47;
18
+ // POSIX NAME_MAX: the longest single path component.
19
+ /** @internal */
20
+ export const MAX_NAME_BYTES = 255;
21
+ // A missing final component is rejected wherever "." and ".." are, so it counts as a dot component.
22
+ // Callers pass the code POSIX gives their operation, so the codes differ on purpose: EEXIST for
23
+ // create (link, symlink, mkdir), EISDIR for open and unlink, EINVAL for rename and rmdir.
24
+ /** @internal */
25
+ export const isDotComponent = (name) => name === undefined || name === DOT_HEX || name === DOT_DOT_HEX;
26
+ /** @internal */
27
+ export const ownedPath = (bytes) => makeBytePath(bytes);
17
28
  /** @internal */
18
29
  export const strictString = (bytes, operation) => Effect.try({
19
30
  try: () => new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes),
20
- catch: () => failure("UnrepresentableName", operation)
31
+ catch: () => new FsError({ code: "UnrepresentableName", operation })
21
32
  });
22
33
  /** @internal */
23
- export const nameBytes = (name) => {
24
- return Result.getOrThrow(Encoding.decodeHex(name));
25
- };
34
+ export const nameBytes = (name) => Result.getOrThrow(Encoding.decodeHex(name));
26
35
  // A zero-length view distinguishes a detached buffer from a valid empty buffer.
27
- /** @internal */
28
- export const attachedBuffer = (bytes) => {
36
+ const attachedBuffer = (bytes) => {
29
37
  try {
30
- new Uint8Array(bytes.buffer, bytes.byteOffset, 0);
31
- return true;
38
+ const probe = new Uint8Array(bytes.buffer, bytes.byteOffset, 0);
39
+ return probe.byteLength === 0;
32
40
  }
33
41
  catch (error) {
34
42
  if (error instanceof TypeError)
@@ -36,27 +44,29 @@ export const attachedBuffer = (bytes) => {
36
44
  throw error;
37
45
  }
38
46
  };
47
+ // Accepts any Uint8Array, subclasses such as Node's Buffer included; rejects views over a
48
+ // SharedArrayBuffer or a detached buffer before the bytes are copied or trusted.
49
+ /** @internal */
50
+ export const isAttachedBytes = (bytes) => Predicate.isUint8Array(bytes) && bytes.buffer instanceof ArrayBuffer && attachedBuffer(bytes);
39
51
  /** @internal */
40
52
  export const pathFromBytes = Effect.fn("VirtualFileSystem.pathFromBytes")(function* (bytes) {
41
- if (!(bytes instanceof Uint8Array) || !(bytes.buffer instanceof ArrayBuffer)) {
42
- return yield* failure("InvalidArgument", "pathFromBytes");
43
- }
44
- if (!attachedBuffer(bytes))
45
- return yield* failure("InvalidArgument", "pathFromBytes");
53
+ if (!isAttachedBytes(bytes))
54
+ return yield* new FsError({ code: "InvalidArgument", operation: "pathFromBytes" });
46
55
  const owned = new Uint8Array(bytes);
47
- if (owned.length === 0 || owned.includes(0))
48
- return yield* failure("InvalidArgument", "pathFromBytes");
56
+ if (owned.length === 0 || owned.includes(0)) {
57
+ return yield* new FsError({ code: "InvalidArgument", operation: "pathFromBytes" });
58
+ }
49
59
  return makeBytePath(owned);
50
60
  });
51
61
  /** @internal */
52
62
  export const pathToBytes = Effect.fn("VirtualFileSystem.pathToBytes")(function* (path) {
53
63
  const bytes = getBytePathBytes(path);
54
64
  if (bytes === undefined)
55
- return yield* failure("InvalidArgument", "pathToBytes");
65
+ return yield* new FsError({ code: "InvalidArgument", operation: "pathToBytes" });
56
66
  return new Uint8Array(bytes);
57
67
  });
58
- /** @internal */
59
- export const wellFormed = (value) => {
68
+ // Hand-rolled because String.prototype.isWellFormed is ES2024 and the package targets ES2023.
69
+ const wellFormed = (value) => {
60
70
  for (let index = 0; index < value.length; index++) {
61
71
  const code = value.charCodeAt(index);
62
72
  if (code >= 0xd800 && code <= 0xdbff) {
@@ -69,36 +79,38 @@ export const wellFormed = (value) => {
69
79
  }
70
80
  return true;
71
81
  };
82
+ const UTF8_ENCODER = new TextEncoder();
83
+ // Strings must be well-formed UTF-16 before encoding; BytePaths must belong to this package.
84
+ /** @internal */
85
+ export const inputBytes = (input) => Predicate.isString(input)
86
+ ? wellFormed(input) ? Result.succeed(UTF8_ENCODER.encode(input)) : Result.fail("InvalidPathEncoding")
87
+ : Result.fromNullishOr(getBytePathBytes(input), () => "InvalidArgument");
72
88
  /** @internal */
73
89
  export const preparePath = (input, operation, maxPathBytes) => {
74
- let bytes;
75
- if (typeof input === "string") {
76
- if (!wellFormed(input))
77
- return Result.fail(failure("InvalidPathEncoding", operation, input));
78
- bytes = new TextEncoder().encode(input);
90
+ const encoded = inputBytes(input);
91
+ if (Result.isFailure(encoded)) {
92
+ return Result.fail(encoded.failure === "InvalidPathEncoding"
93
+ ? new FsError({ code: "InvalidPathEncoding", operation, path: input })
94
+ : new FsError({ code: "InvalidArgument", operation }));
79
95
  }
80
- else if (typeof input === "object" && input !== null) {
81
- bytes = getBytePathBytes(input);
82
- }
83
- if (bytes === undefined)
84
- return Result.fail(failure("InvalidArgument", operation));
96
+ const bytes = encoded.success;
85
97
  if (bytes.length === 0)
86
- return Result.fail(failure("NotFound", operation, input));
98
+ return Result.fail(new FsError({ code: "NotFound", operation, path: input }));
87
99
  if (bytes.includes(0))
88
- return Result.fail(failure("InvalidArgument", operation, input));
100
+ return Result.fail(new FsError({ code: "InvalidArgument", operation, path: input }));
89
101
  if (maxPathBytes !== undefined && ByteSize.isGreaterThan(ByteSize.bytes(bytes.length), maxPathBytes)) {
90
- return Result.fail(failure("PathTooLong", operation, input));
102
+ return Result.fail(new FsError({ code: "PathTooLong", operation, path: input }));
91
103
  }
92
104
  const components = [];
93
105
  const suffixes = [];
94
106
  let start = 0;
95
107
  for (let index = 0; index <= bytes.length; index++) {
96
- if (index !== bytes.length && bytes[index] !== 47)
108
+ if (index !== bytes.length && bytes[index] !== SLASH_BYTE)
97
109
  continue;
98
110
  if (index > start) {
99
- // Provisional component bound from decision 0019; names are compared as bytes.
100
- if (index - start > 255)
101
- return Result.fail(failure("PathTooLong", operation, input));
111
+ if (index - start > MAX_NAME_BYTES) {
112
+ return Result.fail(new FsError({ code: "PathTooLong", operation, path: input }));
113
+ }
102
114
  components.push(Encoding.encodeHex(bytes.subarray(start, index)));
103
115
  suffixes.push(bytes.subarray(index));
104
116
  }
@@ -106,19 +118,10 @@ export const preparePath = (input, operation, maxPathBytes) => {
106
118
  }
107
119
  return Result.succeed({
108
120
  input,
109
- absolute: bytes[0] === 47,
110
- trailingSlash: bytes.at(-1) === 47,
121
+ absolute: bytes[0] === SLASH_BYTE,
122
+ trailingSlash: bytes.at(-1) === SLASH_BYTE,
111
123
  bytes,
112
124
  suffixes,
113
125
  components
114
126
  });
115
127
  };
116
- const configurationField = (issue) => {
117
- if (issue._tag === "Pointer")
118
- return issue.path.map(String).join(".");
119
- if (issue._tag === "Composite")
120
- return configurationField(issue.issues[0]);
121
- return "options";
122
- };
123
- /** @internal */
124
- export const decodeConfiguration = (schema, value) => Schema.decodeUnknownResult(schema, { onExcessProperty: "error" })(value).pipe(Result.mapError((error) => new ConfigurationError({ field: configurationField(error.issue) })));
@@ -1 +1 @@
1
- {"version":3,"file":"testHooks.d.ts","sourceRoot":"","sources":["../../../src/internal/virtualFileSystem/testHooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACxD;AAID,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,aAAc,QAAQ,KAAG,eAAe,GAAG,SAA2C,CAAA;AAErH,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,aAAc,QAAQ,QAAQ,eAAe,KAAG,MAAM,IAKpF,CAAA;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC7C;AAID,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,WAAY,MAAM,KAAG,gBAAgB,GAAG,SAA0C,CAAA;AAElH,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,WAAY,MAAM,QAAQ,gBAAgB,KAAG,MAAM,IAKlF,CAAA"}
1
+ {"version":3,"file":"testHooks.d.ts","sourceRoot":"","sources":["../../../src/internal/virtualFileSystem/testHooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACxD;AAID,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,aAAc,QAAQ,KAAG,eAAe,GAAG,SAA2C,CAAA;AAErH,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,aAAc,QAAQ,QAAQ,eAAe,KAAG,MAAM,IAMpF,CAAA;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC7C;AAID,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,WAAY,MAAM,KAAG,gBAAgB,GAAG,SAA0C,CAAA;AAElH,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,WAAY,MAAM,QAAQ,gBAAgB,KAAG,MAAM,IAMlF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"watchHub.d.ts","sourceRoot":"","sources":["../../../src/internal/virtualFileSystem/watchHub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAClE;AAED,gBAAgB;AAChB,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC/D,QAAQ,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAClH;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI,GAA+B,CAAC,sEA+B/C,CAAA"}
1
+ {"version":3,"file":"watchHub.d.ts","sourceRoot":"","sources":["../../../src/internal/virtualFileSystem/watchHub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAClE;AAGD,gBAAgB;AAChB,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC/D,QAAQ,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAClH;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI,GAA+B,CAAC,sEAmC/C,CAAA"}
@@ -1,9 +1,11 @@
1
+ // Change broadcasting for Volume.watch: one PubSub per volume, published to only while someone listens.
1
2
  import * as Effect from "effect/Effect";
2
3
  import * as PubSub from "effect/PubSub";
3
4
  import * as Stream from "effect/Stream";
4
5
  /** @internal */
5
6
  export const make = Effect.fnUntraced(function* (coordinate) {
6
7
  const pubsub = yield* PubSub.unbounded();
8
+ // Guarded by `coordinate`: publishers run inside coordinated mutations and both writes below hold the gate.
7
9
  let activeSubscribers = 0;
8
10
  const publishUnsafe = (event) => {
9
11
  if (activeSubscribers === 0)
@@ -16,18 +18,16 @@ export const make = Effect.fnUntraced(function* (coordinate) {
16
18
  for (const event of events())
17
19
  PubSub.publishUnsafe(pubsub, event);
18
20
  };
19
- const subscribe = (afterSubscribe) => Effect.uninterruptible(Effect.gen(function* () {
20
- const subscription = yield* coordinate(Effect.gen(function* () {
21
- const subscription = yield* PubSub.subscribe(pubsub);
22
- if (afterSubscribe !== undefined)
23
- yield* afterSubscribe;
24
- activeSubscribers += 1;
25
- return subscription;
26
- }));
27
- yield* Effect.addFinalizer(() => coordinate(Effect.sync(() => {
28
- activeSubscribers -= 1;
29
- })));
30
- return Stream.fromSubscription(subscription);
31
- }));
21
+ // Registration is uninterruptible end to end, including the permit wait, so a watcher is never
22
+ // half-registered. This deliberately tightens the engine's "permit waits stay interruptible" rule.
23
+ const subscribe = (afterSubscribe) => Effect.acquireRelease(coordinate(Effect.gen(function* () {
24
+ const subscription = yield* PubSub.subscribe(pubsub);
25
+ if (afterSubscribe !== undefined)
26
+ yield* afterSubscribe;
27
+ activeSubscribers += 1;
28
+ return subscription;
29
+ })), () => coordinate(Effect.sync(() => {
30
+ activeSubscribers -= 1;
31
+ }))).pipe(Effect.map(Stream.fromSubscription));
32
32
  return { publishUnsafe, publishManyUnsafe, subscribe };
33
33
  });
@@ -1,5 +1,6 @@
1
1
  import * as ByteSize from "effect/ByteSize";
2
2
  import * as Context from "effect/Context";
3
+ import * as Data from "effect/Data";
3
4
  import * as Effect from "effect/Effect";
4
5
  import * as Schema from "effect/Schema";
5
6
  import { BytePath } from "../BytePath.js";
@@ -20,8 +21,6 @@ export declare const ObjectReferenceId: unique symbol;
20
21
  /** @internal */
21
22
  export { ConfigurationError, FsCodeSchema as FsCode, FsError };
22
23
  /** @internal */
23
- export declare const Mode: Schema.Natural;
24
- /** @internal */
25
24
  export declare const Identity: Schema.Struct<{
26
25
  readonly uid: Schema.Natural;
27
26
  readonly gid: Schema.Natural;
@@ -52,8 +51,6 @@ export declare const VolumeOptions: Schema.Struct<{
52
51
  /** @internal */
53
52
  export type VolumeOptions = typeof VolumeOptions.Type;
54
53
  /** @internal */
55
- export declare const Timestamp: Schema.BigInt;
56
- /** @internal */
57
54
  export declare const Metadata: Schema.Struct<{
58
55
  readonly kind: Schema.Literals<readonly ["directory", "file", "symlink"]>;
59
56
  readonly ino: Schema.BigInt;
@@ -121,8 +118,7 @@ export declare const OpenSettings: Schema.Struct<{
121
118
  }>;
122
119
  /** @internal */
123
120
  export type OpenOptions = typeof OpenSettings.Type & RelativeOptions;
124
- /** @internal */
125
- export declare const WriteFileSettings: Schema.Struct<{
121
+ declare const WriteFileSettings: Schema.Struct<{
126
122
  readonly access: Schema.Literals<readonly ["read", "write", "readWrite"]>;
127
123
  readonly create: Schema.optionalKey<Schema.Literals<readonly ["never", "ifMissing", "exclusive"]>>;
128
124
  readonly mode: Schema.optionalKey<Schema.Natural>;
@@ -187,6 +183,50 @@ export declare const FixtureMetadata: Schema.Struct<{
187
183
  readonly birthtimeNs: Schema.optionalKey<Schema.BigInt>;
188
184
  }>;
189
185
  /** @internal */
186
+ export declare const FixtureEntry: Schema.toTaggedUnion<"kind", readonly [Schema.Struct<{
187
+ readonly kind: Schema.Literal<"directory">;
188
+ readonly path: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
189
+ readonly metadata: Schema.optionalKey<Schema.Struct<{
190
+ readonly uid: Schema.optionalKey<Schema.Natural>;
191
+ readonly gid: Schema.optionalKey<Schema.Natural>;
192
+ readonly mode: Schema.optionalKey<Schema.Natural>;
193
+ readonly atimeNs: Schema.optionalKey<Schema.BigInt>;
194
+ readonly mtimeNs: Schema.optionalKey<Schema.BigInt>;
195
+ readonly ctimeNs: Schema.optionalKey<Schema.BigInt>;
196
+ readonly birthtimeNs: Schema.optionalKey<Schema.BigInt>;
197
+ }>>;
198
+ }>, Schema.Struct<{
199
+ readonly kind: Schema.Literal<"file">;
200
+ readonly path: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
201
+ readonly bytes: Schema.Uint8Array;
202
+ readonly metadata: Schema.optionalKey<Schema.Struct<{
203
+ readonly uid: Schema.optionalKey<Schema.Natural>;
204
+ readonly gid: Schema.optionalKey<Schema.Natural>;
205
+ readonly mode: Schema.optionalKey<Schema.Natural>;
206
+ readonly atimeNs: Schema.optionalKey<Schema.BigInt>;
207
+ readonly mtimeNs: Schema.optionalKey<Schema.BigInt>;
208
+ readonly ctimeNs: Schema.optionalKey<Schema.BigInt>;
209
+ readonly birthtimeNs: Schema.optionalKey<Schema.BigInt>;
210
+ }>>;
211
+ }>, Schema.Struct<{
212
+ readonly kind: Schema.Literal<"symlink">;
213
+ readonly path: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
214
+ readonly target: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
215
+ readonly metadata: Schema.optionalKey<Schema.Struct<{
216
+ readonly uid: Schema.optionalKey<Schema.Natural>;
217
+ readonly gid: Schema.optionalKey<Schema.Natural>;
218
+ readonly mode: Schema.optionalKey<Schema.Natural>;
219
+ readonly atimeNs: Schema.optionalKey<Schema.BigInt>;
220
+ readonly mtimeNs: Schema.optionalKey<Schema.BigInt>;
221
+ readonly ctimeNs: Schema.optionalKey<Schema.BigInt>;
222
+ readonly birthtimeNs: Schema.optionalKey<Schema.BigInt>;
223
+ }>>;
224
+ }>, Schema.Struct<{
225
+ readonly kind: Schema.Literal<"hardLink">;
226
+ readonly path: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
227
+ readonly target: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
228
+ }>]>;
229
+ /** @internal */
190
230
  export declare const Fixture: Schema.Struct<{
191
231
  readonly rootMetadata: Schema.optionalKey<Schema.Struct<{
192
232
  readonly uid: Schema.optionalKey<Schema.Natural>;
@@ -197,7 +237,7 @@ export declare const Fixture: Schema.Struct<{
197
237
  readonly ctimeNs: Schema.optionalKey<Schema.BigInt>;
198
238
  readonly birthtimeNs: Schema.optionalKey<Schema.BigInt>;
199
239
  }>>;
200
- readonly entries: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
240
+ readonly entries: Schema.$Array<Schema.toTaggedUnion<"kind", readonly [Schema.Struct<{
201
241
  readonly kind: Schema.Literal<"directory">;
202
242
  readonly path: Schema.Union<readonly [Schema.String, Schema.declare<BytePath, BytePath>]>;
203
243
  readonly metadata: Schema.optionalKey<Schema.Struct<{
@@ -254,18 +294,54 @@ type VolumeSource = {
254
294
  readonly image: Image.Document;
255
295
  };
256
296
  /** @internal */
257
- export declare const makeVolume: (source: VolumeSource, options?: {
297
+ export declare const VolumeSource: {
298
+ readonly $is: <Tag extends "Empty" | "Overlay" | "Snapshot">(tag: Tag) => (u: unknown) => u is Extract<{
299
+ readonly _tag: "Empty";
300
+ }, {
301
+ readonly _tag: Tag;
302
+ }> | Extract<{
303
+ readonly _tag: "Snapshot";
304
+ readonly image: Image.Document;
305
+ }, {
306
+ readonly _tag: Tag;
307
+ }> | Extract<{
308
+ readonly _tag: "Overlay";
309
+ readonly base: Snapshot;
310
+ readonly image: Image.Document;
311
+ }, {
312
+ readonly _tag: Tag;
313
+ }>;
314
+ readonly $match: {
315
+ <Cases extends { readonly [Tag in "Empty" | "Overlay" | "Snapshot"]: (args: Extract<VolumeSource, {
316
+ readonly _tag: Tag;
317
+ }>) => any; }>(cases: Cases): (value: VolumeSource) => import("effect/Unify").Unify<ReturnType<Cases["Empty" | "Overlay" | "Snapshot"]>>;
318
+ <Cases extends { readonly [Tag in "Empty" | "Overlay" | "Snapshot"]: (args: Extract<VolumeSource, {
319
+ readonly _tag: Tag;
320
+ }>) => any; }>(value: VolumeSource, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Empty" | "Overlay" | "Snapshot"]>>;
321
+ };
322
+ readonly Empty: Data.TaggedEnum.ConstructorFrom<{
323
+ readonly _tag: "Empty";
324
+ }, "_tag">;
325
+ readonly Overlay: Data.TaggedEnum.ConstructorFrom<{
326
+ readonly _tag: "Overlay";
327
+ readonly base: Snapshot;
328
+ readonly image: Image.Document;
329
+ }, "_tag">;
330
+ readonly Snapshot: Data.TaggedEnum.ConstructorFrom<{
331
+ readonly _tag: "Snapshot";
332
+ readonly image: Image.Document;
333
+ }, "_tag">;
334
+ };
335
+ type VolumeFor<S extends VolumeSource> = S extends {
336
+ readonly _tag: "Overlay";
337
+ } ? OverlayVolume : Volume;
338
+ /** @internal */
339
+ export declare const makeVolume: <S extends VolumeSource>(source: S, options?: {
258
340
  readonly maxEntries?: number;
259
341
  readonly maxBytes?: ByteSize.ByteSize;
260
342
  readonly maxFileBytes?: ByteSize.ByteSize;
261
343
  readonly maxPathBytes?: ByteSize.ByteSize;
262
- } | undefined) => Effect.Effect<{
263
- _tag: "Volume";
264
- volume: Volume;
265
- } | {
266
- _tag: "Overlay";
267
- volume: OverlayVolume;
268
- }, ConfigurationError | ImageError, never>;
344
+ } | undefined) => Effect.Effect<VolumeFor<S>, ConfigurationError | ImageError, never>;
269
345
  /** @internal */
270
346
  export declare const make: (options?: {
271
347
  readonly maxEntries?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EACV,MAAM,EAMN,aAAa,EAEb,eAAe,EACf,MAAM,EACP,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAuB,MAAM,IAAI,YAAY,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAqBxH,gBAAgB;AAChB,eAAO,MAAM,QAAQ,eAAoC,CAAA;AAEzD,gBAAgB;AAChB,eAAO,MAAM,QAAQ,eAAoC,CAAA;AAEzD,gBAAgB;AAChB,eAAO,MAAM,YAAY,eAAwC,CAAA;AAEjE,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,eAA6C,CAAA;AAE3E,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,eAA6C,CAAA;AAE3E,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,YAAY,IAAI,MAAM,EAAE,OAAO,EAAE,CAAA;AAsC9D,gBAAgB;AAChB,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C,gBAAgB;AAChB,eAAO,MAAM,iBAAiB;;;;;;;;EAG5B,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D,gBAAgB;AAChB,eAAO,MAAM,aAAa;;;;;EAiBxB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAIrD,gBAAgB;AAChB,eAAO,MAAM,QAAQ;;;;;;;;;;;;EAYnB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;EAGtB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,gBAAgB;AAChB,eAAO,MAAM,UAAU;;;;;;;IAIrB,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;EAAkE,CAAA;AAEpF,gBAAgB;AAChB,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAErC,gBAAgB;AAChB,eAAO,MAAM,QAAQ,uEAA+D,CAAA;AAEpF,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAI3C,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;;;EAOvB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,IAAI,GAAG,eAAe,CAAA;AAEpE,QAAA,MAAM,iBAAiB;;;;;;;;;EAIrB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,CAAC,IAAI,GAAG,eAAe,CAAA;AAU9E,gBAAgB;AAChB,eAAO,MAAM,eAAe,4DAAoD,CAAA;AAEhF,gBAAgB;AAChB,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAEzD,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,6GAS5B,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAM7D,gBAAgB;AAChB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;IAgBxB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD,gBAAgB;AAChB,eAAO,MAAM,qBAAqB;;EAEhC,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAA;;AAErE,gBAAgB;AAChB,qBAAa,iBACX,SAAQ,sBAAkF;CAC1F;AAEF,gBAAgB;AAChB,eAAO,MAAM,eAAe;;;;;;;;EAQ1B,CAAA;AAOF,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmBY,CAAA;AAErC,gBAAgB;AAChB,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlB,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AA6FzC,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAA;CAAE,GAC7D;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAA;CAC/B,CAAA;AAEH,gBAAgB;AAChB,eAAO,MAAM,YAAY;;uBATJ,OAAO;;;;uBACP,UAAU;wBAAkB,KAAK,CAAC,QAAQ;;;;uBAE5C,SAAS;uBACT,QAAQ;wBACP,KAAK,CAAC,QAAQ;;;;;;;;;;;;;uBALb,OAAO;;;uBAGT,SAAS;uBACT,QAAQ;wBACP,KAAK,CAAC,QAAQ;;;uBAJb,UAAU;wBAAkB,KAAK,CAAC,QAAQ;;CAQJ,CAAA;AAE3D,KAAK,SAAS,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,aAAa,GAAG,MAAM,CAAA;AAMxG,gBAAgB;AAChB,eAAO,MAAM,UAAU,GACX,CAAC,SAAS,YAAY;;;;;qFA05DjC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI;;;;;kEAEf,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;+EAMxB,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;;;sFAMvB,CAAA"}