@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
|
@@ -7,4 +7,6 @@ export declare function rawPathRelativeToCanonicalRoot(candidate: string, rootCa
|
|
|
7
7
|
}): string | undefined;
|
|
8
8
|
export declare function resolvePathViaExistingAncestor(targetPath: string): Promise<string>;
|
|
9
9
|
export declare function resolvePathViaExistingAncestorSync(targetPath: string): string;
|
|
10
|
-
|
|
10
|
+
export type RootPathMetadataMode = "native" | "ordinary";
|
|
11
|
+
export declare function resolveExistingAncestor(targetPath: string, mode: RootPathMetadataMode): string;
|
|
12
|
+
export declare function resolveSymlinkHopPath(symlinkPath: string, mode: RootPathMetadataMode, rejectUnresolved?: boolean): string;
|
|
@@ -2,10 +2,11 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { formatErrorDetail } from "./error-detail.js";
|
|
5
|
-
import { isNotFoundPathError, isPathInside } from "./path.js";
|
|
5
|
+
import { isNotFoundPathError, isPathInside, isSymlinkOpenError } from "./path.js";
|
|
6
6
|
import { realpathSync } from "./realpath.js";
|
|
7
|
-
import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
7
|
+
import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathFromBasePreservingWindowsRoot, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
8
8
|
import { admitPathInsideRoot } from "./root-boundary.js";
|
|
9
|
+
import { errorCauseOptions } from "./root-errors.js";
|
|
9
10
|
export function absolutePathWithRawSegments(candidate) {
|
|
10
11
|
if (path.sep !== "\\") {
|
|
11
12
|
if (path.isAbsolute(candidate))
|
|
@@ -81,9 +82,6 @@ export function rawPathRelativeToCanonicalRoot(candidate, rootCanonicalPath, opt
|
|
|
81
82
|
}
|
|
82
83
|
return undefined;
|
|
83
84
|
}
|
|
84
|
-
function isFilesystemRoot(candidate) {
|
|
85
|
-
return path.parse(candidate).root === candidate;
|
|
86
|
-
}
|
|
87
85
|
function pathExists(targetPath) {
|
|
88
86
|
try {
|
|
89
87
|
return fs.lstatSync(pathForWindowsFilesystem(targetPath), { throwIfNoEntry: false }) !== undefined;
|
|
@@ -96,28 +94,25 @@ function pathExists(targetPath) {
|
|
|
96
94
|
}
|
|
97
95
|
}
|
|
98
96
|
export async function resolvePathViaExistingAncestor(targetPath) {
|
|
99
|
-
return resolveExistingAncestor(targetPath,
|
|
97
|
+
return resolveExistingAncestor(targetPath, "native");
|
|
100
98
|
}
|
|
101
99
|
function pathExistsSync(targetPath) {
|
|
102
100
|
return fs.existsSync(pathForWindowsFilesystem(targetPath));
|
|
103
101
|
}
|
|
104
102
|
export function resolvePathViaExistingAncestorSync(targetPath) {
|
|
105
|
-
return resolveExistingAncestor(targetPath,
|
|
103
|
+
return resolveExistingAncestor(targetPath, "ordinary");
|
|
106
104
|
}
|
|
107
|
-
function resolveExistingAncestor(targetPath,
|
|
105
|
+
export function resolveExistingAncestor(targetPath, mode) {
|
|
106
|
+
const exists = mode === "native" ? pathExists : pathExistsSync;
|
|
107
|
+
const canonicalize = mode === "native" ? realpathSync.native : realpathSync;
|
|
108
108
|
assertNoWindowsPathAlias(targetPath);
|
|
109
109
|
const normalized = resolvePathPreservingWindowsRoot(targetPath);
|
|
110
110
|
assertNoWindowsPathAlias(normalized);
|
|
111
111
|
let cursor = normalized;
|
|
112
|
-
const
|
|
113
|
-
while (
|
|
112
|
+
const filesystemRoot = path.parse(normalized).root;
|
|
113
|
+
while (cursor !== filesystemRoot &&
|
|
114
114
|
!exists(cursor)) {
|
|
115
|
-
|
|
116
|
-
const parent = path.dirname(cursor);
|
|
117
|
-
if (parent === cursor) {
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
cursor = parent;
|
|
115
|
+
cursor = path.dirname(cursor);
|
|
121
116
|
}
|
|
122
117
|
if (!exists(cursor)) {
|
|
123
118
|
return normalized;
|
|
@@ -132,9 +127,34 @@ function resolveExistingAncestor(targetPath, exists, canonicalize) {
|
|
|
132
127
|
assertNoWindowsPathAlias(rawResolvedAncestor);
|
|
133
128
|
const resolvedAncestor = resolvePathPreservingWindowsRoot(rawResolvedAncestor);
|
|
134
129
|
assertNoWindowsPathAlias(resolvedAncestor);
|
|
135
|
-
|
|
130
|
+
// Keep a leading suffix separator relative to the canonical ancestor.
|
|
131
|
+
const resolved = cursor === normalized
|
|
136
132
|
? resolvedAncestor
|
|
137
|
-
: path.resolve(resolvedAncestor,
|
|
133
|
+
: path.resolve(resolvedAncestor, `.${path.sep}${normalized.slice(cursor.length)}`);
|
|
138
134
|
assertNoWindowsPathAlias(resolved);
|
|
139
135
|
return resolved;
|
|
140
136
|
}
|
|
137
|
+
export function resolveSymlinkHopPath(symlinkPath, mode, rejectUnresolved) {
|
|
138
|
+
try {
|
|
139
|
+
const canonicalize = mode === "native" ? realpathSync.native : realpathSync;
|
|
140
|
+
const rawRealPath = canonicalize(symlinkPath);
|
|
141
|
+
assertNoWindowsPathAlias(rawRealPath, "filesystem", "resolved symlink path uses a Windows filesystem namespace alias");
|
|
142
|
+
const realPath = resolvePathPreservingWindowsRoot(rawRealPath);
|
|
143
|
+
assertNoWindowsPathAlias(realPath, "filesystem", "resolved symlink path uses a Windows filesystem namespace alias");
|
|
144
|
+
return realPath;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (isSymlinkOpenError(error) || (rejectUnresolved && isNotFoundPathError(error))) {
|
|
148
|
+
throw new FsSafeError("symlink", "symlink path could not be resolved", errorCauseOptions(error));
|
|
149
|
+
}
|
|
150
|
+
if (!isNotFoundPathError(error))
|
|
151
|
+
throw error;
|
|
152
|
+
const linkTarget = fs.readlinkSync(symlinkPath);
|
|
153
|
+
assertNoWindowsPathAlias(linkTarget, "filesystem", "symlink target uses a Windows filesystem namespace alias");
|
|
154
|
+
const linkDir = resolvePathPreservingWindowsRoot(path.dirname(symlinkPath));
|
|
155
|
+
const targetPath = resolvePathFromBasePreservingWindowsRoot(linkDir, linkTarget);
|
|
156
|
+
const resolved = resolveExistingAncestor(targetPath, mode);
|
|
157
|
+
assertNoWindowsPathAlias(resolved, "filesystem", "resolved symlink path uses a Windows filesystem namespace alias");
|
|
158
|
+
return resolved;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -60,4 +60,3 @@ export type RootPathTraversalContext = {
|
|
|
60
60
|
export declare function createRootPathTraversalObservation(context: RootPathTraversalContext, request?: RootPathObservationRequest): RootPathTraversalObservation | undefined;
|
|
61
61
|
export declare function inspectRootPathTraversalEntry(pathname: string, directorySlot: boolean, observation: RootPathTraversalObservation): RootPathObservedTraversalEntry;
|
|
62
62
|
export declare function captureRootPathObservedDirectory(observation: RootPathTraversalObservation, observed: RootPathObservedTraversalEntry, publicPath: string, canonicalPath: string, rootCanonicalPath: string, rootIdentity?: RootBoundaryIdentity): boolean;
|
|
63
|
-
//# sourceMappingURL=root-path-observation.d.ts.map
|
package/dist/root-path-stat.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ import type { RootContext } from "./root-context.js";
|
|
|
2
2
|
import type { RootPathObservationReceipt } from "./root-path.js";
|
|
3
3
|
import type { PathStat } from "./types.js";
|
|
4
4
|
export declare function statResolvedPathInRoot(root: RootContext, resolvedPath: string, receipt?: RootPathObservationReceipt): Promise<PathStat>;
|
|
5
|
-
//# sourceMappingURL=root-path-stat.d.ts.map
|
package/dist/root-path-stat.js
CHANGED
|
@@ -4,7 +4,7 @@ import { FsSafeError } from "./errors.js";
|
|
|
4
4
|
import { fileObservation, recordFileObservationFailure } from "./file-observation.js";
|
|
5
5
|
import { hasNodeErrorCode, isNotFoundPathError } from "./path.js";
|
|
6
6
|
import { assertRootDirectoryObservationGuard, assertRootPathObservationReceiptCurrent, createRootDirectoryObservationGuard, pathStatFromStats, } from "./root-directory-list.js";
|
|
7
|
-
import { fileNotFoundError } from "./root-errors.js";
|
|
7
|
+
import { errorCauseOptions, fileNotFoundError } from "./root-errors.js";
|
|
8
8
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
9
9
|
import { assertStatObservationSync } from "./stat-observation.js";
|
|
10
10
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
@@ -32,9 +32,7 @@ async function captureChangedObservedFile(error, pathname, before, observed, ass
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
async function missingObservedFileError(cause, pathname, before, assertParents, proof) {
|
|
35
|
-
const failure = new FsSafeError("path-mismatch", "file changed during operation",
|
|
36
|
-
cause: cause instanceof Error ? cause : undefined,
|
|
37
|
-
});
|
|
35
|
+
const failure = new FsSafeError("path-mismatch", "file changed during operation", errorCauseOptions(cause));
|
|
38
36
|
if (hasNodeErrorCode(cause, "ENOENT") && before?.isFile() && !before.isSymbolicLink() &&
|
|
39
37
|
(before.nlink === 1 || before.nlink === 1n)) {
|
|
40
38
|
try {
|
package/dist/root-path.d.ts
CHANGED
|
@@ -51,4 +51,3 @@ export declare function resolveRootPathWithObservation(params: ResolveRootPathPa
|
|
|
51
51
|
export declare function resolveRootPathForRemoval(params: ResolveRootPathParams, receipts: RemovalPathReceipts): Promise<ResolvedRootPath>;
|
|
52
52
|
export declare function resolveRootPathSync(params: ResolveRootPathParams): ResolvedRootPath;
|
|
53
53
|
export declare function resolveRootPathSyncWithCanonicalRootObservation(params: ResolveRootPathParams, observeRoot: (rootCanonicalPath: string) => void): ResolvedRootPath;
|
|
54
|
-
//# sourceMappingURL=root-path.d.ts.map
|
package/dist/root-path.js
CHANGED
|
@@ -5,10 +5,9 @@ import { pathEscapeError, sanitizeRootPathError, symlinkEscapeError } from "./ro
|
|
|
5
5
|
import { FsSafeError } from "./errors.js";
|
|
6
6
|
import { isNativeDirectoryObservationGuard } from "./native-directory-observation.js";
|
|
7
7
|
import { assertNoNulPathInput, isNotFoundPathError, isPathRelativeEscape, } from "./path.js";
|
|
8
|
-
import { absolutePathWithRawSegments, rawPathRelativeToCanonicalRoot,
|
|
8
|
+
import { absolutePathWithRawSegments, rawPathRelativeToCanonicalRoot, resolveExistingAncestor, resolveSymlinkHopPath, } from "./root-path-existing.js";
|
|
9
9
|
import { admitPathInsideRoot, } from "./root-boundary.js";
|
|
10
10
|
import { RootPathObservationError, captureRootPathObservedDirectory, createRootPathTraversalObservation, inspectRootPathTraversalEntry, } from "./root-path-observation.js";
|
|
11
|
-
import { resolveSymlinkHopPath, resolveSymlinkHopPathSync } from "./root-path-symlink.js";
|
|
12
11
|
import { assertNoDriveRelativePathSegments } from "./safe-path-segment.js";
|
|
13
12
|
import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathFromBasePreservingWindowsRoot, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
14
13
|
export { resolvePathViaExistingAncestorSync } from "./root-path-existing.js";
|
|
@@ -24,85 +23,35 @@ export const ROOT_PATH_ALIAS_POLICIES = {
|
|
|
24
23
|
}),
|
|
25
24
|
};
|
|
26
25
|
export async function resolveRootPath(params) {
|
|
27
|
-
|
|
28
|
-
return await resolveRootPathInternal(params);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
throw sanitizeRootPathError(error);
|
|
32
|
-
}
|
|
26
|
+
return resolveRootPathInternal(params);
|
|
33
27
|
}
|
|
34
28
|
export async function resolveRootPathWithCanonicalRootObservation(params, observeRoot) {
|
|
35
|
-
|
|
36
|
-
return await resolveRootPathInternal(params, undefined, undefined, observeRoot);
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
throw sanitizeRootPathError(error);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async function resolveRootPathInternal(params, observationRequest, observationOutput, observeRoot, removalReceipts) {
|
|
43
|
-
const input = captureValidRootPathInputs(params);
|
|
44
|
-
const rawAbsolutePath = absolutePathWithRawSegments(input.absolutePath);
|
|
45
|
-
const rootPath = resolvePathPreservingWindowsRoot(input.rootPath);
|
|
46
|
-
const absolutePath = resolvePathPreservingWindowsRoot(rawAbsolutePath);
|
|
47
|
-
const rootCanonicalPath = input.rootCanonicalPath
|
|
48
|
-
? resolvePathPreservingWindowsRoot(input.rootCanonicalPath)
|
|
49
|
-
: await resolvePathViaExistingAncestor(rootPath);
|
|
50
|
-
assertNoWindowsPathAlias(rootPath);
|
|
51
|
-
assertNoWindowsPathAlias(absolutePath);
|
|
52
|
-
assertNoWindowsPathAlias(rootCanonicalPath);
|
|
53
|
-
observeRoot?.(rootCanonicalPath);
|
|
54
|
-
return resolveRootPathLexicalAsync(prepareRootTraversal(input, rootPath, rootCanonicalPath, absolutePath, rawAbsolutePath), observationRequest, observationOutput, removalReceipts);
|
|
29
|
+
return resolveRootPathInternal(params, { observeRoot });
|
|
55
30
|
}
|
|
56
31
|
export async function resolveRootPathWithObservation(params, request) {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return output.receipt ? { resolved, receipt: output.receipt } : { resolved };
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
throw sanitizeRootPathError(error);
|
|
64
|
-
}
|
|
32
|
+
const observation = { request };
|
|
33
|
+
const resolved = resolveRootPathInternal(params, { observation });
|
|
34
|
+
return observation.receipt ? { resolved, receipt: observation.receipt } : { resolved };
|
|
65
35
|
}
|
|
66
36
|
// Removal receipts are separate from metadata observations and canonical-root
|
|
67
37
|
// callbacks; the public resolver's options and result remain unchanged.
|
|
68
38
|
export async function resolveRootPathForRemoval(params, receipts) {
|
|
69
|
-
|
|
70
|
-
return await resolveRootPathInternal(params, undefined, undefined, undefined, receipts);
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
throw sanitizeRootPathError(error);
|
|
74
|
-
}
|
|
39
|
+
return resolveRootPathInternal(params, { removalReceipts: receipts });
|
|
75
40
|
}
|
|
76
41
|
export function resolveRootPathSync(params) {
|
|
77
|
-
|
|
78
|
-
return resolveRootPathSyncInternal(params);
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
throw sanitizeRootPathError(error);
|
|
82
|
-
}
|
|
42
|
+
return resolveRootPathInternal(params, { mode: "ordinary" });
|
|
83
43
|
}
|
|
84
44
|
export function resolveRootPathSyncWithCanonicalRootObservation(params, observeRoot) {
|
|
45
|
+
return resolveRootPathInternal(params, { mode: "ordinary", observeRoot });
|
|
46
|
+
}
|
|
47
|
+
function resolveRootPathInternal(params, options = {}) {
|
|
85
48
|
try {
|
|
86
|
-
return
|
|
49
|
+
return traverseRootPath(params, options);
|
|
87
50
|
}
|
|
88
51
|
catch (error) {
|
|
89
52
|
throw sanitizeRootPathError(error);
|
|
90
53
|
}
|
|
91
54
|
}
|
|
92
|
-
function resolveRootPathSyncInternal(params, observeRoot) {
|
|
93
|
-
const input = captureValidRootPathInputs(params);
|
|
94
|
-
const rawAbsolutePath = absolutePathWithRawSegments(input.absolutePath);
|
|
95
|
-
const rootPath = resolvePathPreservingWindowsRoot(input.rootPath);
|
|
96
|
-
const absolutePath = resolvePathPreservingWindowsRoot(rawAbsolutePath);
|
|
97
|
-
const rootCanonicalPath = input.rootCanonicalPath
|
|
98
|
-
? resolvePathPreservingWindowsRoot(input.rootCanonicalPath)
|
|
99
|
-
: resolvePathViaExistingAncestorSync(rootPath);
|
|
100
|
-
assertNoWindowsPathAlias(rootPath);
|
|
101
|
-
assertNoWindowsPathAlias(absolutePath);
|
|
102
|
-
assertNoWindowsPathAlias(rootCanonicalPath);
|
|
103
|
-
observeRoot?.(rootCanonicalPath);
|
|
104
|
-
return resolveRootPathLexicalSync(prepareRootTraversal(input, rootPath, rootCanonicalPath, absolutePath, rawAbsolutePath));
|
|
105
|
-
}
|
|
106
55
|
function prepareRootTraversal(params, rootPath, rootCanonicalPath, absolutePath, rawAbsolutePath) {
|
|
107
56
|
let raw = rawAbsolutePath;
|
|
108
57
|
let trustedAbsolutePath = false;
|
|
@@ -173,27 +122,23 @@ function assertNoEmbeddedDriveRelativeSegment(filePath, label) {
|
|
|
173
122
|
const root = path.parse(filePath).root;
|
|
174
123
|
assertNoDriveRelativePathSegments(filePath.slice(root.length).replaceAll("\\", "/"), label);
|
|
175
124
|
}
|
|
176
|
-
function
|
|
177
|
-
const
|
|
178
|
-
const relative = admitRawPathInsideRoot(params.rootPath, rawAbsolutePath, params.params.rootIdentity)?.relativePath;
|
|
125
|
+
function createLexicalTraversalContext(params) {
|
|
126
|
+
const relative = admitRawPathInsideRoot(params.rootPath, params.rawAbsolutePath, params.params.rootIdentity)?.relativePath;
|
|
179
127
|
if (relative === undefined)
|
|
180
128
|
throw new Error("Path traversal must begin at the root");
|
|
181
129
|
const segments = splitTraversalSegments(relative);
|
|
182
130
|
return {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
function createLexicalTraversalContext(params) {
|
|
195
|
-
return {
|
|
196
|
-
state: createLexicalTraversalState(params),
|
|
131
|
+
state: {
|
|
132
|
+
segments,
|
|
133
|
+
relativePath: relative,
|
|
134
|
+
reuseLexicalCanonical: false,
|
|
135
|
+
finalComponentIndex: segments.findLastIndex((segment) => segment !== "."),
|
|
136
|
+
allowFinalSymlink: params.params.policy?.allowFinalSymlinkForUnlink === true,
|
|
137
|
+
canonicalCursor: params.rootCanonicalPath,
|
|
138
|
+
lexicalCursor: params.rootPath,
|
|
139
|
+
preserveFinalSymlink: false,
|
|
140
|
+
missingDepth: 0,
|
|
141
|
+
},
|
|
197
142
|
resolveParams: params.params,
|
|
198
143
|
rootPath: params.rootPath,
|
|
199
144
|
rootCanonicalPath: params.rootCanonicalPath,
|
|
@@ -263,29 +208,15 @@ function disableLexicalTraversalObservation(context, observation) {
|
|
|
263
208
|
}
|
|
264
209
|
function finalizeLexicalResolution(context, kind) {
|
|
265
210
|
context.state.canonicalCursor = assertLexicalCursorInsideBoundary(context, context.state.canonicalCursor);
|
|
266
|
-
return
|
|
211
|
+
return {
|
|
267
212
|
absolutePath: context.absolutePath,
|
|
268
213
|
canonicalPath: context.state.canonicalCursor,
|
|
269
214
|
rootPath: context.rootPath,
|
|
270
215
|
rootCanonicalPath: context.rootCanonicalPath,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
if (!isNotFoundPathError(error)) {
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
advanceCanonicalCursorForSegment(context, segment);
|
|
279
|
-
context.state.missingDepth = 1;
|
|
280
|
-
return true;
|
|
281
|
-
}
|
|
282
|
-
function lexicalStatDisposition(params) {
|
|
283
|
-
if (!params.isSymbolicLink)
|
|
284
|
-
return "continue";
|
|
285
|
-
if (params.rejectFinalSymlink || (params.rejectSymlinks === true && params.isLast)) {
|
|
286
|
-
throw new FsSafeError("symlink", "symlink path component not allowed");
|
|
287
|
-
}
|
|
288
|
-
return params.allowFinalSymlink && params.isLast ? "break" : "resolve-link";
|
|
216
|
+
relativePath: relativeInsideRoot(context.rootCanonicalPath, context.state.canonicalCursor),
|
|
217
|
+
exists: kind.exists,
|
|
218
|
+
kind: kind.kind,
|
|
219
|
+
};
|
|
289
220
|
}
|
|
290
221
|
function applyResolvedSymlinkHop(context, linkCanonical) {
|
|
291
222
|
let admitted;
|
|
@@ -319,10 +250,23 @@ function assertResolvedLinkDirectory(pathname, isLast) {
|
|
|
319
250
|
const stat = fs.statSync(pathForWindowsFilesystem(pathname));
|
|
320
251
|
assertDirectoryBeforeMoreSegments(stat, pathname, isLast);
|
|
321
252
|
}
|
|
322
|
-
|
|
323
|
-
|
|
253
|
+
// Both public APIs use synchronous metadata; only canonicalization and ancestor
|
|
254
|
+
// existence differ. Promise wrappers preserve the asynchronous rejection API.
|
|
255
|
+
function traverseRootPath(params, { mode = "native", observation: observationOutput, observeRoot, removalReceipts }) {
|
|
256
|
+
const input = captureValidRootPathInputs(params);
|
|
257
|
+
const rawAbsolutePath = absolutePathWithRawSegments(input.absolutePath);
|
|
258
|
+
const rootPath = resolvePathPreservingWindowsRoot(input.rootPath);
|
|
259
|
+
const absolutePath = resolvePathPreservingWindowsRoot(rawAbsolutePath);
|
|
260
|
+
const rootCanonicalPath = input.rootCanonicalPath
|
|
261
|
+
? resolvePathPreservingWindowsRoot(input.rootCanonicalPath)
|
|
262
|
+
: resolveExistingAncestor(rootPath, mode);
|
|
263
|
+
assertNoWindowsPathAlias(rootPath);
|
|
264
|
+
assertNoWindowsPathAlias(absolutePath);
|
|
265
|
+
assertNoWindowsPathAlias(rootCanonicalPath);
|
|
266
|
+
observeRoot?.(rootCanonicalPath);
|
|
267
|
+
const context = createLexicalTraversalContext(prepareRootTraversal(input, rootPath, rootCanonicalPath, absolutePath, rawAbsolutePath));
|
|
324
268
|
const { state } = context;
|
|
325
|
-
const observation = createLexicalTraversalObservation(context,
|
|
269
|
+
const observation = createLexicalTraversalObservation(context, observationOutput?.request);
|
|
326
270
|
for (let idx = 0; idx < state.segments.length; idx += 1) {
|
|
327
271
|
const segment = state.segments[idx] ?? "";
|
|
328
272
|
const isLast = idx === state.segments.length - 1;
|
|
@@ -374,9 +318,11 @@ async function resolveRootPathLexicalAsync(params, observationRequest, observati
|
|
|
374
318
|
// Preserve observation-only versus ordinary traversal error precedence.
|
|
375
319
|
throw new RootPathObservationError(error instanceof RootPathObservationError ? error.error : sanitizeRootPathError(error), parentReceipt, !(error instanceof RootPathObservationError));
|
|
376
320
|
}
|
|
377
|
-
if (
|
|
378
|
-
|
|
379
|
-
|
|
321
|
+
if (!isNotFoundPathError(error))
|
|
322
|
+
throw error;
|
|
323
|
+
advanceCanonicalCursorForSegment(context, segment);
|
|
324
|
+
state.missingDepth = 1;
|
|
325
|
+
continue;
|
|
380
326
|
}
|
|
381
327
|
if (isNativeDirectoryObservationGuard(observed)) {
|
|
382
328
|
advanceCanonicalCursorForSegment(context, segment);
|
|
@@ -392,15 +338,13 @@ async function resolveRootPathLexicalAsync(params, observationRequest, observati
|
|
|
392
338
|
const isSymbolicLink = stat.isSymbolicLink();
|
|
393
339
|
if (!isSymbolicLink)
|
|
394
340
|
assertDirectoryBeforeMoreSegments(stat, state.lexicalCursor, isLast);
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
if (disposition !== "resolve-link") {
|
|
403
|
-
state.preserveFinalSymlink = disposition === "break";
|
|
341
|
+
if (isSymbolicLink && ((context.resolveParams.rejectFinalSymlink === true && idx === state.finalComponentIndex) ||
|
|
342
|
+
(context.resolveParams.rejectSymlinks === true && isLast))) {
|
|
343
|
+
throw new FsSafeError("symlink", "symlink path component not allowed");
|
|
344
|
+
}
|
|
345
|
+
const preserveFinalSymlink = isSymbolicLink && state.allowFinalSymlink && isLast;
|
|
346
|
+
if (!isSymbolicLink || preserveFinalSymlink) {
|
|
347
|
+
state.preserveFinalSymlink = preserveFinalSymlink;
|
|
404
348
|
advanceCanonicalCursorForSegment(context, segment);
|
|
405
349
|
if (observation?.enabled && isSymbolicLink) {
|
|
406
350
|
disableLexicalTraversalObservation(context, observation);
|
|
@@ -420,9 +364,7 @@ async function resolveRootPathLexicalAsync(params, observationRequest, observati
|
|
|
420
364
|
}
|
|
421
365
|
if (observation?.enabled)
|
|
422
366
|
disableLexicalTraversalObservation(context, observation);
|
|
423
|
-
const linkCanonical =
|
|
424
|
-
rejectUnresolved: context.resolveParams.rejectUnresolvedSymlinks,
|
|
425
|
-
});
|
|
367
|
+
const linkCanonical = resolveSymlinkHopPath(state.lexicalCursor, mode, context.resolveParams.rejectUnresolvedSymlinks);
|
|
426
368
|
applyResolvedSymlinkHop(context, linkCanonical);
|
|
427
369
|
if (context.resolveParams.rejectSymlinks === true) {
|
|
428
370
|
throw new FsSafeError("symlink", "symlink path component not allowed");
|
|
@@ -438,7 +380,7 @@ async function resolveRootPathLexicalAsync(params, observationRequest, observati
|
|
|
438
380
|
? "directory"
|
|
439
381
|
: toResolvedKind(observation.target.stat),
|
|
440
382
|
}
|
|
441
|
-
:
|
|
383
|
+
: getPathKindSync(state.canonicalCursor, state.preserveFinalSymlink);
|
|
442
384
|
if (completeObservation && observationOutput) {
|
|
443
385
|
observationOutput.receipt = {
|
|
444
386
|
kind: observation.request.kind,
|
|
@@ -451,76 +393,6 @@ async function resolveRootPathLexicalAsync(params, observationRequest, observati
|
|
|
451
393
|
}
|
|
452
394
|
return finalizeLexicalResolution(context, kind);
|
|
453
395
|
}
|
|
454
|
-
function resolveRootPathLexicalSync(params) {
|
|
455
|
-
const context = createLexicalTraversalContext(params);
|
|
456
|
-
const { state } = context;
|
|
457
|
-
for (let idx = 0; idx < state.segments.length; idx += 1) {
|
|
458
|
-
const segment = state.segments[idx] ?? "";
|
|
459
|
-
const isLast = idx === state.segments.length - 1;
|
|
460
|
-
if (segment === ".")
|
|
461
|
-
continue;
|
|
462
|
-
if (segment === "..") {
|
|
463
|
-
applyParentTraversalStep(context);
|
|
464
|
-
continue;
|
|
465
|
-
}
|
|
466
|
-
state.lexicalCursor = path.join(state.lexicalCursor, segment);
|
|
467
|
-
if (state.missingDepth > 0) {
|
|
468
|
-
advanceCanonicalCursorForSegment(context, segment);
|
|
469
|
-
state.missingDepth += 1;
|
|
470
|
-
continue;
|
|
471
|
-
}
|
|
472
|
-
let stat;
|
|
473
|
-
try {
|
|
474
|
-
stat = fs.lstatSync(state.lexicalCursor);
|
|
475
|
-
}
|
|
476
|
-
catch (error) {
|
|
477
|
-
if (handleLexicalLstatFailure(context, error, segment))
|
|
478
|
-
continue;
|
|
479
|
-
throw error;
|
|
480
|
-
}
|
|
481
|
-
const isSymbolicLink = stat.isSymbolicLink();
|
|
482
|
-
if (!isSymbolicLink)
|
|
483
|
-
assertDirectoryBeforeMoreSegments(stat, state.lexicalCursor, isLast);
|
|
484
|
-
const disposition = lexicalStatDisposition({
|
|
485
|
-
isSymbolicLink,
|
|
486
|
-
isLast,
|
|
487
|
-
rejectSymlinks: isSymbolicLink ? context.resolveParams.rejectSymlinks : undefined,
|
|
488
|
-
rejectFinalSymlink: context.resolveParams.rejectFinalSymlink === true && idx === state.finalComponentIndex,
|
|
489
|
-
allowFinalSymlink: state.allowFinalSymlink,
|
|
490
|
-
});
|
|
491
|
-
if (disposition !== "resolve-link") {
|
|
492
|
-
state.preserveFinalSymlink = disposition === "break";
|
|
493
|
-
advanceCanonicalCursorForSegment(context, segment);
|
|
494
|
-
if (state.preserveFinalSymlink)
|
|
495
|
-
break;
|
|
496
|
-
continue;
|
|
497
|
-
}
|
|
498
|
-
const linkCanonical = resolveSymlinkHopPathSync(state.lexicalCursor, {
|
|
499
|
-
rejectUnresolved: context.resolveParams.rejectUnresolvedSymlinks,
|
|
500
|
-
});
|
|
501
|
-
applyResolvedSymlinkHop(context, linkCanonical);
|
|
502
|
-
if (context.resolveParams.rejectSymlinks === true) {
|
|
503
|
-
throw new FsSafeError("symlink", "symlink path component not allowed");
|
|
504
|
-
}
|
|
505
|
-
assertResolvedLinkDirectory(linkCanonical, isLast);
|
|
506
|
-
}
|
|
507
|
-
const kind = getPathKindSync(state.canonicalCursor, state.preserveFinalSymlink);
|
|
508
|
-
return finalizeLexicalResolution(context, kind);
|
|
509
|
-
}
|
|
510
|
-
function buildResolvedRootPath(params) {
|
|
511
|
-
return {
|
|
512
|
-
absolutePath: params.absolutePath,
|
|
513
|
-
canonicalPath: params.canonicalPath,
|
|
514
|
-
rootPath: params.rootPath,
|
|
515
|
-
rootCanonicalPath: params.rootCanonicalPath,
|
|
516
|
-
relativePath: relativeInsideRoot(params.rootCanonicalPath, params.canonicalPath),
|
|
517
|
-
exists: params.kind.exists,
|
|
518
|
-
kind: params.kind.kind,
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
async function getPathKind(absolutePath, preserveFinalSymlink) {
|
|
522
|
-
return getPathKindSync(absolutePath, preserveFinalSymlink);
|
|
523
|
-
}
|
|
524
396
|
function getPathKindSync(absolutePath, preserveFinalSymlink) {
|
|
525
397
|
try {
|
|
526
398
|
const operationPath = pathForWindowsFilesystem(absolutePath);
|
package/dist/root-paths.d.ts
CHANGED
|
@@ -60,4 +60,3 @@ export declare function resolvePathsWithinRoot(params: ResolvePathsWithinRootPar
|
|
|
60
60
|
export declare function resolveExistingPathsWithinRoot(params: ResolvePathsWithinRootParams): Promise<ResolvePathsWithinRootResult>;
|
|
61
61
|
export declare function resolveStrictExistingPathsWithinRoot(params: ResolvePathsWithinRootParams): Promise<ResolvePathsWithinRootResult>;
|
|
62
62
|
export declare function pathScope(rootDir: string, options: PathScopeOptions): PathScope;
|
|
63
|
-
//# sourceMappingURL=root-paths.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { OpenResult, WritableOpenResult, } from "./root-impl.js";
|
|
2
|
+
export type { HardlinkPolicy, RootAppendOptions, RootCopyOptions, RootCopySource, RootCreateJsonOptions, RootCreateOptions, RootCreateStreamOptions, RootDefaults, RootMkdirOptions, RootMoveOptions, RootOpenOptions, RootOpenWritableOptions, RootOptions, RootReadOptions, RootRemoveOptions, RootWriteJsonOptions, RootWriteOptions, WritableOpenMode, } from "./root-options.js";
|
|
3
|
+
export type { DenyMutationPolicy } from "./deny-mutations.js";
|
|
4
|
+
export type { RenameIdentityPolicy } from "./pinned-write-types.js";
|
|
5
|
+
export type { MutationSymlinkPolicy, SymlinkPolicy, } from "./root-symlink-policy.js";
|
|
6
|
+
export type { ReadResult } from "./read-opened-file.js";
|
|
7
|
+
export type { RootCopyPublicationReceipt } from "./copy-publication.js";
|
|
8
|
+
export type { CopyCloneMode } from "./copy-policy.js";
|
|
9
|
+
export type { RootEntriesOptions } from "./root-entries.js";
|
|
10
|
+
export type { ContainmentGuarantee } from "./containment.js";
|
|
11
|
+
export type { RootWalkDataEntry, RootWalkDataEntryKind, RootWalkDirectoryErrorBehavior, RootWalkEntry, RootWalkEntryFilter, RootWalkEntryFilterResult, RootWalkEntryKind, RootWalkLimitBehavior, RootWalkOptions, RootWalkSymlinkPolicy, } from "./root-walk.js";
|
|
@@ -31,40 +31,6 @@ export function inspectOpenedPathIdentitySync(filePath, symlinks) {
|
|
|
31
31
|
}
|
|
32
32
|
return stat;
|
|
33
33
|
}
|
|
34
|
-
function assertRootReadAdmissionCurrent(params) {
|
|
35
|
-
assertRootIdentityCurrentSync(params.root);
|
|
36
|
-
const admittedPath = (() => {
|
|
37
|
-
try {
|
|
38
|
-
const current = inspectFileIdentitySync(() => inspectOpenedPathIdentitySync(params.filePath, params.symlinks), params.identity);
|
|
39
|
-
if (params.hardlinks !== "allow" && current.nlink > 1n)
|
|
40
|
-
throw hardlinkedPathNotAllowedError();
|
|
41
|
-
const canonicalPath = resolveFinalOpenedRealPath(params.filePath);
|
|
42
|
-
assertNoWindowsPathAlias(canonicalPath, "filesystem", "resolved file path uses a Windows filesystem namespace alias");
|
|
43
|
-
const admittedRealPath = admitPathInsideRoot({
|
|
44
|
-
rootPath: params.root.rootReal,
|
|
45
|
-
candidatePath: canonicalPath,
|
|
46
|
-
rootIdentity: params.root.rootIdentity,
|
|
47
|
-
});
|
|
48
|
-
if (!admittedRealPath) {
|
|
49
|
-
throw openedPathResolutionError(outsideWorkspaceError());
|
|
50
|
-
}
|
|
51
|
-
// This is a fresh no-follow observation even when canonicalPath and
|
|
52
|
-
// filePath have the same spelling; realpath may have raced a replacement.
|
|
53
|
-
const canonical = inspectFileIdentitySync(() => inspectOpenedPathIdentitySync(canonicalPath, undefined), params.identity);
|
|
54
|
-
if (params.hardlinks !== "allow" && canonical.nlink > 1n)
|
|
55
|
-
throw hardlinkedPathNotAllowedError();
|
|
56
|
-
return admittedRealPath.path;
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
throw isNotFoundPathError(error)
|
|
60
|
-
? openedPathResolutionError(fileNotFoundError())
|
|
61
|
-
: error;
|
|
62
|
-
}
|
|
63
|
-
})();
|
|
64
|
-
params.afterPathIdentityCheck?.(params.filePath, params.handle);
|
|
65
|
-
assertRootIdentityCurrentSync(params.root);
|
|
66
|
-
return admittedPath;
|
|
67
|
-
}
|
|
68
34
|
export async function admitRootReadHandle(params) {
|
|
69
35
|
try {
|
|
70
36
|
if (params.hardlinks !== "allow" && params.opened.stat.nlink > 1) {
|
|
@@ -74,16 +40,37 @@ export async function admitRootReadHandle(params) {
|
|
|
74
40
|
await params.beforeFinalFence(params.filePath, params.opened.handle);
|
|
75
41
|
}
|
|
76
42
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
43
|
+
assertRootIdentityCurrentSync(params.root);
|
|
44
|
+
let realPath;
|
|
45
|
+
try {
|
|
46
|
+
const current = inspectFileIdentitySync(() => inspectOpenedPathIdentitySync(params.filePath, params.symlinks), params.identity);
|
|
47
|
+
if (params.hardlinks !== "allow" && current.nlink > 1n)
|
|
48
|
+
throw hardlinkedPathNotAllowedError();
|
|
49
|
+
const canonicalPath = resolveFinalOpenedRealPath(params.filePath);
|
|
50
|
+
assertNoWindowsPathAlias(canonicalPath, "filesystem", "resolved file path uses a Windows filesystem namespace alias");
|
|
51
|
+
const admittedRealPath = admitPathInsideRoot({
|
|
52
|
+
rootPath: params.root.rootReal,
|
|
53
|
+
candidatePath: canonicalPath,
|
|
54
|
+
rootIdentity: params.root.rootIdentity,
|
|
55
|
+
});
|
|
56
|
+
if (!admittedRealPath) {
|
|
57
|
+
throw openedPathResolutionError(outsideWorkspaceError());
|
|
58
|
+
}
|
|
59
|
+
// This is a fresh no-follow observation even when canonicalPath and
|
|
60
|
+
// filePath have the same spelling; realpath may have raced a replacement.
|
|
61
|
+
const canonical = inspectFileIdentitySync(() => inspectOpenedPathIdentitySync(canonicalPath, undefined), params.identity);
|
|
62
|
+
if (params.hardlinks !== "allow" && canonical.nlink > 1n)
|
|
63
|
+
throw hardlinkedPathNotAllowedError();
|
|
64
|
+
realPath = admittedRealPath.path;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw isNotFoundPathError(error)
|
|
68
|
+
? openedPathResolutionError(fileNotFoundError())
|
|
69
|
+
: error;
|
|
70
|
+
}
|
|
71
|
+
params.afterPathIdentityCheck?.(params.filePath, params.opened.handle);
|
|
72
|
+
assertRootIdentityCurrentSync(params.root);
|
|
73
|
+
return { ...params.opened, realPath };
|
|
87
74
|
}
|
|
88
75
|
catch (error) {
|
|
89
76
|
if (params.identity.nlink <= 1n) {
|
|
@@ -12,4 +12,3 @@ export type RemovalDirectoryAssertion = Readonly<{
|
|
|
12
12
|
export declare function createRemovalDirectoryAssertion(path: string, identity: ExactDirectoryIdentity, realPath?: string, platform?: NodeJS.Platform): RemovalDirectoryAssertion;
|
|
13
13
|
export declare function assertRemovalDirectoryCurrent(assertion: RemovalDirectoryAssertion): void;
|
|
14
14
|
export {};
|
|
15
|
-
//# sourceMappingURL=root-remove-identity.d.ts.map
|
|
@@ -2,12 +2,10 @@ import fsSync from "node:fs";
|
|
|
2
2
|
import { inspectDirectoryIdentitySync } from "./directory-guard.js";
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { realpathSync } from "./realpath.js";
|
|
5
|
-
import { directoryComponentNotDirectoryError } from "./root-errors.js";
|
|
5
|
+
import { directoryComponentNotDirectoryError, errorCauseOptions } from "./root-errors.js";
|
|
6
6
|
const MAX_SAFE_DIRECTORY_IDENTITY = BigInt(Number.MAX_SAFE_INTEGER);
|
|
7
7
|
function identityMismatch(cause) {
|
|
8
|
-
return new FsSafeError("path-mismatch", "removal ancestor identity changed or could not be verified",
|
|
9
|
-
cause: cause instanceof Error ? cause : undefined,
|
|
10
|
-
});
|
|
8
|
+
return new FsSafeError("path-mismatch", "removal ancestor identity changed or could not be verified", errorCauseOptions(cause));
|
|
11
9
|
}
|
|
12
10
|
function safeIdentityNumber(value) {
|
|
13
11
|
if (value < 0n || value > MAX_SAFE_DIRECTORY_IDENTITY)
|
package/dist/root-remove.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ import type { RemovalPathReceipts } from "./root-remove-receipt.js";
|
|
|
4
4
|
export declare const nonrecursiveRemovalKind: unique symbol;
|
|
5
5
|
export declare function validateRemoveOptions(options: RootRemoveOptions): void;
|
|
6
6
|
export declare function removePathInRootFallback(root: RootContext, targetPath: string, options: RootRemoveOptions, receipts?: RemovalPathReceipts): Promise<void>;
|
|
7
|
-
//# sourceMappingURL=root-remove.d.ts.map
|