@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.
- package/.claude/settings.local.json +9 -0
- package/.ncurc.cjs +2 -2
- package/CHANGES.md +51 -0
- package/README.md +23 -13
- package/badges/coverage-badge.svg +1 -1
- package/dist/eslint.config.d.ts +3 -0
- package/dist/eslint.config.d.ts.map +1 -0
- package/dist/formatAndTypeChoices.d.ts +28 -30
- package/dist/formatAndTypeChoices.d.ts.map +1 -1
- package/dist/formats/indexedDBKey.d.ts.map +1 -1
- package/dist/formats/schema.d.ts +46 -3
- package/dist/formats/schema.d.ts.map +1 -1
- package/dist/formats/structuredCloning.d.ts +3 -0
- package/dist/formats/structuredCloning.d.ts.map +1 -1
- package/dist/formats.d.ts +24 -6
- package/dist/formats.d.ts.map +1 -1
- package/dist/fundamentalTypes/BooleanObjectType.d.ts.map +1 -1
- package/dist/fundamentalTypes/NumberObjectType.d.ts.map +1 -1
- package/dist/fundamentalTypes/StringObjectType.d.ts.map +1 -1
- package/dist/fundamentalTypes/arrayReferenceType.d.ts.map +1 -1
- package/dist/fundamentalTypes/arrayType.d.ts +7 -0
- package/dist/fundamentalTypes/arrayType.d.ts.map +1 -1
- package/dist/fundamentalTypes/bigintObjectType.d.ts.map +1 -1
- package/dist/fundamentalTypes/bigintType.d.ts +10 -0
- package/dist/fundamentalTypes/bigintType.d.ts.map +1 -1
- package/dist/fundamentalTypes/blobType.d.ts.map +1 -1
- package/dist/fundamentalTypes/booleanType.d.ts.map +1 -1
- package/dist/fundamentalTypes/catchType.d.ts +2 -2
- package/dist/fundamentalTypes/catchType.d.ts.map +1 -1
- package/dist/fundamentalTypes/dateType.d.ts.map +1 -1
- package/dist/fundamentalTypes/domexceptionType.d.ts.map +1 -1
- package/dist/fundamentalTypes/enumType.d.ts +2 -2
- package/dist/fundamentalTypes/enumType.d.ts.map +1 -1
- package/dist/fundamentalTypes/errorType.d.ts.map +1 -1
- package/dist/fundamentalTypes/fileType.d.ts +6 -0
- package/dist/fundamentalTypes/fileType.d.ts.map +1 -1
- package/dist/fundamentalTypes/functionType.d.ts.map +1 -1
- package/dist/fundamentalTypes/literalType.d.ts +3 -2
- package/dist/fundamentalTypes/literalType.d.ts.map +1 -1
- package/dist/fundamentalTypes/looseRecordType.d.ts +6 -0
- package/dist/fundamentalTypes/looseRecordType.d.ts.map +1 -0
- package/dist/fundamentalTypes/nanType.d.ts.map +1 -1
- package/dist/fundamentalTypes/neverType.d.ts +2 -2
- package/dist/fundamentalTypes/neverType.d.ts.map +1 -1
- package/dist/fundamentalTypes/noneditableType.d.ts.map +1 -1
- package/dist/fundamentalTypes/nullType.d.ts.map +1 -1
- package/dist/fundamentalTypes/numberType.d.ts.map +1 -1
- package/dist/fundamentalTypes/promiseType.d.ts.map +1 -1
- package/dist/fundamentalTypes/regexpType.d.ts.map +1 -1
- package/dist/fundamentalTypes/stringType.d.ts.map +1 -1
- package/dist/fundamentalTypes/symbolType.d.ts.map +1 -1
- package/dist/fundamentalTypes/undefinedType.d.ts.map +1 -1
- package/dist/fundamentalTypes/voidType.d.ts +2 -2
- package/dist/fundamentalTypes/voidType.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/rollup.config.d.ts +30 -0
- package/dist/rollup.config.d.ts.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/src/formatAndTypeChoices.d.ts +108 -0
- package/dist/src/formatAndTypeChoices.d.ts.map +1 -0
- package/dist/src/formats/arbitraryJS.d.ts +4 -0
- package/dist/src/formats/arbitraryJS.d.ts.map +1 -0
- package/dist/src/formats/indexedDBKey.d.ts +4 -0
- package/dist/src/formats/indexedDBKey.d.ts.map +1 -0
- package/dist/src/formats/json.d.ts +4 -0
- package/dist/src/formats/json.d.ts.map +1 -0
- package/dist/src/formats/schema.d.ts +17 -0
- package/dist/src/formats/schema.d.ts.map +1 -0
- package/dist/src/formats/structuredCloning.d.ts +19 -0
- package/dist/src/formats/structuredCloning.d.ts.map +1 -0
- package/dist/src/formats.d.ts +135 -0
- package/dist/src/formats.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/BooleanObjectType.d.ts +8 -0
- package/dist/src/fundamentalTypes/BooleanObjectType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/NumberObjectType.d.ts +6 -0
- package/dist/src/fundamentalTypes/NumberObjectType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/StringObjectType.d.ts +6 -0
- package/dist/src/fundamentalTypes/StringObjectType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/arrayReferenceType.d.ts +8 -0
- package/dist/src/fundamentalTypes/arrayReferenceType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/arrayType.d.ts +29 -0
- package/dist/src/fundamentalTypes/arrayType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/bigintObjectType.d.ts +6 -0
- package/dist/src/fundamentalTypes/bigintObjectType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/bigintType.d.ts +6 -0
- package/dist/src/fundamentalTypes/bigintType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/blobType.d.ts +11 -0
- package/dist/src/fundamentalTypes/blobType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/booleanType.d.ts +8 -0
- package/dist/src/fundamentalTypes/booleanType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/catchType.d.ts +6 -0
- package/dist/src/fundamentalTypes/catchType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/dateType.d.ts +26 -0
- package/dist/src/fundamentalTypes/dateType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/domexceptionType.d.ts +6 -0
- package/dist/src/fundamentalTypes/domexceptionType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/enumType.d.ts +6 -0
- package/dist/src/fundamentalTypes/enumType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/errorType.d.ts +6 -0
- package/dist/src/fundamentalTypes/errorType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/fileType.d.ts +13 -0
- package/dist/src/fundamentalTypes/fileType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/filelistType.d.ts +6 -0
- package/dist/src/fundamentalTypes/filelistType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/functionType.d.ts +7 -0
- package/dist/src/fundamentalTypes/functionType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/literalType.d.ts +6 -0
- package/dist/src/fundamentalTypes/literalType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/mapType.d.ts +6 -0
- package/dist/src/fundamentalTypes/mapType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/nanType.d.ts +6 -0
- package/dist/src/fundamentalTypes/nanType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/neverType.d.ts +6 -0
- package/dist/src/fundamentalTypes/neverType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/noneditableType.d.ts +6 -0
- package/dist/src/fundamentalTypes/noneditableType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/nullType.d.ts +6 -0
- package/dist/src/fundamentalTypes/nullType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/numberType.d.ts +6 -0
- package/dist/src/fundamentalTypes/numberType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/objectReferenceType.d.ts +8 -0
- package/dist/src/fundamentalTypes/objectReferenceType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/objectType.d.ts +6 -0
- package/dist/src/fundamentalTypes/objectType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/promiseType.d.ts +6 -0
- package/dist/src/fundamentalTypes/promiseType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/recordType.d.ts +6 -0
- package/dist/src/fundamentalTypes/recordType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/regexpType.d.ts +8 -0
- package/dist/src/fundamentalTypes/regexpType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/setType.d.ts +6 -0
- package/dist/src/fundamentalTypes/setType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/sparseUndefinedType.d.ts +6 -0
- package/dist/src/fundamentalTypes/sparseUndefinedType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/stringType.d.ts +6 -0
- package/dist/src/fundamentalTypes/stringType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/symbolType.d.ts +8 -0
- package/dist/src/fundamentalTypes/symbolType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/tupleType.d.ts +6 -0
- package/dist/src/fundamentalTypes/tupleType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/undefinedType.d.ts +6 -0
- package/dist/src/fundamentalTypes/undefinedType.d.ts.map +1 -0
- package/dist/src/fundamentalTypes/voidType.d.ts +6 -0
- package/dist/src/fundamentalTypes/voidType.d.ts.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/subTypes/blobHTMLType.d.ts +20 -0
- package/dist/src/subTypes/blobHTMLType.d.ts.map +1 -0
- package/dist/src/subTypes/falseType.d.ts +8 -0
- package/dist/src/subTypes/falseType.d.ts.map +1 -0
- package/dist/src/subTypes/trueType.d.ts +8 -0
- package/dist/src/subTypes/trueType.d.ts.map +1 -0
- package/dist/src/superTypes/SpecialNumberType.d.ts +6 -0
- package/dist/src/superTypes/SpecialNumberType.d.ts.map +1 -0
- package/dist/src/superTypes/SpecialRealNumberType.d.ts +6 -0
- package/dist/src/superTypes/SpecialRealNumberType.d.ts.map +1 -0
- package/dist/src/superTypes/buffersourceType.d.ts +8 -0
- package/dist/src/superTypes/buffersourceType.d.ts.map +1 -0
- package/dist/src/superTypes/dommatrixType.d.ts +6 -0
- package/dist/src/superTypes/dommatrixType.d.ts.map +1 -0
- package/dist/src/superTypes/dompointType.d.ts +6 -0
- package/dist/src/superTypes/dompointType.d.ts.map +1 -0
- package/dist/src/superTypes/domrectType.d.ts +6 -0
- package/dist/src/superTypes/domrectType.d.ts.map +1 -0
- package/dist/src/superTypes/errorsSpecialType.d.ts +8 -0
- package/dist/src/superTypes/errorsSpecialType.d.ts.map +1 -0
- package/dist/src/typeChoices.d.ts +140 -0
- package/dist/src/typeChoices.d.ts.map +1 -0
- package/dist/src/types.d.ts +758 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/utils/FileList.d.ts +26 -0
- package/dist/src/utils/FileList.d.ts.map +1 -0
- package/dist/src/utils/dialogs.d.ts +111 -0
- package/dist/src/utils/dialogs.d.ts.map +1 -0
- package/dist/src/utils/jsonPointer.d.ts +46 -0
- package/dist/src/utils/jsonPointer.d.ts.map +1 -0
- package/dist/src/utils/media.d.ts +18 -0
- package/dist/src/utils/media.d.ts.map +1 -0
- package/dist/src/utils/objects.d.ts +16 -0
- package/dist/src/utils/objects.d.ts.map +1 -0
- package/dist/src/utils/templateUtils.d.ts +59 -0
- package/dist/src/utils/templateUtils.d.ts.map +1 -0
- package/dist/src/utils/types.d.ts +2 -0
- package/dist/src/utils/types.d.ts.map +1 -0
- package/dist/src/vendor-imports.d.ts +4 -0
- package/dist/src/vendor-imports.d.ts.map +1 -0
- package/dist/subTypes/blobHTMLType.d.ts.map +1 -1
- package/dist/superTypes/SpecialRealNumberType.d.ts.map +1 -1
- package/dist/superTypes/buffersourceType.d.ts.map +1 -1
- package/dist/superTypes/dommatrixType.d.ts.map +1 -1
- package/dist/superTypes/dompointType.d.ts.map +1 -1
- package/dist/superTypes/domrectType.d.ts.map +1 -1
- package/dist/superTypes/errorsSpecialType.d.ts.map +1 -1
- package/dist/typeChoices.d.ts +21 -87
- package/dist/typeChoices.d.ts.map +1 -1
- package/dist/types.d.ts +90 -64
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/FileList.d.ts +4 -3
- package/dist/utils/FileList.d.ts.map +1 -1
- package/dist/utils/dialogs.d.ts +4 -4
- package/dist/utils/dialogs.d.ts.map +1 -1
- package/dist/utils/media.d.ts.map +1 -1
- package/dist/utils/schemaMeta.d.ts +92 -0
- package/dist/utils/schemaMeta.d.ts.map +1 -0
- package/dist/utils/templateUtils.d.ts +3 -3
- package/dist/utils/templateUtils.d.ts.map +1 -1
- package/dist/utils/timing.d.ts +2 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/types.d.ts +1 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/dist/vendor-imports.d.ts +3 -1
- package/docs/proposals/schema-meta.md +233 -0
- package/eslint.config.js +51 -4
- package/licenseInfo.json +1 -1
- package/package.json +52 -42
- package/pnpm-workspace.yaml +57 -0
- package/rollup.config.js +20 -18
- package/server.js +3 -3
- package/src/deepEqual.js.map +1 -1
- package/src/formatAndTypeChoices.js +62 -58
- package/src/formats/indexedDBKey.js +3 -4
- package/src/formats/schema.js +824 -475
- package/src/formats/structuredCloning.js +189 -79
- package/src/formats.js +17 -5
- package/src/fundamentalTypes/BooleanObjectType.js +4 -5
- package/src/fundamentalTypes/NumberObjectType.js +4 -4
- package/src/fundamentalTypes/StringObjectType.js +3 -4
- package/src/fundamentalTypes/arrayReferenceType.js +0 -2
- package/src/fundamentalTypes/arrayType.js +624 -389
- package/src/fundamentalTypes/bigintObjectType.js +3 -2
- package/src/fundamentalTypes/bigintType.js +79 -17
- package/src/fundamentalTypes/blobType.js +35 -35
- package/src/fundamentalTypes/booleanType.js +16 -8
- package/src/fundamentalTypes/dateType.js +6 -8
- package/src/fundamentalTypes/domexceptionType.js +5 -4
- package/src/fundamentalTypes/errorType.js +39 -32
- package/src/fundamentalTypes/fileType.js +238 -52
- package/src/fundamentalTypes/functionType.js +61 -41
- package/src/fundamentalTypes/nanType.js +5 -4
- package/src/fundamentalTypes/noneditableType.js +4 -3
- package/src/fundamentalTypes/nullType.js +3 -2
- package/src/fundamentalTypes/numberType.js +72 -20
- package/src/fundamentalTypes/promiseType.js +16 -40
- package/src/fundamentalTypes/regexpType.js +7 -13
- package/src/fundamentalTypes/stringType.js +176 -110
- package/src/fundamentalTypes/symbolType.js +3 -2
- package/src/fundamentalTypes/undefinedType.js +3 -2
- package/src/index.js +6 -5
- package/src/jsoe.css +107 -8
- package/src/subTypes/blobHTMLType.js +23 -10
- package/src/superTypes/SpecialNumberType.js +6 -6
- package/src/superTypes/SpecialRealNumberType.js +10 -9
- package/src/superTypes/buffersourceType.js +86 -75
- package/src/superTypes/dommatrixType.js +6 -5
- package/src/superTypes/dompointType.js +6 -5
- package/src/superTypes/domrectType.js +6 -5
- package/src/superTypes/errorsSpecialType.js +54 -35
- package/src/typeChoices.js +399 -54
- package/src/types.js +157 -97
- package/src/utils/FileList.js +3 -3
- package/src/utils/dialogs.js +5 -7
- package/src/utils/jsonPointer.js +1 -1
- package/src/utils/media.js +1 -0
- package/src/utils/schemaMeta.js +257 -0
- package/src/utils/templateUtils.js +3 -3
- package/src/utils/timing.js +12 -0
- package/src/utils/types.js +19 -0
- package/src/vendor-imports.js +10 -2
- package/tsconfig.json +2 -0
- package/vendor/acorn/dist/acorn.d.mts +46 -5
- package/vendor/acorn/dist/acorn.d.ts +46 -5
- package/vendor/acorn/dist/acorn.js +394 -117
- package/vendor/acorn/dist/acorn.mjs +394 -117
- package/vendor/acorn/dist/bin.js +1 -1
- package/vendor/jamilih/dist/{jml-es.js → jml.mjs} +590 -312
- package/vendor/jamilih/package.json +1 -1
- package/vendor/mime/dist/types/other.js +719 -0
- package/vendor/mime/dist/types/standard.js +366 -0
- package/vendor/typeson-registry/dist/index.js +519 -99
- package/vendor/zod/classic/checks.d.ts +1 -0
- package/vendor/zod/classic/checks.js +1 -0
- package/vendor/zod/classic/coerce.d.ts +17 -0
- package/vendor/zod/classic/coerce.js +17 -0
- package/vendor/zod/classic/compat.d.ts +48 -0
- package/vendor/zod/classic/compat.js +31 -0
- package/vendor/zod/classic/deep-partial.d.ts +14 -0
- package/vendor/zod/classic/deep-partial.js +13 -0
- package/vendor/zod/classic/errors.d.ts +29 -0
- package/vendor/zod/classic/errors.js +57 -0
- package/vendor/zod/classic/external.d.ts +19 -0
- package/vendor/zod/classic/external.js +17 -0
- package/vendor/zod/classic/from-json-schema.d.ts +12 -0
- package/vendor/zod/classic/from-json-schema.js +660 -0
- package/vendor/zod/classic/in-out.d.ts +8 -0
- package/vendor/zod/classic/in-out.js +36 -0
- package/vendor/zod/classic/index.d.ts +3 -0
- package/vendor/zod/classic/index.js +4 -0
- package/vendor/zod/classic/iso.d.ts +7 -0
- package/vendor/zod/classic/iso.js +15 -0
- package/vendor/zod/classic/package.json +7 -0
- package/vendor/zod/classic/parse.d.ts +44 -0
- package/vendor/zod/classic/parse.js +16 -0
- package/vendor/zod/classic/schemas.d.ts +802 -0
- package/vendor/zod/classic/schemas.js +1491 -0
- package/vendor/zod/core/api.d.ts +329 -0
- package/vendor/zod/core/api.js +1104 -0
- package/vendor/zod/core/checks.d.ts +278 -0
- package/vendor/zod/core/checks.js +581 -0
- package/vendor/zod/core/compile.d.ts +51 -0
- package/vendor/zod/core/compile.js +1783 -0
- package/vendor/zod/core/core.d.ts +82 -0
- package/vendor/zod/core/core.js +141 -0
- package/vendor/zod/core/doc.d.ts +16 -0
- package/vendor/zod/core/doc.js +33 -0
- package/vendor/zod/core/errors.d.ts +225 -0
- package/vendor/zod/core/errors.js +270 -0
- package/vendor/zod/core/index.d.ts +19 -0
- package/vendor/zod/core/index.js +19 -0
- package/vendor/zod/core/json-schema-generator.d.ts +65 -0
- package/vendor/zod/core/json-schema-generator.js +99 -0
- package/vendor/zod/core/json-schema-processors.d.ts +49 -0
- package/vendor/zod/core/json-schema-processors.js +747 -0
- package/vendor/zod/core/json-schema.d.ts +89 -0
- package/vendor/zod/core/memoizer.d.ts +15 -0
- package/vendor/zod/core/memoizer.js +265 -0
- package/vendor/zod/core/package.json +7 -0
- package/vendor/zod/core/parse.d.ts +52 -0
- package/vendor/zod/core/parse.js +154 -0
- package/vendor/zod/core/regexes.d.ts +87 -0
- package/vendor/zod/core/regexes.js +150 -0
- package/vendor/zod/core/registries.d.ts +35 -0
- package/vendor/zod/core/registries.js +51 -0
- package/vendor/zod/core/schemas.d.ts +1253 -0
- package/vendor/zod/core/schemas.js +2440 -0
- package/vendor/zod/core/standard-schema.d.ts +126 -0
- package/vendor/zod/core/to-json-schema.d.ts +153 -0
- package/vendor/zod/core/to-json-schema.js +650 -0
- package/vendor/zod/core/util.d.ts +257 -0
- package/vendor/zod/core/util.js +846 -0
- package/vendor/zod/core/versions.d.ts +5 -0
- package/vendor/zod/core/versions.js +5 -0
- package/vendor/zod/core/visit.d.ts +30 -0
- package/vendor/zod/core/visit.js +169 -0
- package/vendor/zod/index.d.ts +3 -0
- package/vendor/zod/index.js +4 -0
- package/vendor/zod/locales/ar.d.ts +4 -0
- package/vendor/zod/locales/ar.js +109 -0
- package/vendor/zod/locales/az.d.ts +4 -0
- package/vendor/zod/locales/az.js +108 -0
- package/vendor/zod/locales/be.d.ts +4 -0
- package/vendor/zod/locales/be.js +166 -0
- package/vendor/zod/locales/bg.d.ts +4 -0
- package/vendor/zod/locales/bg.js +123 -0
- package/vendor/zod/locales/bn.d.ts +4 -0
- package/vendor/zod/locales/bn.js +111 -0
- package/vendor/zod/locales/ca.d.ts +4 -0
- package/vendor/zod/locales/ca.js +110 -0
- package/vendor/zod/locales/ckb.d.ts +4 -0
- package/vendor/zod/locales/ckb.js +131 -0
- package/vendor/zod/locales/cs.d.ts +4 -0
- package/vendor/zod/locales/cs.js +114 -0
- package/vendor/zod/locales/da.d.ts +4 -0
- package/vendor/zod/locales/da.js +118 -0
- package/vendor/zod/locales/de.d.ts +4 -0
- package/vendor/zod/locales/de.js +111 -0
- package/vendor/zod/locales/el.d.ts +4 -0
- package/vendor/zod/locales/el.js +110 -0
- package/vendor/zod/locales/en.d.ts +4 -0
- package/vendor/zod/locales/en.js +123 -0
- package/vendor/zod/locales/eo.d.ts +4 -0
- package/vendor/zod/locales/eo.js +112 -0
- package/vendor/zod/locales/es.d.ts +4 -0
- package/vendor/zod/locales/es.js +134 -0
- package/vendor/zod/locales/fa.d.ts +4 -0
- package/vendor/zod/locales/fa.js +117 -0
- package/vendor/zod/locales/fi.d.ts +4 -0
- package/vendor/zod/locales/fi.js +115 -0
- package/vendor/zod/locales/fr-CA.d.ts +4 -0
- package/vendor/zod/locales/fr-CA.js +110 -0
- package/vendor/zod/locales/fr.d.ts +4 -0
- package/vendor/zod/locales/fr.js +127 -0
- package/vendor/zod/locales/gu.d.ts +4 -0
- package/vendor/zod/locales/gu.js +111 -0
- package/vendor/zod/locales/he.d.ts +4 -0
- package/vendor/zod/locales/he.js +219 -0
- package/vendor/zod/locales/hi.d.ts +4 -0
- package/vendor/zod/locales/hi.js +109 -0
- package/vendor/zod/locales/hr.d.ts +4 -0
- package/vendor/zod/locales/hr.js +124 -0
- package/vendor/zod/locales/hu.d.ts +4 -0
- package/vendor/zod/locales/hu.js +111 -0
- package/vendor/zod/locales/hy.d.ts +4 -0
- package/vendor/zod/locales/hy.js +156 -0
- package/vendor/zod/locales/id.d.ts +4 -0
- package/vendor/zod/locales/id.js +109 -0
- package/vendor/zod/locales/index.d.ts +62 -0
- package/vendor/zod/locales/index.js +62 -0
- package/vendor/zod/locales/is.d.ts +4 -0
- package/vendor/zod/locales/is.js +112 -0
- package/vendor/zod/locales/it.d.ts +4 -0
- package/vendor/zod/locales/it.js +111 -0
- package/vendor/zod/locales/ja.d.ts +4 -0
- package/vendor/zod/locales/ja.js +110 -0
- package/vendor/zod/locales/ka.d.ts +4 -0
- package/vendor/zod/locales/ka.js +115 -0
- package/vendor/zod/locales/kh.d.ts +5 -0
- package/vendor/zod/locales/kh.js +5 -0
- package/vendor/zod/locales/km.d.ts +4 -0
- package/vendor/zod/locales/km.js +113 -0
- package/vendor/zod/locales/kn.d.ts +4 -0
- package/vendor/zod/locales/kn.js +114 -0
- package/vendor/zod/locales/ko.d.ts +4 -0
- package/vendor/zod/locales/ko.js +114 -0
- package/vendor/zod/locales/lt.d.ts +4 -0
- package/vendor/zod/locales/lt.js +205 -0
- package/vendor/zod/locales/mk.d.ts +4 -0
- package/vendor/zod/locales/mk.js +112 -0
- package/vendor/zod/locales/ms.d.ts +4 -0
- package/vendor/zod/locales/ms.js +110 -0
- package/vendor/zod/locales/ne.d.ts +4 -0
- package/vendor/zod/locales/ne.js +109 -0
- package/vendor/zod/locales/nl.d.ts +4 -0
- package/vendor/zod/locales/nl.js +113 -0
- package/vendor/zod/locales/nn.d.ts +4 -0
- package/vendor/zod/locales/nn.js +111 -0
- package/vendor/zod/locales/no.d.ts +4 -0
- package/vendor/zod/locales/no.js +111 -0
- package/vendor/zod/locales/ota.d.ts +4 -0
- package/vendor/zod/locales/ota.js +112 -0
- package/vendor/zod/locales/package.json +7 -0
- package/vendor/zod/locales/pl.d.ts +4 -0
- package/vendor/zod/locales/pl.js +112 -0
- package/vendor/zod/locales/ps.d.ts +4 -0
- package/vendor/zod/locales/ps.js +117 -0
- package/vendor/zod/locales/pt-BR.d.ts +4 -0
- package/vendor/zod/locales/pt-BR.js +141 -0
- package/vendor/zod/locales/pt.d.ts +4 -0
- package/vendor/zod/locales/pt.js +140 -0
- package/vendor/zod/locales/ro.d.ts +4 -0
- package/vendor/zod/locales/ro.js +120 -0
- package/vendor/zod/locales/ru.d.ts +4 -0
- package/vendor/zod/locales/ru.js +166 -0
- package/vendor/zod/locales/sk.d.ts +4 -0
- package/vendor/zod/locales/sk.js +114 -0
- package/vendor/zod/locales/sl.d.ts +4 -0
- package/vendor/zod/locales/sl.js +112 -0
- package/vendor/zod/locales/sv.d.ts +4 -0
- package/vendor/zod/locales/sv.js +113 -0
- package/vendor/zod/locales/ta.d.ts +4 -0
- package/vendor/zod/locales/ta.js +113 -0
- package/vendor/zod/locales/th.d.ts +4 -0
- package/vendor/zod/locales/th.js +113 -0
- package/vendor/zod/locales/tk.d.ts +4 -0
- package/vendor/zod/locales/tk.js +105 -0
- package/vendor/zod/locales/tr.d.ts +4 -0
- package/vendor/zod/locales/tr.js +108 -0
- package/vendor/zod/locales/ua.d.ts +5 -0
- package/vendor/zod/locales/ua.js +5 -0
- package/vendor/zod/locales/uk.d.ts +4 -0
- package/vendor/zod/locales/uk.js +111 -0
- package/vendor/zod/locales/ur.d.ts +4 -0
- package/vendor/zod/locales/ur.js +113 -0
- package/vendor/zod/locales/uz.d.ts +4 -0
- package/vendor/zod/locales/uz.js +111 -0
- package/vendor/zod/locales/vi.d.ts +4 -0
- package/vendor/zod/locales/vi.js +111 -0
- package/vendor/zod/locales/yo.d.ts +4 -0
- package/vendor/zod/locales/yo.js +110 -0
- package/vendor/zod/locales/zh-CN.d.ts +4 -0
- package/vendor/zod/locales/zh-CN.js +112 -0
- package/vendor/zod/locales/zh-TW.d.ts +4 -0
- package/vendor/zod/locales/zh-TW.js +110 -0
- package/vendor/zod/mini/checks.d.ts +1 -0
- package/vendor/zod/mini/checks.js +1 -0
- package/vendor/zod/mini/coerce.d.ts +7 -0
- package/vendor/zod/mini/coerce.js +22 -0
- package/vendor/zod/mini/deep-partial.d.ts +14 -0
- package/vendor/zod/mini/deep-partial.js +13 -0
- package/vendor/zod/mini/external.d.ts +16 -0
- package/vendor/zod/mini/external.js +16 -0
- package/vendor/zod/mini/in-out.d.ts +8 -0
- package/vendor/zod/mini/in-out.js +36 -0
- package/vendor/zod/mini/index.d.ts +3 -0
- package/vendor/zod/mini/index.js +3 -0
- package/vendor/zod/mini/iso.d.ts +22 -0
- package/vendor/zod/mini/iso.js +34 -0
- package/vendor/zod/mini/package.json +7 -0
- package/vendor/zod/mini/parse.d.ts +1 -0
- package/vendor/zod/mini/parse.js +1 -0
- package/vendor/zod/mini/schemas.d.ts +475 -0
- package/vendor/zod/mini/schemas.js +987 -0
- package/vendor/zod/package.json +7 -0
- package/vendor/zodexy/dist/esm/index.js +1274 -0
- package/vendor/zodexy/dist/index.js +1088 -0
- package/vendor/zodexy/dist/schema.zodexy.json +1036 -0
- package/dist/fundamentalTypes/nativeEnumType.d.ts +0 -6
- package/dist/fundamentalTypes/nativeEnumType.d.ts.map +0 -1
- package/src/fundamentalTypes/catchType.js +0 -140
- package/src/fundamentalTypes/enumType.js +0 -52
- package/src/fundamentalTypes/literalType.js +0 -81
- package/src/fundamentalTypes/nativeEnumType.js +0 -157
- package/src/fundamentalTypes/neverType.js +0 -49
- package/src/fundamentalTypes/recordType.js +0 -42
- package/src/fundamentalTypes/tupleType.js +0 -39
- package/src/fundamentalTypes/voidType.js +0 -48
- package/vendor/zod/lib/index.mjs +0 -4236
- package/vendor/zodex/dist/esm/dezerialize.d.ts +0 -26
- package/vendor/zodex/dist/esm/dezerialize.js +0 -393
- package/vendor/zodex/dist/esm/index.d.ts +0 -9
- package/vendor/zodex/dist/esm/index.js +0 -4
- package/vendor/zodex/dist/esm/infer.d.ts +0 -29
- package/vendor/zodex/dist/esm/package.json +0 -1
- package/vendor/zodex/dist/esm/types.d.ts +0 -201
- package/vendor/zodex/dist/esm/types.js +0 -13
- package/vendor/zodex/dist/esm/ui.d.ts +0 -23
- package/vendor/zodex/dist/esm/ui.js +0 -10
- package/vendor/zodex/dist/esm/zerialize.d.ts +0 -50
- package/vendor/zodex/dist/esm/zerialize.js +0 -417
- package/vendor/zodex/dist/esm/zod-types.d.ts +0 -11
- /package/vendor/{zodex/dist/esm/infer.js → zod/core/json-schema.js} +0 -0
- /package/vendor/{zodex/dist/esm/zod-types.js → zod/core/standard-schema.js} +0 -0
package/src/typeChoices.js
CHANGED
|
@@ -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('
|
|
44
|
+
* specificSchema?: import('zodexy').SzType
|
|
17
45
|
* }) => void} SetType
|
|
18
46
|
*/
|
|
19
47
|
|
|
20
48
|
/**
|
|
21
49
|
* @typedef {(info: {
|
|
22
50
|
* type: string,
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
|
-
|
|
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
|
-
/**
|
|
165
|
-
|
|
166
|
-
|
|
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.
|
|
170
|
-
return
|
|
171
|
-
})
|
|
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
|
-
* @
|
|
185
|
-
*
|
|
186
|
-
* specificSchema?: import('zodex').SzType
|
|
187
|
-
* }) => void} cfg
|
|
470
|
+
* @this {TypeChoicesElementAPI}
|
|
471
|
+
* @param {Parameters<SetTypeNoEditUI>[0]} cfg
|
|
188
472
|
*/
|
|
189
|
-
$setTypeNoEditUI (
|
|
473
|
+
$setTypeNoEditUI (cfg) {
|
|
474
|
+
const {type, specificSchema} = cfg;
|
|
190
475
|
if (schemaObjs && specificSchema) {
|
|
191
|
-
const idx = schemaObjs.
|
|
192
|
-
return
|
|
193
|
-
})
|
|
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
|
-
/**
|
|
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 =
|
|
499
|
+
ancestorEl = ancestorEl.parentElement;
|
|
209
500
|
}
|
|
210
|
-
if (ancestorEl
|
|
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
|
-
/**
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
(
|
|
254
|
-
?
|
|
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
|
-
(
|
|
569
|
+
(schemaIdx !== undefined && isUnionLike(schemaContent?.type)
|
|
269
570
|
/* istanbul ignore next -- Can probably remove */
|
|
270
|
-
?
|
|
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
|
-
/**
|
|
285
|
-
|
|
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
|
-
* @
|
|
597
|
+
* @this {TypeChoicesElementAPI}
|
|
598
|
+
* @param {Parameters<AddEditUI>[0]} cfg
|
|
291
599
|
*/
|
|
292
|
-
$addEditUI (
|
|
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
|
-
* @
|
|
305
|
-
* @
|
|
616
|
+
* @this {TypeChoicesElementAPI}
|
|
617
|
+
* @param {Parameters<Validate>[0]} [cfg]
|
|
306
618
|
*/
|
|
307
|
-
$validate (
|
|
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
|
|
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
|
-
|
|
354
|
-
|
|
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,
|
|
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
|
},
|