@es-joy/jsoe 0.24.2 → 0.25.0

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 (525) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.ncurc.cjs +2 -2
  3. package/CHANGES.md +51 -0
  4. package/README.md +23 -13
  5. package/badges/coverage-badge.svg +1 -1
  6. package/dist/eslint.config.d.ts +3 -0
  7. package/dist/eslint.config.d.ts.map +1 -0
  8. package/dist/formatAndTypeChoices.d.ts +28 -30
  9. package/dist/formatAndTypeChoices.d.ts.map +1 -1
  10. package/dist/formats/indexedDBKey.d.ts.map +1 -1
  11. package/dist/formats/schema.d.ts +46 -3
  12. package/dist/formats/schema.d.ts.map +1 -1
  13. package/dist/formats/structuredCloning.d.ts +3 -0
  14. package/dist/formats/structuredCloning.d.ts.map +1 -1
  15. package/dist/formats.d.ts +24 -6
  16. package/dist/formats.d.ts.map +1 -1
  17. package/dist/fundamentalTypes/BooleanObjectType.d.ts.map +1 -1
  18. package/dist/fundamentalTypes/NumberObjectType.d.ts.map +1 -1
  19. package/dist/fundamentalTypes/StringObjectType.d.ts.map +1 -1
  20. package/dist/fundamentalTypes/arrayReferenceType.d.ts.map +1 -1
  21. package/dist/fundamentalTypes/arrayType.d.ts +7 -0
  22. package/dist/fundamentalTypes/arrayType.d.ts.map +1 -1
  23. package/dist/fundamentalTypes/bigintObjectType.d.ts.map +1 -1
  24. package/dist/fundamentalTypes/bigintType.d.ts +10 -0
  25. package/dist/fundamentalTypes/bigintType.d.ts.map +1 -1
  26. package/dist/fundamentalTypes/blobType.d.ts.map +1 -1
  27. package/dist/fundamentalTypes/booleanType.d.ts.map +1 -1
  28. package/dist/fundamentalTypes/catchType.d.ts +2 -2
  29. package/dist/fundamentalTypes/catchType.d.ts.map +1 -1
  30. package/dist/fundamentalTypes/dateType.d.ts.map +1 -1
  31. package/dist/fundamentalTypes/domexceptionType.d.ts.map +1 -1
  32. package/dist/fundamentalTypes/enumType.d.ts +2 -2
  33. package/dist/fundamentalTypes/enumType.d.ts.map +1 -1
  34. package/dist/fundamentalTypes/errorType.d.ts.map +1 -1
  35. package/dist/fundamentalTypes/fileType.d.ts +6 -0
  36. package/dist/fundamentalTypes/fileType.d.ts.map +1 -1
  37. package/dist/fundamentalTypes/functionType.d.ts.map +1 -1
  38. package/dist/fundamentalTypes/literalType.d.ts +3 -2
  39. package/dist/fundamentalTypes/literalType.d.ts.map +1 -1
  40. package/dist/fundamentalTypes/looseRecordType.d.ts +6 -0
  41. package/dist/fundamentalTypes/looseRecordType.d.ts.map +1 -0
  42. package/dist/fundamentalTypes/nanType.d.ts.map +1 -1
  43. package/dist/fundamentalTypes/neverType.d.ts +2 -2
  44. package/dist/fundamentalTypes/neverType.d.ts.map +1 -1
  45. package/dist/fundamentalTypes/noneditableType.d.ts.map +1 -1
  46. package/dist/fundamentalTypes/nullType.d.ts.map +1 -1
  47. package/dist/fundamentalTypes/numberType.d.ts.map +1 -1
  48. package/dist/fundamentalTypes/promiseType.d.ts.map +1 -1
  49. package/dist/fundamentalTypes/regexpType.d.ts.map +1 -1
  50. package/dist/fundamentalTypes/stringType.d.ts.map +1 -1
  51. package/dist/fundamentalTypes/symbolType.d.ts.map +1 -1
  52. package/dist/fundamentalTypes/undefinedType.d.ts.map +1 -1
  53. package/dist/fundamentalTypes/voidType.d.ts +2 -2
  54. package/dist/fundamentalTypes/voidType.d.ts.map +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +6 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/rollup.config.d.ts +30 -0
  59. package/dist/rollup.config.d.ts.map +1 -0
  60. package/dist/server.d.ts +2 -0
  61. package/dist/server.d.ts.map +1 -0
  62. package/dist/src/formatAndTypeChoices.d.ts +108 -0
  63. package/dist/src/formatAndTypeChoices.d.ts.map +1 -0
  64. package/dist/src/formats/arbitraryJS.d.ts +4 -0
  65. package/dist/src/formats/arbitraryJS.d.ts.map +1 -0
  66. package/dist/src/formats/indexedDBKey.d.ts +4 -0
  67. package/dist/src/formats/indexedDBKey.d.ts.map +1 -0
  68. package/dist/src/formats/json.d.ts +4 -0
  69. package/dist/src/formats/json.d.ts.map +1 -0
  70. package/dist/src/formats/schema.d.ts +17 -0
  71. package/dist/src/formats/schema.d.ts.map +1 -0
  72. package/dist/src/formats/structuredCloning.d.ts +19 -0
  73. package/dist/src/formats/structuredCloning.d.ts.map +1 -0
  74. package/dist/src/formats.d.ts +135 -0
  75. package/dist/src/formats.d.ts.map +1 -0
  76. package/dist/src/fundamentalTypes/BooleanObjectType.d.ts +8 -0
  77. package/dist/src/fundamentalTypes/BooleanObjectType.d.ts.map +1 -0
  78. package/dist/src/fundamentalTypes/NumberObjectType.d.ts +6 -0
  79. package/dist/src/fundamentalTypes/NumberObjectType.d.ts.map +1 -0
  80. package/dist/src/fundamentalTypes/StringObjectType.d.ts +6 -0
  81. package/dist/src/fundamentalTypes/StringObjectType.d.ts.map +1 -0
  82. package/dist/src/fundamentalTypes/arrayReferenceType.d.ts +8 -0
  83. package/dist/src/fundamentalTypes/arrayReferenceType.d.ts.map +1 -0
  84. package/dist/src/fundamentalTypes/arrayType.d.ts +29 -0
  85. package/dist/src/fundamentalTypes/arrayType.d.ts.map +1 -0
  86. package/dist/src/fundamentalTypes/bigintObjectType.d.ts +6 -0
  87. package/dist/src/fundamentalTypes/bigintObjectType.d.ts.map +1 -0
  88. package/dist/src/fundamentalTypes/bigintType.d.ts +6 -0
  89. package/dist/src/fundamentalTypes/bigintType.d.ts.map +1 -0
  90. package/dist/src/fundamentalTypes/blobType.d.ts +11 -0
  91. package/dist/src/fundamentalTypes/blobType.d.ts.map +1 -0
  92. package/dist/src/fundamentalTypes/booleanType.d.ts +8 -0
  93. package/dist/src/fundamentalTypes/booleanType.d.ts.map +1 -0
  94. package/dist/src/fundamentalTypes/catchType.d.ts +6 -0
  95. package/dist/src/fundamentalTypes/catchType.d.ts.map +1 -0
  96. package/dist/src/fundamentalTypes/dateType.d.ts +26 -0
  97. package/dist/src/fundamentalTypes/dateType.d.ts.map +1 -0
  98. package/dist/src/fundamentalTypes/domexceptionType.d.ts +6 -0
  99. package/dist/src/fundamentalTypes/domexceptionType.d.ts.map +1 -0
  100. package/dist/src/fundamentalTypes/enumType.d.ts +6 -0
  101. package/dist/src/fundamentalTypes/enumType.d.ts.map +1 -0
  102. package/dist/src/fundamentalTypes/errorType.d.ts +6 -0
  103. package/dist/src/fundamentalTypes/errorType.d.ts.map +1 -0
  104. package/dist/src/fundamentalTypes/fileType.d.ts +13 -0
  105. package/dist/src/fundamentalTypes/fileType.d.ts.map +1 -0
  106. package/dist/src/fundamentalTypes/filelistType.d.ts +6 -0
  107. package/dist/src/fundamentalTypes/filelistType.d.ts.map +1 -0
  108. package/dist/src/fundamentalTypes/functionType.d.ts +7 -0
  109. package/dist/src/fundamentalTypes/functionType.d.ts.map +1 -0
  110. package/dist/src/fundamentalTypes/literalType.d.ts +6 -0
  111. package/dist/src/fundamentalTypes/literalType.d.ts.map +1 -0
  112. package/dist/src/fundamentalTypes/mapType.d.ts +6 -0
  113. package/dist/src/fundamentalTypes/mapType.d.ts.map +1 -0
  114. package/dist/src/fundamentalTypes/nanType.d.ts +6 -0
  115. package/dist/src/fundamentalTypes/nanType.d.ts.map +1 -0
  116. package/dist/src/fundamentalTypes/neverType.d.ts +6 -0
  117. package/dist/src/fundamentalTypes/neverType.d.ts.map +1 -0
  118. package/dist/src/fundamentalTypes/noneditableType.d.ts +6 -0
  119. package/dist/src/fundamentalTypes/noneditableType.d.ts.map +1 -0
  120. package/dist/src/fundamentalTypes/nullType.d.ts +6 -0
  121. package/dist/src/fundamentalTypes/nullType.d.ts.map +1 -0
  122. package/dist/src/fundamentalTypes/numberType.d.ts +6 -0
  123. package/dist/src/fundamentalTypes/numberType.d.ts.map +1 -0
  124. package/dist/src/fundamentalTypes/objectReferenceType.d.ts +8 -0
  125. package/dist/src/fundamentalTypes/objectReferenceType.d.ts.map +1 -0
  126. package/dist/src/fundamentalTypes/objectType.d.ts +6 -0
  127. package/dist/src/fundamentalTypes/objectType.d.ts.map +1 -0
  128. package/dist/src/fundamentalTypes/promiseType.d.ts +6 -0
  129. package/dist/src/fundamentalTypes/promiseType.d.ts.map +1 -0
  130. package/dist/src/fundamentalTypes/recordType.d.ts +6 -0
  131. package/dist/src/fundamentalTypes/recordType.d.ts.map +1 -0
  132. package/dist/src/fundamentalTypes/regexpType.d.ts +8 -0
  133. package/dist/src/fundamentalTypes/regexpType.d.ts.map +1 -0
  134. package/dist/src/fundamentalTypes/setType.d.ts +6 -0
  135. package/dist/src/fundamentalTypes/setType.d.ts.map +1 -0
  136. package/dist/src/fundamentalTypes/sparseUndefinedType.d.ts +6 -0
  137. package/dist/src/fundamentalTypes/sparseUndefinedType.d.ts.map +1 -0
  138. package/dist/src/fundamentalTypes/stringType.d.ts +6 -0
  139. package/dist/src/fundamentalTypes/stringType.d.ts.map +1 -0
  140. package/dist/src/fundamentalTypes/symbolType.d.ts +8 -0
  141. package/dist/src/fundamentalTypes/symbolType.d.ts.map +1 -0
  142. package/dist/src/fundamentalTypes/tupleType.d.ts +6 -0
  143. package/dist/src/fundamentalTypes/tupleType.d.ts.map +1 -0
  144. package/dist/src/fundamentalTypes/undefinedType.d.ts +6 -0
  145. package/dist/src/fundamentalTypes/undefinedType.d.ts.map +1 -0
  146. package/dist/src/fundamentalTypes/voidType.d.ts +6 -0
  147. package/dist/src/fundamentalTypes/voidType.d.ts.map +1 -0
  148. package/dist/src/index.d.ts +12 -0
  149. package/dist/src/index.d.ts.map +1 -0
  150. package/dist/src/subTypes/blobHTMLType.d.ts +20 -0
  151. package/dist/src/subTypes/blobHTMLType.d.ts.map +1 -0
  152. package/dist/src/subTypes/falseType.d.ts +8 -0
  153. package/dist/src/subTypes/falseType.d.ts.map +1 -0
  154. package/dist/src/subTypes/trueType.d.ts +8 -0
  155. package/dist/src/subTypes/trueType.d.ts.map +1 -0
  156. package/dist/src/superTypes/SpecialNumberType.d.ts +6 -0
  157. package/dist/src/superTypes/SpecialNumberType.d.ts.map +1 -0
  158. package/dist/src/superTypes/SpecialRealNumberType.d.ts +6 -0
  159. package/dist/src/superTypes/SpecialRealNumberType.d.ts.map +1 -0
  160. package/dist/src/superTypes/buffersourceType.d.ts +8 -0
  161. package/dist/src/superTypes/buffersourceType.d.ts.map +1 -0
  162. package/dist/src/superTypes/dommatrixType.d.ts +6 -0
  163. package/dist/src/superTypes/dommatrixType.d.ts.map +1 -0
  164. package/dist/src/superTypes/dompointType.d.ts +6 -0
  165. package/dist/src/superTypes/dompointType.d.ts.map +1 -0
  166. package/dist/src/superTypes/domrectType.d.ts +6 -0
  167. package/dist/src/superTypes/domrectType.d.ts.map +1 -0
  168. package/dist/src/superTypes/errorsSpecialType.d.ts +8 -0
  169. package/dist/src/superTypes/errorsSpecialType.d.ts.map +1 -0
  170. package/dist/src/typeChoices.d.ts +140 -0
  171. package/dist/src/typeChoices.d.ts.map +1 -0
  172. package/dist/src/types.d.ts +758 -0
  173. package/dist/src/types.d.ts.map +1 -0
  174. package/dist/src/utils/FileList.d.ts +26 -0
  175. package/dist/src/utils/FileList.d.ts.map +1 -0
  176. package/dist/src/utils/dialogs.d.ts +111 -0
  177. package/dist/src/utils/dialogs.d.ts.map +1 -0
  178. package/dist/src/utils/jsonPointer.d.ts +46 -0
  179. package/dist/src/utils/jsonPointer.d.ts.map +1 -0
  180. package/dist/src/utils/media.d.ts +18 -0
  181. package/dist/src/utils/media.d.ts.map +1 -0
  182. package/dist/src/utils/objects.d.ts +16 -0
  183. package/dist/src/utils/objects.d.ts.map +1 -0
  184. package/dist/src/utils/templateUtils.d.ts +59 -0
  185. package/dist/src/utils/templateUtils.d.ts.map +1 -0
  186. package/dist/src/utils/types.d.ts +2 -0
  187. package/dist/src/utils/types.d.ts.map +1 -0
  188. package/dist/src/vendor-imports.d.ts +4 -0
  189. package/dist/src/vendor-imports.d.ts.map +1 -0
  190. package/dist/subTypes/blobHTMLType.d.ts.map +1 -1
  191. package/dist/superTypes/SpecialRealNumberType.d.ts.map +1 -1
  192. package/dist/superTypes/buffersourceType.d.ts.map +1 -1
  193. package/dist/superTypes/dommatrixType.d.ts.map +1 -1
  194. package/dist/superTypes/dompointType.d.ts.map +1 -1
  195. package/dist/superTypes/domrectType.d.ts.map +1 -1
  196. package/dist/superTypes/errorsSpecialType.d.ts.map +1 -1
  197. package/dist/typeChoices.d.ts +21 -87
  198. package/dist/typeChoices.d.ts.map +1 -1
  199. package/dist/types.d.ts +90 -64
  200. package/dist/types.d.ts.map +1 -1
  201. package/dist/utils/FileList.d.ts +4 -3
  202. package/dist/utils/FileList.d.ts.map +1 -1
  203. package/dist/utils/dialogs.d.ts +4 -4
  204. package/dist/utils/dialogs.d.ts.map +1 -1
  205. package/dist/utils/media.d.ts.map +1 -1
  206. package/dist/utils/schemaMeta.d.ts +92 -0
  207. package/dist/utils/schemaMeta.d.ts.map +1 -0
  208. package/dist/utils/templateUtils.d.ts +3 -3
  209. package/dist/utils/templateUtils.d.ts.map +1 -1
  210. package/dist/utils/timing.d.ts +2 -0
  211. package/dist/utils/timing.d.ts.map +1 -0
  212. package/dist/utils/types.d.ts +1 -0
  213. package/dist/utils/types.d.ts.map +1 -1
  214. package/dist/vendor-imports.d.ts +3 -1
  215. package/docs/proposals/schema-meta.md +233 -0
  216. package/eslint.config.js +51 -4
  217. package/licenseInfo.json +1 -1
  218. package/package.json +52 -42
  219. package/pnpm-workspace.yaml +57 -0
  220. package/rollup.config.js +20 -18
  221. package/server.js +3 -3
  222. package/src/deepEqual.js +77 -66
  223. package/src/deepEqual.js.map +1 -1
  224. package/src/formatAndTypeChoices.js +62 -58
  225. package/src/formats/indexedDBKey.js +3 -4
  226. package/src/formats/schema.js +824 -475
  227. package/src/formats/structuredCloning.js +189 -80
  228. package/src/formats.js +17 -5
  229. package/src/fundamentalTypes/BooleanObjectType.js +4 -5
  230. package/src/fundamentalTypes/NumberObjectType.js +4 -4
  231. package/src/fundamentalTypes/StringObjectType.js +3 -4
  232. package/src/fundamentalTypes/arrayReferenceType.js +0 -2
  233. package/src/fundamentalTypes/arrayType.js +624 -389
  234. package/src/fundamentalTypes/bigintObjectType.js +3 -2
  235. package/src/fundamentalTypes/bigintType.js +79 -17
  236. package/src/fundamentalTypes/blobType.js +35 -35
  237. package/src/fundamentalTypes/booleanType.js +16 -8
  238. package/src/fundamentalTypes/dateType.js +6 -8
  239. package/src/fundamentalTypes/domexceptionType.js +5 -4
  240. package/src/fundamentalTypes/errorType.js +39 -32
  241. package/src/fundamentalTypes/fileType.js +238 -52
  242. package/src/fundamentalTypes/functionType.js +61 -41
  243. package/src/fundamentalTypes/nanType.js +5 -4
  244. package/src/fundamentalTypes/noneditableType.js +4 -3
  245. package/src/fundamentalTypes/nullType.js +3 -2
  246. package/src/fundamentalTypes/numberType.js +72 -20
  247. package/src/fundamentalTypes/promiseType.js +16 -40
  248. package/src/fundamentalTypes/regexpType.js +7 -13
  249. package/src/fundamentalTypes/stringType.js +176 -110
  250. package/src/fundamentalTypes/symbolType.js +3 -2
  251. package/src/fundamentalTypes/undefinedType.js +3 -2
  252. package/src/index.js +6 -5
  253. package/src/jsoe.css +107 -8
  254. package/src/subTypes/blobHTMLType.js +23 -10
  255. package/src/superTypes/SpecialNumberType.js +6 -6
  256. package/src/superTypes/SpecialRealNumberType.js +10 -9
  257. package/src/superTypes/buffersourceType.js +86 -75
  258. package/src/superTypes/dommatrixType.js +6 -5
  259. package/src/superTypes/dompointType.js +6 -5
  260. package/src/superTypes/domrectType.js +6 -5
  261. package/src/superTypes/errorsSpecialType.js +54 -35
  262. package/src/typeChoices.js +373 -53
  263. package/src/types.js +157 -97
  264. package/src/utils/FileList.js +3 -3
  265. package/src/utils/dialogs.js +5 -7
  266. package/src/utils/jsonPointer.js +1 -1
  267. package/src/utils/media.js +1 -0
  268. package/src/utils/schemaMeta.js +257 -0
  269. package/src/utils/templateUtils.js +3 -3
  270. package/src/utils/timing.js +12 -0
  271. package/src/utils/types.js +19 -0
  272. package/src/vendor-imports.js +10 -2
  273. package/tsconfig.json +2 -0
  274. package/vendor/acorn/dist/acorn.d.mts +46 -5
  275. package/vendor/acorn/dist/acorn.d.ts +46 -5
  276. package/vendor/acorn/dist/acorn.js +394 -117
  277. package/vendor/acorn/dist/acorn.mjs +394 -117
  278. package/vendor/acorn/dist/bin.js +1 -1
  279. package/vendor/jamilih/dist/{jml-es.js → jml.mjs} +590 -312
  280. package/vendor/jamilih/package.json +1 -1
  281. package/vendor/mime/dist/types/other.js +719 -0
  282. package/vendor/mime/dist/types/standard.js +366 -0
  283. package/vendor/typeson-registry/dist/index.js +519 -99
  284. package/vendor/zod/classic/checks.d.ts +1 -0
  285. package/vendor/zod/classic/checks.js +1 -0
  286. package/vendor/zod/classic/coerce.d.ts +17 -0
  287. package/vendor/zod/classic/coerce.js +17 -0
  288. package/vendor/zod/classic/compat.d.ts +48 -0
  289. package/vendor/zod/classic/compat.js +31 -0
  290. package/vendor/zod/classic/deep-partial.d.ts +14 -0
  291. package/vendor/zod/classic/deep-partial.js +13 -0
  292. package/vendor/zod/classic/errors.d.ts +29 -0
  293. package/vendor/zod/classic/errors.js +57 -0
  294. package/vendor/zod/classic/external.d.ts +19 -0
  295. package/vendor/zod/classic/external.js +17 -0
  296. package/vendor/zod/classic/from-json-schema.d.ts +12 -0
  297. package/vendor/zod/classic/from-json-schema.js +660 -0
  298. package/vendor/zod/classic/in-out.d.ts +8 -0
  299. package/vendor/zod/classic/in-out.js +36 -0
  300. package/vendor/zod/classic/index.d.ts +3 -0
  301. package/vendor/zod/classic/index.js +4 -0
  302. package/vendor/zod/classic/iso.d.ts +7 -0
  303. package/vendor/zod/classic/iso.js +15 -0
  304. package/vendor/zod/classic/package.json +7 -0
  305. package/vendor/zod/classic/parse.d.ts +44 -0
  306. package/vendor/zod/classic/parse.js +16 -0
  307. package/vendor/zod/classic/schemas.d.ts +802 -0
  308. package/vendor/zod/classic/schemas.js +1491 -0
  309. package/vendor/zod/core/api.d.ts +329 -0
  310. package/vendor/zod/core/api.js +1104 -0
  311. package/vendor/zod/core/checks.d.ts +278 -0
  312. package/vendor/zod/core/checks.js +581 -0
  313. package/vendor/zod/core/compile.d.ts +51 -0
  314. package/vendor/zod/core/compile.js +1783 -0
  315. package/vendor/zod/core/core.d.ts +82 -0
  316. package/vendor/zod/core/core.js +141 -0
  317. package/vendor/zod/core/doc.d.ts +16 -0
  318. package/vendor/zod/core/doc.js +33 -0
  319. package/vendor/zod/core/errors.d.ts +225 -0
  320. package/vendor/zod/core/errors.js +270 -0
  321. package/vendor/zod/core/index.d.ts +19 -0
  322. package/vendor/zod/core/index.js +19 -0
  323. package/vendor/zod/core/json-schema-generator.d.ts +65 -0
  324. package/vendor/zod/core/json-schema-generator.js +99 -0
  325. package/vendor/zod/core/json-schema-processors.d.ts +49 -0
  326. package/vendor/zod/core/json-schema-processors.js +747 -0
  327. package/vendor/zod/core/json-schema.d.ts +89 -0
  328. package/vendor/zod/core/memoizer.d.ts +15 -0
  329. package/vendor/zod/core/memoizer.js +265 -0
  330. package/vendor/zod/core/package.json +7 -0
  331. package/vendor/zod/core/parse.d.ts +52 -0
  332. package/vendor/zod/core/parse.js +154 -0
  333. package/vendor/zod/core/regexes.d.ts +87 -0
  334. package/vendor/zod/core/regexes.js +150 -0
  335. package/vendor/zod/core/registries.d.ts +35 -0
  336. package/vendor/zod/core/registries.js +51 -0
  337. package/vendor/zod/core/schemas.d.ts +1253 -0
  338. package/vendor/zod/core/schemas.js +2440 -0
  339. package/vendor/zod/core/standard-schema.d.ts +126 -0
  340. package/vendor/zod/core/to-json-schema.d.ts +153 -0
  341. package/vendor/zod/core/to-json-schema.js +650 -0
  342. package/vendor/zod/core/util.d.ts +257 -0
  343. package/vendor/zod/core/util.js +846 -0
  344. package/vendor/zod/core/versions.d.ts +5 -0
  345. package/vendor/zod/core/versions.js +5 -0
  346. package/vendor/zod/core/visit.d.ts +30 -0
  347. package/vendor/zod/core/visit.js +169 -0
  348. package/vendor/zod/index.d.ts +3 -0
  349. package/vendor/zod/index.js +4 -0
  350. package/vendor/zod/locales/ar.d.ts +4 -0
  351. package/vendor/zod/locales/ar.js +109 -0
  352. package/vendor/zod/locales/az.d.ts +4 -0
  353. package/vendor/zod/locales/az.js +108 -0
  354. package/vendor/zod/locales/be.d.ts +4 -0
  355. package/vendor/zod/locales/be.js +166 -0
  356. package/vendor/zod/locales/bg.d.ts +4 -0
  357. package/vendor/zod/locales/bg.js +123 -0
  358. package/vendor/zod/locales/bn.d.ts +4 -0
  359. package/vendor/zod/locales/bn.js +111 -0
  360. package/vendor/zod/locales/ca.d.ts +4 -0
  361. package/vendor/zod/locales/ca.js +110 -0
  362. package/vendor/zod/locales/ckb.d.ts +4 -0
  363. package/vendor/zod/locales/ckb.js +131 -0
  364. package/vendor/zod/locales/cs.d.ts +4 -0
  365. package/vendor/zod/locales/cs.js +114 -0
  366. package/vendor/zod/locales/da.d.ts +4 -0
  367. package/vendor/zod/locales/da.js +118 -0
  368. package/vendor/zod/locales/de.d.ts +4 -0
  369. package/vendor/zod/locales/de.js +111 -0
  370. package/vendor/zod/locales/el.d.ts +4 -0
  371. package/vendor/zod/locales/el.js +110 -0
  372. package/vendor/zod/locales/en.d.ts +4 -0
  373. package/vendor/zod/locales/en.js +123 -0
  374. package/vendor/zod/locales/eo.d.ts +4 -0
  375. package/vendor/zod/locales/eo.js +112 -0
  376. package/vendor/zod/locales/es.d.ts +4 -0
  377. package/vendor/zod/locales/es.js +134 -0
  378. package/vendor/zod/locales/fa.d.ts +4 -0
  379. package/vendor/zod/locales/fa.js +117 -0
  380. package/vendor/zod/locales/fi.d.ts +4 -0
  381. package/vendor/zod/locales/fi.js +115 -0
  382. package/vendor/zod/locales/fr-CA.d.ts +4 -0
  383. package/vendor/zod/locales/fr-CA.js +110 -0
  384. package/vendor/zod/locales/fr.d.ts +4 -0
  385. package/vendor/zod/locales/fr.js +127 -0
  386. package/vendor/zod/locales/gu.d.ts +4 -0
  387. package/vendor/zod/locales/gu.js +111 -0
  388. package/vendor/zod/locales/he.d.ts +4 -0
  389. package/vendor/zod/locales/he.js +219 -0
  390. package/vendor/zod/locales/hi.d.ts +4 -0
  391. package/vendor/zod/locales/hi.js +109 -0
  392. package/vendor/zod/locales/hr.d.ts +4 -0
  393. package/vendor/zod/locales/hr.js +124 -0
  394. package/vendor/zod/locales/hu.d.ts +4 -0
  395. package/vendor/zod/locales/hu.js +111 -0
  396. package/vendor/zod/locales/hy.d.ts +4 -0
  397. package/vendor/zod/locales/hy.js +156 -0
  398. package/vendor/zod/locales/id.d.ts +4 -0
  399. package/vendor/zod/locales/id.js +109 -0
  400. package/vendor/zod/locales/index.d.ts +62 -0
  401. package/vendor/zod/locales/index.js +62 -0
  402. package/vendor/zod/locales/is.d.ts +4 -0
  403. package/vendor/zod/locales/is.js +112 -0
  404. package/vendor/zod/locales/it.d.ts +4 -0
  405. package/vendor/zod/locales/it.js +111 -0
  406. package/vendor/zod/locales/ja.d.ts +4 -0
  407. package/vendor/zod/locales/ja.js +110 -0
  408. package/vendor/zod/locales/ka.d.ts +4 -0
  409. package/vendor/zod/locales/ka.js +115 -0
  410. package/vendor/zod/locales/kh.d.ts +5 -0
  411. package/vendor/zod/locales/kh.js +5 -0
  412. package/vendor/zod/locales/km.d.ts +4 -0
  413. package/vendor/zod/locales/km.js +113 -0
  414. package/vendor/zod/locales/kn.d.ts +4 -0
  415. package/vendor/zod/locales/kn.js +114 -0
  416. package/vendor/zod/locales/ko.d.ts +4 -0
  417. package/vendor/zod/locales/ko.js +114 -0
  418. package/vendor/zod/locales/lt.d.ts +4 -0
  419. package/vendor/zod/locales/lt.js +205 -0
  420. package/vendor/zod/locales/mk.d.ts +4 -0
  421. package/vendor/zod/locales/mk.js +112 -0
  422. package/vendor/zod/locales/ms.d.ts +4 -0
  423. package/vendor/zod/locales/ms.js +110 -0
  424. package/vendor/zod/locales/ne.d.ts +4 -0
  425. package/vendor/zod/locales/ne.js +109 -0
  426. package/vendor/zod/locales/nl.d.ts +4 -0
  427. package/vendor/zod/locales/nl.js +113 -0
  428. package/vendor/zod/locales/nn.d.ts +4 -0
  429. package/vendor/zod/locales/nn.js +111 -0
  430. package/vendor/zod/locales/no.d.ts +4 -0
  431. package/vendor/zod/locales/no.js +111 -0
  432. package/vendor/zod/locales/ota.d.ts +4 -0
  433. package/vendor/zod/locales/ota.js +112 -0
  434. package/vendor/zod/locales/package.json +7 -0
  435. package/vendor/zod/locales/pl.d.ts +4 -0
  436. package/vendor/zod/locales/pl.js +112 -0
  437. package/vendor/zod/locales/ps.d.ts +4 -0
  438. package/vendor/zod/locales/ps.js +117 -0
  439. package/vendor/zod/locales/pt-BR.d.ts +4 -0
  440. package/vendor/zod/locales/pt-BR.js +141 -0
  441. package/vendor/zod/locales/pt.d.ts +4 -0
  442. package/vendor/zod/locales/pt.js +140 -0
  443. package/vendor/zod/locales/ro.d.ts +4 -0
  444. package/vendor/zod/locales/ro.js +120 -0
  445. package/vendor/zod/locales/ru.d.ts +4 -0
  446. package/vendor/zod/locales/ru.js +166 -0
  447. package/vendor/zod/locales/sk.d.ts +4 -0
  448. package/vendor/zod/locales/sk.js +114 -0
  449. package/vendor/zod/locales/sl.d.ts +4 -0
  450. package/vendor/zod/locales/sl.js +112 -0
  451. package/vendor/zod/locales/sv.d.ts +4 -0
  452. package/vendor/zod/locales/sv.js +113 -0
  453. package/vendor/zod/locales/ta.d.ts +4 -0
  454. package/vendor/zod/locales/ta.js +113 -0
  455. package/vendor/zod/locales/th.d.ts +4 -0
  456. package/vendor/zod/locales/th.js +113 -0
  457. package/vendor/zod/locales/tk.d.ts +4 -0
  458. package/vendor/zod/locales/tk.js +105 -0
  459. package/vendor/zod/locales/tr.d.ts +4 -0
  460. package/vendor/zod/locales/tr.js +108 -0
  461. package/vendor/zod/locales/ua.d.ts +5 -0
  462. package/vendor/zod/locales/ua.js +5 -0
  463. package/vendor/zod/locales/uk.d.ts +4 -0
  464. package/vendor/zod/locales/uk.js +111 -0
  465. package/vendor/zod/locales/ur.d.ts +4 -0
  466. package/vendor/zod/locales/ur.js +113 -0
  467. package/vendor/zod/locales/uz.d.ts +4 -0
  468. package/vendor/zod/locales/uz.js +111 -0
  469. package/vendor/zod/locales/vi.d.ts +4 -0
  470. package/vendor/zod/locales/vi.js +111 -0
  471. package/vendor/zod/locales/yo.d.ts +4 -0
  472. package/vendor/zod/locales/yo.js +110 -0
  473. package/vendor/zod/locales/zh-CN.d.ts +4 -0
  474. package/vendor/zod/locales/zh-CN.js +112 -0
  475. package/vendor/zod/locales/zh-TW.d.ts +4 -0
  476. package/vendor/zod/locales/zh-TW.js +110 -0
  477. package/vendor/zod/mini/checks.d.ts +1 -0
  478. package/vendor/zod/mini/checks.js +1 -0
  479. package/vendor/zod/mini/coerce.d.ts +7 -0
  480. package/vendor/zod/mini/coerce.js +22 -0
  481. package/vendor/zod/mini/deep-partial.d.ts +14 -0
  482. package/vendor/zod/mini/deep-partial.js +13 -0
  483. package/vendor/zod/mini/external.d.ts +16 -0
  484. package/vendor/zod/mini/external.js +16 -0
  485. package/vendor/zod/mini/in-out.d.ts +8 -0
  486. package/vendor/zod/mini/in-out.js +36 -0
  487. package/vendor/zod/mini/index.d.ts +3 -0
  488. package/vendor/zod/mini/index.js +3 -0
  489. package/vendor/zod/mini/iso.d.ts +22 -0
  490. package/vendor/zod/mini/iso.js +34 -0
  491. package/vendor/zod/mini/package.json +7 -0
  492. package/vendor/zod/mini/parse.d.ts +1 -0
  493. package/vendor/zod/mini/parse.js +1 -0
  494. package/vendor/zod/mini/schemas.d.ts +475 -0
  495. package/vendor/zod/mini/schemas.js +987 -0
  496. package/vendor/zod/package.json +7 -0
  497. package/vendor/zodexy/dist/esm/index.js +1274 -0
  498. package/vendor/zodexy/dist/index.js +1088 -0
  499. package/vendor/zodexy/dist/schema.zodexy.json +1036 -0
  500. package/dist/fundamentalTypes/nativeEnumType.d.ts +0 -6
  501. package/dist/fundamentalTypes/nativeEnumType.d.ts.map +0 -1
  502. package/src/fundamentalTypes/catchType.js +0 -140
  503. package/src/fundamentalTypes/enumType.js +0 -52
  504. package/src/fundamentalTypes/literalType.js +0 -81
  505. package/src/fundamentalTypes/nativeEnumType.js +0 -157
  506. package/src/fundamentalTypes/neverType.js +0 -49
  507. package/src/fundamentalTypes/recordType.js +0 -42
  508. package/src/fundamentalTypes/tupleType.js +0 -39
  509. package/src/fundamentalTypes/voidType.js +0 -48
  510. package/vendor/zod/lib/index.mjs +0 -4236
  511. package/vendor/zodex/dist/esm/dezerialize.d.ts +0 -26
  512. package/vendor/zodex/dist/esm/dezerialize.js +0 -393
  513. package/vendor/zodex/dist/esm/index.d.ts +0 -9
  514. package/vendor/zodex/dist/esm/index.js +0 -4
  515. package/vendor/zodex/dist/esm/infer.d.ts +0 -29
  516. package/vendor/zodex/dist/esm/package.json +0 -1
  517. package/vendor/zodex/dist/esm/types.d.ts +0 -201
  518. package/vendor/zodex/dist/esm/types.js +0 -13
  519. package/vendor/zodex/dist/esm/ui.d.ts +0 -23
  520. package/vendor/zodex/dist/esm/ui.js +0 -10
  521. package/vendor/zodex/dist/esm/zerialize.d.ts +0 -50
  522. package/vendor/zodex/dist/esm/zerialize.js +0 -417
  523. package/vendor/zodex/dist/esm/zod-types.d.ts +0 -11
  524. /package/vendor/{zodex/dist/esm/infer.js → zod/core/json-schema.js} +0 -0
  525. /package/vendor/{zodex/dist/esm/zod-types.js → zod/core/standard-schema.js} +0 -0
