@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,41 +0,0 @@
|
|
|
1
|
-
import { Stub } from './Stub.js'
|
|
2
|
-
import { Throw } from './Throw.js'
|
|
3
|
-
import { Sleep } from './Sleep.js'
|
|
4
|
-
import { Faulty } from './Faulty.js'
|
|
5
|
-
import { type Directive } from './types.js'
|
|
6
|
-
import type { Input, Output } from '../../io.js'
|
|
7
|
-
import type { DirectiveFamily } from '../../RTD/index.js'
|
|
8
|
-
|
|
9
|
-
export class Development implements DirectiveFamily<Directive> {
|
|
10
|
-
public readonly name: string = 'dev'
|
|
11
|
-
public readonly mandatory: boolean = false
|
|
12
|
-
|
|
13
|
-
public create(name: string, value: unknown): Directive {
|
|
14
|
-
const Class = constructors[name]
|
|
15
|
-
|
|
16
|
-
if (Class === undefined) throw new Error(`Directive 'dev:${name}' is not implemented`)
|
|
17
|
-
|
|
18
|
-
return new Class(value)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public async precall(directives: Directive[], input: Input): Promise<Output> {
|
|
22
|
-
let output = null
|
|
23
|
-
|
|
24
|
-
for (const directive of directives) {
|
|
25
|
-
const out = await directive.apply(input)
|
|
26
|
-
|
|
27
|
-
if (out !== null)
|
|
28
|
-
if (output !== null) throw new Error('`dev` directives ambiguous output')
|
|
29
|
-
else output = out
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return output
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const constructors: Record<string, new (value: any) => Directive> = {
|
|
37
|
-
stub: Stub,
|
|
38
|
-
throw: Throw,
|
|
39
|
-
sleep: Sleep,
|
|
40
|
-
faulty: Faulty
|
|
41
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { ServiceUnavailable } from '../../HTTP/index.js'
|
|
3
|
-
import { cors } from '../cors/index.js'
|
|
4
|
-
import type { Output } from '../../io.js'
|
|
5
|
-
import type { Directive } from './types.js'
|
|
6
|
-
|
|
7
|
-
export class Faulty implements Directive {
|
|
8
|
-
private static readonly warned = false
|
|
9
|
-
private readonly probability: number
|
|
10
|
-
|
|
11
|
-
public constructor(probability: number) {
|
|
12
|
-
assert.ok(
|
|
13
|
-
typeof probability === 'number',
|
|
14
|
-
'`dev:faulty` directive value must be a number'
|
|
15
|
-
)
|
|
16
|
-
assert.ok(
|
|
17
|
-
probability > 0 && probability <= 1,
|
|
18
|
-
'`dev:faulty` directive value must be in the range (0, 1]'
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
this.probability = probability
|
|
22
|
-
|
|
23
|
-
cors.allow('faulty')
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public async apply(): Promise<Output> {
|
|
27
|
-
if (Math.random() > this.probability) return null
|
|
28
|
-
|
|
29
|
-
throw new ServiceUnavailable()
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { setTimeout } from 'node:timers/promises'
|
|
3
|
-
import { console } from 'openspan'
|
|
4
|
-
import { cors } from '../cors/index.js'
|
|
5
|
-
import { BadRequest } from '../../HTTP/index.js'
|
|
6
|
-
import type { Directive } from './types.js'
|
|
7
|
-
import type { Input, Output } from '../../io.js'
|
|
8
|
-
|
|
9
|
-
export class Sleep implements Directive {
|
|
10
|
-
private static warned = false
|
|
11
|
-
private readonly maximum: number
|
|
12
|
-
|
|
13
|
-
public constructor(value: number) {
|
|
14
|
-
assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
|
|
15
|
-
|
|
16
|
-
if (!Sleep.warned) {
|
|
17
|
-
console.warn('Sleep directive is enabled', { maximum: value })
|
|
18
|
-
Sleep.warned = true
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
cors.allow('sleep')
|
|
22
|
-
this.maximum = value
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public async apply(input: Input): Promise<Output> {
|
|
26
|
-
const value = input.request.headers.sleep as string | undefined
|
|
27
|
-
|
|
28
|
-
if (value === undefined) return null
|
|
29
|
-
|
|
30
|
-
const [min, max] = this.parse(value)
|
|
31
|
-
|
|
32
|
-
if (min < 0 || max < 0 || min > max || max > this.maximum)
|
|
33
|
-
throw new BadRequest('Invalid sleep duration')
|
|
34
|
-
|
|
35
|
-
const duration = Math.floor(Math.random() * (max - min)) + min
|
|
36
|
-
|
|
37
|
-
await setTimeout(duration)
|
|
38
|
-
|
|
39
|
-
return null
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private parse(value: string): [number, number] {
|
|
43
|
-
try {
|
|
44
|
-
const pair = JSON.parse(value) as [number, number]
|
|
45
|
-
|
|
46
|
-
if (!Array.isArray(pair) || pair.length !== 2) throw new Error()
|
|
47
|
-
|
|
48
|
-
return pair
|
|
49
|
-
} catch {
|
|
50
|
-
throw new BadRequest('Invalid sleep duration value')
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Output } from '../../io.js'
|
|
2
|
-
import type { Directive } from './types.js'
|
|
3
|
-
|
|
4
|
-
export class Stub implements Directive {
|
|
5
|
-
private readonly value: unknown
|
|
6
|
-
|
|
7
|
-
public constructor(value: unknown) {
|
|
8
|
-
this.value = value
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
public apply(): Output {
|
|
12
|
-
return { body: this.value }
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Output } from '../../io.js'
|
|
2
|
-
import type { Directive } from './types.js'
|
|
3
|
-
|
|
4
|
-
export class Throw implements Directive {
|
|
5
|
-
private readonly message: string
|
|
6
|
-
|
|
7
|
-
public constructor(message: string) {
|
|
8
|
-
this.message = message
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
public apply(): Output {
|
|
12
|
-
throw new Error(this.message)
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { once } from 'node:events'
|
|
2
|
-
import * as assert from 'node:assert'
|
|
3
|
-
import { Readable } from 'node:stream'
|
|
4
|
-
import { console } from 'openspan'
|
|
5
|
-
import type { Directive } from './types.js'
|
|
6
|
-
import type { Input as Context } from '../../io.js'
|
|
7
|
-
import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
8
|
-
|
|
9
|
-
export class Compose implements Directive {
|
|
10
|
-
private readonly expressions: Expression[]
|
|
11
|
-
|
|
12
|
-
public constructor(composition: any) {
|
|
13
|
-
this.expressions = build(composition)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public attach(context: Context): void {
|
|
17
|
-
context.pipelines.response.push(async (message: OutgoingMessage) => {
|
|
18
|
-
if (!(message.body instanceof Readable)) {
|
|
19
|
-
console.warn('Response body is not a stream, skipping composition')
|
|
20
|
-
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
assert.ok(message.body instanceof Readable, 'Response body is not a stream')
|
|
25
|
-
|
|
26
|
-
assert.ok(
|
|
27
|
-
// @ts-expect-error -- objectMode is not defined in the type definition
|
|
28
|
-
message.body._readableState.objectMode,
|
|
29
|
-
'Response stream is not in object mode'
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
const $ = await this.compose(message.body)
|
|
33
|
-
|
|
34
|
-
message.body = this.execute($)
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private async compose(stream: Readable): Promise<unknown[]> {
|
|
39
|
-
const $: unknown[] = []
|
|
40
|
-
|
|
41
|
-
stream.on('data', (data) => $.push(data))
|
|
42
|
-
|
|
43
|
-
await once(stream, 'end')
|
|
44
|
-
|
|
45
|
-
return $
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
private execute($: unknown[]): unknown {
|
|
49
|
-
let exception: Error | undefined
|
|
50
|
-
|
|
51
|
-
for (const expression of this.expressions)
|
|
52
|
-
try {
|
|
53
|
-
return expression($)
|
|
54
|
-
} catch (e: unknown) {
|
|
55
|
-
exception = e as Error
|
|
56
|
-
console.debug('Chunks composition failed', { cause: exception.message })
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
throw exception!
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function build(composition: any): Expression[] {
|
|
64
|
-
return Array.isArray(composition)
|
|
65
|
-
? composition.map((variant) => compile(variant as object | string))
|
|
66
|
-
: [compile(composition as object | string)]
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function compile(composition: object | string): Expression {
|
|
70
|
-
const text =
|
|
71
|
-
typeof composition === 'string'
|
|
72
|
-
? `return ${composition}`
|
|
73
|
-
: `return ${json(composition)}`
|
|
74
|
-
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-implied-eval,no-new-func
|
|
76
|
-
return new Function('$', text) as Expression
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function json(node: object | string): string {
|
|
80
|
-
if (typeof node === 'string')
|
|
81
|
-
if (node.startsWith('\\')) return `"${node}"`
|
|
82
|
-
else return node
|
|
83
|
-
|
|
84
|
-
if (Array.isArray(node))
|
|
85
|
-
return `[${node.map((v) => json(v as object | string)).join(',')}]`
|
|
86
|
-
|
|
87
|
-
if (node.constructor !== Object) return JSON.stringify(node)
|
|
88
|
-
|
|
89
|
-
return (
|
|
90
|
-
'{' +
|
|
91
|
-
Object.entries(node)
|
|
92
|
-
.map(([key, value]) => `"${key}": ${json(value as object | string)}`)
|
|
93
|
-
.join(',') +
|
|
94
|
-
'}'
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
type Expression = ($: unknown[]) => unknown
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { Readable } from 'node:stream'
|
|
2
|
-
import assert from 'node:assert'
|
|
3
|
-
import { match } from 'matchacho'
|
|
4
|
-
import { NotFound } from '../../HTTP/index.js'
|
|
5
|
-
import type { Directive } from './types.js'
|
|
6
|
-
import type { ReadableStream } from 'node:stream/web'
|
|
7
|
-
import type { Remotes } from '../../Remotes.js'
|
|
8
|
-
import type { Maybe } from '@toa.io/core/types'
|
|
9
|
-
import type { Component } from '@toa.io/core'
|
|
10
|
-
import type { Output } from '../../io.js'
|
|
11
|
-
import type { Input } from '../octets/types.js'
|
|
12
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
13
|
-
|
|
14
|
-
export class Fetch implements Directive {
|
|
15
|
-
private readonly connecting: Promise<Component>
|
|
16
|
-
private remote: Component | null = null
|
|
17
|
-
private readonly operation: string
|
|
18
|
-
|
|
19
|
-
public constructor(endpoint: string, discovery: Remotes) {
|
|
20
|
-
assert.equal(typeof endpoint, 'string', '`flow:fetch` must be a string')
|
|
21
|
-
|
|
22
|
-
const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
|
|
23
|
-
|
|
24
|
-
this.operation = operation
|
|
25
|
-
this.connecting = discovery.discover(namespace, name)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public async apply(input: Input, parameters: Parameter[]): Promise<Output> {
|
|
29
|
-
if ('if-none-match' in input.request.headers) return { status: 304 }
|
|
30
|
-
|
|
31
|
-
this.remote ??= await this.connecting
|
|
32
|
-
|
|
33
|
-
const request = await this.remote.invoke<Maybe<Request | string>>(this.operation, {
|
|
34
|
-
input: {
|
|
35
|
-
authority: input.authority,
|
|
36
|
-
path: input.request.url,
|
|
37
|
-
parameters: Object.fromEntries(parameters.map(({ name, value }) => [name, value]))
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
if (request instanceof Error) throw new NotFound(request)
|
|
42
|
-
|
|
43
|
-
const { url, options } = match<Request>(
|
|
44
|
-
request,
|
|
45
|
-
String,
|
|
46
|
-
{ url: request },
|
|
47
|
-
(request: Request): Request => ({
|
|
48
|
-
url: request.url,
|
|
49
|
-
options: {
|
|
50
|
-
method: request.options?.method ?? 'GET',
|
|
51
|
-
body: request.options?.body,
|
|
52
|
-
headers: request.options?.headers
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
const response = await fetch(url, options)
|
|
58
|
-
|
|
59
|
-
if (!response.ok) throw new NotFound()
|
|
60
|
-
|
|
61
|
-
const headers = new Headers()
|
|
62
|
-
|
|
63
|
-
for (const header of ['content-type', 'content-length', 'etag']) {
|
|
64
|
-
const value = response.headers.get(header)
|
|
65
|
-
|
|
66
|
-
if (value !== null) headers.set(header, value)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return {
|
|
70
|
-
headers,
|
|
71
|
-
body:
|
|
72
|
-
response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
interface Request {
|
|
78
|
-
url: string
|
|
79
|
-
options?: RequestOptions
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
interface RequestOptions {
|
|
83
|
-
method?: string
|
|
84
|
-
body?: string
|
|
85
|
-
headers?: Record<string, string>
|
|
86
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Fetch } from './Fetch.js'
|
|
2
|
-
import { Compose } from './Compose.js'
|
|
3
|
-
import type { Directive } from './types.js'
|
|
4
|
-
import type { Input, Output } from '../../io.js'
|
|
5
|
-
import type { DirectiveFamily, Parameter } from '../../RTD/index.js'
|
|
6
|
-
import type { Remotes } from '../../Remotes.js'
|
|
7
|
-
|
|
8
|
-
export class Flow implements DirectiveFamily<Directive> {
|
|
9
|
-
public readonly name: string = 'flow'
|
|
10
|
-
public readonly mandatory: boolean = false
|
|
11
|
-
|
|
12
|
-
public create(name: string, value: unknown, remotes: Remotes): Directive {
|
|
13
|
-
const Class = constructors[name]
|
|
14
|
-
|
|
15
|
-
if (Class === undefined)
|
|
16
|
-
throw new Error(`Directive '${this.name}:${name}' is not implemented`)
|
|
17
|
-
|
|
18
|
-
return new Class(value, remotes)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public async precall(
|
|
22
|
-
directives: Directive[],
|
|
23
|
-
input: Input,
|
|
24
|
-
parameters: Parameter[]
|
|
25
|
-
): Promise<Output> {
|
|
26
|
-
for (const directive of directives) {
|
|
27
|
-
if (directive.attach !== undefined) directive.attach(input)
|
|
28
|
-
|
|
29
|
-
if (directive.apply === undefined) continue
|
|
30
|
-
|
|
31
|
-
const output = await directive.apply(input, parameters)
|
|
32
|
-
|
|
33
|
-
if (output !== null) return output
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return null
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const constructors: Record<string, new (value: any, discovery: Remotes) => Directive> = {
|
|
41
|
-
fetch: Fetch,
|
|
42
|
-
compose: Compose
|
|
43
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { Help } from './Help.js'
|
|
3
|
-
import { Parameters } from './Parameters.js'
|
|
4
|
-
import type { Introspection, Schema } from '../../Introspection.js'
|
|
5
|
-
import type { Described } from './described.js'
|
|
6
|
-
import type { Context } from '../../HTTP/index.js'
|
|
7
|
-
import type { DirectiveFamily } from '../../RTD/index.js'
|
|
8
|
-
|
|
9
|
-
/** The name the family is declared under, and what a consumer of one asks a method for. */
|
|
10
|
-
export const FAMILY = 'help'
|
|
11
|
-
|
|
12
|
-
export type Directive = Help | Parameters
|
|
13
|
-
|
|
14
|
-
export class Family implements DirectiveFamily<Directive> {
|
|
15
|
-
public readonly name = FAMILY
|
|
16
|
-
public readonly mandatory = false
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* What a node says of itself is not said of what is under it: inherited, `help:node`
|
|
20
|
-
* would describe every resource below as the one it was written for. The rest go with
|
|
21
|
-
* it — a sentence about one method is not true of the next, and a route variable a
|
|
22
|
-
* template does not have is not one at all.
|
|
23
|
-
*/
|
|
24
|
-
public readonly inherited = false
|
|
25
|
-
|
|
26
|
-
/** What the nearest declaration says of the method, or nothing where none does. */
|
|
27
|
-
public static method(directives: Directive[] | undefined): Help | null {
|
|
28
|
-
return stated(directives, 'method')
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** And the same of the resource the method is on. */
|
|
32
|
-
public static node(directives: Directive[] | undefined): Help | null {
|
|
33
|
-
return stated(directives, 'node')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// eslint-disable-next-line max-params
|
|
37
|
-
public create(name: string, value: unknown, _: unknown, route: string): Directive {
|
|
38
|
-
if (name === 'node' || name === 'method') return new Help(name, value)
|
|
39
|
-
|
|
40
|
-
assert.ok(name === 'route' || name === 'query', `Unknown directive: help:${name}`)
|
|
41
|
-
|
|
42
|
-
return new Parameters(name, value, route)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** What the route states this method and its parameters are. */
|
|
46
|
-
public explain(
|
|
47
|
-
directives: Directive[],
|
|
48
|
-
_: Context,
|
|
49
|
-
introspection: Introspection
|
|
50
|
-
): Introspection | null {
|
|
51
|
-
const help = Family.method(directives)
|
|
52
|
-
|
|
53
|
-
// what is hidden is hidden from every answer at once, this being the one place they
|
|
54
|
-
// all read; the method itself is reached as it always was
|
|
55
|
-
if (help?.hidden === true) return null
|
|
56
|
-
|
|
57
|
-
const described: Introspection = {
|
|
58
|
-
...introspection,
|
|
59
|
-
...(help?.title === undefined ? {} : { title: help.title }),
|
|
60
|
-
...(help?.description === undefined ? {} : { description: help.description })
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// a schema says `title` and `description` of what it describes, which is where these go
|
|
64
|
-
for (const subject of PARAMETERS) {
|
|
65
|
-
const declaration = declared(directives, subject)
|
|
66
|
-
|
|
67
|
-
if (declaration === null) continue
|
|
68
|
-
|
|
69
|
-
const parameters = declaration.parameters
|
|
70
|
-
|
|
71
|
-
for (const [name, stated] of Object.entries(parameters)) {
|
|
72
|
-
const schema = described[subject]?.[name]
|
|
73
|
-
|
|
74
|
-
/*
|
|
75
|
-
* A route variable is one because the template names it, whether or not the
|
|
76
|
-
* operation declares it as input — and only then is it answered. `:id` on an
|
|
77
|
-
* observation is the ordinary case: it is taken by the query, so nothing describes
|
|
78
|
-
* it and the caller is not told it is a path parameter at all.
|
|
79
|
-
*
|
|
80
|
-
* Anything else is described only where it is already answered: a querystring
|
|
81
|
-
* parameter is one only where the mapping takes it, and a segment `map:segments`
|
|
82
|
-
* renames is answered under the property it fills.
|
|
83
|
-
*/
|
|
84
|
-
if (schema === undefined && !declaration.variables.includes(name)) continue
|
|
85
|
-
|
|
86
|
-
// written where the shape states it, whatever the schema already said
|
|
87
|
-
const merged = { ...schema } as Record<string, unknown>
|
|
88
|
-
|
|
89
|
-
delete merged.title
|
|
90
|
-
delete merged.description
|
|
91
|
-
|
|
92
|
-
described[subject] ??= {}
|
|
93
|
-
described[subject]![name] = Object.assign(merged, stated) as unknown as Schema
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return described
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const PARAMETERS = ['route', 'query'] as const
|
|
102
|
-
|
|
103
|
-
function stated(directives: Directive[] | undefined, subject: string): Help | null {
|
|
104
|
-
const help = directives?.find(
|
|
105
|
-
(directive) => directive instanceof Help && directive.subject === subject
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
return (help as Help | undefined) ?? null
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function declared(
|
|
112
|
-
directives: Directive[] | undefined,
|
|
113
|
-
subject: string
|
|
114
|
-
): Parameters | null {
|
|
115
|
-
const found = directives?.find(
|
|
116
|
-
(directive) => directive instanceof Parameters && directive.subject === subject
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
return (found as Parameters | undefined) ?? null
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export type { Described }
|