@openclaw/fs-safe 0.17.0 → 0.18.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/CHANGELOG.md +53 -0
- package/dist/absolute-path.d.ts +0 -1
- package/dist/advanced.d.ts +2 -2
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- package/dist/archive-durability.d.ts +1 -2
- package/dist/archive-entry.d.ts +0 -1
- package/dist/archive-errors.d.ts +0 -1
- package/dist/archive-gzip-tail.d.ts +0 -1
- package/dist/archive-input.d.ts +0 -1
- package/dist/archive-kind.d.ts +0 -1
- package/dist/archive-limits.d.ts +0 -1
- package/dist/archive-merge.d.ts +2 -4
- package/dist/archive-merge.js +14 -4
- package/dist/archive-parser-errors.d.ts +0 -1
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-plan.d.ts +72 -2
- package/dist/archive-plan.js +86 -22
- package/dist/archive-read.d.ts +0 -1
- package/dist/archive-staging.d.ts +0 -1
- package/dist/archive-tar-stream.d.ts +0 -1
- package/dist/archive-tar-wasm.d.ts +1 -2
- package/dist/archive-zip-admission.d.ts +0 -1
- package/dist/archive-zip-count.d.ts +0 -1
- package/dist/archive-zip-directory.d.ts +1 -2
- package/dist/archive-zip-entry.d.ts +1 -2
- package/dist/archive-zip-entry.js +1 -1
- package/dist/archive-zip-integrity.d.ts +0 -1
- package/dist/archive-zip-loader.d.ts +0 -1
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +8 -6
- package/dist/archive.js +204 -168
- package/dist/async-lock.d.ts +0 -1
- package/dist/atomic.d.ts +3 -2
- package/dist/bounded-read-stream.d.ts +0 -1
- package/dist/bounded-read.d.ts +0 -1
- package/dist/byte-budget.d.ts +0 -1
- package/dist/byte-view.d.ts +0 -1
- package/dist/clone-metadata.d.ts +0 -1
- package/dist/config.d.ts +0 -1
- package/dist/containment.d.ts +0 -1
- package/dist/copy-file-input.d.ts +0 -1
- package/dist/copy-policy.d.ts +0 -1
- package/dist/copy-publication.d.ts +1 -2
- package/dist/copy-tree-portable.d.ts +0 -1
- package/dist/copy-tree-portable.js +9 -6
- package/dist/copy.d.ts +0 -1
- package/dist/copy.js +5 -5
- package/dist/create-owned-file.d.ts +0 -1
- package/dist/create.d.ts +16 -3
- package/dist/create.js +388 -2
- package/dist/creation-boundary.d.ts +60 -0
- package/dist/creation-boundary.js +371 -0
- package/dist/deny-mutations.d.ts +2 -3
- package/dist/deny-mutations.js +55 -35
- package/dist/device-path.d.ts +0 -1
- package/dist/directory-durability.d.ts +0 -1
- package/dist/directory-entry-path.d.ts +0 -1
- package/dist/directory-guard.d.ts +2 -7
- package/dist/directory-guard.js +25 -56
- package/dist/directory-mode-node.d.ts +0 -1
- package/dist/directory-mode-node.js +12 -2
- package/dist/directory-mode-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +0 -1
- package/dist/durability.d.ts +2 -2
- package/dist/effective-uid.d.ts +0 -1
- package/dist/error-detail.d.ts +0 -1
- package/dist/errors.d.ts +0 -1
- package/dist/file-cleanup.d.ts +0 -1
- package/dist/file-contents.d.ts +0 -1
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +170 -66
- package/dist/file-identity.d.ts +0 -1
- package/dist/file-lock-sync-acquisition.d.ts +22 -0
- package/dist/file-lock-sync-acquisition.js +98 -0
- package/dist/file-lock-sync-admission.d.ts +0 -2
- package/dist/file-lock-sync-admission.js +9 -48
- package/dist/file-lock-sync-root-acquire.d.ts +0 -1
- package/dist/file-lock-sync-root-acquire.js +33 -103
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +0 -1
- package/dist/file-lock-sync-root-io.d.ts +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts +4 -5
- package/dist/file-lock-sync-root-mutation.js +7 -9
- package/dist/file-lock-sync-root-options.d.ts +0 -1
- package/dist/file-lock-sync-root-registration.d.ts +0 -1
- package/dist/file-lock-sync-root.d.ts +3 -3
- package/dist/file-lock-sync-root.js +14 -87
- package/dist/file-lock-sync-stale-admission.d.ts +2 -7
- package/dist/file-lock-sync-stale-admission.js +18 -27
- package/dist/file-lock-sync.d.ts +4 -22
- package/dist/file-lock-sync.js +38 -117
- package/dist/file-lock.d.ts +0 -1
- package/dist/file-observation.d.ts +0 -1
- package/dist/file-store-boundary.d.ts +7 -2
- package/dist/file-store-boundary.js +64 -27
- package/dist/file-store-prune.d.ts +0 -1
- package/dist/file-store-sync-directory.d.ts +0 -1
- package/dist/file-store-sync-directory.js +194 -231
- package/dist/file-store-sync-write.d.ts +0 -1
- package/dist/file-store-sync-write.js +18 -29
- package/dist/file-store.d.ts +0 -1
- package/dist/file-store.js +4 -10
- package/dist/file-sync.d.ts +0 -1
- package/dist/filename.d.ts +0 -1
- package/dist/filename.js +1 -7
- package/dist/fs.d.ts +0 -1
- package/dist/guarded-mkdir.d.ts +1 -2
- package/dist/guarded-mutation.d.ts +0 -7
- package/dist/guarded-mutation.js +6 -11
- package/dist/guest-dispatch-python.d.ts +0 -1
- package/dist/guest-dispatch-python.js +41 -90
- package/dist/guest-native-python.d.ts +0 -1
- package/dist/guest.d.ts +0 -1
- package/dist/home-dir.d.ts +0 -1
- package/dist/index.d.ts +9 -7
- package/dist/install-path.d.ts +0 -1
- package/dist/json-document-store.d.ts +0 -1
- package/dist/json-durable-queue-directory.d.ts +13 -1
- package/dist/json-durable-queue-directory.js +134 -0
- package/dist/json-durable-queue-ownership.d.ts +0 -1
- package/dist/json-durable-queue-ownership.js +42 -61
- package/dist/json-durable-queue-read.d.ts +0 -1
- package/dist/json-durable-queue-read.js +13 -9
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +8 -132
- package/dist/json-store.d.ts +0 -1
- package/dist/json-store.js +1 -2
- package/dist/json-stringify.d.ts +0 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.js +7 -17
- package/dist/local-file-access.d.ts +0 -1
- package/dist/local-file-access.js +3 -10
- package/dist/local-file-descriptor.d.ts +0 -1
- package/dist/local-roots.d.ts +0 -1
- package/dist/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +0 -1
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- package/dist/move-path.js +1 -2
- package/dist/mutation-authority.d.ts +0 -1
- package/dist/native-binding.d.ts +0 -1
- package/dist/native-config.d.ts +0 -1
- package/dist/native-directory-observation.d.ts +0 -1
- package/dist/native-fallback-warning.d.ts +0 -1
- package/dist/native-operations.d.ts +1 -5
- package/dist/native-operations.js +2 -7
- package/dist/native-parent-admission.d.ts +0 -1
- package/dist/native-pinned-write-windows.d.ts +1 -2
- package/dist/native-pinned-write-windows.js +1 -1
- package/dist/native-pinned-write.d.ts +1 -2
- package/dist/native-pinned-write.js +7 -16
- package/dist/native-policy-directory-observation.d.ts +0 -1
- package/dist/native-policy-parent-windows.d.ts +1 -2
- package/dist/native-rename-outcome.d.ts +0 -1
- package/dist/native-staged-file.d.ts +17 -5
- package/dist/native-staged-file.js +56 -65
- package/dist/native.d.ts +0 -1
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- package/dist/output.d.ts +0 -1
- package/dist/overwrite-file-handle.d.ts +0 -1
- package/dist/owner-dacl.d.ts +0 -1
- package/dist/path-case.d.ts +0 -1
- package/dist/path-policy.d.ts +0 -1
- package/dist/path-prefix.d.ts +0 -1
- package/dist/path-scope-lexical.d.ts +0 -1
- package/dist/path-segment-route.d.ts +0 -1
- package/dist/path-suffix-aliases.d.ts +0 -1
- package/dist/path.d.ts +0 -1
- package/dist/permission-exec.d.ts +0 -1
- package/dist/permission-exec.js +19 -25
- package/dist/permissions-public.d.ts +0 -1
- package/dist/permissions-windows.d.ts +2 -10
- package/dist/permissions-windows.js +10 -30
- package/dist/permissions.d.ts +0 -1
- package/dist/permissions.js +8 -16
- package/dist/pinned-mutation-admission.d.ts +1 -2
- package/dist/pinned-mutation-observation.d.ts +0 -1
- package/dist/pinned-mutation-shared-route.d.ts +0 -1
- package/dist/pinned-open.d.ts +1 -1
- package/dist/pinned-open.js +7 -2
- package/dist/pinned-operation.d.ts +1 -2
- package/dist/pinned-operation.js +3 -16
- package/dist/pinned-write-input.d.ts +0 -1
- package/dist/pinned-write-mode.d.ts +0 -1
- package/dist/pinned-write-mode.js +1 -1
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-staged.js +1 -2
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -2
- package/dist/pinned-write.js +3 -5
- package/dist/positional-read.d.ts +0 -1
- package/dist/private-directory.d.ts +0 -1
- package/dist/private-producer-handoff-sync.d.ts +2 -13
- package/dist/private-producer-handoff-sync.js +10 -52
- package/dist/private-producer-handoff.d.ts +23 -4
- package/dist/private-producer-handoff.js +69 -46
- package/dist/private-temp-workspace.d.ts +0 -1
- package/dist/private-temp-workspace.js +11 -37
- package/dist/publish-copy-stage.d.ts +1 -2
- package/dist/publish-file-failure.d.ts +0 -1
- package/dist/publish-file.d.ts +0 -2
- package/dist/publish-file.js +1 -2
- package/dist/read-open-flags.d.ts +0 -1
- package/dist/read-opened-file.d.ts +0 -1
- package/dist/realpath.d.ts +0 -1
- package/dist/recursive-mkdir-path.d.ts +0 -1
- package/dist/regular-file.d.ts +0 -1
- package/dist/regular-file.js +77 -139
- package/dist/replace-directory.d.ts +0 -1
- package/dist/replace-directory.js +1 -2
- package/dist/replace-file-copy-fallback.d.ts +0 -1
- package/dist/replace-file-copy-fallback.js +14 -3
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +6 -1
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +6 -1
- package/dist/replace-file-mode.d.ts +0 -1
- package/dist/replace-file-rename-policy.d.ts +1 -3
- package/dist/replace-file-temp-owner.d.ts +12 -13
- package/dist/replace-file-temp-owner.js +66 -85
- package/dist/replace-file.d.ts +3 -4
- package/dist/replace-file.js +1 -1
- package/dist/retained-directory-replacement.d.ts +0 -1
- package/dist/root-boundary.d.ts +0 -1
- package/dist/root-context.d.ts +0 -1
- package/dist/root-context.js +3 -7
- package/dist/root-create-input.d.ts +1 -2
- package/dist/root-directory-creation.d.ts +1 -2
- package/dist/root-directory-creation.js +1 -1
- package/dist/root-directory-list.d.ts +0 -1
- package/dist/root-directory-list.js +3 -7
- package/dist/root-directory.d.ts +0 -1
- package/dist/root-entries.d.ts +0 -1
- package/dist/root-entries.js +2 -2
- package/dist/root-errors.d.ts +4 -1
- package/dist/root-errors.js +5 -3
- package/dist/root-file-final-admission.d.ts +0 -1
- package/dist/root-file.d.ts +0 -1
- package/dist/root-impl.d.ts +2 -15
- package/dist/root-impl.js +136 -112
- package/dist/root-move-noreplace.d.ts +0 -1
- package/dist/root-move-noreplace.js +4 -10
- package/dist/root-move-preflight.d.ts +0 -1
- package/dist/root-observed-path.d.ts +0 -1
- package/dist/root-observed-path.js +2 -4
- package/dist/root-options.d.ts +1 -2
- package/dist/root-path-errors.d.ts +0 -1
- package/dist/root-path-existing.d.ts +3 -1
- package/dist/root-path-existing.js +38 -18
- package/dist/root-path-observation.d.ts +0 -1
- package/dist/root-path-stat.d.ts +0 -1
- package/dist/root-path-stat.js +2 -4
- package/dist/root-path.d.ts +0 -1
- package/dist/root-path.js +60 -188
- package/dist/root-paths-lexical.d.ts +0 -1
- package/dist/root-paths.d.ts +0 -1
- package/dist/root-public-types.d.ts +11 -0
- package/dist/root-read-admission.d.ts +0 -1
- package/dist/root-read-admission.js +31 -44
- package/dist/root-remove-identity.d.ts +0 -1
- package/dist/root-remove-identity.js +2 -4
- package/dist/root-remove-receipt.d.ts +0 -1
- package/dist/root-remove.d.ts +0 -1
- package/dist/root-remove.js +2 -4
- package/dist/root-symlink-policy.d.ts +0 -1
- package/dist/root-walk.d.ts +0 -1
- package/dist/root-write-admission.d.ts +1 -2
- package/dist/root-write-admission.js +3 -7
- package/dist/root-write-compatibility.d.ts +0 -1
- package/dist/root-write-complete-parent.d.ts +0 -1
- package/dist/root-write-complete-parent.js +2 -3
- package/dist/root-write-lock-binding.d.ts +0 -1
- package/dist/root-write-mode.d.ts +0 -1
- package/dist/root-write-publication.d.ts +0 -1
- package/dist/root-write-verification.d.ts +1 -2
- package/dist/root.d.ts +2 -7
- package/dist/safe-path-segment.d.ts +1 -2
- package/dist/safe-path-segment.js +2 -5
- package/dist/secret-file.d.ts +0 -1
- package/dist/secret-file.js +7 -18
- package/dist/secret-read-async.d.ts +0 -1
- package/dist/secret-read-async.js +5 -5
- package/dist/secret-read-policy.d.ts +0 -1
- package/dist/secret.d.ts +0 -1
- package/dist/secure-file-windows.d.ts +0 -6
- package/dist/secure-file-windows.js +13 -28
- package/dist/secure-file.d.ts +0 -1
- package/dist/secure-file.js +9 -9
- package/dist/secure-temp-dir.d.ts +0 -1
- package/dist/secure-temp-repair.d.ts +0 -1
- package/dist/secure-temp-repair.js +5 -1
- package/dist/sibling-staged-file.d.ts +0 -1
- package/dist/sibling-staged-file.js +32 -39
- package/dist/sibling-temp.d.ts +0 -1
- package/dist/sidecar-lock-acquire.d.ts +1 -2
- package/dist/sidecar-lock-acquire.js +37 -61
- package/dist/sidecar-lock-admission-context.d.ts +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts +0 -1
- package/dist/sidecar-lock-admission.d.ts +1 -5
- package/dist/sidecar-lock-admission.js +1 -7
- package/dist/sidecar-lock-handle.d.ts +0 -1
- package/dist/sidecar-lock-policy.d.ts +4 -1
- package/dist/sidecar-lock-policy.js +23 -0
- package/dist/sidecar-lock-reclaim.d.ts +0 -1
- package/dist/sidecar-lock-registration.d.ts +13 -0
- package/dist/sidecar-lock-registration.js +47 -0
- package/dist/sidecar-lock-root.d.ts +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts +0 -1
- package/dist/sidecar-lock-stale-admission.js +2 -6
- package/dist/sidecar-lock-target.d.ts +0 -1
- package/dist/sidecar-lock-types.d.ts +22 -17
- package/dist/sidecar-lock.d.ts +0 -1
- package/dist/sidecar-lock.js +16 -83
- package/dist/staged-directory.d.ts +0 -1
- package/dist/staged-file-settlement.d.ts +0 -1
- package/dist/staged-file-types.d.ts +0 -1
- package/dist/stat-observation.d.ts +0 -1
- package/dist/store.d.ts +0 -1
- package/dist/strict-file-identity.d.ts +0 -1
- package/dist/string-coerce.d.ts +0 -1
- package/dist/suppressed-error.d.ts +0 -1
- package/dist/symlink-parents.d.ts +0 -1
- package/dist/temp-cleanup.d.ts +0 -1
- package/dist/temp-target.d.ts +0 -1
- package/dist/temp-target.js +7 -46
- package/dist/temp-workspace-admission.d.ts +0 -8
- package/dist/temp-workspace-admission.js +1 -7
- package/dist/temp-workspace-child-admission.d.ts +16 -6
- package/dist/temp-workspace-child-admission.js +71 -15
- package/dist/temp-workspace-descriptor.d.ts +1 -7
- package/dist/temp-workspace-descriptor.js +1 -4
- package/dist/temp-workspace-owner.d.ts +1 -1
- package/dist/temp-workspace-owner.js +45 -22
- package/dist/temp-workspace-types.d.ts +0 -1
- package/dist/temp.d.ts +0 -1
- package/dist/test-hooks.d.ts +0 -1
- package/dist/text-atomic.d.ts +0 -1
- package/dist/text-atomic.js +1 -1
- package/dist/timing.d.ts +0 -1
- package/dist/trash.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/unicode-path.d.ts +0 -1
- package/dist/walk.d.ts +0 -1
- package/dist/windows-command.d.ts +0 -1
- package/dist/windows-owner.d.ts +0 -1
- package/dist/windows-owner.js +5 -2
- package/dist/windows-path-alias.d.ts +1 -1
- package/dist/windows-path-alias.js +12 -43
- package/dist/windows-path-syntax.d.ts +5 -0
- package/dist/windows-path-syntax.js +21 -0
- package/dist/windows-security-command.d.ts +0 -1
- package/dist/windows-security-facts.d.ts +0 -1
- package/dist/write-file-handle.d.ts +0 -1
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-queue.d.ts +0 -1
- package/docs/advanced.md +3 -1
- package/docs/atomic.md +14 -0
- package/docs/copy.md +2 -0
- package/docs/mutation-policy-proof.md +6 -4
- package/docs/permissions.md +6 -0
- package/docs/root.md +10 -0
- package/docs/secret-file.md +8 -0
- package/docs/sidecar-lock.md +4 -0
- package/docs/store.md +6 -0
- package/docs/temp.md +8 -1
- package/docs/writing.md +14 -3
- package/package.json +8 -9
- package/dist/absolute-path.d.ts.map +0 -1
- package/dist/advanced.d.ts.map +0 -1
- package/dist/archive-crc32.d.ts.map +0 -1
- package/dist/archive-deadline.d.ts.map +0 -1
- package/dist/archive-durability.d.ts.map +0 -1
- package/dist/archive-entry.d.ts.map +0 -1
- package/dist/archive-errors.d.ts.map +0 -1
- package/dist/archive-gzip-tail.d.ts.map +0 -1
- package/dist/archive-input.d.ts.map +0 -1
- package/dist/archive-kind.d.ts.map +0 -1
- package/dist/archive-limits.d.ts.map +0 -1
- package/dist/archive-merge.d.ts.map +0 -1
- package/dist/archive-native.d.ts +0 -22
- package/dist/archive-native.d.ts.map +0 -1
- package/dist/archive-native.js +0 -98
- package/dist/archive-options.d.ts +0 -25
- package/dist/archive-options.d.ts.map +0 -1
- package/dist/archive-parser-errors.d.ts.map +0 -1
- package/dist/archive-plan.d.ts.map +0 -1
- package/dist/archive-policy.d.ts +0 -22
- package/dist/archive-policy.d.ts.map +0 -1
- package/dist/archive-policy.js +0 -38
- package/dist/archive-read.d.ts.map +0 -1
- package/dist/archive-staging.d.ts.map +0 -1
- package/dist/archive-tar-inspect.d.ts +0 -7
- package/dist/archive-tar-inspect.d.ts.map +0 -1
- package/dist/archive-tar-inspect.js +0 -62
- package/dist/archive-tar-stream.d.ts.map +0 -1
- package/dist/archive-tar-wasm.d.ts.map +0 -1
- package/dist/archive-tar.d.ts +0 -19
- package/dist/archive-tar.d.ts.map +0 -1
- package/dist/archive-tar.js +0 -21
- package/dist/archive-zip-admission.d.ts.map +0 -1
- package/dist/archive-zip-count.d.ts.map +0 -1
- package/dist/archive-zip-directory.d.ts.map +0 -1
- package/dist/archive-zip-entry.d.ts.map +0 -1
- package/dist/archive-zip-integrity.d.ts.map +0 -1
- package/dist/archive-zip-loader.d.ts.map +0 -1
- package/dist/archive-zip-manifest.d.ts.map +0 -1
- package/dist/archive-zip-names.d.ts.map +0 -1
- package/dist/archive-zip-preflight.d.ts.map +0 -1
- package/dist/archive.d.ts.map +0 -1
- package/dist/async-lock.d.ts.map +0 -1
- package/dist/atomic.d.ts.map +0 -1
- package/dist/bounded-read-stream.d.ts.map +0 -1
- package/dist/bounded-read.d.ts.map +0 -1
- package/dist/byte-budget.d.ts.map +0 -1
- package/dist/byte-view.d.ts.map +0 -1
- package/dist/clone-metadata.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/containment.d.ts.map +0 -1
- package/dist/copy-file-input.d.ts.map +0 -1
- package/dist/copy-policy.d.ts.map +0 -1
- package/dist/copy-publication.d.ts.map +0 -1
- package/dist/copy-tree-portable.d.ts.map +0 -1
- package/dist/copy.d.ts.map +0 -1
- package/dist/create-directory.d.ts +0 -20
- package/dist/create-directory.d.ts.map +0 -1
- package/dist/create-directory.js +0 -130
- package/dist/create-file-async.d.ts +0 -7
- package/dist/create-file-async.d.ts.map +0 -1
- package/dist/create-file-async.js +0 -121
- package/dist/create-file.d.ts +0 -8
- package/dist/create-file.d.ts.map +0 -1
- package/dist/create-file.js +0 -190
- package/dist/create-owned-file.d.ts.map +0 -1
- package/dist/create.d.ts.map +0 -1
- package/dist/creation-darwin.d.ts +0 -6
- package/dist/creation-darwin.d.ts.map +0 -1
- package/dist/creation-darwin.js +0 -70
- package/dist/creation-file-state.d.ts +0 -19
- package/dist/creation-file-state.d.ts.map +0 -1
- package/dist/creation-file-state.js +0 -118
- package/dist/creation-path.d.ts +0 -21
- package/dist/creation-path.d.ts.map +0 -1
- package/dist/creation-path.js +0 -71
- package/dist/creation-permissions.d.ts +0 -19
- package/dist/creation-permissions.d.ts.map +0 -1
- package/dist/creation-permissions.js +0 -125
- package/dist/deny-mutations.d.ts.map +0 -1
- package/dist/device-path.d.ts.map +0 -1
- package/dist/directory-durability.d.ts.map +0 -1
- package/dist/directory-entry-path.d.ts.map +0 -1
- package/dist/directory-guard.d.ts.map +0 -1
- package/dist/directory-mode-node.d.ts.map +0 -1
- package/dist/directory-mode-owner.d.ts.map +0 -1
- package/dist/directory-receipt.d.ts.map +0 -1
- package/dist/durability.d.ts.map +0 -1
- package/dist/effective-uid.d.ts.map +0 -1
- package/dist/error-detail.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/file-cleanup.d.ts.map +0 -1
- package/dist/file-contents.d.ts.map +0 -1
- package/dist/file-handle-transfer.d.ts.map +0 -1
- package/dist/file-hash.d.ts.map +0 -1
- package/dist/file-identity.d.ts.map +0 -1
- package/dist/file-lock-sync-admission.d.ts.map +0 -1
- package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
- package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
- package/dist/file-lock-sync-root-held.d.ts.map +0 -1
- package/dist/file-lock-sync-root-io.d.ts.map +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
- package/dist/file-lock-sync-root-options.d.ts.map +0 -1
- package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
- package/dist/file-lock-sync-root.d.ts.map +0 -1
- package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
- package/dist/file-lock-sync.d.ts.map +0 -1
- package/dist/file-lock.d.ts.map +0 -1
- package/dist/file-observation.d.ts.map +0 -1
- package/dist/file-store-boundary.d.ts.map +0 -1
- package/dist/file-store-copy-source.d.ts +0 -5
- package/dist/file-store-copy-source.d.ts.map +0 -1
- package/dist/file-store-copy-source.js +0 -31
- package/dist/file-store-limit.d.ts +0 -2
- package/dist/file-store-limit.d.ts.map +0 -1
- package/dist/file-store-limit.js +0 -8
- package/dist/file-store-path.d.ts +0 -3
- package/dist/file-store-path.d.ts.map +0 -1
- package/dist/file-store-path.js +0 -30
- package/dist/file-store-prune.d.ts.map +0 -1
- package/dist/file-store-sync-directory.d.ts.map +0 -1
- package/dist/file-store-sync-write.d.ts.map +0 -1
- package/dist/file-store.d.ts.map +0 -1
- package/dist/file-sync.d.ts.map +0 -1
- package/dist/filename.d.ts.map +0 -1
- package/dist/fs.d.ts.map +0 -1
- package/dist/guarded-mkdir.d.ts.map +0 -1
- package/dist/guarded-mutation.d.ts.map +0 -1
- package/dist/guest-dispatch-python.d.ts.map +0 -1
- package/dist/guest-native-python.d.ts.map +0 -1
- package/dist/guest.d.ts.map +0 -1
- package/dist/home-dir.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/install-path.d.ts.map +0 -1
- package/dist/json-document-store.d.ts.map +0 -1
- package/dist/json-durable-queue-directory.d.ts.map +0 -1
- package/dist/json-durable-queue-ownership.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.d.ts +0 -11
- package/dist/json-durable-queue-paths.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.js +0 -20
- package/dist/json-durable-queue-read.d.ts.map +0 -1
- package/dist/json-durable-queue.d.ts.map +0 -1
- package/dist/json-store.d.ts.map +0 -1
- package/dist/json-stringify.d.ts.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/local-file-access.d.ts.map +0 -1
- package/dist/local-file-descriptor.d.ts.map +0 -1
- package/dist/local-roots.d.ts.map +0 -1
- package/dist/lock-config.d.ts.map +0 -1
- package/dist/move-path-cleanup.d.ts.map +0 -1
- package/dist/move-path-stage.d.ts.map +0 -1
- package/dist/move-path.d.ts.map +0 -1
- package/dist/mutation-authority.d.ts.map +0 -1
- package/dist/native-binding.d.ts.map +0 -1
- package/dist/native-config.d.ts.map +0 -1
- package/dist/native-directory-observation.d.ts.map +0 -1
- package/dist/native-fallback-warning.d.ts.map +0 -1
- package/dist/native-operations.d.ts.map +0 -1
- package/dist/native-parent-admission.d.ts.map +0 -1
- package/dist/native-pinned-write-windows.d.ts.map +0 -1
- package/dist/native-pinned-write.d.ts.map +0 -1
- package/dist/native-policy-directory-observation.d.ts.map +0 -1
- package/dist/native-policy-parent-windows.d.ts.map +0 -1
- package/dist/native-rename-outcome.d.ts.map +0 -1
- package/dist/native-staged-file.d.ts.map +0 -1
- package/dist/native.d.ts.map +0 -1
- package/dist/opened-file-failure.d.ts.map +0 -1
- package/dist/opened-realpath.d.ts.map +0 -1
- package/dist/output.d.ts.map +0 -1
- package/dist/overwrite-file-handle.d.ts.map +0 -1
- package/dist/owner-dacl.d.ts.map +0 -1
- package/dist/path-case.d.ts.map +0 -1
- package/dist/path-policy.d.ts.map +0 -1
- package/dist/path-prefix.d.ts.map +0 -1
- package/dist/path-scope-lexical.d.ts.map +0 -1
- package/dist/path-segment-route.d.ts.map +0 -1
- package/dist/path-suffix-aliases.d.ts.map +0 -1
- package/dist/path.d.ts.map +0 -1
- package/dist/permission-exec.d.ts.map +0 -1
- package/dist/permissions-public.d.ts.map +0 -1
- package/dist/permissions-windows.d.ts.map +0 -1
- package/dist/permissions.d.ts.map +0 -1
- package/dist/pinned-mutation-admission.d.ts.map +0 -1
- package/dist/pinned-mutation-observation.d.ts.map +0 -1
- package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
- package/dist/pinned-open.d.ts.map +0 -1
- package/dist/pinned-operation.d.ts.map +0 -1
- package/dist/pinned-write-input.d.ts.map +0 -1
- package/dist/pinned-write-mode.d.ts.map +0 -1
- package/dist/pinned-write-staged.d.ts.map +0 -1
- package/dist/pinned-write-types.d.ts.map +0 -1
- package/dist/pinned-write.d.ts.map +0 -1
- package/dist/positional-read.d.ts.map +0 -1
- package/dist/private-directory.d.ts.map +0 -1
- package/dist/private-producer-handoff-sync.d.ts.map +0 -1
- package/dist/private-producer-handoff.d.ts.map +0 -1
- package/dist/private-temp-workspace.d.ts.map +0 -1
- package/dist/publish-copy-stage.d.ts.map +0 -1
- package/dist/publish-file-failure.d.ts.map +0 -1
- package/dist/publish-file.d.ts.map +0 -1
- package/dist/read-open-flags.d.ts.map +0 -1
- package/dist/read-opened-file.d.ts.map +0 -1
- package/dist/realpath.d.ts.map +0 -1
- package/dist/recursive-mkdir-path.d.ts.map +0 -1
- package/dist/regular-file.d.ts.map +0 -1
- package/dist/replace-directory.d.ts.map +0 -1
- package/dist/replace-file-copy-fallback.d.ts.map +0 -1
- package/dist/replace-file-copy-source.d.ts.map +0 -1
- package/dist/replace-file-descriptor.d.ts.map +0 -1
- package/dist/replace-file-mode.d.ts.map +0 -1
- package/dist/replace-file-rename-policy.d.ts.map +0 -1
- package/dist/replace-file-temp-owner.d.ts.map +0 -1
- package/dist/replace-file.d.ts.map +0 -1
- package/dist/retained-directory-replacement.d.ts.map +0 -1
- package/dist/root-boundary.d.ts.map +0 -1
- package/dist/root-context.d.ts.map +0 -1
- package/dist/root-create-input.d.ts.map +0 -1
- package/dist/root-directory-creation.d.ts.map +0 -1
- package/dist/root-directory-list.d.ts.map +0 -1
- package/dist/root-directory.d.ts.map +0 -1
- package/dist/root-entries.d.ts.map +0 -1
- package/dist/root-errors.d.ts.map +0 -1
- package/dist/root-file-final-admission.d.ts.map +0 -1
- package/dist/root-file.d.ts.map +0 -1
- package/dist/root-impl.d.ts.map +0 -1
- package/dist/root-move-noreplace.d.ts.map +0 -1
- package/dist/root-move-preflight.d.ts.map +0 -1
- package/dist/root-observed-path.d.ts.map +0 -1
- package/dist/root-options.d.ts.map +0 -1
- package/dist/root-path-errors.d.ts.map +0 -1
- package/dist/root-path-existing.d.ts.map +0 -1
- package/dist/root-path-observation.d.ts.map +0 -1
- package/dist/root-path-stat.d.ts.map +0 -1
- package/dist/root-path-symlink.d.ts +0 -7
- package/dist/root-path-symlink.d.ts.map +0 -1
- package/dist/root-path-symlink.js +0 -55
- package/dist/root-path.d.ts.map +0 -1
- package/dist/root-paths-lexical.d.ts.map +0 -1
- package/dist/root-paths.d.ts.map +0 -1
- package/dist/root-read-admission.d.ts.map +0 -1
- package/dist/root-remove-identity.d.ts.map +0 -1
- package/dist/root-remove-receipt.d.ts.map +0 -1
- package/dist/root-remove.d.ts.map +0 -1
- package/dist/root-symlink-policy.d.ts.map +0 -1
- package/dist/root-walk.d.ts.map +0 -1
- package/dist/root-write-admission.d.ts.map +0 -1
- package/dist/root-write-compatibility.d.ts.map +0 -1
- package/dist/root-write-complete-parent.d.ts.map +0 -1
- package/dist/root-write-lock-binding.d.ts.map +0 -1
- package/dist/root-write-mode.d.ts.map +0 -1
- package/dist/root-write-publication.d.ts.map +0 -1
- package/dist/root-write-verification.d.ts.map +0 -1
- package/dist/root.d.ts.map +0 -1
- package/dist/safe-path-segment.d.ts.map +0 -1
- package/dist/secret-file.d.ts.map +0 -1
- package/dist/secret-read-async.d.ts.map +0 -1
- package/dist/secret-read-policy.d.ts.map +0 -1
- package/dist/secret.d.ts.map +0 -1
- package/dist/secure-file-windows.d.ts.map +0 -1
- package/dist/secure-file.d.ts.map +0 -1
- package/dist/secure-temp-dir.d.ts.map +0 -1
- package/dist/secure-temp-repair.d.ts.map +0 -1
- package/dist/sibling-staged-file.d.ts.map +0 -1
- package/dist/sibling-temp.d.ts.map +0 -1
- package/dist/sidecar-lock-acquire.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
- package/dist/sidecar-lock-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-handle.d.ts.map +0 -1
- package/dist/sidecar-lock-policy.d.ts.map +0 -1
- package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
- package/dist/sidecar-lock-root.d.ts.map +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-target.d.ts.map +0 -1
- package/dist/sidecar-lock-types.d.ts.map +0 -1
- package/dist/sidecar-lock.d.ts.map +0 -1
- package/dist/staged-directory.d.ts.map +0 -1
- package/dist/staged-file-settlement.d.ts.map +0 -1
- package/dist/staged-file-types.d.ts.map +0 -1
- package/dist/standalone-publication-path.d.ts +0 -2
- package/dist/standalone-publication-path.d.ts.map +0 -1
- package/dist/standalone-publication-path.js +0 -6
- package/dist/stat-observation.d.ts.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/strict-file-identity.d.ts.map +0 -1
- package/dist/string-coerce.d.ts.map +0 -1
- package/dist/suppressed-error.d.ts.map +0 -1
- package/dist/symlink-parents.d.ts.map +0 -1
- package/dist/temp-cleanup.d.ts.map +0 -1
- package/dist/temp-target.d.ts.map +0 -1
- package/dist/temp-workspace-admission.d.ts.map +0 -1
- package/dist/temp-workspace-child-admission.d.ts.map +0 -1
- package/dist/temp-workspace-descriptor.d.ts.map +0 -1
- package/dist/temp-workspace-identity.d.ts +0 -15
- package/dist/temp-workspace-identity.d.ts.map +0 -1
- package/dist/temp-workspace-identity.js +0 -41
- package/dist/temp-workspace-owner.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.d.ts +0 -4
- package/dist/temp-workspace-permissions.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.js +0 -32
- package/dist/temp-workspace-types.d.ts.map +0 -1
- package/dist/temp.d.ts.map +0 -1
- package/dist/test-hooks.d.ts.map +0 -1
- package/dist/text-atomic.d.ts.map +0 -1
- package/dist/timing.d.ts.map +0 -1
- package/dist/trash.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/unicode-path.d.ts.map +0 -1
- package/dist/walk.d.ts.map +0 -1
- package/dist/windows-command.d.ts.map +0 -1
- package/dist/windows-owner.d.ts.map +0 -1
- package/dist/windows-path-alias.d.ts.map +0 -1
- package/dist/windows-security-command.d.ts.map +0 -1
- package/dist/windows-security-facts.d.ts.map +0 -1
- package/dist/write-file-handle.d.ts.map +0 -1
- package/dist/write-open-flags.d.ts.map +0 -1
- package/dist/write-queue.d.ts.map +0 -1
- /package/dist/{archive-options.js → root-public-types.js} +0 -0
package/dist/root-impl.js
CHANGED
|
@@ -56,7 +56,7 @@ import fs from "node:fs/promises";
|
|
|
56
56
|
import path from "node:path";
|
|
57
57
|
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
58
58
|
import { assertCopySourceCurrent, resolveFileCopyCloneMode } from "./copy-file-input.js";
|
|
59
|
-
import { assertPrivateFileCreationAvailable, resolveCreationPermissions } from "./creation-
|
|
59
|
+
import { assertPrivateFileCreationAvailable, resolveCreationPermissions } from "./creation-boundary.js";
|
|
60
60
|
import { assertAsyncDirectoryGuard, assertSyncDirectoryGuard, createAsyncDirectoryGuard, createNearestExistingDirectoryGuard } from "./directory-guard.js";
|
|
61
61
|
import { FsSafeError } from "./errors.js";
|
|
62
62
|
import { syncDirectoryBestEffort } from "./directory-durability.js";
|
|
@@ -68,11 +68,12 @@ import { openedPathResolutionError, recordExclusiveCreateFailure, recordOpenedFi
|
|
|
68
68
|
import { runPinnedWriteHelper, runPinnedWriteWithRenamePolicy } from "./pinned-write.js";
|
|
69
69
|
import { preparePinnedWriteMutationAdmission, snapshotPinnedMutationPolicy } from "./pinned-mutation-admission.js";
|
|
70
70
|
import { getNativeBinding } from "./native.js";
|
|
71
|
-
import {
|
|
71
|
+
import { validatePinnedRelativePath } from "./pinned-operation.js";
|
|
72
72
|
import { PATH_ALIAS_POLICIES } from "./path-policy.js";
|
|
73
73
|
import { assertNoNulPathInput, hasNodeErrorCode, isNotFoundPathError, isSymlinkOpenError, } from "./path.js";
|
|
74
74
|
import { readOpenedFileSafely } from "./read-opened-file.js";
|
|
75
75
|
import { cleanupPinnedFilePath } from "./file-cleanup.js";
|
|
76
|
+
import { sameFileIdentity } from "./file-identity.js";
|
|
76
77
|
import { removePathIfIdentityUnchanged } from "./replace-file-temp-owner.js";
|
|
77
78
|
import { realpathSync } from "./realpath.js";
|
|
78
79
|
import { mkdirPathFallback, prepareRootWriteTarget, tryMkdirAtExactParent } from "./root-directory-creation.js";
|
|
@@ -85,7 +86,7 @@ import { statResolvedPathInRoot } from "./root-path-stat.js";
|
|
|
85
86
|
import { entriesInRoot } from "./root-entries.js";
|
|
86
87
|
import { assertMoveMutationAllowed } from "./root-move-preflight.js";
|
|
87
88
|
import { assertRootIdentityCurrent, assertRootIdentityCurrentSync, assertValidRootDestinationPath, assertValidRootRelativePath, ensureTrailingSep, expandRelativePathWithHome, resolvePathInRoot, resolveRootContext, rootRelativeReadPath, } from "./root-context.js";
|
|
88
|
-
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError, outsideWorkspaceError, } from "./root-errors.js";
|
|
89
|
+
import { errorCauseOptions, fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError, outsideWorkspaceError, } from "./root-errors.js";
|
|
89
90
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
90
91
|
import { stringifyJsonDocument } from "./json-stringify.js";
|
|
91
92
|
import { walkRoot } from "./root-walk.js";
|
|
@@ -186,30 +187,19 @@ async function openVerifiedLocalFile(filePath, options) {
|
|
|
186
187
|
}
|
|
187
188
|
}
|
|
188
189
|
export class RootHandle {
|
|
189
|
-
|
|
190
|
-
rootIdentity;
|
|
190
|
+
context;
|
|
191
191
|
rootDir;
|
|
192
192
|
rootReal;
|
|
193
193
|
rootWithSep;
|
|
194
194
|
defaults;
|
|
195
195
|
constructor(context, defaults = {}) {
|
|
196
|
-
this.
|
|
197
|
-
this.rootIdentity = context.rootIdentity;
|
|
196
|
+
this.context = context;
|
|
198
197
|
this.rootDir = context.rootDir;
|
|
199
198
|
this.rootReal = context.rootReal;
|
|
200
199
|
this.rootWithSep = context.rootWithSep;
|
|
201
200
|
this.defaults = defaults;
|
|
202
201
|
registerFileLockSyncRootAdapter(this, context, defaults);
|
|
203
202
|
}
|
|
204
|
-
get context() {
|
|
205
|
-
return {
|
|
206
|
-
rootDir: this.rootDir,
|
|
207
|
-
rootGuard: this.rootGuard,
|
|
208
|
-
rootIdentity: this.rootIdentity,
|
|
209
|
-
rootReal: this.rootReal,
|
|
210
|
-
rootWithSep: this.rootWithSep,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
203
|
mutationOptions(options) {
|
|
214
204
|
return {
|
|
215
205
|
...options,
|
|
@@ -224,9 +214,9 @@ export class RootHandle {
|
|
|
224
214
|
}
|
|
225
215
|
async open(relativePath, options = {}) {
|
|
226
216
|
return await openFileInRoot(this.context, {
|
|
227
|
-
relativePath,
|
|
228
217
|
...readDefaults(this.defaults),
|
|
229
218
|
...options,
|
|
219
|
+
relativePath,
|
|
230
220
|
});
|
|
231
221
|
}
|
|
232
222
|
async read(relativePath, options = {}) {
|
|
@@ -246,9 +236,11 @@ export class RootHandle {
|
|
|
246
236
|
return JSON.parse(await this.readText(relativePath, options));
|
|
247
237
|
}
|
|
248
238
|
async readAbsolute(filePath, options = {}) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
239
|
+
const context = this.context;
|
|
240
|
+
const readOptions = mergeReadOptions(this.defaults, options);
|
|
241
|
+
return await readFileInRoot(context, {
|
|
242
|
+
relativePath: rootRelativeReadPath(context, filePath),
|
|
243
|
+
...readOptions,
|
|
252
244
|
});
|
|
253
245
|
}
|
|
254
246
|
reader(options = {}) {
|
|
@@ -260,10 +252,11 @@ export class RootHandle {
|
|
|
260
252
|
assertValidRootDestinationPath(relativePath);
|
|
261
253
|
const writeMode = options.writeMode ?? "replace";
|
|
262
254
|
const target = await openWritableFileInRoot(this.context, {
|
|
263
|
-
relativePath,
|
|
264
255
|
mkdir: this.defaults.mkdir,
|
|
265
256
|
mode: this.defaults.mode,
|
|
266
257
|
...this.mutationOptions(options),
|
|
258
|
+
relativePath,
|
|
259
|
+
expectedWritePath: undefined,
|
|
267
260
|
append: writeMode === "append",
|
|
268
261
|
truncateExisting: writeMode === "replace",
|
|
269
262
|
}).catch(rethrowMutationAuthorityError);
|
|
@@ -272,11 +265,11 @@ export class RootHandle {
|
|
|
272
265
|
async append(relativePath, data, options = {}) {
|
|
273
266
|
assertValidRootDestinationPath(relativePath);
|
|
274
267
|
await appendFileInRoot(this.context, {
|
|
275
|
-
relativePath,
|
|
276
|
-
data,
|
|
277
268
|
mkdir: this.defaults.mkdir,
|
|
278
269
|
mode: this.defaults.mode,
|
|
279
270
|
...this.mutationOptions(options),
|
|
271
|
+
relativePath,
|
|
272
|
+
data,
|
|
280
273
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
281
274
|
}).catch(rethrowMutationAuthorityError);
|
|
282
275
|
}
|
|
@@ -285,33 +278,37 @@ export class RootHandle {
|
|
|
285
278
|
validateRemoveOptions(options);
|
|
286
279
|
options.signal?.throwIfAborted();
|
|
287
280
|
await removePathInRoot(this.context, {
|
|
288
|
-
relativePath,
|
|
289
281
|
...this.mutationOptions(options),
|
|
282
|
+
relativePath,
|
|
290
283
|
}).catch(rethrowMutationAuthorityError);
|
|
291
284
|
}
|
|
292
285
|
async mkdir(relativePath, options = {}) {
|
|
293
286
|
assertValidRootDestinationPath(relativePath);
|
|
294
287
|
await mkdirPathInRoot(this.context, {
|
|
295
|
-
relativePath,
|
|
296
288
|
...this.mutationOptions(options),
|
|
289
|
+
relativePath,
|
|
290
|
+
allowRoot: false,
|
|
297
291
|
}).catch(rethrowMutationAuthorityError);
|
|
298
292
|
}
|
|
299
293
|
async ensureRoot(options = {}) {
|
|
300
294
|
await mkdirPathInRoot(this.context, {
|
|
295
|
+
...this.mutationOptions(options),
|
|
301
296
|
relativePath: "",
|
|
302
297
|
allowRoot: true,
|
|
303
|
-
...this.mutationOptions(options),
|
|
304
298
|
}).catch(rethrowMutationAuthorityError);
|
|
305
299
|
}
|
|
306
300
|
async write(relativePath, data, options = {}) {
|
|
307
301
|
assertValidRootDestinationPath(relativePath);
|
|
308
302
|
await writeFileInRoot(this.context, {
|
|
309
|
-
relativePath,
|
|
310
|
-
data,
|
|
311
303
|
mkdir: this.defaults.mkdir,
|
|
312
304
|
mode: this.defaults.mode,
|
|
313
305
|
renameIdentity: this.defaults.renameIdentity,
|
|
314
306
|
...this.mutationOptions(options),
|
|
307
|
+
atomic: undefined,
|
|
308
|
+
private: undefined,
|
|
309
|
+
strictFileSync: undefined,
|
|
310
|
+
relativePath,
|
|
311
|
+
data,
|
|
315
312
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
316
313
|
}).catch(rethrowMutationAuthorityError);
|
|
317
314
|
}
|
|
@@ -319,11 +316,11 @@ export class RootHandle {
|
|
|
319
316
|
assertValidRootDestinationPath(relativePath);
|
|
320
317
|
const durable = options.durable ?? this.defaults.durable ?? true;
|
|
321
318
|
await writeFileInRoot(this.context, {
|
|
322
|
-
relativePath,
|
|
323
|
-
data,
|
|
324
319
|
mkdir: this.defaults.mkdir,
|
|
325
320
|
mode: this.defaults.mode,
|
|
326
321
|
...this.mutationOptions(createInputOptions(data, options, this.defaults.maxBytes)),
|
|
322
|
+
relativePath,
|
|
323
|
+
data,
|
|
327
324
|
durable: durable !== false,
|
|
328
325
|
strictFileSync: durable === "file",
|
|
329
326
|
overwrite: false,
|
|
@@ -343,12 +340,13 @@ export class RootHandle {
|
|
|
343
340
|
options.signal?.throwIfAborted();
|
|
344
341
|
assertValidRootDestinationPath(relativePath);
|
|
345
342
|
const { maxBytes, ...copyOptions } = this.mutationOptions(options);
|
|
343
|
+
const copySource = typeof source === "string" ? source : { root: source.root, relativePath: source.relativePath };
|
|
346
344
|
await copyFileInRoot(this.context, {
|
|
347
|
-
source: typeof source === "string" ? source : { root: source.root, relativePath: source.relativePath },
|
|
348
|
-
relativePath,
|
|
349
345
|
maxBytes: normalizeMaxBytes(maxBytes, { defaultValue: this.defaults.maxBytes }),
|
|
350
346
|
mkdir: this.defaults.mkdir,
|
|
351
347
|
...copyOptions,
|
|
348
|
+
source: copySource,
|
|
349
|
+
relativePath,
|
|
352
350
|
mode: options.mode ?? this.defaults.mode,
|
|
353
351
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
354
352
|
verifyPublished: options[onCopyPublication],
|
|
@@ -369,18 +367,19 @@ export class RootHandle {
|
|
|
369
367
|
}
|
|
370
368
|
async stat(relativePath) {
|
|
371
369
|
assertValidRootRelativePath(relativePath);
|
|
372
|
-
|
|
370
|
+
validatePinnedRelativePath(relativePath);
|
|
373
371
|
return await statPathFallback(this.context, relativePath);
|
|
374
372
|
}
|
|
375
373
|
async list(relativePath, options = {}) {
|
|
376
374
|
assertValidRootRelativePath(relativePath);
|
|
377
|
-
|
|
375
|
+
validatePinnedRelativePath(relativePath);
|
|
378
376
|
return await listPathFallback(this.context, relativePath, options.withFileTypes === true);
|
|
379
377
|
}
|
|
380
378
|
async move(fromRelative, toRelative, options = {}) {
|
|
381
379
|
assertValidRootRelativePath(fromRelative);
|
|
382
380
|
assertValidRootDestinationPath(toRelative);
|
|
383
|
-
|
|
381
|
+
validatePinnedRelativePath(fromRelative);
|
|
382
|
+
validatePinnedRelativePath(toRelative);
|
|
384
383
|
const mutationOptions = this.mutationOptions(options);
|
|
385
384
|
const { assertBeforeMutation } = mutationOptions;
|
|
386
385
|
const { denyMutations, mutationSymlinks } = snapshotPinnedMutationPolicy(mutationOptions.denyMutations, mutationOptions.mutationSymlinks) ?? {};
|
|
@@ -409,10 +408,10 @@ export class RootHandle {
|
|
|
409
408
|
walk(relativePath, options) {
|
|
410
409
|
assertValidRootRelativePath(relativePath);
|
|
411
410
|
return walkRoot({
|
|
412
|
-
rootReal: this.rootReal,
|
|
411
|
+
rootReal: this.context.rootReal,
|
|
413
412
|
stat: relative => this.stat(relative),
|
|
414
413
|
list: async (relative, listingOptions) => {
|
|
415
|
-
|
|
414
|
+
validatePinnedRelativePath(relative);
|
|
416
415
|
const resolved = await resolvePinnedPathInRoot(this.context, { relativePath: relative, allowRoot: true });
|
|
417
416
|
return await openRootDirectoryListing(this.context, resolved.resolved, listingOptions);
|
|
418
417
|
},
|
|
@@ -468,15 +467,6 @@ async function readFileInRoot(root, params) {
|
|
|
468
467
|
await opened.handle.close().catch(() => { });
|
|
469
468
|
}
|
|
470
469
|
}
|
|
471
|
-
async function readPathInRoot(root, params) {
|
|
472
|
-
const relativePath = rootRelativeReadPath(root, params.filePath);
|
|
473
|
-
return await readFileInRoot(root, {
|
|
474
|
-
relativePath,
|
|
475
|
-
hardlinks: params.hardlinks,
|
|
476
|
-
maxBytes: params.maxBytes,
|
|
477
|
-
symlinks: params.symlinks,
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
470
|
export async function readLocalFileSafely(params) {
|
|
481
471
|
const maxBytes = normalizeMaxBytes(params.maxBytes);
|
|
482
472
|
const opened = await openLocalFileSafely({ filePath: params.filePath });
|
|
@@ -502,7 +492,7 @@ function buildAtomicWriteTempPath(targetPath) {
|
|
|
502
492
|
function rootWriteQueueKey(root, relativePath) {
|
|
503
493
|
return `${root.rootReal}\0${relativePath}`;
|
|
504
494
|
}
|
|
505
|
-
async function openWritableFileInRoot(root, params) {
|
|
495
|
+
async function openWritableFileInRoot(root, params, options) {
|
|
506
496
|
const guardedTarget = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
507
497
|
? undefined
|
|
508
498
|
: await resolveGuardedWriteTargetInRoot(root, {
|
|
@@ -517,7 +507,6 @@ async function openWritableFileInRoot(root, params) {
|
|
|
517
507
|
relativePath: params.relativePath, guardedTarget, mkdir: params.mkdir,
|
|
518
508
|
assertBeforeMutation: params.assertBeforeMutation,
|
|
519
509
|
}) : undefined;
|
|
520
|
-
const mutationAdmission = prepared?.mutationAdmission;
|
|
521
510
|
const preparedParent = prepared?.preparedParent;
|
|
522
511
|
let ioPath = prepared?.targetPath ?? (params.mkdir === false ? resolved :
|
|
523
512
|
await prepareRootWriteTarget(root, resolved, params.assertBeforeMutation));
|
|
@@ -566,6 +555,17 @@ async function openWritableFileInRoot(root, params) {
|
|
|
566
555
|
if (!isNotFoundPathError(err)) {
|
|
567
556
|
throw err;
|
|
568
557
|
}
|
|
558
|
+
if (options?.createIfMissing === false) {
|
|
559
|
+
const parentGuard = writePathSelection?.parentGuard ??
|
|
560
|
+
await createAsyncDirectoryGuard(path.dirname(ioPath), { bigint: true });
|
|
561
|
+
assertRootIdentityCurrentSync(root);
|
|
562
|
+
if (!admitPathInsideRoot({
|
|
563
|
+
rootPath: root.rootReal, candidatePath: parentGuard.realPath, rootIdentity: root.rootIdentity,
|
|
564
|
+
}))
|
|
565
|
+
throw outsideWorkspaceError();
|
|
566
|
+
assertSyncDirectoryGuard(parentGuard);
|
|
567
|
+
return { missing: true, targetPath: ioPath, parentGuard, writeSelection: writePathSelection };
|
|
568
|
+
}
|
|
569
569
|
if (writePathSelection)
|
|
570
570
|
await refreshRootWritePathSelection(writePathSelection);
|
|
571
571
|
params.assertBeforeMutation?.();
|
|
@@ -766,7 +766,7 @@ async function appendFileInRoot(root, params) {
|
|
|
766
766
|
}
|
|
767
767
|
}
|
|
768
768
|
async function removePathInRoot(root, params) {
|
|
769
|
-
|
|
769
|
+
validatePinnedRelativePath(params.relativePath);
|
|
770
770
|
const removalReceipts = params.recursive ? undefined : new RemovalPathReceipts();
|
|
771
771
|
const resolved = await resolvePinnedPathInRoot(root, {
|
|
772
772
|
relativePath: params.relativePath,
|
|
@@ -786,20 +786,15 @@ async function removePathInRoot(root, params) {
|
|
|
786
786
|
}
|
|
787
787
|
async function mkdirPathInRoot(root, params) {
|
|
788
788
|
const privateMode = resolveCreationPermissions(params, true).private;
|
|
789
|
-
|
|
789
|
+
validatePinnedRelativePath(params.relativePath);
|
|
790
790
|
const policy = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
791
791
|
? undefined
|
|
792
792
|
: snapshotPinnedMutationPolicy(params.denyMutations, params.mutationSymlinks);
|
|
793
|
+
const resolution = { relativePath: params.relativePath, allowRoot: params.allowRoot, ...policy };
|
|
793
794
|
const resolveCurrent = policy
|
|
794
|
-
? async () => await resolvePinnedPathInRoot(root,
|
|
795
|
-
...params,
|
|
796
|
-
denyMutations: policy.denyMutations,
|
|
797
|
-
mutationSymlinks: policy.mutationSymlinks,
|
|
798
|
-
})
|
|
795
|
+
? async () => await resolvePinnedPathInRoot(root, resolution)
|
|
799
796
|
: undefined;
|
|
800
|
-
const resolved =
|
|
801
|
-
? await resolveCurrent()
|
|
802
|
-
: await resolvePinnedPathInRoot(root, params);
|
|
797
|
+
const resolved = await resolvePinnedPathInRoot(root, resolution);
|
|
803
798
|
const prepared = policy && resolved.relativePosix !== ""
|
|
804
799
|
? await preparePinnedWriteMutationAdmission({
|
|
805
800
|
rootReal: resolved.rootReal,
|
|
@@ -870,7 +865,7 @@ async function commitPinnedWriteInRoot(root, pinned, params, input) {
|
|
|
870
865
|
overwrite: params.overwrite,
|
|
871
866
|
rejectFinalSymlink: params.mutationSymlinks !== undefined,
|
|
872
867
|
input,
|
|
873
|
-
maxBytes: params.maxBytes,
|
|
868
|
+
maxBytes: input.kind === "buffer" ? undefined : params.maxBytes,
|
|
874
869
|
rootIdentity: root.rootIdentity,
|
|
875
870
|
mutationAdmission: pinned.mutationAdmission,
|
|
876
871
|
assertBeforeMutation: params.assertBeforeMutation,
|
|
@@ -900,9 +895,7 @@ async function commitPinnedWriteInRoot(root, pinned, params, input) {
|
|
|
900
895
|
throw error;
|
|
901
896
|
}
|
|
902
897
|
if (params.overwrite === false && isAlreadyExistsError(error)) {
|
|
903
|
-
throw new FsSafeError("already-exists", "file already exists",
|
|
904
|
-
cause: error instanceof Error ? error : undefined,
|
|
905
|
-
});
|
|
898
|
+
throw new FsSafeError("already-exists", "file already exists", errorCauseOptions(error));
|
|
906
899
|
}
|
|
907
900
|
throw normalizePinnedWriteError(error);
|
|
908
901
|
}
|
|
@@ -995,20 +988,9 @@ async function copyFileInRoot(root, params) {
|
|
|
995
988
|
}
|
|
996
989
|
}
|
|
997
990
|
async function resolvePinnedPathInRoot(root, params) {
|
|
998
|
-
return await resolvePinnedOperationPathInRoot(root, {
|
|
999
|
-
allowRoot: params.allowRoot,
|
|
1000
|
-
denyMutations: params.denyMutations,
|
|
1001
|
-
mutationSymlinks: params.mutationSymlinks,
|
|
1002
|
-
protectDenyMutationAncestors: params.remove === true,
|
|
1003
|
-
relativePath: params.relativePath,
|
|
1004
|
-
policy: params.remove ? PATH_ALIAS_POLICIES.unlinkTarget : PATH_ALIAS_POLICIES.strict,
|
|
1005
|
-
removalReceipts: params.removalReceipts,
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
|
-
async function resolvePinnedOperationPathInRoot(root, params) {
|
|
1009
991
|
const resolved = await resolvePinnedRootPathInRoot(root, {
|
|
1010
992
|
relativePath: params.relativePath,
|
|
1011
|
-
policy: params.
|
|
993
|
+
policy: params.remove ? PATH_ALIAS_POLICIES.unlinkTarget : PATH_ALIAS_POLICIES.strict,
|
|
1012
994
|
mutationSymlinks: params.mutationSymlinks,
|
|
1013
995
|
removalReceipts: params.removalReceipts,
|
|
1014
996
|
});
|
|
@@ -1035,7 +1017,7 @@ async function resolvePinnedOperationPathInRoot(root, params) {
|
|
|
1035
1017
|
}
|
|
1036
1018
|
resolved.canonicalPath = admittedCanonicalPath.path;
|
|
1037
1019
|
await assertMutationNotDenied(resolved.canonicalPath, params.denyMutations, {
|
|
1038
|
-
protectAncestors: params.
|
|
1020
|
+
protectAncestors: params.remove === true,
|
|
1039
1021
|
});
|
|
1040
1022
|
return { rootReal: resolved.rootReal, resolved: resolved.canonicalPath, relativePosix };
|
|
1041
1023
|
}
|
|
@@ -1192,9 +1174,7 @@ async function movePathFallback(root, params) {
|
|
|
1192
1174
|
throw fileNotFoundError(error instanceof Error ? error : undefined);
|
|
1193
1175
|
}
|
|
1194
1176
|
if (hasNodeErrorCode(error, "EEXIST")) {
|
|
1195
|
-
throw new FsSafeError("already-exists", "destination exists",
|
|
1196
|
-
cause: error instanceof Error ? error : undefined,
|
|
1197
|
-
});
|
|
1177
|
+
throw new FsSafeError("already-exists", "destination exists", errorCauseOptions(error));
|
|
1198
1178
|
}
|
|
1199
1179
|
throw error;
|
|
1200
1180
|
}
|
|
@@ -1212,7 +1192,11 @@ async function writeFileFallback(root, params) {
|
|
|
1212
1192
|
const policy = snapshotPinnedMutationPolicy(params.denyMutations, params.mutationSymlinks);
|
|
1213
1193
|
if (policy)
|
|
1214
1194
|
params = { ...params, ...policy };
|
|
1215
|
-
const { rootReal, resolved } = await resolveGuardedWritePathInRoot(root,
|
|
1195
|
+
const { rootReal, resolved } = await resolveGuardedWritePathInRoot(root, {
|
|
1196
|
+
relativePath: params.relativePath,
|
|
1197
|
+
denyMutations: params.denyMutations,
|
|
1198
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
1199
|
+
});
|
|
1216
1200
|
await withRootFallbackCompatibilityLock({
|
|
1217
1201
|
rootPath: rootReal, rootIdentity: root.rootIdentity, targetPath: resolved, assertBeforeMutation: params.assertBeforeMutation,
|
|
1218
1202
|
}, async ({ targetPath, ...binding }) => await writeFileFallbackUnlocked(root, { ...params, ...binding }, targetPath));
|
|
@@ -1222,48 +1206,59 @@ async function writeFileFallbackUnlocked(root, params, expectedWritePath) {
|
|
|
1222
1206
|
await writeMissingFileFallback(root, params, expectedWritePath);
|
|
1223
1207
|
return;
|
|
1224
1208
|
}
|
|
1225
|
-
const
|
|
1209
|
+
const admissionParams = {
|
|
1226
1210
|
relativePath: params.relativePath,
|
|
1227
1211
|
mkdir: params.mkdir,
|
|
1228
|
-
// Private, writable placeholder: Windows cannot rename over a read-only file.
|
|
1229
|
-
mode: 0o600,
|
|
1230
1212
|
denyMutations: params.denyMutations,
|
|
1231
1213
|
assertBeforeMutation: params.assertBeforeMutation,
|
|
1232
1214
|
mutationSymlinks: params.mutationSymlinks,
|
|
1233
1215
|
truncateExisting: false,
|
|
1234
1216
|
expectedWritePath,
|
|
1235
|
-
}
|
|
1217
|
+
};
|
|
1218
|
+
const admission = await openWritableFileInRoot(root, admissionParams, { createIfMissing: false });
|
|
1219
|
+
const existing = "missing" in admission ? undefined : admission;
|
|
1220
|
+
const target = existing?.opened;
|
|
1221
|
+
const retainedSelection = existing?.writeSelection;
|
|
1222
|
+
const missingSelection = "missing" in admission ? admission.writeSelection : undefined;
|
|
1236
1223
|
const policyEnabled = params.denyMutations !== undefined || params.mutationSymlinks !== undefined;
|
|
1237
|
-
const destinationPath =
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1224
|
+
const destinationPath = "missing" in admission ? admission.targetPath
|
|
1225
|
+
: retainedSelection?.selectedPath ?? admission.opened.realPath;
|
|
1226
|
+
let mode = params.mode ?? (target ? target.stat.mode & 0o777 : undefined);
|
|
1227
|
+
if (policyEnabled && !retainedSelection && !missingSelection) {
|
|
1228
|
+
await target?.handle.close().catch(() => undefined);
|
|
1241
1229
|
throw new FsSafeError("path-mismatch", "write admission state was not retained");
|
|
1242
1230
|
}
|
|
1243
|
-
const destinationGuard = retainedSelection?.parentGuard ??
|
|
1231
|
+
const destinationGuard = "missing" in admission ? admission.parentGuard : retainedSelection?.parentGuard ??
|
|
1244
1232
|
await createAsyncDirectoryGuard(path.dirname(destinationPath), { bigint: true }).catch(async (error) => {
|
|
1245
|
-
await target
|
|
1233
|
+
await target?.handle.close().catch(() => undefined);
|
|
1246
1234
|
throw error;
|
|
1247
1235
|
});
|
|
1248
1236
|
let tempPath = null;
|
|
1249
1237
|
let unregisterTempPath = null;
|
|
1250
1238
|
let writtenHandle;
|
|
1251
1239
|
let writtenIdentity;
|
|
1252
|
-
let
|
|
1253
|
-
let published = false;
|
|
1240
|
+
let lateTargetHandle;
|
|
1254
1241
|
try {
|
|
1255
|
-
if (target.createdForWrite)
|
|
1256
|
-
placeholderIdentity = targetIdentity;
|
|
1257
1242
|
tempPath = buildAtomicWriteTempPath(destinationPath);
|
|
1258
1243
|
if (retainedSelection) {
|
|
1259
|
-
await refreshRetainedRootWriteAdmission(root, retainedSelection, true, target
|
|
1244
|
+
await refreshRetainedRootWriteAdmission(root, retainedSelection, true, target?.handle.fd);
|
|
1245
|
+
}
|
|
1246
|
+
else if (missingSelection) {
|
|
1247
|
+
await refreshRootWritePathSelection(missingSelection);
|
|
1260
1248
|
}
|
|
1261
1249
|
params.assertBeforeMutation?.();
|
|
1262
1250
|
if (retainedSelection) {
|
|
1263
|
-
assertRootWriteSelectionSync(root, retainedSelection, true, target
|
|
1251
|
+
assertRootWriteSelectionSync(root, retainedSelection, true, target?.handle.fd);
|
|
1252
|
+
}
|
|
1253
|
+
else if (missingSelection) {
|
|
1254
|
+
assertRootWritePathSelectionSync(root, missingSelection);
|
|
1264
1255
|
}
|
|
1256
|
+
assertRootIdentityCurrentSync(root);
|
|
1257
|
+
assertSyncDirectoryGuard(destinationGuard);
|
|
1265
1258
|
writtenHandle = await fs.open(tempPath, OPEN_WRITE_CREATE_FLAGS, 0o600);
|
|
1266
1259
|
writtenIdentity = fsSync.fstatSync(writtenHandle.fd, { bigint: true });
|
|
1260
|
+
// Preserve the creation mask when no existing destination supplies a mode.
|
|
1261
|
+
mode ??= Number(writtenIdentity.mode & 511n);
|
|
1267
1262
|
unregisterTempPath = registerTempPathForExit(tempPath, { identity: writtenIdentity, singleLinkFile: true });
|
|
1268
1263
|
await writeAllToFile(writtenHandle, params.data, {
|
|
1269
1264
|
encoding: params.encoding, assertBeforeMutation: params.assertBeforeMutation,
|
|
@@ -1278,24 +1273,42 @@ async function writeFileFallbackUnlocked(root, params, expectedWritePath) {
|
|
|
1278
1273
|
root, targetPath: commitTempPath, fd: commitHandle.fd,
|
|
1279
1274
|
expectedIdentity: commitIdentity, parentGuard: destinationGuard,
|
|
1280
1275
|
});
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1276
|
+
assertRootIdentityCurrentSync(root);
|
|
1277
|
+
assertSyncDirectoryGuard(destinationGuard);
|
|
1278
|
+
let publicationIdentity = inspectFallbackReplacementDestination(destinationPath);
|
|
1279
|
+
// A raced file needs its own access admission, not the old handle's rights.
|
|
1280
|
+
if (publicationIdentity && (!existing || !sameFileIdentity(publicationIdentity, existing.identity))) {
|
|
1281
|
+
const admitted = await openWritableFileInRoot(root, {
|
|
1282
|
+
...admissionParams, mkdir: false, expectedWritePath: destinationPath,
|
|
1283
|
+
}, { createIfMissing: false });
|
|
1284
|
+
lateTargetHandle = "missing" in admitted ? undefined : admitted.opened.handle;
|
|
1285
|
+
publicationIdentity = "missing" in admitted ? undefined : admitted.identity;
|
|
1286
|
+
await lateTargetHandle?.close();
|
|
1285
1287
|
}
|
|
1286
1288
|
// Windows cannot replace a destination while its old handle remains open.
|
|
1287
|
-
await target
|
|
1289
|
+
await target?.handle.close();
|
|
1288
1290
|
if (retainedSelection) {
|
|
1289
|
-
await refreshRetainedRootWriteAdmission(root, retainedSelection,
|
|
1291
|
+
await refreshRetainedRootWriteAdmission(root, retainedSelection, true);
|
|
1292
|
+
}
|
|
1293
|
+
else if (missingSelection) {
|
|
1294
|
+
await refreshRootWritePathSelection(missingSelection);
|
|
1290
1295
|
}
|
|
1291
1296
|
assertFinalSymlinkRejected(destinationPath, params.mutationSymlinks !== undefined);
|
|
1292
1297
|
params.assertBeforeMutation?.();
|
|
1293
1298
|
if (retainedSelection) {
|
|
1294
|
-
assertRootWriteSelectionSync(root, retainedSelection,
|
|
1299
|
+
assertRootWriteSelectionSync(root, retainedSelection, true);
|
|
1300
|
+
}
|
|
1301
|
+
else if (missingSelection) {
|
|
1302
|
+
assertRootWritePathSelectionSync(root, missingSelection);
|
|
1303
|
+
}
|
|
1304
|
+
assertRootIdentityCurrentSync(root);
|
|
1305
|
+
assertSyncDirectoryGuard(destinationGuard);
|
|
1306
|
+
const current = inspectFallbackReplacementDestination(destinationPath);
|
|
1307
|
+
if (publicationIdentity ? !current || !sameFileIdentity(current, publicationIdentity) : current) {
|
|
1308
|
+
throw new FsSafeError("path-mismatch", "write destination changed before publication");
|
|
1295
1309
|
}
|
|
1296
1310
|
await fs.rename(commitTempPath, destinationPath);
|
|
1297
1311
|
tempPath = null;
|
|
1298
|
-
published = true;
|
|
1299
1312
|
});
|
|
1300
1313
|
unregisterTempPath();
|
|
1301
1314
|
unregisterTempPath = null;
|
|
@@ -1308,12 +1321,8 @@ async function writeFileFallbackUnlocked(root, params, expectedWritePath) {
|
|
|
1308
1321
|
});
|
|
1309
1322
|
}
|
|
1310
1323
|
finally {
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
pathname: destinationPath, handle: target.handle, identity: placeholderIdentity, parentGuard: destinationGuard,
|
|
1314
|
-
});
|
|
1315
|
-
}
|
|
1316
|
-
await target.handle.close().catch(() => undefined);
|
|
1324
|
+
await target?.handle.close().catch(() => undefined);
|
|
1325
|
+
await lateTargetHandle?.close().catch(() => undefined);
|
|
1317
1326
|
if (tempPath && writtenHandle) {
|
|
1318
1327
|
await cleanupPinnedFilePath({
|
|
1319
1328
|
pathname: tempPath, handle: writtenHandle, identity: writtenIdentity, parentGuard: destinationGuard,
|
|
@@ -1323,6 +1332,23 @@ async function writeFileFallbackUnlocked(root, params, expectedWritePath) {
|
|
|
1323
1332
|
unregisterTempPath?.();
|
|
1324
1333
|
}
|
|
1325
1334
|
}
|
|
1335
|
+
function inspectFallbackReplacementDestination(targetPath) {
|
|
1336
|
+
let current;
|
|
1337
|
+
try {
|
|
1338
|
+
current = inspectFileIdentitySync(() => fsSync.lstatSync(targetPath, { bigint: true }));
|
|
1339
|
+
}
|
|
1340
|
+
catch (error) {
|
|
1341
|
+
if (isNotFoundPathError(error))
|
|
1342
|
+
return;
|
|
1343
|
+
throw error;
|
|
1344
|
+
}
|
|
1345
|
+
if (current.isSymbolicLink() || !current.isFile()) {
|
|
1346
|
+
throw new FsSafeError("path-mismatch", "write destination changed before publication");
|
|
1347
|
+
}
|
|
1348
|
+
if (current.nlink > 1n)
|
|
1349
|
+
throw hardlinkedPathNotAllowedError();
|
|
1350
|
+
return current;
|
|
1351
|
+
}
|
|
1326
1352
|
async function writeMissingFileFallback(root, params, expectedWritePath) {
|
|
1327
1353
|
const guardedTarget = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
1328
1354
|
? undefined
|
|
@@ -1399,9 +1425,7 @@ async function writeMissingFileFallback(root, params, expectedWritePath) {
|
|
|
1399
1425
|
if (verifyingPublication)
|
|
1400
1426
|
throw err;
|
|
1401
1427
|
if (hasNodeErrorCode(err, "EEXIST")) {
|
|
1402
|
-
throw new FsSafeError("already-exists", "file already exists",
|
|
1403
|
-
cause: err instanceof Error ? err : undefined,
|
|
1404
|
-
});
|
|
1428
|
+
throw new FsSafeError("already-exists", "file already exists", errorCauseOptions(err));
|
|
1405
1429
|
}
|
|
1406
1430
|
throw err;
|
|
1407
1431
|
}
|
|
@@ -9,7 +9,7 @@ import { isNotFoundPathError } from "./path.js";
|
|
|
9
9
|
import { assertRootIdentityCurrent, assertRootIdentityCurrentSync } from "./root-context.js";
|
|
10
10
|
import { resolveRootPathSync } from "./root-path.js";
|
|
11
11
|
import { admitPathInsideRoot } from "./root-boundary.js";
|
|
12
|
-
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, outsideWorkspaceError, } from "./root-errors.js";
|
|
12
|
+
import { errorCauseOptions, fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, outsideWorkspaceError, } from "./root-errors.js";
|
|
13
13
|
import { assertFinalSymlinkRejected } from "./root-symlink-policy.js";
|
|
14
14
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
15
15
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
@@ -44,17 +44,13 @@ function normalizeMoveError(error) {
|
|
|
44
44
|
return fileNotFoundError(error instanceof Error ? error : undefined);
|
|
45
45
|
}
|
|
46
46
|
if (nativePrimitiveUnavailable(error)) {
|
|
47
|
-
return new FsSafeError("helper-unavailable", "native no-replace move is unavailable",
|
|
48
|
-
cause: error instanceof Error ? error : undefined,
|
|
49
|
-
});
|
|
47
|
+
return new FsSafeError("helper-unavailable", "native no-replace move is unavailable", errorCauseOptions(error));
|
|
50
48
|
}
|
|
51
49
|
return error;
|
|
52
50
|
}
|
|
53
51
|
function normalizeRenameNoReplaceError(error) {
|
|
54
52
|
if (error?.code === "EINVAL") {
|
|
55
|
-
return new FsSafeError("helper-unavailable", "native no-replace move is unavailable on this filesystem",
|
|
56
|
-
cause: error instanceof Error ? error : undefined,
|
|
57
|
-
});
|
|
53
|
+
return new FsSafeError("helper-unavailable", "native no-replace move is unavailable on this filesystem", errorCauseOptions(error));
|
|
58
54
|
}
|
|
59
55
|
return normalizeMoveError(error);
|
|
60
56
|
}
|
|
@@ -157,9 +153,7 @@ export async function movePathNoReplaceNative(root, params, paths) {
|
|
|
157
153
|
}
|
|
158
154
|
catch (error) {
|
|
159
155
|
if (isAlreadyExistsError(error) || error?.code === "ENOTEMPTY") {
|
|
160
|
-
throw new FsSafeError("already-exists", "destination exists",
|
|
161
|
-
cause: error instanceof Error ? error : undefined,
|
|
162
|
-
});
|
|
156
|
+
throw new FsSafeError("already-exists", "destination exists", errorCauseOptions(error));
|
|
163
157
|
}
|
|
164
158
|
throw normalizeRenameNoReplaceError(error);
|
|
165
159
|
}
|
|
@@ -6,4 +6,3 @@ export type PinnedObservedPath = {
|
|
|
6
6
|
receipt?: RootPathObservationReceipt;
|
|
7
7
|
};
|
|
8
8
|
export declare function resolvePinnedObservedPathInRoot(root: RootContext, relativePath: string, kind: RootPathObservationKind): Promise<PinnedObservedPath | undefined>;
|
|
9
|
-
//# sourceMappingURL=root-observed-path.d.ts.map
|
|
@@ -7,7 +7,7 @@ import { admitPathInsideRoot } from "./root-boundary.js";
|
|
|
7
7
|
import { assertRootPathObservationReceiptCurrent } from "./root-directory-list.js";
|
|
8
8
|
import { RootPathObservationError, resolveRootPathWithObservation, } from "./root-path.js";
|
|
9
9
|
import { createRootObservationGuard, ensureTrailingSep, expandRelativePathWithHome, } from "./root-context.js";
|
|
10
|
-
import { fileNotFoundError, outsideWorkspaceError } from "./root-errors.js";
|
|
10
|
+
import { errorCauseOptions, fileNotFoundError, outsideWorkspaceError } from "./root-errors.js";
|
|
11
11
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
12
12
|
export async function resolvePinnedObservedPathInRoot(root, relativePath, kind) {
|
|
13
13
|
const rootGuard = await createRootObservationGuard(root);
|
|
@@ -50,9 +50,7 @@ export async function resolvePinnedObservedPathInRoot(root, relativePath, kind)
|
|
|
50
50
|
if (kind === "stat") {
|
|
51
51
|
throw fileNotFoundError(error.error instanceof Error ? error.error : undefined);
|
|
52
52
|
}
|
|
53
|
-
throw new FsSafeError("not-found", "directory not found",
|
|
54
|
-
cause: error.error instanceof Error ? error.error : undefined,
|
|
55
|
-
});
|
|
53
|
+
throw new FsSafeError("not-found", "directory not found", errorCauseOptions(error.error));
|
|
56
54
|
}
|
|
57
55
|
throw error.error;
|
|
58
56
|
}
|
package/dist/root-options.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DenyMutationPolicy } from "./deny-mutations.js";
|
|
2
|
-
import type { RenameIdentityPolicy } from "./pinned-write.js";
|
|
2
|
+
import type { RenameIdentityPolicy } from "./pinned-write-types.js";
|
|
3
3
|
import type { MutationSymlinkPolicy, SymlinkPolicy } from "./root-symlink-policy.js";
|
|
4
4
|
import type { CopyCloneMode } from "./copy-policy.js";
|
|
5
5
|
import type { RootCopyPublicationReceipt } from "./copy-publication.js";
|
|
@@ -82,4 +82,3 @@ export type RootMkdirOptions = Pick<RootDefaults, "assertBeforeMutation" | "deny
|
|
|
82
82
|
export type RootReadParams = Omit<RootReadOptions, "nonBlockingRead">;
|
|
83
83
|
export declare function readDefaults(defaults: RootDefaults): RootReadParams;
|
|
84
84
|
export declare function mergeReadOptions(defaults: RootDefaults, options: RootReadOptions): RootReadParams;
|
|
85
|
-
//# sourceMappingURL=root-options.d.ts.map
|