@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,198 +1,204 @@
1
- import { omit, remove } from "es-toolkit";
2
- import { match, P } from "ts-pattern";
3
- import { z } from "zod/v4";
4
- import { getSchemaCache } from "./getSchemaCache.js";
5
- import { isTypeBoxSchema, isZodSchema } from "./validate.js";
1
+ import { omit, remove } from 'es-toolkit';
2
+ import { match, P } from 'ts-pattern';
3
+ import { z } from 'zod/v4';
4
+ import { getSchemaCache } from './getSchemaCache.js';
5
+ import { isTypeBoxSchema, isZodSchema } from './validate.js';
6
6
  export function toJsonSchema(schema) {
7
- if (isZodSchema(schema)) {
8
- return getSchemaCache(schema, "jsonschema", () => {
9
- // zod v4
10
- let js = z.toJSONSchema(schema, {
11
- unrepresentable: "any",
12
- override: ({ zodSchema, jsonSchema: js }) => {
13
- const def = zodSchema._zod.def;
14
- const meta = z.globalRegistry.get(zodSchema);
15
- if (meta) {
16
- Object.assign(js, meta);
17
- }
18
- switch (def.type) {
19
- case "union":
20
- if (zodSchema._zod.traits.has("ZodDiscriminatedUnion")) {
21
- resolveDiscriminator(js);
22
- }
23
- break;
24
- case "nonoptional":
25
- // js._ref maybe true
26
- js.nullable = false;
27
- break;
28
- case "nullable":
29
- case "optional":
30
- // prefer nullable
31
- match(js).with({
32
- anyOf: [
33
- P.select(),
34
- {
35
- type: "null"
36
- }
37
- ]
38
- }, (select) => {
39
- delete js["anyOf"];
40
- Object.assign(js, select);
41
- js.nullable = true;
42
- }).otherwise((js) => {
43
- js.nullable = true;
44
- });
45
- break;
46
- }
47
- }
48
- });
49
- // remove redundant nullable, ensure required is sorted
50
- visit(js, (v) => {
51
- if (v.nullable === false) {
52
- delete v.nullable;
53
- }
54
- if (v.required) {
55
- v.required.sort();
56
- }
57
- });
58
- // maybe freeze
59
- return js;
60
- });
61
- }
62
- if (isTypeBoxSchema(schema)) {
63
- return schema;
64
- }
65
- return schema;
7
+ if (isZodSchema(schema)) {
8
+ return getSchemaCache(schema, 'jsonschema', () => {
9
+ // zod v4
10
+ let js = z.toJSONSchema(schema, {
11
+ unrepresentable: 'any',
12
+ override: ({ zodSchema, jsonSchema: js }) => {
13
+ const def = zodSchema._zod.def;
14
+ const meta = z.globalRegistry.get(zodSchema);
15
+ if (meta) {
16
+ Object.assign(js, meta);
17
+ }
18
+ switch (def.type) {
19
+ case 'union':
20
+ if (zodSchema._zod.traits.has('ZodDiscriminatedUnion')) {
21
+ resolveDiscriminator(js);
22
+ }
23
+ break;
24
+ case 'nonoptional':
25
+ // js._ref maybe true
26
+ js.nullable = false;
27
+ break;
28
+ case 'nullable':
29
+ case 'optional':
30
+ // prefer nullable
31
+ match(js)
32
+ .with(
33
+ {
34
+ anyOf: [
35
+ P.select(),
36
+ {
37
+ type: 'null',
38
+ },
39
+ ],
40
+ },
41
+ (select) => {
42
+ delete js.anyOf;
43
+ Object.assign(js, select);
44
+ js.nullable = true;
45
+ },
46
+ )
47
+ .otherwise((js) => {
48
+ js.nullable = true;
49
+ });
50
+ break;
51
+ }
52
+ },
53
+ });
54
+ // remove redundant nullable, ensure required is sorted
55
+ visit(js, (v) => {
56
+ if (v.nullable === false) {
57
+ delete v.nullable;
58
+ }
59
+ if (v.required) {
60
+ v.required.sort();
61
+ }
62
+ });
63
+ // maybe freeze
64
+ return js;
65
+ });
66
+ }
67
+ if (isTypeBoxSchema(schema)) {
68
+ return schema;
69
+ }
70
+ return schema;
66
71
  }
