@openclaw/buzz 2026.9.4 → 2026.9.6
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/assets/activity.svg +3 -0
- package/assets/icon.png +0 -0
- package/dist/{adapter.runtime-CaDdxQ2C.js → .setup/adapter.runtime-FIC9NMFI.mjs} +3 -3
- package/dist/{channel-C6rro-f7.js → .setup/channel-qV8kQiPi.mjs} +203 -105
- package/dist/.setup/directory-config-CzHz6fzo.mjs +43 -0
- package/dist/{room-membership-a8IHfdgL.js → .setup/room-membership-tqLQznFE.mjs} +1 -1
- package/dist/{secret-contract-DNuqbK64.js → .setup/secret-contract-DjibkTDL.mjs} +1 -1
- package/dist/.setup/secret-contract-api-DcFDI-eR.mjs +3 -0
- package/dist/.setup/setup-plugin-api-DI8WfvKQ.mjs +47 -0
- package/dist/.setup/setup-plugin-api-H-XWBzaF.mjs +2 -0
- package/dist/{setup-surface-DDUmAluL.js → .setup/setup-surface-DOHxdPor.mjs} +3 -3
- package/dist/api.js +2 -2
- package/dist/channel-plugin-api.js +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/qa-runner-api.js +1 -1
- package/dist/secret-contract-api.js +1 -1
- package/dist/setup-entry.js +3 -2
- package/dist/setup-plugin-api.js +1 -46
- package/node_modules/nostr-tools/lib/cjs/abstract-pool.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/abstract-pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/abstract-relay.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/abstract-relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/index.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/index.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip46.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/nip46.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/pool.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/relay.js +3 -1
- package/node_modules/nostr-tools/lib/cjs/relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/abstract-pool.js +3 -1
- package/node_modules/nostr-tools/lib/esm/abstract-pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/abstract-relay.js +3 -1
- package/node_modules/nostr-tools/lib/esm/abstract-relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/index.js +3 -1
- package/node_modules/nostr-tools/lib/esm/index.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip46.js +3 -1
- package/node_modules/nostr-tools/lib/esm/nip46.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/pool.js +3 -1
- package/node_modules/nostr-tools/lib/esm/pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/relay.js +3 -1
- package/node_modules/nostr-tools/lib/esm/relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/nostr.bundle.js +3 -1
- package/node_modules/nostr-tools/lib/nostr.bundle.js.map +2 -2
- package/node_modules/nostr-tools/package.json +1 -1
- package/node_modules/zod/README.md +29 -2
- package/node_modules/zod/compile.cjs +96 -0
- package/node_modules/zod/compile.d.cts +1 -0
- package/node_modules/zod/compile.d.ts +1 -0
- package/node_modules/zod/compile.js +52 -0
- package/node_modules/zod/index.cjs +21 -2
- package/node_modules/zod/index.d.cts +1 -2
- package/node_modules/zod/index.d.ts +1 -2
- package/node_modules/zod/index.js +5 -2
- package/node_modules/zod/locales/index.cjs +19 -0
- package/node_modules/zod/mini/index.cjs +19 -0
- package/node_modules/zod/package.json +20 -8
- package/node_modules/zod/src/compile.ts +56 -0
- package/node_modules/zod/src/index.ts +5 -2
- package/node_modules/zod/src/v3/ZodError.ts +22 -12
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
- package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
- package/node_modules/zod/src/v3/tests/object.test.ts +3 -6
- package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
- package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
- package/node_modules/zod/src/v3/types.ts +5 -5
- package/node_modules/zod/src/v4/classic/checks.ts +1 -0
- package/node_modules/zod/src/v4/classic/compat.ts +26 -18
- package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
- package/node_modules/zod/src/v4/classic/errors.ts +59 -44
- package/node_modules/zod/src/v4/classic/external.ts +14 -9
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +363 -78
- package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
- package/node_modules/zod/src/v4/classic/index.ts +2 -2
- package/node_modules/zod/src/v4/classic/iso.ts +2 -72
- package/node_modules/zod/src/v4/classic/parse.ts +10 -4
- package/node_modules/zod/src/v4/classic/schemas.ts +640 -375
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +186 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +278 -0
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +2 -1
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +3 -3
- package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +32 -18
- package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
- package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +46 -0
- package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +31 -7
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +261 -13
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +112 -2
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +582 -10
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +31 -0
- package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +2 -9
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +21 -2
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
- package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +3 -10
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +12 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +85 -9
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +301 -12
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +49 -16
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +51 -4
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +20 -2
- package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +186 -18
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +79 -3
- package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +60 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +9 -0
- 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 +222 -6
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +44 -3
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1812 -204
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +45 -30
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +39 -2
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
- package/node_modules/zod/src/v4/core/api.ts +87 -35
- package/node_modules/zod/src/v4/core/checks.ts +119 -146
- package/node_modules/zod/src/v4/core/compile.ts +2313 -0
- package/node_modules/zod/src/v4/core/core.ts +99 -22
- package/node_modules/zod/src/v4/core/doc.ts +17 -9
- package/node_modules/zod/src/v4/core/errors.ts +113 -25
- package/node_modules/zod/src/v4/core/index.ts +3 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +424 -156
- package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
- package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
- package/node_modules/zod/src/v4/core/parse.ts +164 -50
- package/node_modules/zod/src/v4/core/regexes.ts +42 -15
- package/node_modules/zod/src/v4/core/registries.ts +2 -2
- package/node_modules/zod/src/v4/core/schemas.ts +1000 -538
- 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 +1004 -0
- package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
- package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
- package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
- package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
- package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +1 -2
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
- package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +3 -3
- package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
- package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
- package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +283 -48
- package/node_modules/zod/src/v4/core/util.ts +454 -157
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/core/visit.ts +193 -0
- package/node_modules/zod/src/v4/index.ts +3 -3
- package/node_modules/zod/src/v4/locales/ar.ts +5 -0
- package/node_modules/zod/src/v4/locales/az.ts +5 -0
- package/node_modules/zod/src/v4/locales/be.ts +12 -0
- package/node_modules/zod/src/v4/locales/bg.ts +5 -0
- package/node_modules/zod/src/v4/locales/bn.ts +123 -0
- package/node_modules/zod/src/v4/locales/ca.ts +5 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
- package/node_modules/zod/src/v4/locales/cs.ts +5 -0
- package/node_modules/zod/src/v4/locales/da.ts +7 -2
- package/node_modules/zod/src/v4/locales/de.ts +5 -0
- package/node_modules/zod/src/v4/locales/el.ts +3 -0
- package/node_modules/zod/src/v4/locales/en.ts +17 -4
- package/node_modules/zod/src/v4/locales/eo.ts +5 -0
- package/node_modules/zod/src/v4/locales/es.ts +4 -0
- package/node_modules/zod/src/v4/locales/fa.ts +5 -0
- package/node_modules/zod/src/v4/locales/fi.ts +5 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
- package/node_modules/zod/src/v4/locales/fr.ts +21 -14
- package/node_modules/zod/src/v4/locales/gu.ts +123 -0
- package/node_modules/zod/src/v4/locales/he.ts +8 -1
- package/node_modules/zod/src/v4/locales/hi.ts +126 -0
- package/node_modules/zod/src/v4/locales/hr.ts +4 -0
- package/node_modules/zod/src/v4/locales/hu.ts +5 -0
- package/node_modules/zod/src/v4/locales/hy.ts +11 -0
- package/node_modules/zod/src/v4/locales/id.ts +5 -0
- package/node_modules/zod/src/v4/locales/index.ts +11 -0
- package/node_modules/zod/src/v4/locales/is.ts +5 -0
- package/node_modules/zod/src/v4/locales/it.ts +5 -0
- package/node_modules/zod/src/v4/locales/ja.ts +5 -0
- package/node_modules/zod/src/v4/locales/ka.ts +5 -0
- package/node_modules/zod/src/v4/locales/km.ts +5 -0
- package/node_modules/zod/src/v4/locales/kn.ts +126 -0
- package/node_modules/zod/src/v4/locales/ko.ts +5 -0
- package/node_modules/zod/src/v4/locales/lt.ts +4 -0
- package/node_modules/zod/src/v4/locales/mk.ts +5 -0
- package/node_modules/zod/src/v4/locales/ms.ts +5 -0
- package/node_modules/zod/src/v4/locales/ne.ts +128 -0
- package/node_modules/zod/src/v4/locales/nl.ts +5 -0
- package/node_modules/zod/src/v4/locales/nn.ts +121 -0
- package/node_modules/zod/src/v4/locales/no.ts +7 -2
- package/node_modules/zod/src/v4/locales/ota.ts +5 -0
- package/node_modules/zod/src/v4/locales/pl.ts +5 -0
- package/node_modules/zod/src/v4/locales/ps.ts +5 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
- package/node_modules/zod/src/v4/locales/pt.ts +101 -58
- package/node_modules/zod/src/v4/locales/ro.ts +3 -0
- package/node_modules/zod/src/v4/locales/ru.ts +12 -0
- package/node_modules/zod/src/v4/locales/sk.ts +123 -0
- package/node_modules/zod/src/v4/locales/sl.ts +5 -0
- package/node_modules/zod/src/v4/locales/sv.ts +7 -2
- package/node_modules/zod/src/v4/locales/ta.ts +5 -0
- package/node_modules/zod/src/v4/locales/tg.ts +135 -0
- package/node_modules/zod/src/v4/locales/th.ts +5 -0
- package/node_modules/zod/src/v4/locales/tk.ts +113 -0
- package/node_modules/zod/src/v4/locales/tr.ts +5 -0
- package/node_modules/zod/src/v4/locales/uk.ts +5 -0
- package/node_modules/zod/src/v4/locales/ur.ts +5 -0
- package/node_modules/zod/src/v4/locales/uz.ts +3 -0
- package/node_modules/zod/src/v4/locales/vi.ts +5 -0
- package/node_modules/zod/src/v4/locales/yo.ts +5 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
- package/node_modules/zod/src/v4/mini/checks.ts +1 -0
- package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
- package/node_modules/zod/src/v4/mini/external.ts +12 -1
- package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
- package/node_modules/zod/src/v4/mini/parse.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +167 -63
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +35 -1
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
- package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
- package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +158 -5
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +65 -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 +44 -0
- package/node_modules/zod/v3/ZodError.cjs +41 -12
- package/node_modules/zod/v3/ZodError.d.cts +1 -1
- package/node_modules/zod/v3/ZodError.d.ts +1 -1
- package/node_modules/zod/v3/ZodError.js +22 -12
- 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 +26 -5
- package/node_modules/zod/v3/types.js +7 -5
- package/node_modules/zod/v4/classic/checks.cjs +21 -1
- package/node_modules/zod/v4/classic/checks.d.cts +1 -1
- package/node_modules/zod/v4/classic/checks.d.ts +1 -1
- package/node_modules/zod/v4/classic/checks.js +1 -1
- 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/compat.d.cts +9 -11
- package/node_modules/zod/v4/classic/compat.d.ts +9 -11
- package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
- package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.js +13 -0
- package/node_modules/zod/v4/classic/errors.cjs +62 -34
- package/node_modules/zod/v4/classic/errors.d.cts +3 -4
- package/node_modules/zod/v4/classic/errors.d.ts +3 -4
- package/node_modules/zod/v4/classic/errors.js +43 -34
- package/node_modules/zod/v4/classic/external.cjs +51 -27
- package/node_modules/zod/v4/classic/external.d.cts +5 -2
- package/node_modules/zod/v4/classic/external.d.ts +5 -2
- package/node_modules/zod/v4/classic/external.js +5 -8
- package/node_modules/zod/v4/classic/from-json-schema.cjs +376 -75
- package/node_modules/zod/v4/classic/from-json-schema.js +357 -75
- package/node_modules/zod/v4/classic/in-out.cjs +82 -0
- package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
- package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
- package/node_modules/zod/v4/classic/in-out.js +36 -0
- package/node_modules/zod/v4/classic/index.cjs +21 -2
- package/node_modules/zod/v4/classic/index.d.cts +1 -2
- package/node_modules/zod/v4/classic/index.d.ts +1 -2
- package/node_modules/zod/v4/classic/index.js +2 -2
- package/node_modules/zod/v4/classic/iso.cjs +30 -22
- package/node_modules/zod/v4/classic/iso.d.cts +2 -17
- package/node_modules/zod/v4/classic/iso.d.ts +2 -17
- package/node_modules/zod/v4/classic/iso.js +2 -17
- package/node_modules/zod/v4/classic/parse.cjs +23 -1
- package/node_modules/zod/v4/classic/parse.d.cts +17 -4
- package/node_modules/zod/v4/classic/parse.d.ts +17 -4
- package/node_modules/zod/v4/classic/parse.js +1 -0
- package/node_modules/zod/v4/classic/schemas.cjs +591 -426
- package/node_modules/zod/v4/classic/schemas.d.cts +68 -19
- package/node_modules/zod/v4/classic/schemas.d.ts +68 -19
- package/node_modules/zod/v4/classic/schemas.js +564 -424
- package/node_modules/zod/v4/core/api.cjs +66 -24
- package/node_modules/zod/v4/core/api.d.cts +22 -12
- package/node_modules/zod/v4/core/api.d.ts +22 -12
- package/node_modules/zod/v4/core/api.js +44 -24
- package/node_modules/zod/v4/core/checks.cjs +88 -128
- package/node_modules/zod/v4/core/checks.d.cts +29 -13
- package/node_modules/zod/v4/core/checks.d.ts +29 -13
- package/node_modules/zod/v4/core/checks.js +68 -127
- package/node_modules/zod/v4/core/compile.cjs +1908 -0
- package/node_modules/zod/v4/core/compile.d.cts +65 -0
- package/node_modules/zod/v4/core/compile.d.ts +65 -0
- package/node_modules/zod/v4/core/compile.js +1858 -0
- package/node_modules/zod/v4/core/core.cjs +101 -19
- package/node_modules/zod/v4/core/core.d.cts +16 -4
- package/node_modules/zod/v4/core/core.d.ts +16 -4
- package/node_modules/zod/v4/core/core.js +83 -20
- package/node_modules/zod/v4/core/doc.cjs +31 -9
- package/node_modules/zod/v4/core/doc.d.cts +3 -1
- package/node_modules/zod/v4/core/doc.d.ts +3 -1
- package/node_modules/zod/v4/core/doc.js +12 -9
- package/node_modules/zod/v4/core/errors.cjs +126 -25
- package/node_modules/zod/v4/core/errors.d.cts +4 -0
- package/node_modules/zod/v4/core/errors.d.ts +4 -0
- package/node_modules/zod/v4/core/errors.js +107 -25
- package/node_modules/zod/v4/core/index.cjs +24 -1
- package/node_modules/zod/v4/core/index.d.cts +3 -0
- package/node_modules/zod/v4/core/index.d.ts +3 -0
- package/node_modules/zod/v4/core/index.js +3 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
- package/node_modules/zod/v4/core/json-schema-processors.cjs +441 -156
- 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 +400 -158
- package/node_modules/zod/v4/core/json-schema.cjs +19 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
- package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
- package/node_modules/zod/v4/core/memoizer.cjs +360 -0
- package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
- package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
- package/node_modules/zod/v4/core/memoizer.js +311 -0
- package/node_modules/zod/v4/core/parse.cjs +148 -46
- package/node_modules/zod/v4/core/parse.d.cts +14 -11
- package/node_modules/zod/v4/core/parse.d.ts +14 -11
- package/node_modules/zod/v4/core/parse.js +127 -45
- package/node_modules/zod/v4/core/regexes.cjs +54 -17
- package/node_modules/zod/v4/core/regexes.d.cts +5 -0
- package/node_modules/zod/v4/core/regexes.d.ts +5 -0
- package/node_modules/zod/v4/core/regexes.js +32 -15
- package/node_modules/zod/v4/core/registries.cjs +19 -0
- package/node_modules/zod/v4/core/registries.js +2 -2
- package/node_modules/zod/v4/core/schemas.cjs +785 -386
- package/node_modules/zod/v4/core/schemas.d.cts +123 -34
- package/node_modules/zod/v4/core/schemas.d.ts +123 -34
- package/node_modules/zod/v4/core/schemas.js +753 -386
- package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +269 -45
- package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
- package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
- package/node_modules/zod/v4/core/to-json-schema.js +247 -44
- package/node_modules/zod/v4/core/util.cjs +372 -157
- package/node_modules/zod/v4/core/util.d.cts +79 -1
- package/node_modules/zod/v4/core/util.d.ts +79 -1
- package/node_modules/zod/v4/core/util.js +341 -156
- 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 +214 -0
- package/node_modules/zod/v4/core/visit.d.cts +30 -0
- package/node_modules/zod/v4/core/visit.d.ts +30 -0
- package/node_modules/zod/v4/core/visit.js +169 -0
- package/node_modules/zod/v4/index.cjs +34 -5
- package/node_modules/zod/v4/index.d.cts +2 -2
- package/node_modules/zod/v4/index.d.ts +2 -2
- package/node_modules/zod/v4/index.js +3 -2
- package/node_modules/zod/v4/locales/ar.cjs +5 -0
- package/node_modules/zod/v4/locales/ar.js +5 -0
- package/node_modules/zod/v4/locales/az.cjs +5 -0
- package/node_modules/zod/v4/locales/az.js +5 -0
- package/node_modules/zod/v4/locales/be.cjs +12 -0
- package/node_modules/zod/v4/locales/be.js +12 -0
- package/node_modules/zod/v4/locales/bg.cjs +5 -0
- package/node_modules/zod/v4/locales/bg.js +5 -0
- package/node_modules/zod/v4/locales/bn.cjs +140 -0
- package/node_modules/zod/v4/locales/bn.d.cts +5 -0
- package/node_modules/zod/v4/locales/bn.d.ts +4 -0
- package/node_modules/zod/v4/locales/bn.js +113 -0
- package/node_modules/zod/v4/locales/ca.cjs +5 -0
- package/node_modules/zod/v4/locales/ca.js +5 -0
- package/node_modules/zod/v4/locales/ckb.cjs +160 -0
- package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
- package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
- package/node_modules/zod/v4/locales/ckb.js +133 -0
- package/node_modules/zod/v4/locales/cs.cjs +5 -0
- package/node_modules/zod/v4/locales/cs.js +5 -0
- package/node_modules/zod/v4/locales/da.cjs +7 -2
- package/node_modules/zod/v4/locales/da.js +7 -2
- package/node_modules/zod/v4/locales/de.cjs +5 -0
- package/node_modules/zod/v4/locales/de.js +5 -0
- package/node_modules/zod/v4/locales/el.cjs +3 -0
- package/node_modules/zod/v4/locales/el.js +3 -0
- package/node_modules/zod/v4/locales/en.cjs +16 -4
- package/node_modules/zod/v4/locales/en.js +16 -4
- package/node_modules/zod/v4/locales/eo.cjs +5 -0
- package/node_modules/zod/v4/locales/eo.js +5 -0
- package/node_modules/zod/v4/locales/es.cjs +4 -0
- package/node_modules/zod/v4/locales/es.js +4 -0
- package/node_modules/zod/v4/locales/fa.cjs +5 -0
- package/node_modules/zod/v4/locales/fa.js +5 -0
- package/node_modules/zod/v4/locales/fi.cjs +5 -0
- package/node_modules/zod/v4/locales/fi.js +5 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
- package/node_modules/zod/v4/locales/fr-CA.js +5 -0
- package/node_modules/zod/v4/locales/fr.cjs +18 -14
- package/node_modules/zod/v4/locales/fr.js +18 -14
- package/node_modules/zod/v4/locales/gu.cjs +140 -0
- package/node_modules/zod/v4/locales/gu.d.cts +5 -0
- package/node_modules/zod/v4/locales/gu.d.ts +4 -0
- package/node_modules/zod/v4/locales/gu.js +113 -0
- package/node_modules/zod/v4/locales/he.cjs +7 -0
- package/node_modules/zod/v4/locales/he.js +7 -0
- package/node_modules/zod/v4/locales/hi.cjs +138 -0
- package/node_modules/zod/v4/locales/hi.d.cts +5 -0
- package/node_modules/zod/v4/locales/hi.d.ts +4 -0
- package/node_modules/zod/v4/locales/hi.js +111 -0
- package/node_modules/zod/v4/locales/hr.cjs +4 -0
- package/node_modules/zod/v4/locales/hr.js +4 -0
- package/node_modules/zod/v4/locales/hu.cjs +5 -0
- package/node_modules/zod/v4/locales/hu.js +5 -0
- package/node_modules/zod/v4/locales/hy.cjs +11 -0
- package/node_modules/zod/v4/locales/hy.js +11 -0
- package/node_modules/zod/v4/locales/id.cjs +5 -0
- package/node_modules/zod/v4/locales/id.js +5 -0
- package/node_modules/zod/v4/locales/index.cjs +43 -2
- package/node_modules/zod/v4/locales/index.d.cts +11 -0
- package/node_modules/zod/v4/locales/index.d.ts +11 -0
- package/node_modules/zod/v4/locales/index.js +11 -0
- package/node_modules/zod/v4/locales/is.cjs +5 -0
- package/node_modules/zod/v4/locales/is.js +5 -0
- package/node_modules/zod/v4/locales/it.cjs +5 -0
- package/node_modules/zod/v4/locales/it.js +5 -0
- package/node_modules/zod/v4/locales/ja.cjs +5 -0
- package/node_modules/zod/v4/locales/ja.js +5 -0
- package/node_modules/zod/v4/locales/ka.cjs +5 -0
- package/node_modules/zod/v4/locales/ka.js +5 -0
- package/node_modules/zod/v4/locales/km.cjs +5 -0
- package/node_modules/zod/v4/locales/km.js +5 -0
- package/node_modules/zod/v4/locales/kn.cjs +143 -0
- package/node_modules/zod/v4/locales/kn.d.cts +5 -0
- package/node_modules/zod/v4/locales/kn.d.ts +4 -0
- package/node_modules/zod/v4/locales/kn.js +116 -0
- package/node_modules/zod/v4/locales/ko.cjs +5 -0
- package/node_modules/zod/v4/locales/ko.js +5 -0
- package/node_modules/zod/v4/locales/lt.cjs +4 -0
- package/node_modules/zod/v4/locales/lt.js +4 -0
- package/node_modules/zod/v4/locales/mk.cjs +5 -0
- package/node_modules/zod/v4/locales/mk.js +5 -0
- package/node_modules/zod/v4/locales/ms.cjs +5 -0
- package/node_modules/zod/v4/locales/ms.js +5 -0
- package/node_modules/zod/v4/locales/ne.cjs +138 -0
- package/node_modules/zod/v4/locales/ne.d.cts +5 -0
- package/node_modules/zod/v4/locales/ne.d.ts +4 -0
- package/node_modules/zod/v4/locales/ne.js +111 -0
- package/node_modules/zod/v4/locales/nl.cjs +5 -0
- package/node_modules/zod/v4/locales/nl.js +5 -0
- package/node_modules/zod/v4/locales/nn.cjs +140 -0
- package/node_modules/zod/v4/locales/nn.d.cts +5 -0
- package/node_modules/zod/v4/locales/nn.d.ts +4 -0
- package/node_modules/zod/v4/locales/nn.js +113 -0
- package/node_modules/zod/v4/locales/no.cjs +7 -2
- package/node_modules/zod/v4/locales/no.js +7 -2
- package/node_modules/zod/v4/locales/ota.cjs +5 -0
- package/node_modules/zod/v4/locales/ota.js +5 -0
- package/node_modules/zod/v4/locales/pl.cjs +5 -0
- package/node_modules/zod/v4/locales/pl.js +5 -0
- package/node_modules/zod/v4/locales/ps.cjs +5 -0
- package/node_modules/zod/v4/locales/ps.js +5 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
- package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
- package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt-BR.js +143 -0
- package/node_modules/zod/v4/locales/pt.cjs +89 -55
- package/node_modules/zod/v4/locales/pt.js +89 -55
- package/node_modules/zod/v4/locales/ro.cjs +3 -0
- package/node_modules/zod/v4/locales/ro.js +3 -0
- package/node_modules/zod/v4/locales/ru.cjs +12 -0
- package/node_modules/zod/v4/locales/ru.js +12 -0
- package/node_modules/zod/v4/locales/sk.cjs +143 -0
- package/node_modules/zod/v4/locales/sk.d.cts +5 -0
- package/node_modules/zod/v4/locales/sk.d.ts +4 -0
- package/node_modules/zod/v4/locales/sk.js +116 -0
- package/node_modules/zod/v4/locales/sl.cjs +5 -0
- package/node_modules/zod/v4/locales/sl.js +5 -0
- package/node_modules/zod/v4/locales/sv.cjs +7 -2
- package/node_modules/zod/v4/locales/sv.js +7 -2
- package/node_modules/zod/v4/locales/ta.cjs +5 -0
- package/node_modules/zod/v4/locales/ta.js +5 -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 +5 -0
- package/node_modules/zod/v4/locales/th.js +5 -0
- package/node_modules/zod/v4/locales/tk.cjs +134 -0
- package/node_modules/zod/v4/locales/tk.d.cts +5 -0
- package/node_modules/zod/v4/locales/tk.d.ts +4 -0
- package/node_modules/zod/v4/locales/tk.js +107 -0
- package/node_modules/zod/v4/locales/tr.cjs +5 -0
- package/node_modules/zod/v4/locales/tr.js +5 -0
- package/node_modules/zod/v4/locales/uk.cjs +5 -0
- package/node_modules/zod/v4/locales/uk.js +5 -0
- package/node_modules/zod/v4/locales/ur.cjs +5 -0
- package/node_modules/zod/v4/locales/ur.js +5 -0
- package/node_modules/zod/v4/locales/uz.cjs +3 -0
- package/node_modules/zod/v4/locales/uz.js +3 -0
- package/node_modules/zod/v4/locales/vi.cjs +5 -0
- package/node_modules/zod/v4/locales/vi.js +5 -0
- package/node_modules/zod/v4/locales/yo.cjs +5 -0
- package/node_modules/zod/v4/locales/yo.js +5 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
- package/node_modules/zod/v4/locales/zh-CN.js +5 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
- package/node_modules/zod/v4/locales/zh-TW.js +5 -0
- package/node_modules/zod/v4/mini/checks.cjs +21 -1
- package/node_modules/zod/v4/mini/checks.d.cts +1 -1
- package/node_modules/zod/v4/mini/checks.d.ts +1 -1
- package/node_modules/zod/v4/mini/checks.js +1 -1
- package/node_modules/zod/v4/mini/coerce.cjs +19 -0
- package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
- package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.js +13 -0
- package/node_modules/zod/v4/mini/external.cjs +33 -1
- package/node_modules/zod/v4/mini/external.d.cts +5 -2
- package/node_modules/zod/v4/mini/external.d.ts +5 -2
- package/node_modules/zod/v4/mini/external.js +3 -1
- package/node_modules/zod/v4/mini/in-out.cjs +82 -0
- package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
- package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
- package/node_modules/zod/v4/mini/in-out.js +36 -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 +22 -1
- package/node_modules/zod/v4/mini/parse.d.cts +1 -1
- package/node_modules/zod/v4/mini/parse.d.ts +1 -1
- package/node_modules/zod/v4/mini/parse.js +1 -1
- package/node_modules/zod/v4/mini/schemas.cjs +117 -53
- package/node_modules/zod/v4/mini/schemas.d.cts +49 -14
- package/node_modules/zod/v4/mini/schemas.d.ts +49 -14
- package/node_modules/zod/v4/mini/schemas.js +92 -51
- package/node_modules/zod/v4-mini/index.cjs +19 -0
- package/openclaw.plugin.json +12 -28
- package/package.json +9 -7
- package/dist/directory-config-B0shiBa4.js +0 -33
- package/node_modules/zod/src/v4/core/config.ts +0 -15
- /package/dist/{message-event-X_aBiM1X.js → .setup/message-event-X_aBiM1X.mjs} +0 -0
- /package/dist/{types-CeupBG0P.js → .setup/types-CeupBG0P.mjs} +0 -0
|
@@ -54,6 +54,33 @@ test("number with constraints", () => {
|
|
|
54
54
|
expect(() => schema.parse(47)).toThrow(); // not multiple of 5
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
+
test("draft-04 boolean exclusive bounds do not emit a redundant inclusive bound", () => {
|
|
58
|
+
const schema = fromJSONSchema({
|
|
59
|
+
type: "number",
|
|
60
|
+
minimum: 5,
|
|
61
|
+
maximum: 10,
|
|
62
|
+
exclusiveMinimum: true,
|
|
63
|
+
exclusiveMaximum: true,
|
|
64
|
+
});
|
|
65
|
+
// exclusive on both ends: boundaries rejected, interior accepted
|
|
66
|
+
expect(() => schema.parse(5)).toThrow();
|
|
67
|
+
expect(() => schema.parse(10)).toThrow();
|
|
68
|
+
expect(schema.parse(7)).toBe(7);
|
|
69
|
+
// the dominated inclusive bound would otherwise report a second, weaker issue alongside the exclusive one
|
|
70
|
+
expect(schema.safeParse(4).error!.issues).toHaveLength(1);
|
|
71
|
+
expect(schema.safeParse(11).error!.issues).toHaveLength(1);
|
|
72
|
+
// the inclusive .min()/.max() must be skipped so only the exclusive checks remain
|
|
73
|
+
const checks = (schema as any)._zod.def.checks.map((c: any) => [
|
|
74
|
+
c._zod.def.check,
|
|
75
|
+
c._zod.def.value,
|
|
76
|
+
c._zod.def.inclusive,
|
|
77
|
+
]);
|
|
78
|
+
expect(checks).toEqual([
|
|
79
|
+
["greater_than", 5, false],
|
|
80
|
+
["less_than", 10, false],
|
|
81
|
+
]);
|
|
82
|
+
});
|
|
83
|
+
|
|
57
84
|
test("integer schema", () => {
|
|
58
85
|
const schema = fromJSONSchema({ type: "integer" });
|
|
59
86
|
expect(schema.parse(42)).toBe(42);
|
|
@@ -127,11 +154,76 @@ test("tuple with prefixItems (draft-2020-12)", () => {
|
|
|
127
154
|
type: "array",
|
|
128
155
|
prefixItems: [{ type: "string" }, { type: "number" }],
|
|
129
156
|
});
|
|
157
|
+
expect(schema.parse([])).toEqual([]);
|
|
158
|
+
expect(schema.parse(["hello"])).toEqual(["hello"]);
|
|
130
159
|
expect(schema.parse(["hello", 42])).toEqual(["hello", 42]);
|
|
131
|
-
|
|
160
|
+
// no `items`, so the tail is unconstrained
|
|
161
|
+
expect(schema.parse(["hello", 42, "extra"])).toEqual(["hello", 42, "extra"]);
|
|
162
|
+
expect(() => schema.parse([1])).toThrow();
|
|
132
163
|
expect(() => schema.parse(["hello", "world"])).toThrow();
|
|
133
164
|
});
|
|
134
165
|
|
|
166
|
+
test("tuple with prefixItems and minItems (draft-2020-12)", () => {
|
|
167
|
+
const partialItems = fromJSONSchema({
|
|
168
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
169
|
+
type: "array",
|
|
170
|
+
prefixItems: [{ type: "string" }, { type: "number" }],
|
|
171
|
+
minItems: 1,
|
|
172
|
+
});
|
|
173
|
+
expect(() => partialItems.parse([])).toThrow();
|
|
174
|
+
expect(partialItems.parse(["hello"])).toEqual(["hello"]);
|
|
175
|
+
|
|
176
|
+
const allRequired = fromJSONSchema({
|
|
177
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
178
|
+
type: "array",
|
|
179
|
+
prefixItems: [{ type: "string" }, { type: "number" }],
|
|
180
|
+
minItems: 2,
|
|
181
|
+
});
|
|
182
|
+
expect(() => allRequired.parse(["hello"])).toThrow();
|
|
183
|
+
expect(allRequired.parse(["hello", 42])).toEqual(["hello", 42]);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test("tuple with prefixItems allows extra items by default (draft-2020-12)", () => {
|
|
187
|
+
const schema = fromJSONSchema({
|
|
188
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
189
|
+
type: "array",
|
|
190
|
+
prefixItems: [{ type: "string" }],
|
|
191
|
+
});
|
|
192
|
+
expect(schema.parse(["hello", 42, true])).toEqual(["hello", 42, true]);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("tuple with prefixItems respects items schema (draft-2020-12)", () => {
|
|
196
|
+
const schema = fromJSONSchema({
|
|
197
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
198
|
+
type: "array",
|
|
199
|
+
prefixItems: [{ type: "string" }],
|
|
200
|
+
items: { type: "number" },
|
|
201
|
+
});
|
|
202
|
+
expect(schema.parse(["hello", 1, 2])).toEqual(["hello", 1, 2]);
|
|
203
|
+
expect(() => schema.parse(["hello", 1, "extra"])).toThrow();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("tuple with prefixItems and items true allows extra items (draft-2020-12)", () => {
|
|
207
|
+
const schema = fromJSONSchema({
|
|
208
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
209
|
+
type: "array",
|
|
210
|
+
prefixItems: [{ type: "string" }, { type: "number" }],
|
|
211
|
+
items: true,
|
|
212
|
+
});
|
|
213
|
+
expect(schema.parse(["hello", 42, "extra", true])).toEqual(["hello", 42, "extra", true]);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test("tuple with prefixItems and items false rejects extra items (draft-2020-12)", () => {
|
|
217
|
+
const schema = fromJSONSchema({
|
|
218
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
219
|
+
type: "array",
|
|
220
|
+
prefixItems: [{ type: "string" }],
|
|
221
|
+
items: false,
|
|
222
|
+
});
|
|
223
|
+
expect(schema.parse(["hello"])).toEqual(["hello"]);
|
|
224
|
+
expect(() => schema.parse(["hello", 42])).toThrow();
|
|
225
|
+
});
|
|
226
|
+
|
|
135
227
|
test("tuple with items array (draft-7)", () => {
|
|
136
228
|
const schema = fromJSONSchema({
|
|
137
229
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
@@ -139,10 +231,66 @@ test("tuple with items array (draft-7)", () => {
|
|
|
139
231
|
items: [{ type: "string" }, { type: "number" }],
|
|
140
232
|
additionalItems: false,
|
|
141
233
|
});
|
|
234
|
+
expect(schema.parse([])).toEqual([]);
|
|
235
|
+
expect(schema.parse(["hello"])).toEqual(["hello"]);
|
|
142
236
|
expect(schema.parse(["hello", 42])).toEqual(["hello", 42]);
|
|
237
|
+
expect(() => schema.parse([1])).toThrow();
|
|
238
|
+
expect(() => schema.parse(["hello", "world"])).toThrow();
|
|
143
239
|
expect(() => schema.parse(["hello", 42, "extra"])).toThrow();
|
|
144
240
|
});
|
|
145
241
|
|
|
242
|
+
test("tuple with items array and minItems (draft-7)", () => {
|
|
243
|
+
const partialItems = fromJSONSchema({
|
|
244
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
245
|
+
type: "array",
|
|
246
|
+
items: [{ type: "string" }, { type: "number" }],
|
|
247
|
+
additionalItems: false,
|
|
248
|
+
minItems: 1,
|
|
249
|
+
});
|
|
250
|
+
expect(() => partialItems.parse([])).toThrow();
|
|
251
|
+
expect(partialItems.parse(["hello"])).toEqual(["hello"]);
|
|
252
|
+
|
|
253
|
+
const allRequired = fromJSONSchema({
|
|
254
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
255
|
+
type: "array",
|
|
256
|
+
items: [{ type: "string" }, { type: "number" }],
|
|
257
|
+
additionalItems: false,
|
|
258
|
+
minItems: 2,
|
|
259
|
+
});
|
|
260
|
+
expect(() => allRequired.parse(["hello"])).toThrow();
|
|
261
|
+
expect(allRequired.parse(["hello", 42])).toEqual(["hello", 42]);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("tuple with items array allows extra items by default (draft-7)", () => {
|
|
265
|
+
const schema = fromJSONSchema({
|
|
266
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
267
|
+
type: "array",
|
|
268
|
+
items: [{ type: "string" }],
|
|
269
|
+
});
|
|
270
|
+
expect(schema.parse(["hello", 42, true])).toEqual(["hello", 42, true]);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("tuple with items array and additionalItems true allows extra items (draft-7)", () => {
|
|
274
|
+
const schema = fromJSONSchema({
|
|
275
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
276
|
+
type: "array",
|
|
277
|
+
items: [{ type: "string" }, { type: "number" }],
|
|
278
|
+
additionalItems: true,
|
|
279
|
+
});
|
|
280
|
+
expect(schema.parse(["hello", 42, "extra", true])).toEqual(["hello", 42, "extra", true]);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test("tuple with items array respects additionalItems schema (draft-7)", () => {
|
|
284
|
+
const schema = fromJSONSchema({
|
|
285
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
286
|
+
type: "array",
|
|
287
|
+
items: [{ type: "string" }],
|
|
288
|
+
additionalItems: { type: "number" },
|
|
289
|
+
});
|
|
290
|
+
expect(schema.parse(["hello", 1, 2])).toEqual(["hello", 1, 2]);
|
|
291
|
+
expect(() => schema.parse(["hello", 1, "extra"])).toThrow();
|
|
292
|
+
});
|
|
293
|
+
|
|
146
294
|
test("enum schema", () => {
|
|
147
295
|
const schema = fromJSONSchema({
|
|
148
296
|
enum: ["red", "green", "blue"],
|
|
@@ -299,6 +447,15 @@ test("local $ref resolution", () => {
|
|
|
299
447
|
expect(() => schema.parse({})).toThrow();
|
|
300
448
|
});
|
|
301
449
|
|
|
450
|
+
test("local $ref resolution unescapes JSON Pointer tokens", () => {
|
|
451
|
+
// `~1` must be decoded before `~0`, so the id "a~1b" survives as itself and not as "a/b".
|
|
452
|
+
for (const id of ["Shared/User", "My~Model", "a~b/c", "a~1b"]) {
|
|
453
|
+
const inner = z.object({ name: z.string() }).meta({ id });
|
|
454
|
+
const schema = fromJSONSchema(z.toJSONSchema(z.object({ inner })));
|
|
455
|
+
expect(schema.parse({ inner: { name: "John" } })).toEqual({ inner: { name: "John" } });
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
|
|
302
459
|
test("circular $ref with lazy", () => {
|
|
303
460
|
const schema = fromJSONSchema({
|
|
304
461
|
$defs: {
|
|
@@ -336,10 +493,156 @@ test("patternProperties", () => {
|
|
|
336
493
|
expect(result.S_age).toBe("30");
|
|
337
494
|
});
|
|
338
495
|
|
|
496
|
+
test("propertyNames with enum does not require keys", () => {
|
|
497
|
+
const schema = fromJSONSchema({
|
|
498
|
+
type: "object",
|
|
499
|
+
propertyNames: { enum: ["a", "b"] },
|
|
500
|
+
additionalProperties: { type: "string" },
|
|
501
|
+
});
|
|
502
|
+
expect(schema.parse({ a: "x" })).toEqual({ a: "x" });
|
|
503
|
+
expect(schema.parse({ b: "y" })).toEqual({ b: "y" });
|
|
504
|
+
expect(schema.parse({})).toEqual({});
|
|
505
|
+
expect(() => schema.parse({ c: "z" })).toThrow();
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
test("propertyNames with enum alongside properties", () => {
|
|
509
|
+
const schema = fromJSONSchema({
|
|
510
|
+
type: "object",
|
|
511
|
+
properties: { a: { type: "string" } },
|
|
512
|
+
propertyNames: { enum: ["a", "b"] },
|
|
513
|
+
additionalProperties: { type: "string" },
|
|
514
|
+
});
|
|
515
|
+
expect(schema.parse({ a: "x" })).toEqual({ a: "x" });
|
|
516
|
+
expect(schema.parse({})).toEqual({});
|
|
517
|
+
expect(() => schema.parse({ c: "z" })).toThrow();
|
|
518
|
+
expect(() => schema.parse({ a: "x", c: "z" })).toThrow();
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
test("propertyNames with enum still honors required", () => {
|
|
522
|
+
const schema = fromJSONSchema({
|
|
523
|
+
type: "object",
|
|
524
|
+
properties: { a: { type: "string" }, b: { type: "string" } },
|
|
525
|
+
required: ["a"],
|
|
526
|
+
propertyNames: { enum: ["a", "b"] },
|
|
527
|
+
additionalProperties: { type: "string" },
|
|
528
|
+
});
|
|
529
|
+
expect(schema.parse({ a: "x" })).toEqual({ a: "x" });
|
|
530
|
+
expect(schema.parse({ a: "x", b: "y" })).toEqual({ a: "x", b: "y" });
|
|
531
|
+
expect(() => schema.parse({})).toThrow();
|
|
532
|
+
expect(() => schema.parse({ b: "y" })).toThrow();
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
test("propertyNames does not apply additionalProperties to declared properties", () => {
|
|
536
|
+
const schema = fromJSONSchema({
|
|
537
|
+
type: "object",
|
|
538
|
+
properties: { a: { type: "number" } },
|
|
539
|
+
propertyNames: { enum: ["a", "b"] },
|
|
540
|
+
additionalProperties: { type: "string" },
|
|
541
|
+
});
|
|
542
|
+
expect(schema.parse({ a: 1 })).toEqual({ a: 1 });
|
|
543
|
+
expect(schema.parse({ a: 1, b: "x" })).toEqual({ a: 1, b: "x" });
|
|
544
|
+
expect(() => schema.parse({ b: 1 })).toThrow();
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
test("propertyNames alongside additionalProperties: false", () => {
|
|
548
|
+
const schema = fromJSONSchema({
|
|
549
|
+
type: "object",
|
|
550
|
+
properties: { a: { type: "string" } },
|
|
551
|
+
propertyNames: { enum: ["a", "b"] },
|
|
552
|
+
additionalProperties: false,
|
|
553
|
+
});
|
|
554
|
+
expect(schema.parse({ a: "x" })).toEqual({ a: "x" });
|
|
555
|
+
expect(() => schema.parse({ a: "x", b: "y" })).toThrow();
|
|
556
|
+
expect(() => schema.parse({ c: "z" })).toThrow();
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
test("propertyNames alongside patternProperties", () => {
|
|
560
|
+
const schema = fromJSONSchema({
|
|
561
|
+
type: "object",
|
|
562
|
+
patternProperties: { "^S_": { type: "string" } },
|
|
563
|
+
propertyNames: { type: "string", pattern: "^S_" },
|
|
564
|
+
});
|
|
565
|
+
expect(schema.parse({ S_a: "x" })).toEqual({ S_a: "x" });
|
|
566
|
+
expect(() => schema.parse({ S_a: 1 })).toThrow();
|
|
567
|
+
expect(() => schema.parse({ other: "x" })).toThrow();
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
test("propertyNames rejects keys the object parse would drop or synthesize", () => {
|
|
571
|
+
const schema = fromJSONSchema({ type: "object", propertyNames: { enum: ["a"] } });
|
|
572
|
+
// An object parse strips `__proto__`, so the guard has to see the raw input.
|
|
573
|
+
expect(() => schema.parse(JSON.parse('{"__proto__":1}'))).toThrow();
|
|
574
|
+
|
|
575
|
+
// A property `default` adds a key that was never in the instance.
|
|
576
|
+
const withDefault = fromJSONSchema({
|
|
577
|
+
type: "object",
|
|
578
|
+
properties: { AB: { type: "string", default: "x" } },
|
|
579
|
+
propertyNames: { type: "string", pattern: "^[a-z]+$" },
|
|
580
|
+
});
|
|
581
|
+
expect(withDefault.parse({})).toEqual({ AB: "x" });
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
test("propertyNames subschema without a type still constrains keys", () => {
|
|
585
|
+
const schema = fromJSONSchema({
|
|
586
|
+
type: "object",
|
|
587
|
+
propertyNames: { pattern: "^[A-Za-z_][A-Za-z0-9_]*$" },
|
|
588
|
+
});
|
|
589
|
+
expect(schema.parse({ valid_key: "x" })).toEqual({ valid_key: "x" });
|
|
590
|
+
expect(() => schema.parse({ "001 invalid": "x" })).toThrow();
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
test("boolean propertyNames", () => {
|
|
594
|
+
expect(() => fromJSONSchema({ type: "object", propertyNames: false }).parse({ a: 1 })).toThrow();
|
|
595
|
+
expect(fromJSONSchema({ type: "object", propertyNames: false }).parse({})).toEqual({});
|
|
596
|
+
expect(fromJSONSchema({ type: "object", propertyNames: true }).parse({ anything: 1 })).toEqual({ anything: 1 });
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
test("propertyNames metadata is not attached where it is inert", () => {
|
|
600
|
+
// Not an object: nothing enforces it, so it must not be advertised either.
|
|
601
|
+
expect(z.toJSONSchema(fromJSONSchema({ type: "string", propertyNames: { enum: ["a"] } }))).not.toHaveProperty(
|
|
602
|
+
"propertyNames"
|
|
603
|
+
);
|
|
604
|
+
|
|
605
|
+
// A $ref target is shared by every reference to it; metadata must not leak onto it.
|
|
606
|
+
const shared = z.toJSONSchema(
|
|
607
|
+
fromJSONSchema({
|
|
608
|
+
$defs: { N: { type: "object", properties: { v: { type: "string" } } } },
|
|
609
|
+
type: "object",
|
|
610
|
+
properties: { a: { $ref: "#/$defs/N", propertyNames: { enum: ["v"] } }, b: { $ref: "#/$defs/N" } },
|
|
611
|
+
})
|
|
612
|
+
) as any;
|
|
613
|
+
expect(shared.properties.b).not.toHaveProperty("propertyNames");
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
test("propertyNames survives a toJSONSchema round trip", () => {
|
|
617
|
+
const roundTripped = z.toJSONSchema(
|
|
618
|
+
fromJSONSchema({
|
|
619
|
+
type: "object",
|
|
620
|
+
propertyNames: { enum: ["a", "b"] },
|
|
621
|
+
additionalProperties: { type: "string" },
|
|
622
|
+
})
|
|
623
|
+
) as Record<string, unknown>;
|
|
624
|
+
expect(roundTripped.propertyNames).toEqual({ enum: ["a", "b"] });
|
|
625
|
+
expect(roundTripped.required).toBeUndefined();
|
|
626
|
+
|
|
627
|
+
// The key guard is a pipe; neither side may swallow the object it wraps.
|
|
628
|
+
for (const io of ["input", "output"] as const) {
|
|
629
|
+
const out = z.toJSONSchema(
|
|
630
|
+
fromJSONSchema({
|
|
631
|
+
type: "object",
|
|
632
|
+
properties: { a: { type: "string" } },
|
|
633
|
+
propertyNames: { enum: ["a", "b"] },
|
|
634
|
+
additionalProperties: { type: "string" },
|
|
635
|
+
}),
|
|
636
|
+
{ io }
|
|
637
|
+
) as Record<string, unknown>;
|
|
638
|
+
expect(out.type).toBe("object");
|
|
639
|
+
expect(out.properties).toEqual({ a: { type: "string" } });
|
|
640
|
+
expect(out.propertyNames).toEqual({ enum: ["a", "b"] });
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
|
|
339
644
|
test("patternProperties with regular properties", () => {
|
|
340
|
-
// Note: When patternProperties is combined with properties, the intersection
|
|
341
|
-
// validates all keys against the pattern. This test uses a pattern that
|
|
342
|
-
// matches the regular property name as well.
|
|
645
|
+
// Note: When patternProperties is combined with properties, the intersection validates all keys against the pattern. This test uses a pattern that matches the regular property name as well.
|
|
343
646
|
const schema = fromJSONSchema({
|
|
344
647
|
type: "object",
|
|
345
648
|
properties: {
|
|
@@ -387,13 +690,55 @@ test("multiple overlapping patternProperties", () => {
|
|
|
387
690
|
expect(() => schema.parse({ S_N: "ab" })).toThrow(); // too short for ^S_N pattern
|
|
388
691
|
});
|
|
389
692
|
|
|
693
|
+
test("patternProperties with additionalProperties false", () => {
|
|
694
|
+
const schema = fromJSONSchema({
|
|
695
|
+
type: "object",
|
|
696
|
+
patternProperties: {
|
|
697
|
+
"^S_": { type: "string" },
|
|
698
|
+
},
|
|
699
|
+
additionalProperties: false,
|
|
700
|
+
});
|
|
701
|
+
expect(schema.parse({ S_name: "ok" })).toEqual({ S_name: "ok" });
|
|
702
|
+
expect(() => schema.parse({ X_A: false })).toThrow();
|
|
703
|
+
expect(() => schema.parse({ S_name: 1 })).toThrow();
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
test("patternProperties and properties with additionalProperties false", () => {
|
|
707
|
+
const schema = fromJSONSchema({
|
|
708
|
+
type: "object",
|
|
709
|
+
properties: {
|
|
710
|
+
name: { type: "string" },
|
|
711
|
+
},
|
|
712
|
+
patternProperties: {
|
|
713
|
+
"^S_": { type: "string" },
|
|
714
|
+
},
|
|
715
|
+
additionalProperties: false,
|
|
716
|
+
required: ["name"],
|
|
717
|
+
});
|
|
718
|
+
expect(schema.parse({ name: "ok", S_count: "1" })).toEqual({ name: "ok", S_count: "1" });
|
|
719
|
+
expect(() => schema.parse({ name: "ok", S_count: 1 })).toThrow();
|
|
720
|
+
expect(() => schema.parse({ name: "ok", other: "value" })).toThrow();
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
test("multiple patternProperties with additionalProperties false", () => {
|
|
724
|
+
const schema = fromJSONSchema({
|
|
725
|
+
type: "object",
|
|
726
|
+
patternProperties: {
|
|
727
|
+
"^S_": { type: "string" },
|
|
728
|
+
"^N_": { type: "number" },
|
|
729
|
+
},
|
|
730
|
+
additionalProperties: false,
|
|
731
|
+
});
|
|
732
|
+
expect(schema.parse({ S_a: "a", N_b: 1 })).toEqual({ S_a: "a", N_b: 1 });
|
|
733
|
+
expect(() => schema.parse({ S_a: "a", N_b: 1, other: "value" })).toThrow();
|
|
734
|
+
});
|
|
735
|
+
|
|
390
736
|
test("default value", () => {
|
|
391
737
|
const schema = fromJSONSchema({
|
|
392
738
|
type: "string",
|
|
393
739
|
default: "hello",
|
|
394
740
|
});
|
|
395
|
-
// Default is applied during parsing if value is missing/undefined
|
|
396
|
-
// This depends on Zod's default behavior
|
|
741
|
+
// Default is applied during parsing if value is missing/undefined. This depends on Zod's default behavior
|
|
397
742
|
expect(schema.parse("world")).toBe("world");
|
|
398
743
|
});
|
|
399
744
|
|
|
@@ -457,6 +802,53 @@ test("string format - uuid", () => {
|
|
|
457
802
|
expect(schema.parse(uuid)).toBe(uuid);
|
|
458
803
|
});
|
|
459
804
|
|
|
805
|
+
test("string format - date-time", () => {
|
|
806
|
+
const schema = fromJSONSchema({
|
|
807
|
+
type: "string",
|
|
808
|
+
format: "date-time",
|
|
809
|
+
});
|
|
810
|
+
expect(schema.safeParse("2026-07-29T14:30:00Z").success).toBe(true);
|
|
811
|
+
expect(schema.safeParse("2026-07-29T16:30:00+02:00").success).toBe(true);
|
|
812
|
+
expect(schema.safeParse("2026-07-29T14:30:00").success).toBe(false);
|
|
813
|
+
expect(schema.safeParse("2026-07-29T16:30:00+0200").success).toBe(false);
|
|
814
|
+
|
|
815
|
+
const zuluOnly = fromJSONSchema({
|
|
816
|
+
type: "string",
|
|
817
|
+
format: "date-time",
|
|
818
|
+
pattern: "Z$",
|
|
819
|
+
});
|
|
820
|
+
expect(zuluOnly.safeParse("2026-07-29T14:30:00Z").success).toBe(true);
|
|
821
|
+
expect(zuluOnly.safeParse("2026-07-29T16:30:00+02:00").success).toBe(false);
|
|
822
|
+
expect(zuluOnly.safeParse("garbageZ").success).toBe(false);
|
|
823
|
+
|
|
824
|
+
const roundTripped = fromJSONSchema(z.toJSONSchema(z.iso.datetime({ offset: true })));
|
|
825
|
+
expect(roundTripped.safeParse("2026-07-29T16:30:00+02:00").success).toBe(true);
|
|
826
|
+
});
|
|
827
|
+
|
|
828
|
+
test("string format - time", () => {
|
|
829
|
+
const schema = fromJSONSchema({
|
|
830
|
+
type: "string",
|
|
831
|
+
format: "time",
|
|
832
|
+
});
|
|
833
|
+
// full-time, so seconds and an offset are both required
|
|
834
|
+
expect(schema.safeParse("14:30:00Z").success).toBe(true);
|
|
835
|
+
expect(schema.safeParse("16:30:00+02:00").success).toBe(true);
|
|
836
|
+
expect(schema.safeParse("16:30:00.123-05:30").success).toBe(true);
|
|
837
|
+
expect(schema.safeParse("14:30:00").success).toBe(false);
|
|
838
|
+
expect(schema.safeParse("14:30Z").success).toBe(false);
|
|
839
|
+
expect(schema.safeParse("16:30:00+0200").success).toBe(false);
|
|
840
|
+
expect(schema.safeParse("16:30:00+24:00").success).toBe(false);
|
|
841
|
+
});
|
|
842
|
+
|
|
843
|
+
test("string format - hostname", () => {
|
|
844
|
+
const schema = fromJSONSchema({
|
|
845
|
+
type: "string",
|
|
846
|
+
format: "hostname",
|
|
847
|
+
});
|
|
848
|
+
expect(schema.parse("example.com")).toBe("example.com");
|
|
849
|
+
expect(() => schema.parse("not a hostname!")).toThrow();
|
|
850
|
+
});
|
|
851
|
+
|
|
460
852
|
test("exclusiveMinimum and exclusiveMaximum", () => {
|
|
461
853
|
const schema = fromJSONSchema({
|
|
462
854
|
type: "number",
|
|
@@ -648,8 +1040,7 @@ test("metadata on nested schemas", () => {
|
|
|
648
1040
|
// Verify parent schema has its metadata
|
|
649
1041
|
expect(customRegistry.get(parentSchema)?.title).toBe("User");
|
|
650
1042
|
|
|
651
|
-
// We can't easily access nested schemas directly, but we can verify
|
|
652
|
-
// the registry is being used correctly by checking a separate schema
|
|
1043
|
+
// We can't easily access nested schemas directly, but we can verify the registry is being used correctly by checking a separate schema
|
|
653
1044
|
const simpleSchema = fromJSONSchema(
|
|
654
1045
|
{
|
|
655
1046
|
type: "string",
|
|
@@ -673,8 +1064,7 @@ test("no metadata added when no unrecognized keys", () => {
|
|
|
673
1064
|
{ registry: customRegistry }
|
|
674
1065
|
);
|
|
675
1066
|
|
|
676
|
-
// description is handled via .describe(), so it shouldn't be in metadata
|
|
677
|
-
// All other keys are recognized, so no metadata should be added
|
|
1067
|
+
// description is handled via .describe(), so it shouldn't be in metadata. All other keys are recognized, so no metadata should be added
|
|
678
1068
|
expect(customRegistry.get(schema)).toBeUndefined();
|
|
679
1069
|
});
|
|
680
1070
|
|
|
@@ -893,3 +1283,185 @@ test("Date default is coerced to its JSON string form", () => {
|
|
|
893
1283
|
const schema = fromJSONSchema({ type: "string", default: date as any });
|
|
894
1284
|
expect(schema.parse(undefined)).toBe(date.toISOString());
|
|
895
1285
|
});
|
|
1286
|
+
|
|
1287
|
+
// An object literal can't express an own "__proto__" key — `{ __proto__: x }` sets the literal's prototype instead. JSON.parse is both the realistic source of a JSON Schema and the only way to write these cases.
|
|
1288
|
+
test("required __proto__ property is represented in the shape but stripped during parsing", () => {
|
|
1289
|
+
const schema = fromJSONSchema(
|
|
1290
|
+
JSON.parse(`{
|
|
1291
|
+
"type": "object",
|
|
1292
|
+
"properties": { "__proto__": { "type": "string", "const": "admin" }, "role": { "type": "string" } },
|
|
1293
|
+
"required": ["__proto__", "role"]
|
|
1294
|
+
}`)
|
|
1295
|
+
);
|
|
1296
|
+
|
|
1297
|
+
expect(Object.prototype.hasOwnProperty.call((schema as z.ZodObject).shape, "__proto__")).toBe(true);
|
|
1298
|
+
expect(schema.parse({ role: "x" })).toEqual({ role: "x" });
|
|
1299
|
+
expect(schema.parse(JSON.parse(`{ "role": "x", "__proto__": "wrong" }`))).toEqual({ role: "x" });
|
|
1300
|
+
expect(schema.parse(JSON.parse(`{ "role": "x", "__proto__": "admin" }`))).toEqual({ role: "x" });
|
|
1301
|
+
});
|
|
1302
|
+
|
|
1303
|
+
test("__proto__ annotation key reaches the registry", () => {
|
|
1304
|
+
const registry = z.registry<Record<string, unknown>>();
|
|
1305
|
+
const schema = fromJSONSchema(JSON.parse(`{ "type": "string", "__proto__": { "custom": 1 } }`), { registry });
|
|
1306
|
+
|
|
1307
|
+
const meta = registry.get(schema)!;
|
|
1308
|
+
expect(Object.prototype.hasOwnProperty.call(meta, "__proto__")).toBe(true);
|
|
1309
|
+
expect(meta.__proto__).toEqual({ custom: 1 });
|
|
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
|
+
});
|