@agent-teams/repository-mutation 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +201 -0
  3. package/README.md +10 -0
  4. package/dist/canonical-json.d.ts +12 -0
  5. package/dist/canonical-json.d.ts.map +1 -0
  6. package/dist/canonical-json.js +137 -0
  7. package/dist/canonical-json.js.map +1 -0
  8. package/dist/errors.d.ts +6 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/errors.js +9 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/index.d.ts +25 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +13 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/installed-artifact-identity.d.ts +15 -0
  17. package/dist/installed-artifact-identity.d.ts.map +1 -0
  18. package/dist/installed-artifact-identity.js +127 -0
  19. package/dist/installed-artifact-identity.js.map +1 -0
  20. package/dist/node.d.ts +29 -0
  21. package/dist/node.d.ts.map +1 -0
  22. package/dist/node.js +19 -0
  23. package/dist/node.js.map +1 -0
  24. package/dist/package-version.d.ts +3 -0
  25. package/dist/package-version.d.ts.map +1 -0
  26. package/dist/package-version.js +11 -0
  27. package/dist/package-version.js.map +1 -0
  28. package/dist/qualification/index.d.ts +24 -0
  29. package/dist/qualification/index.d.ts.map +1 -0
  30. package/dist/qualification/index.js +11 -0
  31. package/dist/qualification/index.js.map +1 -0
  32. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts +19 -0
  33. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts.map +1 -0
  34. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js +74 -0
  35. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js.map +1 -0
  36. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts +35 -0
  37. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts.map +1 -0
  38. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js +181 -0
  39. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js.map +1 -0
  40. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts +23 -0
  41. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts.map +1 -0
  42. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js +134 -0
  43. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js.map +1 -0
  44. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts +26 -0
  45. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts.map +1 -0
  46. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js +172 -0
  47. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js.map +1 -0
  48. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts +14 -0
  49. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts.map +1 -0
  50. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js +23 -0
  51. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js.map +1 -0
  52. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts +17 -0
  53. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts.map +1 -0
  54. package/dist/repository-mutation/adapters/node/node-directory-durability.js +47 -0
  55. package/dist/repository-mutation/adapters/node/node-directory-durability.js.map +1 -0
  56. package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts +37 -0
  57. package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts.map +1 -0
  58. package/dist/repository-mutation/adapters/node/node-directory-materialization.js +244 -0
  59. package/dist/repository-mutation/adapters/node/node-directory-materialization.js.map +1 -0
  60. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts +13 -0
  61. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts.map +1 -0
  62. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js +67 -0
  63. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js.map +1 -0
  64. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts +84 -0
  65. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts.map +1 -0
  66. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js +232 -0
  67. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js.map +1 -0
  68. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts +9 -0
  69. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts.map +1 -0
  70. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js +2 -0
  71. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js.map +1 -0
  72. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts +6 -0
  73. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts.map +1 -0
  74. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js +30 -0
  75. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js.map +1 -0
  76. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts +11 -0
  77. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts.map +1 -0
  78. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js +159 -0
  79. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js.map +1 -0
  80. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts +9 -0
  81. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts.map +1 -0
  82. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js +22 -0
  83. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js.map +1 -0
  84. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts +9 -0
  85. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts.map +1 -0
  86. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js +203 -0
  87. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js.map +1 -0
  88. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts +17 -0
  89. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts.map +1 -0
  90. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js +22 -0
  91. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js.map +1 -0
  92. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts +28 -0
  93. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts.map +1 -0
  94. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js +213 -0
  95. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js.map +1 -0
  96. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts +15 -0
  97. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts.map +1 -0
  98. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js +51 -0
  99. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js.map +1 -0
  100. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts +29 -0
  101. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts.map +1 -0
  102. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js +72 -0
  103. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js.map +1 -0
  104. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts +31 -0
  105. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts.map +1 -0
  106. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js +254 -0
  107. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js.map +1 -0
  108. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts +13 -0
  109. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts.map +1 -0
  110. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js +210 -0
  111. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js.map +1 -0
  112. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts +15 -0
  113. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts.map +1 -0
  114. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js +181 -0
  115. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js.map +1 -0
  116. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts +12 -0
  117. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts.map +1 -0
  118. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js +18 -0
  119. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js.map +1 -0
  120. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts +25 -0
  121. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts.map +1 -0
  122. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js +150 -0
  123. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js.map +1 -0
  124. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts +12 -0
  125. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts.map +1 -0
  126. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js +56 -0
  127. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js.map +1 -0
  128. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts +22 -0
  129. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts.map +1 -0
  130. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js +246 -0
  131. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js.map +1 -0
  132. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts +21 -0
  133. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts.map +1 -0
  134. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js +34 -0
  135. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js.map +1 -0
  136. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts +4 -0
  137. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts.map +1 -0
  138. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js +43 -0
  139. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js.map +1 -0
  140. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts +14 -0
  141. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts.map +1 -0
  142. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js +109 -0
  143. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js.map +1 -0
  144. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts +21 -0
  145. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts.map +1 -0
  146. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js +215 -0
  147. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js.map +1 -0
  148. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts +18 -0
  149. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts.map +1 -0
  150. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js +30 -0
  151. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js.map +1 -0
  152. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts +31 -0
  153. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts.map +1 -0
  154. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js +50 -0
  155. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js.map +1 -0
  156. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts +2 -0
  157. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts.map +1 -0
  158. package/dist/repository-mutation/adapters/node/node-repository-path.js +7 -0
  159. package/dist/repository-mutation/adapters/node/node-repository-path.js.map +1 -0
  160. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts +21 -0
  161. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts.map +1 -0
  162. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js +59 -0
  163. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js.map +1 -0
  164. package/dist/repository-mutation/application/model/directory-materialization.d.ts +35 -0
  165. package/dist/repository-mutation/application/model/directory-materialization.d.ts.map +1 -0
  166. package/dist/repository-mutation/application/model/directory-materialization.js +11 -0
  167. package/dist/repository-mutation/application/model/directory-materialization.js.map +1 -0
  168. package/dist/repository-mutation/application/model/exact-postimage.d.ts +17 -0
  169. package/dist/repository-mutation/application/model/exact-postimage.d.ts.map +1 -0
  170. package/dist/repository-mutation/application/model/exact-postimage.js +11 -0
  171. package/dist/repository-mutation/application/model/exact-postimage.js.map +1 -0
  172. package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts +69 -0
  173. package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts.map +1 -0
  174. package/dist/repository-mutation/application/model/known-file-transaction-journal.js +15 -0
  175. package/dist/repository-mutation/application/model/known-file-transaction-journal.js.map +1 -0
  176. package/dist/repository-mutation/application/model/known-file-transaction.d.ts +64 -0
  177. package/dist/repository-mutation/application/model/known-file-transaction.d.ts.map +1 -0
  178. package/dist/repository-mutation/application/model/known-file-transaction.js +2 -0
  179. package/dist/repository-mutation/application/model/known-file-transaction.js.map +1 -0
  180. package/dist/repository-mutation/application/model/path-identity.d.ts +7 -0
  181. package/dist/repository-mutation/application/model/path-identity.d.ts.map +1 -0
  182. package/dist/repository-mutation/application/model/path-identity.js +2 -0
  183. package/dist/repository-mutation/application/model/path-identity.js.map +1 -0
  184. package/dist/repository-mutation/application/model/repository-path.d.ts +8 -0
  185. package/dist/repository-mutation/application/model/repository-path.d.ts.map +1 -0
  186. package/dist/repository-mutation/application/model/repository-path.js +74 -0
  187. package/dist/repository-mutation/application/model/repository-path.js.map +1 -0
  188. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts +33 -0
  189. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts.map +1 -0
  190. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js +21 -0
  191. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js.map +1 -0
  192. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts +9 -0
  193. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts.map +1 -0
  194. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js +214 -0
  195. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js.map +1 -0
  196. package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts +7 -0
  197. package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts.map +1 -0
  198. package/dist/repository-mutation/application/policies/known-file-transaction-plan.js +253 -0
  199. package/dist/repository-mutation/application/policies/known-file-transaction-plan.js.map +1 -0
  200. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts +7 -0
  201. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts.map +1 -0
  202. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js +2 -0
  203. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js.map +1 -0
  204. package/dist/repository-mutation-envelope.d.ts +32 -0
  205. package/dist/repository-mutation-envelope.d.ts.map +1 -0
  206. package/dist/repository-mutation-envelope.js +292 -0
  207. package/dist/repository-mutation-envelope.js.map +1 -0
  208. package/dist/state-contract.d.ts +6 -0
  209. package/dist/state-contract.d.ts.map +1 -0
  210. package/dist/state-contract.js +6 -0
  211. package/dist/state-contract.js.map +1 -0
  212. package/dist/strict-json.d.ts +7 -0
  213. package/dist/strict-json.d.ts.map +1 -0
  214. package/dist/strict-json.js +131 -0
  215. package/dist/strict-json.js.map +1 -0
  216. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts +29 -0
  217. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts.map +1 -0
  218. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js +139 -0
  219. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js.map +1 -0
  220. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts +151 -0
  221. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts.map +1 -0
  222. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js +29 -0
  223. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js.map +1 -0
  224. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts +25 -0
  225. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts.map +1 -0
  226. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js +303 -0
  227. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js.map +1 -0
  228. package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts +16 -0
  229. package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts.map +1 -0
  230. package/dist/transaction-coordination/adapters/node/node-operation-lock.js +359 -0
  231. package/dist/transaction-coordination/adapters/node/node-operation-lock.js.map +1 -0
  232. package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts +11 -0
  233. package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts.map +1 -0
  234. package/dist/transaction-coordination/adapters/node/node-state-directory.js +91 -0
  235. package/dist/transaction-coordination/adapters/node/node-state-directory.js.map +1 -0
  236. package/dist/transaction-coordination/mutation-lease.d.ts +38 -0
  237. package/dist/transaction-coordination/mutation-lease.d.ts.map +1 -0
  238. package/dist/transaction-coordination/mutation-lease.js +351 -0
  239. package/dist/transaction-coordination/mutation-lease.js.map +1 -0
  240. package/package.json +52 -0
  241. package/schemas/known-file-transaction-plan/v1.schema.json +65 -0
  242. package/schemas/known-file-transaction-receipt/v1.schema.json +36 -0
  243. package/schemas/repository-mutation-transaction-envelope/v1.schema.json +46 -0
