@wener/common 2.0.3 → 2.0.6

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 (312) hide show
  1. package/lib/ai/qwen3vl/index.js +1 -1
  2. package/lib/ai/qwen3vl/utils.js +15 -15
  3. package/lib/ai/qwen3vl/utils.js.map +1 -1
  4. package/lib/ai/vision/DocLayoutElementTypeSchema.js +22 -22
  5. package/lib/ai/vision/ImageAnnotationSchema.js +63 -47
  6. package/lib/ai/vision/index.js +2 -2
  7. package/lib/ai/vision/resolveImageAnnotation.js +81 -95
  8. package/lib/cn/ChineseResidentIdNo.js +55 -41
  9. package/lib/cn/ChineseResidentIdNo.js.map +1 -1
  10. package/lib/cn/ChineseResidentIdNo.mod.js +6 -1
  11. package/lib/cn/ChineseResidentIdNo.test.js +22 -21
  12. package/lib/cn/DivisionCode.js +220 -235
  13. package/lib/cn/DivisionCode.mod.js +6 -1
  14. package/lib/cn/DivisionCode.test.js +92 -121
  15. package/lib/cn/Mod11.js +18 -37
  16. package/lib/cn/Mod11.js.map +1 -1
  17. package/lib/cn/Mod31.js +23 -41
  18. package/lib/cn/UnifiedSocialCreditCode.js +143 -137
  19. package/lib/cn/UnifiedSocialCreditCode.mod.js +6 -1
  20. package/lib/cn/UnifiedSocialCreditCode.test.js +21 -15
  21. package/lib/cn/formatChineseAmount.js +46 -71
  22. package/lib/cn/index.js +6 -6
  23. package/lib/cn/mod.js +5 -3
  24. package/lib/cn/parseChineseNumber.js +81 -85
  25. package/lib/cn/parseChineseNumber.test.js +183 -261
  26. package/lib/cn/pinyin/cartesianProduct.js +19 -19
  27. package/lib/cn/pinyin/cartesianProduct.test.js +78 -178
  28. package/lib/cn/pinyin/loader.js +13 -11
  29. package/lib/cn/pinyin/preload.js +2 -1
  30. package/lib/cn/pinyin/toPinyin.test.js +149 -161
  31. package/lib/cn/pinyin/toPinyinPure.js +28 -23
  32. package/lib/cn/pinyin/transform.js +11 -11
  33. package/lib/cn/types.d.js +2 -2
  34. package/lib/consola/createStandardConsolaReporter.js +14 -15
  35. package/lib/consola/formatLogObject.js +149 -133
  36. package/lib/consola/formatLogObject.js.map +1 -1
  37. package/lib/consola/formatLogObject.test.js +167 -178
  38. package/lib/consola/index.js +2 -2
  39. package/lib/data/formatSort.js +14 -12
  40. package/lib/data/formatSort.test.js +33 -33
  41. package/lib/data/index.js +3 -3
  42. package/lib/data/maybeNumber.js +23 -23
  43. package/lib/data/maybeNumber.js.map +1 -1
  44. package/lib/data/parseSort.js +75 -68
  45. package/lib/data/parseSort.test.js +196 -187
  46. package/lib/data/resolvePagination.js +38 -39
  47. package/lib/data/resolvePagination.test.js +228 -218
  48. package/lib/data/types.d.js +2 -2
  49. package/lib/data/types.d.js.map +1 -1
  50. package/lib/dayjs/dayjs.js +20 -20
  51. package/lib/dayjs/formatDuration.js +56 -56
  52. package/lib/dayjs/formatDuration.js.map +1 -1
  53. package/lib/dayjs/formatDuration.test.js +63 -77
  54. package/lib/dayjs/index.js +4 -4
  55. package/lib/dayjs/parseDuration.js +21 -26
  56. package/lib/dayjs/parseRelativeTime.js +65 -66
  57. package/lib/dayjs/parseRelativeTime.test.js +227 -243
  58. package/lib/dayjs/resolveRelativeTime.js +74 -144
  59. package/lib/dayjs/resolveRelativeTime.js.map +1 -1
  60. package/lib/dayjs/resolveRelativeTime.test.js +296 -307
  61. package/lib/decimal/index.js +1 -1
  62. package/lib/decimal/parseDecimal.js +12 -12
  63. package/lib/drain3/Drain.js +321 -0
  64. package/lib/drain3/Drain.js.map +1 -0
  65. package/lib/drain3/LogCluster.js +38 -0
  66. package/lib/drain3/LogCluster.js.map +1 -0
  67. package/lib/drain3/Node.js +39 -0
  68. package/lib/drain3/Node.js.map +1 -0
  69. package/lib/drain3/TemplateMiner.js +205 -0
  70. package/lib/drain3/TemplateMiner.js.map +1 -0
  71. package/lib/drain3/index.js +31 -0
  72. package/lib/drain3/index.js.map +1 -0
  73. package/lib/drain3/persistence/FilePersistence.js +24 -0
  74. package/lib/drain3/persistence/FilePersistence.js.map +1 -0
  75. package/lib/drain3/persistence/MemoryPersistence.js +18 -0
  76. package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
  77. package/lib/drain3/persistence/PersistenceHandler.js +5 -0
  78. package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
  79. package/lib/drain3/types.js +7 -0
  80. package/lib/drain3/types.js.map +1 -0
  81. package/lib/emittery/emitter.js +7 -7
  82. package/lib/emittery/index.js +1 -1
  83. package/lib/foundation/schema/SexType.js +15 -12
  84. package/lib/foundation/schema/index.js +1 -1
  85. package/lib/foundation/schema/parseSexType.js +15 -16
  86. package/lib/foundation/schema/types.js +8 -6
  87. package/lib/fs/FileSystemError.js +18 -18
  88. package/lib/fs/IFileSystem.d.js +2 -2
  89. package/lib/fs/IFileSystem.d.js.map +1 -1
  90. package/lib/fs/MemoryFileSystem.test.js +172 -181
  91. package/lib/fs/createBrowserFileSystem.js +222 -233
  92. package/lib/fs/createBrowserFileSystem.js.map +1 -1
  93. package/lib/fs/createMemoryFileSystem.js +473 -510
  94. package/lib/fs/createMemoryFileSystem.js.map +1 -1
  95. package/lib/fs/createSandboxFileSystem.js +102 -101
  96. package/lib/fs/createSandboxFileSystem.js.map +1 -1
  97. package/lib/fs/createWebDavFileSystem.js +162 -132
  98. package/lib/fs/createWebDavFileSystem.js.map +1 -1
  99. package/lib/fs/createWebFileSystem.js +202 -0
  100. package/lib/fs/createWebFileSystem.js.map +1 -0
  101. package/lib/fs/findMimeType.js +14 -14
  102. package/lib/fs/findMimeType.js.map +1 -1
  103. package/lib/fs/index.js +7 -7
  104. package/lib/fs/index.js.map +1 -1
  105. package/lib/fs/minio/createMinioFileSystem.js +977 -0
  106. package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
  107. package/lib/fs/minio/index.js +2 -0
  108. package/lib/fs/minio/index.js.map +1 -0
  109. package/lib/fs/orpc/FileSystemContract.js +57 -57
  110. package/lib/fs/orpc/createContractClientFileSystem.js +88 -88
  111. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -1
  112. package/lib/fs/orpc/index.js +2 -2
  113. package/lib/fs/orpc/server/createFileSystemContractImpl.js +62 -60
  114. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -1
  115. package/lib/fs/orpc/server/index.js +1 -1
  116. package/lib/fs/s3/createS3MiniFileSystem.js +756 -689
  117. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -1
  118. package/lib/fs/s3/index.js +1 -1
  119. package/lib/fs/s3/s3mini.test.js +524 -553
  120. package/lib/fs/scandir.js +56 -56
  121. package/lib/fs/server/createDatabaseFileSystem.js +834 -741
  122. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -1
  123. package/lib/fs/server/createNodeFileSystem.js +407 -380
  124. package/lib/fs/server/createNodeFileSystem.js.map +1 -1
  125. package/lib/fs/server/dbfs.test.js +201 -214
  126. package/lib/fs/server/index.js +1 -1
  127. package/lib/fs/server/loadTestDatabase.js +40 -43
  128. package/lib/fs/tests/runFileSystemTest.js +352 -315
  129. package/lib/fs/tests/runFileSystemTest.js.map +1 -1
  130. package/lib/fs/types.js +17 -20
  131. package/lib/fs/utils/getFileUrl.js +24 -30
  132. package/lib/fs/utils.js +17 -17
  133. package/lib/fs/utils.js.map +1 -1
  134. package/lib/fs/webdav/index.js +2 -0
  135. package/lib/fs/webdav/index.js.map +1 -0
  136. package/lib/index.js +2 -2
  137. package/lib/jsonschema/JsonSchema.js +216 -155
  138. package/lib/jsonschema/JsonSchema.js.map +1 -1
  139. package/lib/jsonschema/JsonSchema.test.js +123 -124
  140. package/lib/jsonschema/forEachJsonSchema.js +41 -41
  141. package/lib/jsonschema/forEachJsonSchema.js.map +1 -1
  142. package/lib/jsonschema/index.js +2 -2
  143. package/lib/jsonschema/types.d.js +2 -2
  144. package/lib/jsonschema/types.d.js.map +1 -1
  145. package/lib/meta/defineFileType.js +32 -38
  146. package/lib/meta/defineInit.js +39 -35
  147. package/lib/meta/defineMetadata.js +37 -34
  148. package/lib/meta/defineMetadata.js.map +1 -1
  149. package/lib/meta/defineMetadata.test.js +13 -12
  150. package/lib/meta/index.js +3 -3
  151. package/lib/orpc/createOpenApiContractClient.js +26 -24
  152. package/lib/orpc/createOpenApiContractClient.js.map +1 -1
  153. package/lib/orpc/createRpcContractClient.js +37 -31
  154. package/lib/orpc/index.js +2 -2
  155. package/lib/orpc/resolveLinkPlugins.js +25 -25
  156. package/lib/password/PHC.js +187 -189
  157. package/lib/password/PHC.js.map +1 -1
  158. package/lib/password/PHC.test.js +517 -535
  159. package/lib/password/Password.js +85 -80
  160. package/lib/password/Password.test.js +330 -364
  161. package/lib/password/createArgon2PasswordAlgorithm.js +50 -51
  162. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
  163. package/lib/password/createBase64PasswordAlgorithm.js +11 -11
  164. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
  165. package/lib/password/createBcryptPasswordAlgorithm.js +20 -18
  166. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
  167. package/lib/password/createPBKDF2PasswordAlgorithm.js +65 -52
  168. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
  169. package/lib/password/createScryptPasswordAlgorithm.js +74 -63
  170. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
  171. package/lib/password/index.js +5 -5
  172. package/lib/password/server/index.js +1 -1
  173. package/lib/resource/Identifiable.js +2 -2
  174. package/lib/resource/ListQuery.js +42 -42
  175. package/lib/resource/ListQuery.js.map +1 -1
  176. package/lib/resource/getTitleOfResource.js +5 -5
  177. package/lib/resource/index.js +2 -2
  178. package/lib/resource/index.js.map +1 -1
  179. package/lib/resource/schema/AnyResourceSchema.js +91 -89
  180. package/lib/resource/schema/BaseResourceSchema.js +26 -26
  181. package/lib/resource/schema/ResourceActionType.js +117 -115
  182. package/lib/resource/schema/ResourceStatus.js +94 -92
  183. package/lib/resource/schema/ResourceType.js +25 -23
  184. package/lib/resource/schema/index.js +5 -5
  185. package/lib/resource/schema/types.js +86 -55
  186. package/lib/resource/schema/types.test.js +16 -13
  187. package/lib/s3/formatS3Url.js +60 -60
  188. package/lib/s3/formatS3Url.js.map +1 -1
  189. package/lib/s3/formatS3Url.test.js +238 -261
  190. package/lib/s3/index.js +2 -2
  191. package/lib/s3/parseS3Url.js +61 -60
  192. package/lib/s3/parseS3Url.js.map +1 -1
  193. package/lib/s3/parseS3Url.test.js +270 -269
  194. package/lib/schema/SchemaRegistry.js +41 -42
  195. package/lib/schema/SchemaRegistry.js.map +1 -1
  196. package/lib/schema/SchemaRegistry.mod.js +1 -1
  197. package/lib/schema/TypeSchema.d.js +2 -2
  198. package/lib/schema/TypeSchema.d.js.map +1 -1
  199. package/lib/schema/createSchemaData.js +113 -67
  200. package/lib/schema/createSchemaData.js.map +1 -1
  201. package/lib/schema/findJsonSchemaByPath.js +28 -23
  202. package/lib/schema/findJsonSchemaByPath.js.map +1 -1
  203. package/lib/schema/formatZodError.js +113 -134
  204. package/lib/schema/formatZodError.js.map +1 -1
  205. package/lib/schema/formatZodError.test.js +192 -195
  206. package/lib/schema/getSchemaCache.js +7 -7
  207. package/lib/schema/getSchemaOptions.js +17 -16
  208. package/lib/schema/index.js +6 -6
  209. package/lib/schema/toJsonSchema.js +196 -190
  210. package/lib/schema/toJsonSchema.js.map +1 -1
  211. package/lib/schema/toJsonSchema.test.js +34 -26
  212. package/lib/schema/validate.js +106 -97
  213. package/lib/schema/validate.js.map +1 -1
  214. package/lib/tools/generateSchema.js +40 -40
  215. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +74 -74
  216. package/lib/utils/buildBaseUrl.js +8 -8
  217. package/lib/utils/buildRedactorFormSchema.js +55 -54
  218. package/lib/utils/buildRedactorFormSchema.js.map +1 -1
  219. package/lib/utils/getEstimateProcessTime.js +24 -19
  220. package/lib/utils/index.js +3 -3
  221. package/lib/utils/resolveFeatureOptions.js +9 -9
  222. package/package.json +37 -18
  223. package/src/ai/qwen3vl/utils.ts +1 -1
  224. package/src/ai/vision/index.ts +2 -2
  225. package/src/cn/ChineseResidentIdNo.ts +1 -1
  226. package/src/cn/Mod11.ts +1 -1
  227. package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
  228. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +0 -23
  229. package/src/cn/index.ts +1 -2
  230. package/src/cn/parseChineseNumber.test.ts +4 -4
  231. package/src/consola/formatLogObject.ts +6 -6
  232. package/src/consola/index.ts +1 -1
  233. package/src/data/index.ts +3 -4
  234. package/src/data/maybeNumber.ts +1 -1
  235. package/src/data/parseSort.test.ts +0 -1
  236. package/src/data/resolvePagination.ts +2 -2
  237. package/src/data/types.d.ts +2 -2
  238. package/src/dayjs/formatDuration.ts +10 -11
  239. package/src/dayjs/index.ts +1 -1
  240. package/src/dayjs/parseRelativeTime.ts +1 -1
  241. package/src/dayjs/resolveRelativeTime.ts +11 -14
  242. package/src/drain3/Drain.test.ts +378 -0
  243. package/src/drain3/Drain.ts +394 -0
  244. package/src/drain3/LogCluster.ts +46 -0
  245. package/src/drain3/Node.ts +53 -0
  246. package/src/drain3/TemplateMiner.ts +246 -0
  247. package/src/drain3/index.ts +34 -0
  248. package/src/drain3/persistence/FilePersistence.ts +24 -0
  249. package/src/drain3/persistence/MemoryPersistence.ts +23 -0
  250. package/src/drain3/persistence/PersistenceHandler.ts +19 -0
  251. package/src/drain3/types.ts +75 -0
  252. package/src/fs/IFileSystem.d.ts +1 -2
  253. package/src/fs/createBrowserFileSystem.ts +7 -5
  254. package/src/fs/createMemoryFileSystem.ts +9 -13
  255. package/src/fs/createSandboxFileSystem.ts +1 -1
  256. package/src/fs/createWebDavFileSystem.ts +30 -17
  257. package/src/fs/createWebFileSystem.ts +242 -0
  258. package/src/fs/findMimeType.ts +1 -4
  259. package/src/fs/index.ts +5 -5
  260. package/src/fs/minio/createMinioFileSystem.ts +1148 -0
  261. package/src/fs/minio/index.ts +1 -0
  262. package/src/fs/orpc/createContractClientFileSystem.ts +5 -5
  263. package/src/fs/orpc/server/createFileSystemContractImpl.ts +1 -1
  264. package/src/fs/s3/createS3MiniFileSystem.ts +120 -79
  265. package/src/fs/s3/s3fs.test.ts +441 -0
  266. package/src/fs/s3/s3mini.test.ts +2 -2
  267. package/src/fs/server/createDatabaseFileSystem.ts +78 -114
  268. package/src/fs/server/createNodeFileSystem.ts +32 -13
  269. package/src/fs/server/dbfs.test.ts +13 -8
  270. package/src/fs/server/index.ts +1 -0
  271. package/src/fs/server/loadTestDatabase.ts +8 -119
  272. package/src/fs/tests/runFileSystemTest.ts +29 -28
  273. package/src/fs/utils.ts +1 -1
  274. package/src/fs/webdav/index.ts +1 -0
  275. package/src/jsonschema/JsonSchema.ts +5 -5
  276. package/src/jsonschema/forEachJsonSchema.ts +1 -1
  277. package/src/jsonschema/index.ts +1 -1
  278. package/src/jsonschema/types.d.ts +1 -1
  279. package/src/meta/defineMetadata.ts +1 -1
  280. package/src/meta/index.ts +2 -3
  281. package/src/orm/createSqliteDialect.ts +17 -0
  282. package/src/orm/index.ts +1 -0
  283. package/src/orpc/createOpenApiContractClient.ts +3 -3
  284. package/src/orpc/index.ts +1 -1
  285. package/src/password/PHC.ts +3 -3
  286. package/src/password/createArgon2PasswordAlgorithm.ts +2 -2
  287. package/src/password/createBase64PasswordAlgorithm.ts +2 -2
  288. package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
  289. package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
  290. package/src/password/createScryptPasswordAlgorithm.ts +4 -4
  291. package/src/password/index.ts +2 -2
  292. package/src/resource/ListQuery.ts +4 -1
  293. package/src/resource/index.ts +3 -3
  294. package/src/resource/schema/index.ts +4 -4
  295. package/src/s3/formatS3Url.test.ts +1 -1
  296. package/src/s3/formatS3Url.ts +2 -2
  297. package/src/s3/index.ts +1 -1
  298. package/src/s3/parseS3Url.ts +1 -1
  299. package/src/schema/SchemaRegistry.ts +2 -2
  300. package/src/schema/TypeSchema.d.ts +6 -6
  301. package/src/schema/createSchemaData.ts +5 -5
  302. package/src/schema/findJsonSchemaByPath.ts +5 -5
  303. package/src/schema/formatZodError.test.ts +2 -1
  304. package/src/schema/formatZodError.ts +50 -62
  305. package/src/schema/index.ts +5 -5
  306. package/src/schema/toJsonSchema.ts +6 -6
  307. package/src/schema/validate.ts +2 -2
  308. package/src/utils/buildRedactorFormSchema.ts +4 -4
  309. package/src/utils/formatNumber.ts +18 -0
  310. package/src/utils/formatPercent.ts +17 -0
  311. package/src/utils/index.ts +3 -3
  312. package/src/utils/resolveFeatureOptions.ts +1 -1
