@openclaw/slack 2026.9.5 → 2026.9.7
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/icon.png +0 -0
- package/dist/.setup/{account-inspect-B86OaUEt.mjs → account-inspect-DWBXpER6.mjs} +1 -1
- package/dist/.setup/{accounts-C1FspRF-.mjs → accounts-D_N9IqNA.mjs} +33 -10
- package/dist/.setup/{action-runtime-Aa-h24Fq.mjs → action-runtime-DfWvuiZd.mjs} +46 -65
- package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +2 -0
- package/dist/.setup/{actions-BvGUGk3w.mjs → actions-Df0CzcDl.mjs} +148 -204
- package/dist/.setup/{approval-handler.runtime-BcZNF-VP.mjs → approval-handler.runtime-Ed6Sw5VK.mjs} +37 -47
- package/dist/.setup/{approval-message-updates-Cy1cxfBn.mjs → approval-message-updates-BadvtA7R.mjs} +1 -2
- package/dist/.setup/{channel-DrBm0NFw.mjs → channel-C7bgPSTE.mjs} +192 -280
- package/dist/.setup/channel-meta-C443t-lI.mjs +27 -0
- package/dist/.setup/{channel-type-osC0XOES.mjs → channel-type-ClOttrZ5.mjs} +13 -21
- package/dist/.setup/{channel.setup-BSY5hzVz.mjs → channel.setup-Dh2jzAjN.mjs} +35 -42
- package/dist/.setup/{config-schema-DrY3S7Ee.mjs → config-schema-BZCxmHKG.mjs} +32 -21
- package/dist/.setup/{directory-config-CTs7YyuU.mjs → directory-config-BOUWH3hR.mjs} +7 -10
- package/dist/.setup/{directory-live-Btq0063Q.mjs → directory-live-B2O4B_Ho.mjs} +9 -21
- package/dist/.setup/doctor-contract-CRN1Z_c7.mjs +342 -0
- package/dist/.setup/{message-tool-api-DRnDCVdY.mjs → message-tool-api-Cu4lwlGy.mjs} +34 -48
- package/dist/.setup/{provider-w36VTgZ3.mjs → monitor-BPVfkumU.mjs} +2191 -2704
- package/dist/.setup/{outbound-adapter-K3Ek1iSR.mjs → outbound-adapter-Bv48XUjq.mjs} +10 -21
- package/dist/.setup/{pipeline.runtime-BZqGcbfi.mjs → pipeline.runtime-B1H63Frf.mjs} +901 -892
- package/dist/.setup/{plugin-routes-C3X0eVaK.mjs → plugin-routes-B8tooDLj.mjs} +1 -1
- package/dist/.setup/{policy-Db_QWCZZ.mjs → policy-D-jfM174.mjs} +5 -5
- package/dist/.setup/{probe-64C6k3_Q.mjs → probe-B2Y9qc_z.mjs} +101 -39
- package/dist/.setup/{registry-bbjH7IHX.mjs → registry-CIbMfuf8.mjs} +6 -2
- package/dist/.setup/{relay-source-CDqY76Vp.mjs → relay-source-BpKdjsll.mjs} +10 -12
- package/dist/.setup/{replies-CWFhjS9S.mjs → replies-BAnUtr2f.mjs} +16 -76
- package/dist/.setup/{reply-blocks-9uCeAJts.mjs → reply-blocks-SE1kTE3I.mjs} +27 -154
- package/dist/.setup/{resolve-channels-x8fX1SEt.mjs → resolve-channels-XXBn8UU_.mjs} +4 -5
- package/dist/.setup/{resolve-users-B8BpBnH2.mjs → resolve-users-DW0ngD03.mjs} +20 -22
- package/dist/.setup/{scopes-CJ-6l4v4.mjs → scopes-CasuDvaa.mjs} +6 -17
- package/dist/.setup/{secret-contract-DxmvbxBF.mjs → secret-contract-BaZcu6P_.mjs} +15 -20
- package/dist/.setup/{secret-contract-api-D9UfYujm.mjs → secret-contract-api-Dp6290Vg.mjs} +1 -1
- package/dist/.setup/{security-audit-BypHqcq5.mjs → security-audit-BqDc-6VL.mjs} +1 -1
- package/dist/.setup/{send-6GCb3lBP.mjs → send-BOVLQi3n.mjs} +102 -199
- package/dist/.setup/{session-status-BhG6pdiH.mjs → session-status-DscajIsd.mjs} +323 -250
- package/dist/.setup/{setup-plugin-api-DtCEByQB.mjs → setup-plugin-api-DTtbTKNk.mjs} +1 -1
- package/dist/.setup/{setup-surface-DsE0hsYY.mjs → setup-surface-Dn7QgWRE.mjs} +24 -56
- package/dist/.setup/{shared-BNmqCPgQ.mjs → shared-qau-uDGl.mjs} +30 -56
- package/dist/.setup/{slash-dispatch.runtime-Io4ASZsY.mjs → slash-dispatch.runtime--AEzLVBF.mjs} +1 -1
- package/dist/.setup/{streaming-compat-B-e0mqM0.mjs → streaming-compat-C5Wut626.mjs} +31 -8
- package/dist/.setup/{target-parsing-DEsPjngB.mjs → target-parsing-FFE26kOV.mjs} +1 -7
- package/dist/.setup/{targets-Cku2KCvg.mjs → targets-C6LZQL1Q.mjs} +1 -1
- package/dist/.setup/{thread-ts-CukseRVL.mjs → thread-ts-Cvt7WD6B.mjs} +0 -1
- package/dist/account-inspect-api.js +1 -1
- package/dist/api.js +18 -17
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/http-routes-api.js +1 -1
- package/dist/index.js +1 -1
- package/dist/message-tool-api.js +1 -1
- package/dist/runtime-api.js +11 -12
- package/dist/secret-contract-api.js +1 -1
- package/dist/security-contract-api.js +1 -1
- package/dist/setup-entry.js +2 -2
- package/dist/setup-plugin-api.js +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/bolt/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/bolt/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/bolt/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/web-globals/streams.d.ts +4 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/web-api/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/web-api/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/web-api/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/web-globals/streams.d.ts +4 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/get-east-asian-width/index.js +8 -3
- package/node_modules/get-east-asian-width/lookup-data.js +1 -1
- package/node_modules/get-east-asian-width/lookup.js +4 -4
- package/node_modules/get-east-asian-width/package.json +1 -1
- package/node_modules/typebox/build/compile/code.mjs +1 -2
- package/node_modules/typebox/build/compile/validator.mjs +5 -1
- package/node_modules/typebox/build/format/iri.mjs +16 -9
- package/node_modules/typebox/build/guard/emit.mjs +2 -2
- package/node_modules/typebox/build/guard/guard.d.mts +7 -5
- package/node_modules/typebox/build/guard/guard.mjs +14 -9
- package/node_modules/typebox/build/guard/index.mjs +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
- package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/node_modules/typebox/build/schema/build.mjs +2 -3
- package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
- package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
- package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
- package/node_modules/typebox/build/schema/parse.mjs +3 -0
- package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
- package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
- package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
- package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
- package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
- package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
- package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
- package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
- package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
- package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +3 -1
- package/node_modules/undici/README.md +81 -25
- package/node_modules/undici/docs/docs/api/Agent.md +249 -42
- package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
- package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
- package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
- package/node_modules/undici/docs/docs/api/Client.md +407 -162
- package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
- package/node_modules/undici/docs/docs/api/Connector.md +118 -35
- package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
- package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
- package/node_modules/undici/docs/docs/api/Debug.md +34 -18
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
- package/node_modules/undici/docs/docs/api/Dispatcher.md +490 -1055
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +105 -93
- package/node_modules/undici/docs/docs/api/Errors.md +503 -28
- package/node_modules/undici/docs/docs/api/EventSource.md +326 -13
- package/node_modules/undici/docs/docs/api/Fetch.md +681 -30
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -96
- package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
- package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
- package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
- package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
- package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
- package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
- package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
- package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
- package/node_modules/undici/docs/docs/api/Pool.md +236 -41
- package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -55
- package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -27
- package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -79
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +262 -517
- package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
- package/node_modules/undici/docs/docs/api/Util.md +68 -11
- package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
- package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
- package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
- package/node_modules/undici/docs/docs/getting-started.md +281 -0
- package/node_modules/undici/docs/docs/index.md +784 -0
- package/node_modules/undici/docs/docs/site.json +125 -0
- package/node_modules/undici/docs/docs/type-map.json +79 -0
- package/node_modules/undici/index.js +4 -2
- package/node_modules/undici/lib/api/api-connect.js +13 -11
- package/node_modules/undici/lib/api/api-pipeline.js +26 -13
- package/node_modules/undici/lib/api/api-request.js +51 -21
- package/node_modules/undici/lib/api/api-stream.js +81 -20
- package/node_modules/undici/lib/api/api-upgrade.js +21 -11
- package/node_modules/undici/lib/api/readable.js +45 -9
- package/node_modules/undici/lib/cache/memory-cache-store.js +3 -3
- package/node_modules/undici/lib/cache/sqlite-cache-store.js +3 -1
- package/node_modules/undici/lib/core/connect.js +46 -7
- package/node_modules/undici/lib/core/constants.js +1 -24
- package/node_modules/undici/lib/core/errors.js +22 -2
- package/node_modules/undici/lib/core/request.js +100 -18
- package/node_modules/undici/lib/core/symbols.js +4 -0
- package/node_modules/undici/lib/core/util.js +105 -48
- package/node_modules/undici/lib/dispatcher/agent.js +51 -32
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +23 -27
- package/node_modules/undici/lib/dispatcher/client-h1.js +86 -24
- package/node_modules/undici/lib/dispatcher/client-h2.js +1091 -361
- package/node_modules/undici/lib/dispatcher/client.js +109 -36
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +19 -6
- package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -5
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +110 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
- package/node_modules/undici/lib/dispatcher/h2c-client.js +4 -4
- package/node_modules/undici/lib/dispatcher/pool-base.js +28 -10
- package/node_modules/undici/lib/dispatcher/pool.js +30 -5
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +95 -19
- package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
- package/node_modules/undici/lib/dispatcher/round-robin-pool.js +32 -10
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +153 -63
- package/node_modules/undici/lib/global.js +37 -14
- package/node_modules/undici/lib/handler/cache-handler.js +49 -7
- package/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
- package/node_modules/undici/lib/handler/decorator-handler.js +8 -3
- package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/undici/lib/handler/redirect-handler.js +66 -66
- package/node_modules/undici/lib/handler/retry-handler.js +191 -50
- package/node_modules/undici/lib/interceptor/cache.js +75 -25
- package/node_modules/undici/lib/interceptor/decompress.js +5 -2
- package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
- package/node_modules/undici/lib/interceptor/dns.js +12 -1
- package/node_modules/undici/lib/interceptor/redirect.js +3 -3
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -1
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -1
- package/node_modules/undici/lib/mock/mock-agent.js +21 -9
- package/node_modules/undici/lib/mock/mock-call-history.js +1 -1
- package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/node_modules/undici/lib/mock/mock-utils.js +281 -47
- package/node_modules/undici/lib/mock/snapshot-agent.js +25 -7
- package/node_modules/undici/lib/mock/snapshot-recorder.js +38 -3
- package/node_modules/undici/lib/util/cache.js +92 -10
- package/node_modules/undici/lib/util/runtime-features.js +3 -34
- package/node_modules/undici/lib/web/cache/cache.js +6 -8
- package/node_modules/undici/lib/web/cookies/parse.js +150 -146
- package/node_modules/undici/lib/web/cookies/util.js +1 -1
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +20 -21
- package/node_modules/undici/lib/web/eventsource/util.js +32 -1
- package/node_modules/undici/lib/web/fetch/body.js +48 -10
- package/node_modules/undici/lib/web/fetch/constants.js +1 -1
- package/node_modules/undici/lib/web/fetch/formdata.js +21 -2
- package/node_modules/undici/lib/web/fetch/index.js +242 -223
- package/node_modules/undici/lib/web/fetch/request.js +35 -6
- package/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/node_modules/undici/lib/web/fetch/util.js +10 -2
- package/node_modules/undici/lib/web/webidl/index.js +5 -7
- package/node_modules/undici/lib/web/websocket/frame.js +1 -7
- package/node_modules/undici/lib/web/websocket/receiver.js +1 -1
- package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +10 -10
- package/node_modules/undici/lib/web/websocket/websocket.js +25 -3
- package/node_modules/undici/package.json +10 -10
- package/node_modules/undici/types/agent.d.ts +0 -2
- package/node_modules/undici/types/client.d.ts +69 -24
- 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 +8 -30
- package/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
- 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/formdata.d.ts +0 -6
- package/node_modules/undici/types/h2c-client.d.ts +6 -6
- package/node_modules/undici/types/handlers.d.ts +2 -0
- package/node_modules/undici/types/header.d.ts +5 -0
- package/node_modules/undici/types/index.d.ts +3 -1
- package/node_modules/undici/types/interceptors.d.ts +1 -1
- package/node_modules/undici/types/mock-agent.d.ts +11 -10
- package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/node_modules/undici/types/pool.d.ts +0 -2
- package/node_modules/undici/types/proxy-agent.d.ts +9 -2
- package/node_modules/undici/types/round-robin-pool.d.ts +0 -2
- package/node_modules/undici/types/snapshot-agent.d.ts +4 -0
- package/node_modules/undici/types/socks5-proxy-agent.d.ts +4 -2
- package/node_modules/undici/types/webidl.d.ts +0 -1
- 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/openclaw.plugin.json +49 -3
- package/package.json +8 -8
- package/dist/.setup/accounts.runtime-BpWv-6-2.mjs +0 -2
- package/dist/.setup/action-runtime.runtime-DwH3NdpT.mjs +0 -2
- package/dist/.setup/doctor-contract-CtMUqjvk.mjs +0 -186
- package/dist/.setup/monitor-Dw5uuKWM.mjs +0 -13
- package/dist/.setup/rolldown-runtime-D7D4PA-g.mjs +0 -13
- package/dist/.setup/send.runtime-BmqRP-WG.mjs +0 -2
- package/dist/.setup/slash-commands.runtime-BpSH0b3q.mjs +0 -2
- package/dist/.setup/slash-skill-commands.runtime-Bi1JWZHY.mjs +0 -2
- package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
- package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/util/promise.js +0 -28
- /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
|
@@ -1,616 +1,361 @@
|
|
|
1
1
|
# SnapshotAgent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!--introduced_in=v7.13.0-->
|
|
4
|
+
<!--type=module-->
|
|
5
|
+
<!-- source_link=lib/mock/snapshot-agent.js -->
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
> Stability: 1 - Experimental
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
`SnapshotAgent` records real HTTP responses and replays them on later requests,
|
|
10
|
+
allowing tests to run against deterministic, captured data instead of a live
|
|
11
|
+
network. It extends [`MockAgent`][], so it can be installed with
|
|
12
|
+
[`setGlobalDispatcher()`][] or passed explicitly through the `dispatcher`
|
|
13
|
+
option, and it works with every undici API (`fetch`, `request`, `stream`,
|
|
14
|
+
`pipeline`, and so on).
|
|
11
15
|
|
|
12
|
-
|
|
16
|
+
A `SnapshotAgent` operates in one of three modes. In `'record'` mode it performs
|
|
17
|
+
real requests and writes the responses to a snapshot file. In `'playback'` mode
|
|
18
|
+
it serves responses from the snapshot file without touching the network. In
|
|
19
|
+
`'update'` mode it replays existing snapshots and records any request that has no
|
|
20
|
+
matching snapshot.
|
|
13
21
|
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### Parameters
|
|
19
|
-
|
|
20
|
-
- **options** `Object` (optional)
|
|
21
|
-
- **mode** `String` - The snapshot mode: `'record'`, `'playback'`, or `'update'`. Default: `'record'`
|
|
22
|
-
- **snapshotPath** `String` - Path to the snapshot file for loading/saving
|
|
23
|
-
- **maxSnapshots** `Number` - Maximum number of snapshots to keep in memory. Default: `Infinity`
|
|
24
|
-
- **autoFlush** `Boolean` - Whether to automatically save snapshots to disk. Default: `false`
|
|
25
|
-
- **flushInterval** `Number` - Interval in milliseconds for auto-flush. Default: `30000`
|
|
26
|
-
- **matchHeaders** `Array<String>` - Specific headers to include in request matching. Default: all headers
|
|
27
|
-
- **ignoreHeaders** `Array<String>` - Headers to ignore during request matching
|
|
28
|
-
- **excludeHeaders** `Array<String>` - Headers to exclude from snapshots (for security)
|
|
29
|
-
- **matchBody** `Boolean` - Whether to include request body in matching. Default: `true`
|
|
30
|
-
- **matchQuery** `Boolean` - Whether to include query parameters in matching. Default: `true`
|
|
31
|
-
- **caseSensitive** `Boolean` - Whether header matching is case-sensitive. Default: `false`
|
|
32
|
-
- **shouldRecord** `Function` - Callback to determine if a request should be recorded
|
|
33
|
-
- **shouldPlayback** `Function` - Callback to determine if a request should be played back
|
|
34
|
-
- **excludeUrls** `Array` - URL patterns (strings or RegExp) to exclude from recording/playback
|
|
35
|
-
- All other options from `MockAgent` are supported
|
|
36
|
-
|
|
37
|
-
### Modes
|
|
38
|
-
|
|
39
|
-
#### Record Mode (`'record'`)
|
|
40
|
-
Makes real HTTP requests and saves the responses to snapshots.
|
|
41
|
-
|
|
42
|
-
```javascript
|
|
43
|
-
import { SnapshotAgent, setGlobalDispatcher } from 'undici'
|
|
22
|
+
```mjs
|
|
23
|
+
import { SnapshotAgent, setGlobalDispatcher, fetch } from 'undici'
|
|
44
24
|
|
|
45
|
-
const agent = new SnapshotAgent({
|
|
25
|
+
const agent = new SnapshotAgent({
|
|
46
26
|
mode: 'record',
|
|
47
|
-
snapshotPath: './
|
|
27
|
+
snapshotPath: './snapshots/api.json'
|
|
48
28
|
})
|
|
49
29
|
setGlobalDispatcher(agent)
|
|
50
30
|
|
|
51
|
-
// Makes real requests and records them
|
|
52
31
|
const response = await fetch('https://api.example.com/users')
|
|
53
32
|
const users = await response.json()
|
|
54
33
|
|
|
55
|
-
|
|
56
|
-
await agent.saveSnapshots()
|
|
34
|
+
await agent.close()
|
|
57
35
|
```
|
|
58
36
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
37
|
+
Constructing a `SnapshotAgent` emits an `ExperimentalWarning` once per process.
|
|
38
|
+
|
|
39
|
+
## Class: `SnapshotAgent`
|
|
40
|
+
|
|
41
|
+
<!-- YAML
|
|
42
|
+
added: v7.13.0
|
|
43
|
+
-->
|
|
44
|
+
|
|
45
|
+
* Extends: {MockAgent}
|
|
46
|
+
|
|
47
|
+
The captured interactions are managed by an internal `SnapshotRecorder`, which
|
|
48
|
+
is accessible through [`agent.getRecorder()`][]. Because `SnapshotAgent` extends
|
|
49
|
+
[`MockAgent`][], all `MockAgent` and [`Dispatcher`][] methods and events are also
|
|
50
|
+
available.
|
|
51
|
+
|
|
52
|
+
### `new SnapshotAgent([options])`
|
|
53
|
+
|
|
54
|
+
<!-- YAML
|
|
55
|
+
added: v7.13.0
|
|
56
|
+
-->
|
|
57
|
+
|
|
58
|
+
* `options` {Object} (optional) Accepts all [`MockAgent`][] options plus the
|
|
59
|
+
following snapshot-specific options.
|
|
60
|
+
* `mode` {string} The snapshot mode. One of `'record'`, `'playback'`, or
|
|
61
|
+
`'update'`. **Default:** `'record'`.
|
|
62
|
+
* `snapshotPath` {string} Path to the snapshot file used for loading and
|
|
63
|
+
saving. Required when `mode` is `'playback'` or `'update'`. **Default:**
|
|
64
|
+
`null`.
|
|
65
|
+
* `maxSnapshots` {number} Maximum number of snapshots to keep in memory.
|
|
66
|
+
**Default:** `Infinity`.
|
|
67
|
+
* `autoFlush` {boolean} When `true`, snapshots are written to `snapshotPath`
|
|
68
|
+
automatically as they are recorded. **Default:** `false`.
|
|
69
|
+
* `flushInterval` {number} Interval, in milliseconds, between automatic flushes
|
|
70
|
+
when `autoFlush` is enabled. **Default:** `30000`.
|
|
71
|
+
* `matchHeaders` {string[]} Names of the only headers to include when matching
|
|
72
|
+
a request against a snapshot. When omitted, all headers are matched.
|
|
73
|
+
* `ignoreHeaders` {string[]} Header names to ignore when matching a request.
|
|
74
|
+
* `excludeHeaders` {string[]} Header names to strip from snapshots entirely,
|
|
75
|
+
so that sensitive values are never written to disk.
|
|
76
|
+
* `matchBody` {boolean} When `true`, the request body is included in request
|
|
77
|
+
matching. **Default:** `true`.
|
|
78
|
+
* `normalizeBody` {Function} Normalizes the request body before it is matched
|
|
79
|
+
or stored, for example to strip volatile fields such as timestamps. Only
|
|
80
|
+
applied when `matchBody` is `true`.
|
|
81
|
+
* `body` {string|Buffer|null|undefined} The raw request body.
|
|
82
|
+
* Returns: {string} The normalized body used for matching.
|
|
83
|
+
* `matchQuery` {boolean} When `true`, query parameters are included in request
|
|
84
|
+
matching. **Default:** `true`.
|
|
85
|
+
* `normalizeQuery` {Function} Normalizes the query string before it is matched,
|
|
86
|
+
for example to strip cache-busting parameters. Only applied when `matchQuery`
|
|
87
|
+
is `true`.
|
|
88
|
+
* `query` {URLSearchParams} The parsed query parameters.
|
|
89
|
+
* Returns: {string} The normalized query string used for matching.
|
|
90
|
+
* `caseSensitive` {boolean} When `true`, header matching is case-sensitive.
|
|
91
|
+
**Default:** `false`.
|
|
92
|
+
* `shouldRecord` {Function} Decides whether a given request is recorded. Only
|
|
93
|
+
used in `'record'` and `'update'` modes.
|
|
94
|
+
* `requestOpts` {Object} The dispatch options of the request.
|
|
95
|
+
* Returns: {boolean} `true` to record the request.
|
|
96
|
+
* `shouldPlayback` {Function} Decides whether a given request is served from a
|
|
97
|
+
snapshot. Only used in `'playback'` and `'update'` modes.
|
|
98
|
+
* `requestOpts` {Object} The dispatch options of the request.
|
|
99
|
+
* Returns: {boolean} `true` to play the request back from a snapshot.
|
|
100
|
+
* `excludeUrls` {Array<string|RegExp>} URL patterns that are excluded from
|
|
101
|
+
recording and playback. String patterns match case-insensitively as
|
|
102
|
+
substrings of the URL; `RegExp` patterns are tested against the URL. Matching
|
|
103
|
+
requests are passed through to a real [`Agent`][] instead.
|
|
104
|
+
|
|
105
|
+
Creates a new `SnapshotAgent`. Throws an [`InvalidArgumentError`][] when `mode`
|
|
106
|
+
is `'playback'` or `'update'` and `snapshotPath` is not provided, and throws an
|
|
107
|
+
`InvalidArgumentError` when `mode` is not one of the supported values.
|
|
108
|
+
|
|
109
|
+
When `mode` is `'playback'` or `'update'` and `snapshotPath` is set, snapshots
|
|
110
|
+
are loaded from the file automatically; a missing file is ignored until the first
|
|
111
|
+
request requires it.
|
|
112
|
+
|
|
113
|
+
```mjs
|
|
63
114
|
import { SnapshotAgent, setGlobalDispatcher } from 'undici'
|
|
64
115
|
|
|
65
116
|
const agent = new SnapshotAgent({
|
|
66
117
|
mode: 'playback',
|
|
67
|
-
snapshotPath: './
|
|
68
|
-
})
|
|
69
|
-
setGlobalDispatcher(agent)
|
|
70
|
-
|
|
71
|
-
// Uses recorded response instead of real request
|
|
72
|
-
const response = await fetch('https://api.example.com/users')
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
#### Update Mode (`'update'`)
|
|
76
|
-
Uses existing snapshots when available, but records new ones for missing requests.
|
|
77
|
-
|
|
78
|
-
```javascript
|
|
79
|
-
import { SnapshotAgent, setGlobalDispatcher } from 'undici'
|
|
80
|
-
|
|
81
|
-
const agent = new SnapshotAgent({
|
|
82
|
-
mode: 'update',
|
|
83
|
-
snapshotPath: './test/snapshots/api-calls.json'
|
|
118
|
+
snapshotPath: './snapshots/api.json'
|
|
84
119
|
})
|
|
85
120
|
setGlobalDispatcher(agent)
|
|
86
|
-
|
|
87
|
-
// Uses snapshot if exists, otherwise makes real request and records it
|
|
88
|
-
const response = await fetch('https://api.example.com/new-endpoint')
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Instance Methods
|
|
92
|
-
|
|
93
|
-
### `agent.saveSnapshots([filePath])`
|
|
94
|
-
|
|
95
|
-
Saves all recorded snapshots to a file.
|
|
96
|
-
|
|
97
|
-
#### Parameters
|
|
98
|
-
|
|
99
|
-
- **filePath** `String` (optional) - Path to save snapshots. Uses constructor `snapshotPath` if not provided.
|
|
100
|
-
|
|
101
|
-
#### Returns
|
|
102
|
-
|
|
103
|
-
`Promise<void>`
|
|
104
|
-
|
|
105
|
-
```javascript
|
|
106
|
-
await agent.saveSnapshots('./custom-snapshots.json')
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Advanced Configuration
|
|
110
|
-
|
|
111
|
-
### Header Filtering
|
|
112
|
-
|
|
113
|
-
Control which headers are used for request matching and what gets stored in snapshots:
|
|
114
|
-
|
|
115
|
-
```javascript
|
|
116
|
-
const agent = new SnapshotAgent({
|
|
117
|
-
mode: 'record',
|
|
118
|
-
snapshotPath: './snapshots.json',
|
|
119
|
-
|
|
120
|
-
// Only match these specific headers
|
|
121
|
-
matchHeaders: ['content-type', 'accept'],
|
|
122
|
-
|
|
123
|
-
// Ignore these headers during matching (but still store them)
|
|
124
|
-
ignoreHeaders: ['user-agent', 'date'],
|
|
125
|
-
|
|
126
|
-
// Exclude sensitive headers from snapshots entirely
|
|
127
|
-
excludeHeaders: ['authorization', 'x-api-key', 'cookie']
|
|
128
|
-
})
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Custom Request/Response Filtering
|
|
132
|
-
|
|
133
|
-
Use callback functions to determine what gets recorded or played back:
|
|
134
|
-
|
|
135
|
-
```javascript
|
|
136
|
-
const agent = new SnapshotAgent({
|
|
137
|
-
mode: 'record',
|
|
138
|
-
snapshotPath: './snapshots.json',
|
|
139
|
-
|
|
140
|
-
// Only record GET requests to specific endpoints
|
|
141
|
-
shouldRecord: (requestOpts) => {
|
|
142
|
-
const url = new URL(requestOpts.path, requestOpts.origin)
|
|
143
|
-
return requestOpts.method === 'GET' && url.pathname.startsWith('/api/v1/')
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
// Skip authentication endpoints during playback
|
|
147
|
-
shouldPlayback: (requestOpts) => {
|
|
148
|
-
const url = new URL(requestOpts.path, requestOpts.origin)
|
|
149
|
-
return !url.pathname.includes('/auth/')
|
|
150
|
-
}
|
|
151
|
-
})
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### URL Pattern Exclusion
|
|
155
|
-
|
|
156
|
-
Exclude specific URLs from recording/playback using patterns:
|
|
157
|
-
|
|
158
|
-
```javascript
|
|
159
|
-
const agent = new SnapshotAgent({
|
|
160
|
-
mode: 'record',
|
|
161
|
-
snapshotPath: './snapshots.json',
|
|
162
|
-
|
|
163
|
-
excludeUrls: [
|
|
164
|
-
'https://analytics.example.com', // String match
|
|
165
|
-
/\/api\/v\d+\/health/, // Regex pattern
|
|
166
|
-
'telemetry' // Substring match
|
|
167
|
-
]
|
|
168
|
-
})
|
|
169
121
|
```
|
|
170
122
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
Configure automatic memory and disk management:
|
|
174
|
-
|
|
175
|
-
```javascript
|
|
176
|
-
const agent = new SnapshotAgent({
|
|
177
|
-
mode: 'record',
|
|
178
|
-
snapshotPath: './snapshots.json',
|
|
179
|
-
|
|
180
|
-
// Keep only 1000 snapshots in memory
|
|
181
|
-
maxSnapshots: 1000,
|
|
182
|
-
|
|
183
|
-
// Automatically save to disk every 30 seconds
|
|
184
|
-
autoFlush: true,
|
|
185
|
-
flushInterval: 30000
|
|
186
|
-
})
|
|
187
|
-
```
|
|
123
|
+
The mode controls how requests are handled:
|
|
188
124
|
|
|
189
|
-
|
|
125
|
+
* `'record'` performs the real request and stores the response.
|
|
190
126
|
|
|
191
|
-
|
|
127
|
+
```mjs
|
|
128
|
+
import { SnapshotAgent, setGlobalDispatcher, fetch } from 'undici'
|
|
192
129
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
130
|
+
const agent = new SnapshotAgent({
|
|
131
|
+
mode: 'record',
|
|
132
|
+
snapshotPath: './snapshots/api.json'
|
|
133
|
+
})
|
|
134
|
+
setGlobalDispatcher(agent)
|
|
196
135
|
|
|
197
|
-
|
|
198
|
-
await
|
|
136
|
+
await fetch('https://api.example.com/users')
|
|
137
|
+
await agent.saveSnapshots()
|
|
138
|
+
```
|
|
199
139
|
|
|
200
|
-
|
|
201
|
-
|
|
140
|
+
* `'playback'` serves the recorded response without any network access. A
|
|
141
|
+
request with no matching snapshot rejects with an [`UndiciError`][] whose
|
|
142
|
+
message begins with `No snapshot found`.
|
|
202
143
|
|
|
203
|
-
|
|
144
|
+
```mjs
|
|
145
|
+
import { SnapshotAgent, setGlobalDispatcher, fetch } from 'undici'
|
|
204
146
|
|
|
205
|
-
|
|
206
|
-
|
|
147
|
+
const agent = new SnapshotAgent({
|
|
148
|
+
mode: 'playback',
|
|
149
|
+
snapshotPath: './snapshots/api.json'
|
|
150
|
+
})
|
|
151
|
+
setGlobalDispatcher(agent)
|
|
207
152
|
|
|
208
|
-
|
|
209
|
-
|
|
153
|
+
const response = await fetch('https://api.example.com/users')
|
|
154
|
+
```
|
|
210
155
|
|
|
211
|
-
|
|
212
|
-
|
|
156
|
+
* `'update'` replays an existing snapshot when one is found and otherwise records
|
|
157
|
+
the request like `'record'` mode.
|
|
213
158
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
```
|
|
159
|
+
```mjs
|
|
160
|
+
import { SnapshotAgent, setGlobalDispatcher, fetch } from 'undici'
|
|
217
161
|
|
|
218
|
-
|
|
162
|
+
const agent = new SnapshotAgent({
|
|
163
|
+
mode: 'update',
|
|
164
|
+
snapshotPath: './snapshots/api.json'
|
|
165
|
+
})
|
|
166
|
+
setGlobalDispatcher(agent)
|
|
219
167
|
|
|
220
|
-
|
|
168
|
+
await fetch('https://api.example.com/new-endpoint')
|
|
169
|
+
```
|
|
221
170
|
|
|
222
|
-
|
|
223
|
-
// Load existing snapshots
|
|
224
|
-
await agent.loadSnapshots('./old-snapshots.json')
|
|
171
|
+
### `agent.loadSnapshots([filePath])`
|
|
225
172
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
173
|
+
<!-- YAML
|
|
174
|
+
added: v7.13.0
|
|
175
|
+
-->
|
|
229
176
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
)
|
|
177
|
+
* `filePath` {string} (optional) Path to read snapshots from. **Default:** the
|
|
178
|
+
`snapshotPath` given to the constructor.
|
|
179
|
+
* Returns: {Promise<void>} Resolves when the snapshots have been loaded.
|
|
234
180
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
snapshot
|
|
239
|
-
})))
|
|
181
|
+
Loads snapshots from disk into memory. In `'playback'` mode this also installs
|
|
182
|
+
the corresponding [`MockAgent`][] interceptors so that subsequent requests are
|
|
183
|
+
matched against the loaded snapshots.
|
|
240
184
|
|
|
241
|
-
|
|
242
|
-
await agent.
|
|
185
|
+
```mjs
|
|
186
|
+
await agent.loadSnapshots('./snapshots/api.json')
|
|
243
187
|
```
|
|
244
188
|
|
|
245
|
-
### `agent.
|
|
246
|
-
|
|
247
|
-
Loads snapshots from a file.
|
|
248
|
-
|
|
249
|
-
#### Parameters
|
|
189
|
+
### `agent.saveSnapshots([filePath])`
|
|
250
190
|
|
|
251
|
-
|
|
191
|
+
<!-- YAML
|
|
192
|
+
added: v7.13.0
|
|
193
|
+
-->
|
|
252
194
|
|
|
253
|
-
|
|
195
|
+
* `filePath` {string} (optional) Path to write snapshots to. **Default:** the
|
|
196
|
+
`snapshotPath` given to the constructor.
|
|
197
|
+
* Returns: {Promise<void>} Resolves when the snapshots have been written.
|
|
254
198
|
|
|
255
|
-
|
|
199
|
+
Writes all recorded snapshots to disk.
|
|
256
200
|
|
|
257
|
-
```
|
|
258
|
-
await agent.
|
|
201
|
+
```mjs
|
|
202
|
+
await agent.saveSnapshots('./snapshots/api.json')
|
|
259
203
|
```
|
|
260
204
|
|
|
261
205
|
### `agent.getRecorder()`
|
|
262
206
|
|
|
263
|
-
|
|
207
|
+
<!-- YAML
|
|
208
|
+
added: v7.13.0
|
|
209
|
+
-->
|
|
264
210
|
|
|
265
|
-
|
|
211
|
+
* Returns: {SnapshotRecorder} The internal recorder that stores the captured
|
|
212
|
+
interactions.
|
|
266
213
|
|
|
267
|
-
`SnapshotRecorder
|
|
214
|
+
Returns the underlying `SnapshotRecorder`. The recorder exposes lower-level
|
|
215
|
+
operations over the captured data, including `record()`, `findSnapshot()`,
|
|
216
|
+
`getSnapshots()`, `size()`, and `clear()`. The recorder is an internal type
|
|
217
|
+
returned for inspection; it is not exported from the package root.
|
|
268
218
|
|
|
269
|
-
```
|
|
219
|
+
```mjs
|
|
270
220
|
const recorder = agent.getRecorder()
|
|
271
221
|
console.log(`Recorded ${recorder.size()} interactions`)
|
|
272
222
|
```
|
|
273
223
|
|
|
274
224
|
### `agent.getMode()`
|
|
275
225
|
|
|
276
|
-
|
|
226
|
+
<!-- YAML
|
|
227
|
+
added: v7.13.0
|
|
228
|
+
-->
|
|
277
229
|
|
|
278
|
-
|
|
230
|
+
* Returns: {string} The current mode: `'record'`, `'playback'`, or `'update'`.
|
|
279
231
|
|
|
280
|
-
|
|
232
|
+
Returns the mode the agent was constructed with.
|
|
281
233
|
|
|
282
234
|
### `agent.clearSnapshots()`
|
|
283
235
|
|
|
284
|
-
|
|
236
|
+
<!-- YAML
|
|
237
|
+
added: v7.13.0
|
|
238
|
+
-->
|
|
285
239
|
|
|
286
|
-
|
|
287
|
-
agent.clearSnapshots()
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
## Working with Different Request Types
|
|
240
|
+
* Returns: {undefined}
|
|
291
241
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
```javascript
|
|
295
|
-
// Record mode
|
|
296
|
-
const agent = new SnapshotAgent({ mode: 'record', snapshotPath: './get-snapshots.json' })
|
|
297
|
-
setGlobalDispatcher(agent)
|
|
242
|
+
Removes all snapshots from memory.
|
|
298
243
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
await agent.saveSnapshots()
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### POST Requests with Body
|
|
306
|
-
|
|
307
|
-
```javascript
|
|
308
|
-
// Record mode
|
|
309
|
-
const agent = new SnapshotAgent({ mode: 'record', snapshotPath: './post-snapshots.json' })
|
|
310
|
-
setGlobalDispatcher(agent)
|
|
311
|
-
|
|
312
|
-
const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
|
|
313
|
-
method: 'POST',
|
|
314
|
-
headers: { 'Content-Type': 'application/json' },
|
|
315
|
-
body: JSON.stringify({ title: 'Test Post', body: 'Content' })
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
await agent.saveSnapshots()
|
|
244
|
+
```mjs
|
|
245
|
+
agent.clearSnapshots()
|
|
319
246
|
```
|
|
320
247
|
|
|
321
|
-
###
|
|
322
|
-
|
|
323
|
-
SnapshotAgent works with all undici APIs, not just fetch:
|
|
248
|
+
### `agent.resetCallCounts()`
|
|
324
249
|
|
|
325
|
-
|
|
326
|
-
|
|
250
|
+
<!-- YAML
|
|
251
|
+
added: v7.13.0
|
|
252
|
+
-->
|
|
327
253
|
|
|
328
|
-
|
|
329
|
-
setGlobalDispatcher(agent)
|
|
330
|
-
|
|
331
|
-
const { statusCode, headers, body } = await request('https://api.example.com/data')
|
|
332
|
-
const data = await body.json()
|
|
333
|
-
|
|
334
|
-
await agent.saveSnapshots()
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
## Test Integration
|
|
254
|
+
* Returns: {undefined}
|
|
338
255
|
|
|
339
|
-
|
|
256
|
+
Resets the call count of every snapshot to zero. Useful between tests when the
|
|
257
|
+
same agent is reused, since matching a snapshot in `'playback'` mode increments
|
|
258
|
+
its call count.
|
|
340
259
|
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
import { SnapshotAgent, setGlobalDispatcher, getGlobalDispatcher } from 'undici'
|
|
344
|
-
|
|
345
|
-
test('API integration test', async (t) => {
|
|
346
|
-
const originalDispatcher = getGlobalDispatcher()
|
|
347
|
-
|
|
348
|
-
const agent = new SnapshotAgent({
|
|
349
|
-
mode: 'playback',
|
|
350
|
-
snapshotPath: './test/snapshots/api-test.json'
|
|
351
|
-
})
|
|
352
|
-
setGlobalDispatcher(agent)
|
|
353
|
-
|
|
354
|
-
t.after(() => setGlobalDispatcher(originalDispatcher))
|
|
355
|
-
|
|
356
|
-
// This will use recorded data
|
|
357
|
-
const response = await fetch('https://api.example.com/users')
|
|
358
|
-
const users = await response.json()
|
|
359
|
-
|
|
360
|
-
assert(Array.isArray(users))
|
|
361
|
-
assert(users.length > 0)
|
|
362
|
-
})
|
|
260
|
+
```mjs
|
|
261
|
+
agent.resetCallCounts()
|
|
363
262
|
```
|
|
364
263
|
|
|
365
|
-
###
|
|
366
|
-
|
|
367
|
-
```javascript
|
|
368
|
-
const mode = process.env.SNAPSHOT_MODE || 'playback'
|
|
369
|
-
|
|
370
|
-
const agent = new SnapshotAgent({
|
|
371
|
-
mode,
|
|
372
|
-
snapshotPath: './test/snapshots/integration.json'
|
|
373
|
-
})
|
|
264
|
+
### `agent.deleteSnapshot(requestOpts)`
|
|
374
265
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
266
|
+
<!-- YAML
|
|
267
|
+
added: v7.13.0
|
|
268
|
+
-->
|
|
378
269
|
|
|
379
|
-
|
|
270
|
+
* `requestOpts` {Object} Dispatch options identifying the snapshot to remove.
|
|
271
|
+
* Returns: {boolean} `true` if a matching snapshot was deleted, `false` if none
|
|
272
|
+
was found.
|
|
380
273
|
|
|
381
|
-
|
|
382
|
-
function createSnapshotAgent(testName, mode = 'playback') {
|
|
383
|
-
return new SnapshotAgent({
|
|
384
|
-
mode,
|
|
385
|
-
snapshotPath: `./test/snapshots/${testName}.json`
|
|
386
|
-
})
|
|
387
|
-
}
|
|
274
|
+
Deletes a single snapshot that matches the given request options.
|
|
388
275
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
276
|
+
```mjs
|
|
277
|
+
const deleted = agent.deleteSnapshot({
|
|
278
|
+
method: 'GET',
|
|
279
|
+
origin: 'https://api.example.com',
|
|
280
|
+
path: '/users'
|
|
394
281
|
})
|
|
395
282
|
```
|
|
396
283
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
]
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
## Security Considerations
|
|
429
|
-
|
|
430
|
-
### Sensitive Data in Snapshots
|
|
431
|
-
|
|
432
|
-
By default, SnapshotAgent records all headers and request/response data. For production use, always exclude sensitive information:
|
|
433
|
-
|
|
434
|
-
```javascript
|
|
435
|
-
const agent = new SnapshotAgent({
|
|
436
|
-
mode: 'record',
|
|
437
|
-
snapshotPath: './snapshots.json',
|
|
438
|
-
|
|
439
|
-
// Exclude sensitive headers from snapshots
|
|
440
|
-
excludeHeaders: [
|
|
441
|
-
'authorization',
|
|
442
|
-
'x-api-key',
|
|
443
|
-
'cookie',
|
|
444
|
-
'set-cookie',
|
|
445
|
-
'x-auth-token',
|
|
446
|
-
'x-csrf-token'
|
|
447
|
-
],
|
|
448
|
-
|
|
449
|
-
// Filter out requests with sensitive data
|
|
450
|
-
shouldRecord: (requestOpts) => {
|
|
451
|
-
const url = new URL(requestOpts.path, requestOpts.origin)
|
|
452
|
-
|
|
453
|
-
// Don't record authentication endpoints
|
|
454
|
-
if (url.pathname.includes('/auth/') || url.pathname.includes('/login')) {
|
|
455
|
-
return false
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// Don't record if request contains sensitive body data
|
|
459
|
-
if (requestOpts.body && typeof requestOpts.body === 'string') {
|
|
460
|
-
const body = requestOpts.body.toLowerCase()
|
|
461
|
-
if (body.includes('password') || body.includes('secret')) {
|
|
462
|
-
return false
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return true
|
|
467
|
-
}
|
|
284
|
+
### `agent.getSnapshotInfo(requestOpts)`
|
|
285
|
+
|
|
286
|
+
<!-- YAML
|
|
287
|
+
added: v7.13.0
|
|
288
|
+
-->
|
|
289
|
+
|
|
290
|
+
* `requestOpts` {Object} Dispatch options identifying the snapshot to inspect.
|
|
291
|
+
* Returns: {Object|null} Information about the matching snapshot, or `null` when
|
|
292
|
+
none is found.
|
|
293
|
+
* `hash` {string} The hash used to key the snapshot.
|
|
294
|
+
* `request` {Object} The recorded request.
|
|
295
|
+
* `method` {string} The request method.
|
|
296
|
+
* `url` {string} The request URL.
|
|
297
|
+
* `headers` {Record<string, string>} The recorded request headers.
|
|
298
|
+
* `body` {string} The recorded request body, when present.
|
|
299
|
+
* `responseCount` {number} The number of recorded responses for the request.
|
|
300
|
+
* `callCount` {number} The number of times the snapshot has been matched.
|
|
301
|
+
* `timestamp` {string} The ISO timestamp at which the snapshot was recorded.
|
|
302
|
+
|
|
303
|
+
Returns metadata about a snapshot without returning the response payload.
|
|
304
|
+
|
|
305
|
+
```mjs
|
|
306
|
+
const info = agent.getSnapshotInfo({
|
|
307
|
+
method: 'GET',
|
|
308
|
+
origin: 'https://api.example.com',
|
|
309
|
+
path: '/users'
|
|
468
310
|
})
|
|
469
311
|
```
|
|
470
312
|
|
|
471
|
-
###
|
|
472
|
-
|
|
473
|
-
**Important**: Snapshot files may contain sensitive data. Handle them securely:
|
|
474
|
-
|
|
475
|
-
- ✅ Add snapshot files to `.gitignore` if they contain real API data
|
|
476
|
-
- ✅ Use environment-specific snapshots (dev/staging/prod)
|
|
477
|
-
- ✅ Regularly review snapshot contents for sensitive information
|
|
478
|
-
- ✅ Use the `excludeHeaders` option for production snapshots
|
|
479
|
-
- ❌ Never commit snapshots with real authentication tokens
|
|
480
|
-
- ❌ Don't share snapshot files containing personal data
|
|
313
|
+
### `agent.replaceSnapshots(snapshotData)`
|
|
481
314
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
/test/snapshots/*-real-data.json
|
|
486
|
-
|
|
487
|
-
# Include sanitized test snapshots
|
|
488
|
-
!/test/snapshots/mock-*.json
|
|
489
|
-
```
|
|
315
|
+
<!-- YAML
|
|
316
|
+
added: v7.13.0
|
|
317
|
+
-->
|
|
490
318
|
|
|
491
|
-
|
|
319
|
+
* `snapshotData` {Array} The snapshot data to load, replacing any existing
|
|
320
|
+
snapshots.
|
|
321
|
+
* `hash` {string} The hash used to key the snapshot.
|
|
322
|
+
* `snapshot` {Object} The snapshot entry.
|
|
323
|
+
* Returns: {undefined}
|
|
492
324
|
|
|
493
|
-
|
|
325
|
+
Replaces all in-memory snapshots with the provided data.
|
|
494
326
|
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
} catch (error) {
|
|
499
|
-
if (error.message.includes('No snapshot found')) {
|
|
500
|
-
// Handle missing snapshot
|
|
501
|
-
console.log('Snapshot not found for this request')
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
### Handling Network Errors in Record Mode
|
|
507
|
-
|
|
508
|
-
```javascript
|
|
509
|
-
const agent = new SnapshotAgent({ mode: 'record', snapshotPath: './snapshots.json' })
|
|
510
|
-
|
|
511
|
-
try {
|
|
512
|
-
const response = await fetch('https://nonexistent-api.example.com/data')
|
|
513
|
-
} catch (error) {
|
|
514
|
-
// Network errors are not recorded as snapshots
|
|
515
|
-
console.log('Network error:', error.message)
|
|
516
|
-
}
|
|
517
|
-
```
|
|
518
|
-
|
|
519
|
-
## Best Practices
|
|
520
|
-
|
|
521
|
-
### 1. Organize Snapshots by Test Suite
|
|
522
|
-
|
|
523
|
-
```javascript
|
|
524
|
-
// Use descriptive snapshot file names
|
|
525
|
-
const agent = new SnapshotAgent({
|
|
526
|
-
mode: 'playback',
|
|
527
|
-
snapshotPath: `./test/snapshots/${testSuiteName}-${testName}.json`
|
|
528
|
-
})
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### 2. Version Control Snapshots
|
|
532
|
-
|
|
533
|
-
Add snapshot files to version control to ensure consistent test behavior across environments:
|
|
534
|
-
|
|
535
|
-
```gitignore
|
|
536
|
-
# Include snapshots in version control
|
|
537
|
-
!/test/snapshots/*.json
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
### 3. Clean Up Test Data
|
|
541
|
-
|
|
542
|
-
```javascript
|
|
543
|
-
test('API test', async (t) => {
|
|
544
|
-
const agent = new SnapshotAgent({
|
|
545
|
-
mode: 'playback',
|
|
546
|
-
snapshotPath: './test/snapshots/temp-test.json'
|
|
547
|
-
})
|
|
548
|
-
|
|
549
|
-
// Clean up after test
|
|
550
|
-
t.after(() => {
|
|
551
|
-
agent.clearSnapshots()
|
|
552
|
-
})
|
|
553
|
-
})
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
### 4. Snapshot Validation
|
|
327
|
+
```mjs
|
|
328
|
+
const recorder = agent.getRecorder()
|
|
329
|
+
const snapshots = recorder.getSnapshots()
|
|
557
330
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
snapshotPath: './test/snapshots/validation.json'
|
|
563
|
-
})
|
|
564
|
-
|
|
565
|
-
const recorder = agent.getRecorder()
|
|
566
|
-
const snapshots = recorder.getSnapshots()
|
|
567
|
-
|
|
568
|
-
// Validate snapshot structure
|
|
569
|
-
assert(snapshots.length > 0, 'Should have recorded snapshots')
|
|
570
|
-
assert(snapshots[0].request.url.startsWith('https://'), 'Should use HTTPS')
|
|
571
|
-
})
|
|
331
|
+
agent.replaceSnapshots(snapshots.map((snapshot, index) => ({
|
|
332
|
+
hash: `snapshot-${index}`,
|
|
333
|
+
snapshot
|
|
334
|
+
})))
|
|
572
335
|
```
|
|
573
336
|
|
|
574
|
-
|
|
337
|
+
### `agent.close()`
|
|
575
338
|
|
|
576
|
-
|
|
339
|
+
<!-- YAML
|
|
340
|
+
added: v7.13.0
|
|
341
|
+
-->
|
|
577
342
|
|
|
578
|
-
|
|
579
|
-
```javascript
|
|
580
|
-
const mockAgent = new MockAgent()
|
|
581
|
-
const mockPool = mockAgent.get('https://api.example.com')
|
|
582
|
-
|
|
583
|
-
mockPool.intercept({
|
|
584
|
-
path: '/users',
|
|
585
|
-
method: 'GET'
|
|
586
|
-
}).reply(200, [
|
|
587
|
-
{ id: 1, name: 'User 1' },
|
|
588
|
-
{ id: 2, name: 'User 2' }
|
|
589
|
-
])
|
|
590
|
-
```
|
|
343
|
+
* Returns: {Promise<void>} Resolves once the agent and its resources are closed.
|
|
591
344
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
345
|
+
Closes the agent and releases its resources. In `'record'` and `'update'` modes
|
|
346
|
+
the recorder is flushed to disk first. In `'playback'` mode nothing is written,
|
|
347
|
+
because matching a snapshot mutates its call count and saving would needlessly
|
|
348
|
+
rewrite the snapshot file. The real [`Agent`][], when one was created, and the
|
|
349
|
+
underlying [`MockAgent`][] are closed as well.
|
|
597
350
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
// Automatically replays recorded response
|
|
351
|
+
```mjs
|
|
352
|
+
await agent.close()
|
|
601
353
|
```
|
|
602
354
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
- ✅ More efficient for high-performance scenarios
|
|
611
|
-
|
|
612
|
-
## See Also
|
|
613
|
-
|
|
614
|
-
- [MockAgent](./MockAgent.md) - Manual mocking for more control
|
|
615
|
-
- [MockCallHistory](./MockCallHistory.md) - Inspecting request history
|
|
616
|
-
- [Testing Best Practices](../best-practices/writing-tests.md) - General testing guidance
|
|
355
|
+
[`Agent`]: Agent.md#class-agent
|
|
356
|
+
[`Dispatcher`]: Dispatcher.md#class-dispatcher
|
|
357
|
+
[`InvalidArgumentError`]: Errors.md#undicierrorsundiciinvalidargumenterror
|
|
358
|
+
[`MockAgent`]: MockAgent.md#class-mockagent
|
|
359
|
+
[`UndiciError`]: Errors.md#undicierrorsundicierror
|
|
360
|
+
[`agent.getRecorder()`]: #agentgetrecorder
|
|
361
|
+
[`setGlobalDispatcher()`]: Dispatcher.md#setglobaldispatcherdispatcher
|