@toa.io/extensions.exposition 1.0.0-alpha.292 → 1.0.0-alpha.293
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/components/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +24 -13
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +2 -12
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -42
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -239
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -435
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -1
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -10
- package/source/io.ts +0 -4
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/service.ts +0 -95
- package/source/userland.ts +0 -47
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
- package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { address } from './address.js'
|
|
5
|
-
import type { IncomingMessage } from './types.js'
|
|
6
|
-
|
|
7
|
-
const request = (headers: Record<string, string>): IncomingMessage =>
|
|
8
|
-
({ headers, socket: { remoteAddress: '9.9.9.9' } }) as unknown as IncomingMessage
|
|
9
|
-
|
|
10
|
-
it('should be nothing without a header named', () => {
|
|
11
|
-
assert.equal(address(request({ 'x-forwarded-for': '1.1.1.1' })), undefined)
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('should be the last value of the named header', () => {
|
|
15
|
-
assert.equal(
|
|
16
|
-
address(request({ 'x-forwarded-for': '1.1.1.1, 2.2.2.2' }), 'x-forwarded-for'),
|
|
17
|
-
'2.2.2.2'
|
|
18
|
-
)
|
|
19
|
-
assert.equal(
|
|
20
|
-
address(request({ 'cf-connecting-ip': '3.3.3.3' }), 'cf-connecting-ip'),
|
|
21
|
-
'3.3.3.3'
|
|
22
|
-
)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('should be nothing when the named header is absent or empty', () => {
|
|
26
|
-
assert.equal(address(request({}), 'x-real-ip'), undefined)
|
|
27
|
-
assert.equal(address(request({ 'x-real-ip': ' ' }), 'x-real-ip'), undefined)
|
|
28
|
-
})
|
package/source/HTTP/address.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { IncomingMessage } from './types.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The client address: the value of the header the deployment names, and nothing otherwise.
|
|
5
|
-
* Of a header holding a list, the last value is the one the edge in front appended. The
|
|
6
|
-
* connection's address is never it: behind an edge it is the edge's.
|
|
7
|
-
*/
|
|
8
|
-
export function address(request: IncomingMessage, header?: string): string | undefined {
|
|
9
|
-
if (header === undefined) return
|
|
10
|
-
|
|
11
|
-
const value = request.headers[header]
|
|
12
|
-
const raw = Array.isArray(value) ? value[value.length - 1] : value
|
|
13
|
-
const last = raw?.slice(raw.lastIndexOf(',') + 1).trim()
|
|
14
|
-
|
|
15
|
-
return last === '' ? undefined : last
|
|
16
|
-
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
export class Exception extends Error {
|
|
2
|
-
public readonly status: number
|
|
3
|
-
public readonly body?: any
|
|
4
|
-
|
|
5
|
-
/** Headers the status is not complete without, like `Retry-After` on a 429. */
|
|
6
|
-
public readonly headers?: Headers
|
|
7
|
-
|
|
8
|
-
protected constructor(status: number, body?: any, headers?: Headers) {
|
|
9
|
-
super()
|
|
10
|
-
this.status = status
|
|
11
|
-
this.body = body
|
|
12
|
-
this.headers = headers
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class ClientError extends Exception {}
|
|
17
|
-
|
|
18
|
-
export class BadRequest extends ClientError {
|
|
19
|
-
public constructor(body?: any) {
|
|
20
|
-
super(400, body)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class Unauthorized extends ClientError {
|
|
25
|
-
public constructor(body?: any) {
|
|
26
|
-
super(401, body)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class Forbidden extends ClientError {
|
|
31
|
-
public constructor(body?: any) {
|
|
32
|
-
super(403, body)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class NotFound extends ClientError {
|
|
37
|
-
public constructor(body?: any) {
|
|
38
|
-
super(404, body)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class MethodNotAllowed extends ClientError {
|
|
43
|
-
public constructor(headers?: Headers) {
|
|
44
|
-
super(405, undefined, headers)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export class NotAcceptable extends ClientError {
|
|
49
|
-
public constructor() {
|
|
50
|
-
super(406)
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export class Conflict extends ClientError {
|
|
55
|
-
public constructor(body?: any) {
|
|
56
|
-
super(409, body)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class PreconditionFailed extends ClientError {
|
|
61
|
-
public constructor() {
|
|
62
|
-
super(412)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export class RequestEntityTooLarge extends ClientError {
|
|
67
|
-
public constructor(body?: any) {
|
|
68
|
-
super(413, body)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export class UnsupportedMediaType extends ClientError {
|
|
73
|
-
public constructor() {
|
|
74
|
-
super(415)
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export class UnprocessableEntity extends ClientError {
|
|
79
|
-
public constructor(body?: any) {
|
|
80
|
-
super(422, body)
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export class TooManyRequests extends ClientError {
|
|
85
|
-
/** @param retry Seconds until the request would be admitted. */
|
|
86
|
-
public constructor(retry?: number) {
|
|
87
|
-
super(
|
|
88
|
-
429,
|
|
89
|
-
undefined,
|
|
90
|
-
retry === undefined ? undefined : new Headers({ 'retry-after': String(retry) })
|
|
91
|
-
)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export class ServiceUnavailable extends Exception {
|
|
96
|
-
public constructor(body?: any) {
|
|
97
|
-
super(503, body)
|
|
98
|
-
}
|
|
99
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export const type = 'application/x-www-form-urlencoded'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A form is read and never written: it is what an HTML form and a handful of protocols send,
|
|
5
|
-
* and nothing asks for a reply in it.
|
|
6
|
-
*
|
|
7
|
-
* A name repeated in a form is a list, which is how a form says one — `URLSearchParams` keeps
|
|
8
|
-
* every value, and a name given once stays the string it was written as.
|
|
9
|
-
*/
|
|
10
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
11
|
-
const params = new URLSearchParams(buffer.toString(charset as BufferEncoding))
|
|
12
|
-
const value: Record<string, string | string[]> = {}
|
|
13
|
-
|
|
14
|
-
for (const name of new Set(params.keys())) {
|
|
15
|
-
const values = params.getAll(name)
|
|
16
|
-
|
|
17
|
-
value[name] = values.length === 1 ? values[0] : values
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return value
|
|
21
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import * as json from './json.js'
|
|
2
|
-
import * as yaml from './yaml.js'
|
|
3
|
-
import * as msgpack from './msgpack.js'
|
|
4
|
-
import * as text from './text.js'
|
|
5
|
-
import * as form from './form.js'
|
|
6
|
-
|
|
7
|
-
/** What a reply may be encoded as, and so what `accept` is negotiated against. */
|
|
8
|
-
export const formats: Record<string, Format> = {
|
|
9
|
-
[json.type]: json,
|
|
10
|
-
[yaml.type]: yaml,
|
|
11
|
-
[text.type]: text,
|
|
12
|
-
[msgpack.type]: msgpack
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const types = Object.keys(formats)
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* What a request body may arrive as. Everything a reply may be, and a form besides — which
|
|
19
|
-
* is read and never written, so it is not something a reply can be asked for.
|
|
20
|
-
*/
|
|
21
|
-
export const decoders: Record<string, Decoder> = {
|
|
22
|
-
...formats,
|
|
23
|
-
[form.type]: form
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface Decoder {
|
|
27
|
-
readonly type: string
|
|
28
|
-
|
|
29
|
-
decode: (buffer: Buffer, charset?: string) => any
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface Format extends Decoder {
|
|
33
|
-
readonly multipart: string
|
|
34
|
-
|
|
35
|
-
encode: (value: any) => Buffer
|
|
36
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export const type = 'application/json'
|
|
2
|
-
export const multipart = 'multipart/json'
|
|
3
|
-
|
|
4
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
|
-
const text = buffer.toString(charset as BufferEncoding)
|
|
6
|
-
|
|
7
|
-
return JSON.parse(text)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function encode(value: any): Buffer {
|
|
11
|
-
const text = JSON.stringify(value)
|
|
12
|
-
|
|
13
|
-
return Buffer.from(text)
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { pack, unpack } from 'msgpackr'
|
|
2
|
-
|
|
3
|
-
export function decode(buffer: Buffer): any {
|
|
4
|
-
return unpack(buffer)
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function encode(value: any): Buffer {
|
|
8
|
-
if (typeof value === 'object' && value !== null) Object.setPrototypeOf(value, null)
|
|
9
|
-
|
|
10
|
-
return pack(value)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const type = 'application/msgpack'
|
|
14
|
-
export const multipart = 'multipart/msgpack'
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const type = 'text/plain'
|
|
2
|
-
export const multipart = 'multipart/text'
|
|
3
|
-
|
|
4
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
|
-
return buffer.toString(charset as BufferEncoding)
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function encode(value: { toString: () => string }): Buffer {
|
|
9
|
-
return Buffer.from(value.toString())
|
|
10
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { encode } from './yaml.js'
|
|
5
|
-
|
|
6
|
-
it('encodes error values as their public properties', () => {
|
|
7
|
-
const value = new (class InvalidUsernameError extends Error {
|
|
8
|
-
public readonly code = 'INVALID_USERNAME'
|
|
9
|
-
public override readonly message = 'Username is not meeting the requirements'
|
|
10
|
-
})()
|
|
11
|
-
|
|
12
|
-
assert.strictEqual(
|
|
13
|
-
encode(value).toString(),
|
|
14
|
-
'code: INVALID_USERNAME\nmessage: Username is not meeting the requirements\n'
|
|
15
|
-
)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('writes a value the way its toJSON says', () => {
|
|
19
|
-
const secret = { unwrap: () => 's3cret', toJSON: () => '<REDACTED>' }
|
|
20
|
-
|
|
21
|
-
assert.strictEqual(encode({ a: 1, b: secret }).toString(), 'a: 1\nb: <REDACTED>\n')
|
|
22
|
-
})
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { yaml } from '@toa.io/generic'
|
|
2
|
-
|
|
3
|
-
export const type = 'application/yaml'
|
|
4
|
-
export const multipart = 'multipart/yaml'
|
|
5
|
-
|
|
6
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
7
|
-
const text = buffer.toString(charset as BufferEncoding)
|
|
8
|
-
|
|
9
|
-
return yaml.load(text)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function encode(value: any): Buffer {
|
|
13
|
-
const serializable =
|
|
14
|
-
value instanceof Error ? Object.assign({}, value) : represent(value)
|
|
15
|
-
const text = yaml.dump(serializable, { lineWidth: -1, noRefs: true })
|
|
16
|
-
|
|
17
|
-
return Buffer.from(text)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** What says how it is to be written — a redacted secret — is written that way, as in JSON. */
|
|
21
|
-
function represent(value: unknown): unknown {
|
|
22
|
-
if (
|
|
23
|
-
typeof value !== 'object' ||
|
|
24
|
-
value === null ||
|
|
25
|
-
value instanceof Date ||
|
|
26
|
-
Buffer.isBuffer(value)
|
|
27
|
-
)
|
|
28
|
-
return value
|
|
29
|
-
|
|
30
|
-
if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON()
|
|
31
|
-
|
|
32
|
-
if (Array.isArray(value)) return value.map(represent)
|
|
33
|
-
|
|
34
|
-
const object = value as Record<string, unknown>
|
|
35
|
-
const represented: Record<string, unknown> = {}
|
|
36
|
-
|
|
37
|
-
for (const key of Object.keys(object)) represented[key] = represent(object[key])
|
|
38
|
-
|
|
39
|
-
return represented
|
|
40
|
-
}
|
package/source/HTTP/index.ts
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { PassThrough, Readable } from 'node:stream'
|
|
5
|
-
import * as streamConsumers from 'node:stream/consumers'
|
|
6
|
-
import { generate } from 'randomstring'
|
|
7
|
-
import * as msgpack from 'msgpackr'
|
|
8
|
-
import { multipart, read, type OutgoingMessage } from './messages.js'
|
|
9
|
-
import { BadRequest, UnsupportedMediaType } from './exceptions.js'
|
|
10
|
-
import { formats, types } from './formats/index.js'
|
|
11
|
-
import { Timing } from './Timing.js'
|
|
12
|
-
import type * as http from 'node:http'
|
|
13
|
-
import type { Context } from './Context.js'
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
resetCalls()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('read', () => {
|
|
20
|
-
it('should parse application/json', async () => {
|
|
21
|
-
const path = generate()
|
|
22
|
-
const headers = { 'content-type': 'application/json' }
|
|
23
|
-
const input = { [generate()]: generate() }
|
|
24
|
-
const json = JSON.stringify(input)
|
|
25
|
-
const context = createContext(path, headers, json)
|
|
26
|
-
const output = await read(context)
|
|
27
|
-
|
|
28
|
-
assert.deepStrictEqual(output, input)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should parse application/yaml', async () => {
|
|
32
|
-
const path = generate()
|
|
33
|
-
const headers = { 'content-type': 'application/yaml' }
|
|
34
|
-
const yaml = 'foo: 1'
|
|
35
|
-
const request = createContext(path, headers, yaml)
|
|
36
|
-
const value = await read(request)
|
|
37
|
-
|
|
38
|
-
assert.deepStrictEqual(value, { foo: 1 })
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should parse application/mskpack', async () => {
|
|
42
|
-
const path = generate()
|
|
43
|
-
const headers = { 'content-type': 'application/msgpack' }
|
|
44
|
-
const input = { [generate()]: generate() }
|
|
45
|
-
const msg = msgpack.encode(input)
|
|
46
|
-
const request = createContext(path, headers, msg)
|
|
47
|
-
const output = await read(request)
|
|
48
|
-
|
|
49
|
-
assert.deepStrictEqual(output, input)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('should parse text/plain', async () => {
|
|
53
|
-
const path = generate()
|
|
54
|
-
const headers = { 'content-type': 'text/plain' }
|
|
55
|
-
const input = generate()
|
|
56
|
-
const request = createContext(path, headers, input)
|
|
57
|
-
const output = await read(request)
|
|
58
|
-
|
|
59
|
-
assert.deepStrictEqual(output, input)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('should parse application/json with charset parameter', async () => {
|
|
63
|
-
const path = generate()
|
|
64
|
-
const headers = { 'content-type': 'application/json; charset=utf-8' }
|
|
65
|
-
const input = { [generate()]: generate() }
|
|
66
|
-
const json = JSON.stringify(input)
|
|
67
|
-
const context = createContext(path, headers, json)
|
|
68
|
-
const output = await read(context)
|
|
69
|
-
|
|
70
|
-
assert.deepStrictEqual(output, input)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('should throw on unsupported request media type', async () => {
|
|
74
|
-
const path = generate()
|
|
75
|
-
const headers = { 'content-type': 'wtf/' + generate() }
|
|
76
|
-
const request = createContext(path, headers)
|
|
77
|
-
|
|
78
|
-
await assert.rejects(read(request), UnsupportedMediaType)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('should throw on malformed content', async () => {
|
|
82
|
-
const path = generate()
|
|
83
|
-
const text = '{ "foo": "val... oops '
|
|
84
|
-
const headers = { 'content-type': 'application/json' }
|
|
85
|
-
const request = createContext(path, headers, text)
|
|
86
|
-
|
|
87
|
-
await assert.rejects(read(request), BadRequest)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('should parse application/x-www-form-urlencoded', async () => {
|
|
91
|
-
const headers = { 'content-type': 'application/x-www-form-urlencoded' }
|
|
92
|
-
const form = 'grant_type=authorization_code&code=SplxlO&scope=a+b'
|
|
93
|
-
const request = createContext(generate(), headers, form)
|
|
94
|
-
|
|
95
|
-
assert.deepStrictEqual(await read(request), {
|
|
96
|
-
grant_type: 'authorization_code',
|
|
97
|
-
code: 'SplxlO',
|
|
98
|
-
scope: 'a b'
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('should read a repeated form name as the list it is', async () => {
|
|
103
|
-
const headers = { 'content-type': 'application/x-www-form-urlencoded' }
|
|
104
|
-
const request = createContext(generate(), headers, 'resource=one&resource=two')
|
|
105
|
-
|
|
106
|
-
assert.deepStrictEqual(await read(request), { resource: ['one', 'two'] })
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should not offer a form as a reply encoding', () => {
|
|
110
|
-
assert.ok(
|
|
111
|
-
!types.includes('application/x-www-form-urlencoded'),
|
|
112
|
-
'a form is read and never written'
|
|
113
|
-
)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should output correct mulitpart format', async () => {
|
|
117
|
-
const response = new (class extends PassThrough {
|
|
118
|
-
public readonly headers = new Headers()
|
|
119
|
-
|
|
120
|
-
public setHeader(key: string, value: string): this {
|
|
121
|
-
this.headers.set(key, value)
|
|
122
|
-
|
|
123
|
-
return this
|
|
124
|
-
}
|
|
125
|
-
})()
|
|
126
|
-
|
|
127
|
-
const context = { encoder: formats['text/plain'] } as unknown as Context
|
|
128
|
-
const message = {
|
|
129
|
-
body: Readable.from(['Hello', 'New', 'World'])
|
|
130
|
-
} as unknown as OutgoingMessage
|
|
131
|
-
|
|
132
|
-
const framed = multipart(message, context, response as unknown as http.ServerResponse)
|
|
133
|
-
|
|
134
|
-
const result = await streamConsumers.text(framed)
|
|
135
|
-
|
|
136
|
-
assert.strictEqual(
|
|
137
|
-
result,
|
|
138
|
-
[
|
|
139
|
-
'--cut',
|
|
140
|
-
'',
|
|
141
|
-
'ACK',
|
|
142
|
-
'--cut',
|
|
143
|
-
'',
|
|
144
|
-
'Hello',
|
|
145
|
-
'--cut',
|
|
146
|
-
'',
|
|
147
|
-
'New',
|
|
148
|
-
'--cut',
|
|
149
|
-
'',
|
|
150
|
-
'World',
|
|
151
|
-
'--cut',
|
|
152
|
-
'',
|
|
153
|
-
'FIN',
|
|
154
|
-
'--cut--'
|
|
155
|
-
].join('\r\n')
|
|
156
|
-
)
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
export function createContext(
|
|
161
|
-
url: string,
|
|
162
|
-
headers: Record<string, string> = {},
|
|
163
|
-
content: string | Buffer = ''
|
|
164
|
-
): Context {
|
|
165
|
-
const data = Buffer.isBuffer(content) ? content : Buffer.from(content)
|
|
166
|
-
const stream = Readable.from(data)
|
|
167
|
-
let consumed = false
|
|
168
|
-
|
|
169
|
-
const mock: Partial<Context> = {
|
|
170
|
-
request: Object.assign(stream, {
|
|
171
|
-
url,
|
|
172
|
-
headers
|
|
173
|
-
}) as unknown as Context['request'],
|
|
174
|
-
url: new URL(url, 'https://host.local'),
|
|
175
|
-
timing: new Timing(),
|
|
176
|
-
buffer: async () => {
|
|
177
|
-
if (consumed) throw new Error('Request body already consumed')
|
|
178
|
-
|
|
179
|
-
consumed = true
|
|
180
|
-
|
|
181
|
-
return data
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return mock as unknown as Context
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function resetCalls(target = [], seen = new Set()) {
|
|
189
|
-
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
190
|
-
|
|
191
|
-
seen.add(target)
|
|
192
|
-
|
|
193
|
-
for (const value of Object.values(target))
|
|
194
|
-
if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
|
|
195
|
-
else resetCalls(value, seen)
|
|
196
|
-
}
|