@@ -1,180 +1,241 @@
1
- import { isNil } from "@wener/utils";
2
- import Ajv from "ajv";
3
- import addFormats from "ajv-formats";
4
- import addKeywords from "ajv-keywords";
5
- import { match, P } from "ts-pattern";
1
+ import { isNil } from '@wener/utils';
2
+ import Ajv from 'ajv';
3
+ import addFormats from 'ajv-formats';
4
+ import addKeywords from 'ajv-keywords';
5
+ import { match, P } from 'ts-pattern';
6
+
6
7
  function _createValidator(opt) {
7
- const ajv = new Ajv(opt);
8
- addKeywords(ajv);
9
- addFormats(ajv);
10
- return ajv;
8
+ const ajv = new Ajv(opt);
9
+ addKeywords(ajv);
10
+ addFormats(ajv);
11
+ return ajv;
11
12
  }
12
13
  function validate({ schema, data, mutate, clone, validator }) {
13
- let opts = {
14
- // strict: 'log',
15
- strict: true,
16
- strictSchema: 'log'
17
- };
18
- if (mutate) {
19
- Object.assign(opts, {
20
- removeAdditional: true,
21
- useDefaults: true,
22
- coerceTypes: true,
23
- allErrors: true
24
- });
25
- }
26
- if (clone) {
27
- data = structuredClone(data);
28
- }
29
- if (!validator) {
30
- validator = JsonSchema.createValidator(opts);
31
- }
32
- const validate = validator.compile(schema);
33
- // consider reusing validate instance
34
- const valid = validate(data);
35
- const errors = validate.errors;
36
- // localize(errors);
37
- return {
38
- data,
39
- success: valid,
40
- message: validator.errorsText(errors),
41
- errors: errors
42
- };
14
+ let opts = {
15
+ // strict: 'log',
16
+ strict: true,
17
+ strictSchema: 'log',
18
+ };
19
+ if (mutate) {
20
+ Object.assign(opts, {
21
+ removeAdditional: true,
22
+ useDefaults: true,
23
+ coerceTypes: true,
24
+ allErrors: true,
25
+ });
26
+ }
27
+ if (clone) {
28
+ data = structuredClone(data);
29
+ }
30
+ if (!validator) {
31
+ validator = JsonSchema.createValidator(opts);
32
+ }
33
+ const validate = validator.compile(schema);
34
+ // consider reusing validate instance
35
+ const valid = validate(data);
36
+ const errors = validate.errors;
37
+ // localize(errors);
38
+ return {
39
+ data,
40
+ success: valid,
41
+ message: validator.errorsText(errors),
42
+ errors: errors,
43
+ };
43
44
  }
