@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,378 @@
1
+ import { readFile, unlink } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { describe, it, expect, beforeEach } from 'vitest';
5
+ import { Drain } from './Drain';
6
+ import { TemplateMiner } from './TemplateMiner';
7
+ import { FilePersistence } from './persistence/FilePersistence';
8
+ import { MemoryPersistence } from './persistence/MemoryPersistence';
9
+
10
+ describe('Drain', () => {
11
+ describe('basic functionality', () => {
12
+ it('should create a Drain instance with default options', () => {
13
+ const drain = new Drain();
14
+ expect(drain.logClusterDepth).toBe(4);
15
+ expect(drain.simTh).toBe(0.4);
16
+ expect(drain.maxChildren).toBe(100);
17
+ expect(drain.maxClusters).toBe(1000);
18
+ expect(drain.paramStr).toBe('<*>');
19
+ expect(drain.parametrizeNumericTokens).toBe(true);
20
+ });
21
+
22
+ it('should create a Drain instance with custom options', () => {
23
+ const drain = new Drain({
24
+ logClusterDepth: 5,
25
+ simTh: 0.5,
26
+ maxChildren: 200,
27
+ maxClusters: 500,
28
+ extraDelimiters: ['_', '-'],
29
+ paramStr: '<NUM>',
30
+ parametrizeNumericTokens: false,
31
+ });
32
+
33
+ expect(drain.logClusterDepth).toBe(5);
34
+ expect(drain.simTh).toBe(0.5);
35
+ expect(drain.maxChildren).toBe(200);
36
+ expect(drain.maxClusters).toBe(500);
37
+ expect(drain.extraDelimiters).toEqual(['_', '-']);
38
+ expect(drain.paramStr).toBe('<NUM>');
39
+ expect(drain.parametrizeNumericTokens).toBe(false);
40
+ });
41
+
42
+ it('should throw error if logClusterDepth is less than 3', () => {
43
+ expect(() => {
44
+ new Drain({ logClusterDepth: 2 });
45
+ }).toThrow('depth argument must be at least 3');
46
+ });
47
+
48
+ it('should add log message and create a cluster', () => {
49
+ const drain = new Drain();
50
+ const result = drain.addLogMessage('[INFO] User 123 logged in');
51
+
52
+ expect(result.updateType).toBe('created');
53
+ expect(result.cluster.clusterId).toBe(1);
54
+ expect(result.cluster.size).toBe(1);
55
+ expect(result.cluster.getTemplate()).toBe('[INFO] User 123 logged in');
56
+ });
57
+
58
+ it('should cluster similar log messages', () => {
59
+ const drain = new Drain();
60
+ const result1 = drain.addLogMessage('[INFO] User 123 logged in');
61
+ const result2 = drain.addLogMessage('[INFO] User 456 logged in');
62
+
63
+ expect(result1.updateType).toBe('created');
64
+ expect(result2.updateType).toBe('templateChanged');
65
+ expect(result2.cluster.clusterId).toBe(result1.cluster.clusterId);
66
+ expect(result2.cluster.getTemplate()).toBe('[INFO] User <*> logged in');
67
+ expect(result2.cluster.size).toBe(2);
68
+ });
69
+
70
+ it('should parameterize numeric tokens', () => {
71
+ const drain = new Drain();
72
+ drain.addLogMessage('Processing request 123');
73
+ const result = drain.addLogMessage('Processing request 456');
74
+
75
+ expect(result.updateType).toBe('templateChanged');
76
+ expect(result.cluster.getTemplate()).toBe('Processing request <*>');
77
+ });
78
+
79
+ it('should handle extra delimiters', () => {
80
+ const drain = new Drain({ extraDelimiters: ['_'] });
81
+ const result = drain.addLogMessage('error_code_123 occurred');
82
+ expect(result.cluster.getTemplate()).toBe('error code 123 occurred');
83
+ });
84
+
85
+ it('should get all clusters', () => {
86
+ const drain = new Drain();
87
+ drain.addLogMessage('Message 1');
88
+ drain.addLogMessage('Message 2');
89
+ drain.addLogMessage('Message 3');
90
+
91
+ const clusters = drain.getClusters();
92
+ expect(clusters.length).toBeGreaterThanOrEqual(1);
93
+ });
94
+ });
95
+
96
+ describe('tree search', () => {
97
+ it('should match existing cluster with never strategy', () => {
98
+ const drain = new Drain();
99
+ // Create a cluster with parameterized template first
100
+ drain.addLogMessage('[INFO] User 123 logged in');
101
+ drain.addLogMessage('[INFO] User 456 logged in'); // This creates the parameterized template
102
+ // Now match should work
103
+ const matched = drain.match('[INFO] User 789 logged in', 'never');
104
+
105
+ expect(matched).not.toBeNull();
106
+ expect(matched?.getTemplate()).toBe('[INFO] User <*> logged in');
107
+ });
108
+
109
+ it('should return null for non-matching log with never strategy', () => {
110
+ const drain = new Drain();
111
+ drain.addLogMessage('[INFO] User 123 logged in');
112
+ const matched = drain.match('[ERROR] System crashed', 'never');
113
+
114
+ expect(matched).toBeNull();
115
+ });
116
+
117
+ it('should match with fallback strategy', () => {
118
+ const drain = new Drain();
119
+ // Create a cluster with parameterized template first
120
+ drain.addLogMessage('[INFO] User 123 logged in');
121
+ drain.addLogMessage('[INFO] User 456 logged in'); // This creates the parameterized template
122
+ // Now match should work
123
+ const matched = drain.match('[INFO] User 789 logged in', 'fallback');
124
+
125
+ expect(matched).not.toBeNull();
126
+ });
127
+
128
+ it('should match with always strategy', () => {
129
+ const drain = new Drain();
130
+ // Create a cluster with parameterized template
131
+ drain.addLogMessage('[INFO] User 123 logged in');
132
+ drain.addLogMessage('[INFO] User 456 logged in'); // Creates parameterized template
133
+ // Create a different cluster
134
+ drain.addLogMessage('[ERROR] System crashed');
135
+ // Now match should find the User cluster
136
+ const matched = drain.match('[INFO] User 999 logged in', 'always');
137
+
138
+ expect(matched).not.toBeNull();
139
+ expect(matched?.getTemplate()).toBe('[INFO] User <*> logged in');
140
+ });
141
+ });
142
+
143
+ describe('template updates', () => {
144
+ it('should detect template changes', () => {
145
+ const drain = new Drain();
146
+ const result1 = drain.addLogMessage('Error: 404');
147
+ const result2 = drain.addLogMessage('Error: 500');
148
+
149
+ expect(result1.updateType).toBe('created');
150
+ expect(result2.updateType).toBe('templateChanged');
151
+ });
152
+
153
+ it('should not change template for identical logs', () => {
154
+ const drain = new Drain();
155
+ const result1 = drain.addLogMessage('Error: 404');
156
+ const result2 = drain.addLogMessage('Error: 404');
157
+
158
+ expect(result1.updateType).toBe('created');
159
+ expect(result2.updateType).toBe('none');
160
+ expect(result2.cluster.size).toBe(2);
161
+ });
162
+ });
163
+
164
+ describe('similarity threshold', () => {
165
+ it('should create new cluster if similarity is below threshold', () => {
166
+ const drain = new Drain({ simTh: 0.9 });
167
+ const result1 = drain.addLogMessage('Message A B C');
168
+ const result2 = drain.addLogMessage('Message X Y Z');
169
+
170
+ expect(result1.updateType).toBe('created');
171
+ expect(result2.updateType).toBe('created');
172
+ expect(result1.cluster.clusterId).not.toBe(result2.cluster.clusterId);
173
+ });
174
+
175
+ it('should merge clusters if similarity is above threshold', () => {
176
+ const drain = new Drain({ simTh: 0.3 });
177
+ const result1 = drain.addLogMessage('Message A B C');
178
+ const result2 = drain.addLogMessage('Message A B D');
179
+
180
+ expect(result1.updateType).toBe('created');
181
+ expect(result2.updateType).toBe('templateChanged');
182
+ expect(result1.cluster.clusterId).toBe(result2.cluster.clusterId);
183
+ });
184
+ });
185
+
186
+ describe('serialization', () => {
187
+ it('should serialize and deserialize Drain state', () => {
188
+ const drain1 = new Drain({ maxClusters: 100 });
189
+ drain1.addLogMessage('[INFO] User 123 logged in');
190
+ drain1.addLogMessage('[INFO] User 456 logged in');
191
+ drain1.addLogMessage('[ERROR] System crashed');
192
+
193
+ const json = drain1.toJSON();
194
+ const drain2 = Drain.fromJSON(json as any);
195
+
196
+ expect(drain2.logClusterDepth).toBe(drain1.logClusterDepth);
197
+ expect(drain2.simTh).toBe(drain1.simTh);
198
+ expect(drain2.getClusters().length).toBe(drain1.getClusters().length);
199
+
200
+ // Verify clusters
201
+ const clusters1 = drain1.getClusters();
202
+ const clusters2 = drain2.getClusters();
203
+ expect(clusters2.length).toBe(clusters1.length);
204
+
205
+ // Check that matching still works
206
+ const matched = drain2.match('[INFO] User 789 logged in');
207
+ expect(matched).not.toBeNull();
208
+ });
209
+ });
210
+ });
211
+
212
+ describe('TemplateMiner', () => {
213
+ describe('basic functionality', () => {
214
+ it('should add log message through miner', async () => {
215
+ const drain = new Drain();
216
+ const miner = new TemplateMiner(drain, new MemoryPersistence());
217
+
218
+ const result = await miner.addLogMessage('[INFO] User 123 logged in');
219
+
220
+ expect(result.updateType).toBe('created');
221
+ expect(result.cluster).toBeDefined();
222
+ expect(result.templateMined).toBe('[INFO] User 123 logged in');
223
+ expect(result.clusterCount).toBe(1);
224
+ });
225
+
226
+ it('should save state when cluster is created', async () => {
227
+ const drain = new Drain();
228
+ const persistence = new MemoryPersistence();
229
+ const miner = new TemplateMiner(drain, persistence);
230
+
231
+ await miner.addLogMessage('[INFO] User 123 logged in');
232
+ const state = await persistence.load();
233
+
234
+ expect(state).not.toBeNull();
235
+ });
236
+ });
237
+
238
+ describe('parameter extraction', () => {
239
+ it('should extract parameters from log message', async () => {
240
+ const drain = new Drain();
241
+ const miner = new TemplateMiner(drain, new MemoryPersistence());
242
+
243
+ const result = await miner.addLogMessage('[INFO] User 123 logged in');
244
+ const _template = result.templateMined;
245
+
246
+ // After second message, template should have wildcard
247
+ await miner.addLogMessage('[INFO] User 456 logged in');
248
+
249
+ const params = miner.extractParameters('[INFO] User <*> logged in', '[INFO] User 789 logged in');
250
+
251
+ expect(params).not.toBeNull();
252
+ expect(params?.length).toBeGreaterThan(0);
253
+ if (params && params.length > 0) {
254
+ expect(params[0]?.value).toBe('789');
255
+ }
256
+ });
257
+
258
+ it('should return null for non-matching template', () => {
259
+ const drain = new Drain();
260
+ const miner = new TemplateMiner(drain, new MemoryPersistence());
261
+
262
+ const params = miner.extractParameters('[INFO] User <*> logged in', '[ERROR] System crashed');
263
+
264
+ expect(params).toBeNull();
265
+ });
266
+ });
267
+
268
+ describe('persistence', () => {
269
+ describe('MemoryPersistence', () => {
270
+ it('should save and load state', async () => {
271
+ const drain1 = new Drain();
272
+ const persistence = new MemoryPersistence();
273
+ const miner1 = new TemplateMiner(drain1, persistence);
274
+
275
+ await miner1.addLogMessage('[INFO] User 123 logged in');
276
+ await miner1.addLogMessage('[INFO] User 456 logged in');
277
+
278
+ const drain2 = new Drain();
279
+ const miner2 = new TemplateMiner(drain2, persistence);
280
+ await miner2.loadState();
281
+
282
+ const clusters = miner2.getDrain().getClusters();
283
+ expect(clusters.length).toBe(1);
284
+ expect(clusters[0]?.getTemplate()).toBe('[INFO] User <*> logged in');
285
+ });
286
+ });
287
+
288
+ describe('FilePersistence', () => {
289
+ let tempFile: string;
290
+
291
+ beforeEach(() => {
292
+ tempFile = join(tmpdir(), `drain3-test-${Date.now()}.json`);
293
+ });
294
+
295
+ it('should save and load state from file', async () => {
296
+ const drain1 = new Drain();
297
+ const persistence = new FilePersistence(tempFile);
298
+ const miner1 = new TemplateMiner(drain1, persistence);
299
+
300
+ await miner1.addLogMessage('[INFO] User 123 logged in');
301
+ await miner1.addLogMessage('[INFO] User 456 logged in');
302
+ await miner1.saveState();
303
+
304
+ // Verify file exists
305
+ const fileContent = await readFile(tempFile, 'utf8');
306
+ expect(fileContent).toBeTruthy();
307
+
308
+ // Load state
309
+ const drain2 = new Drain();
310
+ const miner2 = new TemplateMiner(drain2, persistence);
311
+ await miner2.loadState();
312
+
313
+ const clusters = miner2.getDrain().getClusters();
314
+ expect(clusters.length).toBe(1);
315
+ expect(clusters[0]?.getTemplate()).toBe('[INFO] User <*> logged in');
316
+
317
+ // Cleanup
318
+ await unlink(tempFile).catch(() => {
319
+ // Ignore cleanup errors
320
+ });
321
+ });
322
+
323
+ it('should return null when file does not exist', async () => {
324
+ const persistence = new FilePersistence(join(tmpdir(), 'non-existent-file.json'));
325
+ const state = await persistence.load();
326
+ expect(state).toBeNull();
327
+ });
328
+ });
329
+ });
330
+
331
+ describe('integration test - Kafka logs', () => {
332
+ it('should cluster Kafka logs correctly', async () => {
333
+ const drain = new Drain({ extraDelimiters: ['_'] });
334
+ const miner = new TemplateMiner(drain, new MemoryPersistence());
335
+
336
+ const logs = [
337
+ '[ProducerStateManager partition=__consumer_offsets-48] Writing producer snapshot at offset 4339939698 (kafka.log.ProducerStateManager)',
338
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Rolled new log segment at offset 4339939698 in 3 ms. (kafka.log.Log)',
339
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Deleting segment files LogSegment(baseOffset=0, size=0, lastModifiedTime=1645674584000, largestRecordTimestamp=None) (kafka.log.Log)',
340
+ 'Deleted log /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000000000000000.log.deleted. (kafka.log.LogSegment)',
341
+ 'Deleted offset index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000000000000000.index.deleted. (kafka.log.LogSegment)',
342
+ 'Deleted time index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000000000000000.timeindex.deleted. (kafka.log.LogSegment)',
343
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Deleting segment files LogSegment(baseOffset=2147429227, size=0, lastModifiedTime=1710735195000, largestRecordTimestamp=None) (kafka.log.Log)',
344
+ 'Deleted log /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000002147429227.log.deleted. (kafka.log.LogSegment)',
345
+ 'Deleted offset index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000002147429227.index.deleted. (kafka.log.LogSegment)',
346
+ 'Deleted time index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000002147429227.timeindex.deleted. (kafka.log.LogSegment)',
347
+ '[ProducerStateManager partition=__consumer_offsets-49] Writing producer snapshot at offset 4339698 (kafka.log.ProducerStateManager)',
348
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Deleting segment files LogSegment(baseOffset=4294790577, size=2703, lastModifiedTime=1711832815000, largestRecordTimestamp=Some(1710827112244)) (kafka.log.Log)',
349
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Deleting segment files LogSegment(baseOffset=4338631022, size=641, lastModifiedTime=1711849197000, largestRecordTimestamp=Some(1711849197921)) (kafka.log.Log)',
350
+ 'Deleted log /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004294790577.log.deleted. (kafka.log.LogSegment)',
351
+ 'Deleted log /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004338631022.log.deleted. (kafka.log.LogSegment)',
352
+ 'Deleted offset index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004294790577.index.deleted. (kafka.log.LogSegment)',
353
+ 'Deleted offset index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004338631022.index.deleted. (kafka.log.LogSegment)',
354
+ 'Deleted time index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004294790577.timeindex.deleted. (kafka.log.LogSegment)',
355
+ 'Deleted time index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004338631022.timeindex.deleted. (kafka.log.LogSegment)',
356
+ '[Log partition=__consumer_offsets-48, dir=/home1/irteam/apps/data/kafka/kafka-logs] Deleting segment files LogSegment(baseOffset=4339285360, size=104857589, lastModifiedTime=1711865580000, largestRecordTimestamp=Some(1711865580112)) (kafka.log.Log)',
357
+ 'Deleted log /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004339285360.log.deleted. (kafka.log.LogSegment)',
358
+ 'Deleted offset index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004339285360.index.deleted. (kafka.log.LogSegment)',
359
+ 'Deleted time index /home1/irteam/apps/data/kafka/kafka-logs/__consumer_offsets-48/00000000004339285360.timeindex.deleted. (kafka.log.LogSegment)',
360
+ '[Log partition=__consumer_offsets-49, dir=/home1/irteam/apps/data/kafka/kafka-logs] Rolled new log segment at offset 432939698 in 2 ms. (kafka.log.Log)',
361
+ ];
362
+
363
+ for (const log of logs) {
364
+ const result = await miner.addLogMessage(log);
365
+ expect(result.cluster).toBeDefined();
366
+
367
+ // Extract parameters to verify they work
368
+ const _params = miner.extractParameters(result.templateMined, log);
369
+ // Params may be null for some logs, which is fine
370
+ }
371
+
372
+ const clusters = drain.getClusters();
373
+ // Should cluster into a reasonable number of groups (similar to Go test expects 5)
374
+ expect(clusters.length).toBeGreaterThan(0);
375
+ expect(clusters.length).toBeLessThanOrEqual(10);
376
+ });
377
+ });
378
+ });