@es-joy/jsoe 0.24.3 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/.ncurc.cjs +2 -2
- package/CHANGES.md +47 -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 +373 -53
- 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,10 @@ import Formats from './formats.js';
|
|
|
3
3
|
import Types from './types.js';
|
|
4
4
|
|
|
5
5
|
import {$e, DOM} from './utils/templateUtils.js';
|
|
6
|
+
import {isUnionLike} from './utils/types.js';
|
|
7
|
+
import {getXorBranchMatchInfo, valueMatchesSchema} from './formats/schema.js';
|
|
6
8
|
import dialogs from './utils/dialogs.js';
|
|
9
|
+
import deepEqual from 'fast-deep-equal/es6/index.js';
|
|
7
10
|
|
|
8
11
|
// This is technically just `import('./index.js').SetType`, but our
|
|
9
12
|
// redirect file causes problems, so we redefine here
|
|
@@ -13,15 +16,30 @@ import dialogs from './utils/dialogs.js';
|
|
|
13
16
|
* baseValue?: import('./formats.js').StructuredCloneValue,
|
|
14
17
|
* bringIntoFocus?: boolean,
|
|
15
18
|
* avoidReport?: boolean,
|
|
16
|
-
* specificSchema?: import('
|
|
19
|
+
* specificSchema?: import('zodexy').SzType
|
|
17
20
|
* }) => void} SetType
|
|
18
21
|
*/
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
24
|
* @typedef {(info: {
|
|
22
25
|
* type: string,
|
|
23
|
-
*
|
|
24
|
-
*
|
|
26
|
+
* specificSchema?: import('zodexy').SzType
|
|
27
|
+
* }) => void} SetTypeNoEditUI
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* @callback Validate
|
|
31
|
+
* @param {{avoidReport?: boolean}} cfg
|
|
32
|
+
* @returns {boolean}
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {() => false|null|HTMLElement} GetTypeRoot
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @typedef {(info: {
|
|
40
|
+
* type: string,
|
|
41
|
+
* editUI: HTMLElement,
|
|
42
|
+
* specificSchema?: import('zodexy').SzType
|
|
25
43
|
* }) => void} AddTypeAndEditUI
|
|
26
44
|
*/
|
|
27
45
|
|
|
@@ -39,9 +57,19 @@ import dialogs from './utils/dialogs.js';
|
|
|
39
57
|
*/
|
|
40
58
|
|
|
41
59
|
/**
|
|
42
|
-
* @typedef {HTMLElement
|
|
60
|
+
* @typedef {(info: {editUI: HTMLElement}) => void} AddEditUI
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @typedef {HTMLSelectElement & {
|
|
43
65
|
* $addAndValidateEditUI: AddAndValidateEditUI,
|
|
44
|
-
* $setStyles: SetStyles
|
|
66
|
+
* $setStyles: SetStyles,
|
|
67
|
+
* $getTypeRoot: GetTypeRoot,
|
|
68
|
+
* $getContainer: () => HTMLElement,
|
|
69
|
+
* $getTopRoot: () => HTMLDivElement,
|
|
70
|
+
* $addEditUI: AddEditUI,
|
|
71
|
+
* $validate: Validate,
|
|
72
|
+
* $setTypeNoEditUI: SetTypeNoEditUI
|
|
45
73
|
* }} TypeChoicesElementAPI
|
|
46
74
|
*/
|
|
47
75
|
|
|
@@ -100,6 +128,231 @@ import dialogs from './utils/dialogs.js';
|
|
|
100
128
|
* }}
|
|
101
129
|
*/
|
|
102
130
|
|
|
131
|
+
/**
|
|
132
|
+
* The `<select>`-shaped `$`-methods that downstream code invokes on a
|
|
133
|
+
* type-choices control. The `xor` radio group reuses these by reference from
|
|
134
|
+
* the parallel `<select>`.
|
|
135
|
+
* @type {readonly string[]}
|
|
136
|
+
*/
|
|
137
|
+
const typeChoicesAPIMethods = [
|
|
138
|
+
'$getValue', '$setType', '$setTypeNoEditUI', '$setStyles', '$getTypeRoot',
|
|
139
|
+
'$addAndValidateEditUI', '$addTypeAndEditUI', '$addEditUI', '$getContainer',
|
|
140
|
+
'$getTopRoot', '$validate'
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Human-readable caption for one `xor` branch radio. Prefers the branch's own
|
|
145
|
+
* `description`; otherwise derives something legible from its shape so the
|
|
146
|
+
* branches can be told apart without reading schema.
|
|
147
|
+
* @param {import('zodexy').SzType|undefined} schemaObj
|
|
148
|
+
* @param {string} optText Fallback option text (already e.g. `"string"`)
|
|
149
|
+
* @param {number} idx
|
|
150
|
+
* @returns {string}
|
|
151
|
+
*/
|
|
152
|
+
function deriveXorBranchLabel (schemaObj, optText, idx) {
|
|
153
|
+
if (schemaObj && 'description' in schemaObj && schemaObj.description) {
|
|
154
|
+
return /** @type {string} */ (schemaObj.description);
|
|
155
|
+
}
|
|
156
|
+
if (schemaObj && schemaObj.type === 'literal') {
|
|
157
|
+
const {values} = /** @type {import('zodexy').SzLiteral<any>} */ (schemaObj);
|
|
158
|
+
if (Array.isArray(values) && values.length) {
|
|
159
|
+
return String(values[0]);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (schemaObj && schemaObj.type === 'object') {
|
|
163
|
+
const {properties} = /** @type {import('zodexy').SzObject} */ (schemaObj);
|
|
164
|
+
const keys = properties && typeof properties === 'object'
|
|
165
|
+
? Object.keys(properties)
|
|
166
|
+
: [];
|
|
167
|
+
if (keys.length) {
|
|
168
|
+
// Todo: when branches share property names, prefer the keys unique to
|
|
169
|
+
// this branch (symmetric difference against its siblings)
|
|
170
|
+
return keys.length > 3
|
|
171
|
+
? `${keys.slice(0, 3).join(', ')}, +${keys.length - 3} more`
|
|
172
|
+
: keys.join(', ');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return optText || `Option ${idx + 1}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Build the `xor` (exclusive union) radio-group control. It renders a
|
|
180
|
+
* labelled radio per branch and shims the `<select>` value surface
|
|
181
|
+
* (`value`, `selectedIndex`, `selectedOptions`), reusing the `$`-methods of
|
|
182
|
+
* the parallel `<select>` in `selectEl` by reference. A live indicator under
|
|
183
|
+
* the radios counts how many branches the current value satisfies, since
|
|
184
|
+
* `xor` requires exactly one and jsoe otherwise validates only the chosen
|
|
185
|
+
* branch's leaf schema.
|
|
186
|
+
* @param {{
|
|
187
|
+
* typeNamespace: string|undefined,
|
|
188
|
+
* keySelectClass: string|undefined,
|
|
189
|
+
* typeOptions: [string, {value?: string, title?: string}?][],
|
|
190
|
+
* schemaObjs: import('zodexy').SzType[],
|
|
191
|
+
* types: InstanceType<typeof import('./types.js').default>,
|
|
192
|
+
* typeContainer: HTMLElement,
|
|
193
|
+
* xorSchema: import('zodexy').SzUnion|undefined,
|
|
194
|
+
* selectEl: HTMLSelectElement
|
|
195
|
+
* }} cfg
|
|
196
|
+
* @returns {HTMLSelectElement}
|
|
197
|
+
*/
|
|
198
|
+
function buildXorTypeChoices ({
|
|
199
|
+
typeNamespace, keySelectClass, typeOptions, schemaObjs, types,
|
|
200
|
+
typeContainer, xorSchema, selectEl
|
|
201
|
+
}) {
|
|
202
|
+
const radioName = `typeChoices-${typeNamespace}-xor`;
|
|
203
|
+
const fieldset = jml('fieldset', {
|
|
204
|
+
class: `typeChoices-${typeNamespace} xorTypeChoices${keySelectClass
|
|
205
|
+
? ' ' + keySelectClass
|
|
206
|
+
: ''
|
|
207
|
+
}`,
|
|
208
|
+
$on: {change (e) {
|
|
209
|
+
e?.stopPropagation();
|
|
210
|
+
const idxAttr =
|
|
211
|
+
/** @type {HTMLElement} */ (e.target)?.dataset?.idx ??
|
|
212
|
+
/** @type {TypeChoicesElementAPI} */ (
|
|
213
|
+
this
|
|
214
|
+
).selectedOptions[0]?.dataset?.idx;
|
|
215
|
+
/** @type {TypeChoicesElementAPI} */ (this).$addAndValidateEditUI({
|
|
216
|
+
schemaObject: idxAttr === undefined
|
|
217
|
+
? undefined
|
|
218
|
+
: schemaObjs[Number(idxAttr)]
|
|
219
|
+
});
|
|
220
|
+
/** @type {TypeChoicesElementAPI} */ (this).$setStyles();
|
|
221
|
+
updateMatchStatus();
|
|
222
|
+
}}
|
|
223
|
+
}, [
|
|
224
|
+
['legend', {class: 'xorTypeChoicesLegend'}, ['Exactly one of']],
|
|
225
|
+
...typeOptions.map(([optText, optAtts], idx) => {
|
|
226
|
+
return ['label', {class: 'xorTypeChoice'}, [
|
|
227
|
+
['input', {
|
|
228
|
+
type: 'radio',
|
|
229
|
+
name: radioName,
|
|
230
|
+
value: /** @type {string} */ (optAtts?.value ?? ''),
|
|
231
|
+
dataset: {idx}
|
|
232
|
+
}],
|
|
233
|
+
['span', {class: 'xorTypeChoiceLabel'}, [
|
|
234
|
+
deriveXorBranchLabel(schemaObjs[idx], optText, idx)
|
|
235
|
+
]]
|
|
236
|
+
]];
|
|
237
|
+
}),
|
|
238
|
+
['div', {class: 'xorMatchStatus', hidden: true}]
|
|
239
|
+
]);
|
|
240
|
+
|
|
241
|
+
const radios = () => /** @type {HTMLInputElement[]} */ (
|
|
242
|
+
[...fieldset.querySelectorAll('input[type="radio"]')]
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
const matchStatus = /** @type {HTMLElement} */ (
|
|
246
|
+
$e(fieldset, '.xorMatchStatus')
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Re-count how many `xor` branches the assembled value satisfies and
|
|
251
|
+
* reflect it in the indicator, also marking the chosen radio invalid when
|
|
252
|
+
* the count is not exactly one so the form's `checkValidity()` catches it.
|
|
253
|
+
* @returns {void}
|
|
254
|
+
*/
|
|
255
|
+
function updateMatchStatus () {
|
|
256
|
+
// Only the currently-chosen branch's match state is meaningful; clear any
|
|
257
|
+
// custom validity left on the other radios so a stale message from a
|
|
258
|
+
// previously-selected branch does not keep the form invalid after the
|
|
259
|
+
// user switches branches.
|
|
260
|
+
const allRadios = radios();
|
|
261
|
+
for (const r of allRadios) {
|
|
262
|
+
r.setCustomValidity('');
|
|
263
|
+
}
|
|
264
|
+
const checked = allRadios.find((r) => r.checked);
|
|
265
|
+
if (!xorSchema || !checked || !$e(typeContainer, 'div[data-type]')) {
|
|
266
|
+
matchStatus.hidden = true;
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
let value;
|
|
270
|
+
try {
|
|
271
|
+
value = /** @type {() => unknown} */ (fsAPI.$getValue)();
|
|
272
|
+
} catch {
|
|
273
|
+
// Editor not ready or value not yet parseable
|
|
274
|
+
matchStatus.hidden = true;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const {matched, total} = getXorBranchMatchInfo(types, xorSchema, value);
|
|
278
|
+
// The value must satisfy the branch the user actually chose, not merely
|
|
279
|
+
// *some* branch: an empty value on the "email" branch still matches the
|
|
280
|
+
// plain-`string` branch, so the count alone would call it valid.
|
|
281
|
+
const selectedSchema = schemaObjs[Number(checked.dataset.idx)];
|
|
282
|
+
const selectedMatches = Boolean(selectedSchema) &&
|
|
283
|
+
valueMatchesSchema(types, selectedSchema, value);
|
|
284
|
+
// Anything but "the chosen branch, and only it" is invalid — including a
|
|
285
|
+
// still-empty branch (zero matches): the form must not be submittable
|
|
286
|
+
// in that state, so we always show the indicator and set validity once
|
|
287
|
+
// a branch is chosen.
|
|
288
|
+
const ok = selectedMatches && matched === 1;
|
|
289
|
+
matchStatus.hidden = false;
|
|
290
|
+
matchStatus.textContent = !selectedMatches
|
|
291
|
+
? 'Value does not match the selected option'
|
|
292
|
+
: ok
|
|
293
|
+
? `Matches 1 of ${total} options`
|
|
294
|
+
: `Matches ${matched} of ${total} — value must match exactly one`;
|
|
295
|
+
matchStatus.classList.toggle('xorMatchOk', ok);
|
|
296
|
+
matchStatus.classList.toggle('xorMatchErr', !ok);
|
|
297
|
+
checked.setCustomValidity(
|
|
298
|
+
ok
|
|
299
|
+
? ''
|
|
300
|
+
: selectedMatches
|
|
301
|
+
? 'Value must match exactly one option'
|
|
302
|
+
: 'Value does not match the selected option'
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
typeContainer.addEventListener('input', updateMatchStatus);
|
|
307
|
+
typeContainer.addEventListener('change', updateMatchStatus);
|
|
308
|
+
|
|
309
|
+
const selAPI = /** @type {Record<string, unknown>} */ (
|
|
310
|
+
/** @type {unknown} */ (selectEl)
|
|
311
|
+
);
|
|
312
|
+
const fsAPI = /** @type {Record<string, unknown>} */ (
|
|
313
|
+
/** @type {unknown} */ (fieldset)
|
|
314
|
+
);
|
|
315
|
+
for (const method of typeChoicesAPIMethods) {
|
|
316
|
+
fsAPI[method] = selAPI[method];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
Object.defineProperties(fieldset, {
|
|
320
|
+
value: {
|
|
321
|
+
configurable: true,
|
|
322
|
+
get () {
|
|
323
|
+
return radios().find((r) => r.checked)?.value ?? '';
|
|
324
|
+
},
|
|
325
|
+
set (v) {
|
|
326
|
+
const match = radios().find((r) => r.value === v);
|
|
327
|
+
for (const r of radios()) {
|
|
328
|
+
r.checked = r === match;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
selectedIndex: {
|
|
333
|
+
configurable: true,
|
|
334
|
+
get () {
|
|
335
|
+
const i = radios().findIndex((r) => r.checked);
|
|
336
|
+
return i === -1 ? 0 : i + 1;
|
|
337
|
+
},
|
|
338
|
+
set (i) {
|
|
339
|
+
radios().forEach((r, idx) => {
|
|
340
|
+
r.checked = idx === Number(i) - 1;
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
selectedOptions: {
|
|
345
|
+
configurable: true,
|
|
346
|
+
get () {
|
|
347
|
+
const r = radios().find((rd) => rd.checked);
|
|
348
|
+
return r ? [{value: r.value, dataset: {idx: r.dataset.idx}}] : [];
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
return /** @type {HTMLSelectElement} */ (/** @type {unknown} */ (fieldset));
|
|
354
|
+
}
|
|
355
|
+
|
|
103
356
|
/**
|
|
104
357
|
* @type {BuildTypeChoices}
|
|
105
358
|
*/
|
|
@@ -152,7 +405,11 @@ export const buildTypeChoices = ({
|
|
|
152
405
|
currentPath
|
|
153
406
|
);
|
|
154
407
|
};
|
|
155
|
-
|
|
408
|
+
// Created before the control so the `xor` radio group can bind its live
|
|
409
|
+
// match indicator to value changes inside it
|
|
410
|
+
const typeContainer = jml('div', {class: 'typeContainer'});
|
|
411
|
+
|
|
412
|
+
const selectEl = /** @type {HTMLSelectElement} */ (jml('select', {
|
|
156
413
|
hidden: requireObject || typeOptions.length === 1,
|
|
157
414
|
class: `typeChoices-${typeNamespace}${keySelectClass
|
|
158
415
|
? ' ' + keySelectClass
|
|
@@ -161,14 +418,18 @@ export const buildTypeChoices = ({
|
|
|
161
418
|
// is: 'type-choices',
|
|
162
419
|
$custom: {
|
|
163
420
|
$getValue,
|
|
164
|
-
/**
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
421
|
+
/**
|
|
422
|
+
* @this {TypeChoicesElementAPI}
|
|
423
|
+
* @param {Parameters<SetType>[0]} cfg
|
|
424
|
+
*/
|
|
425
|
+
$setType (cfg) {
|
|
426
|
+
const {
|
|
427
|
+
type, baseValue, bringIntoFocus, avoidReport, specificSchema
|
|
428
|
+
} = cfg;
|
|
168
429
|
if (schemaObjs && specificSchema) {
|
|
169
|
-
const idx = schemaObjs.
|
|
170
|
-
return
|
|
171
|
-
})
|
|
430
|
+
const idx = schemaObjs.findIndex((obj) => {
|
|
431
|
+
return deepEqual(obj, specificSchema);
|
|
432
|
+
});
|
|
172
433
|
if (idx === -1) {
|
|
173
434
|
this.value = type;
|
|
174
435
|
} else {
|
|
@@ -181,16 +442,15 @@ export const buildTypeChoices = ({
|
|
|
181
442
|
this.$addAndValidateEditUI({baseValue, bringIntoFocus, avoidReport});
|
|
182
443
|
},
|
|
183
444
|
/**
|
|
184
|
-
* @
|
|
185
|
-
*
|
|
186
|
-
* specificSchema?: import('zodex').SzType
|
|
187
|
-
* }) => void} cfg
|
|
445
|
+
* @this {TypeChoicesElementAPI}
|
|
446
|
+
* @param {Parameters<SetTypeNoEditUI>[0]} cfg
|
|
188
447
|
*/
|
|
189
|
-
$setTypeNoEditUI (
|
|
448
|
+
$setTypeNoEditUI (cfg) {
|
|
449
|
+
const {type, specificSchema} = cfg;
|
|
190
450
|
if (schemaObjs && specificSchema) {
|
|
191
|
-
const idx = schemaObjs.
|
|
192
|
-
return
|
|
193
|
-
})
|
|
451
|
+
const idx = schemaObjs.findIndex((obj) => {
|
|
452
|
+
return deepEqual(obj, specificSchema);
|
|
453
|
+
});
|
|
194
454
|
this.selectedIndex = idx + 1;
|
|
195
455
|
} else {
|
|
196
456
|
this.value = type;
|
|
@@ -198,22 +458,32 @@ export const buildTypeChoices = ({
|
|
|
198
458
|
this.$setStyles();
|
|
199
459
|
},
|
|
200
460
|
|
|
201
|
-
/**
|
|
461
|
+
/**
|
|
462
|
+
* @this {TypeChoicesElementAPI}
|
|
463
|
+
* @type {SetStyles}
|
|
464
|
+
*/
|
|
202
465
|
$setStyles () {
|
|
203
466
|
const {value: type} = this;
|
|
204
467
|
this.dataset.type = type; // Used for styling
|
|
205
468
|
let ancestorEl = this.parentElement;
|
|
469
|
+
if (!ancestorEl) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
206
472
|
if (ancestorEl.nodeName.toLowerCase() !== 'fieldset') {
|
|
207
473
|
// Grandparent check added for optional items placeholder
|
|
208
|
-
ancestorEl =
|
|
474
|
+
ancestorEl = ancestorEl.parentElement;
|
|
209
475
|
}
|
|
210
|
-
if (ancestorEl
|
|
476
|
+
if (ancestorEl?.nodeName.toLowerCase() === 'fieldset') {
|
|
211
477
|
ancestorEl.dataset.type = type;
|
|
212
478
|
DOM.filterChildElements(ancestorEl, 'legend').forEach((legend) => {
|
|
213
479
|
legend.dataset.type = type;
|
|
214
480
|
});
|
|
215
481
|
}
|
|
216
482
|
},
|
|
483
|
+
/**
|
|
484
|
+
* @this {TypeChoicesElementAPI}
|
|
485
|
+
* @type {GetTypeRoot}
|
|
486
|
+
*/
|
|
217
487
|
$getTypeRoot () {
|
|
218
488
|
const container = this.$getContainer();
|
|
219
489
|
/* istanbul ignore if -- How to replicate? */
|
|
@@ -223,11 +493,16 @@ export const buildTypeChoices = ({
|
|
|
223
493
|
return $e(container, 'div[data-type]');
|
|
224
494
|
},
|
|
225
495
|
|
|
226
|
-
/**
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
496
|
+
/**
|
|
497
|
+
* @this {TypeChoicesElementAPI}
|
|
498
|
+
* @param {Parameters<AddAndValidateEditUI>[0]} [cfg]
|
|
499
|
+
*/
|
|
500
|
+
$addAndValidateEditUI (
|
|
501
|
+
/* istanbul ignore next -- Backup */ cfg = {}
|
|
502
|
+
) {
|
|
503
|
+
const {
|
|
504
|
+
baseValue, bringIntoFocus, schemaObject, avoidReport
|
|
505
|
+
} = cfg;
|
|
231
506
|
const {value: type} = this;
|
|
232
507
|
|
|
233
508
|
if (!type) {
|
|
@@ -242,7 +517,7 @@ export const buildTypeChoices = ({
|
|
|
242
517
|
editUI = types.getUIForModeAndType({
|
|
243
518
|
readonly: false,
|
|
244
519
|
typeNamespace,
|
|
245
|
-
type,
|
|
520
|
+
type: /** @type {import('./types.js').AvailableArbitraryType} */ (type),
|
|
246
521
|
bringIntoFocus,
|
|
247
522
|
hasValue: type === 'arrayNonindexKeys' && baseValue,
|
|
248
523
|
value: baseValue,
|
|
@@ -250,8 +525,10 @@ export const buildTypeChoices = ({
|
|
|
250
525
|
format,
|
|
251
526
|
topRoot,
|
|
252
527
|
schemaContent: schemaOriginal ??
|
|
253
|
-
(
|
|
254
|
-
?
|
|
528
|
+
(schemaIdx !== undefined && isUnionLike(schemaContent?.type)
|
|
529
|
+
? /** @type {import('zodexy').SzUnion} */ (
|
|
530
|
+
schemaContent
|
|
531
|
+
).options[schemaIdx]
|
|
255
532
|
: schemaContent),
|
|
256
533
|
// Added `schemaContent` as inner arrays were not getting their
|
|
257
534
|
// schema info; this apparently allows (actually requires)
|
|
@@ -263,11 +540,12 @@ export const buildTypeChoices = ({
|
|
|
263
540
|
// Avoid JSON references by using this by default (or only?)
|
|
264
541
|
(schemaObjs?.[sel.selectedIndex - 1]) ??
|
|
265
542
|
|
|
266
|
-
// eslint-disable-next-line @stylistic/max-len -- Long
|
|
267
543
|
/* istanbul ignore next -- Can probably remove as `schemaObjs` will be set */
|
|
268
|
-
(
|
|
544
|
+
(schemaIdx !== undefined && isUnionLike(schemaContent?.type)
|
|
269
545
|
/* istanbul ignore next -- Can probably remove */
|
|
270
|
-
?
|
|
546
|
+
? /** @type {import('zodexy').SzUnion} */ (
|
|
547
|
+
schemaContent
|
|
548
|
+
).options[schemaIdx]
|
|
271
549
|
// This is probably just `undefined` by here
|
|
272
550
|
: schemaContent),
|
|
273
551
|
schemaFallingBack: Boolean(!schemaObject && schemaContent)
|
|
@@ -281,15 +559,21 @@ export const buildTypeChoices = ({
|
|
|
281
559
|
types.validateAllReferences({topRoot});
|
|
282
560
|
},
|
|
283
561
|
|
|
284
|
-
/**
|
|
285
|
-
|
|
562
|
+
/**
|
|
563
|
+
* @this {TypeChoicesElementAPI}
|
|
564
|
+
* @param {Parameters<AddTypeAndEditUI>[0]} cfg
|
|
565
|
+
*/
|
|
566
|
+
$addTypeAndEditUI (cfg) {
|
|
567
|
+
const {type, editUI, specificSchema} = cfg;
|
|
286
568
|
this.$setTypeNoEditUI({type, specificSchema});
|
|
287
569
|
this.$addEditUI({editUI});
|
|
288
570
|
},
|
|
289
571
|
/**
|
|
290
|
-
* @
|
|
572
|
+
* @this {TypeChoicesElementAPI}
|
|
573
|
+
* @param {Parameters<AddEditUI>[0]} cfg
|
|
291
574
|
*/
|
|
292
|
-
$addEditUI (
|
|
575
|
+
$addEditUI (cfg) {
|
|
576
|
+
const {editUI} = cfg;
|
|
293
577
|
const container = this.$getContainer();
|
|
294
578
|
DOM.removeChildren(container);
|
|
295
579
|
jml(editUI, container);
|
|
@@ -297,22 +581,28 @@ export const buildTypeChoices = ({
|
|
|
297
581
|
$getContainer () {
|
|
298
582
|
return this.nextElementSibling;
|
|
299
583
|
},
|
|
584
|
+
/**
|
|
585
|
+
* @this {TypeChoicesElementAPI}
|
|
586
|
+
*/
|
|
300
587
|
$getTopRoot () {
|
|
301
588
|
return topRoot || this.$getTypeRoot();
|
|
302
589
|
},
|
|
303
590
|
/**
|
|
304
|
-
* @
|
|
305
|
-
* @
|
|
591
|
+
* @this {TypeChoicesElementAPI}
|
|
592
|
+
* @param {Parameters<Validate>[0]} [cfg]
|
|
306
593
|
*/
|
|
307
|
-
$validate (
|
|
594
|
+
$validate (cfg = {}) {
|
|
595
|
+
const {avoidReport} = cfg;
|
|
308
596
|
const {value: type} = this;
|
|
309
597
|
const container = this.$getContainer();
|
|
310
598
|
if (!container.firstElementChild) {
|
|
311
599
|
return false;
|
|
312
600
|
}
|
|
313
|
-
const editUI = container.firstElementChild;
|
|
601
|
+
const editUI = /** @type {HTMLDivElement} */ (container.firstElementChild);
|
|
314
602
|
return types.validate({
|
|
315
|
-
type
|
|
603
|
+
type: /** @type {import('./types.js').AvailableArbitraryType} */ (type),
|
|
604
|
+
root: editUI,
|
|
605
|
+
topRoot: this.$getTopRoot(),
|
|
316
606
|
avoidReport
|
|
317
607
|
});
|
|
318
608
|
}
|
|
@@ -336,7 +626,6 @@ export const buildTypeChoices = ({
|
|
|
336
626
|
'(Choose a type)'
|
|
337
627
|
]],
|
|
338
628
|
|
|
339
|
-
// @ts-expect-error Apparent TS bug
|
|
340
629
|
...typeOptions.map(
|
|
341
630
|
([optText, optAtts], idx) => {
|
|
342
631
|
return [
|
|
@@ -350,13 +639,42 @@ export const buildTypeChoices = ({
|
|
|
350
639
|
}
|
|
351
640
|
)
|
|
352
641
|
]));
|
|
353
|
-
|
|
642
|
+
|
|
643
|
+
// `xor` (exclusive union): exactly one branch may match. Present it as a
|
|
644
|
+
// labelled radio group ("choose exactly one of these") rather than the
|
|
645
|
+
// flat type pull-down; the layout conveys the rule without the reader
|
|
646
|
+
// needing to know the term. The element still exposes the
|
|
647
|
+
// `<select>`-shaped surface (`value`, `selectedIndex`, `selectedOptions`,
|
|
648
|
+
// the `$`-methods) that the rest of the type machinery reads.
|
|
649
|
+
const useXorTypeChoices = Boolean(
|
|
650
|
+
schemaObjs && !requireObject && typeOptions.length > 1 &&
|
|
651
|
+
(schemaContent?.type === 'xor' || schemaOriginal?.type === 'xor')
|
|
652
|
+
);
|
|
653
|
+
|
|
654
|
+
const sel = useXorTypeChoices
|
|
655
|
+
? buildXorTypeChoices({
|
|
656
|
+
typeNamespace, keySelectClass, typeOptions, types, typeContainer,
|
|
657
|
+
schemaObjs: /** @type {import('zodexy').SzType[]} */ (schemaObjs),
|
|
658
|
+
xorSchema: /** @type {import('zodexy').SzUnion} */ (
|
|
659
|
+
schemaContent?.type === 'xor' ? schemaContent : schemaOriginal
|
|
660
|
+
),
|
|
661
|
+
selectEl
|
|
662
|
+
})
|
|
663
|
+
: selectEl;
|
|
664
|
+
|
|
665
|
+
if (autoTrigger && !setValue && typeOptions.length === 1) {
|
|
354
666
|
setTimeout(() => {
|
|
667
|
+
if (!sel.isConnected) {
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
355
670
|
sel.selectedIndex = 1;
|
|
356
671
|
sel.dispatchEvent(new Event('change'));
|
|
357
|
-
});
|
|
672
|
+
}, 0);
|
|
358
673
|
} else if (setValue || (requireObject && !objectHasValue)) {
|
|
359
674
|
setTimeout(async () => {
|
|
675
|
+
if (!sel.isConnected) {
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
360
678
|
if (!setValue) { // if (requireObject && !objectHasValue) {
|
|
361
679
|
// Todo (low): We could auto-populate keypath if has
|
|
362
680
|
// keypath (and we probably also only want if
|
|
@@ -384,11 +702,11 @@ export const buildTypeChoices = ({
|
|
|
384
702
|
Types.getTypeForRoot(/** @type {HTMLDivElement} */ (
|
|
385
703
|
rootEditUI
|
|
386
704
|
));
|
|
387
|
-
// eslint-disable-next-line @stylistic/max-len -- Long
|
|
388
705
|
/** @type {HTMLSelectElement & {$addTypeAndEditUI: AddTypeAndEditUI}} */ (
|
|
389
706
|
sel
|
|
390
707
|
).$addTypeAndEditUI({
|
|
391
|
-
type,
|
|
708
|
+
type,
|
|
709
|
+
editUI: rootEditUI,
|
|
392
710
|
// We do actually want the first one
|
|
393
711
|
specificSchema: specificSchemas?.[0]
|
|
394
712
|
});
|
|
@@ -401,11 +719,9 @@ export const buildTypeChoices = ({
|
|
|
401
719
|
/* istanbul ignore next -- How to trigger? */
|
|
402
720
|
console.log('err', err);
|
|
403
721
|
}
|
|
404
|
-
});
|
|
722
|
+
}, 0);
|
|
405
723
|
}
|
|
406
724
|
|
|
407
|
-
const typeContainer = jml('div', {class: 'typeContainer'});
|
|
408
|
-
|
|
409
725
|
return {
|
|
410
726
|
domArray: [
|
|
411
727
|
sel,
|
|
@@ -425,9 +741,13 @@ export const buildTypeChoices = ({
|
|
|
425
741
|
|
|
426
742
|
/** @type {ValidValuesSet} */
|
|
427
743
|
validValuesSet () {
|
|
428
|
-
const root = /** @type {HTMLDivElement} */ (
|
|
744
|
+
const root = /** @type {HTMLDivElement|null} */ (
|
|
429
745
|
$e(typeContainer, 'div[data-type]')
|
|
430
746
|
);
|
|
747
|
+
if (!root) {
|
|
748
|
+
// No type/branch chosen yet: nothing valid has been set
|
|
749
|
+
return false;
|
|
750
|
+
}
|
|
431
751
|
const form = /** @type {HTMLFormElement} */ (root.closest('form'));
|
|
432
752
|
return Types.validValuesSet({form, typeNamespace});
|
|
433
753
|
},
|