@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.
- package/README.md +14 -9
- package/dist/BytePath.d.ts +2 -1
- package/dist/BytePath.d.ts.map +1 -1
- package/dist/LiveVolume.d.ts +6 -3
- package/dist/LiveVolume.d.ts.map +1 -1
- package/dist/LiveVolume.js +2 -0
- package/dist/Snapshot.d.ts +2 -1
- package/dist/Snapshot.d.ts.map +1 -1
- package/dist/Snapshot.js +2 -1
- package/dist/Testing.d.ts +9 -5
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js +7 -18
- package/dist/VfsError.d.ts +2 -1
- package/dist/VfsError.d.ts.map +1 -1
- package/dist/VfsError.js +2 -1
- package/dist/VirtualFileSystem.d.ts +89 -47
- package/dist/VirtualFileSystem.d.ts.map +1 -1
- package/dist/VirtualFileSystem.js +62 -29
- package/dist/internal/canonicalBase64.js +3 -3
- package/dist/internal/fixture.d.ts +1 -1
- package/dist/internal/fixture.d.ts.map +1 -1
- package/dist/internal/overlayDiff.d.ts.map +1 -1
- package/dist/internal/overlayDiff.js +6 -14
- package/dist/internal/path.d.ts.map +1 -1
- package/dist/internal/path.js +3 -3
- package/dist/internal/snapshotDelta.d.ts.map +1 -1
- package/dist/internal/snapshotDelta.js +9 -15
- package/dist/internal/tree.d.ts.map +1 -1
- package/dist/internal/tree.js +14 -14
- package/dist/internal/virtualFileSystem.d.ts +13 -7
- package/dist/internal/virtualFileSystem.d.ts.map +1 -1
- package/dist/internal/virtualFileSystem.js +442 -399
- package/dist/internal/volumeState.d.ts +3 -2
- package/dist/internal/volumeState.d.ts.map +1 -1
- package/dist/internal/volumeState.js +28 -30
- package/package.json +7 -7
- package/dist/internal/stagedState.d.ts +0 -18
- package/dist/internal/stagedState.d.ts.map +0 -1
- package/dist/internal/stagedState.js +0 -18
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as Brand from "effect/Brand";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Order from "effect/Order";
|
|
3
4
|
import type { Metadata } from "../Metadata.js";
|
|
4
5
|
import * as InodeTable from "./inodeTable.js";
|
|
5
6
|
import type { StoredMetadata } from "./metadata.js";
|
|
@@ -64,9 +65,9 @@ export interface VolumeState {
|
|
|
64
65
|
/** @internal */
|
|
65
66
|
export declare const getNode: (state: VolumeState, ino: Ino) => Node | undefined;
|
|
66
67
|
/** @internal */
|
|
67
|
-
export declare const byIno:
|
|
68
|
+
export declare const byIno: Order.Order<Node>;
|
|
68
69
|
/** @internal */
|
|
69
|
-
export declare const byEntryName:
|
|
70
|
+
export declare const byEntryName: Order.Order<readonly [string, Ino]>;
|
|
70
71
|
/** @internal */
|
|
71
72
|
export declare const payloadOf: (node: Node) => Uint8Array | undefined;
|
|
72
73
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumeState.d.ts","sourceRoot":"","sources":["../../src/internal/volumeState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"volumeState.d.ts","sourceRoot":"","sources":["../../src/internal/volumeState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as Brand from "effect/Brand";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Match from "effect/Match";
|
|
4
|
+
import * as Order from "effect/Order";
|
|
3
5
|
import * as InodeTable from "./inodeTable.js";
|
|
4
6
|
/** @internal */
|
|
5
7
|
export const Ino = Brand.nominal();
|
|
@@ -19,9 +21,9 @@ export const WALK_YIELD_INTERVAL = 128;
|
|
|
19
21
|
/** @internal */
|
|
20
22
|
export const getNode = (state, ino) => InodeTable.get(state.inodes, ino);
|
|
21
23
|
/** @internal */
|
|
22
|
-
export const byIno = (
|
|
24
|
+
export const byIno = Order.mapInput(Order.Number, (node) => node.ino);
|
|
23
25
|
/** @internal */
|
|
24
|
-
export const byEntryName = (
|
|
26
|
+
export const byEntryName = Order.mapInput(Order.String, ([name]) => name);
|
|
25
27
|
const inNameOrder = (entries) => {
|
|
26
28
|
let previous;
|
|
27
29
|
for (const name of entries.keys()) {
|
|
@@ -170,34 +172,30 @@ export const assemble = (specs) => {
|
|
|
170
172
|
const owner = Symbol();
|
|
171
173
|
let inodes = InodeTable.empty();
|
|
172
174
|
for (const spec of specs) {
|
|
173
|
-
const base = { ...spec.metadata,
|
|
174
|
-
const node = spec.kind
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
links: spec.links,
|
|
198
|
-
metadata: { ...base, nlink: spec.links.length, size: BigInt(spec.target.length) },
|
|
199
|
-
revision: spec.revision
|
|
200
|
-
};
|
|
175
|
+
const base = { ...spec.metadata, ino: BigInt(spec.ino) };
|
|
176
|
+
const node = Match.value(spec).pipe(Match.discriminator("kind")("directory", (directory) => ({
|
|
177
|
+
kind: "directory",
|
|
178
|
+
ino: directory.ino,
|
|
179
|
+
parent: directory.parent,
|
|
180
|
+
name: directory.name,
|
|
181
|
+
entries: new Map((edges.get(directory.ino) ?? []).sort(byEntryName)),
|
|
182
|
+
metadata: { ...base, kind: "directory", nlink: 2 + (subdirectories.get(directory.ino) ?? 0), size: 0n },
|
|
183
|
+
revision: directory.revision
|
|
184
|
+
})), Match.discriminator("kind")("file", (file) => ({
|
|
185
|
+
kind: "file",
|
|
186
|
+
ino: file.ino,
|
|
187
|
+
data: file.data,
|
|
188
|
+
links: file.links,
|
|
189
|
+
metadata: { ...base, kind: "file", nlink: file.links.length, size: BigInt(file.data.length) },
|
|
190
|
+
revision: file.revision
|
|
191
|
+
})), Match.discriminator("kind")("symlink", (symlink) => ({
|
|
192
|
+
kind: "symlink",
|
|
193
|
+
ino: symlink.ino,
|
|
194
|
+
target: symlink.target,
|
|
195
|
+
links: symlink.links,
|
|
196
|
+
metadata: { ...base, kind: "symlink", nlink: symlink.links.length, size: BigInt(symlink.target.length) },
|
|
197
|
+
revision: symlink.revision
|
|
198
|
+
})), Match.exhaustive);
|
|
201
199
|
inodes = InodeTable.set(inodes, spec.ino, node, owner);
|
|
202
200
|
}
|
|
203
201
|
return { inodes, open: new Map(), nextInode, revision, entries, usedBytes };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-vfs/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "A runtime-neutral virtual filesystem core for Effect.",
|
|
5
5
|
"homepage": "https://github.com/lloydrichards/effect-virtual-fs#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "tsc --project tsconfig.build.json && tsc --project compatibility/node-next/tsconfig.json",
|
|
23
23
|
"clean": "git clean -xdf .cache .turbo dist docs node_modules tsconfig.tsbuildinfo",
|
|
24
|
-
"test": "vitest run",
|
|
24
|
+
"test": "bun --bun run vitest run --config ../../vitest.config.ts --project core",
|
|
25
25
|
"type-check": "tsc --noEmit && tsc --project contracts/tsconfig.json"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"effect": "4.0.0
|
|
28
|
+
"effect": "^4.0.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@effect/platform-bun": "4.0.0
|
|
32
|
-
"@effect/platform-node-shared": "4.0.0
|
|
33
|
-
"@effect/vitest": "4.0.0
|
|
31
|
+
"@effect/platform-bun": "4.0.0",
|
|
32
|
+
"@effect/platform-node-shared": "4.0.0",
|
|
33
|
+
"@effect/vitest": "4.0.0",
|
|
34
34
|
"@repo/config-typescript": "workspace:*",
|
|
35
|
-
"effect": "4.0.0
|
|
35
|
+
"effect": "4.0.0"
|
|
36
36
|
},
|
|
37
37
|
"exports": {
|
|
38
38
|
".": {
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
|
-
import type { FsFailure } from "../VfsError.js";
|
|
3
|
-
type CommitOutcome = "committed" | "rejected" | "unknown";
|
|
4
|
-
/** @internal */
|
|
5
|
-
export interface CommitProvider<State> {
|
|
6
|
-
/** Preparation failures leave the volume available. */
|
|
7
|
-
readonly prepare?: (candidate: State) => Effect.Effect<void, FsFailure>;
|
|
8
|
-
readonly commit: (candidate: State) => Effect.Effect<CommitOutcome>;
|
|
9
|
-
}
|
|
10
|
-
/** @internal */
|
|
11
|
-
export interface Classified {
|
|
12
|
-
readonly available: boolean;
|
|
13
|
-
readonly failure: FsFailure | undefined;
|
|
14
|
-
}
|
|
15
|
-
/** @internal */
|
|
16
|
-
export declare const offerCommit: <State>(provider: CommitProvider<State>, operation: string, candidate: State, cleanup: boolean) => Effect.Effect<Classified>;
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=stagedState.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stagedState.d.ts","sourceRoot":"","sources":["../../src/internal/stagedState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C,KAAK,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD,gBAAgB;AAChB,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,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;AAED,gBAAgB;AAChB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;CACxC;AAGD,gBAAgB;AAChB,eAAO,MAAM,WAAW,GAAI,KAAK,YACrB,cAAc,CAAC,KAAK,CAAC,aACpB,MAAM,aACN,KAAK,WACP,OAAO,KACf,MAAM,CAAC,MAAM,CAAC,UAAU,CAgBvB,CAAA"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
|
-
import * as Exit from "effect/Exit";
|
|
3
|
-
import { fsFailure } from "./errors.js";
|
|
4
|
-
// An unknown commit outcome stops the volume; definite rejection stops it only during cleanup.
|
|
5
|
-
/** @internal */
|
|
6
|
-
export const offerCommit = (provider, operation, candidate, cleanup) => Effect.map(Effect.exit(Effect.suspend(() => provider.commit(candidate))), (committed) => {
|
|
7
|
-
// TODO(#186): Preserve the cause of a provider defect or interruption.
|
|
8
|
-
if (Exit.isFailure(committed)) {
|
|
9
|
-
return { available: false, failure: fsFailure("OutcomeUnknown", operation) };
|
|
10
|
-
}
|
|
11
|
-
if (committed.value === "rejected") {
|
|
12
|
-
return { available: !cleanup, failure: fsFailure("StorageRejected", operation) };
|
|
13
|
-
}
|
|
14
|
-
if (committed.value === "unknown") {
|
|
15
|
-
return { available: false, failure: fsFailure("OutcomeUnknown", operation) };
|
|
16
|
-
}
|
|
17
|
-
return { available: true, failure: undefined };
|
|
18
|
-
});
|