67
72
  function visit(js, f) {
68
- const _visit = (js, f, parent, path, k) => {
69
- if (!js) {
70
- return;
71
- }
72
- f(js);
73
- if (js.properties) {
74
- for (const [k, v] of Object.entries(js.properties)) {
75
- if (v) {
76
- _visit(v, f, js, path.concat(k), "properties");
77
- }
78
- }
79
- }
80
- else if (js.items) {
81
- if (Array.isArray(js.items)) {
82
- for (const v of js.items) {
83
- _visit(v, f, js, path, "items");
84
- }
85
- }
86
- else {
87
- _visit(js.items, f, js, path, "items");
88
- }
89
- }
90
- else if (js.anyOf) {
91
- for (const v of js.anyOf) {
92
- _visit(v, f, js, path, "anyOf");
93
- }
94
- }
95
- else if (js.oneOf) {
96
- for (const v of js.oneOf) {
97
- _visit(v, f, js, path, "oneOf");
98
- }
99
- }
100
- else if (js.allOf) {
101
- for (const v of js.allOf) {
102
- _visit(v, f, js, path, "allOf");
103
- }
104
- }
105
- };
106
- _visit(js, f, undefined, []);
73
+ const _visit = (js, f, _parent, path, _k) => {
74
+ if (!js) {
75
+ return;
76
+ }
77
+ f(js);
78
+ if (js.properties) {
79
+ for (const [k, v] of Object.entries(js.properties)) {
80
+ if (v) {
81
+ _visit(v, f, js, path.concat(k), 'properties');
82
+ }
83
+ }
84
+ } else if (js.items) {
85
+ if (Array.isArray(js.items)) {
86
+ for (const v of js.items) {
87
+ _visit(v, f, js, path, 'items');
88
+ }
89
+ } else {
90
+ _visit(js.items, f, js, path, 'items');
91
+ }
92
+ } else if (js.anyOf) {
93
+ for (const v of js.anyOf) {
94
+ _visit(v, f, js, path, 'anyOf');
95
+ }
96
+ } else if (js.oneOf) {
97
+ for (const v of js.oneOf) {
98
+ _visit(v, f, js, path, 'oneOf');
99
+ }
100
+ } else if (js.allOf) {
101
+ for (const v of js.allOf) {
102
+ _visit(v, f, js, path, 'allOf');
103
+ }
104
+ }
105
+ };
106
+ _visit(js, f, undefined, []);
107
107
  }