44
45
  let schemas = [];
45
46
  let createValidator = _createValidator;
46
47
  function addSchema(schema, { onConflict = 'throw' } = {}) {
47
- if (!schema.$id) throw new Error('Schema must have $id');
48
- switch(onConflict){
49
- case 'ignore':
50
- onConflict = (old)=>old;
51
- break;
52
- case 'replace':
53
- onConflict = (_, neo)=>neo;
54
- break;
55
- case 'throw':
56
- onConflict = (old, neo)=>{
57
- throw new Error(`Schema ${neo.$id} already exists`);
58
- };
59
- break;
60
- }
61
- let idx = schemas.findIndex((s)=>s.$id === schema.$id);
62
- if (idx >= 0) {
63
- schemas[idx] = onConflict(schemas[idx], schema);
64
- } else {
65
- schemas.push(schema);
66
- }
48
+ if (!schema.$id) throw new Error('Schema must have $id');
49
+ switch (onConflict) {
50
+ case 'ignore':
51
+ onConflict = (old) => old;
52
+ break;
53
+ case 'replace':
54
+ onConflict = (_, neo) => neo;
55
+ break;
56
+ case 'throw':
57
+ onConflict = (_old, neo) => {
58
+ throw new Error(`Schema ${neo.$id} already exists`);
59
+ };
60
+ break;
61
+ }
62
+ let idx = schemas.findIndex((s) => s.$id === schema.$id);
63
+ if (idx >= 0) {
64
+ schemas[idx] = onConflict(schemas[idx], schema);
65
+ } else {
66
+ schemas.push(schema);
67
+ }
67
68
  }
