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