ima2-gen 3.19.0 → 3.20.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/docs/migration/runtime-test-inventory.md +2 -1
- package/lib/oauthLauncher.js +10 -5
- package/node_modules/zod/README.md +2 -2
- package/node_modules/zod/compile.cjs +19 -0
- package/node_modules/zod/index.cjs +19 -0
- package/node_modules/zod/locales/index.cjs +19 -0
- package/node_modules/zod/mini/index.cjs +19 -0
- package/node_modules/zod/package.json +8 -7
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
- package/node_modules/zod/src/v4/classic/external.ts +2 -0
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +248 -25
- package/node_modules/zod/src/v4/classic/schemas.ts +243 -168
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +60 -9
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +6 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +265 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +112 -6
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +9 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +130 -1
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +157 -0
- package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +40 -2
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +27 -7
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +88 -56
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +39 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +56 -0
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +3 -2
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
- package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +46 -1
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +95 -1
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +33 -1
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +234 -38
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +569 -0
- package/node_modules/zod/src/v4/core/api.ts +44 -28
- package/node_modules/zod/src/v4/core/checks.ts +62 -102
- package/node_modules/zod/src/v4/core/compile.ts +218 -93
- package/node_modules/zod/src/v4/core/core.ts +1 -3
- package/node_modules/zod/src/v4/core/doc.ts +6 -2
- package/node_modules/zod/src/v4/core/errors.ts +3 -6
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +2 -2
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +185 -81
- package/node_modules/zod/src/v4/core/memoizer.ts +75 -28
- package/node_modules/zod/src/v4/core/parse.ts +37 -16
- package/node_modules/zod/src/v4/core/regexes.ts +14 -4
- package/node_modules/zod/src/v4/core/schemas.ts +296 -132
- package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +35 -0
- package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +399 -2
- package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
- package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +118 -16
- package/node_modules/zod/src/v4/core/to-json-schema.ts +9 -7
- package/node_modules/zod/src/v4/core/util.ts +218 -147
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/locales/ar.ts +2 -0
- package/node_modules/zod/src/v4/locales/az.ts +2 -0
- package/node_modules/zod/src/v4/locales/be.ts +2 -0
- package/node_modules/zod/src/v4/locales/bg.ts +2 -0
- package/node_modules/zod/src/v4/locales/bn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ca.ts +2 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +2 -0
- package/node_modules/zod/src/v4/locales/cs.ts +2 -0
- package/node_modules/zod/src/v4/locales/da.ts +2 -0
- package/node_modules/zod/src/v4/locales/de.ts +2 -0
- package/node_modules/zod/src/v4/locales/el.ts +2 -0
- package/node_modules/zod/src/v4/locales/en.ts +2 -0
- package/node_modules/zod/src/v4/locales/eo.ts +2 -0
- package/node_modules/zod/src/v4/locales/es.ts +2 -0
- package/node_modules/zod/src/v4/locales/fa.ts +2 -0
- package/node_modules/zod/src/v4/locales/fi.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr.ts +2 -0
- package/node_modules/zod/src/v4/locales/gu.ts +2 -0
- package/node_modules/zod/src/v4/locales/he.ts +2 -0
- package/node_modules/zod/src/v4/locales/hi.ts +2 -0
- package/node_modules/zod/src/v4/locales/hr.ts +2 -0
- package/node_modules/zod/src/v4/locales/hu.ts +2 -0
- package/node_modules/zod/src/v4/locales/hy.ts +2 -0
- package/node_modules/zod/src/v4/locales/id.ts +2 -0
- package/node_modules/zod/src/v4/locales/index.ts +1 -0
- package/node_modules/zod/src/v4/locales/is.ts +2 -0
- package/node_modules/zod/src/v4/locales/it.ts +2 -0
- package/node_modules/zod/src/v4/locales/ja.ts +2 -0
- package/node_modules/zod/src/v4/locales/ka.ts +2 -0
- package/node_modules/zod/src/v4/locales/km.ts +2 -0
- package/node_modules/zod/src/v4/locales/kn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ko.ts +2 -0
- package/node_modules/zod/src/v4/locales/lt.ts +2 -0
- package/node_modules/zod/src/v4/locales/mk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ms.ts +2 -0
- package/node_modules/zod/src/v4/locales/ne.ts +2 -0
- package/node_modules/zod/src/v4/locales/nl.ts +2 -0
- package/node_modules/zod/src/v4/locales/nn.ts +2 -0
- package/node_modules/zod/src/v4/locales/no.ts +2 -0
- package/node_modules/zod/src/v4/locales/ota.ts +2 -0
- package/node_modules/zod/src/v4/locales/pl.ts +2 -0
- package/node_modules/zod/src/v4/locales/ps.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt.ts +2 -0
- package/node_modules/zod/src/v4/locales/ro.ts +2 -0
- package/node_modules/zod/src/v4/locales/ru.ts +2 -0
- package/node_modules/zod/src/v4/locales/sk.ts +2 -0
- package/node_modules/zod/src/v4/locales/sl.ts +2 -0
- package/node_modules/zod/src/v4/locales/sv.ts +2 -0
- package/node_modules/zod/src/v4/locales/ta.ts +2 -0
- package/node_modules/zod/src/v4/locales/tg.ts +135 -0
- package/node_modules/zod/src/v4/locales/th.ts +2 -0
- package/node_modules/zod/src/v4/locales/tk.ts +2 -0
- package/node_modules/zod/src/v4/locales/tr.ts +2 -0
- package/node_modules/zod/src/v4/locales/uk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ur.ts +2 -0
- package/node_modules/zod/src/v4/locales/uz.ts +2 -0
- package/node_modules/zod/src/v4/locales/vi.ts +2 -0
- package/node_modules/zod/src/v4/locales/yo.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +2 -0
- package/node_modules/zod/src/v4/mini/external.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +32 -7
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +1 -1
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +86 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +23 -0
- package/node_modules/zod/v3/ZodError.cjs +19 -0
- package/node_modules/zod/v3/errors.cjs +19 -0
- package/node_modules/zod/v3/external.cjs +19 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
- package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
- package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
- package/node_modules/zod/v3/helpers/util.cjs +19 -0
- package/node_modules/zod/v3/index.cjs +19 -0
- package/node_modules/zod/v3/standard-schema.cjs +19 -0
- package/node_modules/zod/v3/types.cjs +19 -0
- package/node_modules/zod/v4/classic/checks.cjs +19 -0
- package/node_modules/zod/v4/classic/coerce.cjs +19 -0
- package/node_modules/zod/v4/classic/compat.cjs +19 -0
- package/node_modules/zod/v4/classic/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/classic/errors.cjs +19 -0
- package/node_modules/zod/v4/classic/external.cjs +22 -1
- package/node_modules/zod/v4/classic/external.d.cts +1 -1
- package/node_modules/zod/v4/classic/external.d.ts +1 -1
- package/node_modules/zod/v4/classic/external.js +1 -1
- package/node_modules/zod/v4/classic/from-json-schema.cjs +264 -24
- package/node_modules/zod/v4/classic/from-json-schema.js +245 -24
- package/node_modules/zod/v4/classic/in-out.cjs +19 -0
- package/node_modules/zod/v4/classic/index.cjs +19 -0
- package/node_modules/zod/v4/classic/iso.cjs +19 -0
- package/node_modules/zod/v4/classic/parse.cjs +19 -0
- package/node_modules/zod/v4/classic/schemas.cjs +100 -35
- package/node_modules/zod/v4/classic/schemas.d.cts +15 -1
- package/node_modules/zod/v4/classic/schemas.d.ts +15 -1
- package/node_modules/zod/v4/classic/schemas.js +77 -33
- package/node_modules/zod/v4/core/api.cjs +45 -22
- package/node_modules/zod/v4/core/api.d.cts +12 -6
- package/node_modules/zod/v4/core/api.d.ts +12 -6
- package/node_modules/zod/v4/core/api.js +25 -22
- package/node_modules/zod/v4/core/checks.cjs +51 -97
- package/node_modules/zod/v4/core/checks.d.cts +17 -1
- package/node_modules/zod/v4/core/checks.d.ts +17 -1
- package/node_modules/zod/v4/core/checks.js +31 -96
- package/node_modules/zod/v4/core/compile.cjs +173 -78
- package/node_modules/zod/v4/core/compile.d.cts +18 -4
- package/node_modules/zod/v4/core/compile.d.ts +18 -4
- package/node_modules/zod/v4/core/compile.js +154 -79
- package/node_modules/zod/v4/core/core.cjs +20 -1
- package/node_modules/zod/v4/core/core.js +1 -1
- package/node_modules/zod/v4/core/doc.cjs +26 -2
- package/node_modules/zod/v4/core/doc.js +7 -2
- package/node_modules/zod/v4/core/errors.cjs +21 -5
- package/node_modules/zod/v4/core/errors.js +2 -5
- package/node_modules/zod/v4/core/index.cjs +19 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +20 -1
- package/node_modules/zod/v4/core/json-schema-generator.js +2 -2
- package/node_modules/zod/v4/core/json-schema-processors.cjs +188 -72
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +170 -74
- package/node_modules/zod/v4/core/json-schema.cjs +19 -0
- package/node_modules/zod/v4/core/memoizer.cjs +111 -23
- package/node_modules/zod/v4/core/memoizer.js +69 -23
- package/node_modules/zod/v4/core/parse.cjs +56 -16
- package/node_modules/zod/v4/core/parse.js +37 -16
- package/node_modules/zod/v4/core/regexes.cjs +31 -6
- package/node_modules/zod/v4/core/regexes.d.cts +3 -0
- package/node_modules/zod/v4/core/regexes.d.ts +3 -0
- package/node_modules/zod/v4/core/regexes.js +10 -4
- package/node_modules/zod/v4/core/registries.cjs +19 -0
- package/node_modules/zod/v4/core/schemas.cjs +302 -114
- package/node_modules/zod/v4/core/schemas.d.cts +28 -8
- package/node_modules/zod/v4/core/schemas.d.ts +28 -8
- package/node_modules/zod/v4/core/schemas.js +279 -113
- package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +28 -7
- package/node_modules/zod/v4/core/to-json-schema.d.cts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.d.ts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.js +7 -6
- package/node_modules/zod/v4/core/util.cjs +177 -143
- package/node_modules/zod/v4/core/util.d.cts +25 -4
- package/node_modules/zod/v4/core/util.d.ts +25 -4
- package/node_modules/zod/v4/core/util.js +156 -143
- package/node_modules/zod/v4/core/versions.cjs +21 -2
- package/node_modules/zod/v4/core/versions.d.cts +1 -1
- package/node_modules/zod/v4/core/versions.d.ts +1 -1
- package/node_modules/zod/v4/core/versions.js +2 -2
- package/node_modules/zod/v4/core/visit.cjs +19 -0
- package/node_modules/zod/v4/index.cjs +19 -0
- package/node_modules/zod/v4/locales/ar.cjs +2 -0
- package/node_modules/zod/v4/locales/ar.js +2 -0
- package/node_modules/zod/v4/locales/az.cjs +2 -0
- package/node_modules/zod/v4/locales/az.js +2 -0
- package/node_modules/zod/v4/locales/be.cjs +2 -0
- package/node_modules/zod/v4/locales/be.js +2 -0
- package/node_modules/zod/v4/locales/bg.cjs +2 -0
- package/node_modules/zod/v4/locales/bg.js +2 -0
- package/node_modules/zod/v4/locales/bn.cjs +2 -0
- package/node_modules/zod/v4/locales/bn.js +2 -0
- package/node_modules/zod/v4/locales/ca.cjs +2 -0
- package/node_modules/zod/v4/locales/ca.js +2 -0
- package/node_modules/zod/v4/locales/ckb.cjs +2 -0
- package/node_modules/zod/v4/locales/ckb.js +2 -0
- package/node_modules/zod/v4/locales/cs.cjs +2 -0
- package/node_modules/zod/v4/locales/cs.js +2 -0
- package/node_modules/zod/v4/locales/da.cjs +2 -0
- package/node_modules/zod/v4/locales/da.js +2 -0
- package/node_modules/zod/v4/locales/de.cjs +2 -0
- package/node_modules/zod/v4/locales/de.js +2 -0
- package/node_modules/zod/v4/locales/el.cjs +2 -0
- package/node_modules/zod/v4/locales/el.js +2 -0
- package/node_modules/zod/v4/locales/en.cjs +2 -0
- package/node_modules/zod/v4/locales/en.js +2 -0
- package/node_modules/zod/v4/locales/eo.cjs +2 -0
- package/node_modules/zod/v4/locales/eo.js +2 -0
- package/node_modules/zod/v4/locales/es.cjs +2 -0
- package/node_modules/zod/v4/locales/es.js +2 -0
- package/node_modules/zod/v4/locales/fa.cjs +2 -0
- package/node_modules/zod/v4/locales/fa.js +2 -0
- package/node_modules/zod/v4/locales/fi.cjs +2 -0
- package/node_modules/zod/v4/locales/fi.js +2 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +2 -0
- package/node_modules/zod/v4/locales/fr-CA.js +2 -0
- package/node_modules/zod/v4/locales/fr.cjs +2 -0
- package/node_modules/zod/v4/locales/fr.js +2 -0
- package/node_modules/zod/v4/locales/gu.cjs +2 -0
- package/node_modules/zod/v4/locales/gu.js +2 -0
- package/node_modules/zod/v4/locales/he.cjs +2 -0
- package/node_modules/zod/v4/locales/he.js +2 -0
- package/node_modules/zod/v4/locales/hi.cjs +2 -0
- package/node_modules/zod/v4/locales/hi.js +2 -0
- package/node_modules/zod/v4/locales/hr.cjs +2 -0
- package/node_modules/zod/v4/locales/hr.js +2 -0
- package/node_modules/zod/v4/locales/hu.cjs +2 -0
- package/node_modules/zod/v4/locales/hu.js +2 -0
- package/node_modules/zod/v4/locales/hy.cjs +2 -0
- package/node_modules/zod/v4/locales/hy.js +2 -0
- package/node_modules/zod/v4/locales/id.cjs +2 -0
- package/node_modules/zod/v4/locales/id.js +2 -0
- package/node_modules/zod/v4/locales/index.cjs +22 -1
- package/node_modules/zod/v4/locales/index.d.cts +1 -0
- package/node_modules/zod/v4/locales/index.d.ts +1 -0
- package/node_modules/zod/v4/locales/index.js +1 -0
- package/node_modules/zod/v4/locales/is.cjs +2 -0
- package/node_modules/zod/v4/locales/is.js +2 -0
- package/node_modules/zod/v4/locales/it.cjs +2 -0
- package/node_modules/zod/v4/locales/it.js +2 -0
- package/node_modules/zod/v4/locales/ja.cjs +2 -0
- package/node_modules/zod/v4/locales/ja.js +2 -0
- package/node_modules/zod/v4/locales/ka.cjs +2 -0
- package/node_modules/zod/v4/locales/ka.js +2 -0
- package/node_modules/zod/v4/locales/km.cjs +2 -0
- package/node_modules/zod/v4/locales/km.js +2 -0
- package/node_modules/zod/v4/locales/kn.cjs +2 -0
- package/node_modules/zod/v4/locales/kn.js +2 -0
- package/node_modules/zod/v4/locales/ko.cjs +2 -0
- package/node_modules/zod/v4/locales/ko.js +2 -0
- package/node_modules/zod/v4/locales/lt.cjs +2 -0
- package/node_modules/zod/v4/locales/lt.js +2 -0
- package/node_modules/zod/v4/locales/mk.cjs +2 -0
- package/node_modules/zod/v4/locales/mk.js +2 -0
- package/node_modules/zod/v4/locales/ms.cjs +2 -0
- package/node_modules/zod/v4/locales/ms.js +2 -0
- package/node_modules/zod/v4/locales/ne.cjs +2 -0
- package/node_modules/zod/v4/locales/ne.js +2 -0
- package/node_modules/zod/v4/locales/nl.cjs +2 -0
- package/node_modules/zod/v4/locales/nl.js +2 -0
- package/node_modules/zod/v4/locales/nn.cjs +2 -0
- package/node_modules/zod/v4/locales/nn.js +2 -0
- package/node_modules/zod/v4/locales/no.cjs +2 -0
- package/node_modules/zod/v4/locales/no.js +2 -0
- package/node_modules/zod/v4/locales/ota.cjs +2 -0
- package/node_modules/zod/v4/locales/ota.js +2 -0
- package/node_modules/zod/v4/locales/pl.cjs +2 -0
- package/node_modules/zod/v4/locales/pl.js +2 -0
- package/node_modules/zod/v4/locales/ps.cjs +2 -0
- package/node_modules/zod/v4/locales/ps.js +2 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +2 -0
- package/node_modules/zod/v4/locales/pt-BR.js +2 -0
- package/node_modules/zod/v4/locales/pt.cjs +2 -0
- package/node_modules/zod/v4/locales/pt.js +2 -0
- package/node_modules/zod/v4/locales/ro.cjs +2 -0
- package/node_modules/zod/v4/locales/ro.js +2 -0
- package/node_modules/zod/v4/locales/ru.cjs +2 -0
- package/node_modules/zod/v4/locales/ru.js +2 -0
- package/node_modules/zod/v4/locales/sk.cjs +2 -0
- package/node_modules/zod/v4/locales/sk.js +2 -0
- package/node_modules/zod/v4/locales/sl.cjs +2 -0
- package/node_modules/zod/v4/locales/sl.js +2 -0
- package/node_modules/zod/v4/locales/sv.cjs +2 -0
- package/node_modules/zod/v4/locales/sv.js +2 -0
- package/node_modules/zod/v4/locales/ta.cjs +2 -0
- package/node_modules/zod/v4/locales/ta.js +2 -0
- package/node_modules/zod/v4/locales/tg.cjs +144 -0
- package/node_modules/zod/v4/locales/tg.d.cts +5 -0
- package/node_modules/zod/v4/locales/tg.d.ts +4 -0
- package/node_modules/zod/v4/locales/tg.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +2 -0
- package/node_modules/zod/v4/locales/th.js +2 -0
- package/node_modules/zod/v4/locales/tk.cjs +2 -0
- package/node_modules/zod/v4/locales/tk.js +2 -0
- package/node_modules/zod/v4/locales/tr.cjs +2 -0
- package/node_modules/zod/v4/locales/tr.js +2 -0
- package/node_modules/zod/v4/locales/uk.cjs +2 -0
- package/node_modules/zod/v4/locales/uk.js +2 -0
- package/node_modules/zod/v4/locales/ur.cjs +2 -0
- package/node_modules/zod/v4/locales/ur.js +2 -0
- package/node_modules/zod/v4/locales/uz.cjs +2 -0
- package/node_modules/zod/v4/locales/uz.js +2 -0
- package/node_modules/zod/v4/locales/vi.cjs +2 -0
- package/node_modules/zod/v4/locales/vi.js +2 -0
- package/node_modules/zod/v4/locales/yo.cjs +2 -0
- package/node_modules/zod/v4/locales/yo.js +2 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-CN.js +2 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-TW.js +2 -0
- package/node_modules/zod/v4/mini/checks.cjs +19 -0
- package/node_modules/zod/v4/mini/coerce.cjs +19 -0
- package/node_modules/zod/v4/mini/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/mini/external.cjs +22 -1
- package/node_modules/zod/v4/mini/external.d.cts +1 -1
- package/node_modules/zod/v4/mini/external.d.ts +1 -1
- package/node_modules/zod/v4/mini/external.js +1 -1
- package/node_modules/zod/v4/mini/in-out.cjs +19 -0
- package/node_modules/zod/v4/mini/index.cjs +19 -0
- package/node_modules/zod/v4/mini/iso.cjs +19 -0
- package/node_modules/zod/v4/mini/parse.cjs +19 -0
- package/node_modules/zod/v4/mini/schemas.cjs +44 -8
- package/node_modules/zod/v4/mini/schemas.d.cts +6 -1
- package/node_modules/zod/v4/mini/schemas.d.ts +6 -1
- package/node_modules/zod/v4/mini/schemas.js +21 -6
- package/node_modules/zod/v4-mini/index.cjs +19 -0
- package/package.json +6 -6
- package/routes/health.js +10 -1
- package/ui/dist/.vite/manifest.json +64 -64
- package/ui/dist/assets/{AgentWorkspace-C6ke6Eo4.js → AgentWorkspace-CENfXAob.js} +1 -1
- package/ui/dist/assets/{App-pMN1OjNW.js → App-B9y6oVuL.js} +8 -8
- package/ui/dist/assets/{AssetGenWorkspace-DzEfpUy_.js → AssetGenWorkspace-fL2MjYj9.js} +2 -2
- package/ui/dist/assets/{AssetMediaLightbox-Bx0azN0S.js → AssetMediaLightbox-Be4arnGs.js} +1 -1
- package/ui/dist/assets/{AssetsWorkspace-CHw1u9VC.js → AssetsWorkspace-7z4wyfp0.js} +1 -1
- package/ui/dist/assets/{CardNewsWorkspace-DsjqhaYO.js → CardNewsWorkspace-DSldDpsl.js} +1 -1
- package/ui/dist/assets/{GenerationRequestLogPanel-EYEiHIr9.js → GenerationRequestLogPanel-CcQKi89f.js} +1 -1
- package/ui/dist/assets/{HomeWorkspace-DbnY1YF2.js → HomeWorkspace-BZDk2X1U.js} +1 -1
- package/ui/dist/assets/{KeyingPanel-8J_RMrxg.js → KeyingPanel-snhXKnA3.js} +1 -1
- package/ui/dist/assets/{NodeCanvas-DmjbNcTa.js → NodeCanvas-CJQXsS0r.js} +1 -1
- package/ui/dist/assets/{PromptBuilderPanel-CL34Jpso.js → PromptBuilderPanel-B-YP1ph5.js} +1 -1
- package/ui/dist/assets/{PromptImportDialog-B24cvEkK.js → PromptImportDialog-ssPMxE4j.js} +2 -2
- package/ui/dist/assets/{PromptImportDiscoverySection-Bbw1_J_3.js → PromptImportDiscoverySection-CvOgGTOs.js} +1 -1
- package/ui/dist/assets/{PromptImportFolderSection-CMpxuE8e.js → PromptImportFolderSection-CxR9qxbi.js} +1 -1
- package/ui/dist/assets/{PromptLibraryPanel-Ct98TJ61.js → PromptLibraryPanel-DjYgbXes.js} +2 -2
- package/ui/dist/assets/{SettingsWorkspace-DL9Tm90P.js → SettingsWorkspace-BtruYb6g.js} +1 -1
- package/ui/dist/assets/{SpriteRecipeWorkspace-BJUH1ddP.js → SpriteRecipeWorkspace-DBrYOYOK.js} +1 -1
- package/ui/dist/assets/{index-D_LpLGWV.js → index-CWFgCqE1.js} +3 -3
- package/ui/dist/assets/{index-CHeVGnoy.js → index-va83o9G5.js} +12 -12
- package/ui/dist/assets/{pptxgen.es-s4xfPXLT.js → pptxgen.es-D-kntoLD.js} +1 -1
- package/ui/dist/assets/{promptBuilderStore-DQR29LwN.js → promptBuilderStore-BdGPLEra.js} +1 -1
- package/ui/dist/assets/useAgentDialogFocus-BDdVl-nq.js +1 -0
- package/ui/dist/index.html +1 -1
- package/ui/dist/assets/useAgentDialogFocus-DAeS9IWG.js +0 -1
|
@@ -1308,3 +1308,160 @@ test("__proto__ annotation key reaches the registry", () => {
|
|
|
1308
1308
|
expect(Object.prototype.hasOwnProperty.call(meta, "__proto__")).toBe(true);
|
|
1309
1309
|
expect(meta.__proto__).toEqual({ custom: 1 });
|
|
1310
1310
|
});
|
|
1311
|
+
|
|
1312
|
+
test("minProperties and maxProperties count the raw input", () => {
|
|
1313
|
+
const schema = fromJSONSchema({
|
|
1314
|
+
type: "object",
|
|
1315
|
+
properties: { a: { type: "string" } },
|
|
1316
|
+
minProperties: 1,
|
|
1317
|
+
maxProperties: 2,
|
|
1318
|
+
});
|
|
1319
|
+
expect(schema.safeParse({ a: "x" }).success).toBe(true);
|
|
1320
|
+
expect(schema.safeParse({}).error!.issues[0]).toMatchObject({ code: "too_small", origin: "object", minimum: 1 });
|
|
1321
|
+
expect(schema.safeParse({ a: "x", b: 1, c: 2 }).error!.issues[0]).toMatchObject({
|
|
1322
|
+
code: "too_big",
|
|
1323
|
+
origin: "object",
|
|
1324
|
+
maximum: 2,
|
|
1325
|
+
});
|
|
1326
|
+
// raw input: a defaulted property does not satisfy the minimum, and a dropped __proto__ still counts
|
|
1327
|
+
const defaulted = fromJSONSchema({
|
|
1328
|
+
type: "object",
|
|
1329
|
+
properties: { a: { type: "string", default: "x" } },
|
|
1330
|
+
minProperties: 1,
|
|
1331
|
+
});
|
|
1332
|
+
expect(defaulted.safeParse({}).success).toBe(false);
|
|
1333
|
+
const capped = fromJSONSchema({ type: "object", maxProperties: 1 });
|
|
1334
|
+
expect(capped.safeParse(JSON.parse('{"__proto__":1,"a":1}')).success).toBe(false);
|
|
1335
|
+
expect(z.toJSONSchema(schema)).toMatchObject({ minProperties: 1, maxProperties: 2 });
|
|
1336
|
+
});
|
|
1337
|
+
|
|
1338
|
+
test("minProperties composes with propertyNames in one guard", () => {
|
|
1339
|
+
const schema = fromJSONSchema({ type: "object", propertyNames: { pattern: "^a" }, minProperties: 1 });
|
|
1340
|
+
expect(schema.safeParse({}).error!.issues[0]!.code).toBe("too_small");
|
|
1341
|
+
expect(schema.safeParse({ b: 1 }).error!.issues[0]!.code).toBe("invalid_key");
|
|
1342
|
+
expect(schema.safeParse({ a: 1 }).success).toBe(true);
|
|
1343
|
+
});
|
|
1344
|
+
|
|
1345
|
+
test("uniqueItems rejects structural duplicates", () => {
|
|
1346
|
+
const schema = fromJSONSchema({ type: "array", uniqueItems: true });
|
|
1347
|
+
expect(
|
|
1348
|
+
schema.safeParse([
|
|
1349
|
+
{ a: 1, b: 2 },
|
|
1350
|
+
{ b: 2, a: 1 },
|
|
1351
|
+
]).error!.issues[0]
|
|
1352
|
+
).toMatchObject({
|
|
1353
|
+
code: "custom",
|
|
1354
|
+
path: [1],
|
|
1355
|
+
});
|
|
1356
|
+
expect(schema.safeParse([1, "1", true, 1]).success).toBe(false);
|
|
1357
|
+
expect(schema.safeParse([{ a: 1 }, { a: 2 }, [1], [2]]).success).toBe(true);
|
|
1358
|
+
expect(z.toJSONSchema(schema)).toMatchObject({ uniqueItems: true });
|
|
1359
|
+
});
|
|
1360
|
+
|
|
1361
|
+
test("contains with minContains and maxContains", () => {
|
|
1362
|
+
const schema = fromJSONSchema({ type: "array", contains: { type: "integer" } });
|
|
1363
|
+
expect(schema.safeParse(["a"]).success).toBe(false);
|
|
1364
|
+
expect(schema.safeParse(["a", 1]).success).toBe(true);
|
|
1365
|
+
const bounded = fromJSONSchema({ type: "array", contains: { type: "integer" }, minContains: 2, maxContains: 3 });
|
|
1366
|
+
expect(bounded.safeParse([1, "a"]).success).toBe(false);
|
|
1367
|
+
expect(bounded.safeParse([1, 2, "a"]).success).toBe(true);
|
|
1368
|
+
expect(bounded.safeParse([1, 2, 3, 4]).success).toBe(false);
|
|
1369
|
+
// minContains: 0 accepts an array with no matches at all
|
|
1370
|
+
expect(fromJSONSchema({ type: "array", contains: { type: "integer" }, minContains: 0 }).safeParse([]).success).toBe(
|
|
1371
|
+
true
|
|
1372
|
+
);
|
|
1373
|
+
expect(z.toJSONSchema(bounded)).toMatchObject({ contains: { type: "integer" }, minContains: 2, maxContains: 3 });
|
|
1374
|
+
});
|
|
1375
|
+
|
|
1376
|
+
test("uniqueItems and contains see the raw instance, not the parsed output", () => {
|
|
1377
|
+
const items = { type: "object", properties: { a: { type: "string", default: "x" } } } as const;
|
|
1378
|
+
// no instance item carries `a`; the default must not synthesize the match
|
|
1379
|
+
const contains = fromJSONSchema({
|
|
1380
|
+
type: "array",
|
|
1381
|
+
items,
|
|
1382
|
+
contains: { type: "object", properties: { a: { const: "x" } }, required: ["a"] },
|
|
1383
|
+
});
|
|
1384
|
+
expect(contains.safeParse([{}]).success).toBe(false);
|
|
1385
|
+
expect(contains.safeParse([{ a: "x" }]).success).toBe(true);
|
|
1386
|
+
// the instance items differ; the default must not collapse them into duplicates
|
|
1387
|
+
const unique = fromJSONSchema({ type: "array", items, uniqueItems: true });
|
|
1388
|
+
expect(unique.safeParse([{ a: "x" }, {}]).success).toBe(true);
|
|
1389
|
+
expect(unique.safeParse([{}, {}]).error!.issues[0]).toMatchObject({ code: "custom", path: [1] });
|
|
1390
|
+
});
|
|
1391
|
+
|
|
1392
|
+
test("a guard keyword takes precedence over the length keywords", () => {
|
|
1393
|
+
const schema = fromJSONSchema({ type: "array", items: { type: "integer" }, minItems: 3, uniqueItems: true });
|
|
1394
|
+
// the guard runs on the input side of the pipe, so its issue aborts before minItems is reached
|
|
1395
|
+
expect(schema.safeParse([1, 1]).error!.issues.map((i) => i.code)).toEqual(["custom"]);
|
|
1396
|
+
expect(schema.safeParse([1, 2]).error!.issues.map((i) => i.code)).toEqual(["too_small"]);
|
|
1397
|
+
});
|
|
1398
|
+
|
|
1399
|
+
test("a guard keyword drops default and examples from the input-mode document", () => {
|
|
1400
|
+
// the guard is a transform on the pipe's input side, and toJSONSchema strips annotations from a transforming schema in input mode
|
|
1401
|
+
const schema = fromJSONSchema({ type: "array", uniqueItems: true, default: [], examples: [[1]] });
|
|
1402
|
+
expect(z.toJSONSchema(schema, { io: "input" })).not.toHaveProperty("default");
|
|
1403
|
+
expect(z.toJSONSchema(schema, { io: "output" })).toMatchObject({ default: [], examples: [[1]] });
|
|
1404
|
+
// without a guard keyword both modes carry them
|
|
1405
|
+
const plain = fromJSONSchema({ type: "array", default: [], examples: [[1]] });
|
|
1406
|
+
expect(z.toJSONSchema(plain, { io: "input" })).toMatchObject({ default: [], examples: [[1]] });
|
|
1407
|
+
});
|
|
1408
|
+
|
|
1409
|
+
test("uniqueItems equality follows JSON semantics", () => {
|
|
1410
|
+
const schema = fromJSONSchema({ type: "array", uniqueItems: true });
|
|
1411
|
+
expect(schema.safeParse([1, "1", true, null]).success).toBe(true);
|
|
1412
|
+
expect(schema.safeParse([{ a: undefined }, {}]).success).toBe(true);
|
|
1413
|
+
expect(
|
|
1414
|
+
schema.safeParse([
|
|
1415
|
+
[1, [2]],
|
|
1416
|
+
[1, [2]],
|
|
1417
|
+
]).success
|
|
1418
|
+
).toBe(false);
|
|
1419
|
+
expect(schema.safeParse([{ a: "b=c" }, { "a=b": "c" }]).success).toBe(true);
|
|
1420
|
+
// every duplicate is reported against the first element it matches
|
|
1421
|
+
expect(schema.safeParse([1, 1, 1]).error!.issues.map((i) => i.path[0])).toEqual([1, 2]);
|
|
1422
|
+
// a cycle cannot be compared, so it is never called a duplicate rather than hanging
|
|
1423
|
+
const cyclic: any = {};
|
|
1424
|
+
cyclic.self = cyclic;
|
|
1425
|
+
expect(schema.safeParse([cyclic, cyclic]).success).toBe(true);
|
|
1426
|
+
});
|
|
1427
|
+
|
|
1428
|
+
test("a carried subschema that references $defs is dropped rather than emitted dangling", () => {
|
|
1429
|
+
const schema = fromJSONSchema({
|
|
1430
|
+
type: "array",
|
|
1431
|
+
contains: { $ref: "#/$defs/Hit" },
|
|
1432
|
+
$defs: { Hit: { type: "object", properties: { id: { type: "string" } }, required: ["id"] } },
|
|
1433
|
+
});
|
|
1434
|
+
// enforcement is unaffected; only the round trip gives the keyword up
|
|
1435
|
+
expect(schema.safeParse([{ id: "a" }]).success).toBe(true);
|
|
1436
|
+
expect(schema.safeParse([{}]).success).toBe(false);
|
|
1437
|
+
expect(JSON.stringify(z.toJSONSchema(schema))).not.toContain("$ref");
|
|
1438
|
+
expect(z.toJSONSchema(schema)).not.toHaveProperty("contains");
|
|
1439
|
+
// an inline subschema is self-contained, so it still round-trips
|
|
1440
|
+
const inline = fromJSONSchema({ type: "array", contains: { type: "integer" } });
|
|
1441
|
+
expect(z.toJSONSchema(inline)).toMatchObject({ contains: { type: "integer" } });
|
|
1442
|
+
// only schema positions are walked, so a `$ref` key in instance data or an unknown annotation still travels
|
|
1443
|
+
for (const annotation of [{ default: { $ref: "literal" } }, { "x-note": { $ref: "literal" } }]) {
|
|
1444
|
+
const annotated = fromJSONSchema({ type: "array", contains: { type: "integer", ...annotation } });
|
|
1445
|
+
expect(annotated.safeParse(["x"]).success).toBe(false);
|
|
1446
|
+
expect(z.toJSONSchema(annotated)).toMatchObject({ contains: { type: "integer" } });
|
|
1447
|
+
}
|
|
1448
|
+
// draft-7 `dependencies` is a schema map; its array form names properties and holds no reference
|
|
1449
|
+
const dependent = fromJSONSchema({
|
|
1450
|
+
type: "array",
|
|
1451
|
+
contains: { type: "object", dependencies: { a: { $ref: "#/definitions/Hit" } } },
|
|
1452
|
+
definitions: { Hit: { type: "object" } },
|
|
1453
|
+
});
|
|
1454
|
+
expect(z.toJSONSchema(dependent)).not.toHaveProperty("contains");
|
|
1455
|
+
const named = fromJSONSchema({
|
|
1456
|
+
type: "array",
|
|
1457
|
+
contains: { type: "object", dependencies: { a: ["b"] } },
|
|
1458
|
+
});
|
|
1459
|
+
expect(z.toJSONSchema(named)).toMatchObject({ contains: { dependencies: { a: ["b"] } } });
|
|
1460
|
+
// a reference nested in a schema position is still caught
|
|
1461
|
+
const nested = fromJSONSchema({
|
|
1462
|
+
type: "array",
|
|
1463
|
+
contains: { type: "array", items: { $ref: "#/$defs/Hit" } },
|
|
1464
|
+
$defs: { Hit: { type: "string" } },
|
|
1465
|
+
});
|
|
1466
|
+
expect(z.toJSONSchema(nested)).not.toHaveProperty("contains");
|
|
1467
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
|
|
4
|
+
describe("z.iban", () => {
|
|
5
|
+
const valid: [string, string][] = [
|
|
6
|
+
["Norway (15, minimum)", "NO9386011117947"],
|
|
7
|
+
["Belgium (16)", "BE68539007547034"],
|
|
8
|
+
["Netherlands (18)", "NL91ABNA0417164300"],
|
|
9
|
+
["Germany (22)", "DE89370400440532013000"],
|
|
10
|
+
["Great Britain (22)", "GB29NWBK60161331926819"],
|
|
11
|
+
["Turkey (26)", "TR610000100000000000000001"],
|
|
12
|
+
["France (27)", "FR1420041010050500013M02606"],
|
|
13
|
+
["Cyprus (28)", "CY17002001280000001200527600"],
|
|
14
|
+
["Malta (31)", "MT84MALT011000012345MTLCAST001S"],
|
|
15
|
+
["Maximum length (34)", "AA73AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"],
|
|
16
|
+
["Maximum length mixed (34)", "ZZ560123456789ABCDEFGHIJKLMNOPQRST"],
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
test.each(valid)("accepts %s", (_label, n) => {
|
|
20
|
+
expect(z.iban().parse(n)).toBe(n);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("rejects lowercase characters", () => {
|
|
24
|
+
expect(() => z.iban().parse("no9386011117947")).toThrow();
|
|
25
|
+
expect(() => z.iban().parse("de89370400440532013000")).toThrow();
|
|
26
|
+
expect(() => z.iban().parse("FR1420041010050500013m02606")).toThrow();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("rejects spaces and hyphens", () => {
|
|
30
|
+
expect(() => z.iban().parse("NO93 8601 1117 947")).toThrow();
|
|
31
|
+
expect(() => z.iban().parse(" DE89370400440532013000")).toThrow();
|
|
32
|
+
expect(() => z.iban().parse("DE89370400440532013000 ")).toThrow();
|
|
33
|
+
expect(() => z.iban().parse("NO93-8601-1117-947")).toThrow();
|
|
34
|
+
expect(() => z.iban().parse("DE89-3704-0044-0532-0130-00")).toThrow();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("rejects special characters", () => {
|
|
38
|
+
expect(() => z.iban().parse("NO938601111794!")).toThrow();
|
|
39
|
+
expect(() => z.iban().parse("DE8937040044053201300@")).toThrow();
|
|
40
|
+
expect(() => z.iban().parse("")).toThrow();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("rejects inputs outside length bounds (15-34)", () => {
|
|
44
|
+
expect(() => z.iban().parse("NO938601111794")).toThrow();
|
|
45
|
+
expect(() => z.iban().parse("AA73AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")).toThrow();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("rejects invalid check digits (checksum failure)", () => {
|
|
49
|
+
expect(() => z.iban().parse("NO9386011117948")).toThrow();
|
|
50
|
+
expect(() => z.iban().parse("DE89370400440532013001")).toThrow();
|
|
51
|
+
expect(() => z.iban().parse("FR1420041010050500013M02607")).toThrow();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("rejects check digits outside 02-98", () => {
|
|
55
|
+
// mod 97 alone accepts all three; `98 - remainder` can only ever emit 02-98
|
|
56
|
+
expect(() => z.iban().parse("DE00000000000000000066")).toThrow();
|
|
57
|
+
expect(() => z.iban().parse("DE01000000000000000048")).toThrow();
|
|
58
|
+
expect(() => z.iban().parse("DE99000000000000000030")).toThrow();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("carries the shape regex as its JSON Schema pattern", () => {
|
|
62
|
+
expect(z.toJSONSchema(z.iban())).toMatchObject({
|
|
63
|
+
format: "iban",
|
|
64
|
+
pattern: z.regexes.iban.source,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("round-trips through JSON Schema with the checksum intact", () => {
|
|
69
|
+
const schema = z.fromJSONSchema(z.toJSONSchema(z.iban()));
|
|
70
|
+
expect(schema.safeParse("DE89370400440532013000").success).toBe(true);
|
|
71
|
+
expect(schema.safeParse("DE89370400440532013001").success).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("error message references IBAN", () => {
|
|
75
|
+
const result = z.iban().safeParse("not-an-iban");
|
|
76
|
+
expect(result.success).toBe(false);
|
|
77
|
+
if (!result.success) {
|
|
78
|
+
expect(result.error.issues[0]?.message).toMatch(/IBAN/i);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -105,6 +105,28 @@ test("deferred initializers are released after construction", () => {
|
|
|
105
105
|
expect(z.object({ a: z.string() })._zod.deferred).toEqual(undefined);
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
+
test("trait initializers run once per instance across repeated entry", () => {
|
|
109
|
+
const calls: string[] = [];
|
|
110
|
+
const Base: core.$constructor<any> = core.$constructor<any>("CountedBase", () => calls.push("base"));
|
|
111
|
+
const Child: core.$constructor<any> = core.$constructor<any>("CountedChild", (inst, def) => {
|
|
112
|
+
calls.push("child");
|
|
113
|
+
Base.init(inst, def);
|
|
114
|
+
Base.init(inst, def);
|
|
115
|
+
});
|
|
116
|
+
const constructed = new Child({});
|
|
117
|
+
Child.init(constructed, {});
|
|
118
|
+
const direct = Object.create({});
|
|
119
|
+
Child.init(direct, {});
|
|
120
|
+
Child.init(direct, {});
|
|
121
|
+
expect(calls).toEqual(["child", "base", "child", "base"]);
|
|
122
|
+
for (const inst of [constructed, direct]) {
|
|
123
|
+
expect([...inst._zod.traits]).toEqual(["CountedChild", "CountedBase"]);
|
|
124
|
+
expect(inst instanceof Base).toBe(true);
|
|
125
|
+
expect(inst instanceof Child).toBe(true);
|
|
126
|
+
}
|
|
127
|
+
expect(constructed._zod.traits).not.toBe(direct._zod.traits);
|
|
128
|
+
});
|
|
129
|
+
|
|
108
130
|
test("a trait initializer called directly still installs its members", () => {
|
|
109
131
|
// a direct `init` installs onto the receiver's own prototype, since it is not below the constructor's
|
|
110
132
|
z.string();
|
|
@@ -152,10 +174,16 @@ test("a live member keeps the descriptor a prototype member had", () => {
|
|
|
152
174
|
const proto = Object.getPrototypeOf(z.string());
|
|
153
175
|
expect(Object.getOwnPropertyDescriptor(proto, "description")?.enumerable).toBe(false);
|
|
154
176
|
expect(Object.getOwnPropertyDescriptor(proto, "_def")?.enumerable).toBe(false);
|
|
177
|
+
// a derived member installs like a literal's accessor: not enumerable, still configurable
|
|
178
|
+
expect(Object.getOwnPropertyDescriptor(proto, "minLength")).toMatchObject({ enumerable: false, configurable: true });
|
|
155
179
|
|
|
180
|
+
// the derived metadata members live on the prototype and shadow as own data on first read
|
|
181
|
+
const schema = z.string();
|
|
156
182
|
const keys: string[] = [];
|
|
157
|
-
for (const k in
|
|
158
|
-
expect(keys).toEqual(["def", "type"
|
|
183
|
+
for (const k in schema) keys.push(k);
|
|
184
|
+
expect(keys).toEqual(["def", "type"]);
|
|
185
|
+
expect(schema.minLength).toBe(null);
|
|
186
|
+
expect(Object.keys(schema)).toContain("minLength");
|
|
159
187
|
});
|
|
160
188
|
|
|
161
189
|
test("a live member is not cached per instance", () => {
|
|
@@ -221,6 +249,16 @@ test("a hand-written getter member accepts assignment", () => {
|
|
|
221
249
|
const mini: any = zm.string();
|
|
222
250
|
mini.with = () => "WITH";
|
|
223
251
|
expect(mini.with()).toBe("WITH");
|
|
252
|
+
|
|
253
|
+
// a derived metadata member accepts assignment before its first read, as it did as an own property
|
|
254
|
+
const derived = z.number().min(2);
|
|
255
|
+
derived.minValue = 99;
|
|
256
|
+
expect(derived.minValue).toBe(99);
|
|
257
|
+
expect(Object.keys(derived)).toContain("minValue");
|
|
258
|
+
|
|
259
|
+
// and, like every prototype member, recomputes after deletion rather than staying absent
|
|
260
|
+
delete (derived as any).minValue;
|
|
261
|
+
expect(derived.minValue).toBe(2);
|
|
224
262
|
});
|
|
225
263
|
|
|
226
264
|
test("shape is lazy and stays out of Object.keys", () => {
|
|
@@ -62,7 +62,7 @@ test("instanceof respects customError", () => {
|
|
|
62
62
|
test("z.properties", () => {
|
|
63
63
|
const httpsUrl = z.instanceof(URL).check(
|
|
64
64
|
...z.properties({
|
|
65
|
-
protocol: z.literal("https:"
|
|
65
|
+
protocol: z.literal("https:"),
|
|
66
66
|
hostname: z.string().regex(z.regexes.domain),
|
|
67
67
|
})
|
|
68
68
|
);
|
|
@@ -70,9 +70,9 @@ test("z.properties", () => {
|
|
|
70
70
|
expectTypeOf<URL>().toEqualTypeOf<z.infer<typeof httpsUrl>>();
|
|
71
71
|
expect(httpsUrl.safeParse(new URL("https://example.com")).success).toBe(true);
|
|
72
72
|
|
|
73
|
-
//
|
|
73
|
+
// One check iterates the whole shape, so every failing property reports — unlike the equivalent chain of z.property() calls, which aborts on the first.
|
|
74
74
|
const both = httpsUrl.safeParse(new URL("http://localhost"));
|
|
75
|
-
expect(both.error!.issues.map((i) => i.path)).toEqual([["protocol"]]);
|
|
75
|
+
expect(both.error!.issues.map((i) => i.path)).toEqual([["protocol"], ["hostname"]]);
|
|
76
76
|
|
|
77
77
|
// A failing base schema yields its own issue and no property issues.
|
|
78
78
|
for (const input of ["not a url", null]) {
|
|
@@ -85,12 +85,12 @@ test("z.properties", () => {
|
|
|
85
85
|
.object({ a: z.string(), b: z.string() })
|
|
86
86
|
.check(...z.properties({ a: z.literal("x"), b: z.literal("y") }));
|
|
87
87
|
expect(obj.safeParse({ a: "x", b: "y" }).success).toBe(true);
|
|
88
|
-
expect(obj.safeParse({ a: "!", b: "!" }).error!.issues.map((i) => i.path)).toEqual([["a"]]);
|
|
88
|
+
expect(obj.safeParse({ a: "!", b: "!" }).error!.issues.map((i) => i.path)).toEqual([["a"], ["b"]]);
|
|
89
89
|
for (const input of [null, undefined, 5]) {
|
|
90
90
|
expect(obj.safeParse(input).error!.issues.map((i) => [i.code, i.path])).toEqual([["invalid_type", []]]);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
// Known looseness versus the longhand, pinned so it stays deliberate:
|
|
93
|
+
// Known looseness versus the longhand, pinned so it stays deliberate: the check is typed over the whole shape, and `$ZodCheckInternals.check()` is a method, so TypeScript compares it bivariantly and accepts a check type that is a subtype of the target. Naming a key the target lacks therefore compiles here and fails at parse time, where the equivalent chain of `z.property()` calls rejects it outright.
|
|
94
94
|
z.object({ a: z.string() }).check(...z.properties({ a: z.literal("x"), b: z.literal("y") }));
|
|
95
95
|
expect(
|
|
96
96
|
z
|
|
@@ -100,8 +100,28 @@ test("z.properties", () => {
|
|
|
100
100
|
.error!.issues.map((i) => [i.code, i.path])
|
|
101
101
|
).toEqual([["invalid_value", ["b"]]]);
|
|
102
102
|
|
|
103
|
-
//
|
|
103
|
+
// literal and enum inputs widen to their primitive, so a `string`/`boolean` property accepts them without a cast, while a genuine type mismatch or an unknown key still fails to compile
|
|
104
|
+
z.instanceof(URL).check(z.property("protocol", z.literal("https:")));
|
|
105
|
+
z.instanceof(Request).check(...z.properties({ method: z.enum(["POST", "PUT"]), bodyUsed: z.literal(false) }));
|
|
106
|
+
// @ts-expect-error length is a number
|
|
107
|
+
z.string().check(z.property("length", z.string()));
|
|
108
|
+
// @ts-expect-error no such key
|
|
109
|
+
z.instanceof(URL).check(z.property("nope", z.string()));
|
|
110
|
+
|
|
111
|
+
// the check feeds the property value into its schema, so it is typed over the input side rather than the output
|
|
112
|
+
const stringToLength = z.property(
|
|
113
|
+
"a",
|
|
114
|
+
z.string().transform((s) => s.length)
|
|
115
|
+
);
|
|
116
|
+
z.object({ a: z.string() }).check(stringToLength);
|
|
117
|
+
// @ts-expect-error a is a number, the schema takes a string
|
|
118
|
+
z.object({ a: z.number() }).check(stringToLength);
|
|
119
|
+
|
|
120
|
+
// The properties check carries no `when`, so the schema stays on the compiled fast path.
|
|
104
121
|
const compiled = z.compile(httpsUrl);
|
|
105
122
|
expect(compiled.safeParse(new URL("https://example.com")).success).toBe(true);
|
|
106
|
-
expect(compiled.safeParse(new URL("http://localhost")).error!.issues.map((i) => i.path)).toEqual([
|
|
123
|
+
expect(compiled.safeParse(new URL("http://localhost")).error!.issues.map((i) => i.path)).toEqual([
|
|
124
|
+
["protocol"],
|
|
125
|
+
["hostname"],
|
|
126
|
+
]);
|
|
107
127
|
});
|
|
@@ -5,6 +5,9 @@ afterEach(() => {
|
|
|
5
5
|
z.config({ customError: undefined });
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
+
/** Error maps run on the first read of `error`, so a test that only observes them reads it. */
|
|
9
|
+
const fail = (r: { error?: unknown }) => r.error;
|
|
10
|
+
|
|
8
11
|
/** Collects the owning schema's registered metadata for every issue an error map sees. */
|
|
9
12
|
function captureMeta(): { seen: (z.core.GlobalMeta | undefined)[] } {
|
|
10
13
|
const seen: (z.core.GlobalMeta | undefined)[] = [];
|
|
@@ -20,11 +23,11 @@ function captureMeta(): { seen: (z.core.GlobalMeta | undefined)[] } {
|
|
|
20
23
|
test("check-originated issues expose the owning schema", () => {
|
|
21
24
|
const { seen } = captureMeta();
|
|
22
25
|
|
|
23
|
-
z.object({ name: z.string().min(5).meta({ title: "Name" }) }).safeParse({ name: "ab" });
|
|
24
|
-
z.string().max(2).meta({ title: "Max" }).safeParse("abc");
|
|
25
|
-
z.email().meta({ title: "Email" }).safeParse("nope");
|
|
26
|
-
z.number().multipleOf(3).meta({ title: "Multiple" }).safeParse(4);
|
|
27
|
-
z.array(z.string()).min(2).meta({ title: "Array" }).safeParse([]);
|
|
26
|
+
fail(z.object({ name: z.string().min(5).meta({ title: "Name" }) }).safeParse({ name: "ab" }));
|
|
27
|
+
fail(z.string().max(2).meta({ title: "Max" }).safeParse("abc"));
|
|
28
|
+
fail(z.email().meta({ title: "Email" }).safeParse("nope"));
|
|
29
|
+
fail(z.number().multipleOf(3).meta({ title: "Multiple" }).safeParse(4));
|
|
30
|
+
fail(z.array(z.string()).min(2).meta({ title: "Array" }).safeParse([]));
|
|
28
31
|
|
|
29
32
|
expect(seen).toEqual([
|
|
30
33
|
{ title: "Name" },
|
|
@@ -38,8 +41,8 @@ test("check-originated issues expose the owning schema", () => {
|
|
|
38
41
|
test("schema-originated issues expose the owning schema", () => {
|
|
39
42
|
const { seen } = captureMeta();
|
|
40
43
|
|
|
41
|
-
z.object({ name: z.string().min(5).meta({ title: "Name" }) }).safeParse({ name: 123 });
|
|
42
|
-
z.email().meta({ title: "Email" }).safeParse(123);
|
|
44
|
+
fail(z.object({ name: z.string().min(5).meta({ title: "Name" }) }).safeParse({ name: 123 }));
|
|
45
|
+
fail(z.email().meta({ title: "Email" }).safeParse(123));
|
|
43
46
|
|
|
44
47
|
expect(seen).toEqual([{ title: "Name" }, { title: "Email" }]);
|
|
45
48
|
});
|
|
@@ -47,14 +50,20 @@ test("schema-originated issues expose the owning schema", () => {
|
|
|
47
50
|
test("refinements attribute to the refined schema, not the internal check schema", () => {
|
|
48
51
|
const { seen } = captureMeta();
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
fail(
|
|
54
|
+
z
|
|
55
|
+
.string()
|
|
56
|
+
.refine(() => false)
|
|
57
|
+
.meta({ title: "Refine" })
|
|
58
|
+
.safeParse("abc")
|
|
59
|
+
);
|
|
60
|
+
fail(
|
|
61
|
+
z
|
|
62
|
+
.string()
|
|
63
|
+
.superRefine((_, ctx) => ctx.addIssue({ code: "custom", message: "" }))
|
|
64
|
+
.meta({ title: "SuperRefine" })
|
|
65
|
+
.safeParse("abc")
|
|
66
|
+
);
|
|
58
67
|
|
|
59
68
|
expect(seen).toEqual([{ title: "Refine" }, { title: "SuperRefine" }]);
|
|
60
69
|
});
|
|
@@ -62,17 +71,26 @@ test("refinements attribute to the refined schema, not the internal check schema
|
|
|
62
71
|
test("the innermost schema owns the issue", () => {
|
|
63
72
|
const { seen } = captureMeta();
|
|
64
73
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
fail(
|
|
75
|
+
z
|
|
76
|
+
.array(z.string().min(5).meta({ title: "Element" }))
|
|
77
|
+
.meta({ title: "Array" })
|
|
78
|
+
.safeParse(["ab"])
|
|
79
|
+
);
|
|
80
|
+
fail(
|
|
81
|
+
z
|
|
82
|
+
.string()
|
|
83
|
+
.pipe(z.string().min(5).meta({ title: "Target" }))
|
|
84
|
+
.meta({ title: "Pipe" })
|
|
85
|
+
.safeParse("ab")
|
|
86
|
+
);
|
|
87
|
+
fail(
|
|
88
|
+
z
|
|
89
|
+
.looseObject({})
|
|
90
|
+
.check(z.property("a", z.string().meta({ title: "Property" })))
|
|
91
|
+
.meta({ title: "Object" })
|
|
92
|
+
.safeParse({ a: 1 })
|
|
93
|
+
);
|
|
76
94
|
|
|
77
95
|
expect(seen).toEqual([{ title: "Element" }, { title: "Target" }, { title: "Property" }]);
|
|
78
96
|
});
|
|
@@ -81,12 +99,15 @@ test("issues carrying no usable `inst` still get the owning schema", () => {
|
|
|
81
99
|
const { seen } = captureMeta();
|
|
82
100
|
|
|
83
101
|
// A hand-pushed issue may carry no inst at all, and ctx.addIssue(string) puts the check's def — not a Zod object — on inst.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
102
|
+
fail(
|
|
103
|
+
z
|
|
104
|
+
.string()
|
|
105
|
+
.check((payload) => {
|
|
106
|
+
payload.issues.push({ code: "custom", input: payload.value });
|
|
107
|
+
})
|
|
108
|
+
.meta({ title: "Bare" })
|
|
109
|
+
.safeParse("abc")
|
|
110
|
+
);
|
|
90
111
|
const shorthand = z
|
|
91
112
|
.string()
|
|
92
113
|
.superRefine((_, ctx) => ctx.addIssue("bad stuff"))
|
|
@@ -100,11 +121,13 @@ test("issues carrying no usable `inst` still get the owning schema", () => {
|
|
|
100
121
|
test("async checks expose the owning schema", async () => {
|
|
101
122
|
const { seen } = captureMeta();
|
|
102
123
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
fail(
|
|
125
|
+
await z
|
|
126
|
+
.string()
|
|
127
|
+
.refine(async () => false)
|
|
128
|
+
.meta({ title: "Async" })
|
|
129
|
+
.safeParseAsync("abc")
|
|
130
|
+
);
|
|
108
131
|
|
|
109
132
|
expect(seen).toEqual([{ title: "Async" }]);
|
|
110
133
|
});
|
|
@@ -120,7 +143,7 @@ test("the owning schema is the clone `.meta()` registered, not the pre-metadata
|
|
|
120
143
|
},
|
|
121
144
|
});
|
|
122
145
|
|
|
123
|
-
labeled.safeParse("ab");
|
|
146
|
+
fail(labeled.safeParse("ab"));
|
|
124
147
|
|
|
125
148
|
expect(seen).toEqual([true]);
|
|
126
149
|
});
|
|
@@ -134,12 +157,12 @@ test("`inst` keeps its meaning and `schema` stays off the finalized issue", () =
|
|
|
134
157
|
},
|
|
135
158
|
});
|
|
136
159
|
|
|
137
|
-
const tooSmall = z.string().min(5).safeParse("ab")
|
|
138
|
-
const wrongType = z.string().safeParse(123)
|
|
160
|
+
const tooSmall = z.string().min(5).safeParse("ab").error!;
|
|
161
|
+
const wrongType = z.string().safeParse(123).error!;
|
|
139
162
|
|
|
140
163
|
expect(insts).toEqual(["$ZodCheckMinLength", "ZodString"]);
|
|
141
|
-
expect(Object.keys(tooSmall.
|
|
142
|
-
expect(Object.keys(wrongType.
|
|
164
|
+
expect(Object.keys(tooSmall.issues[0])).not.toContain("schema");
|
|
165
|
+
expect(Object.keys(wrongType.issues[0])).not.toContain("schema");
|
|
143
166
|
});
|
|
144
167
|
|
|
145
168
|
test("every error map kind receives the owning schema", () => {
|
|
@@ -149,28 +172,37 @@ test("every error map kind receives the owning schema", () => {
|
|
|
149
172
|
return undefined;
|
|
150
173
|
};
|
|
151
174
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
175
|
+
fail(
|
|
176
|
+
z
|
|
177
|
+
.string()
|
|
178
|
+
.min(5, { error: capture("check") })
|
|
179
|
+
.meta({ title: "Check" })
|
|
180
|
+
.safeParse("ab")
|
|
181
|
+
);
|
|
156
182
|
|
|
157
183
|
// A schema-bound map is only consulted for issues the schema itself raised, so this one needs a type error.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
184
|
+
fail(
|
|
185
|
+
z
|
|
186
|
+
.string({ error: capture("schema") })
|
|
187
|
+
.meta({ title: "Schema" })
|
|
188
|
+
.safeParse(123)
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
fail(
|
|
192
|
+
z
|
|
193
|
+
.string()
|
|
194
|
+
.min(5)
|
|
195
|
+
.meta({ title: "Parse" })
|
|
196
|
+
.safeParse("ab", { error: capture("parse") })
|
|
197
|
+
);
|
|
166
198
|
|
|
167
199
|
z.config({ customError: capture("customError") });
|
|
168
|
-
z.string().min(5).meta({ title: "Custom" }).safeParse("ab");
|
|
200
|
+
fail(z.string().min(5).meta({ title: "Custom" }).safeParse("ab"));
|
|
169
201
|
|
|
170
202
|
// localeError carries the default English locale, so it is restored rather than cleared.
|
|
171
203
|
const localeError = z.config().localeError;
|
|
172
204
|
z.config({ customError: undefined, localeError: capture("localeError") });
|
|
173
|
-
z.string().min(5).meta({ title: "Locale" }).safeParse("ab");
|
|
205
|
+
fail(z.string().min(5).meta({ title: "Locale" }).safeParse("ab"));
|
|
174
206
|
z.config({ localeError });
|
|
175
207
|
|
|
176
208
|
expect(seen).toEqual({
|
|
@@ -2,6 +2,45 @@ import { expect, expectTypeOf, test } from "vitest";
|
|
|
2
2
|
|
|
3
3
|
import * as z from "zod/v4";
|
|
4
4
|
|
|
5
|
+
test("number factory checks", () => {
|
|
6
|
+
const schema = z.number({ checks: [z.gte(1), z.lte(3)] as const });
|
|
7
|
+
const chained = z.number().min(1).max(3);
|
|
8
|
+
expectTypeOf<z.output<typeof schema>>().toEqualTypeOf<number>();
|
|
9
|
+
for (const value of [0, 1, 3, 4, Number.NaN, "2", undefined]) {
|
|
10
|
+
expect(z.validate(schema, value)).toBe(z.validate(chained, value));
|
|
11
|
+
expect(schema.safeParse(value)).toEqual(chained.safeParse(value));
|
|
12
|
+
}
|
|
13
|
+
expect(z.toJSONSchema(schema)).toEqual(z.toJSONSchema(chained));
|
|
14
|
+
expect(schema.minValue).toBe(1);
|
|
15
|
+
expect(schema.maxValue).toBe(3);
|
|
16
|
+
expect(z.coerce.number({ checks: [z.gte(1)] }).parse("2")).toBe(2);
|
|
17
|
+
const overwritten = z.number({ checks: [z.overwrite<number>((value) => value + 1), z.gte(2)] });
|
|
18
|
+
expect(overwritten.parse(1)).toBe(2);
|
|
19
|
+
expect(z.validate(overwritten, 0)).toBe(false);
|
|
20
|
+
// @ts-expect-error length checks cannot validate numbers
|
|
21
|
+
z.number({ checks: [z.minLength(1)] });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("number factory checks snapshot caller arrays", () => {
|
|
25
|
+
for (const factory of [z.number, z.coerce.number]) {
|
|
26
|
+
const checks = [z.gte(1)];
|
|
27
|
+
const schema = factory({ checks });
|
|
28
|
+
let reads = 0;
|
|
29
|
+
factory({
|
|
30
|
+
get checks() {
|
|
31
|
+
if (++reads > 1) throw new Error("checks read twice");
|
|
32
|
+
return checks;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
expect(reads).toBe(1);
|
|
36
|
+
const before = z.toJSONSchema(schema);
|
|
37
|
+
checks.push(z.gte(10));
|
|
38
|
+
expect(z.validate(schema, 3)).toBe(true);
|
|
39
|
+
expect(z.validate(z.compile(schema), 3)).toBe(true);
|
|
40
|
+
expect(z.toJSONSchema(schema)).toEqual(before);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
5
44
|
test("z.number() basic validation", () => {
|
|
6
45
|
const schema = z.number();
|
|
7
46
|
expect(schema.parse(1234)).toEqual(1234);
|