68
69
  /**
69
70
  * Check data is valid, will not use default
70
71
  */ function check(schema, data) {
71
- return validate({
72
- schema,
73
- data,
74
- mutate: false,
75
- clone: true
76
- });
72
+ return validate({
73
+ schema,
74
+ data,
75
+ mutate: false,
76
+ clone: true,
77
+ });
77
78
  }
78
79
  /**
79
80
  * Parse data with default value and coerceTypes
80
81
  */ function safeParse(schema, data) {
81
- return validate({
82
- schema,
83
- data,
84
- mutate: true,
85
- clone: true
86
- });
82
+ return validate({
83
+ schema,
84
+ data,
85
+ mutate: true,
86
+ clone: true,
87
+ });
87
88
  }
88
89
  function parse(schema, data) {
89
- const { data: out, message, errors } = validate({
90
- schema,
91
- data,
92
- mutate: true,
93
- clone: true
94
- });
95
- if (errors) {
96
- throw new Error(message);
97
- }
98
- return out;
90
+ const {
91
+ data: out,
92
+ message,
93
+ errors,
94
+ } = validate({
95
+ schema,
96
+ data,
97
+ mutate: true,
98
+ clone: true,
99
+ });
100
+ if (errors) {
101
+ throw new Error(message);
102
+ }
103
+ return out;
99
104
  }
