@wener/common 2.0.2 → 2.0.5

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 (410) hide show
  1. package/lib/ai/qwen3vl/index.js +2 -0
  2. package/lib/ai/qwen3vl/index.js.map +1 -0
  3. package/lib/ai/qwen3vl/utils.js +31 -0
  4. package/lib/ai/qwen3vl/utils.js.map +1 -0
  5. package/lib/ai/vision/DocLayoutElementTypeSchema.js +28 -0
  6. package/lib/ai/vision/DocLayoutElementTypeSchema.js.map +1 -0
  7. package/lib/ai/vision/ImageAnnotationSchema.js +50 -0
  8. package/lib/ai/vision/ImageAnnotationSchema.js.map +1 -0
  9. package/lib/ai/vision/index.js +3 -0
  10. package/lib/ai/vision/index.js.map +1 -0
  11. package/lib/ai/vision/resolveImageAnnotation.js +105 -0
  12. package/lib/ai/vision/resolveImageAnnotation.js.map +1 -0
  13. package/lib/cn/ChineseResidentIdNo.js +22 -15
  14. package/lib/cn/ChineseResidentIdNo.js.map +1 -0
  15. package/lib/cn/ChineseResidentIdNo.test.js +1 -1
  16. package/lib/cn/DivisionCode.js +30 -25
  17. package/lib/cn/DivisionCode.js.map +1 -0
  18. package/lib/cn/DivisionCode.test.js +1 -1
  19. package/lib/cn/Mod11.js +38 -81
  20. package/lib/cn/Mod11.js.map +1 -0
  21. package/lib/cn/Mod31.js +41 -90
  22. package/lib/cn/Mod31.js.map +1 -0
  23. package/lib/cn/UnifiedSocialCreditCode.js +43 -34
  24. package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
  25. package/lib/cn/UnifiedSocialCreditCode.test.js +1 -1
  26. package/lib/cn/formatChineseAmount.js +77 -0
  27. package/lib/cn/formatChineseAmount.js.map +1 -0
  28. package/lib/cn/index.js +7 -1
  29. package/lib/cn/index.js.map +1 -0
  30. package/lib/cn/parseChineseNumber.js +94 -0
  31. package/lib/cn/parseChineseNumber.js.map +1 -0
  32. package/lib/cn/parseChineseNumber.test.js +278 -0
  33. package/lib/cn/pinyin/cartesianProduct.js +22 -0
  34. package/lib/cn/pinyin/cartesianProduct.js.map +1 -0
  35. package/lib/cn/pinyin/cartesianProduct.test.js +179 -0
  36. package/lib/cn/pinyin/data.json +23573 -0
  37. package/lib/cn/pinyin/loader.js +14 -0
  38. package/lib/cn/pinyin/loader.js.map +1 -0
  39. package/lib/cn/pinyin/preload.js +3 -0
  40. package/lib/cn/pinyin/preload.js.map +1 -0
  41. package/lib/cn/pinyin/toPinyin.test.js +167 -0
  42. package/lib/cn/pinyin/toPinyinPure.js +33 -0
  43. package/lib/cn/pinyin/toPinyinPure.js.map +1 -0
  44. package/lib/cn/pinyin/transform.js +14 -0
  45. package/lib/cn/pinyin/transform.js.map +1 -0
  46. package/lib/cn/types.d.js +2 -0
  47. package/lib/cn/types.d.js.map +1 -0
  48. package/lib/consola/createStandardConsolaReporter.js +6 -6
  49. package/lib/consola/createStandardConsolaReporter.js.map +1 -0
  50. package/lib/consola/formatLogObject.js +66 -146
  51. package/lib/consola/formatLogObject.js.map +1 -0
  52. package/lib/consola/formatLogObject.test.js +184 -0
  53. package/lib/consola/index.js +1 -0
  54. package/lib/consola/index.js.map +1 -0
  55. package/lib/data/formatSort.js +6 -5
  56. package/lib/data/formatSort.js.map +1 -0
  57. package/lib/data/index.js +1 -0
  58. package/lib/data/index.js.map +1 -0
  59. package/lib/data/maybeNumber.js +6 -8
  60. package/lib/data/maybeNumber.js.map +1 -0
  61. package/lib/data/parseSort.js +22 -28
  62. package/lib/data/parseSort.js.map +1 -0
  63. package/lib/data/resolvePagination.js +13 -17
  64. package/lib/data/resolvePagination.js.map +1 -0
  65. package/lib/data/types.d.js +2 -0
  66. package/lib/data/types.d.js.map +1 -0
  67. package/lib/dayjs/dayjs.js +21 -19
  68. package/lib/dayjs/dayjs.js.map +1 -0
  69. package/lib/dayjs/formatDuration.js +15 -14
  70. package/lib/dayjs/formatDuration.js.map +1 -0
  71. package/lib/dayjs/index.js +2 -0
  72. package/lib/dayjs/index.js.map +1 -0
  73. package/lib/dayjs/parseDuration.js +5 -8
  74. package/lib/dayjs/parseDuration.js.map +1 -0
  75. package/lib/dayjs/parseRelativeTime.js +90 -0
  76. package/lib/dayjs/parseRelativeTime.js.map +1 -0
  77. package/lib/dayjs/parseRelativeTime.test.js +247 -0
  78. package/lib/dayjs/resolveRelativeTime.js +87 -0
  79. package/lib/dayjs/resolveRelativeTime.js.map +1 -0
  80. package/lib/dayjs/resolveRelativeTime.test.js +310 -0
  81. package/lib/decimal/index.js +1 -0
  82. package/lib/decimal/index.js.map +1 -0
  83. package/lib/decimal/parseDecimal.js +3 -1
  84. package/lib/decimal/parseDecimal.js.map +1 -0
  85. package/lib/drain3/Drain.js +356 -0
  86. package/lib/drain3/Drain.js.map +1 -0
  87. package/lib/drain3/LogCluster.js +38 -0
  88. package/lib/drain3/LogCluster.js.map +1 -0
  89. package/lib/drain3/Node.js +39 -0
  90. package/lib/drain3/Node.js.map +1 -0
  91. package/lib/drain3/TemplateMiner.js +204 -0
  92. package/lib/drain3/TemplateMiner.js.map +1 -0
  93. package/lib/drain3/index.js +31 -0
  94. package/lib/drain3/index.js.map +1 -0
  95. package/lib/drain3/persistence/FilePersistence.js +24 -0
  96. package/lib/drain3/persistence/FilePersistence.js.map +1 -0
  97. package/lib/drain3/persistence/MemoryPersistence.js +18 -0
  98. package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
  99. package/lib/drain3/persistence/PersistenceHandler.js +5 -0
  100. package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
  101. package/lib/drain3/types.js +7 -0
  102. package/lib/drain3/types.js.map +1 -0
  103. package/lib/emittery/emitter.js +10 -0
  104. package/lib/emittery/emitter.js.map +1 -0
  105. package/lib/emittery/index.js +2 -0
  106. package/lib/emittery/index.js.map +1 -0
  107. package/lib/foundation/schema/SexType.js +5 -3
  108. package/lib/foundation/schema/SexType.js.map +1 -0
  109. package/lib/foundation/schema/index.js +1 -0
  110. package/lib/foundation/schema/index.js.map +1 -0
  111. package/lib/foundation/schema/parseSexType.js +1 -0
  112. package/lib/foundation/schema/parseSexType.js.map +1 -0
  113. package/lib/foundation/schema/types.js +4 -2
  114. package/lib/foundation/schema/types.js.map +1 -0
  115. package/lib/fs/FileSystemError.js +23 -0
  116. package/lib/fs/FileSystemError.js.map +1 -0
  117. package/lib/fs/IFileSystem.d.js +3 -0
  118. package/lib/fs/IFileSystem.d.js.map +1 -0
  119. package/lib/fs/MemoryFileSystem.test.js +188 -0
  120. package/lib/fs/createBrowserFileSystem.js +250 -0
  121. package/lib/fs/createBrowserFileSystem.js.map +1 -0
  122. package/lib/fs/createMemoryFileSystem.js +517 -0
  123. package/lib/fs/createMemoryFileSystem.js.map +1 -0
  124. package/lib/fs/createSandboxFileSystem.js +108 -0
  125. package/lib/fs/createSandboxFileSystem.js.map +1 -0
  126. package/lib/fs/createWebDavFileSystem.js +154 -0
  127. package/lib/fs/createWebDavFileSystem.js.map +1 -0
  128. package/lib/fs/createWebFileSystem.js +225 -0
  129. package/lib/fs/createWebFileSystem.js.map +1 -0
  130. package/lib/fs/findMimeType.js +17 -0
  131. package/lib/fs/findMimeType.js.map +1 -0
  132. package/lib/fs/index.js +8 -0
  133. package/lib/fs/index.js.map +1 -0
  134. package/lib/fs/minio/createMinioFileSystem.js +974 -0
  135. package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
  136. package/lib/fs/minio/index.js +2 -0
  137. package/lib/fs/minio/index.js.map +1 -0
  138. package/lib/fs/orpc/FileSystemContract.js +93 -0
  139. package/lib/fs/orpc/FileSystemContract.js.map +1 -0
  140. package/lib/fs/orpc/createContractClientFileSystem.js +93 -0
  141. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -0
  142. package/lib/fs/orpc/index.js +3 -0
  143. package/lib/fs/orpc/index.js.map +1 -0
  144. package/lib/fs/orpc/server/createFileSystemContractImpl.js +63 -0
  145. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -0
  146. package/lib/fs/orpc/server/index.js +2 -0
  147. package/lib/fs/orpc/server/index.js.map +1 -0
  148. package/lib/fs/s3/createS3MiniFileSystem.js +753 -0
  149. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -0
  150. package/lib/fs/s3/index.js +2 -0
  151. package/lib/fs/s3/index.js.map +1 -0
  152. package/lib/fs/s3/s3mini.test.js +584 -0
  153. package/lib/fs/scandir.js +59 -0
  154. package/lib/fs/scandir.js.map +1 -0
  155. package/lib/fs/server/createDatabaseFileSystem.js +750 -0
  156. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -0
  157. package/lib/fs/server/createNodeFileSystem.js +426 -0
  158. package/lib/fs/server/createNodeFileSystem.js.map +1 -0
  159. package/lib/fs/server/dbfs.test.js +221 -0
  160. package/lib/fs/server/index.js +2 -0
  161. package/lib/fs/server/index.js.map +1 -0
  162. package/lib/fs/server/loadTestDatabase.js +127 -0
  163. package/lib/fs/server/loadTestDatabase.js.map +1 -0
  164. package/lib/fs/tests/runFileSystemTest.js +319 -0
  165. package/lib/fs/tests/runFileSystemTest.js.map +1 -0
  166. package/lib/fs/types.js +27 -0
  167. package/lib/fs/types.js.map +1 -0
  168. package/lib/fs/utils/getFileUrl.js +35 -0
  169. package/lib/fs/utils/getFileUrl.js.map +1 -0
  170. package/lib/fs/utils.js +22 -0
  171. package/lib/fs/utils.js.map +1 -0
  172. package/lib/fs/webdav/index.js +2 -0
  173. package/lib/fs/webdav/index.js.map +1 -0
  174. package/lib/index.js +1 -0
  175. package/lib/index.js.map +1 -0
  176. package/lib/jsonschema/JsonSchema.js +146 -172
  177. package/lib/jsonschema/JsonSchema.js.map +1 -0
  178. package/lib/jsonschema/forEachJsonSchema.js +44 -0
  179. package/lib/jsonschema/forEachJsonSchema.js.map +1 -0
  180. package/lib/jsonschema/index.js +2 -0
  181. package/lib/jsonschema/index.js.map +1 -0
  182. package/lib/jsonschema/types.d.js +2 -0
  183. package/lib/jsonschema/types.d.js.map +1 -0
  184. package/lib/meta/defineFileType.js +20 -103
  185. package/lib/meta/defineFileType.js.map +1 -0
  186. package/lib/meta/defineInit.js +31 -250
  187. package/lib/meta/defineInit.js.map +1 -0
  188. package/lib/meta/defineMetadata.js +24 -140
  189. package/lib/meta/defineMetadata.js.map +1 -0
  190. package/lib/meta/index.js +1 -0
  191. package/lib/meta/index.js.map +1 -0
  192. package/lib/orpc/createOpenApiContractClient.js +27 -0
  193. package/lib/orpc/createOpenApiContractClient.js.map +1 -0
  194. package/lib/orpc/createRpcContractClient.js +34 -0
  195. package/lib/orpc/createRpcContractClient.js.map +1 -0
  196. package/lib/orpc/index.js +3 -0
  197. package/lib/orpc/index.js.map +1 -0
  198. package/lib/orpc/resolveLinkPlugins.js +28 -0
  199. package/lib/orpc/resolveLinkPlugins.js.map +1 -0
  200. package/lib/password/PHC.js +63 -87
  201. package/lib/password/PHC.js.map +1 -0
  202. package/lib/password/PHC.test.js +11 -3
  203. package/lib/password/Password.js +29 -294
  204. package/lib/password/Password.js.map +1 -0
  205. package/lib/password/Password.test.js +35 -22
  206. package/lib/password/createArgon2PasswordAlgorithm.js +35 -191
  207. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
  208. package/lib/password/createBase64PasswordAlgorithm.js +8 -141
  209. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
  210. package/lib/password/createBcryptPasswordAlgorithm.js +13 -168
  211. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
  212. package/lib/password/createPBKDF2PasswordAlgorithm.js +46 -228
  213. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
  214. package/lib/password/createScryptPasswordAlgorithm.js +55 -211
  215. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
  216. package/lib/password/index.js +1 -0
  217. package/lib/password/index.js.map +1 -0
  218. package/lib/password/server/index.js +1 -0
  219. package/lib/password/server/index.js.map +1 -0
  220. package/lib/resource/Identifiable.js +2 -0
  221. package/lib/resource/Identifiable.js.map +1 -0
  222. package/lib/resource/ListQuery.js +21 -93
  223. package/lib/resource/ListQuery.js.map +1 -0
  224. package/lib/resource/getTitleOfResource.js +3 -5
  225. package/lib/resource/getTitleOfResource.js.map +1 -0
  226. package/lib/resource/index.js +1 -0
  227. package/lib/resource/index.js.map +1 -0
  228. package/lib/resource/schema/AnyResourceSchema.js +2 -1
  229. package/lib/resource/schema/AnyResourceSchema.js.map +1 -0
  230. package/lib/resource/schema/BaseResourceSchema.js +2 -1
  231. package/lib/resource/schema/BaseResourceSchema.js.map +1 -0
  232. package/lib/resource/schema/ResourceActionType.js +6 -4
  233. package/lib/resource/schema/ResourceActionType.js.map +1 -0
  234. package/lib/resource/schema/ResourceStatus.js +5 -3
  235. package/lib/resource/schema/ResourceStatus.js.map +1 -0
  236. package/lib/resource/schema/ResourceType.js +5 -3
  237. package/lib/resource/schema/ResourceType.js.map +1 -0
  238. package/lib/resource/schema/index.js +1 -0
  239. package/lib/resource/schema/index.js.map +1 -0
  240. package/lib/resource/schema/types.js +16 -20
  241. package/lib/resource/schema/types.js.map +1 -0
  242. package/lib/s3/formatS3Url.js +65 -0
  243. package/lib/s3/formatS3Url.js.map +1 -0
  244. package/lib/s3/formatS3Url.test.js +262 -0
  245. package/lib/s3/index.js +3 -0
  246. package/lib/s3/index.js.map +1 -0
  247. package/lib/s3/parseS3Url.js +65 -0
  248. package/lib/s3/parseS3Url.js.map +1 -0
  249. package/lib/s3/parseS3Url.test.js +270 -0
  250. package/lib/schema/SchemaRegistry.js +38 -38
  251. package/lib/schema/SchemaRegistry.js.map +1 -0
  252. package/lib/schema/TypeSchema.d.js +2 -0
  253. package/lib/schema/TypeSchema.d.js.map +1 -0
  254. package/lib/schema/createSchemaData.js +26 -125
  255. package/lib/schema/createSchemaData.js.map +1 -0
  256. package/lib/schema/findJsonSchemaByPath.js +13 -36
  257. package/lib/schema/findJsonSchemaByPath.js.map +1 -0
  258. package/lib/schema/formatZodError.js +138 -0
  259. package/lib/schema/formatZodError.js.map +1 -0
  260. package/lib/schema/formatZodError.test.js +196 -0
  261. package/lib/schema/getSchemaCache.js +5 -5
  262. package/lib/schema/getSchemaCache.js.map +1 -0
  263. package/lib/schema/getSchemaOptions.js +8 -11
  264. package/lib/schema/getSchemaOptions.js.map +1 -0
  265. package/lib/schema/index.js +2 -1
  266. package/lib/schema/index.js.map +1 -0
  267. package/lib/schema/toJsonSchema.js +50 -293
  268. package/lib/schema/toJsonSchema.js.map +1 -0
  269. package/lib/schema/validate.js +34 -46
  270. package/lib/schema/validate.js.map +1 -0
  271. package/lib/tools/generateSchema.js +39 -197
  272. package/lib/tools/generateSchema.js.map +1 -0
  273. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +55 -143
  274. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
  275. package/lib/utils/buildBaseUrl.js +13 -0
  276. package/lib/utils/buildBaseUrl.js.map +1 -0
  277. package/lib/utils/buildRedactorFormSchema.js +59 -0
  278. package/lib/utils/buildRedactorFormSchema.js.map +1 -0
  279. package/lib/utils/getEstimateProcessTime.js +12 -11
  280. package/lib/utils/getEstimateProcessTime.js.map +1 -0
  281. package/lib/utils/index.js +3 -0
  282. package/lib/utils/index.js.map +1 -0
  283. package/lib/utils/resolveFeatureOptions.js +12 -0
  284. package/lib/utils/resolveFeatureOptions.js.map +1 -0
  285. package/package.json +80 -13
  286. package/src/ai/qwen3vl/index.ts +1 -0
  287. package/src/ai/qwen3vl/utils.ts +36 -0
  288. package/src/ai/vision/DocLayoutElementTypeSchema.ts +30 -0
  289. package/src/ai/vision/ImageAnnotationSchema.ts +60 -0
  290. package/src/ai/vision/index.ts +2 -0
  291. package/src/ai/vision/resolveImageAnnotation.ts +135 -0
  292. package/src/cn/ChineseResidentIdNo.test.ts +1 -1
  293. package/src/cn/ChineseResidentIdNo.ts +9 -1
  294. package/src/cn/DivisionCode.test.ts +1 -1
  295. package/src/cn/DivisionCode.ts +8 -0
  296. package/src/cn/Mod11.ts +1 -1
  297. package/src/cn/UnifiedSocialCreditCode.test.ts +1 -1
  298. package/src/cn/UnifiedSocialCreditCode.ts +15 -0
  299. package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
  300. package/src/cn/formatChineseAmount.ts +61 -0
  301. package/src/cn/index.ts +7 -1
  302. package/src/cn/parseChineseNumber.test.ts +159 -0
  303. package/src/cn/parseChineseNumber.ts +97 -0
  304. package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
  305. package/src/cn/pinyin/cartesianProduct.ts +24 -0
  306. package/src/cn/pinyin/data.json +23573 -0
  307. package/src/cn/pinyin/loader.ts +12 -0
  308. package/src/cn/pinyin/preload.ts +3 -0
  309. package/src/cn/pinyin/toPinyin.test.ts +12 -0
  310. package/src/cn/pinyin/toPinyinPure.ts +43 -0
  311. package/src/cn/pinyin/transform.ts +12 -0
  312. package/src/consola/formatLogObject.test.ts +27 -0
  313. package/src/consola/formatLogObject.ts +40 -12
  314. package/src/data/maybeNumber.ts +1 -1
  315. package/src/data/parseSort.test.ts +0 -1
  316. package/src/data/types.d.ts +2 -2
  317. package/src/dayjs/dayjs.ts +18 -18
  318. package/src/dayjs/formatDuration.ts +2 -2
  319. package/src/dayjs/index.ts +3 -1
  320. package/src/dayjs/parseRelativeTime.test.ts +185 -0
  321. package/src/dayjs/parseRelativeTime.ts +115 -0
  322. package/src/dayjs/resolveRelativeTime.test.ts +357 -0
  323. package/src/dayjs/resolveRelativeTime.ts +164 -0
  324. package/src/drain3/Drain.test.ts +378 -0
  325. package/src/drain3/Drain.ts +394 -0
  326. package/src/drain3/LogCluster.ts +46 -0
  327. package/src/drain3/Node.ts +53 -0
  328. package/src/drain3/TemplateMiner.ts +246 -0
  329. package/src/drain3/index.ts +36 -0
  330. package/src/drain3/persistence/FilePersistence.ts +24 -0
  331. package/src/drain3/persistence/MemoryPersistence.ts +23 -0
  332. package/src/drain3/persistence/PersistenceHandler.ts +19 -0
  333. package/src/drain3/types.ts +75 -0
  334. package/src/emittery/emitter.ts +9 -0
  335. package/src/emittery/index.ts +1 -0
  336. package/src/fs/FileSystemError.ts +26 -0
  337. package/src/fs/IFileSystem.d.ts +101 -0
  338. package/src/fs/MemoryFileSystem.test.ts +37 -0
  339. package/src/fs/createBrowserFileSystem.ts +293 -0
  340. package/src/fs/createMemoryFileSystem.ts +600 -0
  341. package/src/fs/createSandboxFileSystem.ts +136 -0
  342. package/src/fs/createWebDavFileSystem.ts +190 -0
  343. package/src/fs/createWebFileSystem.ts +242 -0
  344. package/src/fs/findMimeType.ts +20 -0
  345. package/src/fs/index.ts +8 -0
  346. package/src/fs/minio/createMinioFileSystem.ts +1148 -0
  347. package/src/fs/minio/index.ts +1 -0
  348. package/src/fs/orpc/FileSystemContract.ts +92 -0
  349. package/src/fs/orpc/createContractClientFileSystem.ts +115 -0
  350. package/src/fs/orpc/index.ts +2 -0
  351. package/src/fs/orpc/server/createFileSystemContractImpl.ts +64 -0
  352. package/src/fs/orpc/server/index.ts +1 -0
  353. package/src/fs/s3/createS3MiniFileSystem.ts +871 -0
  354. package/src/fs/s3/index.ts +1 -0
  355. package/src/fs/s3/s3fs.test.ts +441 -0
  356. package/src/fs/s3/s3mini.test.ts +264 -0
  357. package/src/fs/scandir.ts +75 -0
  358. package/src/fs/server/createDatabaseFileSystem.ts +668 -0
  359. package/src/fs/server/createNodeFileSystem.ts +518 -0
  360. package/src/fs/server/dbfs.test.ts +48 -0
  361. package/src/fs/server/index.ts +1 -0
  362. package/src/fs/server/loadTestDatabase.ts +131 -0
  363. package/src/fs/tests/runFileSystemTest.ts +289 -0
  364. package/src/fs/types.ts +29 -0
  365. package/src/fs/utils/getFileUrl.ts +44 -0
  366. package/src/fs/utils.ts +23 -0
  367. package/src/fs/webdav/index.ts +1 -0
  368. package/src/jsonschema/JsonSchema.ts +118 -110
  369. package/src/jsonschema/forEachJsonSchema.ts +50 -0
  370. package/src/jsonschema/index.ts +1 -0
  371. package/src/jsonschema/types.d.ts +1 -1
  372. package/src/meta/defineMetadata.ts +1 -1
  373. package/src/orpc/createOpenApiContractClient.ts +52 -0
  374. package/src/orpc/createRpcContractClient.ts +50 -0
  375. package/src/orpc/index.ts +2 -0
  376. package/src/orpc/resolveLinkPlugins.ts +29 -0
  377. package/src/password/PHC.ts +6 -6
  378. package/src/password/Password.test.ts +1 -1
  379. package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
  380. package/src/password/createBase64PasswordAlgorithm.ts +2 -2
  381. package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
  382. package/src/password/createPBKDF2PasswordAlgorithm.ts +4 -4
  383. package/src/password/createScryptPasswordAlgorithm.ts +4 -4
  384. package/src/resource/ListQuery.ts +4 -1
  385. package/src/resource/index.ts +2 -2
  386. package/src/resource/schema/AnyResourceSchema.ts +16 -2
  387. package/src/s3/formatS3Url.test.ts +254 -0
  388. package/src/s3/formatS3Url.ts +84 -0
  389. package/src/s3/index.ts +2 -0
  390. package/src/s3/parseS3Url.test.ts +258 -0
  391. package/src/s3/parseS3Url.ts +88 -0
  392. package/src/schema/SchemaRegistry.ts +35 -33
  393. package/src/schema/TypeSchema.d.ts +6 -6
  394. package/src/schema/createSchemaData.ts +4 -4
  395. package/src/schema/findJsonSchemaByPath.ts +4 -4
  396. package/src/schema/formatZodError.test.ts +197 -0
  397. package/src/schema/formatZodError.ts +139 -0
  398. package/src/schema/getSchemaOptions.ts +2 -2
  399. package/src/schema/index.ts +1 -1
  400. package/src/schema/toJsonSchema.ts +6 -6
  401. package/src/schema/validate.ts +1 -1
  402. package/src/utils/buildBaseUrl.ts +12 -0
  403. package/src/utils/buildRedactorFormSchema.ts +85 -0
  404. package/src/utils/index.ts +4 -0
  405. package/src/utils/resolveFeatureOptions.ts +14 -0
  406. package/src/cn/ChineseResidentIdNo.mod.ts +0 -7
  407. package/src/cn/DivisionCode.mod.ts +0 -7
  408. package/src/cn/UnifiedSocialCreditCode.mod.ts +0 -7
  409. package/src/cn/mod.ts +0 -3
  410. package/src/schema/SchemaRegistry.mod.ts +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/minio/createMinioFileSystem.ts"],"sourcesContent":["import { basename, dirname, normalize } from 'pathe';\nimport { PassThrough, Readable, type Writable } from 'node:stream';\nimport { parseS3Url, type ParseS3UrlOptions } from '@wener/common/s3';\nimport { Client } from 'minio';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileStat,\n\tIFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWriteFileOptions,\n} from '../IFileSystem';\n\nexport type CreateMinioFileSystemOptions = ParseS3UrlOptions & {\n\tclient?: Client;\n\t/**\n\t * Optional prefix to scope all operations within a specific folder in the bucket.\n\t * All file operations will be relative to this prefix.\n\t * Should not include leading or trailing slashes.\n\t * Example: 'data/uploads' or 'backups/2024'\n\t */\n\tprefix?: string;\n};\n\nexport function createMinioFileSystem(options: CreateMinioFileSystemOptions = {}): MinioFS {\n\tconst parsed = parseS3Url(options);\n\tif (!parsed) {\n\t\tthrow new Error('S3 URL or connection options are required');\n\t}\n\n\tconst { client, prefix } = options;\n\tif (!client && (!parsed.endpoint || !parsed.bucket)) {\n\t\tthrow new Error('S3 endpoint and bucket are required when client is not provided');\n\t}\n\n\tlet minioClient: Client;\n\tlet bucket: string;\n\n\tif (client) {\n\t\tminioClient = client;\n\t\tbucket = parsed.bucket || '';\n\t} else {\n\t\tbucket = parsed.bucket || '';\n\n\t\t// Import Minio dynamically to avoid requiring it as a dependency\n\t\tminioClient = new Client({\n\t\t\tendPoint: parsed.endpoint,\n\t\t\tport: parsed.port,\n\t\t\tuseSSL: parsed.useSsl ?? true,\n\t\t\taccessKey: parsed.accessKeyId || '',\n\t\t\tsecretKey: parsed.secretAccessKey || '',\n\t\t\tregion: parsed.region,\n\t\t\tpathStyle: parsed.pathStyle,\n\t\t});\n\t}\n\n\t// Normalize prefix: remove leading/trailing slashes\n\tconst normalizedPrefix = prefix ? prefix.replace(/^\\/+/, '').replace(/\\/+$/, '') : '';\n\n\treturn new MinioFS(minioClient, bucket, normalizedPrefix);\n}\n\nclass MinioFS implements IFileSystem {\n\tconstructor(\n\t\tprivate readonly client: Client,\n\t\tprivate readonly bucket: string,\n\t\tprivate readonly prefix: string = '',\n\t) {}\n\n\t/**\n\t * Normalize path to S3 key format (remove leading slash, handle relative paths)\n\t * and prepend the prefix if one is set\n\t */\n\tprivate normalizeKey(path: string): string {\n\t\tif (!path || path === '/') {\n\t\t\treturn this.prefix;\n\t\t}\n\t\tconst normalized = normalize(path).replace(/^\\/+/, '').replace(/\\\\/g, '/');\n\n\t\t// Prepend prefix if set\n\t\tif (this.prefix) {\n\t\t\treturn this.prefix + '/' + normalized;\n\t\t}\n\t\treturn normalized;\n\t}\n\n\t/**\n\t * Remove prefix from S3 key to get the file system path\n\t */\n\tprivate stripPrefix(key: string): string {\n\t\tif (!key) {\n\t\t\treturn '/';\n\t\t}\n\t\t// If key is just the prefix (or empty after stripping), return root\n\t\tif (this.prefix && key === this.prefix) {\n\t\t\treturn '/';\n\t\t}\n\t\tif (!this.prefix || !key.startsWith(this.prefix + '/')) {\n\t\t\treturn key.startsWith('/') ? key : '/' + key;\n\t\t}\n\t\tconst withoutPrefix = key.slice(this.prefix.length);\n\t\treturn withoutPrefix || '/';\n\t}\n\n\t/**\n\t * Convert S3 key back to file system path (strip prefix and add leading slash)\n\t */\n\tprivate keyToPath(key: string): string {\n\t\tif (!key) {\n\t\t\treturn '/';\n\t\t}\n\t\treturn this.stripPrefix(key);\n\t}\n\n\t/**\n\t * Get directory path from a key\n\t */\n\tprivate getDirectory(key: string): string {\n\t\tif (!key) {\n\t\t\treturn '/';\n\t\t}\n\t\tconst dir = dirname(key).replace(/\\\\/g, '/');\n\t\treturn dir === '.' ? '/' : '/' + dir;\n\t}\n\n\t/**\n\t * Check if a key represents a directory (ends with /)\n\t */\n\tprivate isDirectoryKey(key: string): boolean {\n\t\treturn key.endsWith('/');\n\t}\n\n\t/**\n\t * Convert MinIO object metadata to IFileStat\n\t */\n\tprivate toFileStat(key: string, obj: { name: string; size: number; lastModified: Date; etag?: string }): IFileStat {\n\t\tconst isDir = this.isDirectoryKey(key);\n\t\tconst path = this.keyToPath(key);\n\t\tconst directory = this.getDirectory(key);\n\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tpath,\n\t\t\tname: isDir ? basename(key.slice(0, -1)) || basename(directory) || '/' : basename(key),\n\t\t\tkind: isDir ? 'directory' : 'file',\n\t\t\tmtime: obj.lastModified ? new Date(obj.lastModified).getTime() : Date.now(),\n\t\t\tsize: obj.size || 0,\n\t\t\tmeta: {\n\t\t\t\t...(obj.etag ? { etag: obj.etag.replace(/\"/g, '') } : {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate checkAborted(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error('The operation was aborted');\n\t\t}\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}): Promise<IFileStat[]> {\n\t\tconst { glob, recursive, depth = 1, kind, hidden = true, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst dirPrefix = this.normalizeKey(dir);\n\t\tconst prefixWithSlash = dirPrefix ? (dirPrefix.endsWith('/') ? dirPrefix : dirPrefix + '/') : '';\n\n\t\ttry {\n\t\t\t// MinIO listObjects supports recursive option\n\t\t\t// When recursive=false, MinIO uses delimiter='/' internally to return CommonPrefixes\n\t\t\tconst objects: Array<{ name: string; prefix?: string; size: number; lastModified: Date; etag: string }> = [];\n\t\t\tconst commonPrefixes: string[] = [];\n\n\t\t\t// MinIO listObjects returns a stream\n\t\t\t// When recursive=false, it returns both objects and prefixes (CommonPrefixes)\n\t\t\tconst objectStream = this.client.listObjects(this.bucket, prefixWithSlash, recursive);\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tobjectStream.on('data', (obj: any) => {\n\t\t\t\t\tif (obj.name) {\n\t\t\t\t\t\tobjects.push({\n\t\t\t\t\t\t\tname: obj.name,\n\t\t\t\t\t\t\tsize: obj.size || 0,\n\t\t\t\t\t\t\tlastModified: obj.lastModified || new Date(),\n\t\t\t\t\t\t\tetag: obj.etag || '',\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (obj.prefix) {\n\t\t\t\t\t\t// CommonPrefixes from MinIO\n\t\t\t\t\t\tcommonPrefixes.push(obj.prefix);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\tobjectStream.on('error', (err: any) => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet results: IFileStat[] = [];\n\n\t\t\t// Process CommonPrefixes (directories) first\n\t\t\tfor (const prefix of commonPrefixes) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\t// Skip if not under our prefix\n\t\t\t\tif (prefixWithSlash && !prefix.startsWith(prefixWithSlash)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Get relative path\n\t\t\t\tconst relativePrefix = prefixWithSlash ? prefix.slice(prefixWithSlash.length) : prefix;\n\t\t\t\tconst dirName = relativePrefix.replace(/\\/$/, ''); // Remove trailing slash\n\n\t\t\t\tif (!dirName) continue;\n\n\t\t\t\t// For non-recursive, only show immediate children\n\t\t\t\tif (!recursive && depth === 1) {\n\t\t\t\t\tconst firstSlash = dirName.indexOf('/');\n\t\t\t\t\tif (firstSlash >= 0) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst dirKey = prefix.endsWith('/') ? prefix : prefix + '/';\n\t\t\t\tconst stat = this.toFileStat(dirKey, {\n\t\t\t\t\tname: dirKey,\n\t\t\t\t\tsize: 0,\n\t\t\t\t\tlastModified: new Date(),\n\t\t\t\t});\n\n\t\t\t\t// Filter by hidden\n\t\t\t\tif (!hidden && stat.name.startsWith('.')) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter by kind\n\t\t\t\tif (kind && stat.kind !== kind) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tresults.push(stat);\n\t\t\t}\n\n\t\t\t// Process objects (files) to convert to IFileStat\n\t\t\tconst seenDirs = new Set<string>();\n\t\t\tfor (const obj of objects) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\tconst key = obj.name;\n\t\t\t\tif (!key) continue;\n\n\t\t\t\t// Skip if not under our prefix\n\t\t\t\tif (prefixWithSlash && !key.startsWith(prefixWithSlash)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Strip the prefix from the key for path conversion\n\t\t\t\tconst relativeKey = prefixWithSlash ? key.slice(prefixWithSlash.length) : key;\n\n\t\t\t\t// Calculate depth: count the number of slashes in the relative path\n\t\t\t\t// depth=1 means immediate children (no slashes), depth=2 means one level deep (one slash), etc.\n\t\t\t\tconst depthLevel = (relativeKey.match(/\\//g) || []).length + 1;\n\n\t\t\t\t// Filter by depth\n\t\t\t\tif (depthLevel > depth) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst isDir = this.isDirectoryKey(key);\n\n\t\t\t\t// Track directories to avoid duplicates\n\t\t\t\tif (isDir) {\n\t\t\t\t\tconst dirKey = key.slice(0, -1);\n\t\t\t\t\tif (seenDirs.has(dirKey)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tseenDirs.add(dirKey);\n\t\t\t\t} else {\n\t\t\t\t\t// For files in recursive mode, always include them\n\t\t\t\t\t// For non-recursive mode, check if parent directory was already added\n\t\t\t\t\tif (!recursive) {\n\t\t\t\t\t\tconst parentDir = dirname(key).replace(/\\\\/g, '/') + '/';\n\t\t\t\t\t\tif (seenDirs.has(parentDir.slice(0, -1))) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst stat = this.toFileStat(key, {\n\t\t\t\t\tname: key,\n\t\t\t\t\tsize: obj.size || 0,\n\t\t\t\t\tlastModified: obj.lastModified,\n\t\t\t\t\tetag: obj.etag,\n\t\t\t\t});\n\n\t\t\t\t// Filter by hidden\n\t\t\t\tif (!hidden && stat.name.startsWith('.')) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter by kind\n\t\t\t\tif (kind && stat.kind !== kind) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tresults.push(stat);\n\t\t\t}\n\n\t\t\t// Handle recursive with depth > 1\n\t\t\tif (!recursive && depth > 1) {\n\t\t\t\tconst subdirs = results.filter((entry) => entry.kind === 'directory');\n\t\t\t\tfor (const subdir of subdirs) {\n\t\t\t\t\tthis.checkAborted(signal);\n\t\t\t\t\tconst maxDepth = depth - 1;\n\t\t\t\t\tif (maxDepth > 0) {\n\t\t\t\t\t\tconst subEntries = await this.readdir(subdir.path, {\n\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\tdepth: maxDepth,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults = [...results, ...subEntries];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle glob filtering\n\t\t\tif (glob) {\n\t\t\t\tconst { matcher } = await import('micromatch');\n\t\t\t\tconst match = matcher(glob);\n\t\t\t\tresults = results.filter((entry) => match(entry.path));\n\t\t\t}\n\n\t\t\treturn results;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'NoSuchKey' || error.message?.includes('404') || error.code === 'NotFound') {\n\t\t\t\tthrow new Error(`Directory not found: ${dir}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync stat(entry: string, options: StatOptions = {}): Promise<IFileStat> {\n\t\tconst { signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst key = this.normalizeKey(entry);\n\t\tif (!key) {\n\t\t\t// Root directory\n\t\t\treturn {\n\t\t\t\tdirectory: '/',\n\t\t\t\tpath: '/',\n\t\t\t\tname: '/',\n\t\t\t\tkind: 'directory',\n\t\t\t\tmtime: Date.now(),\n\t\t\t\tsize: 0,\n\t\t\t\tmeta: {},\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\t// Try to get object stat\n\t\t\tconst stat = await this.client.statObject(this.bucket, key);\n\t\t\treturn this.toFileStat(key, {\n\t\t\t\tname: key,\n\t\t\t\tsize: stat.size,\n\t\t\t\tlastModified: stat.lastModified,\n\t\t\t\tetag: stat.etag,\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\t// If object not found, try checking if it's a directory\n\t\t\tif (error.code === 'NotFound' || error.code === 'NoSuchKey') {\n\t\t\t\tconst dirKey = key.endsWith('/') ? key : key + '/';\n\t\t\t\ttry {\n\t\t\t\t\t// List objects with this prefix to check if it's a directory\n\t\t\t\t\tconst objectStream = this.client.listObjects(this.bucket, dirKey, false);\n\t\t\t\t\tlet hasObjects = false;\n\n\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\tobjectStream.on('data', () => {\n\t\t\t\t\t\t\thasObjects = true;\n\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tobjectStream.on('error', reject);\n\n\t\t\t\t\t\tif (signal) {\n\t\t\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (hasObjects) {\n\t\t\t\t\t\t// It's a directory\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tdirectory: this.getDirectory(key),\n\t\t\t\t\t\t\tpath: this.keyToPath(key),\n\t\t\t\t\t\t\tname: basename(key.replace(/\\/$/, '')) || '/',\n\t\t\t\t\t\t\tkind: 'directory',\n\t\t\t\t\t\t\tmtime: Date.now(),\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore listing errors\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`File not found: ${entry}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync mkdir(path: string, options: MkdirOptions = {}): Promise<void> {\n\t\tconst { recursive = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// In S3, directories don't actually exist - they're just prefixes\n\t\t// Optionally create a marker object (empty object with trailing slash)\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\treturn; // Root directory, nothing to do\n\t\t}\n\n\t\t// Ensure it ends with / to indicate directory\n\t\tconst dirKey = key.endsWith('/') ? key : key + '/';\n\n\t\t// Try to create a marker object (0-byte object)\n\t\ttry {\n\t\t\tconst stream = new PassThrough();\n\t\t\tstream.end();\n\t\t\tawait this.client.putObject(this.bucket, dirKey, stream, 0, {\n\t\t\t\t'Content-Type': 'application/x-directory',\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\t// If it already exists or we don't have permission, that's okay for mkdir\n\t\t\tif (error.code !== 'NoSuchBucket' && error.code !== 'AccessDenied') {\n\t\t\t\t// Ignore other errors for mkdir\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n\t\tconst { encoding = 'binary', signal, onDownloadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot read root directory');\n\t\t}\n\n\t\ttry {\n\t\t\t// MinIO getObject returns Promise<Readable>\n\t\t\tconst nodeStream = await this.client.getObject(this.bucket, key);\n\t\t\tconst chunks: Buffer[] = [];\n\t\t\tlet loaded = 0;\n\t\t\tlet total = 0;\n\n\t\t\t// Get object size for progress if available\n\t\t\ttry {\n\t\t\t\tconst stat = await this.client.statObject(this.bucket, key);\n\t\t\t\ttotal = stat.size;\n\t\t\t} catch {\n\t\t\t\t// Ignore if stat fails\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnodeStream.on('data', (chunk: Buffer) => {\n\t\t\t\t\tchunks.push(chunk);\n\t\t\t\t\tloaded += chunk.length;\n\t\t\t\t\tif (onDownloadProgress) {\n\t\t\t\t\t\tonDownloadProgress({ loaded, total: total || -1 });\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tnodeStream.on('end', () => {\n\t\t\t\t\tconst buffer = Buffer.concat(chunks);\n\t\t\t\t\tif (encoding === 'text') {\n\t\t\t\t\t\tresolve(buffer.toString('utf-8'));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(new Uint8Array(buffer));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tnodeStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tif (nodeStream.destroy) {\n\t\t\t\t\t\t\tnodeStream.destroy(new Error('The operation was aborted'));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'NoSuchKey' || error.code === 'NotFound') {\n\t\t\t\tthrow new Error(`File not found: ${path}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tdata: string | ArrayBuffer | ArrayBufferView<ArrayBufferLike> | ReadableStream | Buffer | Readable,\n\t\toptions: WriteFileOptions = {},\n\t): Promise<void> {\n\t\tconst { signal, overwrite = true, onUploadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot write to root directory');\n\t\t}\n\n\t\t// Check if file exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(path);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`File already exists: ${path}`);\n\t\t\t}\n\t\t}\n\n\t\t// Convert data to stream or buffer\n\t\tlet stream: Readable;\n\t\tlet size: number;\n\n\t\tif (data instanceof Readable) {\n\t\t\tstream = data;\n\t\t\tsize = 0; // Unknown size\n\t\t} else if (data instanceof ReadableStream) {\n\t\t\t// Convert Web ReadableStream to Node Readable\n\t\t\tstream = Readable.fromWeb(data as import('node:stream/web').ReadableStream);\n\t\t\tsize = 0;\n\t\t} else {\n\t\t\tlet buffer: Buffer;\n\t\t\tif (data instanceof ArrayBuffer) {\n\t\t\t\tbuffer = Buffer.from(data);\n\t\t\t} else if (Buffer.isBuffer(data)) {\n\t\t\t\tbuffer = data;\n\t\t\t} else if (typeof data === 'string') {\n\t\t\t\tbuffer = Buffer.from(data, 'utf-8');\n\t\t\t} else {\n\t\t\t\t// ArrayBufferView\n\t\t\t\tbuffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n\t\t\t}\n\n\t\t\tsize = buffer.length;\n\t\t\tstream = new Readable();\n\t\t\tstream.push(buffer);\n\t\t\tstream.push(null);\n\t\t}\n\n\t\t// Wrap stream for progress tracking if needed\n\t\tif (onUploadProgress) {\n\t\t\tlet loaded = 0;\n\t\t\tconst progressStream = new PassThrough();\n\t\t\tstream.on('data', (chunk: Buffer) => {\n\t\t\t\tloaded += chunk.length;\n\t\t\t\tonUploadProgress({ loaded, total: size || -1 });\n\t\t\t});\n\t\t\tstream.pipe(progressStream);\n\t\t\tstream = progressStream;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.client.putObject(this.bucket, key, stream, size);\n\t\t} catch (error: any) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync rm(path: string, options: RmOptions = {}): Promise<void> {\n\t\tconst { recursive = false, force = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot remove root directory');\n\t\t}\n\n\t\ttry {\n\t\t\tif (recursive) {\n\t\t\t\t// List all objects with this prefix\n\t\t\t\tconst prefix = key.endsWith('/') ? key : key + '/';\n\t\t\t\tconst objectStream = this.client.listObjects(this.bucket, prefix, true);\n\t\t\t\tconst keys: string[] = [];\n\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tobjectStream.on('data', (obj: any) => {\n\t\t\t\t\t\tif (obj.name) {\n\t\t\t\t\t\t\tkeys.push(obj.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\n\t\t\t\t\tobjectStream.on('error', reject);\n\n\t\t\t\t\tif (signal) {\n\t\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Delete all objects\n\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\tawait this.client.removeObjects(this.bucket, keys);\n\t\t\t\t}\n\n\t\t\t\t// Also delete the marker object if it exists\n\t\t\t\tconst markerKey = prefix;\n\t\t\t\ttry {\n\t\t\t\t\tawait this.client.removeObject(this.bucket, markerKey);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore if marker doesn't exist\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Delete single object\n\t\t\t\ttry {\n\t\t\t\t\tawait this.client.removeObject(this.bucket, key);\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Check if it's a directory with files\n\t\t\t\t\tif (error.code === 'NoSuchKey' || error.code === 'NotFound') {\n\t\t\t\t\t\tconst prefix = key.endsWith('/') ? key : key + '/';\n\t\t\t\t\t\tconst objectStream = this.client.listObjects(this.bucket, prefix, false);\n\t\t\t\t\t\tlet hasObjects = false;\n\n\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\tobjectStream.on('data', () => {\n\t\t\t\t\t\t\t\thasObjects = true;\n\t\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tobjectStream.on('error', () => {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (hasObjects) {\n\t\t\t\t\t\t\tif (!force) {\n\t\t\t\t\t\t\t\tthrow new Error('Directory not empty');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// If force, delete recursively\n\t\t\t\t\t\t\tconst recursiveStream = this.client.listObjects(this.bucket, prefix, true);\n\t\t\t\t\t\t\tconst keys: string[] = [];\n\t\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\trecursiveStream.on('data', (obj: any) => {\n\t\t\t\t\t\t\t\t\tif (obj.name) {\n\t\t\t\t\t\t\t\t\t\tkeys.push(obj.name);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\trecursiveStream.on('end', () => resolve());\n\t\t\t\t\t\t\t\trecursiveStream.on('error', () => resolve());\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\t\t\t\tawait this.client.removeObjects(this.bucket, keys);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Also try to remove the marker\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.client.removeObject(this.bucket, prefix);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// Ignore\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// File doesn't exist\n\t\t\t\t\t\t\tif (!force) {\n\t\t\t\t\t\t\t\tthrow new Error('File not found');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// If force, just return without error\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!force) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tif (force && (error.code === 'NoSuchKey' || error.code === 'NotFound')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (force && error.message === 'File not found') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options: RenameOptions = {}): Promise<void> {\n\t\tconst { signal, overwrite = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst oldKey = this.normalizeKey(oldPath);\n\t\tconst newKey = this.normalizeKey(newPath);\n\n\t\tif (!oldKey) {\n\t\t\tthrow new Error('Cannot rename root directory');\n\t\t}\n\n\t\t// Check if target exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(newPath);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`Destination already exists: ${newPath}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\t// Check if it's a directory (has objects with prefix)\n\t\t\tconst isDir = oldKey.endsWith('/');\n\t\t\tconst prefix = isDir ? oldKey : oldKey + '/';\n\n\t\t\tconst objectStream = this.client.listObjects(this.bucket, prefix, true);\n\t\t\tconst objects: Array<{ name: string }> = [];\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tobjectStream.on('data', (obj: any) => {\n\t\t\t\t\tif (obj.name) {\n\t\t\t\t\t\tobjects.push({ name: obj.name });\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\tobjectStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (objects.length > 0) {\n\t\t\t\t// It's a directory or has multiple objects, move all\n\t\t\t\tconst newPrefix = newKey.endsWith('/') ? newKey : newKey + '/';\n\n\t\t\t\t// Move all objects\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tobjects.map(async (obj) => {\n\t\t\t\t\t\tconst objKey = obj.name;\n\t\t\t\t\t\tif (!objKey) return;\n\n\t\t\t\t\t\tconst relativeKey = objKey.slice(prefix.length);\n\t\t\t\t\t\tconst newObjKey = newPrefix + relativeKey;\n\n\t\t\t\t\t\t// Copy then delete\n\t\t\t\t\t\t// MinIO copyObject signature: copyObject(bucketName, objectName, sourceObject)\n\t\t\t\t\t\t// sourceObject should be a string in format \"bucket/object\"\n\t\t\t\t\t\tawait this.client.copyObject(this.bucket, newObjKey, `${this.bucket}/${objKey}`);\n\t\t\t\t\t\tawait this.client.removeObject(this.bucket, objKey);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\t// Move marker object if it exists (skip if it's a directory marker with data)\n\t\t\t\ttry {\n\t\t\t\t\t// Check if it's a directory marker (ends with /)\n\t\t\t\t\tif (prefix.endsWith('/')) {\n\t\t\t\t\t\t// Try to copy the marker, but skip if it fails due to \"contains data payload\"\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.client.copyObject(this.bucket, newPrefix, `${this.bucket}/${prefix}`);\n\t\t\t\t\t\t\tawait this.client.removeObject(this.bucket, prefix);\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\t// If error is about data payload, just remove the old marker\n\t\t\t\t\t\t\t// Directory markers are optional in S3\n\t\t\t\t\t\t\tif (error.message?.includes('data payload') || error.code === 'InvalidRequest') {\n\t\t\t\t\t\t\t\tawait this.client.removeObject(this.bucket, prefix);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.client.copyObject(this.bucket, newPrefix, `${this.bucket}/${prefix}`);\n\t\t\t\t\t\tawait this.client.removeObject(this.bucket, prefix);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore if marker doesn't exist\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Single file - copy then delete\n\t\t\t\tawait this.client.copyObject(this.bucket, newKey, `${this.bucket}/${oldKey}`);\n\t\t\t\tawait this.client.removeObject(this.bucket, oldKey);\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'NoSuchKey' || error.code === 'NotFound') {\n\t\t\t\tthrow new Error(`Source file not found: ${oldPath}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst key = this.normalizeKey(path);\n\t\t\tif (!key) {\n\t\t\t\treturn true; // Root always exists\n\t\t\t}\n\n\t\t\tawait this.client.statObject(this.bucket, key);\n\t\t\treturn true;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'NotFound' || error.code === 'NoSuchKey') {\n\t\t\t\t// Check if it's a directory\n\t\t\t\tconst key = this.normalizeKey(path);\n\t\t\t\tconst dirKey = key.endsWith('/') ? key : key + '/';\n\t\t\t\ttry {\n\t\t\t\t\tconst objectStream = this.client.listObjects(this.bucket, dirKey, false);\n\t\t\t\t\tlet hasObjects = false;\n\n\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\tobjectStream.on('data', () => {\n\t\t\t\t\t\t\thasObjects = true;\n\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tobjectStream.on('error', () => {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\treturn hasObjects;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync copy(src: string, dest: string, options: CopyOptions = {}): Promise<void> {\n\t\tconst { signal, overwrite = true, shallow = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst srcKey = this.normalizeKey(src);\n\t\tconst destKey = this.normalizeKey(dest);\n\n\t\tif (!srcKey) {\n\t\t\tthrow new Error('Cannot copy root directory');\n\t\t}\n\n\t\t// Check if source exists\n\t\ttry {\n\t\t\tconst srcStat = await this.stat(src);\n\n\t\t\t// Check if destination exists and overwrite is false\n\t\t\tif (!overwrite) {\n\t\t\t\tconst exists = await this.exists(dest);\n\t\t\t\tif (exists) {\n\t\t\t\t\tthrow new Error(`Destination already exists: ${dest}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (srcStat.kind === 'directory') {\n\t\t\t\t// Copy directory recursively\n\t\t\t\tconst srcPrefix = srcKey.endsWith('/') ? srcKey : srcKey + '/';\n\t\t\t\tconst destPrefix = destKey.endsWith('/') ? destKey : destKey + '/';\n\n\t\t\t\tconst objectStream = this.client.listObjects(this.bucket, srcPrefix, !shallow);\n\t\t\t\tconst objects: Array<{ name: string }> = [];\n\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tobjectStream.on('data', (obj: any) => {\n\t\t\t\t\t\tif (obj.name) {\n\t\t\t\t\t\t\tobjects.push({ name: obj.name });\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tobjectStream.on('end', () => {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\n\t\t\t\t\tobjectStream.on('error', reject);\n\n\t\t\t\t\tif (signal) {\n\t\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t\tobjectStream.destroy();\n\t\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Copy all objects\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tobjects.map(async (obj: { name: string }) => {\n\t\t\t\t\t\tconst objKey = obj.name;\n\t\t\t\t\t\tif (!objKey) return;\n\n\t\t\t\t\t\tconst relativeKey = objKey.slice(srcPrefix.length);\n\t\t\t\t\t\tconst newObjKey = destPrefix + relativeKey;\n\n\t\t\t\t\t\tawait this.client.copyObject(this.bucket, newObjKey, `${this.bucket}/${objKey}`);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\t// Copy marker object if it exists (skip if it's a directory marker with data)\n\t\t\t\ttry {\n\t\t\t\t\t// Check if it's a directory marker (ends with /)\n\t\t\t\t\tif (srcPrefix.endsWith('/')) {\n\t\t\t\t\t\t// Try to copy the marker, but skip if it fails due to \"contains data payload\"\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.client.copyObject(this.bucket, destPrefix, `${this.bucket}/${srcPrefix}`);\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\t// If error is about data payload, just skip copying the marker\n\t\t\t\t\t\t\t// Directory markers are optional in S3\n\t\t\t\t\t\t\tif (!error.message?.includes('data payload') && error.code !== 'InvalidRequest') {\n\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.client.copyObject(this.bucket, destPrefix, `${this.bucket}/${srcPrefix}`);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore if marker doesn't exist\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Copy single file\n\t\t\t\tawait this.client.copyObject(this.bucket, destKey, `${this.bucket}/${srcKey}`);\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'NoSuchKey' || error.code === 'NotFound') {\n\t\t\t\tthrow new Error(`Source file not found: ${src}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tcreateReadStream(path: string, options: CreateReadStreamOptions = {}): Readable {\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot read root directory');\n\t\t}\n\n\t\tconst { range, signal } = options;\n\n\t\t// MinIO getObject and getPartialObject both return Promise<Readable>\n\t\t// Create a Readable stream that waits for the promise to resolve\n\t\tconst client = this.client;\n\t\tconst bucket = this.bucket;\n\t\tconst readable = new Readable({\n\t\t\tasync read() {\n\t\t\t\t// Only initialize once\n\t\t\t\tif ((readable as any)._initialized) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(readable as any)._initialized = true;\n\n\t\t\t\ttry {\n\t\t\t\t\tlet nodeStream: Readable;\n\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\t// Use getPartialObject for range requests\n\t\t\t\t\t\t// getPartialObject's length parameter: number of bytes to read (not end position)\n\t\t\t\t\t\t// So for range {start: 0, end: 4}, we need length = end - start + 1 = 5\n\t\t\t\t\t\tconst length = range.end !== undefined ? range.end - range.start + 1 : undefined;\n\t\t\t\t\t\tnodeStream = await client.getPartialObject(bucket, key, range.start, length);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnodeStream = await client.getObject(bucket, key);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Pipe the actual stream to our readable\n\t\t\t\t\tnodeStream.on('data', (chunk) => {\n\t\t\t\t\t\tif (!readable.push(chunk)) {\n\t\t\t\t\t\t\t// If push returns false, the stream is backpressured\n\t\t\t\t\t\t\tnodeStream.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tnodeStream.on('end', () => {\n\t\t\t\t\t\treadable.push(null);\n\t\t\t\t\t});\n\n\t\t\t\t\tnodeStream.on('error', (err) => {\n\t\t\t\t\t\treadable.emit('error', err);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (signal) {\n\t\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t\tif (nodeStream.destroy) {\n\t\t\t\t\t\t\t\tnodeStream.destroy(new Error('The operation was aborted'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treadable.emit('error', new Error('The operation was aborted'));\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\treadable.emit('error', error);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\treturn readable;\n\t}\n\n\tcreateReadableStream(path: string, options: CreateReadStreamOptions = {}): ReadableStream {\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot read root directory');\n\t\t}\n\n\t\tconst { range, signal } = options;\n\n\t\t// MinIO getObject and getPartialObject both return Promise<Readable>\n\t\tconst client = this.client;\n\t\tconst bucket = this.bucket;\n\t\treturn new ReadableStream({\n\t\t\tasync start(controller) {\n\t\t\t\ttry {\n\t\t\t\t\tlet nodeStream: Readable;\n\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\t// Use getPartialObject for range requests\n\t\t\t\t\t\t// getPartialObject's length parameter: number of bytes to read (not end position)\n\t\t\t\t\t\t// So for range {start: 0, end: 4}, we need length = end - start + 1 = 5\n\t\t\t\t\t\tconst length = range.end !== undefined ? range.end - range.start + 1 : undefined;\n\t\t\t\t\t\tnodeStream = await client.getPartialObject(bucket, key, range.start, length);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnodeStream = await client.getObject(bucket, key);\n\t\t\t\t\t}\n\n\t\t\t\t\tnodeStream.on('data', (chunk) => {\n\t\t\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t\t\t});\n\n\t\t\t\t\tnodeStream.on('end', () => {\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t});\n\n\t\t\t\t\tnodeStream.on('error', (err) => {\n\t\t\t\t\t\tcontroller.error(err);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (signal) {\n\t\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t\tif (nodeStream.destroy) {\n\t\t\t\t\t\t\t\tnodeStream.destroy(new Error('The operation was aborted'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontroller.error(new Error('The operation was aborted'));\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\tcontroller.error(error);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\tcreateWriteStream(path: string, options?: CreateWriteStreamOptions): Writable {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tcreateWritableStream(path: string, options: CreateWriteStreamOptions = {}): WritableStream {\n\t\tconst key = this.normalizeKey(path);\n\t\tif (!key) {\n\t\t\tthrow new Error('Cannot write to root directory');\n\t\t}\n\n\t\tconst { signal, overwrite = true } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// Create a WritableStream that buffers data and uploads when done\n\t\tconst buffer: Uint8Array[] = [];\n\t\tlet controller: WritableStreamDefaultController;\n\t\tconst client = this.client;\n\t\tconst bucket = this.bucket;\n\t\tconst checkAborted = this.checkAborted.bind(this);\n\n\t\treturn new WritableStream({\n\t\t\tstart(ctrl) {\n\t\t\t\tcontroller = ctrl;\n\t\t\t},\n\t\t\tasync write(chunk) {\n\t\t\t\tbuffer.push(chunk);\n\t\t\t},\n\t\t\tasync close() {\n\t\t\t\ttry {\n\t\t\t\t\tcheckAborted(signal);\n\t\t\t\t\tconst data = Buffer.concat(buffer.map((chunk) => Buffer.from(chunk)));\n\t\t\t\t\tconst stream = new Readable();\n\t\t\t\t\tstream.push(data);\n\t\t\t\t\tstream.push(null);\n\t\t\t\t\tawait client.putObject(bucket, key, stream, data.length);\n\t\t\t\t\t// Controller closes automatically when close() completes successfully\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcontroller.error(error);\n\t\t\t\t}\n\t\t\t},\n\t\t\tabort(reason) {\n\t\t\t\tbuffer.length = 0;\n\t\t\t\tcontroller.error(reason);\n\t\t\t},\n\t\t});\n\t}\n\n\tgetUrl(path: IFileStat | string, options?: any): string | undefined {\n\t\tif (typeof path === 'object' && path?.kind !== 'file') {\n\t\t\treturn;\n\t\t}\n\t\tconst key = typeof path === 'string' ? this.normalizeKey(path) : this.normalizeKey(path.path);\n\t\tif (!key) {\n\t\t\treturn;\n\t\t}\n\n\t\t// MinIO supports presigned URLs, but getUrl is synchronous\n\t\t// We can't generate presigned URLs synchronously, so return undefined\n\t\t// For presigned URLs, users should use a separate method or await the promise\n\t\treturn undefined;\n\t}\n}\n"],"names":["basename","dirname","normalize","PassThrough","Readable","parseS3Url","Client","createMinioFileSystem","options","parsed","Error","client","prefix","endpoint","bucket","minioClient","endPoint","port","useSSL","useSsl","accessKey","accessKeyId","secretKey","secretAccessKey","region","pathStyle","normalizedPrefix","replace","MinioFS","normalizeKey","path","normalized","stripPrefix","key","startsWith","withoutPrefix","slice","length","keyToPath","getDirectory","dir","isDirectoryKey","endsWith","toFileStat","obj","isDir","directory","name","kind","mtime","lastModified","Date","getTime","now","size","meta","etag","checkAborted","signal","aborted","readdir","glob","recursive","depth","hidden","dirPrefix","prefixWithSlash","objects","commonPrefixes","objectStream","listObjects","Promise","resolve","reject","on","push","err","addEventListener","destroy","results","relativePrefix","dirName","firstSlash","indexOf","dirKey","stat","seenDirs","Set","relativeKey","depthLevel","match","has","add","parentDir","subdirs","filter","entry","subdir","maxDepth","subEntries","matcher","error","code","message","includes","statObject","hasObjects","mkdir","stream","end","putObject","readFile","encoding","onDownloadProgress","nodeStream","getObject","chunks","loaded","total","chunk","buffer","Buffer","concat","toString","Uint8Array","writeFile","data","overwrite","onUploadProgress","exists","ReadableStream","fromWeb","ArrayBuffer","from","isBuffer","byteOffset","byteLength","progressStream","pipe","rm","force","keys","removeObjects","markerKey","removeObject","recursiveStream","rename","oldPath","newPath","oldKey","newKey","newPrefix","all","map","objKey","newObjKey","copyObject","copy","src","dest","shallow","srcKey","destKey","srcStat","srcPrefix","destPrefix","createReadStream","range","readable","read","_initialized","undefined","start","getPartialObject","pause","emit","createReadableStream","controller","enqueue","close","createWriteStream","createWritableStream","bind","WritableStream","ctrl","write","abort","reason","getUrl"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createMinioFileSystem } from "./createMinioFileSystem.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/minio/index.ts"],"sourcesContent":["export { createMinioFileSystem, type CreateMinioFileSystemOptions } from './createMinioFileSystem';\n"],"names":["createMinioFileSystem"],"mappings":"AAAA,SAASA,qBAAqB,QAA2C,0BAA0B"}
@@ -0,0 +1,93 @@
1
+ import { oc } from "@orpc/contract";
2
+ import { z } from "zod/v4";
3
+ import { FileKindSchema } from "../types.js";
4
+ export const FileStatSchema = z.object({
5
+ directory: z.string(),
6
+ path: z.string(),
7
+ name: z.string(),
8
+ kind: FileKindSchema,
9
+ mtime: z.coerce.date(),
10
+ size: z.coerce.number().nonnegative().default(0),
11
+ meta: z.record(z.string(), z.any())
12
+ });
13
+ export const ReaddirInputSchema = z.object({
14
+ dir: z.string().nonempty(),
15
+ glob: z.string().optional(),
16
+ recursive: z.boolean().default(false),
17
+ depth: z.number().min(0).optional(),
18
+ kind: FileKindSchema.optional(),
19
+ cursor: z.string().optional(),
20
+ hidden: z.boolean().default(false)
21
+ });
22
+ const ReaddirOutputSchema = z.object({
23
+ data: FileStatSchema.array()
24
+ });
25
+ const StatInputSchema = z.object({
26
+ path: z.string()
27
+ });
28
+ const StatOutputSchema = z.object({
29
+ data: FileStatSchema
30
+ });
31
+ const CreateDirectoryInputSchema = z.object({
32
+ path: z.string(),
33
+ recursive: z.boolean().nullish()
34
+ });
35
+ const CreateDirectoryOutputSchema = z.object({}).default({});
36
+ const RenameInputSchema = z.object({
37
+ oldPath: z.string(),
38
+ newPath: z.string(),
39
+ overwrite: z.boolean().nullish()
40
+ });
41
+ const RenameOutputSchema = z.object({}).default({});
42
+ const ExistsInputSchema = z.object({
43
+ path: z.string()
44
+ });
45
+ const ExistsOutputSchema = z.object({
46
+ data: z.boolean()
47
+ });
48
+ const CopyInputSchema = z.object({
49
+ src: z.string(),
50
+ dest: z.string(),
51
+ overwrite: z.boolean().nullish(),
52
+ shallow: z.boolean().nullish()
53
+ });
54
+ const CopyOutputSchema = z.object({}).default({});
55
+ const ReadFileInputSchema = z.object({
56
+ path: z.string()
57
+ });
58
+ const ReadFileOutputSchema = z.object({
59
+ base64: z.string()
60
+ });
61
+ const WriteFileInputSchema = z.object({
62
+ path: z.string(),
63
+ base64: z.string(),
64
+ overwrite: z.boolean().optional()
65
+ });
66
+ const WriteFileOutputSchema = z.object({});
67
+ const RemoveInputSchema = z.object({
68
+ path: z.string(),
69
+ recursive: z.boolean().nullish(),
70
+ force: z.boolean().nullish()
71
+ });
72
+ const RemoveOutputSchema = z.object({}).default({});
73
+ export const FileSystemContract = {
74
+ readdir: oc.input(ReaddirInputSchema).output(ReaddirOutputSchema).route({
75
+ description: "List directory contents"
76
+ }),
77
+ stat: oc.input(StatInputSchema).output(StatOutputSchema).route({
78
+ method: "GET",
79
+ description: "Get file or directory status"
80
+ }),
81
+ mkdir: oc.input(CreateDirectoryInputSchema).output(CreateDirectoryOutputSchema).route({
82
+ description: "Create a directory"
83
+ }),
84
+ readFile: oc.input(ReadFileInputSchema).output(ReadFileOutputSchema).route({
85
+ description: "Read file"
86
+ }),
87
+ writeFile: oc.input(WriteFileInputSchema).output(WriteFileOutputSchema),
88
+ rename: oc.input(RenameInputSchema).output(RenameOutputSchema),
89
+ exists: oc.input(ExistsInputSchema).output(ExistsOutputSchema),
90
+ copy: oc.input(CopyInputSchema).output(CopyOutputSchema),
91
+ rm: oc.input(RemoveInputSchema).output(RemoveOutputSchema)
92
+ };
93
+ //# sourceMappingURL=FileSystemContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/orpc/FileSystemContract.ts"],"sourcesContent":["import { oc } from '@orpc/contract';\nimport { z } from 'zod/v4';\nimport { FileKindSchema } from '../types';\n\nexport type FileStat = z.infer<typeof FileStatSchema>;\nexport const FileStatSchema = z.object({\n\tdirectory: z.string(),\n\tpath: z.string(),\n\tname: z.string(),\n\tkind: FileKindSchema,\n\tmtime: z.coerce.date(),\n\tsize: z.coerce.number().nonnegative().default(0),\n\tmeta: z.record(z.string(), z.any()),\n});\nexport type ReaddirInput = z.infer<typeof ReaddirInputSchema>;\nexport const ReaddirInputSchema = z.object({\n\tdir: z.string().nonempty(),\n\tglob: z.string().optional(),\n\trecursive: z.boolean().default(false),\n\tdepth: z.number().min(0).optional(),\n\tkind: FileKindSchema.optional(),\n\tcursor: z.string().optional(),\n\thidden: z.boolean().default(false),\n});\nconst ReaddirOutputSchema = z.object({\n\tdata: FileStatSchema.array(),\n});\nconst StatInputSchema = z.object({\n\tpath: z.string(),\n});\nconst StatOutputSchema = z.object({\n\tdata: FileStatSchema,\n});\nconst CreateDirectoryInputSchema = z.object({\n\tpath: z.string(),\n\trecursive: z.boolean().nullish(),\n});\nconst CreateDirectoryOutputSchema = z.object({}).default({});\nconst RenameInputSchema = z.object({\n\toldPath: z.string(),\n\tnewPath: z.string(),\n\toverwrite: z.boolean().nullish(),\n});\nconst RenameOutputSchema = z.object({}).default({});\nconst ExistsInputSchema = z.object({\n\tpath: z.string(),\n});\nconst ExistsOutputSchema = z.object({\n\tdata: z.boolean(),\n});\nconst CopyInputSchema = z.object({\n\tsrc: z.string(),\n\tdest: z.string(),\n\toverwrite: z.boolean().nullish(),\n\tshallow: z.boolean().nullish(),\n});\nconst CopyOutputSchema = z.object({}).default({});\nconst ReadFileInputSchema = z.object({\n\tpath: z.string(),\n});\nconst ReadFileOutputSchema = z.object({\n\tbase64: z.string(),\n});\nconst WriteFileInputSchema = z.object({\n\tpath: z.string(),\n\tbase64: z.string(),\n\toverwrite: z.boolean().optional(),\n});\nconst WriteFileOutputSchema = z.object({});\nconst RemoveInputSchema = z.object({\n\tpath: z.string(),\n\trecursive: z.boolean().nullish(),\n\tforce: z.boolean().nullish(),\n});\nconst RemoveOutputSchema = z.object({}).default({});\nexport const FileSystemContract = {\n\treaddir: oc.input(ReaddirInputSchema).output(ReaddirOutputSchema).route({ description: 'List directory contents' }),\n\tstat: oc.input(StatInputSchema).output(StatOutputSchema).route({\n\t\tmethod: 'GET',\n\t\tdescription: 'Get file or directory status',\n\t}),\n\tmkdir: oc\n\t\t.input(CreateDirectoryInputSchema)\n\t\t.output(CreateDirectoryOutputSchema)\n\t\t.route({ description: 'Create a directory' }),\n\treadFile: oc.input(ReadFileInputSchema).output(ReadFileOutputSchema).route({ description: 'Read file' }),\n\twriteFile: oc.input(WriteFileInputSchema).output(WriteFileOutputSchema),\n\trename: oc.input(RenameInputSchema).output(RenameOutputSchema),\n\texists: oc.input(ExistsInputSchema).output(ExistsOutputSchema),\n\tcopy: oc.input(CopyInputSchema).output(CopyOutputSchema),\n\trm: oc.input(RemoveInputSchema).output(RemoveOutputSchema),\n};\n"],"names":["oc","z","FileKindSchema","FileStatSchema","object","directory","string","path","name","kind","mtime","coerce","date","size","number","nonnegative","default","meta","record","any","ReaddirInputSchema","dir","nonempty","glob","optional","recursive","boolean","depth","min","cursor","hidden","ReaddirOutputSchema","data","array","StatInputSchema","StatOutputSchema","CreateDirectoryInputSchema","nullish","CreateDirectoryOutputSchema","RenameInputSchema","oldPath","newPath","overwrite","RenameOutputSchema","ExistsInputSchema","ExistsOutputSchema","CopyInputSchema","src","dest","shallow","CopyOutputSchema","ReadFileInputSchema","ReadFileOutputSchema","base64","WriteFileInputSchema","WriteFileOutputSchema","RemoveInputSchema","force","RemoveOutputSchema","FileSystemContract","readdir","input","output","route","description","stat","method","mkdir","readFile","writeFile","rename","exists","copy","rm"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { ArrayBuffers } from "@wener/utils";
2
+ import { resolveData } from "../utils";
3
+ export function createContractClientFileSystem(client) {
4
+ return new ContractFS(client);
5
+ }
6
+ let ContractFS = class ContractFS {
7
+ client;
8
+ constructor(client){
9
+ this.client = client;
10
+ }
11
+ async readdir(dir, options = {}) {
12
+ const { data } = await this.client.readdir({
13
+ dir,
14
+ ...options
15
+ });
16
+ return data.map((stat)=>({
17
+ ...stat,
18
+ mtime: stat.mtime.getTime()
19
+ }));
20
+ }
21
+ async stat(entry, _options) {
22
+ const { data } = await this.client.stat({
23
+ path: entry
24
+ });
25
+ return {
26
+ ...data,
27
+ mtime: data.mtime.getTime()
28
+ };
29
+ }
30
+ async mkdir(path, options) {
31
+ await this.client.mkdir({
32
+ path,
33
+ recursive: options?.recursive
34
+ });
35
+ }
36
+ async readFile(path, options) {
37
+ // Note: The contract doesn't currently support encoding options.
38
+ const { base64 } = await this.client.readFile({
39
+ path
40
+ });
41
+ let enc = options?.encoding || 'binary';
42
+ let buf = ArrayBuffers.fromBase64(base64);
43
+ switch(enc){
44
+ case 'text':
45
+ return ArrayBuffers.toString(buf);
46
+ }
47
+ return buf;
48
+ }
49
+ async writeFile(path, data, options) {
50
+ let buf = resolveData(data);
51
+ await this.client.writeFile({
52
+ path,
53
+ base64: ArrayBuffers.toBase64(buf),
54
+ ...options
55
+ });
56
+ }
57
+ async rename(oldPath, newPath, options) {
58
+ await this.client.rename({
59
+ oldPath,
60
+ newPath,
61
+ overwrite: options?.overwrite
62
+ });
63
+ }
64
+ async exists(path) {
65
+ const { data } = await this.client.exists({
66
+ path
67
+ });
68
+ return data;
69
+ }
70
+ async copy(src, dest, options) {
71
+ await this.client.copy({
72
+ src,
73
+ dest,
74
+ overwrite: options?.overwrite,
75
+ shallow: options?.shallow
76
+ });
77
+ }
78
+ async rm(path, options) {
79
+ await this.client.rm({
80
+ path,
81
+ recursive: options?.recursive,
82
+ force: options?.force
83
+ });
84
+ }
85
+ createReadStream(_path, _options) {
86
+ throw new Error('createReadStream is not implemented in ContractFS');
87
+ }
88
+ createWriteStream(_path, _options) {
89
+ throw new Error('createWriteStream is not implemented in ContractFS');
90
+ }
91
+ };
92
+
93
+ //# sourceMappingURL=createContractClientFileSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/orpc/createContractClientFileSystem.ts"],"sourcesContent":["import type { Readable, Writable } from 'node:stream';\nimport type { ContractRouterClient } from '@orpc/contract';\nimport { ArrayBuffers } from '@wener/utils';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWritableData,\n\tWriteFileOptions,\n} from '../IFileSystem';\nimport { resolveData } from '../utils';\nimport type { FileSystemContract } from './FileSystemContract';\n\ntype FileSystemContractClient = ContractRouterClient<typeof FileSystemContract>;\n\nexport function createContractClientFileSystem(client: FileSystemContractClient): IFileSystem & {\n\tclient: FileSystemContractClient;\n} {\n\treturn new ContractFS(client);\n}\n\nclass ContractFS implements IFileSystem {\n\tclient: FileSystemContractClient;\n\n\tconstructor(client: FileSystemContractClient) {\n\t\tthis.client = client;\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}) {\n\t\tconst { data } = await this.client.readdir({ dir, ...options });\n\t\treturn data.map((stat) => ({\n\t\t\t...stat,\n\t\t\tmtime: stat.mtime.getTime(),\n\t\t}));\n\t}\n\n\tasync stat(entry: string, _options?: StatOptions) {\n\t\tconst { data } = await this.client.stat({ path: entry });\n\t\treturn {\n\t\t\t...data,\n\t\t\tmtime: data.mtime.getTime(),\n\t\t};\n\t}\n\n\tasync mkdir(path: string, options?: MkdirOptions) {\n\t\tawait this.client.mkdir({\n\t\t\tpath,\n\t\t\trecursive: options?.recursive,\n\t\t});\n\t}\n\n\treadFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\treadFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<string | Uint8Array> {\n\t\t// Note: The contract doesn't currently support encoding options.\n\t\tconst { base64 } = await this.client.readFile({ path });\n\t\tlet enc = options?.encoding || 'binary';\n\t\tlet buf = ArrayBuffers.fromBase64(base64);\n\t\tswitch (enc) {\n\t\t\tcase 'text':\n\t\t\t\treturn ArrayBuffers.toString(buf);\n\t\t}\n\t\treturn buf;\n\t}\n\n\tasync writeFile(path: string, data: WritableData, options?: WriteFileOptions) {\n\t\tlet buf = resolveData(data);\n\t\tawait this.client.writeFile({ path, base64: ArrayBuffers.toBase64(buf as BufferSource), ...options });\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options?: RenameOptions) {\n\t\tawait this.client.rename({\n\t\t\toldPath,\n\t\t\tnewPath,\n\t\t\toverwrite: options?.overwrite,\n\t\t});\n\t}\n\n\tasync exists(path: string) {\n\t\tconst { data } = await this.client.exists({ path });\n\t\treturn data;\n\t}\n\n\tasync copy(src: string, dest: string, options?: CopyOptions) {\n\t\tawait this.client.copy({\n\t\t\tsrc,\n\t\t\tdest,\n\t\t\toverwrite: options?.overwrite,\n\t\t\tshallow: options?.shallow,\n\t\t});\n\t}\n\n\tasync rm(path: string, options?: RmOptions) {\n\t\tawait this.client.rm({\n\t\t\tpath,\n\t\t\trecursive: options?.recursive,\n\t\t\tforce: options?.force,\n\t\t});\n\t}\n\n\tcreateReadStream(_path: string, _options?: CreateReadStreamOptions): Readable {\n\t\tthrow new Error('createReadStream is not implemented in ContractFS');\n\t}\n\n\tcreateWriteStream(_path: string, _options?: CreateWriteStreamOptions): Writable {\n\t\tthrow new Error('createWriteStream is not implemented in ContractFS');\n\t}\n}\n"],"names":["ArrayBuffers","resolveData","createContractClientFileSystem","client","ContractFS","readdir","dir","options","data","map","stat","mtime","getTime","entry","_options","path","mkdir","recursive","readFile","base64","enc","encoding","buf","fromBase64","toString","writeFile","toBase64","rename","oldPath","newPath","overwrite","exists","copy","src","dest","shallow","rm","force","createReadStream","_path","Error","createWriteStream"],"mappings":"AAEA,SAASA,YAAY,QAAQ,eAAe;AAe5C,SAASC,WAAW,QAAQ,WAAW;AAKvC,OAAO,SAASC,+BAA+BC,MAAgC;IAG9E,OAAO,IAAIC,WAAWD;AACvB;AAEA,IAAA,AAAMC,aAAN,MAAMA;IACLD,OAAiC;IAEjC,YAAYA,MAAgC,CAAE;QAC7C,IAAI,CAACA,MAAM,GAAGA;IACf;IAEA,MAAME,QAAQC,GAAW,EAAEC,UAA0B,CAAC,CAAC,EAAE;QACxD,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAM,IAAI,CAACL,MAAM,CAACE,OAAO,CAAC;YAAEC;YAAK,GAAGC,OAAO;QAAC;QAC7D,OAAOC,KAAKC,GAAG,CAAC,CAACC,OAAU,CAAA;gBAC1B,GAAGA,IAAI;gBACPC,OAAOD,KAAKC,KAAK,CAACC,OAAO;YAC1B,CAAA;IACD;IAEA,MAAMF,KAAKG,KAAa,EAAEC,QAAsB,EAAE;QACjD,MAAM,EAAEN,IAAI,EAAE,GAAG,MAAM,IAAI,CAACL,MAAM,CAACO,IAAI,CAAC;YAAEK,MAAMF;QAAM;QACtD,OAAO;YACN,GAAGL,IAAI;YACPG,OAAOH,KAAKG,KAAK,CAACC,OAAO;QAC1B;IACD;IAEA,MAAMI,MAAMD,IAAY,EAAER,OAAsB,EAAE;QACjD,MAAM,IAAI,CAACJ,MAAM,CAACa,KAAK,CAAC;YACvBD;YACAE,WAAWV,SAASU;QACrB;IACD;IAIA,MAAMC,SAASH,IAAY,EAAER,OAAyB,EAAgC;QACrF,iEAAiE;QACjE,MAAM,EAAEY,MAAM,EAAE,GAAG,MAAM,IAAI,CAAChB,MAAM,CAACe,QAAQ,CAAC;YAAEH;QAAK;QACrD,IAAIK,MAAMb,SAASc,YAAY;QAC/B,IAAIC,MAAMtB,aAAauB,UAAU,CAACJ;QAClC,OAAQC;YACP,KAAK;gBACJ,OAAOpB,aAAawB,QAAQ,CAACF;QAC/B;QACA,OAAOA;IACR;IAEA,MAAMG,UAAUV,IAAY,EAAEP,IAAkB,EAAED,OAA0B,EAAE;QAC7E,IAAIe,MAAMrB,YAAYO;QACtB,MAAM,IAAI,CAACL,MAAM,CAACsB,SAAS,CAAC;YAAEV;YAAMI,QAAQnB,aAAa0B,QAAQ,CAACJ;YAAsB,GAAGf,OAAO;QAAC;IACpG;IAEA,MAAMoB,OAAOC,OAAe,EAAEC,OAAe,EAAEtB,OAAuB,EAAE;QACvE,MAAM,IAAI,CAACJ,MAAM,CAACwB,MAAM,CAAC;YACxBC;YACAC;YACAC,WAAWvB,SAASuB;QACrB;IACD;IAEA,MAAMC,OAAOhB,IAAY,EAAE;QAC1B,MAAM,EAAEP,IAAI,EAAE,GAAG,MAAM,IAAI,CAACL,MAAM,CAAC4B,MAAM,CAAC;YAAEhB;QAAK;QACjD,OAAOP;IACR;IAEA,MAAMwB,KAAKC,GAAW,EAAEC,IAAY,EAAE3B,OAAqB,EAAE;QAC5D,MAAM,IAAI,CAACJ,MAAM,CAAC6B,IAAI,CAAC;YACtBC;YACAC;YACAJ,WAAWvB,SAASuB;YACpBK,SAAS5B,SAAS4B;QACnB;IACD;IAEA,MAAMC,GAAGrB,IAAY,EAAER,OAAmB,EAAE;QAC3C,MAAM,IAAI,CAACJ,MAAM,CAACiC,EAAE,CAAC;YACpBrB;YACAE,WAAWV,SAASU;YACpBoB,OAAO9B,SAAS8B;QACjB;IACD;IAEAC,iBAAiBC,KAAa,EAAEzB,QAAkC,EAAY;QAC7E,MAAM,IAAI0B,MAAM;IACjB;IAEAC,kBAAkBF,KAAa,EAAEzB,QAAmC,EAAY;QAC/E,MAAM,IAAI0B,MAAM;IACjB;AACD"}
@@ -0,0 +1,3 @@
1
+ export { createContractClientFileSystem } from "./createContractClientFileSystem.js";
2
+ export { FileSystemContract } from "./FileSystemContract.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/orpc/index.ts"],"sourcesContent":["export { createContractClientFileSystem } from './createContractClientFileSystem';\nexport { FileSystemContract } from './FileSystemContract';\n"],"names":["createContractClientFileSystem","FileSystemContract"],"mappings":"AAAA,SAASA,8BAA8B,QAAQ,mCAAmC;AAClF,SAASC,kBAAkB,QAAQ,uBAAuB"}
@@ -0,0 +1,63 @@
1
+ import { implement } from "@orpc/server";
2
+ import { ArrayBuffers } from "@wener/utils";
3
+ import { FileSystemContract } from "../FileSystemContract.js";
4
+ export function createFileSystemContractImpl(ifs) {
5
+ const os = implement(FileSystemContract);
6
+ return {
7
+ readdir: os.readdir.handler(async ({ input }) => {
8
+ return {
9
+ data: await ifs.readdir(input.dir)
10
+ };
11
+ }),
12
+ stat: os.stat.handler(async ({ input }) => {
13
+ return {
14
+ data: await ifs.stat(input.path)
15
+ };
16
+ }),
17
+ mkdir: os.mkdir.handler(async ({ input }) => {
18
+ await ifs.mkdir(input.path, {
19
+ recursive: input.recursive ?? false
20
+ });
21
+ return {};
22
+ }),
23
+ rename: os.rename.handler(async ({ input }) => {
24
+ await ifs.rename(input.oldPath, input.newPath, {
25
+ overwrite: input.overwrite ?? false
26
+ });
27
+ return {};
28
+ }),
29
+ exists: os.exists.handler(async ({ input }) => {
30
+ return {
31
+ data: await ifs.exists(input.path)
32
+ };
33
+ }),
34
+ copy: os.copy.handler(async ({ input }) => {
35
+ await ifs.copy(input.src, input.dest, {
36
+ overwrite: input.overwrite ?? false,
37
+ shallow: input.shallow ?? false
38
+ });
39
+ return {};
40
+ }),
41
+ readFile: os.readFile.handler(async ({ input }) => {
42
+ return {
43
+ base64: ArrayBuffers.toBase64(await ifs.readFile(input.path, {
44
+ encoding: "binary"
45
+ }))
46
+ };
47
+ }),
48
+ writeFile: os.writeFile.handler(async ({ input }) => {
49
+ await ifs.writeFile(input.path, Buffer.from(input.base64, "base64"), {
50
+ overwrite: input.overwrite
51
+ });
52
+ return {};
53
+ }),
54
+ rm: os.rm.handler(async ({ input }) => {
55
+ await ifs.rm(input.path, {
56
+ recursive: input.recursive ?? undefined,
57
+ force: input.force ?? undefined
58
+ });
59
+ return {};
60
+ })
61
+ };
62
+ }
63
+ //# sourceMappingURL=createFileSystemContractImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/fs/orpc/server/createFileSystemContractImpl.ts"],"sourcesContent":["import { implement } from '@orpc/server';\nimport { ArrayBuffers } from '@wener/utils';\nimport type { IFileSystem } from '../../IFileSystem';\nimport { FileSystemContract } from '../FileSystemContract';\n\nexport function createFileSystemContractImpl(ifs: IFileSystem) {\n\tconst os = implement(FileSystemContract);\n\n\treturn {\n\t\treaddir: os.readdir.handler(async ({ input }) => {\n\t\t\treturn {\n\t\t\t\tdata: await ifs.readdir(input.dir),\n\t\t\t};\n\t\t}),\n\t\tstat: os.stat.handler(async ({ input }) => {\n\t\t\treturn {\n\t\t\t\tdata: await ifs.stat(input.path),\n\t\t\t};\n\t\t}),\n\t\tmkdir: os.mkdir.handler(async ({ input }) => {\n\t\t\tawait ifs.mkdir(input.path, {\n\t\t\t\trecursive: input.recursive ?? false,\n\t\t\t});\n\t\t\treturn {};\n\t\t}),\n\t\trename: os.rename.handler(async ({ input }) => {\n\t\t\tawait ifs.rename(input.oldPath, input.newPath, {\n\t\t\t\toverwrite: input.overwrite ?? false,\n\t\t\t});\n\t\t\treturn {};\n\t\t}),\n\t\texists: os.exists.handler(async ({ input }) => {\n\t\t\treturn {\n\t\t\t\tdata: await ifs.exists(input.path),\n\t\t\t};\n\t\t}),\n\t\tcopy: os.copy.handler(async ({ input }) => {\n\t\t\tawait ifs.copy(input.src, input.dest, {\n\t\t\t\toverwrite: input.overwrite ?? false,\n\t\t\t\tshallow: input.shallow ?? false,\n\t\t\t});\n\t\t\treturn {};\n\t\t}),\n\t\treadFile: os.readFile.handler(async ({ input }) => {\n\t\t\treturn {\n\t\t\t\tbase64: ArrayBuffers.toBase64((await ifs.readFile(input.path, { encoding: 'binary' })) as BufferSource),\n\t\t\t};\n\t\t}),\n\t\twriteFile: os.writeFile.handler(async ({ input }) => {\n\t\t\tawait ifs.writeFile(input.path, Buffer.from(input.base64, 'base64'), {\n\t\t\t\toverwrite: input.overwrite,\n\t\t\t});\n\t\t\treturn {};\n\t\t}),\n\n\t\trm: os.rm.handler(async ({ input }) => {\n\t\t\tawait ifs.rm(input.path, {\n\t\t\t\trecursive: input.recursive ?? undefined,\n\t\t\t\tforce: input.force ?? undefined,\n\t\t\t});\n\t\t\treturn {};\n\t\t}),\n\t};\n}\n"],"names":["implement","ArrayBuffers","FileSystemContract","createFileSystemContractImpl","ifs","os","readdir","handler","input","data","dir","stat","path","mkdir","recursive","rename","oldPath","newPath","overwrite","exists","copy","src","dest","shallow","readFile","base64","toBase64","encoding","writeFile","Buffer","from","rm","undefined","force"],"mappings":"AAAA,SAASA,SAAS,QAAQ,eAAe;AACzC,SAASC,YAAY,QAAQ,eAAe;AAE5C,SAASC,kBAAkB,QAAQ,wBAAwB;AAE3D,OAAO,SAASC,6BAA6BC,GAAgB;IAC5D,MAAMC,KAAKL,UAAUE;IAErB,OAAO;QACNI,SAASD,GAAGC,OAAO,CAACC,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YAC3C,OAAO;gBACNC,MAAM,MAAML,IAAIE,OAAO,CAACE,MAAME,GAAG;YAClC;QACD;QACAC,MAAMN,GAAGM,IAAI,CAACJ,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACrC,OAAO;gBACNC,MAAM,MAAML,IAAIO,IAAI,CAACH,MAAMI,IAAI;YAChC;QACD;QACAC,OAAOR,GAAGQ,KAAK,CAACN,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACvC,MAAMJ,IAAIS,KAAK,CAACL,MAAMI,IAAI,EAAE;gBAC3BE,WAAWN,MAAMM,SAAS,IAAI;YAC/B;YACA,OAAO,CAAC;QACT;QACAC,QAAQV,GAAGU,MAAM,CAACR,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACzC,MAAMJ,IAAIW,MAAM,CAACP,MAAMQ,OAAO,EAAER,MAAMS,OAAO,EAAE;gBAC9CC,WAAWV,MAAMU,SAAS,IAAI;YAC/B;YACA,OAAO,CAAC;QACT;QACAC,QAAQd,GAAGc,MAAM,CAACZ,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACzC,OAAO;gBACNC,MAAM,MAAML,IAAIe,MAAM,CAACX,MAAMI,IAAI;YAClC;QACD;QACAQ,MAAMf,GAAGe,IAAI,CAACb,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACrC,MAAMJ,IAAIgB,IAAI,CAACZ,MAAMa,GAAG,EAAEb,MAAMc,IAAI,EAAE;gBACrCJ,WAAWV,MAAMU,SAAS,IAAI;gBAC9BK,SAASf,MAAMe,OAAO,IAAI;YAC3B;YACA,OAAO,CAAC;QACT;QACAC,UAAUnB,GAAGmB,QAAQ,CAACjB,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YAC7C,OAAO;gBACNiB,QAAQxB,aAAayB,QAAQ,CAAE,MAAMtB,IAAIoB,QAAQ,CAAChB,MAAMI,IAAI,EAAE;oBAAEe,UAAU;gBAAS;YACpF;QACD;QACAC,WAAWvB,GAAGuB,SAAS,CAACrB,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YAC/C,MAAMJ,IAAIwB,SAAS,CAACpB,MAAMI,IAAI,EAAEiB,OAAOC,IAAI,CAACtB,MAAMiB,MAAM,EAAE,WAAW;gBACpEP,WAAWV,MAAMU,SAAS;YAC3B;YACA,OAAO,CAAC;QACT;QAEAa,IAAI1B,GAAG0B,EAAE,CAACxB,OAAO,CAAC,OAAO,EAAEC,KAAK,EAAE;YACjC,MAAMJ,IAAI2B,EAAE,CAACvB,MAAMI,IAAI,EAAE;gBACxBE,WAAWN,MAAMM,SAAS,IAAIkB;gBAC9BC,OAAOzB,MAAMyB,KAAK,IAAID;YACvB;YACA,OAAO,CAAC;QACT;IACD;AACD"}
@@ -0,0 +1,2 @@
1
+ export { createFileSystemContractImpl } from "./createFileSystemContractImpl.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/fs/orpc/server/index.ts"],"sourcesContent":["export { createFileSystemContractImpl } from './createFileSystemContractImpl';\n"],"names":["createFileSystemContractImpl"],"mappings":"AAAA,SAASA,4BAA4B,QAAQ,iCAAiC"}