@@ -3,7 +3,10 @@ import Formats from './formats.js';
3
3
  import Types from './types.js';
4
4
 
5
5
  import {$e, DOM} from './utils/templateUtils.js';
6
+ import {isUnionLike} from './utils/types.js';
7
+ import {getXorBranchMatchInfo, valueMatchesSchema} from './formats/schema.js';
6
8
  import dialogs from './utils/dialogs.js';
9
+ import deepEqual from 'fast-deep-equal/es6/index.js';
7
10
 
8
11
  // This is technically just `import('./index.js').SetType`, but our
9
12
  // redirect file causes problems, so we redefine here
@@ -13,15 +16,30 @@ import dialogs from './utils/dialogs.js';
13
16
  * baseValue?: import('./formats.js').StructuredCloneValue,
14
17
  * bringIntoFocus?: boolean,
15
18
  * avoidReport?: boolean,
16
- * specificSchema?: import('zodex').SzType
19
+ * specificSchema?: import('zodexy').SzType
17
20
  * }) => void} SetType
18
21
  */
19
22
 
20
23
  /**
21
24
  * @typedef {(info: {
22
25
  * type: string,
23
- * editUI: Element,
24
- * specificSchema?: import('zodex').SzType
26
+ * specificSchema?: import('zodexy').SzType
27
+ * }) => void} SetTypeNoEditUI
28
+ */
29
+ /**
30
+ * @callback Validate
31
+ * @param {{avoidReport?: boolean}} cfg
32
+ * @returns {boolean}
33
+ */
34
+ /**
35
+ * @typedef {() => false|null|HTMLElement} GetTypeRoot
36
+ */
37
+
38
+ /**
39
+ * @typedef {(info: {
40
+ * type: string,
41
+ * editUI: HTMLElement,
42
+ * specificSchema?: import('zodexy').SzType
25
43
  * }) => void} AddTypeAndEditUI
26
44
  */