108
- function resolveJsonSchemaDef(js, ctx) {
109
- return match(js).with({
110
- anyOf: [
111
- P.select(),
112
- {
113
- type: "null"
114
- }
115
- ]
116
- }, (select) => {
117
- return {
118
- ...omit(js, [
119
- "anyOf"
120
- ]),
121
- ...select,
122
- nullable: true
123
- };
124
- }).with({
125
- properties: P.nonNullable
126
- }, (schema) => {
127
- for (const key in schema.properties) {
128
- const prop = schema.properties[key];
129
- if (prop) {
130
- schema.properties[key] = resolveJsonSchemaDef(prop, {
131
- parent: schema,
132
- key
133
- });
134
- }
135
- }
136
- return schema;
137
- }).otherwise(() => {
138
- return js;
139
- });
108
+ function _resolveJsonSchemaDef(js, _ctx) {
109
+ return match(js)
110
+ .with(
111
+ {
112
+ anyOf: [
113
+ P.select(),
114
+ {
115
+ type: 'null',
116
+ },
117
+ ],
118
+ },
119
+ (select) => {
120
+ return {
121
+ ...omit(js, ['anyOf']),
122
+ ...select,
123
+ nullable: true,
124
+ };
125
+ },
126
+ )
127
+ .with(
128
+ {
129
+ properties: P.nonNullable,
130
+ },
131
+ (schema) => {
132
+ for (const key in schema.properties) {
133
+ const prop = schema.properties[key];
134
+ if (prop) {
135
+ schema.properties[key] = _resolveJsonSchemaDef(prop, {
136
+ parent: schema,
137
+ key,
138
+ });
139
+ }
140
+ }
141
+ return schema;
142
+ },
143
+ )
144
+ .otherwise(() => {
145
+ return js;
146
+ });
140
147
  }
141
148
  function resolveDiscriminator(jsd) {
142
- if (!(jsd.anyOf && jsd.anyOf.length > 1)) {
143
- return;
144
- }
145
- if (jsd.discriminator) {
146
- return;
147
- }
148
- let names = [];
149
- {
150
- // candidate for discriminator
151
- const v = jsd.anyOf[0];
152
- if (v && v.type === "object" && v.properties) {
153
- if (Array.isArray(v.required)) {
154
- for (const k of v.required) {
155
- if (v.properties[k].const !== undefined) {
156
- names.push(k);
157
- }
158
- }
159
- }
160
- }
161
- }
162
- if (names.length >= 1) {
163
- for (let i = 0; i < jsd.anyOf.length; i++) {
164
- if (i === 0) {
165
- continue;
166
- }
167
- if (!names.length) {
168
- break;
169
- }
170
- const v = jsd.anyOf[i];
171
- if (v && v.type === "object" && v.properties) {
172
- const props = v.properties;
173
- remove(names, (k) => {
174
- // dont care the mapping
175
- let p = props[k];
176
- switch (typeof p.const) {
177
- case "string":
178
- case "number":
179
- case "boolean":
180
- return false;
181
- default:
182
- return true;
183
- }
184
- });
185
- }
186
- else {
187
- names = [];
188
- break;
189
- }
190
- }
191
- }
192
- if (names.length === 1) {
193
- jsd.discriminator = {
194
- propertyName: names[0]
195
- };
196
- }
149
+ if (!(jsd.anyOf && jsd.anyOf.length > 1)) {
150
+ return;
151
+ }
152
+ if (jsd.discriminator) {
153
+ return;
154
+ }
155
+ let names = [];
156
+ {
157
+ // candidate for discriminator
158
+ const v = jsd.anyOf[0];
159
+ if (v && v.type === 'object' && v.properties) {
160
+ if (Array.isArray(v.required)) {
161
+ for (const k of v.required) {
162
+ if (v.properties[k].const !== undefined) {
163
+ names.push(k);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ if (names.length >= 1) {
170
+ for (let i = 0; i < jsd.anyOf.length; i++) {
171
+ if (i === 0) {
172
+ continue;
173
+ }
174
+ if (!names.length) {
175
+ break;
176
+ }
177
+ const v = jsd.anyOf[i];
178
+ if (v && v.type === 'object' && v.properties) {
179
+ const props = v.properties;
180
+ remove(names, (k) => {
181
+ // dont care the mapping
182
+ let p = props[k];
183
+ switch (typeof p.const) {
184
+ case 'string':
185
+ case 'number':
186
+ case 'boolean':
187
+ return false;
188
+ default:
189
+ return true;
190
+ }
191
+ });
192
+ } else {
193
+ names = [];
194
+ break;
195
+ }
196
+ }
197
+ }
198
+ if (names.length === 1) {
199
+ jsd.discriminator = {
200
+ propertyName: names[0],
201
+ };
202
+ }
197
203
  }
198
204
  //# sourceMappingURL=toJsonSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/toJsonSchema.ts"],"sourcesContent":["import { omit, remove } from 'es-toolkit';\nimport { match, P } from 'ts-pattern';\nimport { z } from 'zod/v4';\nimport type { JsonSchemaDef } from '../jsonschema';\nimport { getSchemaCache } from './getSchemaCache';\nimport type { TypeSchema } from './TypeSchema';\nimport { isTypeBoxSchema, isZodSchema } from './validate';\n\nexport function toJsonSchema(schema: TypeSchema): JsonSchemaDef {\n\tif (isZodSchema(schema)) {\n\t\treturn getSchemaCache(schema, 'jsonschema', () => {\n\t\t\t// zod v4\n\t\t\tlet js = z.toJSONSchema(schema, {\n\t\t\t\tunrepresentable: 'any',\n\t\t\t\toverride: ({ zodSchema, jsonSchema: js }) => {\n\t\t\t\t\tconst def = zodSchema._zod.def;\n\t\t\t\t\tconst meta = z.globalRegistry.get(zodSchema);\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tObject.assign(js, meta);\n\t\t\t\t\t}\n\t\t\t\t\tswitch (def.type) {\n\t\t\t\t\t\tcase 'union':\n\t\t\t\t\t\t\tif (zodSchema._zod.traits.has('ZodDiscriminatedUnion')) {\n\t\t\t\t\t\t\t\tresolveDiscriminator(js as JsonSchemaDef);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'nonoptional':\n\t\t\t\t\t\t\t// js._ref maybe true\n\t\t\t\t\t\t\tjs.nullable = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'nullable':\n\t\t\t\t\t\tcase 'optional':\n\t\t\t\t\t\t\t// prefer nullable\n\t\t\t\t\t\t\tmatch(js)\n\t\t\t\t\t\t\t\t.with({ anyOf: [P.select(), { type: 'null' }] }, (select) => {\n\t\t\t\t\t\t\t\t\tdelete js['anyOf'];\n\t\t\t\t\t\t\t\t\tObject.assign(js, select);\n\t\t\t\t\t\t\t\t\tjs.nullable = true;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.otherwise((js) => {\n\t\t\t\t\t\t\t\t\tjs.nullable = true;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}) as JsonSchemaDef;\n\n\t\t\t// remove redundant nullable, ensure required is sorted\n\t\t\tvisit(js, (v) => {\n\t\t\t\tif (v.nullable === false) {\n\t\t\t\t\tdelete v.nullable;\n\t\t\t\t}\n\t\t\t\tif (v.required) {\n\t\t\t\t\tv.required.sort();\n\t\t\t\t}\n\t\t\t});\n\t\t\t// maybe freeze\n\t\t\treturn js;\n\t\t});\n\t}\n\n\tif (isTypeBoxSchema(schema)) {\n\t\treturn schema as JsonSchemaDef;\n\t}\n\n\treturn schema as JsonSchemaDef;\n}\n\nfunction visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {\n\tconst _visit = (\n\t\tjs: JsonSchemaDef,\n\t\tf: (js: JsonSchemaDef) => void,\n\t\tparent: JsonSchemaDef | undefined,\n\t\tpath: string[],\n\t\tk?: string,\n\t) => {\n\t\tif (!js) {\n\t\t\treturn;\n\t\t}\n\t\tf(js);\n\t\tif (js.properties) {\n\t\t\tfor (const [k, v] of Object.entries(js.properties)) {\n\t\t\t\tif (v) {\n\t\t\t\t\t_visit(v, f, js, path.concat(k), 'properties');\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (js.items) {\n\t\t\tif (Array.isArray(js.items)) {\n\t\t\t\tfor (const v of js.items) {\n\t\t\t\t\t_visit(v, f, js, path, 'items');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_visit(js.items, f, js, path, 'items');\n\t\t\t}\n\t\t} else if (js.anyOf) {\n\t\t\tfor (const v of js.anyOf) {\n\t\t\t\t_visit(v, f, js, path, 'anyOf');\n\t\t\t}\n\t\t} else if (js.oneOf) {\n\t\t\tfor (const v of js.oneOf) {\n\t\t\t\t_visit(v, f, js, path, 'oneOf');\n\t\t\t}\n\t\t} else if (js.allOf) {\n\t\t\tfor (const v of js.allOf) {\n\t\t\t\t_visit(v, f, js, path, 'allOf');\n\t\t\t}\n\t\t}\n\t};\n\t_visit(js, f, undefined, []);\n}\n\nfunction resolveJsonSchemaDef(\n\tjs: JsonSchemaDef,\n\tctx?: {\n\t\tparent: JsonSchemaDef;\n\t\tkey: string;\n\t},\n) {\n\treturn match(js)\n\t\t.with(\n\t\t\t{\n\t\t\t\tanyOf: [P.select(), { type: 'null' }],\n\t\t\t},\n\t\t\t(select) => {\n\t\t\t\treturn { ...omit(js, ['anyOf']), ...select, nullable: true };\n\t\t\t},\n\t\t)\n\t\t.with({ properties: P.nonNullable }, (schema: JsonSchemaDef) => {\n\t\t\tfor (const key in schema.properties) {\n\t\t\t\tconst prop = schema.properties[key];\n\t\t\t\tif (prop) {\n\t\t\t\t\tschema.properties[key] = resolveJsonSchemaDef(prop, { parent: schema, key });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema;\n\t\t})\n\t\t.otherwise(() => {\n\t\t\treturn js;\n\t\t});\n}\n\nfunction resolveDiscriminator(jsd: JsonSchemaDef) {\n\tif (!(jsd.anyOf && jsd.anyOf.length > 1)) {\n\t\treturn;\n\t}\n\tif (jsd.discriminator) {\n\t\treturn;\n\t}\n\n\tlet names: string[] = [];\n\t{\n\t\t// candidate for discriminator\n\t\tconst v = jsd.anyOf[0];\n\t\tif (v && v.type === 'object' && v.properties) {\n\t\t\tif (Array.isArray(v.required)) {\n\t\t\t\tfor (const k of v.required) {\n\t\t\t\t\tif (v.properties[k].const !== undefined) {\n\t\t\t\t\t\tnames.push(k);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (names.length >= 1) {\n\t\tfor (let i = 0; i < jsd.anyOf.length; i++) {\n\t\t\tif (i === 0) {\n\t\t\t\t// skip first\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!names.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst v = jsd.anyOf[i];\n\t\t\tif (v && v.type === 'object' && v.properties) {\n\t\t\t\tconst props = v.properties;\n\t\t\t\tremove(names, (k) => {\n\t\t\t\t\t// dont care the mapping\n\t\t\t\t\tlet p = props[k];\n\t\t\t\t\tswitch (typeof p.const) {\n\t\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tnames = [];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (names.length === 1) {\n\t\tjsd.discriminator = {\n\t\t\tpropertyName: names[0],\n\t\t};\n\t}\n}\n"],"names":["omit","remove","match","P","z","getSchemaCache","isTypeBoxSchema","isZodSchema","toJsonSchema","schema","js","toJSONSchema","unrepresentable","override","zodSchema","jsonSchema","def","_zod","meta","globalRegistry","get","Object","assign","type","traits","has","resolveDiscriminator","nullable","with","anyOf","select","otherwise","visit","v","required","sort","f","_visit","parent","path","k","properties","entries","concat","items","Array","isArray","oneOf","allOf","undefined","resolveJsonSchemaDef","ctx","nonNullable","key","prop","jsd","length","discriminator","names","const","push","i","props","p","propertyName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/schema/toJsonSchema.ts"],"sourcesContent":["import { omit, remove } from 'es-toolkit';\nimport { match, P } from 'ts-pattern';\nimport { z } from 'zod/v4';\nimport type { JsonSchemaDef } from '../jsonschema';\nimport { getSchemaCache } from './getSchemaCache';\nimport type { TypeSchema } from './TypeSchema';\nimport { isTypeBoxSchema, isZodSchema } from './validate';\n\nexport function toJsonSchema(schema: TypeSchema): JsonSchemaDef {\n\tif (isZodSchema(schema)) {\n\t\treturn getSchemaCache(schema, 'jsonschema', () => {\n\t\t\t// zod v4\n\t\t\tlet js = z.toJSONSchema(schema, {\n\t\t\t\tunrepresentable: 'any',\n\t\t\t\toverride: ({ zodSchema, jsonSchema: js }) => {\n\t\t\t\t\tconst def = zodSchema._zod.def;\n\t\t\t\t\tconst meta = z.globalRegistry.get(zodSchema);\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tObject.assign(js, meta);\n\t\t\t\t\t}\n\t\t\t\t\tswitch (def.type) {\n\t\t\t\t\t\tcase 'union':\n\t\t\t\t\t\t\tif (zodSchema._zod.traits.has('ZodDiscriminatedUnion')) {\n\t\t\t\t\t\t\t\tresolveDiscriminator(js as JsonSchemaDef);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'nonoptional':\n\t\t\t\t\t\t\t// js._ref maybe true\n\t\t\t\t\t\t\tjs.nullable = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'nullable':\n\t\t\t\t\t\tcase 'optional':\n\t\t\t\t\t\t\t// prefer nullable\n\t\t\t\t\t\t\tmatch(js)\n\t\t\t\t\t\t\t\t.with({ anyOf: [P.select(), { type: 'null' }] }, (select) => {\n\t\t\t\t\t\t\t\t\tdelete js.anyOf;\n\t\t\t\t\t\t\t\t\tObject.assign(js, select);\n\t\t\t\t\t\t\t\t\tjs.nullable = true;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.otherwise((js) => {\n\t\t\t\t\t\t\t\t\tjs.nullable = true;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}) as JsonSchemaDef;\n\n\t\t\t// remove redundant nullable, ensure required is sorted\n\t\t\tvisit(js, (v) => {\n\t\t\t\tif (v.nullable === false) {\n\t\t\t\t\tdelete v.nullable;\n\t\t\t\t}\n\t\t\t\tif (v.required) {\n\t\t\t\t\tv.required.sort();\n\t\t\t\t}\n\t\t\t});\n\t\t\t// maybe freeze\n\t\t\treturn js;\n\t\t});\n\t}\n\n\tif (isTypeBoxSchema(schema)) {\n\t\treturn schema as JsonSchemaDef;\n\t}\n\n\treturn schema as JsonSchemaDef;\n}\n\nfunction visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {\n\tconst _visit = (\n\t\tjs: JsonSchemaDef,\n\t\tf: (js: JsonSchemaDef) => void,\n\t\t_parent: JsonSchemaDef | undefined,\n\t\tpath: string[],\n\t\t_k?: string,\n\t) => {\n\t\tif (!js) {\n\t\t\treturn;\n\t\t}\n\t\tf(js);\n\t\tif (js.properties) {\n\t\t\tfor (const [k, v] of Object.entries(js.properties)) {\n\t\t\t\tif (v) {\n\t\t\t\t\t_visit(v, f, js, path.concat(k), 'properties');\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (js.items) {\n\t\t\tif (Array.isArray(js.items)) {\n\t\t\t\tfor (const v of js.items) {\n\t\t\t\t\t_visit(v, f, js, path, 'items');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_visit(js.items, f, js, path, 'items');\n\t\t\t}\n\t\t} else if (js.anyOf) {\n\t\t\tfor (const v of js.anyOf) {\n\t\t\t\t_visit(v, f, js, path, 'anyOf');\n\t\t\t}\n\t\t} else if (js.oneOf) {\n\t\t\tfor (const v of js.oneOf) {\n\t\t\t\t_visit(v, f, js, path, 'oneOf');\n\t\t\t}\n\t\t} else if (js.allOf) {\n\t\t\tfor (const v of js.allOf) {\n\t\t\t\t_visit(v, f, js, path, 'allOf');\n\t\t\t}\n\t\t}\n\t};\n\t_visit(js, f, undefined, []);\n}\n\nfunction _resolveJsonSchemaDef(\n\tjs: JsonSchemaDef,\n\t_ctx?: {\n\t\tparent: JsonSchemaDef;\n\t\tkey: string;\n\t},\n) {\n\treturn match(js)\n\t\t.with(\n\t\t\t{\n\t\t\t\tanyOf: [P.select(), { type: 'null' }],\n\t\t\t},\n\t\t\t(select) => {\n\t\t\t\treturn { ...omit(js, ['anyOf']), ...select, nullable: true };\n\t\t\t},\n\t\t)\n\t\t.with({ properties: P.nonNullable }, (schema: JsonSchemaDef) => {\n\t\t\tfor (const key in schema.properties) {\n\t\t\t\tconst prop = schema.properties[key];\n\t\t\t\tif (prop) {\n\t\t\t\t\tschema.properties[key] = _resolveJsonSchemaDef(prop, { parent: schema, key });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema;\n\t\t})\n\t\t.otherwise(() => {\n\t\t\treturn js;\n\t\t});\n}\n\nfunction resolveDiscriminator(jsd: JsonSchemaDef) {\n\tif (!(jsd.anyOf && jsd.anyOf.length > 1)) {\n\t\treturn;\n\t}\n\tif (jsd.discriminator) {\n\t\treturn;\n\t}\n\n\tlet names: string[] = [];\n\t{\n\t\t// candidate for discriminator\n\t\tconst v = jsd.anyOf[0];\n\t\tif (v && v.type === 'object' && v.properties) {\n\t\t\tif (Array.isArray(v.required)) {\n\t\t\t\tfor (const k of v.required) {\n\t\t\t\t\tif (v.properties[k].const !== undefined) {\n\t\t\t\t\t\tnames.push(k);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (names.length >= 1) {\n\t\tfor (let i = 0; i < jsd.anyOf.length; i++) {\n\t\t\tif (i === 0) {\n\t\t\t\t// skip first\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!names.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst v = jsd.anyOf[i];\n\t\t\tif (v && v.type === 'object' && v.properties) {\n\t\t\t\tconst props = v.properties;\n\t\t\t\tremove(names, (k) => {\n\t\t\t\t\t// dont care the mapping\n\t\t\t\t\tlet p = props[k];\n\t\t\t\t\tswitch (typeof p.const) {\n\t\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tnames = [];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (names.length === 1) {\n\t\tjsd.discriminator = {\n\t\t\tpropertyName: names[0],\n\t\t};\n\t}\n}\n"],"names":["omit","remove","match","P","z","getSchemaCache","isTypeBoxSchema","isZodSchema","toJsonSchema","schema","js","toJSONSchema","unrepresentable","override","zodSchema","jsonSchema","def","_zod","meta","globalRegistry","get","Object","assign","type","traits","has","resolveDiscriminator","nullable","with","anyOf","select","otherwise","visit","v","required","sort","f","_visit","_parent","path","_k","properties","k","entries","concat","items","Array","isArray","oneOf","allOf","undefined","_resolveJsonSchemaDef","_ctx","nonNullable","key","prop","parent","jsd","length","discriminator","names","const","push","i","props","p","propertyName"],"mappings":"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"}
@@ -1,27 +1,35 @@
1
- import { inspect } from "node:util";
2
- import { describe, expect, it } from "vitest";
3
- import { z } from "zod/v4";
4
- import { toJsonSchema } from "./toJsonSchema.js";
5
- describe("toJsonSchema", function () {
6
- it("should handle discriminatedUnion", function () {
7
- console.log(inspect(toJsonSchema(z.discriminatedUnion("type", [
8
- z.object({
9
- type: z.literal("string"),
10
- value: z.string()
11
- }),
12
- z.object({
13
- type: z.literal("number"),
14
- value: z.number()
15
- })
16
- ])), {
17
- depth: 10,
18
- colors: true
19
- }));
20
- });
21
- it("should cache", function () {
22
- var zs = z.object({
23
- name: z.string()
24
- });
25
- expect(toJsonSchema(zs)).toBe(toJsonSchema(zs));
26
- });
1
+ import { inspect } from 'node:util';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { z } from 'zod/v4';
4
+ import { toJsonSchema } from './toJsonSchema.js';
5
+
6
+ describe('toJsonSchema', () => {
7
+ it('should handle discriminatedUnion', () => {
8
+ console.log(
9
+ inspect(
10
+ toJsonSchema(
11
+ z.discriminatedUnion('type', [
12
+ z.object({
13
+ type: z.literal('string'),
14
+ value: z.string(),
15
+ }),
16
+ z.object({
17
+ type: z.literal('number'),
18
+ value: z.number(),
19
+ }),
20
+ ]),
21
+ ),
22
+ {
23
+ depth: 10,
24
+ colors: true,
25
+ },
26
+ ),
27
+ );
28
+ });
29
+ it('should cache', () => {
30
+ var zs = z.object({
31
+ name: z.string(),
32
+ });
33
+ expect(toJsonSchema(zs)).toBe(toJsonSchema(zs));
34
+ });
27
35
  });