@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.
Files changed (690) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/absolute-path.d.ts +0 -1
  3. package/dist/advanced.d.ts +2 -2
  4. package/dist/archive-crc32.d.ts +0 -1
  5. package/dist/archive-deadline.d.ts +0 -1
  6. package/dist/archive-durability.d.ts +1 -2
  7. package/dist/archive-entry.d.ts +0 -1
  8. package/dist/archive-errors.d.ts +0 -1
  9. package/dist/archive-gzip-tail.d.ts +0 -1
  10. package/dist/archive-input.d.ts +0 -1
  11. package/dist/archive-kind.d.ts +0 -1
  12. package/dist/archive-limits.d.ts +0 -1
  13. package/dist/archive-merge.d.ts +2 -4
  14. package/dist/archive-merge.js +14 -4
  15. package/dist/archive-parser-errors.d.ts +0 -1
  16. package/dist/archive-parser.wasm +0 -0
  17. package/dist/archive-plan.d.ts +72 -2
  18. package/dist/archive-plan.js +86 -22
  19. package/dist/archive-read.d.ts +0 -1
  20. package/dist/archive-staging.d.ts +0 -1
  21. package/dist/archive-tar-stream.d.ts +0 -1
  22. package/dist/archive-tar-wasm.d.ts +1 -2
  23. package/dist/archive-zip-admission.d.ts +0 -1
  24. package/dist/archive-zip-count.d.ts +0 -1
  25. package/dist/archive-zip-directory.d.ts +1 -2
  26. package/dist/archive-zip-entry.d.ts +1 -2
  27. package/dist/archive-zip-entry.js +1 -1
  28. package/dist/archive-zip-integrity.d.ts +0 -1
  29. package/dist/archive-zip-loader.d.ts +0 -1
  30. package/dist/archive-zip-manifest.d.ts +0 -1
  31. package/dist/archive-zip-names.d.ts +0 -1
  32. package/dist/archive-zip-preflight.d.ts +0 -1
  33. package/dist/archive.d.ts +8 -6
  34. package/dist/archive.js +204 -168
  35. package/dist/async-lock.d.ts +0 -1
  36. package/dist/atomic.d.ts +3 -2
  37. package/dist/bounded-read-stream.d.ts +0 -1
  38. package/dist/bounded-read.d.ts +0 -1
  39. package/dist/byte-budget.d.ts +0 -1
  40. package/dist/byte-view.d.ts +0 -1
  41. package/dist/clone-metadata.d.ts +0 -1
  42. package/dist/config.d.ts +0 -1
  43. package/dist/containment.d.ts +0 -1
  44. package/dist/copy-file-input.d.ts +0 -1
  45. package/dist/copy-policy.d.ts +0 -1
  46. package/dist/copy-publication.d.ts +1 -2
  47. package/dist/copy-tree-portable.d.ts +0 -1
  48. package/dist/copy-tree-portable.js +9 -6
  49. package/dist/copy.d.ts +0 -1
  50. package/dist/copy.js +5 -5
  51. package/dist/create-owned-file.d.ts +0 -1
  52. package/dist/create.d.ts +16 -3
  53. package/dist/create.js +388 -2
  54. package/dist/creation-boundary.d.ts +60 -0
  55. package/dist/creation-boundary.js +371 -0
  56. package/dist/deny-mutations.d.ts +2 -3
  57. package/dist/deny-mutations.js +55 -35
  58. package/dist/device-path.d.ts +0 -1
  59. package/dist/directory-durability.d.ts +0 -1
  60. package/dist/directory-entry-path.d.ts +0 -1
  61. package/dist/directory-guard.d.ts +2 -7
  62. package/dist/directory-guard.js +25 -56
  63. package/dist/directory-mode-node.d.ts +0 -1
  64. package/dist/directory-mode-node.js +12 -2
  65. package/dist/directory-mode-owner.d.ts +0 -1
  66. package/dist/directory-receipt.d.ts +0 -1
  67. package/dist/durability.d.ts +2 -2
  68. package/dist/effective-uid.d.ts +0 -1
  69. package/dist/error-detail.d.ts +0 -1
  70. package/dist/errors.d.ts +0 -1
  71. package/dist/file-cleanup.d.ts +0 -1
  72. package/dist/file-contents.d.ts +0 -1
  73. package/dist/file-handle-transfer.d.ts +0 -1
  74. package/dist/file-hash.d.ts +0 -1
  75. package/dist/file-hash.js +170 -66
  76. package/dist/file-identity.d.ts +0 -1
  77. package/dist/file-lock-sync-acquisition.d.ts +22 -0
  78. package/dist/file-lock-sync-acquisition.js +98 -0
  79. package/dist/file-lock-sync-admission.d.ts +0 -2
  80. package/dist/file-lock-sync-admission.js +9 -48
  81. package/dist/file-lock-sync-root-acquire.d.ts +0 -1
  82. package/dist/file-lock-sync-root-acquire.js +33 -103
  83. package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
  84. package/dist/file-lock-sync-root-held.d.ts +0 -1
  85. package/dist/file-lock-sync-root-io.d.ts +0 -1
  86. package/dist/file-lock-sync-root-mutation.d.ts +4 -5
  87. package/dist/file-lock-sync-root-mutation.js +7 -9
  88. package/dist/file-lock-sync-root-options.d.ts +0 -1
  89. package/dist/file-lock-sync-root-registration.d.ts +0 -1
  90. package/dist/file-lock-sync-root.d.ts +3 -3
  91. package/dist/file-lock-sync-root.js +14 -87
  92. package/dist/file-lock-sync-stale-admission.d.ts +2 -7
  93. package/dist/file-lock-sync-stale-admission.js +18 -27
  94. package/dist/file-lock-sync.d.ts +4 -22
  95. package/dist/file-lock-sync.js +38 -117
  96. package/dist/file-lock.d.ts +0 -1
  97. package/dist/file-observation.d.ts +0 -1
  98. package/dist/file-store-boundary.d.ts +7 -2
  99. package/dist/file-store-boundary.js +64 -27
  100. package/dist/file-store-prune.d.ts +0 -1
  101. package/dist/file-store-sync-directory.d.ts +0 -1
  102. package/dist/file-store-sync-directory.js +194 -231
  103. package/dist/file-store-sync-write.d.ts +0 -1
  104. package/dist/file-store-sync-write.js +18 -29
  105. package/dist/file-store.d.ts +0 -1
  106. package/dist/file-store.js +4 -10
  107. package/dist/file-sync.d.ts +0 -1
  108. package/dist/filename.d.ts +0 -1
  109. package/dist/filename.js +1 -7
  110. package/dist/fs.d.ts +0 -1
  111. package/dist/guarded-mkdir.d.ts +1 -2
  112. package/dist/guarded-mutation.d.ts +0 -7
  113. package/dist/guarded-mutation.js +6 -11
  114. package/dist/guest-dispatch-python.d.ts +0 -1
  115. package/dist/guest-dispatch-python.js +41 -90
  116. package/dist/guest-native-python.d.ts +0 -1
  117. package/dist/guest.d.ts +0 -1
  118. package/dist/home-dir.d.ts +0 -1
  119. package/dist/index.d.ts +9 -7
  120. package/dist/install-path.d.ts +0 -1
  121. package/dist/json-document-store.d.ts +0 -1
  122. package/dist/json-durable-queue-directory.d.ts +13 -1
  123. package/dist/json-durable-queue-directory.js +134 -0
  124. package/dist/json-durable-queue-ownership.d.ts +0 -1
  125. package/dist/json-durable-queue-ownership.js +42 -61
  126. package/dist/json-durable-queue-read.d.ts +0 -1
  127. package/dist/json-durable-queue-read.js +13 -9
  128. package/dist/json-durable-queue.d.ts +0 -1
  129. package/dist/json-durable-queue.js +8 -132
  130. package/dist/json-store.d.ts +0 -1
  131. package/dist/json-store.js +1 -2
  132. package/dist/json-stringify.d.ts +0 -1
  133. package/dist/json.d.ts +0 -1
  134. package/dist/json.js +7 -17
  135. package/dist/local-file-access.d.ts +0 -1
  136. package/dist/local-file-access.js +3 -10
  137. package/dist/local-file-descriptor.d.ts +0 -1
  138. package/dist/local-roots.d.ts +0 -1
  139. package/dist/lock-config.d.ts +0 -1
  140. package/dist/move-path-cleanup.d.ts +0 -1
  141. package/dist/move-path-stage.d.ts +0 -1
  142. package/dist/move-path.d.ts +0 -1
  143. package/dist/move-path.js +1 -2
  144. package/dist/mutation-authority.d.ts +0 -1
  145. package/dist/native-binding.d.ts +0 -1
  146. package/dist/native-config.d.ts +0 -1
  147. package/dist/native-directory-observation.d.ts +0 -1
  148. package/dist/native-fallback-warning.d.ts +0 -1
  149. package/dist/native-operations.d.ts +1 -5
  150. package/dist/native-operations.js +2 -7
  151. package/dist/native-parent-admission.d.ts +0 -1
  152. package/dist/native-pinned-write-windows.d.ts +1 -2
  153. package/dist/native-pinned-write-windows.js +1 -1
  154. package/dist/native-pinned-write.d.ts +1 -2
  155. package/dist/native-pinned-write.js +7 -16
  156. package/dist/native-policy-directory-observation.d.ts +0 -1
  157. package/dist/native-policy-parent-windows.d.ts +1 -2
  158. package/dist/native-rename-outcome.d.ts +0 -1
  159. package/dist/native-staged-file.d.ts +17 -5
  160. package/dist/native-staged-file.js +56 -65
  161. package/dist/native.d.ts +0 -1
  162. package/dist/opened-file-failure.d.ts +0 -1
  163. package/dist/opened-realpath.d.ts +0 -1
  164. package/dist/output.d.ts +0 -1
  165. package/dist/overwrite-file-handle.d.ts +0 -1
  166. package/dist/owner-dacl.d.ts +0 -1
  167. package/dist/path-case.d.ts +0 -1
  168. package/dist/path-policy.d.ts +0 -1
  169. package/dist/path-prefix.d.ts +0 -1
  170. package/dist/path-scope-lexical.d.ts +0 -1
  171. package/dist/path-segment-route.d.ts +0 -1
  172. package/dist/path-suffix-aliases.d.ts +0 -1
  173. package/dist/path.d.ts +0 -1
  174. package/dist/permission-exec.d.ts +0 -1
  175. package/dist/permission-exec.js +19 -25
  176. package/dist/permissions-public.d.ts +0 -1
  177. package/dist/permissions-windows.d.ts +2 -10
  178. package/dist/permissions-windows.js +10 -30
  179. package/dist/permissions.d.ts +0 -1
  180. package/dist/permissions.js +8 -16
  181. package/dist/pinned-mutation-admission.d.ts +1 -2
  182. package/dist/pinned-mutation-observation.d.ts +0 -1
  183. package/dist/pinned-mutation-shared-route.d.ts +0 -1
  184. package/dist/pinned-open.d.ts +1 -1
  185. package/dist/pinned-open.js +7 -2
  186. package/dist/pinned-operation.d.ts +1 -2
  187. package/dist/pinned-operation.js +3 -16
  188. package/dist/pinned-write-input.d.ts +0 -1
  189. package/dist/pinned-write-mode.d.ts +0 -1
  190. package/dist/pinned-write-mode.js +1 -1
  191. package/dist/pinned-write-staged.d.ts +0 -1
  192. package/dist/pinned-write-staged.js +1 -2
  193. package/dist/pinned-write-types.d.ts +9 -21
  194. package/dist/pinned-write.d.ts +0 -2
  195. package/dist/pinned-write.js +3 -5
  196. package/dist/positional-read.d.ts +0 -1
  197. package/dist/private-directory.d.ts +0 -1
  198. package/dist/private-producer-handoff-sync.d.ts +2 -13
  199. package/dist/private-producer-handoff-sync.js +10 -52
  200. package/dist/private-producer-handoff.d.ts +23 -4
  201. package/dist/private-producer-handoff.js +69 -46
  202. package/dist/private-temp-workspace.d.ts +0 -1
  203. package/dist/private-temp-workspace.js +11 -37
  204. package/dist/publish-copy-stage.d.ts +1 -2
  205. package/dist/publish-file-failure.d.ts +0 -1
  206. package/dist/publish-file.d.ts +0 -2
  207. package/dist/publish-file.js +1 -2
  208. package/dist/read-open-flags.d.ts +0 -1
  209. package/dist/read-opened-file.d.ts +0 -1
  210. package/dist/realpath.d.ts +0 -1
  211. package/dist/recursive-mkdir-path.d.ts +0 -1
  212. package/dist/regular-file.d.ts +0 -1
  213. package/dist/regular-file.js +77 -139
  214. package/dist/replace-directory.d.ts +0 -1
  215. package/dist/replace-directory.js +1 -2
  216. package/dist/replace-file-copy-fallback.d.ts +0 -1
  217. package/dist/replace-file-copy-fallback.js +14 -3
  218. package/dist/replace-file-copy-source.d.ts +0 -1
  219. package/dist/replace-file-copy-source.js +6 -1
  220. package/dist/replace-file-descriptor.d.ts +0 -1
  221. package/dist/replace-file-descriptor.js +6 -1
  222. package/dist/replace-file-mode.d.ts +0 -1
  223. package/dist/replace-file-rename-policy.d.ts +1 -3
  224. package/dist/replace-file-temp-owner.d.ts +12 -13
  225. package/dist/replace-file-temp-owner.js +66 -85
  226. package/dist/replace-file.d.ts +3 -4
  227. package/dist/replace-file.js +1 -1
  228. package/dist/retained-directory-replacement.d.ts +0 -1
  229. package/dist/root-boundary.d.ts +0 -1
  230. package/dist/root-context.d.ts +0 -1
  231. package/dist/root-context.js +3 -7
  232. package/dist/root-create-input.d.ts +1 -2
  233. package/dist/root-directory-creation.d.ts +1 -2
  234. package/dist/root-directory-creation.js +1 -1
  235. package/dist/root-directory-list.d.ts +0 -1
  236. package/dist/root-directory-list.js +3 -7
  237. package/dist/root-directory.d.ts +0 -1
  238. package/dist/root-entries.d.ts +0 -1
  239. package/dist/root-entries.js +2 -2
  240. package/dist/root-errors.d.ts +4 -1
  241. package/dist/root-errors.js +5 -3
  242. package/dist/root-file-final-admission.d.ts +0 -1
  243. package/dist/root-file.d.ts +0 -1
  244. package/dist/root-impl.d.ts +2 -15
  245. package/dist/root-impl.js +136 -112
  246. package/dist/root-move-noreplace.d.ts +0 -1
  247. package/dist/root-move-noreplace.js +4 -10
  248. package/dist/root-move-preflight.d.ts +0 -1
  249. package/dist/root-observed-path.d.ts +0 -1
  250. package/dist/root-observed-path.js +2 -4
  251. package/dist/root-options.d.ts +1 -2
  252. package/dist/root-path-errors.d.ts +0 -1
  253. package/dist/root-path-existing.d.ts +3 -1
  254. package/dist/root-path-existing.js +38 -18
  255. package/dist/root-path-observation.d.ts +0 -1
  256. package/dist/root-path-stat.d.ts +0 -1
  257. package/dist/root-path-stat.js +2 -4
  258. package/dist/root-path.d.ts +0 -1
  259. package/dist/root-path.js +60 -188
  260. package/dist/root-paths-lexical.d.ts +0 -1
  261. package/dist/root-paths.d.ts +0 -1
  262. package/dist/root-public-types.d.ts +11 -0
  263. package/dist/root-read-admission.d.ts +0 -1
  264. package/dist/root-read-admission.js +31 -44
  265. package/dist/root-remove-identity.d.ts +0 -1
  266. package/dist/root-remove-identity.js +2 -4
  267. package/dist/root-remove-receipt.d.ts +0 -1
  268. package/dist/root-remove.d.ts +0 -1
  269. package/dist/root-remove.js +2 -4
  270. package/dist/root-symlink-policy.d.ts +0 -1
  271. package/dist/root-walk.d.ts +0 -1
  272. package/dist/root-write-admission.d.ts +1 -2
  273. package/dist/root-write-admission.js +3 -7
  274. package/dist/root-write-compatibility.d.ts +0 -1
  275. package/dist/root-write-complete-parent.d.ts +0 -1
  276. package/dist/root-write-complete-parent.js +2 -3
  277. package/dist/root-write-lock-binding.d.ts +0 -1
  278. package/dist/root-write-mode.d.ts +0 -1
  279. package/dist/root-write-publication.d.ts +0 -1
  280. package/dist/root-write-verification.d.ts +1 -2
  281. package/dist/root.d.ts +2 -7
  282. package/dist/safe-path-segment.d.ts +1 -2
  283. package/dist/safe-path-segment.js +2 -5
  284. package/dist/secret-file.d.ts +0 -1
  285. package/dist/secret-file.js +7 -18
  286. package/dist/secret-read-async.d.ts +0 -1
  287. package/dist/secret-read-async.js +5 -5
  288. package/dist/secret-read-policy.d.ts +0 -1
  289. package/dist/secret.d.ts +0 -1
  290. package/dist/secure-file-windows.d.ts +0 -6
  291. package/dist/secure-file-windows.js +13 -28
  292. package/dist/secure-file.d.ts +0 -1
  293. package/dist/secure-file.js +9 -9
  294. package/dist/secure-temp-dir.d.ts +0 -1
  295. package/dist/secure-temp-repair.d.ts +0 -1
  296. package/dist/secure-temp-repair.js +5 -1
  297. package/dist/sibling-staged-file.d.ts +0 -1
  298. package/dist/sibling-staged-file.js +32 -39
  299. package/dist/sibling-temp.d.ts +0 -1
  300. package/dist/sidecar-lock-acquire.d.ts +1 -2
  301. package/dist/sidecar-lock-acquire.js +37 -61
  302. package/dist/sidecar-lock-admission-context.d.ts +0 -1
  303. package/dist/sidecar-lock-admission-parser.d.ts +0 -1
  304. package/dist/sidecar-lock-admission.d.ts +1 -5
  305. package/dist/sidecar-lock-admission.js +1 -7
  306. package/dist/sidecar-lock-handle.d.ts +0 -1
  307. package/dist/sidecar-lock-policy.d.ts +4 -1
  308. package/dist/sidecar-lock-policy.js +23 -0
  309. package/dist/sidecar-lock-reclaim.d.ts +0 -1
  310. package/dist/sidecar-lock-registration.d.ts +13 -0
  311. package/dist/sidecar-lock-registration.js +47 -0
  312. package/dist/sidecar-lock-root.d.ts +0 -1
  313. package/dist/sidecar-lock-stale-admission.d.ts +0 -1
  314. package/dist/sidecar-lock-stale-admission.js +2 -6
  315. package/dist/sidecar-lock-target.d.ts +0 -1
  316. package/dist/sidecar-lock-types.d.ts +22 -17
  317. package/dist/sidecar-lock.d.ts +0 -1
  318. package/dist/sidecar-lock.js +16 -83
  319. package/dist/staged-directory.d.ts +0 -1
  320. package/dist/staged-file-settlement.d.ts +0 -1
  321. package/dist/staged-file-types.d.ts +0 -1
  322. package/dist/stat-observation.d.ts +0 -1
  323. package/dist/store.d.ts +0 -1
  324. package/dist/strict-file-identity.d.ts +0 -1
  325. package/dist/string-coerce.d.ts +0 -1
  326. package/dist/suppressed-error.d.ts +0 -1
  327. package/dist/symlink-parents.d.ts +0 -1
  328. package/dist/temp-cleanup.d.ts +0 -1
  329. package/dist/temp-target.d.ts +0 -1
  330. package/dist/temp-target.js +7 -46
  331. package/dist/temp-workspace-admission.d.ts +0 -8
  332. package/dist/temp-workspace-admission.js +1 -7
  333. package/dist/temp-workspace-child-admission.d.ts +16 -6
  334. package/dist/temp-workspace-child-admission.js +71 -15
  335. package/dist/temp-workspace-descriptor.d.ts +1 -7
  336. package/dist/temp-workspace-descriptor.js +1 -4
  337. package/dist/temp-workspace-owner.d.ts +1 -1
  338. package/dist/temp-workspace-owner.js +45 -22
  339. package/dist/temp-workspace-types.d.ts +0 -1
  340. package/dist/temp.d.ts +0 -1
  341. package/dist/test-hooks.d.ts +0 -1
  342. package/dist/text-atomic.d.ts +0 -1
  343. package/dist/text-atomic.js +1 -1
  344. package/dist/timing.d.ts +0 -1
  345. package/dist/trash.d.ts +0 -1
  346. package/dist/types.d.ts +0 -1
  347. package/dist/unicode-path.d.ts +0 -1
  348. package/dist/walk.d.ts +0 -1
  349. package/dist/windows-command.d.ts +0 -1
  350. package/dist/windows-owner.d.ts +0 -1
  351. package/dist/windows-owner.js +5 -2
  352. package/dist/windows-path-alias.d.ts +1 -1
  353. package/dist/windows-path-alias.js +12 -43
  354. package/dist/windows-path-syntax.d.ts +5 -0
  355. package/dist/windows-path-syntax.js +21 -0
  356. package/dist/windows-security-command.d.ts +0 -1
  357. package/dist/windows-security-facts.d.ts +0 -1
  358. package/dist/write-file-handle.d.ts +0 -1
  359. package/dist/write-open-flags.d.ts +0 -1
  360. package/dist/write-queue.d.ts +0 -1
  361. package/docs/advanced.md +3 -1
  362. package/docs/atomic.md +14 -0
  363. package/docs/copy.md +2 -0
  364. package/docs/mutation-policy-proof.md +6 -4
  365. package/docs/permissions.md +6 -0
  366. package/docs/root.md +10 -0
  367. package/docs/secret-file.md +8 -0
  368. package/docs/sidecar-lock.md +4 -0
  369. package/docs/store.md +6 -0
  370. package/docs/temp.md +8 -1
  371. package/docs/writing.md +14 -3
  372. package/package.json +8 -9
  373. package/dist/absolute-path.d.ts.map +0 -1
  374. package/dist/advanced.d.ts.map +0 -1
  375. package/dist/archive-crc32.d.ts.map +0 -1
  376. package/dist/archive-deadline.d.ts.map +0 -1
  377. package/dist/archive-durability.d.ts.map +0 -1
  378. package/dist/archive-entry.d.ts.map +0 -1
  379. package/dist/archive-errors.d.ts.map +0 -1
  380. package/dist/archive-gzip-tail.d.ts.map +0 -1
  381. package/dist/archive-input.d.ts.map +0 -1
  382. package/dist/archive-kind.d.ts.map +0 -1
  383. package/dist/archive-limits.d.ts.map +0 -1
  384. package/dist/archive-merge.d.ts.map +0 -1
  385. package/dist/archive-native.d.ts +0 -22
  386. package/dist/archive-native.d.ts.map +0 -1
  387. package/dist/archive-native.js +0 -98
  388. package/dist/archive-options.d.ts +0 -25
  389. package/dist/archive-options.d.ts.map +0 -1
  390. package/dist/archive-parser-errors.d.ts.map +0 -1
  391. package/dist/archive-plan.d.ts.map +0 -1
  392. package/dist/archive-policy.d.ts +0 -22
  393. package/dist/archive-policy.d.ts.map +0 -1
  394. package/dist/archive-policy.js +0 -38
  395. package/dist/archive-read.d.ts.map +0 -1
  396. package/dist/archive-staging.d.ts.map +0 -1
  397. package/dist/archive-tar-inspect.d.ts +0 -7
  398. package/dist/archive-tar-inspect.d.ts.map +0 -1
  399. package/dist/archive-tar-inspect.js +0 -62
  400. package/dist/archive-tar-stream.d.ts.map +0 -1
  401. package/dist/archive-tar-wasm.d.ts.map +0 -1
  402. package/dist/archive-tar.d.ts +0 -19
  403. package/dist/archive-tar.d.ts.map +0 -1
  404. package/dist/archive-tar.js +0 -21
  405. package/dist/archive-zip-admission.d.ts.map +0 -1
  406. package/dist/archive-zip-count.d.ts.map +0 -1
  407. package/dist/archive-zip-directory.d.ts.map +0 -1
  408. package/dist/archive-zip-entry.d.ts.map +0 -1
  409. package/dist/archive-zip-integrity.d.ts.map +0 -1
  410. package/dist/archive-zip-loader.d.ts.map +0 -1
  411. package/dist/archive-zip-manifest.d.ts.map +0 -1
  412. package/dist/archive-zip-names.d.ts.map +0 -1
  413. package/dist/archive-zip-preflight.d.ts.map +0 -1
  414. package/dist/archive.d.ts.map +0 -1
  415. package/dist/async-lock.d.ts.map +0 -1
  416. package/dist/atomic.d.ts.map +0 -1
  417. package/dist/bounded-read-stream.d.ts.map +0 -1
  418. package/dist/bounded-read.d.ts.map +0 -1
  419. package/dist/byte-budget.d.ts.map +0 -1
  420. package/dist/byte-view.d.ts.map +0 -1
  421. package/dist/clone-metadata.d.ts.map +0 -1
  422. package/dist/config.d.ts.map +0 -1
  423. package/dist/containment.d.ts.map +0 -1
  424. package/dist/copy-file-input.d.ts.map +0 -1
  425. package/dist/copy-policy.d.ts.map +0 -1
  426. package/dist/copy-publication.d.ts.map +0 -1
  427. package/dist/copy-tree-portable.d.ts.map +0 -1
  428. package/dist/copy.d.ts.map +0 -1
  429. package/dist/create-directory.d.ts +0 -20
  430. package/dist/create-directory.d.ts.map +0 -1
  431. package/dist/create-directory.js +0 -130
  432. package/dist/create-file-async.d.ts +0 -7
  433. package/dist/create-file-async.d.ts.map +0 -1
  434. package/dist/create-file-async.js +0 -121
  435. package/dist/create-file.d.ts +0 -8
  436. package/dist/create-file.d.ts.map +0 -1
  437. package/dist/create-file.js +0 -190
  438. package/dist/create-owned-file.d.ts.map +0 -1
  439. package/dist/create.d.ts.map +0 -1
  440. package/dist/creation-darwin.d.ts +0 -6
  441. package/dist/creation-darwin.d.ts.map +0 -1
  442. package/dist/creation-darwin.js +0 -70
  443. package/dist/creation-file-state.d.ts +0 -19
  444. package/dist/creation-file-state.d.ts.map +0 -1
  445. package/dist/creation-file-state.js +0 -118
  446. package/dist/creation-path.d.ts +0 -21
  447. package/dist/creation-path.d.ts.map +0 -1
  448. package/dist/creation-path.js +0 -71
  449. package/dist/creation-permissions.d.ts +0 -19
  450. package/dist/creation-permissions.d.ts.map +0 -1
  451. package/dist/creation-permissions.js +0 -125
  452. package/dist/deny-mutations.d.ts.map +0 -1
  453. package/dist/device-path.d.ts.map +0 -1
  454. package/dist/directory-durability.d.ts.map +0 -1
  455. package/dist/directory-entry-path.d.ts.map +0 -1
  456. package/dist/directory-guard.d.ts.map +0 -1
  457. package/dist/directory-mode-node.d.ts.map +0 -1
  458. package/dist/directory-mode-owner.d.ts.map +0 -1
  459. package/dist/directory-receipt.d.ts.map +0 -1
  460. package/dist/durability.d.ts.map +0 -1
  461. package/dist/effective-uid.d.ts.map +0 -1
  462. package/dist/error-detail.d.ts.map +0 -1
  463. package/dist/errors.d.ts.map +0 -1
  464. package/dist/file-cleanup.d.ts.map +0 -1
  465. package/dist/file-contents.d.ts.map +0 -1
  466. package/dist/file-handle-transfer.d.ts.map +0 -1
  467. package/dist/file-hash.d.ts.map +0 -1
  468. package/dist/file-identity.d.ts.map +0 -1
  469. package/dist/file-lock-sync-admission.d.ts.map +0 -1
  470. package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
  471. package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
  472. package/dist/file-lock-sync-root-held.d.ts.map +0 -1
  473. package/dist/file-lock-sync-root-io.d.ts.map +0 -1
  474. package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
  475. package/dist/file-lock-sync-root-options.d.ts.map +0 -1
  476. package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
  477. package/dist/file-lock-sync-root.d.ts.map +0 -1
  478. package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
  479. package/dist/file-lock-sync.d.ts.map +0 -1
  480. package/dist/file-lock.d.ts.map +0 -1
  481. package/dist/file-observation.d.ts.map +0 -1
  482. package/dist/file-store-boundary.d.ts.map +0 -1
  483. package/dist/file-store-copy-source.d.ts +0 -5
  484. package/dist/file-store-copy-source.d.ts.map +0 -1
  485. package/dist/file-store-copy-source.js +0 -31
  486. package/dist/file-store-limit.d.ts +0 -2
  487. package/dist/file-store-limit.d.ts.map +0 -1
  488. package/dist/file-store-limit.js +0 -8
  489. package/dist/file-store-path.d.ts +0 -3
  490. package/dist/file-store-path.d.ts.map +0 -1
  491. package/dist/file-store-path.js +0 -30
  492. package/dist/file-store-prune.d.ts.map +0 -1
  493. package/dist/file-store-sync-directory.d.ts.map +0 -1
  494. package/dist/file-store-sync-write.d.ts.map +0 -1
  495. package/dist/file-store.d.ts.map +0 -1
  496. package/dist/file-sync.d.ts.map +0 -1
  497. package/dist/filename.d.ts.map +0 -1
  498. package/dist/fs.d.ts.map +0 -1
  499. package/dist/guarded-mkdir.d.ts.map +0 -1
  500. package/dist/guarded-mutation.d.ts.map +0 -1
  501. package/dist/guest-dispatch-python.d.ts.map +0 -1
  502. package/dist/guest-native-python.d.ts.map +0 -1
  503. package/dist/guest.d.ts.map +0 -1
  504. package/dist/home-dir.d.ts.map +0 -1
  505. package/dist/index.d.ts.map +0 -1
  506. package/dist/install-path.d.ts.map +0 -1
  507. package/dist/json-document-store.d.ts.map +0 -1
  508. package/dist/json-durable-queue-directory.d.ts.map +0 -1
  509. package/dist/json-durable-queue-ownership.d.ts.map +0 -1
  510. package/dist/json-durable-queue-paths.d.ts +0 -11
  511. package/dist/json-durable-queue-paths.d.ts.map +0 -1
  512. package/dist/json-durable-queue-paths.js +0 -20
  513. package/dist/json-durable-queue-read.d.ts.map +0 -1
  514. package/dist/json-durable-queue.d.ts.map +0 -1
  515. package/dist/json-store.d.ts.map +0 -1
  516. package/dist/json-stringify.d.ts.map +0 -1
  517. package/dist/json.d.ts.map +0 -1
  518. package/dist/local-file-access.d.ts.map +0 -1
  519. package/dist/local-file-descriptor.d.ts.map +0 -1
  520. package/dist/local-roots.d.ts.map +0 -1
  521. package/dist/lock-config.d.ts.map +0 -1
  522. package/dist/move-path-cleanup.d.ts.map +0 -1
  523. package/dist/move-path-stage.d.ts.map +0 -1
  524. package/dist/move-path.d.ts.map +0 -1
  525. package/dist/mutation-authority.d.ts.map +0 -1
  526. package/dist/native-binding.d.ts.map +0 -1
  527. package/dist/native-config.d.ts.map +0 -1
  528. package/dist/native-directory-observation.d.ts.map +0 -1
  529. package/dist/native-fallback-warning.d.ts.map +0 -1
  530. package/dist/native-operations.d.ts.map +0 -1
  531. package/dist/native-parent-admission.d.ts.map +0 -1
  532. package/dist/native-pinned-write-windows.d.ts.map +0 -1
  533. package/dist/native-pinned-write.d.ts.map +0 -1
  534. package/dist/native-policy-directory-observation.d.ts.map +0 -1
  535. package/dist/native-policy-parent-windows.d.ts.map +0 -1
  536. package/dist/native-rename-outcome.d.ts.map +0 -1
  537. package/dist/native-staged-file.d.ts.map +0 -1
  538. package/dist/native.d.ts.map +0 -1
  539. package/dist/opened-file-failure.d.ts.map +0 -1
  540. package/dist/opened-realpath.d.ts.map +0 -1
  541. package/dist/output.d.ts.map +0 -1
  542. package/dist/overwrite-file-handle.d.ts.map +0 -1
  543. package/dist/owner-dacl.d.ts.map +0 -1
  544. package/dist/path-case.d.ts.map +0 -1
  545. package/dist/path-policy.d.ts.map +0 -1
  546. package/dist/path-prefix.d.ts.map +0 -1
  547. package/dist/path-scope-lexical.d.ts.map +0 -1
  548. package/dist/path-segment-route.d.ts.map +0 -1
  549. package/dist/path-suffix-aliases.d.ts.map +0 -1
  550. package/dist/path.d.ts.map +0 -1
  551. package/dist/permission-exec.d.ts.map +0 -1
  552. package/dist/permissions-public.d.ts.map +0 -1
  553. package/dist/permissions-windows.d.ts.map +0 -1
  554. package/dist/permissions.d.ts.map +0 -1
  555. package/dist/pinned-mutation-admission.d.ts.map +0 -1
  556. package/dist/pinned-mutation-observation.d.ts.map +0 -1
  557. package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
  558. package/dist/pinned-open.d.ts.map +0 -1
  559. package/dist/pinned-operation.d.ts.map +0 -1
  560. package/dist/pinned-write-input.d.ts.map +0 -1
  561. package/dist/pinned-write-mode.d.ts.map +0 -1
  562. package/dist/pinned-write-staged.d.ts.map +0 -1
  563. package/dist/pinned-write-types.d.ts.map +0 -1
  564. package/dist/pinned-write.d.ts.map +0 -1
  565. package/dist/positional-read.d.ts.map +0 -1
  566. package/dist/private-directory.d.ts.map +0 -1
  567. package/dist/private-producer-handoff-sync.d.ts.map +0 -1
  568. package/dist/private-producer-handoff.d.ts.map +0 -1
  569. package/dist/private-temp-workspace.d.ts.map +0 -1
  570. package/dist/publish-copy-stage.d.ts.map +0 -1
  571. package/dist/publish-file-failure.d.ts.map +0 -1
  572. package/dist/publish-file.d.ts.map +0 -1
  573. package/dist/read-open-flags.d.ts.map +0 -1
  574. package/dist/read-opened-file.d.ts.map +0 -1
  575. package/dist/realpath.d.ts.map +0 -1
  576. package/dist/recursive-mkdir-path.d.ts.map +0 -1
  577. package/dist/regular-file.d.ts.map +0 -1
  578. package/dist/replace-directory.d.ts.map +0 -1
  579. package/dist/replace-file-copy-fallback.d.ts.map +0 -1
  580. package/dist/replace-file-copy-source.d.ts.map +0 -1
  581. package/dist/replace-file-descriptor.d.ts.map +0 -1
  582. package/dist/replace-file-mode.d.ts.map +0 -1
  583. package/dist/replace-file-rename-policy.d.ts.map +0 -1
  584. package/dist/replace-file-temp-owner.d.ts.map +0 -1
  585. package/dist/replace-file.d.ts.map +0 -1
  586. package/dist/retained-directory-replacement.d.ts.map +0 -1
  587. package/dist/root-boundary.d.ts.map +0 -1
  588. package/dist/root-context.d.ts.map +0 -1
  589. package/dist/root-create-input.d.ts.map +0 -1
  590. package/dist/root-directory-creation.d.ts.map +0 -1
  591. package/dist/root-directory-list.d.ts.map +0 -1
  592. package/dist/root-directory.d.ts.map +0 -1
  593. package/dist/root-entries.d.ts.map +0 -1
  594. package/dist/root-errors.d.ts.map +0 -1
  595. package/dist/root-file-final-admission.d.ts.map +0 -1
  596. package/dist/root-file.d.ts.map +0 -1
  597. package/dist/root-impl.d.ts.map +0 -1
  598. package/dist/root-move-noreplace.d.ts.map +0 -1
  599. package/dist/root-move-preflight.d.ts.map +0 -1
  600. package/dist/root-observed-path.d.ts.map +0 -1
  601. package/dist/root-options.d.ts.map +0 -1
  602. package/dist/root-path-errors.d.ts.map +0 -1
  603. package/dist/root-path-existing.d.ts.map +0 -1
  604. package/dist/root-path-observation.d.ts.map +0 -1
  605. package/dist/root-path-stat.d.ts.map +0 -1
  606. package/dist/root-path-symlink.d.ts +0 -7
  607. package/dist/root-path-symlink.d.ts.map +0 -1
  608. package/dist/root-path-symlink.js +0 -55
  609. package/dist/root-path.d.ts.map +0 -1
  610. package/dist/root-paths-lexical.d.ts.map +0 -1
  611. package/dist/root-paths.d.ts.map +0 -1
  612. package/dist/root-read-admission.d.ts.map +0 -1
  613. package/dist/root-remove-identity.d.ts.map +0 -1
  614. package/dist/root-remove-receipt.d.ts.map +0 -1
  615. package/dist/root-remove.d.ts.map +0 -1
  616. package/dist/root-symlink-policy.d.ts.map +0 -1
  617. package/dist/root-walk.d.ts.map +0 -1
  618. package/dist/root-write-admission.d.ts.map +0 -1
  619. package/dist/root-write-compatibility.d.ts.map +0 -1
  620. package/dist/root-write-complete-parent.d.ts.map +0 -1
  621. package/dist/root-write-lock-binding.d.ts.map +0 -1
  622. package/dist/root-write-mode.d.ts.map +0 -1
  623. package/dist/root-write-publication.d.ts.map +0 -1
  624. package/dist/root-write-verification.d.ts.map +0 -1
  625. package/dist/root.d.ts.map +0 -1
  626. package/dist/safe-path-segment.d.ts.map +0 -1
  627. package/dist/secret-file.d.ts.map +0 -1
  628. package/dist/secret-read-async.d.ts.map +0 -1
  629. package/dist/secret-read-policy.d.ts.map +0 -1
  630. package/dist/secret.d.ts.map +0 -1
  631. package/dist/secure-file-windows.d.ts.map +0 -1
  632. package/dist/secure-file.d.ts.map +0 -1
  633. package/dist/secure-temp-dir.d.ts.map +0 -1
  634. package/dist/secure-temp-repair.d.ts.map +0 -1
  635. package/dist/sibling-staged-file.d.ts.map +0 -1
  636. package/dist/sibling-temp.d.ts.map +0 -1
  637. package/dist/sidecar-lock-acquire.d.ts.map +0 -1
  638. package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
  639. package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
  640. package/dist/sidecar-lock-admission.d.ts.map +0 -1
  641. package/dist/sidecar-lock-handle.d.ts.map +0 -1
  642. package/dist/sidecar-lock-policy.d.ts.map +0 -1
  643. package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
  644. package/dist/sidecar-lock-root.d.ts.map +0 -1
  645. package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
  646. package/dist/sidecar-lock-target.d.ts.map +0 -1
  647. package/dist/sidecar-lock-types.d.ts.map +0 -1
  648. package/dist/sidecar-lock.d.ts.map +0 -1
  649. package/dist/staged-directory.d.ts.map +0 -1
  650. package/dist/staged-file-settlement.d.ts.map +0 -1
  651. package/dist/staged-file-types.d.ts.map +0 -1
  652. package/dist/standalone-publication-path.d.ts +0 -2
  653. package/dist/standalone-publication-path.d.ts.map +0 -1
  654. package/dist/standalone-publication-path.js +0 -6
  655. package/dist/stat-observation.d.ts.map +0 -1
  656. package/dist/store.d.ts.map +0 -1
  657. package/dist/strict-file-identity.d.ts.map +0 -1
  658. package/dist/string-coerce.d.ts.map +0 -1
  659. package/dist/suppressed-error.d.ts.map +0 -1
  660. package/dist/symlink-parents.d.ts.map +0 -1
  661. package/dist/temp-cleanup.d.ts.map +0 -1
  662. package/dist/temp-target.d.ts.map +0 -1
  663. package/dist/temp-workspace-admission.d.ts.map +0 -1
  664. package/dist/temp-workspace-child-admission.d.ts.map +0 -1
  665. package/dist/temp-workspace-descriptor.d.ts.map +0 -1
  666. package/dist/temp-workspace-identity.d.ts +0 -15
  667. package/dist/temp-workspace-identity.d.ts.map +0 -1
  668. package/dist/temp-workspace-identity.js +0 -41
  669. package/dist/temp-workspace-owner.d.ts.map +0 -1
  670. package/dist/temp-workspace-permissions.d.ts +0 -4
  671. package/dist/temp-workspace-permissions.d.ts.map +0 -1
  672. package/dist/temp-workspace-permissions.js +0 -32
  673. package/dist/temp-workspace-types.d.ts.map +0 -1
  674. package/dist/temp.d.ts.map +0 -1
  675. package/dist/test-hooks.d.ts.map +0 -1
  676. package/dist/text-atomic.d.ts.map +0 -1
  677. package/dist/timing.d.ts.map +0 -1
  678. package/dist/trash.d.ts.map +0 -1
  679. package/dist/types.d.ts.map +0 -1
  680. package/dist/unicode-path.d.ts.map +0 -1
  681. package/dist/walk.d.ts.map +0 -1
  682. package/dist/windows-command.d.ts.map +0 -1
  683. package/dist/windows-owner.d.ts.map +0 -1
  684. package/dist/windows-path-alias.d.ts.map +0 -1
  685. package/dist/windows-security-command.d.ts.map +0 -1
  686. package/dist/windows-security-facts.d.ts.map +0 -1
  687. package/dist/write-file-handle.d.ts.map +0 -1
  688. package/dist/write-open-flags.d.ts.map +0 -1
  689. package/dist/write-queue.d.ts.map +0 -1
  690. /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