100
105
  function create(schema, data) {
101
- // will not ensure value match the rule
102
- return match(schema).returnType().with({
103
- const: P.nonNullable
104
- }, (v)=>v).with({
105
- default: P.select()
106
- }, (v)=>v).with({
107
- anyOf: P.nonNullable
108
- }, (schema)=>{
109
- return create(schema.anyOf[0]);
110
- }).with({
111
- oneOf: P.nonNullable
112
- }, (schema)=>{
113
- return create(schema.oneOf[0]);
114
- }).with({
115
- type: 'string'
116
- }, (schema)=>'').with({
117
- type: P.union('number', 'integer')
118
- }, (schema)=>0).with({
119
- type: 'object'
120
- }, (schema)=>{
121
- let out = validate({
122
- schema,
123
- data: data ?? {},
124
- mutate: true
125
- });
126
- if (!out.success) {
127
- // fallback
128
- let obj = data || {};
129
- schema.required?.forEach((key)=>{
130
- if (!(key in obj)) {
131
- let last = obj[key];
132
- let prop = schema.properties?.[key];
133
- if (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);
134
- }
135
- });
136
- out = validate({
137
- schema,
138
- data: obj,
139
- mutate: true
140
- });
141
- if (!out.success) {
142
- console.warn(`Failed to create object with schema: ${out.message}`);
143
- }
144
- }
145
- return out.data;
146
- }).with({
147
- type: 'null'
148
- }, ()=>null).with({
149
- type: 'boolean'
150
- }, (schema)=>false).with({
151
- type: 'array'
152
- }, (schema)=>[]).otherwise(()=>{
153
- return undefined;
154
- });
106
+ // will not ensure value match the rule
107
+ return match(schema)
108
+ .returnType()
109
+ .with(
110
+ {
111
+ const: P.nonNullable,
112
+ },
113
+ (v) => v,
114
+ )
115
+ .with(
116
+ {
117
+ default: P.select(),
118
+ },
119
+ (v) => v,
120
+ )
121
+ .with(
122
+ {
123
+ anyOf: P.nonNullable,
124
+ },
125
+ (schema) => {
126
+ return create(schema.anyOf[0]);
127
+ },
128
+ )
129
+ .with(
130
+ {
131
+ oneOf: P.nonNullable,
132
+ },
133
+ (schema) => {
134
+ return create(schema.oneOf[0]);
135
+ },
136
+ )
137
+ .with(
138
+ {
139
+ type: 'string',
140
+ },
141
+ (_schema) => '',
142
+ )
143
+ .with(
144
+ {
145
+ type: P.union('number', 'integer'),
146
+ },
147
+ (_schema) => 0,
148
+ )
149
+ .with(
150
+ {
151
+ type: 'object',
152
+ },
153
+ (schema) => {
154
+ let out = validate({
155
+ schema,
156
+ data: data ?? {},
157
+ mutate: true,
158
+ });
159
+ if (!out.success) {
160
+ // fallback
161
+ let obj = data || {};
162
+ schema.required?.forEach((key) => {
163
+ if (!(key in obj)) {
164
+ let last = obj[key];
165
+ let prop = schema.properties?.[key];
166
+ if (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);
167
+ }
168
+ });
169
+ out = validate({
170
+ schema,
171
+ data: obj,
172
+ mutate: true,
173
+ });
174
+ if (!out.success) {
175
+ console.warn(`Failed to create object with schema: ${out.message}`);
176
+ }
177
+ }
178
+ return out.data;
179
+ },
180
+ )
181
+ .with(
182
+ {
183
+ type: 'null',
184
+ },
185
+ () => null,
186
+ )
187
+ .with(
188
+ {
189
+ type: 'boolean',
190
+ },
191
+ (_schema) => false,
192
+ )
193
+ .with(
194
+ {
195
+ type: 'array',
196
+ },
197
+ (_schema) => [],
198
+ )
199
+ .otherwise(() => {
200
+ return undefined;
201
+ });
155
202
  }