@@ -0,0 +1,244 @@
1
+ import { lstat, mkdir, opendir, realpath } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { DirectoryMutationError } from "../../application/model/directory-materialization.js";
4
+ import { portableRepositoryPathIdentity, portableRepositoryPathProblem } from "../../application/model/repository-path.js";
5
+ import { syncDirectoryStrictly } from "./node-directory-durability.js";
6
+ import { createAndBindNodeDirectory } from "./node-create-and-bind-directory.js";
7
+ import { isLexicallyContainedPath } from "./node-repository-path.js";
8
+ const maximumDirectoryEntries = 1024;
9
+ async function boundedDirectoryNames(path) {
10
+ const directory = await opendir(path);
11
+ const names = [];
12
+ try {
13
+ for (;;) {
14
+ const entry = await directory.read();
15
+ if (entry === null) {
16
+ return names;
17
+ }
18
+ names.push(entry.name);
19
+ if (names.length > maximumDirectoryEntries) {
20
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", "Repository directory contains too many entries to inspect portable aliases safely.");
21
+ }
22
+ }
23
+ }
24
+ finally {
25
+ await directory.close();
26
+ }
27
+ }
28
+ function errorCode(error) {
29
+ return error instanceof Error && "code" in error
30
+ ? error.code
31
+ : undefined;
32
+ }
33
+ function isMissing(error) {
34
+ return errorCode(error) === "ENOENT";
35
+ }
36
+ function sameIdentity(left, right) {
37
+ return (left.dev === right.dev &&
38
+ left.ino === right.ino &&
39
+ left.birthtimeNs === right.birthtimeNs);
40
+ }
41
+ function identityFromMetadata(metadata) {
42
+ const identity = {
43
+ birthtimeNs: metadata.birthtimeNs,
44
+ dev: metadata.dev,
45
+ ino: metadata.ino
46
+ };
47
+ if (identity.birthtimeNs === 0n ||
48
+ identity.dev === 0n ||
49
+ identity.ino === 0n) {
50
+ throw new DirectoryMutationError("IDENTITY_UNAVAILABLE", "The filesystem did not provide a nonzero directory identity.");
51
+ }
52
+ return identity;
53
+ }
54
+ function assertRepositoryPath(repositoryPath) {
55
+ const problem = portableRepositoryPathProblem(repositoryPath);
56
+ if (problem !== undefined) {
57
+ throw new DirectoryMutationError("INVALID_PATH", `Invalid portable repository directory path (${problem}): ${repositoryPath}.`);
58
+ }
59
+ return repositoryPath.split("/");
60
+ }
61
+ async function captureRealDirectory(absolutePath, repositoryPath) {
62
+ const metadata = await lstat(absolutePath, { bigint: true });
63
+ if (metadata.isSymbolicLink()) {
64
+ throw new DirectoryMutationError("SYMLINK", `Repository directory must not be a symbolic link: ${repositoryPath}.`);
65
+ }
66
+ if (!metadata.isDirectory()) {
67
+ throw new DirectoryMutationError("NOT_DIRECTORY", `Repository path is not a directory: ${repositoryPath}.`);
68
+ }
69
+ return {
70
+ absolutePath,
71
+ identity: identityFromMetadata(metadata),
72
+ repositoryPath
73
+ };
74
+ }
75
+ async function assertCanonicalContainment(canonicalRoot, directory) {
76
+ const canonical = await realpath(directory.absolutePath);
77
+ if (!isLexicallyContainedPath(canonicalRoot, canonical)) {
78
+ throw new DirectoryMutationError("OUTSIDE_ROOT", `Repository directory resolves outside its root: ${directory.repositoryPath}.`);
79
+ }
80
+ const recaptured = await captureRealDirectory(directory.absolutePath, directory.repositoryPath);
81
+ if (!sameIdentity(directory.identity, recaptured.identity)) {
82
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", `Directory identity changed while checking containment: ${directory.repositoryPath}.`);
83
+ }
84
+ }
85
+ async function assertNoAlias(parent, requestedName) {
86
+ const requestedIdentity = portableRepositoryPathIdentity(requestedName);
87
+ const entries = await boundedDirectoryNames(parent);
88
+ const aliases = entries.filter((entry) => portableRepositoryPathIdentity(entry) === requestedIdentity);
89
+ if (aliases.some((entry) => entry !== requestedName)) {
90
+ throw new DirectoryMutationError("ALIAS_COLLISION", `Portable case/NFC alias collides with requested directory: ${requestedName}.`);
91
+ }
92
+ return aliases.includes(requestedName);
93
+ }
94
+ async function captureRoot(repositoryRoot) {
95
+ const absoluteRoot = resolve(repositoryRoot);
96
+ const root = await captureRealDirectory(absoluteRoot, ".");
97
+ const canonicalRoot = await realpath(absoluteRoot);
98
+ const recapturedRoot = await captureRealDirectory(canonicalRoot, ".");
99
+ if (!sameIdentity(root.identity, recapturedRoot.identity)) {
100
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", "Repository root identity changed while it was captured.");
101
+ }
102
+ return {
103
+ canonicalRoot,
104
+ root: recapturedRoot
105
+ };
106
+ }
107
+ async function captureExistingPath(canonicalRoot, repositoryPath) {
108
+ if (repositoryPath === ".") {
109
+ return captureRealDirectory(canonicalRoot, ".");
110
+ }
111
+ let current = canonicalRoot;
112
+ let captured = await captureRealDirectory(canonicalRoot, ".");
113
+ const traversed = [];
114
+ for (const segment of assertRepositoryPath(repositoryPath)) {
115
+ await assertNoAlias(current, segment);
116
+ traversed.push(segment);
117
+ current = join(current, segment);
118
+ captured = await captureRealDirectory(current, traversed.join("/"));
119
+ await assertCanonicalContainment(canonicalRoot, captured);
120
+ }
121
+ return captured;
122
+ }
123
+ export async function projectDirectoryMaterialization(options) {
124
+ const segments = assertRepositoryPath(options.repositoryPath);
125
+ const { canonicalRoot, root } = await captureRoot(options.repositoryRoot);
126
+ let anchor = root;
127
+ let currentAbsolute = canonicalRoot;
128
+ const traversed = [];
129
+ const missingDirectories = [];
130
+ for (const segment of segments) {
131
+ traversed.push(segment);
132
+ currentAbsolute = join(currentAbsolute, segment);
133
+ const repositoryPath = traversed.join("/");
134
+ if (missingDirectories.length > 0) {
135
+ missingDirectories.push({ absolutePath: currentAbsolute, repositoryPath });
136
+ continue;
137
+ }
138
+ const exists = await assertNoAlias(dirname(currentAbsolute), segment);
139
+ if (!exists) {
140
+ missingDirectories.push({
141
+ absolutePath: currentAbsolute,
142
+ repositoryPath
143
+ });
144
+ continue;
145
+ }
146
+ const captured = await captureRealDirectory(currentAbsolute, repositoryPath);
147
+ await assertCanonicalContainment(canonicalRoot, captured);
148
+ anchor = captured;
149
+ }
150
+ return {
151
+ anchor,
152
+ createPolicy: options.createPolicy,
153
+ finalParent: {
154
+ absolutePath: join(canonicalRoot, ...segments),
155
+ repositoryPath: options.repositoryPath
156
+ },
157
+ missingDirectories,
158
+ repositoryRoot: root
159
+ };
160
+ }
161
+ export async function recaptureExactDirectoryIdentity(options) {
162
+ assertRepositoryPath(options.repositoryPath);
163
+ const { canonicalRoot } = await captureRoot(options.repositoryRoot);
164
+ const captured = await captureExistingPath(canonicalRoot, options.repositoryPath);
165
+ if (!sameIdentity(captured.identity, options.expectedIdentity)) {
166
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", `Directory identity changed: ${options.repositoryPath}.`);
167
+ }
168
+ return captured;
169
+ }
170
+ export async function createAndBindOneDirectory(options) {
171
+ const segments = assertRepositoryPath(options.repositoryPath);
172
+ if (options.createPolicy !== "allow") {
173
+ throw new DirectoryMutationError("CREATE_FORBIDDEN", `Directory creation is forbidden by policy: ${options.repositoryPath}.`);
174
+ }
175
+ return createAndBindNodeDirectory({
176
+ ambiguousError: (error) => new DirectoryMutationError("AMBIGUOUS_CREATION", `Directory may exist without a durable identity binding: ${options.repositoryPath}. Manual recovery is required.`, { cause: error, manualRecoveryRequired: true }),
177
+ async bind(bound) {
178
+ await options.binding.bindCreatedDirectory(bound);
179
+ },
180
+ async captureParent() {
181
+ const { canonicalRoot } = await captureRoot(options.repositoryRoot);
182
+ const absolutePath = join(canonicalRoot, ...segments);
183
+ const parentPath = dirname(absolutePath);
184
+ const parentRepositoryPath = segments.slice(0, -1).join("/") || ".";
185
+ const parent = await captureExistingPath(canonicalRoot, parentRepositoryPath);
186
+ if (!sameIdentity(parent.identity, options.expectedParentIdentity)) {
187
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", `Parent directory identity changed: ${parentRepositoryPath}.`);
188
+ }
189
+ await assertNoAlias(parentPath, segments.at(-1) ?? "");
190
+ return { absolutePath, canonicalRoot, parent, parentPath, parentRepositoryPath };
191
+ },
192
+ async createAndObserve(parent, markCreated) {
193
+ await mkdir(parent.absolutePath, {
194
+ mode: options.mode ?? 0o755,
195
+ recursive: false
196
+ });
197
+ markCreated();
198
+ // Portable Node cannot atomically return mkdir's identity. The first
199
+ // observation is authoritative only for cooperative writers.
200
+ const observed = await captureRealDirectory(parent.absolutePath, options.repositoryPath);
201
+ await options.faultInjector?.({
202
+ phase: "after-mkdir-before-capture",
203
+ repositoryPath: options.repositoryPath
204
+ });
205
+ return observed;
206
+ },
207
+ async recapture(parent, observed) {
208
+ const captured = await captureExistingPath(parent.canonicalRoot, options.repositoryPath);
209
+ const recapturedParent = await captureExistingPath(parent.canonicalRoot, parent.parentRepositoryPath);
210
+ await assertNoAlias(parent.parentPath, segments.at(-1) ?? "");
211
+ if (!sameIdentity(observed.identity, captured.identity) ||
212
+ !sameIdentity(recapturedParent.identity, parent.parent.identity)) {
213
+ throw new DirectoryMutationError("CONCURRENT_CHANGE", `Created directory or its parent changed before binding: ${options.repositoryPath}.`);
214
+ }
215
+ return {
216
+ ...captured,
217
+ outcome: "created-and-bound",
218
+ parentIdentity: parent.parent.identity
219
+ };
220
+ },
221
+ async syncParent(parent) {
222
+ await syncDirectoryStrictly(parent.parentPath);
223
+ await options.faultInjector?.({
224
+ phase: "after-parent-sync-before-bind",
225
+ repositoryPath: options.repositoryPath
226
+ });
227
+ }
228
+ });
229
+ }
230
+ export async function classifyUnboundDirectoryCreation(options) {
231
+ assertRepositoryPath(options.repositoryPath);
232
+ const { canonicalRoot } = await captureRoot(options.repositoryRoot);
233
+ try {
234
+ const captured = await captureExistingPath(canonicalRoot, options.repositoryPath);
235
+ return { observedIdentity: captured.identity, outcome: "ambiguous-manual" };
236
+ }
237
+ catch (error) {
238
+ if (isMissing(error)) {
239
+ return { outcome: "not-created" };
240
+ }
241
+ throw error;
242
+ }
243
+ }
244
+ //# sourceMappingURL=node-directory-materialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-directory-materialization.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-directory-materialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAE9F,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAiBrE,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IAC/C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAAA,OAAO,KAAK,CAAC;YAAA,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;gBAC3C,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,oFAAoF,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK;QAC9C,CAAC,CAAE,KAA+B,CAAC,IAAI;QACvC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CACnB,IAA0B,EAC1B,KAA2B;IAE3B,OAAO,CACL,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAI7B;IACC,MAAM,QAAQ,GAAG;QACf,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;KAClB,CAAC;IACF,IACE,QAAQ,CAAC,WAAW,KAAK,EAAE;QAC3B,QAAQ,CAAC,GAAG,KAAK,EAAE;QACnB,QAAQ,CAAC,GAAG,KAAK,EAAE,EACnB,CAAC;QACD,MAAM,IAAI,sBAAsB,CAC9B,sBAAsB,EACtB,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,cAAsB;IAClD,MAAM,OAAO,GAAG,6BAA6B,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,sBAAsB,CAC9B,cAAc,EACd,+CAA+C,OAAO,MAAM,cAAc,GAAG,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,YAAoB,EACpB,cAAsB;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,CAC9B,SAAS,EACT,qDAAqD,cAAc,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,sBAAsB,CAC9B,eAAe,EACf,uCAAuC,cAAc,GAAG,CACzD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,YAAY;QACZ,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC;QACxC,cAAc;KACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,aAAqB,EACrB,SAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,wBAAwB,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,sBAAsB,CAC9B,cAAc,EACd,mDAAmD,SAAS,CAAC,cAAc,GAAG,CAC/E,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAC3C,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,cAAc,CACzB,CAAC;IACF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,0DAA0D,SAAS,CAAC,cAAc,GAAG,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,aAAqB;IAErB,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,CAAC,KAAK,CAAC,KAAK,iBAAiB,CACvE,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,sBAAsB,CAC9B,iBAAiB,EACjB,8DAA8D,aAAa,GAAG,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,cAAsB;IAI/C,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,aAAa;QACb,IAAI,EAAE,cAAc;KACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,aAAqB,EACrB,cAAsB;IAEtB,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;QAC3B,OAAO,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,aAAa,CAAC;IAC5B,IAAI,QAAQ,GAAG,MAAM,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3D,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,0BAA0B,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAIrD;IACC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1E,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,eAAe,GAAG,aAAa,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,kBAAkB,GAAyB,EAAE,CAAC;IAEpD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,kBAAkB,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,kBAAkB,CAAC,IAAI,CAAC;gBACtB,YAAY,EAAE,eAAe;gBAC7B,cAAc;aACf,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QAC7E,MAAM,0BAA0B,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO;QACL,MAAM;QACN,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC;YAC9C,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC;QACD,kBAAkB;QAClB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAIrD;IACC,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAClF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,+BAA+B,OAAO,CAAC,cAAc,GAAG,CACzD,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAQ/C;IACC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,sBAAsB,CAC9B,kBAAkB,EAClB,8CAA8C,OAAO,CAAC,cAAc,GAAG,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,0BAA0B,CAAC;QAChC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,sBAAsB,CACnD,oBAAoB,EACpB,2DAA2D,OAAO,CAAC,cAAc,gCAAgC,EACjH,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAC/C;QACD,KAAK,CAAC,IAAI,CAAC,KAAK;YACd,MAAM,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,aAAa;YACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,aAAa,EACb,oBAAoB,CACrB,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACnE,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,sCAAsC,oBAAoB,GAAG,CAC9D,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;QACnF,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW;YACxC,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC/B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;gBAC3B,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,WAAW,EAAE,CAAC;YACd,qEAAqE;YACrE,6DAA6D;YAC7D,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CACzC,MAAM,CAAC,YAAY,EACnB,OAAO,CAAC,cAAc,CACvB,CAAC;YACF,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC5B,KAAK,EAAE,4BAA4B;gBACnC,cAAc,EAAE,OAAO,CAAC,cAAc;aACvC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ;YAC9B,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,MAAM,CAAC,aAAa,EACpB,OAAO,CAAC,cAAc,CACvB,CAAC;YACF,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAChD,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,oBAAoB,CAC5B,CAAC;YACF,MAAM,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBACrD,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnE,MAAM,IAAI,sBAAsB,CAC9B,mBAAmB,EACnB,2DAA2D,OAAO,CAAC,cAAc,GAAG,CACrF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,GAAG,QAAQ;gBACX,OAAO,EAAE,mBAA4B;gBACrC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;aACvC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,MAAM;YACrB,MAAM,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC5B,KAAK,EAAE,+BAA+B;gBACtC,cAAc,EAAE,OAAO,CAAC,cAAc;aACvC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,OAGtD;IACC,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAClF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACpC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type ExistingRepositoryAncestorProblem = "name-collision" | "not-directory" | "outside-root";
2
+ export declare class ExistingRepositoryAncestorError extends Error {
3
+ readonly problem: ExistingRepositoryAncestorProblem;
4
+ readonly existingName: string | undefined;
5
+ readonly requestedName: string | undefined;
6
+ constructor(problem: ExistingRepositoryAncestorProblem, options?: {
7
+ readonly existingName?: string;
8
+ readonly requestedName?: string;
9
+ });
10
+ }
11
+ export declare function assertNoPortableNameCollision(parent: string, requestedName: string, pathIdentity?: (path: string) => string, ordering?: "binary" | "filesystem", readEntries?: (path: string) => Promise<string[]>): Promise<void>;
12
+ export declare function assertSafeExistingRepositoryAncestors(root: string, repositoryPath: string, pathIdentity?: (path: string) => string, ordering?: "binary" | "filesystem"): Promise<void>;
13
+ //# sourceMappingURL=node-existing-repository-ancestors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-existing-repository-ancestors.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-existing-repository-ancestors.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iCAAiC,GACzC,gBAAgB,GAChB,eAAe,GACf,cAAc,CAAC;AAEnB,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,OAAO,EAAE,iCAAiC,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3C,YACE,OAAO,EAAE,iCAAiC,EAC1C,OAAO,GAAE;QAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,EAOlF;CACF;AAUD,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuC,EACvE,QAAQ,GAAE,QAAQ,GAAG,YAAuB,EAC5C,WAAW,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAW,GACzD,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,qCAAqC,CACzD,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuC,EACvE,QAAQ,GAAE,QAAQ,GAAG,YAAuB,GAC3C,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,67 @@
1
+ import { lstat, readdir, realpath } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { portableRepositoryPathIdentity } from "../../application/model/repository-path.js";
4
+ import { isLexicallyContainedPath } from "./node-repository-path.js";
5
+ export class ExistingRepositoryAncestorError extends Error {
6
+ problem;
7
+ existingName;
8
+ requestedName;
9
+ constructor(problem, options = {}) {
10
+ super(`Existing repository ancestor is unsafe: ${problem}.`);
11
+ this.name = "ExistingRepositoryAncestorError";
12
+ this.problem = problem;
13
+ this.existingName = options.existingName;
14
+ this.requestedName = options.requestedName;
15
+ }
16
+ }
17
+ function isMissing(error) {
18
+ return (error instanceof Error &&
19
+ "code" in error &&
20
+ error.code === "ENOENT");
21
+ }
22
+ export async function assertNoPortableNameCollision(parent, requestedName, pathIdentity = portableRepositoryPathIdentity, ordering = "binary", readEntries = readdir) {
23
+ const observedEntries = await readEntries(parent).catch((error) => {
24
+ if (isMissing(error)) {
25
+ return [];
26
+ }
27
+ throw error;
28
+ });
29
+ const entries = ordering === "binary"
30
+ ? observedEntries.toSorted((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right)))
31
+ : observedEntries;
32
+ const requestedIdentity = pathIdentity(requestedName);
33
+ const collision = entries.find((entry) => entry !== requestedName && pathIdentity(entry) === requestedIdentity);
34
+ if (collision !== undefined) {
35
+ throw new ExistingRepositoryAncestorError("name-collision", {
36
+ existingName: collision,
37
+ requestedName
38
+ });
39
+ }
40
+ }
41
+ export async function assertSafeExistingRepositoryAncestors(root, repositoryPath, pathIdentity = portableRepositoryPathIdentity, ordering = "binary") {
42
+ const segments = repositoryPath.split("/");
43
+ let current = root;
44
+ for (const segment of segments.slice(0, -1)) {
45
+ await assertNoPortableNameCollision(current, segment, pathIdentity, ordering);
46
+ const next = join(current, segment);
47
+ const metadata = await lstat(next).catch((error) => {
48
+ if (isMissing(error)) {
49
+ return null;
50
+ }
51
+ throw error;
52
+ });
53
+ if (metadata === null) {
54
+ return;
55
+ }
56
+ if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
57
+ throw new ExistingRepositoryAncestorError("not-directory");
58
+ }
59
+ const canonical = await realpath(next);
60
+ if (!isLexicallyContainedPath(root, canonical)) {
61
+ throw new ExistingRepositoryAncestorError("outside-root");
62
+ }
63
+ current = canonical;
64
+ }
65
+ await assertNoPortableNameCollision(current, segments.at(-1) ?? "", pathIdentity, ordering);
66
+ }
67
+ //# sourceMappingURL=node-existing-repository-ancestors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-existing-repository-ancestors.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-existing-repository-ancestors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { KnownFileImageV1, KnownFileTransactionPlanV1 } from "../../application/model/known-file-transaction.js";
2
+ import { captureFileHandleIdentity } from "./node-bounded-regular-file.js";
3
+ import type { KnownFileTransactionFaultInjector } from "./node-known-file-apply-faults.js";
4
+ import { type KnownFileApplyState } from "./node-known-file-apply-state.js";
5
+ import type { NodeKnownFileTransactionJournalStore } from "./node-known-file-transaction-journal-store.js";
6
+ type Operation = KnownFileTransactionPlanV1["operations"][number];
7
+ type Identity = Awaited<ReturnType<typeof captureFileHandleIdentity>>;
8
+ export interface PreparedKnownFileTemporary {
9
+ readonly identity: Identity;
10
+ readonly path: string;
11
+ }
12
+ export interface KnownFileCapture {
13
+ readonly identity: Identity;
14
+ readonly paths: {
15
+ readonly captured: string;
16
+ readonly directory: string;
17
+ readonly retired: string;
18
+ };
19
+ }
20
+ export declare function ensureKnownFileParentDirectories(options: {
21
+ readonly faultInjector?: KnownFileTransactionFaultInjector;
22
+ readonly index: number;
23
+ readonly operationPath: string;
24
+ readonly root: string;
25
+ readonly store: NodeKnownFileTransactionJournalStore;
26
+ readonly stored: KnownFileApplyState;
27
+ }): Promise<string>;
28
+ export declare function prepareKnownFileTemporary(options: {
29
+ readonly operation: Operation;
30
+ readonly operationIndex: number;
31
+ readonly parent: string;
32
+ readonly planDigest: string;
33
+ }): Promise<PreparedKnownFileTemporary>;
34
+ export declare function verifyKnownFileTemporary(temporary: PreparedKnownFileTemporary, image: KnownFileImageV1): Promise<void>;
35
+ export declare function prepareKnownFileCapture(options: {
36
+ readonly operation: Operation;
37
+ readonly operationIndex: number;
38
+ readonly parent: string;
39
+ readonly planDigest: string;
40
+ }): Promise<KnownFileCapture>;
41
+ export declare function captureKnownFilePreimage(options: {
42
+ readonly capture: KnownFileCapture;
43
+ readonly operation: Operation & {
44
+ readonly precondition: Extract<Operation["precondition"], {
45
+ readonly state: "known-file";
46
+ }>;
47
+ };
48
+ readonly root: string;
49
+ }): Promise<{
50
+ readonly identity: Identity;
51
+ readonly matchedPreimage: number;
52
+ }>;
53
+ export declare function prepareKnownFileRollback(options: {
54
+ readonly faultInjector?: KnownFileTransactionFaultInjector;
55
+ readonly index: number;
56
+ readonly operation: Operation & {
57
+ readonly precondition: Extract<Operation["precondition"], {
58
+ readonly state: "known-file";
59
+ }>;
60
+ };
61
+ readonly parent: string;
62
+ readonly preimageIndex: number;
63
+ readonly store: NodeKnownFileTransactionJournalStore;
64
+ readonly stored: KnownFileApplyState;
65
+ }): Promise<void>;
66
+ export declare function retireKnownFileDestination(options: {
67
+ readonly capture: KnownFileCapture;
68
+ readonly capturedIdentity: Identity;
69
+ readonly destination: string;
70
+ readonly faultInjector?: KnownFileTransactionFaultInjector;
71
+ readonly index: number;
72
+ readonly operationPath: string;
73
+ readonly parent: string;
74
+ readonly preimage: KnownFileImageV1;
75
+ }): Promise<void>;
76
+ export declare function publishKnownFileLink(options: {
77
+ readonly destination: string;
78
+ readonly operationPath: string;
79
+ readonly temporaryPath: string;
80
+ readonly replacement: boolean;
81
+ }): Promise<void>;
82
+ export declare function unlinkKnownFileTemporary(path: string): Promise<void>;
83
+ export {};
84
+ //# sourceMappingURL=node-known-file-apply-effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-effects.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-effects.ts"],"names":[],"mappings":"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"}