- //# sourceMappingURL=root-path-existing.d.ts.map
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, pathExists, realpathSync.native);
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, pathExistsSync, realpathSync);
103
+ return resolveExistingAncestor(targetPath, "ordinary");
106
104
  }
107
- function resolveExistingAncestor(targetPath, exists, canonicalize) {
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 missingSuffix = [];
113
- while (!isFilesystemRoot(cursor) &&
112
+ const filesystemRoot = path.parse(normalized).root;
113
+ while (cursor !== filesystemRoot &&
114
114
  !exists(cursor)) {
115
- missingSuffix.unshift(path.basename(cursor));
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
- const resolved = missingSuffix.length === 0
130
+ // Keep a leading suffix separator relative to the canonical ancestor.
131
+ const resolved = cursor === normalized
136
132
  ? resolvedAncestor
137
- : path.resolve(resolvedAncestor, ...missingSuffix);
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
@@ -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
@@ -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 {
@@ -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, resolvePathViaExistingAncestor, resolvePathViaExistingAncestorSync, } from "./root-path-existing.js";
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
- try {
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
- try {
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 output = {};
58
- try {
59
- const resolved = await resolveRootPathInternal(params, request, output);
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
- try {
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
- try {
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 resolveRootPathSyncInternal(params, observeRoot);
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 createLexicalTraversalState(params) {
177
- const rawAbsolutePath = params.rawAbsolutePath;
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
- segments,
184
- relativePath: relative,
185
- reuseLexicalCanonical: false,
186
- finalComponentIndex: segments.findLastIndex((segment) => segment !== "."),
187
- allowFinalSymlink: params.params.policy?.allowFinalSymlinkForUnlink === true,
188
- canonicalCursor: params.rootCanonicalPath,
189
- lexicalCursor: params.rootPath,
190
- preserveFinalSymlink: false,
191
- missingDepth: 0,
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 buildResolvedRootPath({
211
+ return {
267
212
  absolutePath: context.absolutePath,
268
213
  canonicalPath: context.state.canonicalCursor,
269
214
  rootPath: context.rootPath,
270
215
  rootCanonicalPath: context.rootCanonicalPath,
271
- kind,
272
- });
273
- }
274
- function handleLexicalLstatFailure(context, error, segment) {
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
- async function resolveRootPathLexicalAsync(params, observationRequest, observationOutput, removalReceipts) {
323
- const context = createLexicalTraversalContext(params);
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, observationRequest);
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 (handleLexicalLstatFailure(context, error, segment))
378
- continue;
379
- throw error;
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
- const disposition = lexicalStatDisposition({
396
- isSymbolicLink,
397
- isLast,
398
- rejectSymlinks: isSymbolicLink ? context.resolveParams.rejectSymlinks : undefined,
399
- rejectFinalSymlink: context.resolveParams.rejectFinalSymlink === true && idx === state.finalComponentIndex,
400
- allowFinalSymlink: state.allowFinalSymlink,
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 = await resolveSymlinkHopPath(state.lexicalCursor, {
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
- : await getPathKind(state.canonicalCursor, state.preserveFinalSymlink);
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);
@@ -6,4 +6,3 @@ export declare function resolvePathWithinRoot(params: ResolvePathWithinRootParam
6
6
  ok: false;
7
7
  error: string;
8
8
  };
9
- //# sourceMappingURL=root-paths-lexical.d.ts.map
@@ -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";
@@ -23,4 +23,3 @@ export declare function admitRootReadHandle<T extends OwnedRootReadHandle>(param
23
23
  realPath: string;
24
24
  }>;
25
25
  export {};
26
- //# sourceMappingURL=root-read-admission.d.ts.map
@@ -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
- const finalRealPath = assertRootReadAdmissionCurrent({
78
- root: params.root,
79
- filePath: params.filePath,
80
- handle: params.opened.handle,
81
- identity: params.identity,
82
- hardlinks: params.hardlinks,
83
- symlinks: params.symlinks,
84
- afterPathIdentityCheck: params.afterPathIdentityCheck,
85
- });
86
- return { ...params.opened, realPath: finalRealPath };
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)
@@ -14,4 +14,3 @@ export declare class RemovalPathReceipts {
14
14
  directories: readonly CapturedRemovalDirectory[];
15
15
  } | undefined;
16
16
  }
17
- //# sourceMappingURL=root-remove-receipt.d.ts.map
@@ -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