156
203
  function isPrimitiveType(schema) {
157
- return match(schema).returnType().with({
158
- type: P.union('number', 'integer', 'string', 'boolean')
159
- }, ()=>true).with({
160
- anyOf: P.nonNullable
161
- }, (schema)=>{
162
- return isPrimitiveType(schema.anyOf[0]);
163
- }).with({
164
- oneOf: P.nonNullable
165
- }, (schema)=>{
166
- return isPrimitiveType(schema.oneOf[0]);
167
- }).otherwise(()=>false);
204
+ return match(schema)
205
+ .returnType()
206
+ .with(
207
+ {
208
+ type: P.union('number', 'integer', 'string', 'boolean'),
209
+ },
210
+ () => true,
211
+ )
212
+ .with(
213
+ {
214
+ anyOf: P.nonNullable,
215
+ },
216
+ (schema) => {
217
+ return isPrimitiveType(schema.anyOf[0]);
218
+ },
219
+ )
220
+ .with(
221
+ {
222
+ oneOf: P.nonNullable,
223
+ },
224
+ (schema) => {
225
+ return isPrimitiveType(schema.oneOf[0]);
226
+ },
227
+ )
228
+ .otherwise(() => false);
168
229
  }
169
230
  export const JsonSchema = {
170
- createValidator,
171
- addSchema,
172
- schemas,
173
- check,
174
- safeParse,
175
- parse,
176
- create,
177
- isPrimitiveType
231
+ createValidator,
232
+ addSchema,
233
+ schemas,
234
+ check,
235
+ safeParse,
236
+ parse,
237
+ create,
238
+ isPrimitiveType,
178
239
  };
179
240
 
