@openclaw/buzz 2026.9.4 → 2026.9.5
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-BVHkrP3Z.mjs} +201 -103
- 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 +27 -0
- package/node_modules/zod/compile.cjs +77 -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 +2 -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/package.json +13 -2
- 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/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 +12 -9
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +140 -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 +452 -262
- 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 +135 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +30 -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 +2 -2
- 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 +720 -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 +155 -13
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +11 -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 +274 -6
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +425 -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/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 +281 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +47 -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 +183 -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 +46 -9
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +245 -12
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +234 -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/preprocess-types.test.ts +20 -2
- 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 +33 -2
- 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/string.test.ts +127 -5
- 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 +11 -2
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1585 -173
- 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 +76 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
- package/node_modules/zod/src/v4/core/api.ts +48 -12
- package/node_modules/zod/src/v4/core/checks.ts +57 -44
- package/node_modules/zod/src/v4/core/compile.ts +2188 -0
- package/node_modules/zod/src/v4/core/core.ts +98 -19
- package/node_modules/zod/src/v4/core/doc.ts +11 -7
- package/node_modules/zod/src/v4/core/errors.ts +115 -24
- package/node_modules/zod/src/v4/core/index.ts +3 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +6 -1
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +257 -93
- package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
- package/node_modules/zod/src/v4/core/memoizer.ts +284 -0
- package/node_modules/zod/src/v4/core/parse.ts +131 -38
- package/node_modules/zod/src/v4/core/regexes.ts +30 -13
- package/node_modules/zod/src/v4/core/registries.ts +2 -2
- package/node_modules/zod/src/v4/core/schemas.ts +759 -461
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +969 -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 +1639 -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/tk.test.ts +69 -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 +31 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +275 -42
- package/node_modules/zod/src/v4/core/util.ts +268 -42
- 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 +3 -0
- package/node_modules/zod/src/v4/locales/az.ts +3 -0
- package/node_modules/zod/src/v4/locales/be.ts +10 -0
- package/node_modules/zod/src/v4/locales/bg.ts +3 -0
- package/node_modules/zod/src/v4/locales/bn.ts +121 -0
- package/node_modules/zod/src/v4/locales/ca.ts +3 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +138 -0
- package/node_modules/zod/src/v4/locales/cs.ts +3 -0
- package/node_modules/zod/src/v4/locales/da.ts +5 -2
- package/node_modules/zod/src/v4/locales/de.ts +3 -0
- package/node_modules/zod/src/v4/locales/el.ts +1 -0
- package/node_modules/zod/src/v4/locales/en.ts +15 -4
- package/node_modules/zod/src/v4/locales/eo.ts +3 -0
- package/node_modules/zod/src/v4/locales/es.ts +2 -0
- package/node_modules/zod/src/v4/locales/fa.ts +3 -0
- package/node_modules/zod/src/v4/locales/fi.ts +3 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +3 -0
- package/node_modules/zod/src/v4/locales/fr.ts +19 -14
- package/node_modules/zod/src/v4/locales/gu.ts +121 -0
- package/node_modules/zod/src/v4/locales/he.ts +6 -1
- package/node_modules/zod/src/v4/locales/hi.ts +124 -0
- package/node_modules/zod/src/v4/locales/hr.ts +2 -0
- package/node_modules/zod/src/v4/locales/hu.ts +3 -0
- package/node_modules/zod/src/v4/locales/hy.ts +9 -0
- package/node_modules/zod/src/v4/locales/id.ts +3 -0
- package/node_modules/zod/src/v4/locales/index.ts +10 -0
- package/node_modules/zod/src/v4/locales/is.ts +3 -0
- package/node_modules/zod/src/v4/locales/it.ts +3 -0
- package/node_modules/zod/src/v4/locales/ja.ts +3 -0
- package/node_modules/zod/src/v4/locales/ka.ts +3 -0
- package/node_modules/zod/src/v4/locales/km.ts +3 -0
- package/node_modules/zod/src/v4/locales/kn.ts +124 -0
- package/node_modules/zod/src/v4/locales/ko.ts +3 -0
- package/node_modules/zod/src/v4/locales/lt.ts +2 -0
- package/node_modules/zod/src/v4/locales/mk.ts +3 -0
- package/node_modules/zod/src/v4/locales/ms.ts +3 -0
- package/node_modules/zod/src/v4/locales/ne.ts +126 -0
- package/node_modules/zod/src/v4/locales/nl.ts +3 -0
- package/node_modules/zod/src/v4/locales/nn.ts +119 -0
- package/node_modules/zod/src/v4/locales/no.ts +5 -2
- package/node_modules/zod/src/v4/locales/ota.ts +3 -0
- package/node_modules/zod/src/v4/locales/pl.ts +3 -0
- package/node_modules/zod/src/v4/locales/ps.ts +3 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +159 -0
- package/node_modules/zod/src/v4/locales/pt.ts +99 -58
- package/node_modules/zod/src/v4/locales/ro.ts +1 -0
- package/node_modules/zod/src/v4/locales/ru.ts +10 -0
- package/node_modules/zod/src/v4/locales/sk.ts +121 -0
- package/node_modules/zod/src/v4/locales/sl.ts +3 -0
- package/node_modules/zod/src/v4/locales/sv.ts +5 -2
- package/node_modules/zod/src/v4/locales/ta.ts +3 -0
- package/node_modules/zod/src/v4/locales/th.ts +3 -0
- package/node_modules/zod/src/v4/locales/tk.ts +111 -0
- package/node_modules/zod/src/v4/locales/tr.ts +3 -0
- package/node_modules/zod/src/v4/locales/uk.ts +3 -0
- package/node_modules/zod/src/v4/locales/ur.ts +3 -0
- package/node_modules/zod/src/v4/locales/uz.ts +1 -0
- package/node_modules/zod/src/v4/locales/vi.ts +3 -0
- package/node_modules/zod/src/v4/locales/yo.ts +3 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +3 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +3 -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 +10 -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 +135 -56
- 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/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 +72 -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/string.test.ts +21 -0
- package/node_modules/zod/v3/ZodError.cjs +22 -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/types.cjs +7 -5
- package/node_modules/zod/v3/types.js +7 -5
- package/node_modules/zod/v4/classic/checks.cjs +2 -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/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 +39 -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 +43 -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 +30 -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 +136 -75
- package/node_modules/zod/v4/classic/from-json-schema.js +136 -75
- package/node_modules/zod/v4/classic/in-out.cjs +63 -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 +2 -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 +11 -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 +4 -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 +498 -398
- package/node_modules/zod/v4/classic/schemas.d.cts +53 -18
- package/node_modules/zod/v4/classic/schemas.d.ts +53 -18
- package/node_modules/zod/v4/classic/schemas.js +492 -396
- package/node_modules/zod/v4/core/api.cjs +23 -4
- package/node_modules/zod/v4/core/api.d.cts +13 -9
- package/node_modules/zod/v4/core/api.d.ts +13 -9
- package/node_modules/zod/v4/core/api.js +21 -4
- package/node_modules/zod/v4/core/checks.cjs +37 -31
- package/node_modules/zod/v4/core/checks.d.cts +13 -13
- package/node_modules/zod/v4/core/checks.d.ts +13 -13
- package/node_modules/zod/v4/core/checks.js +37 -31
- package/node_modules/zod/v4/core/compile.cjs +1813 -0
- package/node_modules/zod/v4/core/compile.d.cts +51 -0
- package/node_modules/zod/v4/core/compile.d.ts +51 -0
- package/node_modules/zod/v4/core/compile.js +1783 -0
- package/node_modules/zod/v4/core/core.cjs +81 -18
- 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 +82 -19
- package/node_modules/zod/v4/core/doc.cjs +5 -7
- 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 +5 -7
- package/node_modules/zod/v4/core/errors.cjs +110 -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 +110 -25
- package/node_modules/zod/v4/core/index.cjs +5 -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 +4 -0
- 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 +4 -0
- package/node_modules/zod/v4/core/json-schema-processors.cjs +264 -95
- package/node_modules/zod/v4/core/json-schema-processors.js +243 -97
- 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 +272 -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 +265 -0
- package/node_modules/zod/v4/core/parse.cjs +96 -34
- 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 +94 -33
- package/node_modules/zod/v4/core/regexes.cjs +27 -15
- package/node_modules/zod/v4/core/regexes.d.cts +2 -0
- package/node_modules/zod/v4/core/regexes.d.ts +2 -0
- package/node_modules/zod/v4/core/regexes.js +24 -13
- package/node_modules/zod/v4/core/registries.js +2 -2
- package/node_modules/zod/v4/core/schemas.cjs +537 -326
- package/node_modules/zod/v4/core/schemas.d.cts +100 -31
- package/node_modules/zod/v4/core/schemas.d.ts +100 -31
- package/node_modules/zod/v4/core/schemas.js +526 -325
- package/node_modules/zod/v4/core/to-json-schema.cjs +242 -39
- package/node_modules/zod/v4/core/to-json-schema.d.cts +42 -3
- package/node_modules/zod/v4/core/to-json-schema.d.ts +42 -3
- package/node_modules/zod/v4/core/to-json-schema.js +241 -39
- package/node_modules/zod/v4/core/util.cjs +212 -31
- package/node_modules/zod/v4/core/util.d.cts +58 -1
- package/node_modules/zod/v4/core/util.d.ts +58 -1
- package/node_modules/zod/v4/core/util.js +202 -30
- package/node_modules/zod/v4/core/versions.cjs +2 -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 +195 -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 +15 -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 +3 -0
- package/node_modules/zod/v4/locales/ar.js +3 -0
- package/node_modules/zod/v4/locales/az.cjs +3 -0
- package/node_modules/zod/v4/locales/az.js +3 -0
- package/node_modules/zod/v4/locales/be.cjs +10 -0
- package/node_modules/zod/v4/locales/be.js +10 -0
- package/node_modules/zod/v4/locales/bg.cjs +3 -0
- package/node_modules/zod/v4/locales/bg.js +3 -0
- package/node_modules/zod/v4/locales/bn.cjs +138 -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 +111 -0
- package/node_modules/zod/v4/locales/ca.cjs +3 -0
- package/node_modules/zod/v4/locales/ca.js +3 -0
- package/node_modules/zod/v4/locales/ckb.cjs +158 -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 +131 -0
- package/node_modules/zod/v4/locales/cs.cjs +3 -0
- package/node_modules/zod/v4/locales/cs.js +3 -0
- package/node_modules/zod/v4/locales/da.cjs +5 -2
- package/node_modules/zod/v4/locales/da.js +5 -2
- package/node_modules/zod/v4/locales/de.cjs +3 -0
- package/node_modules/zod/v4/locales/de.js +3 -0
- package/node_modules/zod/v4/locales/el.cjs +1 -0
- package/node_modules/zod/v4/locales/el.js +1 -0
- package/node_modules/zod/v4/locales/en.cjs +14 -4
- package/node_modules/zod/v4/locales/en.js +14 -4
- package/node_modules/zod/v4/locales/eo.cjs +3 -0
- package/node_modules/zod/v4/locales/eo.js +3 -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 +3 -0
- package/node_modules/zod/v4/locales/fa.js +3 -0
- package/node_modules/zod/v4/locales/fi.cjs +3 -0
- package/node_modules/zod/v4/locales/fi.js +3 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +3 -0
- package/node_modules/zod/v4/locales/fr-CA.js +3 -0
- package/node_modules/zod/v4/locales/fr.cjs +16 -14
- package/node_modules/zod/v4/locales/fr.js +16 -14
- package/node_modules/zod/v4/locales/gu.cjs +138 -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 +111 -0
- package/node_modules/zod/v4/locales/he.cjs +5 -0
- package/node_modules/zod/v4/locales/he.js +5 -0
- package/node_modules/zod/v4/locales/hi.cjs +136 -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 +109 -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 +3 -0
- package/node_modules/zod/v4/locales/hu.js +3 -0
- package/node_modules/zod/v4/locales/hy.cjs +9 -0
- package/node_modules/zod/v4/locales/hy.js +9 -0
- package/node_modules/zod/v4/locales/id.cjs +3 -0
- package/node_modules/zod/v4/locales/id.js +3 -0
- package/node_modules/zod/v4/locales/index.cjs +22 -2
- package/node_modules/zod/v4/locales/index.d.cts +10 -0
- package/node_modules/zod/v4/locales/index.d.ts +10 -0
- package/node_modules/zod/v4/locales/index.js +10 -0
- package/node_modules/zod/v4/locales/is.cjs +3 -0
- package/node_modules/zod/v4/locales/is.js +3 -0
- package/node_modules/zod/v4/locales/it.cjs +3 -0
- package/node_modules/zod/v4/locales/it.js +3 -0
- package/node_modules/zod/v4/locales/ja.cjs +3 -0
- package/node_modules/zod/v4/locales/ja.js +3 -0
- package/node_modules/zod/v4/locales/ka.cjs +3 -0
- package/node_modules/zod/v4/locales/ka.js +3 -0
- package/node_modules/zod/v4/locales/km.cjs +3 -0
- package/node_modules/zod/v4/locales/km.js +3 -0
- package/node_modules/zod/v4/locales/kn.cjs +141 -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 +114 -0
- package/node_modules/zod/v4/locales/ko.cjs +3 -0
- package/node_modules/zod/v4/locales/ko.js +3 -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 +3 -0
- package/node_modules/zod/v4/locales/mk.js +3 -0
- package/node_modules/zod/v4/locales/ms.cjs +3 -0
- package/node_modules/zod/v4/locales/ms.js +3 -0
- package/node_modules/zod/v4/locales/ne.cjs +136 -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 +109 -0
- package/node_modules/zod/v4/locales/nl.cjs +3 -0
- package/node_modules/zod/v4/locales/nl.js +3 -0
- package/node_modules/zod/v4/locales/nn.cjs +138 -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 +111 -0
- package/node_modules/zod/v4/locales/no.cjs +5 -2
- package/node_modules/zod/v4/locales/no.js +5 -2
- package/node_modules/zod/v4/locales/ota.cjs +3 -0
- package/node_modules/zod/v4/locales/ota.js +3 -0
- package/node_modules/zod/v4/locales/pl.cjs +3 -0
- package/node_modules/zod/v4/locales/pl.js +3 -0
- package/node_modules/zod/v4/locales/ps.cjs +3 -0
- package/node_modules/zod/v4/locales/ps.js +3 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +168 -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 +141 -0
- package/node_modules/zod/v4/locales/pt.cjs +87 -55
- package/node_modules/zod/v4/locales/pt.js +87 -55
- package/node_modules/zod/v4/locales/ro.cjs +1 -0
- package/node_modules/zod/v4/locales/ro.js +1 -0
- package/node_modules/zod/v4/locales/ru.cjs +10 -0
- package/node_modules/zod/v4/locales/ru.js +10 -0
- package/node_modules/zod/v4/locales/sk.cjs +141 -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 +114 -0
- package/node_modules/zod/v4/locales/sl.cjs +3 -0
- package/node_modules/zod/v4/locales/sl.js +3 -0
- package/node_modules/zod/v4/locales/sv.cjs +5 -2
- package/node_modules/zod/v4/locales/sv.js +5 -2
- package/node_modules/zod/v4/locales/ta.cjs +3 -0
- package/node_modules/zod/v4/locales/ta.js +3 -0
- package/node_modules/zod/v4/locales/th.cjs +3 -0
- package/node_modules/zod/v4/locales/th.js +3 -0
- package/node_modules/zod/v4/locales/tk.cjs +132 -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 +105 -0
- package/node_modules/zod/v4/locales/tr.cjs +3 -0
- package/node_modules/zod/v4/locales/tr.js +3 -0
- package/node_modules/zod/v4/locales/uk.cjs +3 -0
- package/node_modules/zod/v4/locales/uk.js +3 -0
- package/node_modules/zod/v4/locales/ur.cjs +3 -0
- package/node_modules/zod/v4/locales/ur.js +3 -0
- package/node_modules/zod/v4/locales/uz.cjs +1 -0
- package/node_modules/zod/v4/locales/uz.js +1 -0
- package/node_modules/zod/v4/locales/vi.cjs +3 -0
- package/node_modules/zod/v4/locales/vi.js +3 -0
- package/node_modules/zod/v4/locales/yo.cjs +3 -0
- package/node_modules/zod/v4/locales/yo.js +3 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +3 -0
- package/node_modules/zod/v4/locales/zh-CN.js +3 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +3 -0
- package/node_modules/zod/v4/locales/zh-TW.js +3 -0
- package/node_modules/zod/v4/mini/checks.cjs +2 -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/deep-partial.cjs +39 -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 +12 -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 +63 -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/parse.cjs +3 -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 +75 -47
- package/node_modules/zod/v4/mini/schemas.d.cts +43 -13
- package/node_modules/zod/v4/mini/schemas.d.ts +43 -13
- package/node_modules/zod/v4/mini/schemas.js +71 -45
- 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
|
@@ -132,14 +132,12 @@ test("catchall inference", () => {
|
|
|
132
132
|
test("catchall overrides strict", () => {
|
|
133
133
|
const o1 = z.object({ first: z.string().optional() }).strict().catchall(z.number());
|
|
134
134
|
|
|
135
|
-
// should run fine
|
|
136
|
-
// setting a catchall overrides the unknownKeys behavior
|
|
135
|
+
// should run fine setting a catchall overrides the unknownKeys behavior
|
|
137
136
|
o1.parse({
|
|
138
137
|
asdf: 1234,
|
|
139
138
|
});
|
|
140
139
|
|
|
141
|
-
// should only run catchall validation
|
|
142
|
-
// against unknown keys
|
|
140
|
+
// should only run catchall validation against unknown keys
|
|
143
141
|
o1.parse({
|
|
144
142
|
first: "asdf",
|
|
145
143
|
asdf: 1234,
|
|
@@ -154,8 +152,7 @@ test("catchall overrides strict", () => {
|
|
|
154
152
|
.strict()
|
|
155
153
|
.catchall(z.number());
|
|
156
154
|
|
|
157
|
-
// should run fine
|
|
158
|
-
// setting a catchall overrides the unknownKeys behavior
|
|
155
|
+
// should run fine setting a catchall overrides the unknownKeys behavior
|
|
159
156
|
o1.parse({
|
|
160
157
|
first: "asdf",
|
|
161
158
|
asdf: 1234,
|
|
@@ -670,10 +667,7 @@ test("safeExtend() on object with refinements should not throw", () => {
|
|
|
670
667
|
expect(() => schema.safeExtend({ b: z.string() })).not.toThrow();
|
|
671
668
|
});
|
|
672
669
|
|
|
673
|
-
// __proto__ in input must not replace the prototype of the parsed object via
|
|
674
|
-
// the assignment setter on the result {}.
|
|
675
|
-
// https://github.com/colinhacks/zod/security/advisories/GHSA-r34p-xfmx-58wv
|
|
676
|
-
// https://github.com/colinhacks/zod/security/advisories/GHSA-84jv-fqfx-wxhr
|
|
670
|
+
// __proto__ in input must not replace the prototype of the parsed object via the assignment setter on the result {}.
|
|
677
671
|
describe("__proto__ in object catchall paths", () => {
|
|
678
672
|
const protoInput = () => JSON.parse('{"__proto__":{"isAdmin":true},"name":"alice"}');
|
|
679
673
|
|
|
@@ -709,9 +703,248 @@ describe("__proto__ in object catchall paths", () => {
|
|
|
709
703
|
}
|
|
710
704
|
});
|
|
711
705
|
|
|
712
|
-
test("strict
|
|
706
|
+
test("strict surfaces __proto__ as unrecognized without copying it", () => {
|
|
713
707
|
const schema = z.object({ name: z.string() }).strict();
|
|
714
708
|
const result = schema.safeParse(protoInput());
|
|
715
|
-
expect(result.success).toBe(
|
|
709
|
+
expect(result.success).toBe(false);
|
|
710
|
+
if (!result.success) {
|
|
711
|
+
expect(result.error.issues[0].code).toBe("unrecognized_keys");
|
|
712
|
+
expect((result.error.issues[0] as any).keys).toEqual(["__proto__"]);
|
|
713
|
+
}
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
test("strict accepts but strips a __proto__ key the shape declares", () => {
|
|
717
|
+
const shape: any = { name: z.string() };
|
|
718
|
+
Object.defineProperty(shape, "__proto__", {
|
|
719
|
+
value: z.string(),
|
|
720
|
+
enumerable: true,
|
|
721
|
+
configurable: true,
|
|
722
|
+
writable: true,
|
|
723
|
+
});
|
|
724
|
+
const input = JSON.parse('{"name":"alice","__proto__":"hello"}');
|
|
725
|
+
|
|
726
|
+
for (const schema of [z.object(shape).strict(), z.object(shape).catchall(z.any()), z.object(shape)]) {
|
|
727
|
+
const result = schema.safeParse(input);
|
|
728
|
+
expect(result.success).toBe(true);
|
|
729
|
+
if (result.success) {
|
|
730
|
+
expect(Object.keys(result.data)).toEqual(["name"]);
|
|
731
|
+
expect(Object.getPrototypeOf(result.data)).toBe(Object.prototype);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
test("strictObject and jitless agree with .strict()", async () => {
|
|
737
|
+
for (const schema of [z.strictObject({ name: z.string() }), z.object({ name: z.string() }).strict()]) {
|
|
738
|
+
for (const result of [
|
|
739
|
+
schema.safeParse(protoInput()),
|
|
740
|
+
await schema.safeParseAsync(protoInput(), {
|
|
741
|
+
jitless: true,
|
|
742
|
+
} as any),
|
|
743
|
+
]) {
|
|
744
|
+
expect(result.success).toBe(false);
|
|
745
|
+
if (!result.success) {
|
|
746
|
+
expect((result.error.issues[0] as any).keys).toEqual(["__proto__"]);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
// Parsed objects always strip __proto__, including keys explicitly declared by the schema.
|
|
754
|
+
describe("__proto__ as a declared shape key", () => {
|
|
755
|
+
const protoInput = () => JSON.parse('{"__proto__":{"isAdmin":true},"name":"alice"}');
|
|
756
|
+
const makeShape = () =>
|
|
757
|
+
Object.fromEntries([
|
|
758
|
+
["__proto__", z.object({ isAdmin: z.boolean() })],
|
|
759
|
+
["name", z.string()],
|
|
760
|
+
]) as Record<string, any>;
|
|
761
|
+
|
|
762
|
+
const expectStripped = (parsed: any) => {
|
|
763
|
+
expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
|
|
764
|
+
expect(Object.prototype.hasOwnProperty.call(parsed, "__proto__")).toBe(false);
|
|
765
|
+
expect((parsed as any).isAdmin).toBeUndefined();
|
|
766
|
+
expect(Object.keys(parsed)).toEqual(["name"]);
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
test("jit fastpass", () => {
|
|
770
|
+
expectStripped(z.object(makeShape()).parse(protoInput()));
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
test("jitless", () => {
|
|
774
|
+
expectStripped(z.object(makeShape()).parse(protoInput(), { jitless: true } as any));
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
test("async", async () => {
|
|
778
|
+
const shape = Object.fromEntries([
|
|
779
|
+
["__proto__", z.object({ isAdmin: z.boolean() }).refine(async () => true)],
|
|
780
|
+
["name", z.string()],
|
|
781
|
+
]) as Record<string, any>;
|
|
782
|
+
expectStripped(await z.object(shape).parseAsync(protoInput()));
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
test("primitive value is stripped", () => {
|
|
786
|
+
const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
|
|
787
|
+
const parsed: any = schema.parse(JSON.parse('{"__proto__":"hello"}'));
|
|
788
|
+
expect(Object.prototype.hasOwnProperty.call(parsed, "__proto__")).toBe(false);
|
|
789
|
+
expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
test("declared key is not validated", () => {
|
|
793
|
+
const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
|
|
794
|
+
expect(schema.parse(JSON.parse('{"__proto__":123}'))).toEqual({});
|
|
795
|
+
});
|
|
796
|
+
|
|
797
|
+
test("required, optional, and defaulted declarations are all stripped", () => {
|
|
798
|
+
const shape = (schema: z.ZodType) => Object.fromEntries([["__proto__", schema]]) as Record<string, any>;
|
|
799
|
+
|
|
800
|
+
for (const jitless of [false, true]) {
|
|
801
|
+
const ctx = { jitless } as any;
|
|
802
|
+
expect(z.object(shape(z.unknown())).parse({}, ctx)).toEqual({});
|
|
803
|
+
expect(z.object(shape(z.string().optional())).parse({}, ctx)).toEqual({});
|
|
804
|
+
expect(z.object(shape(z.string().default("fallback"))).parse({}, ctx)).toEqual({});
|
|
805
|
+
}
|
|
806
|
+
});
|
|
807
|
+
|
|
808
|
+
test("an own getter is not evaluated", () => {
|
|
809
|
+
let reads = 0;
|
|
810
|
+
const input = Object.defineProperty({}, "__proto__", {
|
|
811
|
+
get() {
|
|
812
|
+
reads++;
|
|
813
|
+
return "value";
|
|
814
|
+
},
|
|
815
|
+
enumerable: true,
|
|
816
|
+
});
|
|
817
|
+
const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
|
|
818
|
+
|
|
819
|
+
expect(schema.parse(input)).toEqual({});
|
|
820
|
+
expect(reads).toBe(0);
|
|
821
|
+
});
|
|
822
|
+
|
|
823
|
+
test("pick keeps a declared key", () => {
|
|
824
|
+
const shape = Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>;
|
|
825
|
+
const mask = Object.fromEntries([["__proto__", true]]) as Record<string, true>;
|
|
826
|
+
const picked = z.object(shape).pick(mask);
|
|
827
|
+
|
|
828
|
+
expect(Object.keys(picked.shape)).toEqual(["__proto__"]);
|
|
829
|
+
const parsed: any = picked.parse(Object.fromEntries([["__proto__", "value"]]));
|
|
830
|
+
expect(parsed).toEqual({});
|
|
831
|
+
expect(() => z.object({ value: z.string() }).pick(mask as any).shape).toThrow('Unrecognized key: "__proto__"');
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
test.each(["omit", "partial", "required"] as const)("%s rejects an undeclared key", (method) => {
|
|
835
|
+
const mask = Object.fromEntries([["__proto__", true]]);
|
|
836
|
+
const schema = z.object({ value: z.string() });
|
|
837
|
+
|
|
838
|
+
expect(() => (schema[method] as any)(mask).shape).toThrow('Unrecognized key: "__proto__"');
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
test("shape helpers preserve a declared key", () => {
|
|
842
|
+
const shape = () =>
|
|
843
|
+
Object.fromEntries([
|
|
844
|
+
["__proto__", z.string()],
|
|
845
|
+
["value", z.string()],
|
|
846
|
+
]) as Record<string, any>;
|
|
847
|
+
const protoMask = Object.fromEntries([["__proto__", true]]);
|
|
848
|
+
const valueMask = { value: true } as const;
|
|
849
|
+
const shapes = [
|
|
850
|
+
z.object(shape()).omit(valueMask).shape,
|
|
851
|
+
z.object(shape()).partial(protoMask as any).shape,
|
|
852
|
+
z.object(shape()).required(protoMask as any).shape,
|
|
853
|
+
];
|
|
854
|
+
|
|
855
|
+
for (const next of shapes) {
|
|
856
|
+
expect(Object.getPrototypeOf(next)).toBe(Object.prototype);
|
|
857
|
+
expect(Object.prototype.hasOwnProperty.call(next, "__proto__")).toBe(true);
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
test("Object.prototype is untouched", () => {
|
|
862
|
+
z.object(makeShape()).parse(protoInput());
|
|
863
|
+
expect(({} as any).isAdmin).toBeUndefined();
|
|
864
|
+
});
|
|
865
|
+
});
|
|
866
|
+
|
|
867
|
+
test("object parsing still reads ordinary inherited properties", () => {
|
|
868
|
+
const input = Object.create({ value: "inherited" });
|
|
869
|
+
const schema = z.object({ value: z.string() });
|
|
870
|
+
|
|
871
|
+
expect(schema.parse(input)).toEqual({ value: "inherited" });
|
|
872
|
+
expect(schema.parse(input, { jitless: true } as any)).toEqual({ value: "inherited" });
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
describe("symbol keys in object shape", () => {
|
|
876
|
+
const SYM = Symbol("sym");
|
|
877
|
+
const OTHER = Symbol("other");
|
|
878
|
+
|
|
879
|
+
test("parses and validates a declared symbol key", () => {
|
|
880
|
+
const schema = z.object({ name: z.string(), [SYM]: z.number() });
|
|
881
|
+
expectTypeOf<z.infer<typeof schema>>().toEqualTypeOf<{ name: string; [SYM]: number }>();
|
|
882
|
+
|
|
883
|
+
for (const params of [undefined, { jitless: true } as any]) {
|
|
884
|
+
expect(schema.parse({ name: "alice", [SYM]: 42 }, params)).toEqual({ name: "alice", [SYM]: 42 });
|
|
885
|
+
expect(schema.safeParse({ name: "alice", [SYM]: "nope" }, params).success).toBe(false);
|
|
886
|
+
expect(schema.safeParse({ name: "alice" }, params).success).toBe(false);
|
|
887
|
+
}
|
|
888
|
+
});
|
|
889
|
+
|
|
890
|
+
test("reports an invalid symbol value at the symbol's own path", () => {
|
|
891
|
+
const schema = z.object({ [SYM]: z.number() });
|
|
892
|
+
const result = schema.safeParse({ [SYM]: "nope" });
|
|
893
|
+
expect(result.error!.issues[0].path).toEqual([SYM]);
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
test("honours optionality and defaults on a symbol key", () => {
|
|
897
|
+
expect(z.object({ [SYM]: z.number().optional() }).parse({})).toEqual({});
|
|
898
|
+
expect(z.object({ [SYM]: z.number().default(7) }).parse({})).toEqual({ [SYM]: 7 });
|
|
899
|
+
});
|
|
900
|
+
|
|
901
|
+
test("a declared symbol key survives strict and loose", () => {
|
|
902
|
+
expect(z.strictObject({ [SYM]: z.number() }).safeParse({ [SYM]: 1 }).success).toBe(true);
|
|
903
|
+
expect(z.strictObject({ [SYM]: z.number() }).safeParse({ [SYM]: 1, extra: 1 }).success).toBe(false);
|
|
904
|
+
expect(z.looseObject({ [SYM]: z.number() }).parse({ [SYM]: 1, extra: "e" })).toEqual({ [SYM]: 1, extra: "e" });
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
// Deliberate: hunting each input for undeclared symbols costs a `getOwnPropertySymbols` call on every parse of every strict/loose/catchall object, which measured +16-44% on `z.strictObject`. Declared keys are static and cost nothing, so only they are supported.
|
|
908
|
+
test("an undeclared symbol key is ignored, not passed through or flagged", () => {
|
|
909
|
+
expect(z.looseObject({ name: z.string() }).parse({ name: "a", [OTHER]: "x" })).toEqual({ name: "a" });
|
|
910
|
+
expect(z.strictObject({ name: z.string() }).safeParse({ name: "a", [OTHER]: "x" }).success).toBe(true);
|
|
911
|
+
});
|
|
912
|
+
|
|
913
|
+
test("builder methods reach symbol keys", () => {
|
|
914
|
+
const base = z.object({ a: z.string(), [SYM]: z.number() });
|
|
915
|
+
expect(base.partial().safeParse({ a: "x" }).success).toBe(true);
|
|
916
|
+
expect(base.partial().required().safeParse({ a: "x" }).success).toBe(false);
|
|
917
|
+
expect(Reflect.ownKeys(base.pick({ [SYM]: true }).shape)).toEqual([SYM]);
|
|
918
|
+
expect(Reflect.ownKeys(base.omit({ [SYM]: true }).shape)).toEqual(["a"]);
|
|
919
|
+
expect(Reflect.ownKeys(z.object({ a: z.string() }).extend({ [SYM]: z.number() }).shape)).toEqual(["a", SYM]);
|
|
920
|
+
});
|
|
921
|
+
|
|
922
|
+
test("a cycle through a symbol key is detected like a string-keyed one", () => {
|
|
923
|
+
const A: any = z.object({
|
|
924
|
+
name: z.string(),
|
|
925
|
+
get [SYM]() {
|
|
926
|
+
return A.optional();
|
|
927
|
+
},
|
|
928
|
+
});
|
|
929
|
+
const input: any = { name: "root" };
|
|
930
|
+
input[SYM] = input;
|
|
931
|
+
expect(A.safeParse(input).success).toBe(true);
|
|
932
|
+
expect(() => z.compile(A, { strict: true })).toThrow(/does not support/);
|
|
933
|
+
});
|
|
934
|
+
|
|
935
|
+
test("extend's refinement-overlap guard sees symbol keys", () => {
|
|
936
|
+
const refined = z.object({ a: z.string(), [SYM]: z.number() }).refine(() => true);
|
|
937
|
+
expect(() => refined.extend({ a: z.string() })).toThrow(/Cannot overwrite keys/);
|
|
938
|
+
expect(() => refined.extend({ [SYM]: z.string() })).toThrow(/Cannot overwrite keys/);
|
|
939
|
+
});
|
|
940
|
+
|
|
941
|
+
test("a symbol key is unrepresentable in JSON Schema", () => {
|
|
942
|
+
const schema = z.object({ a: z.string(), [SYM]: z.number() });
|
|
943
|
+
expect(() => z.toJSONSchema(schema)).toThrow(/Symbol keys cannot be represented/);
|
|
944
|
+
expect(z.toJSONSchema(schema, { unrepresentable: "any" })).toMatchObject({ properties: { a: { type: "string" } } });
|
|
945
|
+
});
|
|
946
|
+
|
|
947
|
+
test("rejects a non-schema value under a symbol key", () => {
|
|
948
|
+
expect(() => z.object({ [SYM]: 123 as any }).parse({})).toThrow(/Invalid element at key "Symbol\(sym\)"/);
|
|
716
949
|
});
|
|
717
950
|
});
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { expect, expectTypeOf, test } from "vitest";
|
|
2
|
+
import { z } from "zod/v4";
|
|
3
|
+
|
|
4
|
+
/* ------------------------------------------------------------------ *
|
|
5
|
+
* TYPE-LEVEL — the dangerous half. Defaults must stay OPTIONAL in
|
|
6
|
+
* z.input and REQUIRED in z.output, exactly as before the ladder.
|
|
7
|
+
* ------------------------------------------------------------------ */
|
|
8
|
+
test("ladder: z.input / z.output unchanged by the extra rung", () => {
|
|
9
|
+
const objDefault = z.object({ a: z.string().default("D"), b: z.number() });
|
|
10
|
+
expectTypeOf<z.input<typeof objDefault>>().toEqualTypeOf<{ a?: string | undefined; b: number }>();
|
|
11
|
+
expectTypeOf<z.output<typeof objDefault>>().toEqualTypeOf<{ a: string; b: number }>();
|
|
12
|
+
|
|
13
|
+
const objPrefault = z.object({ a: z.string().prefault("P"), b: z.number() });
|
|
14
|
+
expectTypeOf<z.input<typeof objPrefault>>().toEqualTypeOf<{ a?: string | undefined; b: number }>();
|
|
15
|
+
expectTypeOf<z.output<typeof objPrefault>>().toEqualTypeOf<{ a: string; b: number }>();
|
|
16
|
+
|
|
17
|
+
const objOptional = z.object({ a: z.string().optional() });
|
|
18
|
+
expectTypeOf<z.input<typeof objOptional>>().toEqualTypeOf<{ a?: string | undefined }>();
|
|
19
|
+
|
|
20
|
+
const objTransform = z.object({
|
|
21
|
+
a: z
|
|
22
|
+
.string()
|
|
23
|
+
.default("")
|
|
24
|
+
.transform((v) => v.length),
|
|
25
|
+
});
|
|
26
|
+
expectTypeOf<z.input<typeof objTransform>>().toEqualTypeOf<{ a?: string | undefined }>();
|
|
27
|
+
expectTypeOf<z.output<typeof objTransform>>().toEqualTypeOf<{ a: number }>();
|
|
28
|
+
|
|
29
|
+
const standalone = z.string().default("D");
|
|
30
|
+
expectTypeOf<z.input<typeof standalone>>().toEqualTypeOf<string | undefined>();
|
|
31
|
+
expectTypeOf<z.output<typeof standalone>>().toEqualTypeOf<string>();
|
|
32
|
+
|
|
33
|
+
// a trailing defaulted tuple slot stays optional in the input tuple
|
|
34
|
+
const tup = z.tuple([z.string(), z.number().default(1)]);
|
|
35
|
+
expectTypeOf<z.input<typeof tup>>().toEqualTypeOf<[string, (number | undefined)?]>();
|
|
36
|
+
|
|
37
|
+
const partialed = objDefault.partial();
|
|
38
|
+
expectTypeOf<z.input<typeof partialed>>().toEqualTypeOf<{ a?: string | undefined; b?: number | undefined }>();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/* ------------------------------------------------------------------ *
|
|
42
|
+
* RUNTIME
|
|
43
|
+
* ------------------------------------------------------------------ */
|
|
44
|
+
test("ladder: the #6321 regression is fixed", () => {
|
|
45
|
+
const arr = z
|
|
46
|
+
.string()
|
|
47
|
+
.default("")
|
|
48
|
+
.transform((v) => (v ? v.split(",") : []));
|
|
49
|
+
expect(z.object({ a: arr }).partial().parse({})).toEqual({ a: [] });
|
|
50
|
+
expect(z.object({ a: arr }).partial().parse({ a: undefined })).toEqual({ a: [] });
|
|
51
|
+
expect(z.object({ a: arr }).partial().parse({ a: "x,y" })).toEqual({ a: ["x", "y"] });
|
|
52
|
+
expect(arr.optional().parse(undefined)).toEqual([]);
|
|
53
|
+
expect(
|
|
54
|
+
z
|
|
55
|
+
.string()
|
|
56
|
+
.prefault("hi")
|
|
57
|
+
.transform((v) => v.length)
|
|
58
|
+
.optional()
|
|
59
|
+
.parse(undefined)
|
|
60
|
+
).toBe(2);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("ladder: key-level admissibility across every rung", () => {
|
|
64
|
+
expect(z.object({ a: z.string().default("D") }).parse({})).toEqual({ a: "D" });
|
|
65
|
+
expect(z.object({ a: z.string().prefault("P") }).parse({})).toEqual({ a: "P" });
|
|
66
|
+
expect(z.object({ a: z.string().optional() }).parse({})).toEqual({});
|
|
67
|
+
expect(z.object({ a: z.transform(() => "T") }).parse({})).toEqual({ a: "T" });
|
|
68
|
+
expect(z.object({ a: z.string().catch("C") }).parse({})).toEqual({ a: "C" });
|
|
69
|
+
expect(z.object({ a: z.string() }).safeParse({}).success).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("ladder: exactOptional keeps its distinct meaning", () => {
|
|
73
|
+
expect(z.object({ a: z.string().exactOptional() }).parse({})).toEqual({});
|
|
74
|
+
expect(z.object({ a: z.string().exactOptional() }).safeParse({ a: undefined }).success).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// An absent key never materializes a value from a schema that only claims the middle rung, however that schema answers `undefined`. The top rung still substitutes, and an explicitly present `undefined` still runs the inner.
|
|
78
|
+
test.each([true, false])("ladder: an absent key stays absent on the middle rung (jitless=%s)", (jitless) => {
|
|
79
|
+
const opts = { jitless };
|
|
80
|
+
expect(z.object({ a: z.coerce.string().exactOptional() }).parse({}, opts)).toStrictEqual({});
|
|
81
|
+
expect(z.object({ a: z.string().catch("C").exactOptional() }).parse({}, opts)).toStrictEqual({});
|
|
82
|
+
expect(z.object({ a: z.preprocess((v) => v ?? "X", z.string()).exactOptional() }).parse({}, opts)).toStrictEqual({});
|
|
83
|
+
expect(z.object({ a: z.union([z.coerce.string(), z.string().optional()]) }).parse({}, opts)).toStrictEqual({});
|
|
84
|
+
|
|
85
|
+
expect(z.object({ a: z.string().default("D").exactOptional() }).parse({}, opts)).toStrictEqual({ a: "D" });
|
|
86
|
+
expect(z.object({ a: z.string().prefault("P").exactOptional() }).parse({}, opts)).toStrictEqual({ a: "P" });
|
|
87
|
+
expect(z.object({ a: z.coerce.string().exactOptional() }).parse({ a: undefined }, opts)).toStrictEqual({
|
|
88
|
+
a: "undefined",
|
|
89
|
+
});
|
|
90
|
+
expect(z.object({ a: z.coerce.string() }).parse({ a: undefined }, opts)).toStrictEqual({ a: "undefined" });
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("ladder: an absent tuple slot on the middle rung truncates the tail", () => {
|
|
94
|
+
expect(z.tuple([z.string(), z.coerce.string().exactOptional()]).parse(["x"])).toStrictEqual(["x"]);
|
|
95
|
+
expect(z.tuple([z.string(), z.string().catch("C").exactOptional()]).parse(["x"])).toStrictEqual(["x"]);
|
|
96
|
+
expect(z.tuple([z.string(), z.string().default("D").exactOptional()]).parse(["x"])).toStrictEqual(["x", "D"]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// z.compile() assembles its own output, so the gate has to be mirrored there or compile mode silently keeps the invented value.
|
|
100
|
+
test("ladder: compile mode agrees with the interpreted and JIT paths on absent middle-rung slots", () => {
|
|
101
|
+
const objects = [
|
|
102
|
+
[z.object({ a: z.coerce.string().exactOptional() }), {}],
|
|
103
|
+
[z.object({ a: z.string().catch("C").exactOptional() }), {}],
|
|
104
|
+
[z.object({ a: z.string().default("D").exactOptional() }), { a: "D" }],
|
|
105
|
+
[z.object({ a: z.string().catch("C") }), { a: "C" }],
|
|
106
|
+
] as const;
|
|
107
|
+
for (const [schema, expected] of objects) {
|
|
108
|
+
expect(z.compile(schema).parse({})).toStrictEqual(expected);
|
|
109
|
+
expect(schema.parse({}, { jitless: true })).toStrictEqual(expected);
|
|
110
|
+
expect(schema.parse({})).toStrictEqual(expected);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const tuples = [
|
|
114
|
+
[z.tuple([z.string(), z.coerce.string().exactOptional()]), ["x"]],
|
|
115
|
+
[z.tuple([z.string(), z.string().default("D").exactOptional()]), ["x", "D"]],
|
|
116
|
+
] as const;
|
|
117
|
+
for (const [schema, expected] of tuples) {
|
|
118
|
+
expect(z.compile(schema).parse(["x"])).toStrictEqual(expected);
|
|
119
|
+
expect(schema.parse(["x"], { jitless: true })).toStrictEqual(expected);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("ladder: tuple minimum length respects every rung", () => {
|
|
124
|
+
expect(z.tuple([z.string().default("D")]).parse([])).toEqual(["D"]);
|
|
125
|
+
expect(z.tuple([z.string().prefault("P")]).parse([])).toEqual(["P"]);
|
|
126
|
+
expect(z.tuple([z.string().optional()]).parse([])).toEqual([]);
|
|
127
|
+
expect(z.tuple([z.string()]).safeParse([]).success).toBe(false);
|
|
128
|
+
expect(z.tuple([z.string(), z.number().default(1)]).parse(["x"])).toEqual(["x", 1]);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("ladder: the #5941 / #5939 clobber invariants still hold", () => {
|
|
132
|
+
expect(
|
|
133
|
+
z
|
|
134
|
+
.preprocess((v) => v ?? "X", z.string())
|
|
135
|
+
.optional()
|
|
136
|
+
.parse(undefined)
|
|
137
|
+
).toBeUndefined();
|
|
138
|
+
expect(z.string().catch("X").optional().parse(undefined)).toBeUndefined();
|
|
139
|
+
expect(
|
|
140
|
+
z
|
|
141
|
+
.string()
|
|
142
|
+
.catch("X")
|
|
143
|
+
.transform((s) => `${s}!`)
|
|
144
|
+
.optional()
|
|
145
|
+
.parse(undefined)
|
|
146
|
+
).toBeUndefined();
|
|
147
|
+
expect(
|
|
148
|
+
z
|
|
149
|
+
.transform(() => "T")
|
|
150
|
+
.optional()
|
|
151
|
+
.parse(undefined)
|
|
152
|
+
).toBeUndefined();
|
|
153
|
+
expect(
|
|
154
|
+
z
|
|
155
|
+
.union([z.preprocess((v) => v ?? "X", z.string()), z.number()])
|
|
156
|
+
.optional()
|
|
157
|
+
.parse(undefined)
|
|
158
|
+
).toBeUndefined();
|
|
159
|
+
expect(z.object({ a: z.preprocess((v) => v ?? "X", z.string()) }).parse({})).toEqual({ a: "X" });
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("ladder: the top rung survives every wrapper order", () => {
|
|
163
|
+
expect(z.string().default("D").optional().parse(undefined)).toBe("D");
|
|
164
|
+
expect(z.string().default("D").optional().optional().parse(undefined)).toBe("D");
|
|
165
|
+
expect(z.string().default("D").nullable().optional().parse(undefined)).toBe("D");
|
|
166
|
+
expect(z.string().default("D").readonly().optional().parse(undefined)).toBe("D");
|
|
167
|
+
expect(z.string().default("D").catch("C").optional().parse(undefined)).toBe("D");
|
|
168
|
+
expect(z.string().default("D").pipe(z.string()).optional().parse(undefined)).toBe("D");
|
|
169
|
+
expect(
|
|
170
|
+
z
|
|
171
|
+
.union([z.string().default("D"), z.number()])
|
|
172
|
+
.optional()
|
|
173
|
+
.parse(undefined)
|
|
174
|
+
).toBe("D");
|
|
175
|
+
expect(
|
|
176
|
+
z
|
|
177
|
+
.lazy(() => z.string().default("D"))
|
|
178
|
+
.optional()
|
|
179
|
+
.parse(undefined)
|
|
180
|
+
).toBe("D");
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("ladder: record and catchall paths that read optin", () => {
|
|
184
|
+
expect(z.record(z.string(), z.string().default("D")).parse({ k: undefined })).toEqual({ k: "D" });
|
|
185
|
+
expect(z.object({}).catchall(z.string().default("D")).parse({ x: undefined })).toEqual({ x: "D" });
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("ladder: async parity", async () => {
|
|
189
|
+
const a = z
|
|
190
|
+
.string()
|
|
191
|
+
.default("")
|
|
192
|
+
.transform(async (v) => (v ? v.split(",") : []));
|
|
193
|
+
expect((await a.optional().safeParseAsync(undefined)).data).toEqual([]);
|
|
194
|
+
expect((await z.object({ a }).partial().safeParseAsync({})).data).toEqual({ a: [] });
|
|
195
|
+
expect(
|
|
196
|
+
(
|
|
197
|
+
await z
|
|
198
|
+
.preprocess(async (v) => v ?? "X", z.string())
|
|
199
|
+
.optional()
|
|
200
|
+
.safeParseAsync(undefined)
|
|
201
|
+
).data
|
|
202
|
+
).toBeUndefined();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test("ladder: the rung values themselves", () => {
|
|
206
|
+
expect(z.string()._zod.optin).toBeUndefined();
|
|
207
|
+
expect(z.string().optional()._zod.optin).toBe("optional");
|
|
208
|
+
expect(z.transform(() => 1)._zod.optin).toBe("optional");
|
|
209
|
+
expect(z.string().catch("C")._zod.optin).toBe("optional");
|
|
210
|
+
expect(z.string().default("D")._zod.optin).toBe("defaulted");
|
|
211
|
+
expect(z.string().prefault("P")._zod.optin).toBe("defaulted");
|
|
212
|
+
expect(
|
|
213
|
+
z
|
|
214
|
+
.string()
|
|
215
|
+
.default("D")
|
|
216
|
+
.transform((v) => v)._zod.optin
|
|
217
|
+
).toBe("defaulted");
|
|
218
|
+
expect(z.string().default("D").optional()._zod.optin).toBe("defaulted");
|
|
219
|
+
expect(z.union([z.string().default("D"), z.number()])._zod.optin).toBe("defaulted");
|
|
220
|
+
expect(z.union([z.string().optional(), z.number()])._zod.optin).toBe("optional");
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test("exactOptional overrides the values and pattern optional installs", () => {
|
|
224
|
+
expect(z.exactOptional(z.enum(["a", "b"]))._zod.values).toEqual(new Set(["a", "b"]));
|
|
225
|
+
expect(z.exactOptional(z.string().regex(/^abc$/))._zod.pattern).toEqual(/^abc$/);
|
|
226
|
+
expect(z.templateLiteral(["a", z.exactOptional(z.literal("b"))]).safeParse("a").success).toEqual(false);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// The override is installed once, on a prototype every instance of the type shares, so it has to hold for instances built after the first.
|
|
230
|
+
test("exactOptional's override holds for later instances", () => {
|
|
231
|
+
z.exactOptional(z.enum(["a", "b"]));
|
|
232
|
+
expect(z.exactOptional(z.enum(["c", "d"]))._zod.values).toEqual(new Set(["c", "d"]));
|
|
233
|
+
expect(z.exactOptional(z.string().regex(/^xyz$/))._zod.pattern).toEqual(/^xyz$/);
|
|
234
|
+
});
|
|
@@ -27,7 +27,7 @@ test("optionality", () => {
|
|
|
27
27
|
expect(b._zod.optout).toEqual("optional");
|
|
28
28
|
|
|
29
29
|
const c = z.string().default("asdf");
|
|
30
|
-
expect(c._zod.optin).toEqual("
|
|
30
|
+
expect(c._zod.optin).toEqual("defaulted");
|
|
31
31
|
expect(c._zod.optout).toEqual(undefined);
|
|
32
32
|
|
|
33
33
|
const d = z.string().optional().nullable();
|
|
@@ -35,27 +35,27 @@ test("optionality", () => {
|
|
|
35
35
|
expect(d._zod.optout).toEqual("optional");
|
|
36
36
|
|
|
37
37
|
const e = z.string().default("asdf").nullable();
|
|
38
|
-
expect(e._zod.optin).toEqual("
|
|
38
|
+
expect(e._zod.optin).toEqual("defaulted");
|
|
39
39
|
expect(e._zod.optout).toEqual(undefined);
|
|
40
40
|
|
|
41
41
|
// z.undefined should NOT be optional
|
|
42
42
|
const f = z.undefined();
|
|
43
43
|
expect(f._zod.optin).toEqual(undefined);
|
|
44
44
|
expect(f._zod.optout).toEqual(undefined);
|
|
45
|
-
expectTypeOf<typeof f._zod.optin>().toEqualTypeOf<"optional" | undefined>();
|
|
45
|
+
expectTypeOf<typeof f._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
|
|
46
46
|
expectTypeOf<typeof f._zod.optout>().toEqualTypeOf<"optional" | undefined>();
|
|
47
47
|
|
|
48
48
|
// z.union should be optional if any of the types are optional
|
|
49
49
|
const g = z.union([z.string(), z.undefined()]);
|
|
50
50
|
expect(g._zod.optin).toEqual(undefined);
|
|
51
51
|
expect(g._zod.optout).toEqual(undefined);
|
|
52
|
-
expectTypeOf<typeof g._zod.optin>().toEqualTypeOf<"optional" | undefined>();
|
|
52
|
+
expectTypeOf<typeof g._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
|
|
53
53
|
expectTypeOf<typeof g._zod.optout>().toEqualTypeOf<"optional" | undefined>();
|
|
54
54
|
|
|
55
55
|
const h = z.union([z.string(), z.optional(z.string())]);
|
|
56
56
|
expect(h._zod.optin).toEqual("optional");
|
|
57
57
|
expect(h._zod.optout).toEqual("optional");
|
|
58
|
-
expectTypeOf<typeof h._zod.optin>().toEqualTypeOf<"optional">();
|
|
58
|
+
expectTypeOf<typeof h._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
|
|
59
59
|
expectTypeOf<typeof h._zod.optout>().toEqualTypeOf<"optional">();
|
|
60
60
|
});
|
|
61
61
|
|
|
@@ -64,7 +64,7 @@ test("pipe optionality", () => {
|
|
|
64
64
|
const a = z.string().optional().pipe(z.string());
|
|
65
65
|
expect(a._zod.optin).toEqual("optional");
|
|
66
66
|
expect(a._zod.optout).toEqual(undefined);
|
|
67
|
-
expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional">();
|
|
67
|
+
expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
|
|
68
68
|
expectTypeOf<typeof a._zod.optout>().toEqualTypeOf<"optional" | undefined>();
|
|
69
69
|
|
|
70
70
|
const b = z
|
|
@@ -73,11 +73,11 @@ test("pipe optionality", () => {
|
|
|
73
73
|
.pipe(z.string().optional());
|
|
74
74
|
expect(b._zod.optin).toEqual(undefined);
|
|
75
75
|
expect(b._zod.optout).toEqual("optional");
|
|
76
|
-
expectTypeOf<typeof b._zod.optin>().toEqualTypeOf<"optional" | undefined>();
|
|
76
|
+
expectTypeOf<typeof b._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
|
|
77
77
|
expectTypeOf<typeof b._zod.optout>().toEqualTypeOf<"optional">();
|
|
78
78
|
|
|
79
79
|
const c = z.string().default("asdf").pipe(z.string());
|
|
80
|
-
expect(c._zod.optin).toEqual("
|
|
80
|
+
expect(c._zod.optin).toEqual("defaulted");
|
|
81
81
|
expect(c._zod.optout).toEqual(undefined);
|
|
82
82
|
|
|
83
83
|
const d = z
|
|
@@ -202,7 +202,7 @@ test("exactOptional optionality", () => {
|
|
|
202
202
|
const a = z.string().exactOptional();
|
|
203
203
|
expect(a._zod.optin).toEqual("optional");
|
|
204
204
|
expect(a._zod.optout).toEqual("optional");
|
|
205
|
-
expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional">();
|
|
205
|
+
expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
|
|
206
206
|
expectTypeOf<typeof a._zod.optout>().toEqualTypeOf<"optional">();
|
|
207
207
|
});
|
|
208
208
|
|
|
@@ -268,10 +268,7 @@ test("exactOptional vs optional comparison", () => {
|
|
|
268
268
|
expect(exactOptionalSchema.safeParse({ a: undefined }).success).toEqual(false);
|
|
269
269
|
});
|
|
270
270
|
|
|
271
|
-
// Defensive inference coverage: every schema that propagates `optout` participates
|
|
272
|
-
// in object-key optionality inference. If anyone ever changes the set of values that
|
|
273
|
-
// `optout` can take (or how OptionalOutSchema matches them), these assertions must
|
|
274
|
-
// continue to hold or downstream `z.infer<typeof obj>` types silently flip required keys.
|
|
271
|
+
// Defensive inference coverage: every schema that propagates `optout` participates in object-key optionality inference. If anyone ever changes the set of values that `optout` can take (or how OptionalOutSchema matches them), these assertions must continue to hold or downstream `z.infer<typeof obj>` types silently flip required keys.
|
|
275
272
|
test("object key optionality through optout propagation", () => {
|
|
276
273
|
const direct = z.object({ k: z.string().optional() });
|
|
277
274
|
expectTypeOf<z.infer<typeof direct>>().toEqualTypeOf<{ k?: string | undefined }>();
|
|
@@ -317,9 +314,7 @@ test("object key optionality through optout propagation", () => {
|
|
|
317
314
|
}>();
|
|
318
315
|
});
|
|
319
316
|
|
|
320
|
-
// Defensive: tuple optional-tail inference also reads optout. The PR that introduced
|
|
321
|
-
// `"includeUndefined"` had to update TupleOutputTypeWithOptionals; pin the result so
|
|
322
|
-
// any future flag change has to keep this contract.
|
|
317
|
+
// Defensive: tuple optional-tail inference also reads optout. The PR that introduced `"includeUndefined"` had to update TupleOutputTypeWithOptionals; pin the result so any future flag change has to keep this contract.
|
|
323
318
|
test("tuple tail optionality through optout propagation", () => {
|
|
324
319
|
const trailingOptional = z.tuple([z.string(), z.number().optional()]);
|
|
325
320
|
expectTypeOf<z.output<typeof trailingOptional>>().toEqualTypeOf<[string, (number | undefined)?]>();
|
|
@@ -331,3 +326,41 @@ test("tuple tail optionality through optout propagation", () => {
|
|
|
331
326
|
const interiorOptional = z.tuple([z.string(), z.number().optional(), z.string()]);
|
|
332
327
|
expectTypeOf<z.output<typeof interiorOptional>>().toEqualTypeOf<[string, number | undefined, string]>();
|
|
333
328
|
});
|
|
329
|
+
|
|
330
|
+
// An absent optional key whose check fails has its issue swallowed; the value the check wrote must go with it, on the JIT fastpass as well as the interpreted path.
|
|
331
|
+
test("swallowed issue on an absent optional key drops its value", async () => {
|
|
332
|
+
const schema = z.object({
|
|
333
|
+
a: z
|
|
334
|
+
.string()
|
|
335
|
+
.optional()
|
|
336
|
+
.superRefine((_v, ctx) => {
|
|
337
|
+
ctx.addIssue({ code: "custom", message: "bad" });
|
|
338
|
+
ctx.value = "leaked";
|
|
339
|
+
}),
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
for (const result of [
|
|
343
|
+
schema.safeParse({}),
|
|
344
|
+
schema.safeParse({}, { jitless: true }),
|
|
345
|
+
await schema.safeParseAsync({}),
|
|
346
|
+
]) {
|
|
347
|
+
expect(result.success).toEqual(true);
|
|
348
|
+
expect("a" in result.data!).toEqual(false);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// A present key keeps both the issue and its value.
|
|
352
|
+
expect(schema.safeParse({ a: "x" }).success).toEqual(false);
|
|
353
|
+
expect(schema.safeParse({ a: "x" }, { jitless: true }).success).toEqual(false);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
test("optional does not swallow an issue it did not cause", () => {
|
|
357
|
+
// A pipe hands its `out` schema the caller's issues array so an unrecognized key can survive to an enclosing intersection. A defaulted inner substituting for absence must not read that as its own failing and drop it.
|
|
358
|
+
const result = z
|
|
359
|
+
.strictObject({ a: z.string() })
|
|
360
|
+
.transform((): number | undefined => undefined)
|
|
361
|
+
.pipe(z.number().default(5).optional())
|
|
362
|
+
.safeParse({ a: "x", extra: 1 });
|
|
363
|
+
|
|
364
|
+
expect(result.success).toBe(false);
|
|
365
|
+
expect(result.error!.issues.map((i) => i.code)).toEqual(["unrecognized_keys"]);
|
|
366
|
+
});
|