27
45
 
@@ -39,9 +57,19 @@ import dialogs from './utils/dialogs.js';
39
57
  */
40
58
 
41
59
  /**
42
- * @typedef {HTMLElement & {
60
+ * @typedef {(info: {editUI: HTMLElement}) => void} AddEditUI
61
+ */
62
+
63
+ /**
64
+ * @typedef {HTMLSelectElement & {
43
65
  * $addAndValidateEditUI: AddAndValidateEditUI,
44
- * $setStyles: SetStyles
66
+ * $setStyles: SetStyles,
67
+ * $getTypeRoot: GetTypeRoot,
68
+ * $getContainer: () => HTMLElement,
69
+ * $getTopRoot: () => HTMLDivElement,
70
+ * $addEditUI: AddEditUI,
71
+ * $validate: Validate,
72
+ * $setTypeNoEditUI: SetTypeNoEditUI
45
73
  * }} TypeChoicesElementAPI
46
74
  */
47
75
 
@@ -100,6 +128,231 @@ import dialogs from './utils/dialogs.js';
100
128
  * }}
101
129
  */
102
130
 
131
+ /**
132
+ * The `<select>`-shaped `$`-methods that downstream code invokes on a
133
+ * type-choices control. The `xor` radio group reuses these by reference from
134
+ * the parallel `<select>`.
135
+ * @type {readonly string[]}
136
+ */
137
+ const typeChoicesAPIMethods = [
138
+ '$getValue', '$setType', '$setTypeNoEditUI', '$setStyles', '$getTypeRoot',
139
+ '$addAndValidateEditUI', '$addTypeAndEditUI', '$addEditUI', '$getContainer',
140
+ '$getTopRoot', '$validate'
141
+ ];
142
+
143
+ /**
144
+ * Human-readable caption for one `xor` branch radio. Prefers the branch's own
145
+ * `description`; otherwise derives something legible from its shape so the
146
+ * branches can be told apart without reading schema.
147
+ * @param {import('zodexy').SzType|undefined} schemaObj
148
+ * @param {string} optText Fallback option text (already e.g. `"string"`)
149
+ * @param {number} idx
150
+ * @returns {string}
151
+ */
152
+ function deriveXorBranchLabel (schemaObj, optText, idx) {
153
+ if (schemaObj && 'description' in schemaObj && schemaObj.description) {
154
+ return /** @type {string} */ (schemaObj.description);
155
+ }
156
+ if (schemaObj && schemaObj.type === 'literal') {
157
+ const {values} = /** @type {import('zodexy').SzLiteral<any>} */ (schemaObj);
158
+ if (Array.isArray(values) && values.length) {
159
+ return String(values[0]);
160
+ }
161
+ }
162
+ if (schemaObj && schemaObj.type === 'object') {
163
+ const {properties} = /** @type {import('zodexy').SzObject} */ (schemaObj);
164
+ const keys = properties && typeof properties === 'object'
165
+ ? Object.keys(properties)
166
+ : [];
167
+ if (keys.length) {
168
+ // Todo: when branches share property names, prefer the keys unique to
169
+ // this branch (symmetric difference against its siblings)
170
+ return keys.length > 3
171
+ ? `${keys.slice(0, 3).join(', ')}, +${keys.length - 3} more`
172
+ : keys.join(', ');
173
+ }
174
+ }
175
+ return optText || `Option ${idx + 1}`;
176
+ }
177
+
178
+ /**
179
+ * Build the `xor` (exclusive union) radio-group control. It renders a
180
+ * labelled radio per branch and shims the `<select>` value surface
181
+ * (`value`, `selectedIndex`, `selectedOptions`), reusing the `$`-methods of
182
+ * the parallel `<select>` in `selectEl` by reference. A live indicator under
183
+ * the radios counts how many branches the current value satisfies, since
184
+ * `xor` requires exactly one and jsoe otherwise validates only the chosen
185
+ * branch's leaf schema.
186
+ * @param {{
187
+ * typeNamespace: string|undefined,
188
+ * keySelectClass: string|undefined,
189
+ * typeOptions: [string, {value?: string, title?: string}?][],
190
+ * schemaObjs: import('zodexy').SzType[],
191
+ * types: InstanceType<typeof import('./types.js').default>,
192
+ * typeContainer: HTMLElement,
193
+ * xorSchema: import('zodexy').SzUnion|undefined,
194
+ * selectEl: HTMLSelectElement
195
+ * }} cfg
196
+ * @returns {HTMLSelectElement}
197
+ */
198
+ function buildXorTypeChoices ({
199
+ typeNamespace, keySelectClass, typeOptions, schemaObjs, types,
200
+ typeContainer, xorSchema, selectEl
201
+ }) {
202
+ const radioName = `typeChoices-${typeNamespace}-xor`;
203
+ const fieldset = jml('fieldset', {
204
+ class: `typeChoices-${typeNamespace} xorTypeChoices${keySelectClass
205
+ ? ' ' + keySelectClass
206
+ : ''
207
+ }`,
208
+ $on: {change (e) {
209
+ e?.stopPropagation();
210
+ const idxAttr =
211
+ /** @type {HTMLElement} */ (e.target)?.dataset?.idx ??
212
+ /** @type {TypeChoicesElementAPI} */ (
213
+ this
214
+ ).selectedOptions[0]?.dataset?.idx;
215
+ /** @type {TypeChoicesElementAPI} */ (this).$addAndValidateEditUI({
216
+ schemaObject: idxAttr === undefined
217
+ ? undefined
218
+ : schemaObjs[Number(idxAttr)]
219
+ });
220
+ /** @type {TypeChoicesElementAPI} */ (this).$setStyles();
221
+ updateMatchStatus();
222
+ }}
223
+ }, [
224
+ ['legend', {class: 'xorTypeChoicesLegend'}, ['Exactly one of']],
225
+ ...typeOptions.map(([optText, optAtts], idx) => {
226
+ return ['label', {class: 'xorTypeChoice'}, [
227
+ ['input', {
228
+ type: 'radio',
229
+ name: radioName,
230
+ value: /** @type {string} */ (optAtts?.value ?? ''),
231
+ dataset: {idx}
232
+ }],
233
+ ['span', {class: 'xorTypeChoiceLabel'}, [
234
+ deriveXorBranchLabel(schemaObjs[idx], optText, idx)
235
+ ]]
236
+ ]];
237
+ }),
238
+ ['div', {class: 'xorMatchStatus', hidden: true}]
239
+ ]);
240
+
241
+ const radios = () => /** @type {HTMLInputElement[]} */ (
242
+ [...fieldset.querySelectorAll('input[type="radio"]')]
243
+ );
244
+
245
+ const matchStatus = /** @type {HTMLElement} */ (
246
+ $e(fieldset, '.xorMatchStatus')
247
+ );
248
+
249
+ /**
250
+ * Re-count how many `xor` branches the assembled value satisfies and
251
+ * reflect it in the indicator, also marking the chosen radio invalid when
252
+ * the count is not exactly one so the form's `checkValidity()` catches it.
253
+ * @returns {void}
254
+ */
255
+ function updateMatchStatus () {
256
+ // Only the currently-chosen branch's match state is meaningful; clear any
257
+ // custom validity left on the other radios so a stale message from a
258
+ // previously-selected branch does not keep the form invalid after the
259
+ // user switches branches.
260
+ const allRadios = radios();
261
+ for (const r of allRadios) {
262
+ r.setCustomValidity('');
263
+ }
264
+ const checked = allRadios.find((r) => r.checked);
265
+ if (!xorSchema || !checked || !$e(typeContainer, 'div[data-type]')) {
266
+ matchStatus.hidden = true;
267
+ return;
268
+ }
269
+ let value;
270
+ try {
271
+ value = /** @type {() => unknown} */ (fsAPI.$getValue)();
272
+ } catch {
273
+ // Editor not ready or value not yet parseable
274
+ matchStatus.hidden = true;
275
+ return;
276
+ }
277
+ const {matched, total} = getXorBranchMatchInfo(types, xorSchema, value);
278
+ // The value must satisfy the branch the user actually chose, not merely
279
+ // *some* branch: an empty value on the "email" branch still matches the
280
+ // plain-`string` branch, so the count alone would call it valid.
281
+ const selectedSchema = schemaObjs[Number(checked.dataset.idx)];
282
+ const selectedMatches = Boolean(selectedSchema) &&
283
+ valueMatchesSchema(types, selectedSchema, value);
284
+ // Anything but "the chosen branch, and only it" is invalid — including a
285
+ // still-empty branch (zero matches): the form must not be submittable
286
+ // in that state, so we always show the indicator and set validity once
287
+ // a branch is chosen.
288
+ const ok = selectedMatches && matched === 1;
289
+ matchStatus.hidden = false;
290
+ matchStatus.textContent = !selectedMatches
291
+ ? 'Value does not match the selected option'
292
+ : ok
293
+ ? `Matches 1 of ${total} options`
294
+ : `Matches ${matched} of ${total} — value must match exactly one`;
295
+ matchStatus.classList.toggle('xorMatchOk', ok);
296
+ matchStatus.classList.toggle('xorMatchErr', !ok);
297
+ checked.setCustomValidity(
298
+ ok
299
+ ? ''
300
+ : selectedMatches
301
+ ? 'Value must match exactly one option'
302
+ : 'Value does not match the selected option'
303
+ );
304
+ }
305
+
306
+ typeContainer.addEventListener('input', updateMatchStatus);
307
+ typeContainer.addEventListener('change', updateMatchStatus);
308
+
309
+ const selAPI = /** @type {Record<string, unknown>} */ (
310
+ /** @type {unknown} */ (selectEl)
311
+ );
312
+ const fsAPI = /** @type {Record<string, unknown>} */ (
313
+ /** @type {unknown} */ (fieldset)
314
+ );
315
+ for (const method of typeChoicesAPIMethods) {
316
+ fsAPI[method] = selAPI[method];
317
+ }
318
+
319
+ Object.defineProperties(fieldset, {
320
+ value: {
321
+ configurable: true,
322
+ get () {
323
+ return radios().find((r) => r.checked)?.value ?? '';
324
+ },
325
+ set (v) {
326
+ const match = radios().find((r) => r.value === v);
327
+ for (const r of radios()) {
328
+ r.checked = r === match;
329
+ }
330
+ }
331
+ },
332
+ selectedIndex: {
333
+ configurable: true,
334
+ get () {
335
+ const i = radios().findIndex((r) => r.checked);
336
+ return i === -1 ? 0 : i + 1;
337
+ },
338
+ set (i) {
339
+ radios().forEach((r, idx) => {
340
+ r.checked = idx === Number(i) - 1;
341
+ });
342
+ }
343
+ },
344
+ selectedOptions: {
345
+ configurable: true,
346
+ get () {
347
+ const r = radios().find((rd) => rd.checked);
348
+ return r ? [{value: r.value, dataset: {idx: r.dataset.idx}}] : [];
349
+ }
350
+ }
351
+ });
352
+
353
+ return /** @type {HTMLSelectElement} */ (/** @type {unknown} */ (fieldset));
354
+ }
355
+
103
356
  /**
104
357
  * @type {BuildTypeChoices}
105
358
  */