180
- //# sourceMappingURL=JsonSchema.js.map
241
+ //# sourceMappingURL=JsonSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport { isNil } from '@wener/utils';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport addKeywords from 'ajv-keywords';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createValidator(opt: Options) {\n\tconst ajv = new Ajv(opt);\n\taddKeywords(ajv);\n\taddFormats(ajv);\n\treturn ajv;\n}\n\ntype ValidateOptions = { mutate?: boolean; clone?: boolean; validator?: Ajv };\n\ntype ValidateResult<T> =\n\t| { data: T; success: true; message: undefined }\n\t| { data: undefined; success: false; message: string; errors: ErrorObject[] };\n\nfunction validate({ schema, data, mutate, clone, validator }: ValidateOptions & { schema: any; data: any }) {\n\tlet opts: Options = {\n\t\t// strict: 'log',\n\t\tstrict: true,\n\t\tstrictSchema: 'log', // skip unknown keywords in schema\n\t};\n\n\tif (mutate) {\n\t\tObject.assign(opts, { removeAdditional: true, useDefaults: true, coerceTypes: true, allErrors: true });\n\t}\n\n\tif (clone) {\n\t\tdata = structuredClone(data);\n\t}\n\n\tif (!validator) {\n\t\tvalidator = JsonSchema.createValidator(opts);\n\t}\n\n\tconst validate = validator.compile(schema);\n\n\t// consider reusing validate instance\n\n\tconst valid = validate(data);\n\tconst errors = validate.errors;\n\t// localize(errors);\n\n\treturn { data, success: valid, message: validator.errorsText(errors), errors: errors };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nlet schemas: JsonSchemaDef[] = [];\n\nlet createValidator = _createValidator;\n\nfunction addSchema(\n\tschema: JsonSchemaDef,\n\t{\n\t\tonConflict = 'throw',\n\t}: {\n\t\tonConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n\t} = {},\n) {\n\tif (!schema.$id) throw new Error('Schema must have $id');\n\tswitch (onConflict) {\n\t\tcase 'ignore':\n\t\t\tonConflict = (old) => old;\n\t\t\tbreak;\n\t\tcase 'replace':\n\t\t\tonConflict = (_, neo) => neo;\n\t\t\tbreak;\n\t\tcase 'throw':\n\t\t\tonConflict = (old, neo) => {\n\t\t\t\tthrow new Error(`Schema ${neo.$id} already exists`);\n\t\t\t};\n\t\t\tbreak;\n\t}\n\tlet idx = schemas.findIndex((s) => s.$id === schema.$id);\n\tif (idx >= 0) {\n\t\tschemas[idx] = onConflict(schemas[idx], schema);\n\t} else {\n\t\tschemas.push(schema);\n\t}\n}\n\n/**\n * Check data is valid, will not use default\n */\nfunction check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: false, clone: true }) as any;\n}\n\n/**\n * Parse data with default value and coerceTypes\n */\nfunction safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: true, clone: true }) as any;\n}\n\nfunction parse<S>(schema: S, data: any): TypeOfSchema<S> {\n\tconst { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n\tif (errors) {\n\t\tthrow new Error(message);\n\t}\n\treturn out;\n}\n\nfunction create<S>(schema: S, data?: any): TypeOfSchema<S> {\n\t// will not ensure value match the rule\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<any>()\n\t\t.with({ const: P.nonNullable }, (v) => v)\n\t\t.with({ default: P.select() }, (v) => v)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.oneOf[0]);\n\t\t})\n\t\t.with({ type: 'string' }, (schema) => '')\n\t\t.with({ type: P.union('number', 'integer') }, (schema) => 0)\n\t\t.with({ type: 'object' }, (schema: JsonSchemaDef) => {\n\t\t\tlet out = validate({ schema, data: data ?? {}, mutate: true });\n\t\t\tif (!out.success) {\n\t\t\t\t// fallback\n\t\t\t\tlet obj = data || {};\n\t\t\t\tschema.required?.forEach((key) => {\n\t\t\t\t\tif (!(key in obj)) {\n\t\t\t\t\t\tlet last = obj[key];\n\t\t\t\t\t\tlet prop = schema.properties?.[key];\n\t\t\t\t\t\tif (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tout = validate({ schema, data: obj, mutate: true });\n\t\t\t\tif (!out.success) {\n\t\t\t\t\tconsole.warn(`Failed to create object with schema: ${out.message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out.data;\n\t\t})\n\t\t.with({ type: 'null' }, () => null)\n\t\t.with({ type: 'boolean' }, (schema) => false)\n\t\t.with({ type: 'array' }, (schema) => [])\n\t\t.otherwise(() => {\n\t\t\treturn undefined;\n\t\t});\n}\n\nfunction isPrimitiveType(schema: any): boolean {\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<boolean>()\n\t\t.with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.oneOf[0]);\n\t\t})\n\t\t.otherwise(() => false);\n}\n\nexport const JsonSchema = {\n\tcreateValidator,\n\taddSchema,\n\tschemas,\n\tcheck,\n\tsafeParse,\n\tparse,\n\tcreate,\n\tisPrimitiveType,\n} as const;\n"],"names":["isNil","Ajv","addFormats","addKeywords","match","P","_createValidator","opt","ajv","validate","schema","data","mutate","clone","validator","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createValidator","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","nonNullable","v","default","select","anyOf","oneOf","type","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport { isNil } from '@wener/utils';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport addKeywords from 'ajv-keywords';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createValidator(opt: Options) {\n\tconst ajv = new Ajv(opt);\n\taddKeywords(ajv);\n\taddFormats(ajv);\n\treturn ajv;\n}\n\ntype ValidateOptions = { mutate?: boolean; clone?: boolean; validator?: Ajv };\n\ntype ValidateResult<T> =\n\t| { data: T; success: true; message: undefined }\n\t| { data: undefined; success: false; message: string; errors: ErrorObject[] };\n\nfunction validate({ schema, data, mutate, clone, validator }: ValidateOptions & { schema: any; data: any }) {\n\tlet opts: Options = {\n\t\t// strict: 'log',\n\t\tstrict: true,\n\t\tstrictSchema: 'log', // skip unknown keywords in schema\n\t};\n\n\tif (mutate) {\n\t\tObject.assign(opts, { removeAdditional: true, useDefaults: true, coerceTypes: true, allErrors: true });\n\t}\n\n\tif (clone) {\n\t\tdata = structuredClone(data);\n\t}\n\n\tif (!validator) {\n\t\tvalidator = JsonSchema.createValidator(opts);\n\t}\n\n\tconst validate = validator.compile(schema);\n\n\t// consider reusing validate instance\n\n\tconst valid = validate(data);\n\tconst errors = validate.errors;\n\t// localize(errors);\n\n\treturn { data, success: valid, message: validator.errorsText(errors), errors: errors };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nlet schemas: JsonSchemaDef[] = [];\n\nlet createValidator = _createValidator;\n\nfunction addSchema(\n\tschema: JsonSchemaDef,\n\t{\n\t\tonConflict = 'throw',\n\t}: {\n\t\tonConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n\t} = {},\n) {\n\tif (!schema.$id) throw new Error('Schema must have $id');\n\tswitch (onConflict) {\n\t\tcase 'ignore':\n\t\t\tonConflict = (old) => old;\n\t\t\tbreak;\n\t\tcase 'replace':\n\t\t\tonConflict = (_, neo) => neo;\n\t\t\tbreak;\n\t\tcase 'throw':\n\t\t\tonConflict = (_old, neo) => {\n\t\t\t\tthrow new Error(`Schema ${neo.$id} already exists`);\n\t\t\t};\n\t\t\tbreak;\n\t}\n\tlet idx = schemas.findIndex((s) => s.$id === schema.$id);\n\tif (idx >= 0) {\n\t\tschemas[idx] = onConflict(schemas[idx], schema);\n\t} else {\n\t\tschemas.push(schema);\n\t}\n}\n\n/**\n * Check data is valid, will not use default\n */\nfunction check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: false, clone: true }) as any;\n}\n\n/**\n * Parse data with default value and coerceTypes\n */\nfunction safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: true, clone: true }) as any;\n}\n\nfunction parse<S>(schema: S, data: any): TypeOfSchema<S> {\n\tconst { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n\tif (errors) {\n\t\tthrow new Error(message);\n\t}\n\treturn out;\n}\n\nfunction create<S>(schema: S, data?: any): TypeOfSchema<S> {\n\t// will not ensure value match the rule\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<any>()\n\t\t.with({ const: P.nonNullable }, (v) => v)\n\t\t.with({ default: P.select() }, (v) => v)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.oneOf[0]);\n\t\t})\n\t\t.with({ type: 'string' }, (_schema) => '')\n\t\t.with({ type: P.union('number', 'integer') }, (_schema) => 0)\n\t\t.with({ type: 'object' }, (schema: JsonSchemaDef) => {\n\t\t\tlet out = validate({ schema, data: data ?? {}, mutate: true });\n\t\t\tif (!out.success) {\n\t\t\t\t// fallback\n\t\t\t\tlet obj = data || {};\n\t\t\t\tschema.required?.forEach((key) => {\n\t\t\t\t\tif (!(key in obj)) {\n\t\t\t\t\t\tlet last = obj[key];\n\t\t\t\t\t\tlet prop = schema.properties?.[key];\n\t\t\t\t\t\tif (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tout = validate({ schema, data: obj, mutate: true });\n\t\t\t\tif (!out.success) {\n\t\t\t\t\tconsole.warn(`Failed to create object with schema: ${out.message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out.data;\n\t\t})\n\t\t.with({ type: 'null' }, () => null)\n\t\t.with({ type: 'boolean' }, (_schema) => false)\n\t\t.with({ type: 'array' }, (_schema) => [])\n\t\t.otherwise(() => {\n\t\t\treturn undefined;\n\t\t});\n}\n\nfunction isPrimitiveType(schema: any): boolean {\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<boolean>()\n\t\t.with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.oneOf[0]);\n\t\t})\n\t\t.otherwise(() => false);\n}\n\nexport const JsonSchema = {\n\tcreateValidator,\n\taddSchema,\n\tschemas,\n\tcheck,\n\tsafeParse,\n\tparse,\n\tcreate,\n\tisPrimitiveType,\n} as const;\n"],"names":["isNil","Ajv","addFormats","addKeywords","match","P","_createValidator","opt","ajv","validate","schema","data","mutate","clone","validator","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createValidator","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","_old","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","nonNullable","v","default","select","anyOf","oneOf","type","_schema","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"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"}