@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,753 @@
1
+ import { basename, dirname, normalize } from "node:path";
2
+ import { Readable } from "node:stream";
3
+ import { formatS3Url, parseS3Url } from "@wener/common/s3";
4
+ import { S3mini, sanitizeETag } from "s3mini";
5
+ export function createS3MiniFileSystem(options = {}) {
6
+ const parsed = parseS3Url(options);
7
+ if (!parsed) {
8
+ throw new Error('S3 URL or connection options are required');
9
+ }
10
+ const { client, prefix } = options;
11
+ if (!client && (!parsed.endpoint || !parsed.bucket)) {
12
+ throw new Error('S3 endpoint and bucket are required when client is not provided');
13
+ }
14
+ let s3mini;
15
+ let bucket;
16
+ if (client) {
17
+ s3mini = client;
18
+ bucket = client.bucketName || parsed.bucket || '';
19
+ } else {
20
+ bucket = parsed.bucket || '';
21
+ // Construct full endpoint URL with bucket for S3mini
22
+ const endpointUrl = formatS3Url(parsed, {
23
+ credentials: false,
24
+ useParams: false
25
+ });
26
+ s3mini = new S3mini({
27
+ accessKeyId: parsed.accessKeyId || '',
28
+ secretAccessKey: parsed.secretAccessKey || '',
29
+ endpoint: endpointUrl,
30
+ region: parsed.region
31
+ });
32
+ }
33
+ // Normalize prefix: remove leading/trailing slashes, ensure it ends with / when not empty
34
+ const normalizedPrefix = prefix ? prefix.replace(/^\/+/, '').replace(/\/+$/, '') : '';
35
+ return new S3FS(s3mini, bucket, normalizedPrefix);
36
+ }
37
+ let S3FS = class S3FS {
38
+ client;
39
+ _bucket;
40
+ prefix;
41
+ constructor(client, _bucket, prefix = ''){
42
+ this.client = client;
43
+ this._bucket = _bucket;
44
+ this.prefix = prefix;
45
+ }
46
+ /**
47
+ * Normalize path to S3 key format (remove leading slash, handle relative paths)
48
+ * and prepend the prefix if one is set
49
+ */ normalizeKey(path) {
50
+ if (!path || path === '/') {
51
+ return this.prefix;
52
+ }
53
+ const normalized = normalize(path).replace(/^\/+/, '').replace(/\\/g, '/');
54
+ // Prepend prefix if set
55
+ if (this.prefix) {
56
+ return `${this.prefix}/${normalized}`;
57
+ }
58
+ return normalized;
59
+ }
60
+ /**
61
+ * Remove prefix from S3 key to get the file system path
62
+ */ stripPrefix(key) {
63
+ if (!this.prefix || !key.startsWith(`${this.prefix}/`)) {
64
+ // If key doesn't start with prefix, return as-is (shouldn't happen normally)
65
+ return key.startsWith('/') ? key : `/${key}`;
66
+ }
67
+ const withoutPrefix = key.slice(this.prefix.length);
68
+ return withoutPrefix || '/';
69
+ }
70
+ /**
71
+ * Convert S3 key back to file system path (strip prefix and add leading slash)
72
+ */ keyToPath(key) {
73
+ if (!key) {
74
+ return '/';
75
+ }
76
+ return this.stripPrefix(key);
77
+ }
78
+ /**
79
+ * Get directory path from a key
80
+ */ getDirectory(key) {
81
+ if (!key) {
82
+ return '/';
83
+ }
84
+ const dir = dirname(key).replace(/\\/g, '/');
85
+ return dir === '.' ? '/' : `/${dir}`;
86
+ }
87
+ /**
88
+ * Check if a key represents a directory (ends with /)
89
+ */ isDirectoryKey(key) {
90
+ return key.endsWith('/');
91
+ }
92
+ toFileStat(key, obj) {
93
+ const isDir = this.isDirectoryKey(key);
94
+ const path = this.keyToPath(key);
95
+ const directory = this.getDirectory(key);
96
+ const size = typeof obj.Size === 'string' ? parseInt(obj.Size, 10) || 0 : obj.Size || 0;
97
+ const mtime = obj.LastModified ? new Date(obj.LastModified).getTime() : Date.now();
98
+ return {
99
+ directory,
100
+ path,
101
+ name: isDir ? basename(key.slice(0, -1)) || basename(directory) || '/' : basename(key),
102
+ kind: isDir ? 'directory' : 'file',
103
+ mtime,
104
+ size,
105
+ meta: obj.ETag ? {
106
+ etag: sanitizeETag(obj.ETag)
107
+ } : {}
108
+ };
109
+ }
110
+ checkAborted(signal) {
111
+ if (signal?.aborted) {
112
+ throw new Error('The operation was aborted');
113
+ }
114
+ }
115
+ async readdir(dir, options = {}) {
116
+ const { glob, recursive, depth = 1, kind, hidden = true, signal } = options;
117
+ this.checkAborted(signal);
118
+ const dirPrefix = this.normalizeKey(dir);
119
+ const prefixWithSlash = dirPrefix ? dirPrefix.endsWith('/') ? dirPrefix : `${dirPrefix}/` : '';
120
+ try {
121
+ const delimiter = recursive ? '' : '/';
122
+ // S3mini doesn't expose CommonPrefixes from delimiter-based listing.
123
+ // For non-recursive listing, we do two calls:
124
+ // 1. With delimiter to get direct files
125
+ // 2. Without delimiter to infer directory prefixes
126
+ let objects = [];
127
+ let commonPrefixes = [];
128
+ if (delimiter && !recursive) {
129
+ const directObjects = await this.client.listObjects(delimiter, prefixWithSlash, undefined, {
130
+ delimiter,
131
+ signal
132
+ });
133
+ if (directObjects) {
134
+ objects = directObjects;
135
+ }
136
+ // Infer CommonPrefixes by listing all objects recursively
137
+ const allObjectsRecursive = await this.client.listObjects('', prefixWithSlash, 1000, {
138
+ signal
139
+ });
140
+ if (allObjectsRecursive) {
141
+ const prefixSet = new Set();
142
+ for (const obj of allObjectsRecursive){
143
+ const key = obj.Key || '';
144
+ if (!key || !key.startsWith(prefixWithSlash)) continue;
145
+ const relativeKey = key.slice(prefixWithSlash.length);
146
+ const firstSlash = relativeKey.indexOf('/');
147
+ if (firstSlash > 0) {
148
+ prefixSet.add(prefixWithSlash + relativeKey.slice(0, firstSlash + 1));
149
+ }
150
+ }
151
+ commonPrefixes = Array.from(prefixSet).sort();
152
+ }
153
+ } else {
154
+ const listResult = await this.client.listObjects(delimiter, prefixWithSlash, undefined, {
155
+ signal
156
+ });
157
+ if (listResult) {
158
+ objects = listResult;
159
+ }
160
+ }
161
+ if (!objects.length && !commonPrefixes.length) {
162
+ return [];
163
+ }
164
+ let results = [];
165
+ // Process inferred CommonPrefixes (directories)
166
+ for (const prefix of commonPrefixes){
167
+ this.checkAborted(signal);
168
+ if (prefixWithSlash && !prefix.startsWith(prefixWithSlash)) continue;
169
+ const relativePrefix = prefixWithSlash ? prefix.slice(prefixWithSlash.length) : prefix;
170
+ const dirName = relativePrefix.replace(/\/$/, '');
171
+ if (!dirName) continue;
172
+ if (!recursive && depth === 1) {
173
+ if (dirName.indexOf('/') >= 0) continue;
174
+ }
175
+ const dirKey = prefix.endsWith('/') ? prefix : `${prefix}/`;
176
+ const stat = this.toFileStat(dirKey, {
177
+ Key: dirKey,
178
+ Size: 0,
179
+ LastModified: new Date()
180
+ });
181
+ if (!hidden && stat.name.startsWith('.')) continue;
182
+ if (kind && stat.kind !== kind) continue;
183
+ results.push(stat);
184
+ }
185
+ // Process objects (files and explicit directory markers)
186
+ const seenDirs = new Set();
187
+ for (const obj of objects){
188
+ this.checkAborted(signal);
189
+ const key = obj.Key || '';
190
+ if (!key) continue;
191
+ if (prefixWithSlash && !key.startsWith(prefixWithSlash)) continue;
192
+ const relativeKey = prefixWithSlash ? key.slice(prefixWithSlash.length) : key;
193
+ if (!relativeKey || relativeKey === '/') continue;
194
+ if (!recursive && depth === 1) {
195
+ const firstSlash = relativeKey.indexOf('/');
196
+ if (firstSlash >= 0) continue;
197
+ }
198
+ const isDir = this.isDirectoryKey(key);
199
+ if (isDir) {
200
+ const dk = key.slice(0, -1);
201
+ if (seenDirs.has(dk)) continue;
202
+ seenDirs.add(dk);
203
+ }
204
+ const stat = this.toFileStat(key, {
205
+ Key: key,
206
+ Size: obj.Size,
207
+ LastModified: obj.LastModified,
208
+ ETag: obj.ETag
209
+ });
210
+ if (!hidden && stat.name.startsWith('.')) continue;
211
+ if (kind && stat.kind !== kind) continue;
212
+ results.push(stat);
213
+ }
214
+ // Handle recursive with depth > 1
215
+ if (!recursive && depth > 1) {
216
+ const subdirs = results.filter((entry)=>entry.kind === 'directory');
217
+ for (const subdir of subdirs){
218
+ this.checkAborted(signal);
219
+ const maxDepth = depth - 1;
220
+ if (maxDepth > 0) {
221
+ const subEntries = await this.readdir(subdir.path, {
222
+ ...options,
223
+ depth: maxDepth
224
+ });
225
+ results = [
226
+ ...results,
227
+ ...subEntries
228
+ ];
229
+ }
230
+ }
231
+ }
232
+ // Handle glob filtering
233
+ if (glob) {
234
+ const { matcher } = await import("micromatch");
235
+ const match = matcher(glob);
236
+ results = results.filter((entry)=>match(entry.path));
237
+ }
238
+ return results;
239
+ } catch (error) {
240
+ if (error.code === 'NoSuchKey' || error.message?.includes('404')) {
241
+ throw new Error(`Directory not found: ${dir}`);
242
+ }
243
+ throw error;
244
+ }
245
+ }
246
+ async stat(entry, options = {}) {
247
+ const { signal } = options;
248
+ this.checkAborted(signal);
249
+ const key = this.normalizeKey(entry);
250
+ if (!key) {
251
+ // Root directory
252
+ return {
253
+ directory: '/',
254
+ path: '/',
255
+ name: '/',
256
+ kind: 'directory',
257
+ mtime: Date.now(),
258
+ size: 0,
259
+ meta: {}
260
+ };
261
+ }
262
+ try {
263
+ // Try to check if object exists and get metadata
264
+ const exists = await this.client.objectExists(key, {
265
+ signal
266
+ });
267
+ if (exists === true) {
268
+ // Get ETag and size
269
+ const etag = await this.client.getEtag(key, {
270
+ signal
271
+ });
272
+ const size = await this.client.getContentLength(key);
273
+ // Get LastModified from listing (since objectExists doesn't return it)
274
+ const objects = await this.client.listObjects('/', key, 1, {
275
+ delimiter: '/',
276
+ signal
277
+ });
278
+ const obj = objects?.[0];
279
+ return this.toFileStat(key, {
280
+ Key: key,
281
+ Size: size,
282
+ LastModified: obj?.LastModified || new Date(),
283
+ ETag: etag || undefined
284
+ });
285
+ }
286
+ // If object not found, try checking if it's a directory (prefix listing)
287
+ const dirKey = key.endsWith('/') ? key : `${key}/`;
288
+ const objects = await this.client.listObjects('/', dirKey, 1, {
289
+ delimiter: '/',
290
+ signal
291
+ });
292
+ if (objects && objects.length > 0) {
293
+ // It's a directory
294
+ return {
295
+ directory: this.getDirectory(key),
296
+ path: this.keyToPath(key),
297
+ name: basename(key.replace(/\/$/, '')) || '/',
298
+ kind: 'directory',
299
+ mtime: Date.now(),
300
+ size: 0,
301
+ meta: {}
302
+ };
303
+ }
304
+ throw new Error(`File not found: ${entry}`);
305
+ } catch (error) {
306
+ if (error.message?.includes('not found') || error.code === 'NoSuchKey') {
307
+ throw new Error(`File not found: ${entry}`);
308
+ }
309
+ throw error;
310
+ }
311
+ }
312
+ async mkdir(path, options = {}) {
313
+ const { recursive: _recursive = false, signal } = options;
314
+ this.checkAborted(signal);
315
+ // In S3, directories don't actually exist - they're just prefixes
316
+ // Optionally create a marker object (empty object with trailing slash)
317
+ const key = this.normalizeKey(path);
318
+ if (!key) {
319
+ return; // Root directory, nothing to do
320
+ }
321
+ // Ensure it ends with / to indicate directory
322
+ const dirKey = key.endsWith('/') ? key : `${key}/`;
323
+ // Try to create a marker object (0-byte object)
324
+ try {
325
+ await this.client.putObject(dirKey, '', 'application/x-directory', undefined, undefined);
326
+ } catch (error) {
327
+ // If it already exists or we don't have permission, that's okay for mkdir
328
+ if (!error.message?.includes('409') && !error.message?.includes('403')) {
329
+ throw error;
330
+ }
331
+ }
332
+ }
333
+ async readFile(path, options = {}) {
334
+ const { encoding = 'binary', signal, onDownloadProgress } = options;
335
+ this.checkAborted(signal);
336
+ const key = this.normalizeKey(path);
337
+ if (!key) {
338
+ throw new Error('Cannot read root directory');
339
+ }
340
+ try {
341
+ // Use getObjectArrayBuffer for binary data
342
+ const data = await this.client.getObjectArrayBuffer(key, {
343
+ signal
344
+ });
345
+ if (!data) {
346
+ throw new Error(`File not found: ${path}`);
347
+ }
348
+ // Handle progress reporting if needed
349
+ if (onDownloadProgress) {
350
+ onDownloadProgress({
351
+ loaded: data.byteLength,
352
+ total: data.byteLength
353
+ });
354
+ }
355
+ if (encoding === 'text') {
356
+ return new TextDecoder().decode(data);
357
+ }
358
+ return new Uint8Array(data);
359
+ } catch (error) {
360
+ if (error.code === 'NoSuchKey' || error.message?.includes('404')) {
361
+ throw new Error(`File not found: ${path}`);
362
+ }
363
+ throw error;
364
+ }
365
+ }
366
+ async writeFile(path, data, options = {}) {
367
+ const { signal, overwrite = true, onUploadProgress } = options;
368
+ this.checkAborted(signal);
369
+ const key = this.normalizeKey(path);
370
+ if (!key) {
371
+ throw new Error('Cannot write to root directory');
372
+ }
373
+ // Check if file exists and overwrite is false
374
+ if (!overwrite) {
375
+ const exists = await this.exists(path);
376
+ if (exists) {
377
+ throw new Error(`File already exists: ${path}`);
378
+ }
379
+ }
380
+ // Convert data to buffer or string
381
+ let body;
382
+ if (data instanceof ReadableStream) {
383
+ // Handle web ReadableStream
384
+ const reader = data.getReader();
385
+ const chunks = [];
386
+ let loaded = 0;
387
+ while(true){
388
+ const { done, value } = await reader.read();
389
+ if (done) break;
390
+ if (value) {
391
+ chunks.push(value);
392
+ loaded += value.length;
393
+ if (onUploadProgress) {
394
+ onUploadProgress({
395
+ loaded,
396
+ total: -1
397
+ });
398
+ }
399
+ }
400
+ }
401
+ body = Buffer.concat(chunks);
402
+ } else if (data instanceof Readable) {
403
+ // For streams, we need to read them into a buffer
404
+ const chunks = [];
405
+ let loaded = 0;
406
+ if (onUploadProgress) {
407
+ data.on('data', (chunk)=>{
408
+ chunks.push(chunk);
409
+ loaded += chunk.length;
410
+ onUploadProgress({
411
+ loaded,
412
+ total: -1
413
+ });
414
+ });
415
+ } else {
416
+ data.on('data', (chunk)=>{
417
+ chunks.push(chunk);
418
+ });
419
+ }
420
+ body = await new Promise((resolve, reject)=>{
421
+ const allChunks = [];
422
+ data.on('data', (chunk)=>allChunks.push(chunk));
423
+ data.on('end', ()=>resolve(Buffer.concat(allChunks)));
424
+ data.on('error', reject);
425
+ if (signal) {
426
+ signal.addEventListener('abort', ()=>{
427
+ data.destroy();
428
+ reject(new Error('The operation was aborted'));
429
+ });
430
+ }
431
+ });
432
+ } else if (data instanceof ArrayBuffer) {
433
+ body = Buffer.from(data);
434
+ } else if (data instanceof Buffer) {
435
+ body = data;
436
+ } else if (typeof data === 'string') {
437
+ body = data;
438
+ } else {
439
+ // ArrayBufferView
440
+ body = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
441
+ }
442
+ await this.client.putObject(key, body, undefined, undefined, undefined);
443
+ }
444
+ async rm(path, options = {}) {
445
+ const { recursive = false, force = false, signal } = options;
446
+ this.checkAborted(signal);
447
+ const key = this.normalizeKey(path);
448
+ if (!key) {
449
+ throw new Error('Cannot remove root directory');
450
+ }
451
+ try {
452
+ if (recursive) {
453
+ // List all objects with this prefix (no delimiter = recursive)
454
+ const prefix = key.endsWith('/') ? key : `${key}/`;
455
+ const objects = await this.client.listObjects('', prefix, undefined, {
456
+ signal
457
+ });
458
+ if (objects) {
459
+ // Delete all objects
460
+ const keys = objects.map((obj)=>obj.Key || '').filter(Boolean);
461
+ if (keys.length > 0) {
462
+ await this.client.deleteObjects(keys);
463
+ }
464
+ }
465
+ // Also delete the marker object if it exists
466
+ const markerKey = prefix;
467
+ try {
468
+ await this.client.deleteObject(markerKey);
469
+ } catch {
470
+ // Ignore if marker doesn't exist
471
+ }
472
+ } else {
473
+ // Delete single object
474
+ await this.client.deleteObject(key);
475
+ }
476
+ } catch (error) {
477
+ if (force && (error.code === 'NoSuchKey' || error.message?.includes('404'))) {
478
+ return;
479
+ }
480
+ throw error;
481
+ }
482
+ }
483
+ async rename(oldPath, newPath, options = {}) {
484
+ const { signal, overwrite = false } = options;
485
+ this.checkAborted(signal);
486
+ const oldKey = this.normalizeKey(oldPath);
487
+ const newKey = this.normalizeKey(newPath);
488
+ if (!oldKey) {
489
+ throw new Error('Cannot rename root directory');
490
+ }
491
+ // Check if target exists and overwrite is false
492
+ if (!overwrite) {
493
+ const exists = await this.exists(newPath);
494
+ if (exists) {
495
+ throw new Error(`Destination already exists: ${newPath}`);
496
+ }
497
+ }
498
+ try {
499
+ // Check if it's a directory (has objects with prefix)
500
+ const isDir = oldKey.endsWith('/');
501
+ const prefix = isDir ? oldKey : `${oldKey}/`;
502
+ const objects = await this.client.listObjects('', prefix, undefined, {
503
+ signal
504
+ });
505
+ if (objects && objects.length > 0) {
506
+ // It's a directory or has multiple objects, move all
507
+ const newPrefix = newKey.endsWith('/') ? newKey : `${newKey}/`;
508
+ // Move all objects
509
+ await Promise.all(objects.map(async (obj)=>{
510
+ const objKey = obj.Key || '';
511
+ if (!objKey) return;
512
+ const relativeKey = objKey.slice(prefix.length);
513
+ const newObjKey = newPrefix + relativeKey;
514
+ // Move object (copy + delete)
515
+ await this.client.moveObject(objKey, newObjKey);
516
+ }));
517
+ // Move marker object if it exists
518
+ try {
519
+ await this.client.moveObject(prefix, newPrefix);
520
+ } catch {
521
+ // Ignore if marker doesn't exist
522
+ }
523
+ } else {
524
+ // Single file - use moveObject
525
+ await this.client.moveObject(oldKey, newKey);
526
+ }
527
+ } catch (error) {
528
+ if (error.code === 'NoSuchKey' || error.message?.includes('404')) {
529
+ throw new Error(`Source file not found: ${oldPath}`);
530
+ }
531
+ throw error;
532
+ }
533
+ }
534
+ async exists(path) {
535
+ try {
536
+ const key = this.normalizeKey(path);
537
+ if (!key) {
538
+ return true; // Root always exists
539
+ }
540
+ const exists = await this.client.objectExists(key);
541
+ if (exists === true) {
542
+ return true;
543
+ }
544
+ // Check if it's a directory
545
+ const dirKey = key.endsWith('/') ? key : `${key}/`;
546
+ const objects = await this.client.listObjects('/', dirKey, 1, {
547
+ delimiter: '/'
548
+ });
549
+ return objects !== null && objects.length > 0;
550
+ } catch {
551
+ return false;
552
+ }
553
+ }
554
+ async copy(src, dest, options = {}) {
555
+ const { signal, overwrite = true, shallow = false } = options;
556
+ this.checkAborted(signal);
557
+ const srcKey = this.normalizeKey(src);
558
+ const destKey = this.normalizeKey(dest);
559
+ if (!srcKey) {
560
+ throw new Error('Cannot copy root directory');
561
+ }
562
+ // Check if source exists
563
+ try {
564
+ const srcStat = await this.stat(src);
565
+ // Check if destination exists and overwrite is false
566
+ if (!overwrite) {
567
+ const exists = await this.exists(dest);
568
+ if (exists) {
569
+ throw new Error(`Destination already exists: ${dest}`);
570
+ }
571
+ }
572
+ if (srcStat.kind === 'directory') {
573
+ // Copy directory recursively
574
+ const srcPrefix = srcKey.endsWith('/') ? srcKey : `${srcKey}/`;
575
+ const destPrefix = destKey.endsWith('/') ? destKey : `${destKey}/`;
576
+ const objects = await this.client.listObjects(shallow ? '/' : '', srcPrefix, undefined, {
577
+ ...shallow ? {
578
+ delimiter: '/'
579
+ } : {},
580
+ signal
581
+ });
582
+ if (objects) {
583
+ // Copy all objects
584
+ await Promise.all(objects.map(async (obj)=>{
585
+ const objKey = obj.Key || '';
586
+ if (!objKey) return;
587
+ const relativeKey = objKey.slice(srcPrefix.length);
588
+ const newObjKey = destPrefix + relativeKey;
589
+ await this.client.copyObject(objKey, newObjKey);
590
+ }));
591
+ }
592
+ // Copy marker object if it exists
593
+ try {
594
+ await this.client.copyObject(srcPrefix, destPrefix);
595
+ } catch {
596
+ // Ignore if marker doesn't exist
597
+ }
598
+ } else {
599
+ // Copy single file
600
+ await this.client.copyObject(srcKey, destKey);
601
+ }
602
+ } catch (error) {
603
+ if (error.code === 'NoSuchKey' || error.message?.includes('404')) {
604
+ throw new Error(`Source file not found: ${src}`);
605
+ }
606
+ throw error;
607
+ }
608
+ }
609
+ createReadStream(path, options = {}) {
610
+ const key = this.normalizeKey(path);
611
+ if (!key) {
612
+ throw new Error('Cannot read root directory');
613
+ }
614
+ const { range, signal } = options;
615
+ // Use getObjectRaw with range support
616
+ const responsePromise = this.client.getObjectRaw(key, !range, range?.start, range?.end, {
617
+ signal
618
+ }, undefined);
619
+ // Convert Response to Readable stream
620
+ let nodeStream = null;
621
+ const stream = new Readable({
622
+ async read () {
623
+ if (!nodeStream) {
624
+ try {
625
+ const response = await responsePromise;
626
+ if (!response.body) {
627
+ this.emit('error', new Error('No response body'));
628
+ return;
629
+ }
630
+ // Convert ReadableStream to Node Readable
631
+ const reader = response.body.getReader();
632
+ const _decoder = new TextDecoder();
633
+ nodeStream = new Readable({
634
+ async read () {
635
+ try {
636
+ const { done, value } = await reader.read();
637
+ if (done) {
638
+ this.push(null);
639
+ } else {
640
+ this.push(Buffer.from(value));
641
+ }
642
+ } catch (err) {
643
+ this.emit('error', err);
644
+ }
645
+ }
646
+ });
647
+ nodeStream.on('data', (chunk)=>{
648
+ this.push(chunk);
649
+ });
650
+ nodeStream.on('end', ()=>{
651
+ this.push(null);
652
+ });
653
+ nodeStream.on('error', (err)=>{
654
+ this.emit('error', err);
655
+ });
656
+ } catch (err) {
657
+ this.emit('error', err);
658
+ }
659
+ }
660
+ }
661
+ });
662
+ signal?.addEventListener('abort', ()=>{
663
+ stream.destroy(new Error('The operation was aborted'));
664
+ });
665
+ return stream;
666
+ }
667
+ createReadableStream(path, options = {}) {
668
+ const key = this.normalizeKey(path);
669
+ if (!key) {
670
+ throw new Error('Cannot read root directory');
671
+ }
672
+ const { range, signal } = options;
673
+ // Use getObjectRaw which returns a Response with ReadableStream
674
+ const responsePromise = this.client.getObjectRaw(key, !range, range?.start, range?.end, {
675
+ signal
676
+ }, undefined);
677
+ return new ReadableStream({
678
+ async start (controller) {
679
+ try {
680
+ const response = await responsePromise;
681
+ if (!response.body) {
682
+ controller.error(new Error('No response body'));
683
+ return;
684
+ }
685
+ const reader = response.body.getReader();
686
+ signal?.addEventListener('abort', ()=>{
687
+ reader.cancel(new Error('The operation was aborted'));
688
+ controller.error(new Error('The operation was aborted'));
689
+ });
690
+ while(true){
691
+ const { done, value } = await reader.read();
692
+ if (done) {
693
+ controller.close();
694
+ break;
695
+ }
696
+ controller.enqueue(value);
697
+ }
698
+ } catch (err) {
699
+ controller.error(err);
700
+ }
701
+ }
702
+ });
703
+ }
704
+ createWritableStream(path, options = {}) {
705
+ const key = this.normalizeKey(path);
706
+ if (!key) {
707
+ throw new Error('Cannot write to root directory');
708
+ }
709
+ const { signal, overwrite: _overwrite = true } = options;
710
+ this.checkAborted(signal);
711
+ // Create a WritableStream that buffers data and uploads when done
712
+ const buffer = [];
713
+ let controller;
714
+ const client = this.client;
715
+ const checkAborted = this.checkAborted.bind(this);
716
+ return new WritableStream({
717
+ start (ctrl) {
718
+ controller = ctrl;
719
+ },
720
+ async write (chunk) {
721
+ buffer.push(chunk);
722
+ },
723
+ async close () {
724
+ try {
725
+ checkAborted(signal);
726
+ const data = Buffer.concat(buffer.map((chunk)=>Buffer.from(chunk)));
727
+ await client.putObject(key, data, undefined, undefined, undefined);
728
+ // Controller closes automatically when close() completes successfully
729
+ } catch (error) {
730
+ controller.error(error);
731
+ }
732
+ },
733
+ abort (reason) {
734
+ buffer.length = 0;
735
+ controller.error(reason);
736
+ }
737
+ });
738
+ }
739
+ getUrl(path, _options) {
740
+ if (typeof path === 'object' && path?.kind !== 'file') {
741
+ return;
742
+ }
743
+ const key = typeof path === 'string' ? this.normalizeKey(path) : this.normalizeKey(path.path);
744
+ if (!key) {
745
+ return;
746
+ }
747
+ // Construct URL from endpoint - S3mini doesn't provide presigned URLs in basic API
748
+ // This is a fallback - real implementation would need presigned URLs
749
+ return undefined;
750
+ }
751
+ };
752
+
753
+ //# sourceMappingURL=createS3MiniFileSystem.js.map