@@ -152,7 +405,11 @@ export const buildTypeChoices = ({
152
405
  currentPath
153
406
  );
154
407
  };
155
- const sel = /** @type {HTMLSelectElement} */ (jml('select', {
408
+ // Created before the control so the `xor` radio group can bind its live
409
+ // match indicator to value changes inside it
410
+ const typeContainer = jml('div', {class: 'typeContainer'});
411
+
412
+ const selectEl = /** @type {HTMLSelectElement} */ (jml('select', {
156
413
  hidden: requireObject || typeOptions.length === 1,
157
414
  class: `typeChoices-${typeNamespace}${keySelectClass
158
415
  ? ' ' + keySelectClass
@@ -161,14 +418,18 @@ export const buildTypeChoices = ({
161
418
  // is: 'type-choices',
162
419
  $custom: {
163
420
  $getValue,
164
- /** @type {SetType} */
165
- $setType ({
166
- type, baseValue, bringIntoFocus, avoidReport, specificSchema
167
- }) {
421
+ /**
422
+ * @this {TypeChoicesElementAPI}
423
+ * @param {Parameters<SetType>[0]} cfg
424
+ */
425
+ $setType (cfg) {
426
+ const {
427
+ type, baseValue, bringIntoFocus, avoidReport, specificSchema
428
+ } = cfg;
168
429
  if (schemaObjs && specificSchema) {
169
- const idx = schemaObjs.map((obj) => {
170
- return JSON.stringify(obj);
171
- }).indexOf(JSON.stringify(specificSchema));
430
+ const idx = schemaObjs.findIndex((obj) => {
431
+ return deepEqual(obj, specificSchema);
432
+ });
172
433
  if (idx === -1) {
173
434
  this.value = type;
174
435
  } else {
@@ -181,16 +442,15 @@ export const buildTypeChoices = ({
181
442
  this.$addAndValidateEditUI({baseValue, bringIntoFocus, avoidReport});
182
443
  },
183
444
  /**
184
- * @type {(info: {
185
- * type: string,
186
- * specificSchema?: import('zodex').SzType
187
- * }) => void} cfg
445
+ * @this {TypeChoicesElementAPI}
446
+ * @param {Parameters<SetTypeNoEditUI>[0]} cfg
188
447
  */
189
- $setTypeNoEditUI ({type, specificSchema}) {
448
+ $setTypeNoEditUI (cfg) {
449
+ const {type, specificSchema} = cfg;
190
450
  if (schemaObjs && specificSchema) {
191
- const idx = schemaObjs.map((obj) => {
192
- return JSON.stringify(obj);
193
- }).indexOf(JSON.stringify(specificSchema));
451
+ const idx = schemaObjs.findIndex((obj) => {
452
+ return deepEqual(obj, specificSchema);
453
+ });
194
454
  this.selectedIndex = idx + 1;
195
455
  } else {
196
456
  this.value = type;
@@ -198,22 +458,32 @@ export const buildTypeChoices = ({
198
458
  this.$setStyles();
199
459
  },
200
460
 
201
- /** @type {SetStyles} */
461
+ /**
462
+ * @this {TypeChoicesElementAPI}
463
+ * @type {SetStyles}
464
+ */
202
465
  $setStyles () {
203
466
  const {value: type} = this;
204
467
  this.dataset.type = type; // Used for styling
205
468
  let ancestorEl = this.parentElement;
469
+ if (!ancestorEl) {
470
+ return;
471
+ }
206
472
  if (ancestorEl.nodeName.toLowerCase() !== 'fieldset') {
207
473
  // Grandparent check added for optional items placeholder
208
- ancestorEl = this.parentElement.parentElement;
474
+ ancestorEl = ancestorEl.parentElement;
209
475
  }
210
- if (ancestorEl.nodeName.toLowerCase() === 'fieldset') {
476
+ if (ancestorEl?.nodeName.toLowerCase() === 'fieldset') {
211
477
  ancestorEl.dataset.type = type;
212
478
  DOM.filterChildElements(ancestorEl, 'legend').forEach((legend) => {
213
479
  legend.dataset.type = type;
214
480
  });
215
481
  }
216
482
  },
483
+ /**
484
+ * @this {TypeChoicesElementAPI}
485
+ * @type {GetTypeRoot}
486
+ */
217
487
  $getTypeRoot () {
218
488
  const container = this.$getContainer();
219
489
  /* istanbul ignore if -- How to replicate? */
@@ -223,11 +493,16 @@ export const buildTypeChoices = ({
223
493
  return $e(container, 'div[data-type]');
224
494
  },
225
495
 
226
- /** @type {AddAndValidateEditUI} */
227
- $addAndValidateEditUI (/* istanbul ignore next -- Backup */ {
228
- baseValue, bringIntoFocus, schemaObject, avoidReport
229
- /* istanbul ignore next -- Backup */
230
- } = {}) {
496
+ /**
497
+ * @this {TypeChoicesElementAPI}
498
+ * @param {Parameters<AddAndValidateEditUI>[0]} [cfg]
499
+ */
500
+ $addAndValidateEditUI (
501
+ /* istanbul ignore next -- Backup */ cfg = {}
502
+ ) {
503
+ const {
504
+ baseValue, bringIntoFocus, schemaObject, avoidReport
505
+ } = cfg;
231
506
  const {value: type} = this;
232
507
 
233
508
  if (!type) {
@@ -242,7 +517,7 @@ export const buildTypeChoices = ({
242
517
  editUI = types.getUIForModeAndType({
243
518
  readonly: false,
244
519
  typeNamespace,
245
- type,
520
+ type: /** @type {import('./types.js').AvailableArbitraryType} */ (type),
246
521
  bringIntoFocus,
247
522
  hasValue: type === 'arrayNonindexKeys' && baseValue,
248
523
  value: baseValue,
@@ -250,8 +525,10 @@ export const buildTypeChoices = ({
250
525
  format,
251
526
  topRoot,
252
527
  schemaContent: schemaOriginal ??
253
- (schemaContent?.type === 'union' && schemaIdx !== undefined
254
- ? schemaContent.options[schemaIdx]
528
+ (schemaIdx !== undefined && isUnionLike(schemaContent?.type)
529
+ ? /** @type {import('zodexy').SzUnion} */ (
530
+ schemaContent
531
+ ).options[schemaIdx]
255
532
  : schemaContent),
256
533
  // Added `schemaContent` as inner arrays were not getting their
257
534
  // schema info; this apparently allows (actually requires)
@@ -263,11 +540,12 @@ export const buildTypeChoices = ({
263
540
  // Avoid JSON references by using this by default (or only?)
264
541
  (schemaObjs?.[sel.selectedIndex - 1]) ??
265
542
 
266
- // eslint-disable-next-line @stylistic/max-len -- Long
267
543
  /* istanbul ignore next -- Can probably remove as `schemaObjs` will be set */
268
- (schemaContent?.type === 'union' && schemaIdx !== undefined
544
+ (schemaIdx !== undefined && isUnionLike(schemaContent?.type)
269
545
  /* istanbul ignore next -- Can probably remove */
270
- ? schemaContent.options[schemaIdx]
546
+ ? /** @type {import('zodexy').SzUnion} */ (
547
+ schemaContent
548
+ ).options[schemaIdx]
271
549
  // This is probably just `undefined` by here
272
550
  : schemaContent),
273
551
  schemaFallingBack: Boolean(!schemaObject && schemaContent)
@@ -281,15 +559,21 @@ export const buildTypeChoices = ({
281
559
  types.validateAllReferences({topRoot});
282
560
  },
283
561
 
284
- /** @type {AddTypeAndEditUI} */
285
- $addTypeAndEditUI ({type, editUI, specificSchema}) {
562
+ /**
563
+ * @this {TypeChoicesElementAPI}
564
+ * @param {Parameters<AddTypeAndEditUI>[0]} cfg
565
+ */
566
+ $addTypeAndEditUI (cfg) {
567
+ const {type, editUI, specificSchema} = cfg;
286
568
  this.$setTypeNoEditUI({type, specificSchema});
287
569
  this.$addEditUI({editUI});
288
570
  },
289
571
  /**
290
- * @type {(info: {editUI: HTMLElement}) => void}
572
+ * @this {TypeChoicesElementAPI}
573
+ * @param {Parameters<AddEditUI>[0]} cfg
291
574
  */
292
- $addEditUI ({editUI}) {
575
+ $addEditUI (cfg) {
576
+ const {editUI} = cfg;
293
577
  const container = this.$getContainer();
294
578
  DOM.removeChildren(container);
295
579
  jml(editUI, container);
@@ -297,22 +581,28 @@ export const buildTypeChoices = ({
297
581
  $getContainer () {
298
582
  return this.nextElementSibling;
299
583
  },
584
+ /**
585
+ * @this {TypeChoicesElementAPI}
586
+ */
300
587
  $getTopRoot () {
301
588
  return topRoot || this.$getTypeRoot();
302
589
  },
303
590
  /**
304
- * @param {{avoidReport?: boolean}} cfg
305
- * @returns {boolean}
591
+ * @this {TypeChoicesElementAPI}
592
+ * @param {Parameters<Validate>[0]} [cfg]
306
593
  */
307
- $validate ({avoidReport} = {}) {
594
+ $validate (cfg = {}) {
595
+ const {avoidReport} = cfg;
308
596
  const {value: type} = this;
309
597
  const container = this.$getContainer();
310
598
  if (!container.firstElementChild) {
311
599
  return false;
312
600
  }
313
- const editUI = container.firstElementChild;
601
+ const editUI = /** @type {HTMLDivElement} */ (container.firstElementChild);
314
602
  return types.validate({
315
- type, root: editUI, topRoot: this.$getTopRoot(),
603
+ type: /** @type {import('./types.js').AvailableArbitraryType} */ (type),
604
+ root: editUI,
605
+ topRoot: this.$getTopRoot(),
316
606
  avoidReport
317
607
  });
318
608
  }
@@ -336,7 +626,6 @@ export const buildTypeChoices = ({
336
626
  '(Choose a type)'
337
627
  ]],
338
628
 
339
- // @ts-expect-error Apparent TS bug
340
629
  ...typeOptions.map(
341
630
  ([optText, optAtts], idx) => {
342
631
  return [
@@ -350,13 +639,42 @@ export const buildTypeChoices = ({
350
639
  }
351
640
  )
352
641
  ]));
353
- if (autoTrigger && typeOptions.length === 1 && !setValue) {
642
+
643
+ // `xor` (exclusive union): exactly one branch may match. Present it as a
644
+ // labelled radio group ("choose exactly one of these") rather than the
645
+ // flat type pull-down; the layout conveys the rule without the reader
646
+ // needing to know the term. The element still exposes the
647
+ // `<select>`-shaped surface (`value`, `selectedIndex`, `selectedOptions`,
648
+ // the `$`-methods) that the rest of the type machinery reads.
649
+ const useXorTypeChoices = Boolean(
650
+ schemaObjs && !requireObject && typeOptions.length > 1 &&
651
+ (schemaContent?.type === 'xor' || schemaOriginal?.type === 'xor')
652
+ );
653
+
654
+ const sel = useXorTypeChoices
655
+ ? buildXorTypeChoices({
656
+ typeNamespace, keySelectClass, typeOptions, types, typeContainer,
657
+ schemaObjs: /** @type {import('zodexy').SzType[]} */ (schemaObjs),
658
+ xorSchema: /** @type {import('zodexy').SzUnion} */ (
659
+ schemaContent?.type === 'xor' ? schemaContent : schemaOriginal
660
+ ),
661
+ selectEl
662
+ })
663
+ : selectEl;
664
+
665
+ if (autoTrigger && !setValue && typeOptions.length === 1) {
354
666
  setTimeout(() => {
667
+ if (!sel.isConnected) {
668
+ return;
669
+ }
355
670
  sel.selectedIndex = 1;
356
671
  sel.dispatchEvent(new Event('change'));
357
- });
672
+ }, 0);
358
673
  } else if (setValue || (requireObject && !objectHasValue)) {
359
674
  setTimeout(async () => {
675
+ if (!sel.isConnected) {
676
+ return;
677
+ }
360
678
  if (!setValue) { // if (requireObject && !objectHasValue) {
361
679
  // Todo (low): We could auto-populate keypath if has
362
680
  // keypath (and we probably also only want if
@@ -384,11 +702,11 @@ export const buildTypeChoices = ({
384
702
  Types.getTypeForRoot(/** @type {HTMLDivElement} */ (
385
703
  rootEditUI
386
704
  ));
387
- // eslint-disable-next-line @stylistic/max-len -- Long
388
705
  /** @type {HTMLSelectElement & {$addTypeAndEditUI: AddTypeAndEditUI}} */ (
389
706
  sel
390
707
  ).$addTypeAndEditUI({
391
- type, editUI: rootEditUI,
708
+ type,
709
+ editUI: rootEditUI,
392
710
  // We do actually want the first one
393
711
  specificSchema: specificSchemas?.[0]
394
712
  });
@@ -401,11 +719,9 @@ export const buildTypeChoices = ({
401
719
  /* istanbul ignore next -- How to trigger? */
402
720
  console.log('err', err);
403
721
  }
404
- });
722
+ }, 0);
405
723
  }
406
724
 
407
- const typeContainer = jml('div', {class: 'typeContainer'});
408
-
409
725
  return {
410
726
  domArray: [
411
727
  sel,
@@ -425,9 +741,13 @@ export const buildTypeChoices = ({
425
741
 
426
742
  /** @type {ValidValuesSet} */
427
743
  validValuesSet () {
428
- const root = /** @type {HTMLDivElement} */ (
744
+ const root = /** @type {HTMLDivElement|null} */ (
429
745
  $e(typeContainer, 'div[data-type]')
430
746
  );
747
+ if (!root) {
748
+ // No type/branch chosen yet: nothing valid has been set
749
+ return false;
750
+ }
431
751
  const form = /** @type {HTMLFormElement} */ (root.closest('form'));
432
752
  return Types.validValuesSet({form, typeNamespace});
433
753
  },