@openclaw/fs-safe 0.10.0 → 0.11.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.
- package/CHANGELOG.md +56 -0
- package/LICENSE +1 -0
- package/README.md +36 -5
- package/dist/absolute-path.d.ts.map +1 -1
- package/dist/absolute-path.js +3 -2
- package/dist/advanced.d.ts +4 -0
- package/dist/advanced.d.ts.map +1 -1
- package/dist/advanced.js +4 -0
- package/dist/archive-durability.d.ts +6 -6
- package/dist/archive-durability.d.ts.map +1 -1
- package/dist/archive-durability.js +1 -1
- package/dist/archive-entry.d.ts.map +1 -1
- package/dist/archive-entry.js +4 -5
- package/dist/archive-gzip-tail.d.ts +1 -0
- package/dist/archive-gzip-tail.d.ts.map +1 -1
- package/dist/archive-gzip-tail.js +3 -0
- package/dist/archive-input.d.ts.map +1 -1
- package/dist/archive-input.js +4 -2
- package/dist/archive-merge.d.ts +5 -1
- package/dist/archive-merge.d.ts.map +1 -1
- package/dist/archive-merge.js +15 -12
- package/dist/archive-native.js +4 -4
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-read.d.ts.map +1 -1
- package/dist/archive-read.js +17 -9
- package/dist/archive-staging.d.ts +6 -3
- package/dist/archive-staging.d.ts.map +1 -1
- package/dist/archive-staging.js +42 -22
- package/dist/archive-tar-stream.d.ts.map +1 -1
- package/dist/archive-tar-stream.js +7 -6
- package/dist/archive-tar-wasm.d.ts.map +1 -1
- package/dist/archive-tar-wasm.js +16 -13
- package/dist/archive-zip-admission.d.ts +1 -1
- package/dist/archive-zip-admission.d.ts.map +1 -1
- package/dist/archive-zip-admission.js +48 -12
- package/dist/archive-zip-loader.d.ts +6 -0
- package/dist/archive-zip-loader.d.ts.map +1 -0
- package/dist/archive-zip-loader.js +38 -0
- package/dist/archive-zip-names.d.ts.map +1 -1
- package/dist/archive-zip-names.js +13 -8
- package/dist/archive-zip-preflight.d.ts +2 -3
- package/dist/archive-zip-preflight.d.ts.map +1 -1
- package/dist/archive-zip-preflight.js +2 -34
- package/dist/archive.d.ts.map +1 -1
- package/dist/archive.js +12 -10
- package/dist/bounded-read.d.ts +5 -0
- package/dist/bounded-read.d.ts.map +1 -1
- package/dist/bounded-read.js +16 -9
- package/dist/copy-file-input.d.ts +0 -1
- package/dist/copy-file-input.d.ts.map +1 -1
- package/dist/copy-file-input.js +4 -26
- package/dist/copy-tree-portable.d.ts.map +1 -1
- package/dist/copy-tree-portable.js +57 -26
- package/dist/copy.d.ts +1 -1
- package/dist/copy.d.ts.map +1 -1
- package/dist/copy.js +3 -1
- package/dist/directory-durability.d.ts.map +1 -1
- package/dist/directory-durability.js +5 -4
- package/dist/directory-guard.d.ts +11 -1
- package/dist/directory-guard.d.ts.map +1 -1
- package/dist/directory-guard.js +53 -11
- package/dist/durability.d.ts +1 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +1 -1
- package/dist/file-handle-transfer.d.ts +14 -0
- package/dist/file-handle-transfer.d.ts.map +1 -0
- package/dist/file-handle-transfer.js +64 -0
- package/dist/file-hash.d.ts +3 -0
- package/dist/file-hash.d.ts.map +1 -1
- package/dist/file-hash.js +91 -31
- package/dist/file-lock-sync.d.ts.map +1 -1
- package/dist/file-lock-sync.js +8 -4
- package/dist/file-store-boundary.d.ts.map +1 -1
- package/dist/file-store-boundary.js +7 -5
- package/dist/file-store-path.d.ts +3 -0
- package/dist/file-store-path.d.ts.map +1 -0
- package/dist/file-store-path.js +27 -0
- package/dist/file-store-prune.d.ts.map +1 -1
- package/dist/file-store-prune.js +6 -4
- package/dist/file-store-sync-write.d.ts.map +1 -1
- package/dist/file-store-sync-write.js +56 -44
- package/dist/file-store.d.ts.map +1 -1
- package/dist/file-store.js +2 -18
- package/dist/filename.d.ts.map +1 -1
- package/dist/filename.js +2 -1
- package/dist/guarded-mkdir.d.ts.map +1 -1
- package/dist/guarded-mkdir.js +3 -2
- package/dist/guest-dispatch-python.d.ts +2 -0
- package/dist/guest-dispatch-python.d.ts.map +1 -0
- package/dist/guest-dispatch-python.js +117 -0
- package/dist/guest-native-python.d.ts +4 -0
- package/dist/guest-native-python.d.ts.map +1 -0
- package/dist/guest-native-python.js +135 -0
- package/dist/guest.d.ts +9 -0
- package/dist/guest.d.ts.map +1 -0
- package/dist/guest.js +413 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/install-path.d.ts.map +1 -1
- package/dist/install-path.js +3 -2
- package/dist/json-durable-queue-directory.js +3 -3
- package/dist/json-durable-queue.d.ts.map +1 -1
- package/dist/json-durable-queue.js +6 -4
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js +2 -1
- package/dist/local-roots.d.ts.map +1 -1
- package/dist/local-roots.js +2 -1
- package/dist/move-path-stage.d.ts.map +1 -1
- package/dist/move-path-stage.js +2 -1
- package/dist/move-path.d.ts.map +1 -1
- package/dist/move-path.js +4 -3
- package/dist/mutation-authority.d.ts +1 -0
- package/dist/mutation-authority.d.ts.map +1 -1
- package/dist/mutation-authority.js +4 -4
- package/dist/native-binding.d.ts +7 -2
- package/dist/native-binding.d.ts.map +1 -1
- package/dist/native-pinned-write-windows.d.ts.map +1 -1
- package/dist/native-pinned-write-windows.js +3 -2
- package/dist/native-pinned-write.d.ts.map +1 -1
- package/dist/native-pinned-write.js +2 -1
- package/dist/opened-realpath.d.ts.map +1 -1
- package/dist/opened-realpath.js +5 -4
- package/dist/output.d.ts +2 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +2 -0
- package/dist/overwrite-file-handle.d.ts +8 -0
- package/dist/overwrite-file-handle.d.ts.map +1 -0
- package/dist/overwrite-file-handle.js +42 -0
- package/dist/path-case.d.ts +7 -0
- package/dist/path-case.d.ts.map +1 -0
- package/dist/path-case.js +136 -0
- package/dist/path.d.ts.map +1 -1
- package/dist/path.js +2 -1
- package/dist/permissions-windows.d.ts +1 -1
- package/dist/permissions-windows.d.ts.map +1 -1
- package/dist/permissions-windows.js +48 -6
- package/dist/pinned-open.d.ts.map +1 -1
- package/dist/pinned-open.js +3 -1
- package/dist/pinned-write.d.ts +2 -2
- package/dist/pinned-write.d.ts.map +1 -1
- package/dist/pinned-write.js +2 -1
- package/dist/private-temp-workspace.d.ts.map +1 -1
- package/dist/private-temp-workspace.js +6 -4
- package/dist/realpath.d.ts +4 -0
- package/dist/realpath.d.ts.map +1 -0
- package/dist/realpath.js +43 -0
- package/dist/recursive-mkdir-path.d.ts +3 -0
- package/dist/recursive-mkdir-path.d.ts.map +1 -0
- package/dist/recursive-mkdir-path.js +8 -0
- package/dist/replace-directory.d.ts.map +1 -1
- package/dist/replace-directory.js +2 -1
- package/dist/replace-file-copy-fallback.d.ts.map +1 -1
- package/dist/replace-file-copy-fallback.js +23 -31
- package/dist/replace-file-copy-source.d.ts.map +1 -1
- package/dist/replace-file-copy-source.js +7 -12
- package/dist/replace-file-mode.d.ts +3 -0
- package/dist/replace-file-mode.d.ts.map +1 -0
- package/dist/replace-file-mode.js +10 -0
- package/dist/replace-file.d.ts +1 -0
- package/dist/replace-file.d.ts.map +1 -1
- package/dist/replace-file.js +14 -8
- package/dist/root-context.d.ts.map +1 -1
- package/dist/root-context.js +8 -8
- package/dist/root-create-input.d.ts +10 -0
- package/dist/root-create-input.d.ts.map +1 -0
- package/dist/root-create-input.js +80 -0
- package/dist/root-directory-list.d.ts +3 -1
- package/dist/root-directory-list.d.ts.map +1 -1
- package/dist/root-directory-list.js +21 -3
- package/dist/root-entries.d.ts +11 -0
- package/dist/root-entries.d.ts.map +1 -0
- package/dist/root-entries.js +61 -0
- package/dist/root-errors.d.ts +5 -5
- package/dist/root-errors.d.ts.map +1 -1
- package/dist/root-errors.js +13 -12
- package/dist/root-impl.d.ts +13 -3
- package/dist/root-impl.d.ts.map +1 -1
- package/dist/root-impl.js +40 -36
- package/dist/root-options.d.ts +12 -1
- package/dist/root-options.d.ts.map +1 -1
- package/dist/root-path-existing.d.ts.map +1 -1
- package/dist/root-path-existing.js +4 -3
- package/dist/root-path-symlink.d.ts.map +1 -1
- package/dist/root-path-symlink.js +3 -2
- package/dist/root-paths.d.ts.map +1 -1
- package/dist/root-paths.js +13 -9
- package/dist/root-remove.d.ts +5 -0
- package/dist/root-remove.d.ts.map +1 -0
- package/dist/root-remove.js +286 -0
- package/dist/root-symlink-policy.d.ts +2 -1
- package/dist/root-symlink-policy.d.ts.map +1 -1
- package/dist/root-symlink-policy.js +2 -2
- package/dist/root-write-mode.d.ts.map +1 -1
- package/dist/root-write-mode.js +2 -1
- package/dist/root.d.ts +2 -1
- package/dist/root.d.ts.map +1 -1
- package/dist/secret-file.d.ts.map +1 -1
- package/dist/secret-file.js +2 -1
- package/dist/secret-read-async.d.ts.map +1 -1
- package/dist/secret-read-async.js +2 -1
- package/dist/secure-file.d.ts.map +1 -1
- package/dist/secure-file.js +21 -4
- package/dist/secure-temp-dir.d.ts.map +1 -1
- package/dist/secure-temp-dir.js +2 -1
- package/dist/sibling-staged-file.d.ts +1 -0
- package/dist/sibling-staged-file.d.ts.map +1 -1
- package/dist/sibling-staged-file.js +42 -8
- package/dist/sibling-temp.d.ts +2 -0
- package/dist/sibling-temp.d.ts.map +1 -1
- package/dist/sibling-temp.js +6 -4
- package/dist/sidecar-lock-acquire.d.ts.map +1 -1
- package/dist/sidecar-lock-acquire.js +15 -4
- package/dist/sidecar-lock-policy.d.ts +2 -0
- package/dist/sidecar-lock-policy.d.ts.map +1 -1
- package/dist/sidecar-lock-policy.js +17 -0
- package/dist/staged-directory.d.ts.map +1 -1
- package/dist/staged-directory.js +4 -3
- package/dist/temp-target.d.ts +14 -12
- package/dist/temp-target.d.ts.map +1 -1
- package/dist/temp-target.js +12 -6
- package/dist/trash.d.ts.map +1 -1
- package/dist/trash.js +7 -5
- package/dist/unicode-path.d.ts +3 -0
- package/dist/unicode-path.d.ts.map +1 -0
- package/dist/unicode-path.js +13 -0
- package/dist/walk.d.ts.map +1 -1
- package/dist/walk.js +3 -2
- package/dist/write-file-handle.d.ts +1 -0
- package/dist/write-file-handle.d.ts.map +1 -1
- package/dist/write-file-handle.js +3 -2
- package/docs/advanced.md +4 -0
- package/docs/archive.md +25 -5
- package/docs/atomic.md +17 -1
- package/docs/config.md +1 -0
- package/docs/contributing.md +29 -1
- package/docs/copy.md +75 -6
- package/docs/directory-identity.md +85 -0
- package/docs/durability.md +36 -1
- package/docs/entries.md +109 -0
- package/docs/errors.md +3 -3
- package/docs/file-store.md +15 -0
- package/docs/guest.md +141 -0
- package/docs/in-place-write.md +81 -0
- package/docs/index.md +2 -0
- package/docs/install.md +31 -0
- package/docs/native-helper.md +10 -3
- package/docs/native.md +4 -0
- package/docs/output.md +32 -6
- package/docs/path-case.md +64 -0
- package/docs/path-scope.md +1 -1
- package/docs/permissions.md +11 -2
- package/docs/public-api.md +31 -2
- package/docs/root.md +30 -2
- package/docs/secure-file.md +2 -0
- package/docs/sidecar-lock.md +12 -3
- package/docs/temp.md +35 -6
- package/docs/types.md +1 -1
- package/docs/writing.md +153 -3
- package/package.json +14 -8
|
@@ -18,7 +18,9 @@ export type RootDirectoryListingOptions = {
|
|
|
18
18
|
order: "sorted" | "filesystem";
|
|
19
19
|
signal?: AbortSignal;
|
|
20
20
|
snapshot: boolean;
|
|
21
|
+
maxNames?: number;
|
|
22
|
+
metadataBatchSize?: number;
|
|
21
23
|
admitEntry(): boolean;
|
|
22
24
|
};
|
|
23
|
-
export declare function
|
|
25
|
+
export declare function openRootDirectoryListing(root: RootContext, directory: string, options: RootDirectoryListingOptions): Promise<RootDirectoryListing>;
|
|
24
26
|
//# sourceMappingURL=root-directory-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-directory-list.d.ts","sourceRoot":"","sources":["../src/root-directory-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAQ1C,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAcvD;AAWD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;AAqBhI,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAClG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,IAAI,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAsB,
|
|
1
|
+
{"version":3,"file":"root-directory-list.d.ts","sourceRoot":"","sources":["../src/root-directory-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAQ1C,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAcvD;AAWD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;AAqBhI,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAClG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,IAAI,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAsJ/B"}
|
|
@@ -48,7 +48,7 @@ export async function listDirectoryPath(root, directory, withFileTypes) {
|
|
|
48
48
|
throw normalizeDirectoryError(error);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
export async function
|
|
51
|
+
export async function openRootDirectoryListing(root, directory, options) {
|
|
52
52
|
const guard = await createAsyncDirectoryGuard(directory, { bigint: true }).catch((error) => {
|
|
53
53
|
throw normalizeDirectoryError(error);
|
|
54
54
|
});
|
|
@@ -97,6 +97,22 @@ export async function listDirectoryForWalk(root, directory, options) {
|
|
|
97
97
|
else if (options.snapshot) {
|
|
98
98
|
snapshot = await listDirectoryPath(root, guard.realPath, true);
|
|
99
99
|
}
|
|
100
|
+
else if (options.maxNames !== undefined) {
|
|
101
|
+
names = [];
|
|
102
|
+
handle = await fs.opendir(guard.realPath, { bufferSize: 1 });
|
|
103
|
+
while (true) {
|
|
104
|
+
await assertCurrent();
|
|
105
|
+
const name = (await handle.read())?.name;
|
|
106
|
+
await assertCurrent();
|
|
107
|
+
if (name === undefined)
|
|
108
|
+
break;
|
|
109
|
+
if (names.length >= options.maxNames) {
|
|
110
|
+
throw new FsSafeError("too-large", "directory entry budget exceeded");
|
|
111
|
+
}
|
|
112
|
+
names.push(name);
|
|
113
|
+
}
|
|
114
|
+
await close();
|
|
115
|
+
}
|
|
100
116
|
else {
|
|
101
117
|
names = await fs.readdir(guard.realPath);
|
|
102
118
|
}
|
|
@@ -115,8 +131,10 @@ export async function listDirectoryForWalk(root, directory, options) {
|
|
|
115
131
|
}
|
|
116
132
|
const prepareBatch = async (sortedNames) => {
|
|
117
133
|
let name = sortedNames[index++];
|
|
118
|
-
if (name === undefined)
|
|
134
|
+
if (name === undefined) {
|
|
135
|
+
await assertCurrent();
|
|
119
136
|
return;
|
|
137
|
+
}
|
|
120
138
|
if (!options.admitEntry()) {
|
|
121
139
|
pendingLimit = name;
|
|
122
140
|
return;
|
|
@@ -132,7 +150,7 @@ export async function listDirectoryForWalk(root, directory, options) {
|
|
|
132
150
|
const entry = { name, ...pathStatFromStats(fsSync.lstatSync(path.join(guard.realPath, name))) };
|
|
133
151
|
prepared.push(entry);
|
|
134
152
|
// No later sibling can be observed before a possible recursive descent.
|
|
135
|
-
if (entry.isDirectory || entry.isSymbolicLink || prepared.length >= METADATA_BATCH_SIZE)
|
|
153
|
+
if (entry.isDirectory || entry.isSymbolicLink || prepared.length >= (options.metadataBatchSize ?? METADATA_BATCH_SIZE))
|
|
136
154
|
break;
|
|
137
155
|
}
|
|
138
156
|
catch (error) {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RootContext } from "./root-context.js";
|
|
2
|
+
import { type SymlinkPolicy } from "./root-symlink-policy.js";
|
|
3
|
+
import type { DirEntry } from "./types.js";
|
|
4
|
+
export type RootEntriesOptions = {
|
|
5
|
+
maxEntries?: number;
|
|
6
|
+
order?: "filesystem" | "sorted";
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
symlinks?: SymlinkPolicy;
|
|
9
|
+
};
|
|
10
|
+
export declare function entriesInRoot(root: RootContext, relativePath: string, options: RootEntriesOptions): AsyncGenerator<DirEntry>;
|
|
11
|
+
//# sourceMappingURL=root-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-entries.d.ts","sourceRoot":"","sources":["../src/root-entries.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAErF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,wBAAuB,aAAa,CAClC,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,kBAAkB,GAC1B,cAAc,CAAC,QAAQ,CAAC,CAkD1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FsSafeError } from "./errors.js";
|
|
2
|
+
import { validatePinnedOperationPayload } from "./pinned-operation.js";
|
|
3
|
+
import { resolvePathInRoot } from "./root-context.js";
|
|
4
|
+
import { openRootDirectoryListing } from "./root-directory-list.js";
|
|
5
|
+
import { readSymlinkResolution } from "./root-symlink-policy.js";
|
|
6
|
+
import { createSuppressedError } from "./suppressed-error.js";
|
|
7
|
+
export async function* entriesInRoot(root, relativePath, options) {
|
|
8
|
+
const maxEntries = options.maxEntries;
|
|
9
|
+
if (maxEntries !== undefined && (!Number.isSafeInteger(maxEntries) || maxEntries < 0)) {
|
|
10
|
+
throw new RangeError("maxEntries must be a non-negative safe integer");
|
|
11
|
+
}
|
|
12
|
+
if (options.order !== undefined && options.order !== "filesystem" && options.order !== "sorted") {
|
|
13
|
+
throw new TypeError(`invalid root entries order: ${String(options.order)}`);
|
|
14
|
+
}
|
|
15
|
+
options.signal?.throwIfAborted();
|
|
16
|
+
validatePinnedOperationPayload({ relativePath });
|
|
17
|
+
const resolved = await resolvePathInRoot(root, relativePath, {
|
|
18
|
+
...readSymlinkResolution(options.symlinks),
|
|
19
|
+
resolveCanonical: true,
|
|
20
|
+
});
|
|
21
|
+
options.signal?.throwIfAborted();
|
|
22
|
+
let examined = 0;
|
|
23
|
+
const listing = await openRootDirectoryListing(root, resolved.resolved, {
|
|
24
|
+
order: options.order ?? "filesystem",
|
|
25
|
+
signal: options.signal,
|
|
26
|
+
snapshot: false,
|
|
27
|
+
maxNames: maxEntries,
|
|
28
|
+
metadataBatchSize: 1,
|
|
29
|
+
admitEntry: () => maxEntries === undefined || examined++ < maxEntries,
|
|
30
|
+
});
|
|
31
|
+
let failed = false;
|
|
32
|
+
let operationError;
|
|
33
|
+
try {
|
|
34
|
+
while (true) {
|
|
35
|
+
const next = await listing.next();
|
|
36
|
+
options.signal?.throwIfAborted();
|
|
37
|
+
if (next === undefined)
|
|
38
|
+
return;
|
|
39
|
+
if (next.kind === "limit") {
|
|
40
|
+
throw new FsSafeError("too-large", "directory entry budget exceeded");
|
|
41
|
+
}
|
|
42
|
+
yield next.entry;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
failed = true;
|
|
47
|
+
operationError = error;
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
try {
|
|
52
|
+
await listing[Symbol.asyncDispose]();
|
|
53
|
+
}
|
|
54
|
+
catch (closeError) {
|
|
55
|
+
if (failed) {
|
|
56
|
+
throw createSuppressedError(closeError, operationError, "directory iteration and close both failed");
|
|
57
|
+
}
|
|
58
|
+
throw closeError;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
package/dist/root-errors.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { FsSafeError } from "./errors.js";
|
|
2
|
-
export declare function fileNotFoundError(cause?: unknown): FsSafeError;
|
|
1
|
+
import { FsSafeError, type FsSafeErrorDetails } from "./errors.js";
|
|
2
|
+
export declare function fileNotFoundError(cause?: unknown, details?: FsSafeErrorDetails): FsSafeError;
|
|
3
3
|
export declare function outsideWorkspaceError(): FsSafeError;
|
|
4
4
|
export declare function rootPathChangedError(cause?: Error): FsSafeError;
|
|
5
5
|
export declare function directoryComponentNotDirectoryError(cause?: unknown): FsSafeError;
|
|
6
6
|
export declare function hardlinkedPathNotAllowedError(): FsSafeError;
|
|
7
7
|
export declare function isAlreadyExistsError(error: unknown): boolean;
|
|
8
8
|
export declare function normalizePinnedWriteError(error: unknown): Error;
|
|
9
|
-
export declare function normalizePinnedPathError(error: unknown): Error;
|
|
10
|
-
export declare function normalizeRemoveGuardError(error: unknown): Error;
|
|
11
|
-
export declare function normalizeRemovePathError(error: unknown): Error;
|
|
9
|
+
export declare function normalizePinnedPathError(error: unknown, details?: FsSafeErrorDetails): Error;
|
|
10
|
+
export declare function normalizeRemoveGuardError(error: unknown, details?: FsSafeErrorDetails): Error;
|
|
11
|
+
export declare function normalizeRemovePathError(error: unknown, details?: FsSafeErrorDetails): Error;
|
|
12
12
|
export declare function throwFsSafeReadError(error: unknown, label: string): never;
|
|
13
13
|
//# sourceMappingURL=root-errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-errors.d.ts","sourceRoot":"","sources":["../src/root-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"root-errors.d.ts","sourceRoot":"","sources":["../src/root-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKnE,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAI5F;AAED,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,WAAW,CAE/D;AAED,wBAAgB,mCAAmC,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,CAIhF;AAED,wBAAgB,6BAA6B,IAAI,WAAW,CAE3D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAU/D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAQ5F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAQ7F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAe5F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAQzE"}
|
package/dist/root-errors.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { FsSafeError } from "./errors.js";
|
|
2
2
|
import { hasNodeErrorCode, isNodeError, isNotFoundPathError } from "./path.js";
|
|
3
3
|
const REMOVE_NOT_EMPTY_CODES = new Set(["ENOTEMPTY", "EEXIST"]);
|
|
4
|
-
export function fileNotFoundError(cause) {
|
|
4
|
+
export function fileNotFoundError(cause, details) {
|
|
5
5
|
return cause === undefined
|
|
6
|
-
? new FsSafeError("not-found", "file not found")
|
|
7
|
-
: new FsSafeError("not-found", "file not found", { cause });
|
|
6
|
+
? new FsSafeError("not-found", "file not found", { details })
|
|
7
|
+
: new FsSafeError("not-found", "file not found", { cause, details });
|
|
8
8
|
}
|
|
9
9
|
export function outsideWorkspaceError() {
|
|
10
10
|
return new FsSafeError("outside-workspace", "file is outside workspace root");
|
|
@@ -34,38 +34,39 @@ export function normalizePinnedWriteError(error) {
|
|
|
34
34
|
cause: error instanceof Error ? error : undefined,
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
export function normalizePinnedPathError(error) {
|
|
37
|
+
export function normalizePinnedPathError(error, details) {
|
|
38
38
|
if (error instanceof FsSafeError) {
|
|
39
39
|
return error;
|
|
40
40
|
}
|
|
41
41
|
return new FsSafeError("path-alias", "path is not under root", {
|
|
42
42
|
cause: error instanceof Error ? error : undefined,
|
|
43
|
+
details,
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
|
-
export function normalizeRemoveGuardError(error) {
|
|
46
|
+
export function normalizeRemoveGuardError(error, details) {
|
|
46
47
|
if (error instanceof FsSafeError) {
|
|
47
48
|
return error;
|
|
48
49
|
}
|
|
49
50
|
if (isNotFoundPathError(error)) {
|
|
50
|
-
return fileNotFoundError(error instanceof Error ? error : undefined);
|
|
51
|
+
return fileNotFoundError(error instanceof Error ? error : undefined, details);
|
|
51
52
|
}
|
|
52
|
-
return normalizePinnedPathError(error);
|
|
53
|
+
return normalizePinnedPathError(error, details);
|
|
53
54
|
}
|
|
54
|
-
export function normalizeRemovePathError(error) {
|
|
55
|
+
export function normalizeRemovePathError(error, details) {
|
|
55
56
|
if (error instanceof FsSafeError) {
|
|
56
57
|
return error;
|
|
57
58
|
}
|
|
58
59
|
if (!isNodeError(error) || typeof error.code !== "string") {
|
|
59
|
-
return normalizePinnedPathError(error);
|
|
60
|
+
return normalizePinnedPathError(error, details);
|
|
60
61
|
}
|
|
61
62
|
const cause = error instanceof Error ? error : undefined;
|
|
62
63
|
if (isNotFoundPathError(error)) {
|
|
63
|
-
return fileNotFoundError(cause);
|
|
64
|
+
return fileNotFoundError(cause, details);
|
|
64
65
|
}
|
|
65
66
|
if (REMOVE_NOT_EMPTY_CODES.has(error.code)) {
|
|
66
|
-
return new FsSafeError("not-empty", "directory is not empty", { cause });
|
|
67
|
+
return new FsSafeError("not-empty", "directory is not empty", { cause, details });
|
|
67
68
|
}
|
|
68
|
-
return new FsSafeError("not-removable", "path could not be removed", { cause });
|
|
69
|
+
return new FsSafeError("not-removable", "path could not be removed", { cause, details });
|
|
69
70
|
}
|
|
70
71
|
export function throwFsSafeReadError(error, label) {
|
|
71
72
|
if (error instanceof FsSafeError) {
|
package/dist/root-impl.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import type { Stats } from "node:fs";
|
|
1
|
+
import type { BigIntStats, Stats } from "node:fs";
|
|
2
2
|
import type { FileHandle } from "node:fs/promises";
|
|
3
3
|
import type { ContainmentGuarantee } from "./containment.js";
|
|
4
4
|
import { type ReadResult } from "./read-opened-file.js";
|
|
5
|
+
import { type RootEntriesOptions } from "./root-entries.js";
|
|
5
6
|
import { type RootContext } from "./root-context.js";
|
|
6
7
|
import type { DirEntry, PathStat } from "./types.js";
|
|
7
8
|
import { type RootWalkEntry, type RootWalkOptions } from "./root-walk.js";
|
|
8
|
-
import { type RootAppendOptions, type RootCopyOptions, type RootCopySource, type RootCreateJsonOptions, type RootCreateOptions, type RootDefaults, type RootMkdirOptions, type RootMoveOptions, type RootOpenOptions, type RootOpenWritableOptions, type RootReadOptions, type RootRemoveOptions, type RootWriteJsonOptions, type RootWriteOptions } from "./root-options.js";
|
|
9
|
-
export type { HardlinkPolicy, RootAppendOptions, RootCopyOptions, RootCopySource, RootCreateJsonOptions, RootCreateOptions, RootDefaults, RootMkdirOptions, RootMoveOptions, RootOpenOptions, RootOpenWritableOptions, RootOptions, RootReadOptions, RootRemoveOptions, RootWriteJsonOptions, RootWriteOptions, WritableOpenMode, } from "./root-options.js";
|
|
9
|
+
import { type RootAppendOptions, type RootCopyOptions, type RootCopySource, type RootCreateJsonOptions, type RootCreateOptions, type RootCreateStreamOptions, type RootDefaults, type RootMkdirOptions, type RootMoveOptions, type RootOpenOptions, type RootOpenWritableOptions, type RootReadOptions, type RootRemoveOptions, type RootWriteJsonOptions, type RootWriteOptions } from "./root-options.js";
|
|
10
|
+
export type { HardlinkPolicy, RootAppendOptions, RootCopyOptions, RootCopySource, RootCreateJsonOptions, RootCreateOptions, RootCreateStreamOptions, RootDefaults, RootMkdirOptions, RootMoveOptions, RootOpenOptions, RootOpenWritableOptions, RootOptions, RootReadOptions, RootRemoveOptions, RootWriteJsonOptions, RootWriteOptions, WritableOpenMode, } from "./root-options.js";
|
|
10
11
|
export { DEFAULT_ROOT_MAX_BYTES } from "./root-options.js";
|
|
11
12
|
export type { DenyMutationPolicy } from "./deny-mutations.js";
|
|
12
13
|
export type { RenameIdentityPolicy } from "./pinned-write.js";
|
|
@@ -44,6 +45,7 @@ export interface Root {
|
|
|
44
45
|
ensureRoot(options?: RootMkdirOptions): Promise<void>;
|
|
45
46
|
write(relativePath: string, data: string | Buffer, options?: RootWriteOptions): Promise<void>;
|
|
46
47
|
create(relativePath: string, data: string | Buffer, options?: RootCreateOptions): Promise<void>;
|
|
48
|
+
create(relativePath: string, data: AsyncIterable<Uint8Array>, options?: RootCreateStreamOptions): Promise<void>;
|
|
47
49
|
writeJson(relativePath: string, data: unknown, options?: RootWriteJsonOptions): Promise<void>;
|
|
48
50
|
createJson(relativePath: string, data: unknown, options?: RootCreateJsonOptions): Promise<void>;
|
|
49
51
|
copyIn(relativePath: string, source: RootCopySource, options?: RootCopyOptions): Promise<void>;
|
|
@@ -55,6 +57,7 @@ export interface Root {
|
|
|
55
57
|
list(relativePath: string, options: {
|
|
56
58
|
withFileTypes: true;
|
|
57
59
|
}): Promise<DirEntry[]>;
|
|
60
|
+
entries(relativePath: string, options?: RootEntriesOptions): AsyncIterableIterator<DirEntry>;
|
|
58
61
|
move(fromRelative: string, toRelative: string, options?: RootMoveOptions): Promise<void>;
|
|
59
62
|
walk(relativePath: string, options: RootWalkOptions): AsyncIterableIterator<RootWalkEntry>;
|
|
60
63
|
}
|
|
@@ -86,6 +89,7 @@ export declare class RootHandle implements Root {
|
|
|
86
89
|
ensureRoot(options?: RootMkdirOptions): Promise<void>;
|
|
87
90
|
write(relativePath: string, data: string | Buffer, options?: RootWriteOptions): Promise<void>;
|
|
88
91
|
create(relativePath: string, data: string | Buffer, options?: RootCreateOptions): Promise<void>;
|
|
92
|
+
create(relativePath: string, data: AsyncIterable<Uint8Array>, options?: RootCreateStreamOptions): Promise<void>;
|
|
89
93
|
writeJson(relativePath: string, data: unknown, options?: RootWriteJsonOptions): Promise<void>;
|
|
90
94
|
createJson(relativePath: string, data: unknown, options?: RootCreateJsonOptions): Promise<void>;
|
|
91
95
|
copyIn(relativePath: string, source: RootCopySource, options?: RootCopyOptions): Promise<void>;
|
|
@@ -98,9 +102,15 @@ export declare class RootHandle implements Root {
|
|
|
98
102
|
withFileTypes: true;
|
|
99
103
|
}): Promise<DirEntry[]>;
|
|
100
104
|
move(fromRelative: string, toRelative: string, options?: RootMoveOptions): Promise<void>;
|
|
105
|
+
entries(relativePath: string, options?: RootEntriesOptions): AsyncIterableIterator<DirEntry>;
|
|
101
106
|
walk(relativePath: string, options: RootWalkOptions): AsyncIterableIterator<RootWalkEntry>;
|
|
102
107
|
}
|
|
103
108
|
export declare function root(rootDir: string, defaults?: RootDefaults): Promise<Root>;
|
|
109
|
+
export declare function rootFromDirectoryGuard(guard: {
|
|
110
|
+
readonly dir: string;
|
|
111
|
+
readonly realPath: string;
|
|
112
|
+
readonly stat: BigIntStats;
|
|
113
|
+
}, defaults?: RootDefaults): Root;
|
|
104
114
|
export declare function readLocalFileSafely(params: {
|
|
105
115
|
filePath: string;
|
|
106
116
|
maxBytes?: number;
|
package/dist/root-impl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-impl.d.ts","sourceRoot":"","sources":["../src/root-impl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"root-impl.d.ts","sourceRoot":"","sources":["../src/root-impl.ts"],"names":[],"mappings":"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"}
|
package/dist/root-impl.js
CHANGED
|
@@ -73,21 +73,25 @@ import { assertNoNulPathInput, assertNoUnsafeDeviceReadPath, hasNodeErrorCode, i
|
|
|
73
73
|
import { readOpenedFileSafely } from "./read-opened-file.js";
|
|
74
74
|
import { cleanupPinnedFilePath } from "./replace-file-temp-owner.js";
|
|
75
75
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
76
|
+
import { realpathSync } from "./realpath.js";
|
|
76
77
|
import { isNonRegularWriteOpenError, resolveNonblockingWriteFlag } from "./write-open-flags.js";
|
|
77
78
|
import { resolveRootPath } from "./root-path.js";
|
|
78
|
-
import {
|
|
79
|
+
import { openRootDirectoryListing, listDirectoryPath, pathStatFromStats } from "./root-directory-list.js";
|
|
80
|
+
import { entriesInRoot } from "./root-entries.js";
|
|
79
81
|
import { assertRootIdentityCurrent, assertValidRootDestinationPath, assertValidRootRelativePath, ensureTrailingSep, expandRelativePathWithHome, resolvePathInRoot, resolveRootContext, rootRelativeReadPath, } from "./root-context.js";
|
|
80
|
-
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError,
|
|
82
|
+
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError, outsideWorkspaceError, } from "./root-errors.js";
|
|
81
83
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
82
84
|
import { stringifyJsonDocument } from "./json-stringify.js";
|
|
83
85
|
import { walkRoot } from "./root-walk.js";
|
|
84
86
|
import { registerTempPathForExit } from "./temp-cleanup.js";
|
|
87
|
+
import { removePathInRootFallback, validateRemoveOptions } from "./root-remove.js";
|
|
85
88
|
import { serializePathWrite } from "./write-queue.js";
|
|
86
89
|
import { verifyAtomicWriteResult } from "./root-write-verification.js";
|
|
87
90
|
import { inheritWriteTargetMode } from "./root-write-mode.js";
|
|
88
91
|
import { inspectFileIdentity } from "./strict-file-identity.js";
|
|
89
92
|
import { createCopyPublicationObserver, onCopyPublication } from "./copy-publication.js";
|
|
90
93
|
import { writeAllToFile } from "./write-file-handle.js";
|
|
94
|
+
import { createInputOptions, rethrowCreateInputError, rootWriteInput } from "./root-create-input.js";
|
|
91
95
|
import { assertFinalSymlinkRejected, mutationSymlinkResolution, readSymlinkResolution } from "./root-symlink-policy.js";
|
|
92
96
|
import { mergeReadOptions, readDefaults, } from "./root-options.js";
|
|
93
97
|
import { composeMutationAssertions, MutationAuthorityError, rethrowMutationAuthorityError } from "./mutation-authority.js";
|
|
@@ -327,6 +331,8 @@ export class RootHandle {
|
|
|
327
331
|
}
|
|
328
332
|
async remove(relativePath, options = {}) {
|
|
329
333
|
assertValidRootRelativePath(relativePath);
|
|
334
|
+
validateRemoveOptions(options);
|
|
335
|
+
options.signal?.throwIfAborted();
|
|
330
336
|
await removePathInRoot(this.context, {
|
|
331
337
|
relativePath,
|
|
332
338
|
...this.mutationOptions(options),
|
|
@@ -365,10 +371,10 @@ export class RootHandle {
|
|
|
365
371
|
data,
|
|
366
372
|
mkdir: this.defaults.mkdir,
|
|
367
373
|
mode: this.defaults.mode,
|
|
368
|
-
...this.mutationOptions(options),
|
|
374
|
+
...this.mutationOptions(createInputOptions(data, options, this.defaults.maxBytes)),
|
|
369
375
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
370
376
|
overwrite: false,
|
|
371
|
-
}).catch(rethrowMutationAuthorityError);
|
|
377
|
+
}).catch(rethrowMutationAuthorityError).catch(rethrowCreateInputError);
|
|
372
378
|
}
|
|
373
379
|
async writeJson(relativePath, data, options = {}) {
|
|
374
380
|
const { replacer, space, trailingNewline = true, ...writeOptions } = options;
|
|
@@ -436,6 +442,13 @@ export class RootHandle {
|
|
|
436
442
|
toRelative,
|
|
437
443
|
}).catch(rethrowMutationAuthorityError);
|
|
438
444
|
}
|
|
445
|
+
entries(relativePath, options = {}) {
|
|
446
|
+
assertValidRootRelativePath(relativePath);
|
|
447
|
+
return entriesInRoot(this.context, relativePath, {
|
|
448
|
+
...options,
|
|
449
|
+
symlinks: options.symlinks ?? this.defaults.symlinks,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
439
452
|
walk(relativePath, options) {
|
|
440
453
|
assertValidRootRelativePath(relativePath);
|
|
441
454
|
return walkRoot({
|
|
@@ -444,7 +457,7 @@ export class RootHandle {
|
|
|
444
457
|
list: async (relative, listingOptions) => {
|
|
445
458
|
validatePinnedOperationPayload({ relativePath: relative });
|
|
446
459
|
const resolved = await resolvePinnedPathInRoot(this.context, { relativePath: relative, allowRoot: true });
|
|
447
|
-
return await
|
|
460
|
+
return await openRootDirectoryListing(this.context, resolved.resolved, listingOptions);
|
|
448
461
|
},
|
|
449
462
|
}, relativePath, options);
|
|
450
463
|
}
|
|
@@ -453,6 +466,17 @@ export async function root(rootDir, defaults = {}) {
|
|
|
453
466
|
normalizeMaxBytes(defaults.maxBytes);
|
|
454
467
|
return new RootHandle(await resolveRootContext(rootDir), defaults);
|
|
455
468
|
}
|
|
469
|
+
// Internal callers that already hold an exact admitted directory capability must
|
|
470
|
+
// not recapture a different filesystem object while constructing the Root.
|
|
471
|
+
export function rootFromDirectoryGuard(guard, defaults = {}) {
|
|
472
|
+
normalizeMaxBytes(defaults.maxBytes);
|
|
473
|
+
return new RootHandle({
|
|
474
|
+
rootDir: path.resolve(guard.dir),
|
|
475
|
+
rootIdentity: { dev: guard.stat.dev, ino: guard.stat.ino },
|
|
476
|
+
rootReal: guard.realPath,
|
|
477
|
+
rootWithSep: ensureTrailingSep(guard.realPath),
|
|
478
|
+
}, defaults);
|
|
479
|
+
}
|
|
456
480
|
async function openFileInRoot(root, params) {
|
|
457
481
|
const { rootWithSep, resolved } = await resolvePathInRoot(root, params.relativePath, {
|
|
458
482
|
allowFinalSymlink: true,
|
|
@@ -559,7 +583,7 @@ async function openWritableFileInRoot(root, params) {
|
|
|
559
583
|
: await prepareRootWriteTarget(rootReal, resolved, params.assertBeforeMutation);
|
|
560
584
|
try {
|
|
561
585
|
assertFinalSymlinkRejected(ioPath, params.mutationSymlinks !== undefined);
|
|
562
|
-
const resolvedRealPath = params.mutationSymlinks === undefined ?
|
|
586
|
+
const resolvedRealPath = params.mutationSymlinks === undefined ? realpathSync.native(ioPath) : ioPath;
|
|
563
587
|
if (!isPathInside(rootWithSep, resolvedRealPath)) {
|
|
564
588
|
throw outsideWorkspaceError();
|
|
565
589
|
}
|
|
@@ -749,9 +773,11 @@ async function removePathInRoot(root, params) {
|
|
|
749
773
|
remove: true,
|
|
750
774
|
});
|
|
751
775
|
try {
|
|
752
|
-
await
|
|
776
|
+
await removePathInRootFallback(root, resolved.resolved, params);
|
|
753
777
|
}
|
|
754
778
|
catch (error) {
|
|
779
|
+
if (params.recursive)
|
|
780
|
+
throw error;
|
|
755
781
|
throw normalizePinnedPathError(error);
|
|
756
782
|
}
|
|
757
783
|
}
|
|
@@ -766,19 +792,20 @@ async function mkdirPathInRoot(root, params) {
|
|
|
766
792
|
}
|
|
767
793
|
}
|
|
768
794
|
async function writeFileInRoot(root, params) {
|
|
795
|
+
const input = rootWriteInput(params);
|
|
769
796
|
await serializePathWrite(rootWriteQueueKey(root, params.relativePath), async () => {
|
|
770
|
-
if (process.platform === "win32" &&
|
|
797
|
+
if (input.kind === "buffer" && process.platform === "win32" &&
|
|
771
798
|
(params.renameIdentity === "verify-content-with-lock" || !getNativeBinding())) {
|
|
772
|
-
await writeFileFallback(root, params);
|
|
799
|
+
await writeFileFallback(root, { ...params, data: input.data });
|
|
773
800
|
return;
|
|
774
801
|
}
|
|
775
802
|
const pinned = await resolvePinnedWriteTargetInRoot(root, params.relativePath, params.mode, params.denyMutations, params.overwrite, params.mutationSymlinks);
|
|
776
803
|
await serializePathWrite(pinned.targetPath, async () => {
|
|
777
|
-
await commitPinnedWriteInRoot(root, pinned, params);
|
|
804
|
+
await commitPinnedWriteInRoot(root, pinned, params, input);
|
|
778
805
|
});
|
|
779
806
|
});
|
|
780
807
|
}
|
|
781
|
-
async function commitPinnedWriteInRoot(root, pinned, params) {
|
|
808
|
+
async function commitPinnedWriteInRoot(root, pinned, params, input) {
|
|
782
809
|
let verifyingPublication = false;
|
|
783
810
|
try {
|
|
784
811
|
await runPinnedWriteWithRenamePolicy({
|
|
@@ -792,7 +819,8 @@ async function commitPinnedWriteInRoot(root, pinned, params) {
|
|
|
792
819
|
sync: params.durable !== false,
|
|
793
820
|
overwrite: params.overwrite,
|
|
794
821
|
rejectFinalSymlink: params.mutationSymlinks !== undefined,
|
|
795
|
-
input
|
|
822
|
+
input,
|
|
823
|
+
maxBytes: params.maxBytes,
|
|
796
824
|
rootIdentity: root.rootIdentity,
|
|
797
825
|
assertBeforeMutation: params.assertBeforeMutation,
|
|
798
826
|
verifyPublished: async (fd, expectedIdentity, parentGuard) => {
|
|
@@ -1026,30 +1054,6 @@ async function resolvePinnedRootPathInRoot(root, params) {
|
|
|
1026
1054
|
canonicalPath: resolved.canonicalPath,
|
|
1027
1055
|
};
|
|
1028
1056
|
}
|
|
1029
|
-
async function prepareRemoveGuard(targetPath) {
|
|
1030
|
-
try {
|
|
1031
|
-
const guard = await createAsyncDirectoryGuard(path.dirname(targetPath));
|
|
1032
|
-
await getFsSafeTestHooks()?.beforeRootFallbackMutation?.("remove", targetPath);
|
|
1033
|
-
await assertAsyncDirectoryGuard(guard);
|
|
1034
|
-
return guard;
|
|
1035
|
-
}
|
|
1036
|
-
catch (error) {
|
|
1037
|
-
throw normalizeRemoveGuardError(error);
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
async function removePathFallback(resolved, assertBeforeMutation, rejectFinalSymlink = false) {
|
|
1041
|
-
const guard = await prepareRemoveGuard(resolved.resolved);
|
|
1042
|
-
try {
|
|
1043
|
-
const isDirectory = fsSync.lstatSync(resolved.resolved).isDirectory();
|
|
1044
|
-
assertFinalSymlinkRejected(resolved.resolved, rejectFinalSymlink);
|
|
1045
|
-
assertBeforeMutation?.();
|
|
1046
|
-
await (isDirectory ? fs.rmdir(resolved.resolved) : fs.unlink(resolved.resolved));
|
|
1047
|
-
}
|
|
1048
|
-
catch (error) {
|
|
1049
|
-
throw normalizeRemovePathError(error);
|
|
1050
|
-
}
|
|
1051
|
-
await assertAsyncDirectoryGuard(guard).catch(error => { throw normalizeRemoveGuardError(error); });
|
|
1052
|
-
}
|
|
1053
1057
|
async function mkdirPathFallback(resolved, assertBeforeMutation, rejectSymlinks = false) {
|
|
1054
1058
|
await mkdirPathComponentsWithGuards({
|
|
1055
1059
|
rootReal: resolved.rootReal, targetPath: resolved.resolved, assertBeforeMutation,
|
package/dist/root-options.d.ts
CHANGED
|
@@ -51,6 +51,10 @@ export type RootWriteJsonOptions = RootWriteOptions & {
|
|
|
51
51
|
trailingNewline?: boolean;
|
|
52
52
|
};
|
|
53
53
|
export type RootCreateOptions = Omit<RootWriteOptions, "overwrite">;
|
|
54
|
+
export type RootCreateStreamOptions = Omit<RootCreateOptions, "encoding" | "renameIdentity"> & {
|
|
55
|
+
maxBytes?: number;
|
|
56
|
+
signal?: AbortSignal;
|
|
57
|
+
};
|
|
54
58
|
export type RootCreateJsonOptions = Omit<RootWriteJsonOptions, "overwrite">;
|
|
55
59
|
export type RootAppendOptions = RootWriteOptions & {
|
|
56
60
|
prependNewlineIfNeeded?: boolean;
|
|
@@ -58,7 +62,14 @@ export type RootAppendOptions = RootWriteOptions & {
|
|
|
58
62
|
export type RootMoveOptions = Pick<RootDefaults, "assertBeforeMutation" | "denyMutations" | "mutationSymlinks"> & {
|
|
59
63
|
overwrite?: boolean;
|
|
60
64
|
};
|
|
61
|
-
export type RootRemoveOptions = Pick<RootDefaults, "assertBeforeMutation" | "denyMutations" | "mutationSymlinks"
|
|
65
|
+
export type RootRemoveOptions = Pick<RootDefaults, "assertBeforeMutation" | "denyMutations" | "mutationSymlinks"> & {
|
|
66
|
+
recursive?: boolean;
|
|
67
|
+
force?: boolean;
|
|
68
|
+
order?: "filesystem" | "sorted";
|
|
69
|
+
maxEntries?: number;
|
|
70
|
+
maxDepth?: number;
|
|
71
|
+
signal?: AbortSignal;
|
|
72
|
+
};
|
|
62
73
|
export type RootMkdirOptions = Pick<RootDefaults, "assertBeforeMutation" | "denyMutations" | "mutationSymlinks">;
|
|
63
74
|
export type RootReadParams = Omit<RootReadOptions, "nonBlockingRead">;
|
|
64
75
|
export declare function readDefaults(defaults: RootDefaults): RootReadParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-options.d.ts","sourceRoot":"","sources":["../src/root-options.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"root-options.d.ts","sourceRoot":"","sources":["../src/root-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-path-existing.d.ts","sourceRoot":"","sources":["../src/root-path-existing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"root-path-existing.d.ts","sourceRoot":"","sources":["../src/root-path-existing.ts"],"names":[],"mappings":"AAOA,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GACvE,MAAM,GAAG,SAAS,CAuCpB;AAkBD,wBAAsB,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BxF;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA0B7E"}
|
|
@@ -3,6 +3,7 @@ import path from "node:path";
|
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { formatErrorDetail } from "./error-detail.js";
|
|
5
5
|
import { isNotFoundPathError, isPathInside } from "./path.js";
|
|
6
|
+
import { realpathSync } from "./realpath.js";
|
|
6
7
|
export function absolutePathWithRawSegments(candidate) {
|
|
7
8
|
if (path.isAbsolute(candidate))
|
|
8
9
|
return candidate;
|
|
@@ -32,7 +33,7 @@ export function rawPathRelativeToCanonicalRoot(candidate, rootCanonicalPath, opt
|
|
|
32
33
|
if (!isSymlink && !stat.isDirectory() && index < segments.length - 1)
|
|
33
34
|
return undefined;
|
|
34
35
|
traversedSymlink ||= isSymlink;
|
|
35
|
-
canonical =
|
|
36
|
+
canonical = realpathSync.native(prefix);
|
|
36
37
|
if (isSymlink && index < segments.length - 1 && !fs.statSync(canonical).isDirectory())
|
|
37
38
|
return undefined;
|
|
38
39
|
if (isSymlink && !isPathInside(rootCanonicalPath, canonical) && !isPathInside(canonical, rootCanonicalPath)) {
|
|
@@ -87,7 +88,7 @@ export async function resolvePathViaExistingAncestor(targetPath) {
|
|
|
87
88
|
return normalized;
|
|
88
89
|
}
|
|
89
90
|
try {
|
|
90
|
-
const resolvedAncestor = path.resolve(
|
|
91
|
+
const resolvedAncestor = path.resolve(realpathSync.native(cursor));
|
|
91
92
|
return missingSuffix.length === 0
|
|
92
93
|
? resolvedAncestor
|
|
93
94
|
: path.resolve(resolvedAncestor, ...missingSuffix);
|
|
@@ -112,7 +113,7 @@ export function resolvePathViaExistingAncestorSync(targetPath) {
|
|
|
112
113
|
return normalized;
|
|
113
114
|
}
|
|
114
115
|
try {
|
|
115
|
-
const resolvedAncestor = path.resolve(
|
|
116
|
+
const resolvedAncestor = path.resolve(realpathSync(cursor));
|
|
116
117
|
return missingSuffix.length === 0
|
|
117
118
|
? resolvedAncestor
|
|
118
119
|
: path.resolve(resolvedAncestor, ...missingSuffix);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-path-symlink.d.ts","sourceRoot":"","sources":["../src/root-path-symlink.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"root-path-symlink.d.ts","sourceRoot":"","sources":["../src/root-path-symlink.ts"],"names":[],"mappings":"AAUA,KAAK,wBAAwB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAiBF,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAQR"}
|
|
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { isNotFoundPathError, isSymlinkOpenError } from "./path.js";
|
|
5
|
+
import { realpathSync } from "./realpath.js";
|
|
5
6
|
import { resolvePathViaExistingAncestor, resolvePathViaExistingAncestorSync, } from "./root-path-existing.js";
|
|
6
7
|
function normalizeSymlinkResolutionError(error, options) {
|
|
7
8
|
if (isSymlinkOpenError(error) ||
|
|
@@ -15,7 +16,7 @@ function normalizeSymlinkResolutionError(error, options) {
|
|
|
15
16
|
}
|
|
16
17
|
export async function resolveSymlinkHopPath(symlinkPath, options = {}) {
|
|
17
18
|
try {
|
|
18
|
-
return path.resolve(
|
|
19
|
+
return path.resolve(realpathSync.native(symlinkPath));
|
|
19
20
|
}
|
|
20
21
|
catch (error) {
|
|
21
22
|
normalizeSymlinkResolutionError(error, options);
|
|
@@ -25,7 +26,7 @@ export async function resolveSymlinkHopPath(symlinkPath, options = {}) {
|
|
|
25
26
|
}
|
|
26
27
|
export function resolveSymlinkHopPathSync(symlinkPath, options = {}) {
|
|
27
28
|
try {
|
|
28
|
-
return path.resolve(
|
|
29
|
+
return path.resolve(realpathSync(symlinkPath));
|
|
29
30
|
}
|
|
30
31
|
catch (error) {
|
|
31
32
|
normalizeSymlinkResolutionError(error, options);
|