@es-joy/jsoe 0.24.3 → 0.25.1

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