@toa.io/extensions.exposition 1.0.0-alpha.285 → 1.0.0-alpha.286
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/exposition.octets/operations/delete.js +1 -1
- package/components/exposition.octets/operations/get.js +5 -2
- package/components/exposition.octets/operations/head.js +1 -1
- package/components/exposition.octets/operations/put.js +29 -37
- package/components/exposition.octets/types/toa.d.ts +1 -1
- package/components/identity.bans/manifest.toa.yaml +12 -13
- package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.bans/operations/transit.js +1 -1
- package/components/identity.bans/source/transit.ts +1 -1
- package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
- package/components/identity.bans/types/toa.d.ts +5 -5
- package/components/identity.basic/events/principal.js +3 -1
- package/components/identity.basic/manifest.toa.yaml +17 -23
- package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
- package/components/identity.basic/operations/add.js +1 -1
- package/components/identity.basic/operations/authenticate.js +2 -2
- package/components/identity.basic/operations/check.js +4 -2
- package/components/identity.basic/operations/delete.js +1 -1
- package/components/identity.basic/operations/incept.js +1 -1
- package/components/identity.basic/operations/info.js +1 -1
- package/components/identity.basic/operations/lib/credentials.js +1 -1
- package/components/identity.basic/operations/transit.js +7 -8
- package/components/identity.basic/source/add.ts +5 -2
- package/components/identity.basic/source/authenticate.ts +11 -13
- package/components/identity.basic/source/check.ts +9 -6
- package/components/identity.basic/source/delete.ts +4 -1
- package/components/identity.basic/source/incept.ts +13 -10
- package/components/identity.basic/source/info.ts +4 -1
- package/components/identity.basic/source/lib/credentials.ts +2 -3
- package/components/identity.basic/source/transit.ts +27 -21
- package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/types/index.d.ts +7 -3
- package/components/identity.basic/types/toa.d.ts +5 -5
- package/components/identity.clients/manifest.toa.yaml +36 -40
- package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
- package/components/identity.clients/operations/describe.js +1 -1
- package/components/identity.clients/operations/lib/canonical.js +1 -1
- package/components/identity.clients/operations/lib/cimd.js +3 -2
- package/components/identity.clients/operations/lib/redirect.js +7 -4
- package/components/identity.clients/operations/register.js +2 -2
- package/components/identity.clients/source/describe.ts +6 -8
- package/components/identity.clients/source/lib/Context.ts +6 -3
- package/components/identity.clients/source/lib/Entity.ts +1 -1
- package/components/identity.clients/source/lib/canonical.ts +1 -1
- package/components/identity.clients/source/lib/cimd.test.ts +8 -6
- package/components/identity.clients/source/lib/cimd.ts +24 -19
- package/components/identity.clients/source/lib/redirect.test.ts +8 -2
- package/components/identity.clients/source/lib/redirect.ts +12 -8
- package/components/identity.clients/source/register.ts +18 -18
- package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
- package/components/identity.clients/types/toa.d.ts +5 -5
- package/components/identity.credentials/manifest.toa.yaml +4 -4
- package/components/identity.credentials/operations/list.js +8 -4
- package/components/identity.credentials/source/list.test.ts +39 -20
- package/components/identity.credentials/source/list.ts +12 -8
- package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
- package/components/identity.credentials/types/toa.d.ts +2 -2
- package/components/identity.federation/manifest.toa.yaml +23 -32
- package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
- package/components/identity.federation/operations/authenticate.js +4 -2
- package/components/identity.federation/operations/create.js +2 -2
- package/components/identity.federation/operations/decode.js +1 -1
- package/components/identity.federation/operations/delete.js +1 -1
- package/components/identity.federation/operations/incept.js +1 -1
- package/components/identity.federation/operations/lib/decode.js +1 -1
- package/components/identity.federation/operations/lib/discovery.js +2 -2
- package/components/identity.federation/operations/lib/exchange.js +8 -4
- package/components/identity.federation/operations/lib/principal.js +1 -1
- package/components/identity.federation/operations/lib/resolve.js +1 -1
- package/components/identity.federation/operations/list.js +2 -2
- package/components/identity.federation/source/authenticate.ts +19 -17
- package/components/identity.federation/source/create.ts +6 -7
- package/components/identity.federation/source/decode.ts +4 -1
- package/components/identity.federation/source/delete.ts +4 -1
- package/components/identity.federation/source/incept.ts +2 -3
- package/components/identity.federation/source/lib/decode.ts +4 -7
- package/components/identity.federation/source/lib/discovery.test.ts +15 -5
- package/components/identity.federation/source/lib/discovery.ts +10 -9
- package/components/identity.federation/source/lib/exchange.ts +18 -15
- package/components/identity.federation/source/lib/jose.d.ts +1 -1
- package/components/identity.federation/source/lib/principal.ts +5 -3
- package/components/identity.federation/source/lib/resolve.ts +5 -1
- package/components/identity.federation/source/list.test.ts +26 -10
- package/components/identity.federation/source/list.ts +5 -2
- package/components/identity.federation/source/types/context.ts +5 -2
- package/components/identity.federation/source/types/entity.ts +2 -2
- package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/types/toa.d.ts +5 -5
- package/components/identity.grants/manifest.toa.yaml +27 -31
- package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
- package/components/identity.grants/operations/authorize.js +1 -1
- package/components/identity.grants/operations/exchange.js +5 -2
- package/components/identity.grants/operations/lib/code.js +1 -1
- package/components/identity.grants/operations/lib/identify.js +1 -1
- package/components/identity.grants/operations/list.js +1 -1
- package/components/identity.grants/operations/revoke.js +3 -2
- package/components/identity.grants/source/authorize.ts +27 -19
- package/components/identity.grants/source/exchange.ts +15 -11
- package/components/identity.grants/source/lib/code.ts +20 -8
- package/components/identity.grants/source/lib/identify.ts +1 -1
- package/components/identity.grants/source/list.ts +2 -2
- package/components/identity.grants/source/revoke.ts +9 -7
- package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
- package/components/identity.grants/types/index.d.ts +3 -3
- package/components/identity.grants/types/toa.d.ts +5 -5
- package/components/identity.keys/manifest.toa.yaml +18 -23
- package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
- package/components/identity.keys/operations/create.js +1 -1
- package/components/identity.keys/operations/disable.js +1 -1
- package/components/identity.keys/operations/revoke.js +1 -1
- package/components/identity.keys/source/create.ts +2 -3
- package/components/identity.keys/source/disable.ts +1 -1
- package/components/identity.keys/source/revoke.ts +2 -2
- package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.keys/types/toa.d.ts +5 -5
- package/components/identity.otp/manifest.toa.yaml +16 -24
- package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
- package/components/identity.otp/operations/authenticate.js +1 -1
- package/components/identity.otp/operations/issue.js +1 -1
- package/components/identity.otp/source/authenticate.ts +4 -7
- package/components/identity.otp/source/issue.ts +1 -1
- package/components/identity.otp/source/lib/Context.ts +1 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
- package/components/identity.otp/types/toa.d.ts +5 -5
- package/components/identity.passkeys/manifest.toa.yaml +45 -53
- package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
- package/components/identity.passkeys/operations/authenticate.js +1 -1
- package/components/identity.passkeys/operations/challenge.js +6 -3
- package/components/identity.passkeys/operations/create.js +1 -1
- package/components/identity.passkeys/operations/delete.js +1 -1
- package/components/identity.passkeys/operations/list.js +1 -1
- package/components/identity.passkeys/operations/use.js +1 -1
- package/components/identity.passkeys/source/authenticate.ts +3 -4
- package/components/identity.passkeys/source/challenge.ts +29 -25
- package/components/identity.passkeys/source/create.ts +8 -6
- package/components/identity.passkeys/source/delete.ts +4 -1
- package/components/identity.passkeys/source/list.ts +4 -1
- package/components/identity.passkeys/source/types/Context.ts +1 -1
- package/components/identity.passkeys/source/use.ts +12 -10
- package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.passkeys/types/toa.d.ts +5 -5
- package/components/identity.roles/manifest.toa.yaml +12 -16
- package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
- package/components/identity.roles/operations/grant.js +1 -1
- package/components/identity.roles/operations/list.js +1 -1
- package/components/identity.roles/operations/principal.js +2 -2
- package/components/identity.roles/source/grant.ts +7 -6
- package/components/identity.roles/source/list.ts +1 -1
- package/components/identity.roles/source/principal.ts +5 -7
- package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/types/toa.d.ts +5 -5
- package/components/identity.tokens/manifest.toa.yaml +17 -15
- package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.tokens/operations/authenticate.js +2 -2
- package/components/identity.tokens/operations/decrypt.js +11 -5
- package/components/identity.tokens/operations/encrypt.js +2 -2
- package/components/identity.tokens/operations/issue.js +2 -4
- package/components/identity.tokens/operations/lib/form.js +1 -1
- package/components/identity.tokens/operations/lib/key.js +1 -1
- package/components/identity.tokens/operations/revoke.js +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -16
- package/components/identity.tokens/source/authenticate.ts +7 -10
- package/components/identity.tokens/source/decrypt.test.ts +62 -29
- package/components/identity.tokens/source/decrypt.ts +30 -27
- package/components/identity.tokens/source/encrypt.test.ts +21 -16
- package/components/identity.tokens/source/encrypt.ts +8 -11
- package/components/identity.tokens/source/issue.test.ts +4 -2
- package/components/identity.tokens/source/issue.ts +6 -8
- package/components/identity.tokens/source/lib/form.ts +5 -9
- package/components/identity.tokens/source/lib/jose.d.ts +1 -1
- package/components/identity.tokens/source/lib/key.ts +1 -1
- package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
- package/components/identity.tokens/source/revoke.ts +1 -1
- package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/types/index.d.ts +13 -4
- package/components/identity.tokens/types/toa.d.ts +5 -5
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/documentation/access.md +4 -3
- package/documentation/cache.md +17 -3
- package/documentation/components.md +2 -2
- package/documentation/credentials.md +2 -2
- package/documentation/identity.md +7 -9
- package/documentation/map.md +2 -2
- package/documentation/mcp.md +16 -16
- package/documentation/notes/peers.md +1 -1
- package/documentation/notes/throttling.md +1 -1
- package/documentation/octets.md +4 -4
- package/documentation/protocol.md +3 -3
- package/documentation/query.md +14 -8
- package/documentation/rpc.md +31 -21
- package/documentation/tracing.md +3 -3
- package/documentation/tree.md +1 -1
- package/features/auth.assert.feature +2 -2
- package/features/auth.bearer.feature +1 -1
- package/features/auth.claims.feature +5 -5
- package/features/auth.incept.feature +2 -2
- package/features/authorities.federation.feature +1 -1
- package/features/configuration.feature +3 -4
- package/features/credentials.feature +9 -9
- package/features/dev.feature +1 -0
- package/features/dynamic.feature +1 -0
- package/features/errors.feature +21 -0
- package/features/etag.feature +0 -86
- package/features/identity.bans.feature +3 -3
- package/features/identity.basic.feature +9 -9
- package/features/identity.federation.feature +11 -11
- package/features/identity.tokens.custom.feature +5 -5
- package/features/identity.tokens.feature +2 -2
- package/features/interruptions.feature +1 -0
- package/features/introspection.map.feature +4 -4
- package/features/io.throttle.feature +1 -0
- package/features/map.feature +2 -2
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/steps/Captures.ts +1 -1
- package/features/steps/Cloudinary.ts +1 -2
- package/features/steps/Common.ts +4 -5
- package/features/steps/Components.ts +17 -12
- package/features/steps/Database.ts +42 -23
- package/features/steps/Gateway.ts +55 -72
- package/features/steps/HTTP.ts +12 -15
- package/features/steps/IDP.ts +118 -94
- package/features/steps/Identity.ts +3 -3
- package/features/steps/OTP.ts +3 -3
- package/features/steps/Parameters.ts +20 -10
- package/features/steps/Probe.ts +9 -7
- package/features/steps/Realtime.ts +40 -22
- package/features/steps/Workspace.ts +10 -7
- package/features/steps/components/audit/operations/record.js +1 -1
- package/features/steps/components/echo/operations/affect.js +1 -1
- package/features/steps/components/echo/operations/compute.js +1 -1
- package/features/steps/components/echo/operations/echo.js +1 -1
- package/features/steps/components/echo/operations/error.js +1 -1
- package/features/steps/components/echo/operations/identity.js +1 -1
- package/features/steps/components/echo/operations/parameters.js +1 -1
- package/features/steps/components/echo/operations/ping.js +1 -1
- package/features/steps/components/echo/operations/unwrap.js +1 -1
- package/features/steps/components/greeter/operations/greet.js +1 -1
- package/features/steps/components/notify/operations/send.js +1 -1
- package/features/steps/components/octets.tester/operations/authority.js +1 -1
- package/features/steps/components/octets.tester/operations/bar.js +1 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/concat.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/err.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +1 -1
- package/features/steps/components/octets.tester/operations/id.js +1 -1
- package/features/steps/components/octets.tester/operations/identity.js +1 -1
- package/features/steps/components/octets.tester/operations/redirect.js +6 -4
- package/features/steps/components/octets.tester/operations/yex.js +1 -1
- package/features/steps/components/octets.tester/operations/yield.js +1 -1
- package/features/steps/components/orders/manifest.toa.yaml +10 -12
- package/features/steps/components/orders/operations/create.js +4 -2
- package/features/steps/components/pots/manifest.toa.yaml +15 -20
- package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
- package/features/steps/components/pricing/operations/quote.js +1 -1
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/sequences/operations/numbers.js +1 -1
- package/features/steps/components/sequences/operations/tokens.js +3 -3
- package/features/steps/components/users/manifest.toa.yaml +3 -5
- package/features/steps/components/users/operations/create.js +1 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
- package/features/steps/map.ts +2 -2
- package/features/timestamps.feature +1 -1
- package/package.json +7 -7
- package/readme.md +11 -11
- package/schemas/annotation.cos.yaml +1 -3
- package/schemas/method.cos.yaml +2 -0
- package/source/Branch.test.ts +2 -2
- package/source/Branch.ts +3 -5
- package/source/Composition.ts +5 -5
- package/source/Directive.test.ts +38 -20
- package/source/Directive.ts +61 -47
- package/source/Endpoint.test.ts +1 -1
- package/source/Endpoint.ts +27 -92
- package/source/Factory.ts +26 -12
- package/source/Gateway.ts +87 -76
- package/source/HTTP/Context.ts +23 -30
- package/source/HTTP/Probe.ts +7 -9
- package/source/HTTP/Server.ts +88 -69
- package/source/HTTP/Timing.ts +6 -21
- package/source/HTTP/address.test.ts +8 -2
- package/source/HTTP/address.ts +2 -3
- package/source/HTTP/exceptions.ts +20 -18
- package/source/HTTP/formats/form.ts +1 -1
- package/source/HTTP/formats/json.ts +2 -2
- package/source/HTTP/formats/msgpack.ts +3 -4
- package/source/HTTP/formats/text.ts +2 -2
- package/source/HTTP/formats/yaml.test.ts +4 -1
- package/source/HTTP/formats/yaml.ts +14 -11
- package/source/HTTP/messages.test.ts +38 -28
- package/source/HTTP/messages.ts +44 -98
- package/source/Interception.ts +3 -4
- package/source/Introspection.ts +26 -14
- package/source/MCP/Server.ts +114 -54
- package/source/MCP/discover.ts +6 -7
- package/source/MCP/errors.ts +7 -8
- package/source/MCP/schema.test.ts +9 -3
- package/source/MCP/schema.ts +12 -16
- package/source/MCP/tools.ts +33 -28
- package/source/Mapping.ts +25 -27
- package/source/Query.ts +58 -44
- package/source/RPC/Context.ts +8 -11
- package/source/RPC/Dispatcher.ts +46 -26
- package/source/RPC/errors.test.ts +41 -16
- package/source/RPC/errors.ts +9 -10
- package/source/RPC/names.test.ts +35 -16
- package/source/RPC/names.ts +22 -29
- package/source/RTD/Directives.ts +21 -10
- package/source/RTD/Endpoint.ts +4 -1
- package/source/RTD/Method.ts +8 -6
- package/source/RTD/Node.ts +32 -34
- package/source/RTD/Route.ts +18 -21
- package/source/RTD/Tree.ts +18 -18
- package/source/RTD/factory.ts +13 -16
- package/source/RTD/segment.ts +12 -10
- package/source/RTD/syntax/parse.test.ts +12 -6
- package/source/RTD/syntax/parse.ts +30 -26
- package/source/RTD/syntax/types.ts +17 -1
- package/source/RTD/walk.test.ts +59 -22
- package/source/Remotes.test.ts +25 -4
- package/source/Remotes.ts +9 -4
- package/source/Tenant.ts +12 -12
- package/source/deployment.ts +20 -20
- package/source/directives/auth/Anonymous.test.ts +8 -2
- package/source/directives/auth/Anonymous.ts +5 -8
- package/source/directives/auth/Anyone.ts +3 -3
- package/source/directives/auth/Assert.ts +10 -10
- package/source/directives/auth/Authorization.ts +83 -69
- package/source/directives/auth/Delegate.test.ts +2 -2
- package/source/directives/auth/Delegate.ts +8 -10
- package/source/directives/auth/Echo.ts +5 -8
- package/source/directives/auth/Federation.ts +30 -21
- package/source/directives/auth/Id.ts +7 -4
- package/source/directives/auth/Incept.ts +32 -26
- package/source/directives/auth/Input.ts +36 -20
- package/source/directives/auth/Role.test.ts +49 -23
- package/source/directives/auth/Role.ts +29 -22
- package/source/directives/auth/Rule.ts +13 -8
- package/source/directives/auth/Scheme.ts +7 -7
- package/source/directives/auth/create.ts +1 -1
- package/source/directives/auth/schemes.ts +1 -1
- package/source/directives/auth/split.ts +2 -3
- package/source/directives/auth/types.ts +5 -2
- package/source/directives/cache/Cache.ts +44 -9
- package/source/directives/cache/Control.ts +25 -26
- package/source/directives/cache/Exact.ts +1 -1
- package/source/directives/cache/etag.ts +38 -0
- package/source/directives/cors/CORS.ts +9 -7
- package/source/directives/dev/Development.ts +3 -4
- package/source/directives/dev/Faulty.ts +11 -6
- package/source/directives/dev/Sleep.ts +5 -7
- package/source/directives/dev/Stub.ts +2 -2
- package/source/directives/dev/Throw.ts +2 -2
- package/source/directives/flow/Compose.ts +26 -20
- package/source/directives/flow/Fetch.ts +15 -15
- package/source/directives/flow/Flow.ts +9 -8
- package/source/directives/index.ts +11 -2
- package/source/directives/io/IO.ts +29 -20
- package/source/directives/io/Input.ts +9 -12
- package/source/directives/io/Output.ts +20 -23
- package/source/directives/io/Status.test.ts +12 -8
- package/source/directives/io/Status.ts +9 -8
- package/source/directives/io/Throttle.ts +6 -7
- package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
- package/source/directives/io/lib/throttle/Configuration.ts +14 -9
- package/source/directives/io/lib/throttle/Keys.ts +15 -10
- package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
- package/source/directives/io/lib/throttle/Quotas.ts +20 -26
- package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
- package/source/directives/io/lib/throttle/Sync.ts +9 -12
- package/source/directives/io/lib/throttle/Warning.ts +3 -4
- package/source/directives/io/lib/throttle/components/IP.ts +4 -5
- package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
- package/source/directives/io/lib/throttle/components/Path.ts +1 -1
- package/source/directives/io/lib/throttle/components/Route.ts +2 -2
- package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
- package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
- package/source/directives/io/schemas.test.ts +12 -6
- package/source/directives/map/Authority.ts +2 -2
- package/source/directives/map/Buffer.ts +2 -2
- package/source/directives/map/Claims.ts +25 -20
- package/source/directives/map/Headers.ts +17 -13
- package/source/directives/map/Language.ts +8 -5
- package/source/directives/map/Languages.ts +9 -3
- package/source/directives/map/Map.ts +25 -12
- package/source/directives/map/Mapping.ts +9 -6
- package/source/directives/map/Properties.ts +1 -1
- package/source/directives/map/Segments.ts +22 -15
- package/source/directives/mcp/MCP.ts +9 -7
- package/source/directives/mcp/Tool.test.ts +21 -9
- package/source/directives/mcp/Tool.ts +23 -11
- package/source/directives/oauth/Discovery.ts +7 -11
- package/source/directives/oauth/documents.ts +11 -14
- package/source/directives/octets/Context.ts +6 -3
- package/source/directives/octets/Delete.ts +33 -25
- package/source/directives/octets/Directive.ts +5 -1
- package/source/directives/octets/Get.ts +13 -21
- package/source/directives/octets/Octets.ts +20 -15
- package/source/directives/octets/Put.ts +62 -27
- package/source/directives/octets/Workflow.ts +18 -12
- package/source/directives/octets/bytes.ts +1 -1
- package/source/directives/octets/schemas.test.ts +8 -14
- package/source/directives/octets/workflows/Execution.ts +19 -21
- package/source/directives/octets/workflows/Workflow.ts +10 -7
- package/source/directives/require/Headers.ts +3 -4
- package/source/directives/require/Require.ts +3 -4
- package/source/exceptions.ts +19 -12
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +4 -1
- package/source/manifest.ts +19 -13
- package/source/octets.d.ts +1 -1
- package/source/root.ts +3 -2
- package/source/schemas.test.ts +17 -3
- package/transpiled/Branch.js.map +1 -1
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +6 -2
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +0 -2
- package/transpiled/Endpoint.js +11 -52
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js +1 -0
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -1
- package/transpiled/Gateway.js +24 -15
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +0 -3
- package/transpiled/HTTP/Context.js +7 -9
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Probe.js.map +1 -1
- package/transpiled/HTTP/Server.js +19 -4
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +1 -2
- package/transpiled/HTTP/Timing.js +2 -10
- package/transpiled/HTTP/Timing.js.map +1 -1
- package/transpiled/HTTP/address.js.map +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/form.js.map +1 -1
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +4 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +3 -2
- package/transpiled/HTTP/messages.js +1 -43
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.js.map +1 -1
- package/transpiled/Introspection.js +13 -2
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.js +15 -4
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.js.map +1 -1
- package/transpiled/MCP/errors.js.map +1 -1
- package/transpiled/MCP/schema.js +1 -1
- package/transpiled/MCP/schema.js.map +1 -1
- package/transpiled/MCP/tools.js +10 -7
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/Mapping.d.ts +2 -2
- package/transpiled/Mapping.js +3 -5
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +6 -2
- package/transpiled/Query.js +23 -8
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Context.js +0 -7
- package/transpiled/RPC/Context.js.map +1 -1
- package/transpiled/RPC/Dispatcher.js +4 -1
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RPC/errors.js.map +1 -1
- package/transpiled/RPC/names.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +1 -1
- package/transpiled/RTD/Method.js +1 -3
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.js +5 -4
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +4 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +6 -0
- package/transpiled/RTD/syntax/types.js +10 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +6 -1
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +1 -3
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.js.map +1 -1
- package/transpiled/directives/auth/Assert.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +7 -3
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.js +1 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.js +3 -7
- package/transpiled/directives/auth/Federation.js.map +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.js +1 -1
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +1 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.js.map +1 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +3 -1
- package/transpiled/directives/cache/Cache.js +28 -2
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.js +1 -1
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/etag.d.ts +10 -0
- package/transpiled/directives/cache/etag.js +30 -0
- package/transpiled/directives/cache/etag.js.map +1 -0
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Faulty.js.map +1 -1
- package/transpiled/directives/dev/Sleep.js.map +1 -1
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/flow/Compose.js +7 -3
- package/transpiled/directives/flow/Compose.js.map +1 -1
- package/transpiled/directives/flow/Fetch.js.map +1 -1
- package/transpiled/directives/flow/Flow.js.map +1 -1
- package/transpiled/directives/index.js +11 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.d.ts +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +1 -1
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Status.js.map +1 -1
- package/transpiled/directives/io/Throttle.js +1 -1
- package/transpiled/directives/io/Throttle.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
- package/transpiled/directives/map/Authority.js.map +1 -1
- package/transpiled/directives/map/Buffer.js.map +1 -1
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Headers.js.map +1 -1
- package/transpiled/directives/map/Language.js.map +1 -1
- package/transpiled/directives/map/Languages.js.map +1 -1
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/directives/map/Properties.js.map +1 -1
- package/transpiled/directives/map/Segments.js.map +1 -1
- package/transpiled/directives/mcp/MCP.js +1 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.js +3 -1
- package/transpiled/directives/mcp/Tool.js.map +1 -1
- package/transpiled/directives/oauth/Discovery.js.map +1 -1
- package/transpiled/directives/oauth/documents.js.map +1 -1
- package/transpiled/directives/octets/Context.js +1 -1
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.js.map +1 -1
- package/transpiled/directives/octets/Get.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -1
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Put.js.map +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.js +1 -2
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Headers.js.map +1 -1
- package/transpiled/directives/require/Require.js.map +1 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js +5 -1
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/CHANGELOG.md +0 -552
- package/source/redact.test.ts +0 -27
- package/source/redact.ts +0 -21
- package/transpiled/redact.d.ts +0 -5
- package/transpiled/redact.js +0 -17
- package/transpiled/redact.js.map +0 -1
package/source/RTD/Route.ts
CHANGED
|
@@ -9,7 +9,7 @@ export class Route {
|
|
|
9
9
|
public readonly node: Node
|
|
10
10
|
private readonly wildcard: boolean = false
|
|
11
11
|
|
|
12
|
-
public constructor
|
|
12
|
+
public constructor(segments: Segment[], node: Node) {
|
|
13
13
|
this.root = segments.length === 0
|
|
14
14
|
this.segments = segments
|
|
15
15
|
this.node = node
|
|
@@ -21,15 +21,13 @@ export class Route {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
public match
|
|
25
|
-
if (Date.now() >= this.node.expiration)
|
|
26
|
-
return null
|
|
24
|
+
public match(fragments: string[], parameters: Parameter[]): Match | null {
|
|
25
|
+
if (Date.now() >= this.node.expiration) return null
|
|
27
26
|
|
|
28
27
|
for (let i = 0; i < this.segments.length; i++) {
|
|
29
28
|
const segment = this.segments[i]
|
|
30
29
|
|
|
31
|
-
if (segment.fragment !== null && segment.fragment !== fragments[i])
|
|
32
|
-
return null
|
|
30
|
+
if (segment.fragment !== null && segment.fragment !== fragments[i]) return null
|
|
33
31
|
|
|
34
32
|
if (segment.fragment === null && segment.placeholder !== null)
|
|
35
33
|
parameters.push({ name: segment.placeholder, value: decode(fragments[i]) })
|
|
@@ -37,7 +35,10 @@ export class Route {
|
|
|
37
35
|
if (segment.fragment === null && segment.wildcard === true)
|
|
38
36
|
parameters.push({
|
|
39
37
|
name: '**',
|
|
40
|
-
value: fragments
|
|
38
|
+
value: fragments
|
|
39
|
+
.slice(this.segments.length - 1)
|
|
40
|
+
.map(decode)
|
|
41
|
+
.join('/')
|
|
41
42
|
})
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -45,34 +46,30 @@ export class Route {
|
|
|
45
46
|
|
|
46
47
|
if ((exact && !this.node.intermediate) || this.wildcard)
|
|
47
48
|
return { node: this.node, parameters }
|
|
48
|
-
else
|
|
49
|
-
return this.matchNested(fragments, parameters)
|
|
49
|
+
else return this.matchNested(fragments, parameters)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
public *
|
|
52
|
+
public *walk(prefix: Segment[]): Generator<Mount> {
|
|
53
53
|
// an expired branch is not matched, so nothing under it is reachable to name
|
|
54
|
-
if (Date.now() >= this.node.expiration)
|
|
55
|
-
return
|
|
54
|
+
if (Date.now() >= this.node.expiration) return
|
|
56
55
|
|
|
57
|
-
yield
|
|
56
|
+
yield* this.node.walk(prefix.concat(this.segments))
|
|
58
57
|
}
|
|
59
58
|
|
|
60
|
-
public equals
|
|
61
|
-
if (route.segments.length !== this.segments.length)
|
|
62
|
-
return false
|
|
59
|
+
public equals(route: Route): boolean {
|
|
60
|
+
if (route.segments.length !== this.segments.length) return false
|
|
63
61
|
|
|
64
62
|
for (let i = 0; i < this.segments.length; i++)
|
|
65
|
-
if (this.segments[i].fragment !== route.segments[i].fragment)
|
|
66
|
-
return false
|
|
63
|
+
if (this.segments[i].fragment !== route.segments[i].fragment) return false
|
|
67
64
|
|
|
68
65
|
return true
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
public merge
|
|
68
|
+
public merge(route: Route): Node[] {
|
|
72
69
|
return this.node.merge(route.node)
|
|
73
70
|
}
|
|
74
71
|
|
|
75
|
-
private matchNested
|
|
72
|
+
private matchNested(fragments: string[], parameters: Parameter[]): Match | null {
|
|
76
73
|
fragments = fragments.slice(this.segments.length)
|
|
77
74
|
|
|
78
75
|
return this.node.match(fragments, parameters)
|
|
@@ -87,7 +84,7 @@ export class Route {
|
|
|
87
84
|
* An escape that decodes to nothing valid is left as it stands; refusing the route over it
|
|
88
85
|
* would answer `404` to a request whose only fault is its spelling.
|
|
89
86
|
*/
|
|
90
|
-
function decode
|
|
87
|
+
function decode(fragment: string): string {
|
|
91
88
|
try {
|
|
92
89
|
return decodeURIComponent(fragment)
|
|
93
90
|
} catch {
|
package/source/RTD/Tree.ts
CHANGED
|
@@ -15,7 +15,11 @@ export class Tree {
|
|
|
15
15
|
private readonly endpoints: EndpointsFactory
|
|
16
16
|
private readonly directives: DirectiveFactory
|
|
17
17
|
|
|
18
|
-
public constructor
|
|
18
|
+
public constructor(
|
|
19
|
+
node: syntax.Node,
|
|
20
|
+
endpoints: EndpointsFactory,
|
|
21
|
+
directives: DirectiveFactory
|
|
22
|
+
) {
|
|
19
23
|
this.endpoints = endpoints
|
|
20
24
|
this.directives = directives
|
|
21
25
|
this.root = node
|
|
@@ -24,7 +28,7 @@ export class Tree {
|
|
|
24
28
|
unnameable(this.trunk)
|
|
25
29
|
}
|
|
26
30
|
|
|
27
|
-
public match
|
|
31
|
+
public match(path: string): Match | null {
|
|
28
32
|
if (path === '/')
|
|
29
33
|
return {
|
|
30
34
|
node: this.trunk,
|
|
@@ -37,11 +41,11 @@ export class Tree {
|
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
/** Every method in the tree, with the template it answers at. */
|
|
40
|
-
public walk
|
|
44
|
+
public walk(): Generator<Mount> {
|
|
41
45
|
return this.trunk.walk([], TRUNK)
|
|
42
46
|
}
|
|
43
47
|
|
|
44
|
-
public merge
|
|
48
|
+
public merge(node: syntax.Node, extension: unknown): Node[] {
|
|
45
49
|
const branch = this.createNode(node, !PROTECTED, extension)
|
|
46
50
|
|
|
47
51
|
unnameable(branch)
|
|
@@ -53,18 +57,17 @@ export class Tree {
|
|
|
53
57
|
* Extends the expiration of an already merged branch, leaving its endpoints
|
|
54
58
|
* and their remotes intact.
|
|
55
59
|
*/
|
|
56
|
-
public refresh
|
|
60
|
+
public refresh(nodes: Node[]): void {
|
|
57
61
|
const expiration = Date.now() + branchTTL()
|
|
58
62
|
|
|
59
|
-
for (const node of nodes)
|
|
60
|
-
node.touch(expiration)
|
|
63
|
+
for (const node of nodes) node.touch(expiration)
|
|
61
64
|
}
|
|
62
65
|
|
|
63
|
-
public dispose
|
|
66
|
+
public dispose(): void {
|
|
64
67
|
this.directives.dispose()
|
|
65
68
|
}
|
|
66
69
|
|
|
67
|
-
private createNode
|
|
70
|
+
private createNode(node: syntax.Node, protect: boolean, extension?: unknown): Node {
|
|
68
71
|
const context: Context = {
|
|
69
72
|
protected: protect,
|
|
70
73
|
endpoints: this.endpoints,
|
|
@@ -73,7 +76,7 @@ export class Tree {
|
|
|
73
76
|
// A merged branch is mounted under the root, so it inherits the root's
|
|
74
77
|
// directives. The trunk is the root: createNode adds them itself, and
|
|
75
78
|
// seeding them here too would apply every one of them twice.
|
|
76
|
-
stack: node === this.root ? [] : this.root.directives ?? []
|
|
79
|
+
stack: node === this.root ? [] : (this.root.directives ?? [])
|
|
77
80
|
},
|
|
78
81
|
path: label(extension),
|
|
79
82
|
extension
|
|
@@ -87,19 +90,17 @@ export class Tree {
|
|
|
87
90
|
* What is served but cannot be called by name. Said once per route as it is built, because a
|
|
88
91
|
* procedure that is missing is otherwise noticed only by the caller who cannot find it.
|
|
89
92
|
*/
|
|
90
|
-
function unnameable
|
|
93
|
+
function unnameable(node: Node): void {
|
|
91
94
|
const said = new Set<string>()
|
|
92
95
|
|
|
93
96
|
for (const { segments } of node.walk([], TRUNK)) {
|
|
94
97
|
const segment = refusal(segments)
|
|
95
98
|
|
|
96
|
-
if (segment === null)
|
|
97
|
-
continue
|
|
99
|
+
if (segment === null) continue
|
|
98
100
|
|
|
99
101
|
const route = template(segments)
|
|
100
102
|
|
|
101
|
-
if (said.has(route))
|
|
102
|
-
continue
|
|
103
|
+
if (said.has(route)) continue
|
|
103
104
|
|
|
104
105
|
said.add(route)
|
|
105
106
|
|
|
@@ -112,9 +113,8 @@ function unnameable (node: Node): void {
|
|
|
112
113
|
* known while it is being built — so the component it came from is what keeps two
|
|
113
114
|
* branches from looking like the same route.
|
|
114
115
|
*/
|
|
115
|
-
function label
|
|
116
|
-
if (extension === null || typeof extension !== 'object')
|
|
117
|
-
return ''
|
|
116
|
+
function label(extension: unknown): string {
|
|
117
|
+
if (extension === null || typeof extension !== 'object') return ''
|
|
118
118
|
|
|
119
119
|
const { namespace, component } = extension as Record<string, unknown>
|
|
120
120
|
|
package/source/RTD/factory.ts
CHANGED
|
@@ -6,17 +6,14 @@ import { Method, type Methods } from './Method.js'
|
|
|
6
6
|
import type { Context } from './Context.js'
|
|
7
7
|
import type * as syntax from './syntax/index.js'
|
|
8
8
|
|
|
9
|
-
export function createNode
|
|
10
|
-
if (node.isolated === true)
|
|
11
|
-
|
|
12
|
-
else
|
|
13
|
-
context.directives.stack = node.directives.concat(context.directives.stack)
|
|
9
|
+
export function createNode(node: syntax.Node, context: Context): Node {
|
|
10
|
+
if (node.isolated === true) context.directives.stack = node.directives
|
|
11
|
+
else context.directives.stack = node.directives.concat(context.directives.stack)
|
|
14
12
|
|
|
15
13
|
const routes: Route[] = node.routes.map((route) => createRoute(route, context))
|
|
16
14
|
const methods: Methods = {}
|
|
17
15
|
|
|
18
|
-
for (const method of node.methods)
|
|
19
|
-
methods[method.verb] = createMethod(method, context)
|
|
16
|
+
for (const method of node.methods) methods[method.verb] = createMethod(method, context)
|
|
20
17
|
|
|
21
18
|
const protect = node.protected ?? context.protected
|
|
22
19
|
|
|
@@ -29,18 +26,17 @@ export function createNode (node: syntax.Node, context: Context): Node {
|
|
|
29
26
|
return new Node(routes, methods, properties)
|
|
30
27
|
}
|
|
31
28
|
|
|
32
|
-
export function branchTTL
|
|
29
|
+
export function branchTTL(): number {
|
|
33
30
|
const value = process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
34
31
|
|
|
35
|
-
if (value === undefined || value === '')
|
|
36
|
-
return BRANCH_TTL
|
|
32
|
+
if (value === undefined || value === '') return BRANCH_TTL
|
|
37
33
|
|
|
38
34
|
const parsed = Number(value)
|
|
39
35
|
|
|
40
36
|
return Number.isFinite(parsed) ? parsed : BRANCH_TTL
|
|
41
37
|
}
|
|
42
38
|
|
|
43
|
-
function createRoute
|
|
39
|
+
function createRoute(route: syntax.Route, context: Context): Route {
|
|
44
40
|
const stack = context.directives.stack.slice()
|
|
45
41
|
const path = context.path
|
|
46
42
|
const segments = segment(route.path)
|
|
@@ -55,18 +51,19 @@ function createRoute (route: syntax.Route, context: Context): Route {
|
|
|
55
51
|
return new Route(segments, node)
|
|
56
52
|
}
|
|
57
53
|
|
|
58
|
-
function join
|
|
54
|
+
function join(base: string, path: string): string {
|
|
59
55
|
// '/one/' and '/two/' would otherwise read as '/one//two/'
|
|
60
56
|
return (base + path).replace(/\/+/g, '/').replace(/(.)\/$/, '$1')
|
|
61
57
|
}
|
|
62
58
|
|
|
63
|
-
function createMethod
|
|
59
|
+
function createMethod(method: syntax.Method, context: Context): Method {
|
|
64
60
|
const stack = method.directives.concat(context.directives.stack)
|
|
65
61
|
const directives = context.directives.factory.create(stack, context.path)
|
|
66
62
|
|
|
67
|
-
const endpoint =
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
const endpoint =
|
|
64
|
+
method.mapping?.endpoint === undefined
|
|
65
|
+
? null
|
|
66
|
+
: context.endpoints.create(method, context)
|
|
70
67
|
|
|
71
68
|
return new Method(endpoint, directives)
|
|
72
69
|
}
|
package/source/RTD/segment.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export function segment
|
|
1
|
+
export function segment(path: string): Segment[] {
|
|
2
2
|
return fragment(path).map(parse)
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
export function fragment
|
|
5
|
+
export function fragment(path: string): string[] {
|
|
6
6
|
const parts = path.split('/')
|
|
7
7
|
|
|
8
8
|
// trailing slash
|
|
@@ -12,17 +12,19 @@ export function fragment (path: string): string[] {
|
|
|
12
12
|
return parts.splice(1)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
function parse
|
|
15
|
+
function parse(segment: string): Segment {
|
|
16
16
|
if (segment[0] === ':') return { fragment: null, placeholder: segment.substring(1) }
|
|
17
17
|
else if (segment === '*') return { fragment: null, placeholder: null }
|
|
18
18
|
else if (segment === '**') return { fragment: null, placeholder: null, wildcard: true }
|
|
19
19
|
else return { fragment: segment }
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export type Segment =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
export type Segment =
|
|
23
|
+
| {
|
|
24
|
+
fragment: string
|
|
25
|
+
}
|
|
26
|
+
| {
|
|
27
|
+
fragment: null
|
|
28
|
+
placeholder: string | null
|
|
29
|
+
wildcard?: boolean
|
|
30
|
+
}
|
|
@@ -120,7 +120,9 @@ describe('methods', () => {
|
|
|
120
120
|
const node = parse(declaration)
|
|
121
121
|
const root = node.routes[0].node
|
|
122
122
|
|
|
123
|
-
assert.deepStrictEqual(root.methods[0].directives, [
|
|
123
|
+
assert.deepStrictEqual(root.methods[0].directives, [
|
|
124
|
+
{ family: 'auth', name: 'incept', value: 'id' }
|
|
125
|
+
])
|
|
124
126
|
})
|
|
125
127
|
})
|
|
126
128
|
|
|
@@ -132,9 +134,7 @@ describe('directives', () => {
|
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
136
|
|
|
135
|
-
const shortcuts = new Map<string, string>([
|
|
136
|
-
['foo', 'dev:foo']
|
|
137
|
-
])
|
|
137
|
+
const shortcuts = new Map<string, string>([['foo', 'dev:foo']])
|
|
138
138
|
|
|
139
139
|
const node = parse(declaration, shortcuts)
|
|
140
140
|
const root = node.routes[0].node
|
|
@@ -150,7 +150,10 @@ describe('validation', () => {
|
|
|
150
150
|
it('should throw on unknown key', async () => {
|
|
151
151
|
const declaration = { hello: 'world' }
|
|
152
152
|
|
|
153
|
-
assert.throws(
|
|
153
|
+
assert.throws(
|
|
154
|
+
() => parse(declaration),
|
|
155
|
+
(error: any) => /RTD parse error: unknown key 'hello'/.test(error.message)
|
|
156
|
+
)
|
|
154
157
|
})
|
|
155
158
|
|
|
156
159
|
it('should throw on invalid mapping', async () => {
|
|
@@ -163,7 +166,10 @@ describe('validation', () => {
|
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
168
|
|
|
166
|
-
assert.throws(
|
|
169
|
+
assert.throws(
|
|
170
|
+
() => parse(declaration),
|
|
171
|
+
(error: any) => /\/methods\/0\/mapping/.test(error.message)
|
|
172
|
+
)
|
|
167
173
|
})
|
|
168
174
|
})
|
|
169
175
|
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
type Range
|
|
10
10
|
} from './types.js'
|
|
11
11
|
|
|
12
|
-
export function parse
|
|
12
|
+
export function parse(input: object, shortcuts?: Shortcuts): Node {
|
|
13
13
|
const node = parseNode(input, shortcuts)
|
|
14
14
|
|
|
15
15
|
schemas.node.validate(node)
|
|
@@ -17,7 +17,7 @@ export function parse (input: object, shortcuts?: Shortcuts): Node {
|
|
|
17
17
|
return node
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
function parseNode
|
|
20
|
+
function parseNode(input: object | string, shortcuts?: Shortcuts): Node {
|
|
21
21
|
const node = createNode()
|
|
22
22
|
|
|
23
23
|
if (typeof input === 'string') {
|
|
@@ -71,7 +71,7 @@ function parseNode (input: object | string, shortcuts?: Shortcuts): Node {
|
|
|
71
71
|
return node
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
export function createNode
|
|
74
|
+
export function createNode(): Node {
|
|
75
75
|
return {
|
|
76
76
|
routes: [],
|
|
77
77
|
methods: [],
|
|
@@ -79,17 +79,21 @@ export function createNode (): Node {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
function parseRoute
|
|
82
|
+
function parseRoute(path: string, value: Node, shortcuts?: Shortcuts): Route {
|
|
83
83
|
const node = parse(value, shortcuts)
|
|
84
84
|
|
|
85
85
|
return createRoute(path, node)
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
function createRoute
|
|
88
|
+
function createRoute(path: string, node: Node): Route {
|
|
89
89
|
return { path, node }
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
function parseMethod
|
|
92
|
+
function parseMethod(
|
|
93
|
+
verb: string,
|
|
94
|
+
value: Mapping | string,
|
|
95
|
+
shortcuts?: Shortcuts
|
|
96
|
+
): Method {
|
|
93
97
|
const mapping = typeof value === 'string' ? { endpoint: value } : value
|
|
94
98
|
|
|
95
99
|
parseEndpoint(mapping)
|
|
@@ -100,9 +104,8 @@ function parseMethod (verb: string, value: Mapping | string, shortcuts?: Shortcu
|
|
|
100
104
|
return { verb, mapping, directives }
|
|
101
105
|
}
|
|
102
106
|
|
|
103
|
-
function parseEndpoint
|
|
104
|
-
if (mapping.endpoint === undefined)
|
|
105
|
-
return
|
|
107
|
+
function parseEndpoint(mapping: Mapping): void {
|
|
108
|
+
if (mapping.endpoint === undefined) return
|
|
106
109
|
|
|
107
110
|
const [endpoiont, component, namespace] = mapping.endpoint.split('.').reverse()
|
|
108
111
|
|
|
@@ -113,27 +116,26 @@ function parseEndpoint (mapping: Mapping): void {
|
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
function parseQuery
|
|
119
|
+
function parseQuery(mapping: any): void {
|
|
117
120
|
const query = mapping.query
|
|
118
121
|
|
|
119
|
-
if (query === undefined || query === null)
|
|
120
|
-
return
|
|
122
|
+
if (query === undefined || query === null) return
|
|
121
123
|
|
|
122
|
-
if (typeof query.limit === 'number')
|
|
123
|
-
query.limit = expandRange(query.limit as number)
|
|
124
|
+
if (typeof query.limit === 'number') query.limit = expandRange(query.limit as number)
|
|
124
125
|
|
|
125
|
-
if (typeof query.omit === 'number')
|
|
126
|
-
query.omit = expandRange(query.omit as number)
|
|
126
|
+
if (typeof query.omit === 'number') query.omit = expandRange(query.omit as number)
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
function parseDirectives
|
|
129
|
+
function parseDirectives(
|
|
130
|
+
mapping: Record<string, any>,
|
|
131
|
+
shortcuts?: Shortcuts
|
|
132
|
+
): Directive[] {
|
|
130
133
|
const directives: Directive[] = []
|
|
131
134
|
|
|
132
135
|
for (const [key, value] of Object.entries(mapping)) {
|
|
133
136
|
const directive = parseDirective(key, value, shortcuts)
|
|
134
137
|
|
|
135
|
-
if (directive === null)
|
|
136
|
-
continue
|
|
138
|
+
if (directive === null) continue
|
|
137
139
|
|
|
138
140
|
directives.push(directive)
|
|
139
141
|
|
|
@@ -144,21 +146,23 @@ function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts):
|
|
|
144
146
|
return directives
|
|
145
147
|
}
|
|
146
148
|
|
|
147
|
-
function parseDirective
|
|
148
|
-
|
|
149
|
-
|
|
149
|
+
function parseDirective(
|
|
150
|
+
key: string,
|
|
151
|
+
value: any,
|
|
152
|
+
shortcuts?: Shortcuts
|
|
153
|
+
): Directive | null {
|
|
154
|
+
if (shortcuts?.has(key) === true) key = shortcuts.get(key)! // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
150
155
|
|
|
151
156
|
const match = key.match(DIRECTIVE_RX)
|
|
152
157
|
|
|
153
|
-
if (match === null)
|
|
154
|
-
return null
|
|
158
|
+
if (match === null) return null
|
|
155
159
|
|
|
156
|
-
const { family, name } = match.groups as { family: string
|
|
160
|
+
const { family, name } = match.groups as { family: string; name: string }
|
|
157
161
|
|
|
158
162
|
return { family, name, value }
|
|
159
163
|
}
|
|
160
164
|
|
|
161
|
-
function expandRange
|
|
165
|
+
function expandRange(range: number): Range {
|
|
162
166
|
return { value: range, range: [range, range] }
|
|
163
167
|
}
|
|
164
168
|
|
|
@@ -29,6 +29,13 @@ export interface Mapping {
|
|
|
29
29
|
component?: string
|
|
30
30
|
endpoint: string
|
|
31
31
|
query?: Query | null
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Whether the operation this maps to answers a page of a collection, and so takes the
|
|
35
|
+
* `omit` and `limit` a page is taken by. Written where the component's manifest is read,
|
|
36
|
+
* beside `namespace` and `component`, and not declared.
|
|
37
|
+
*/
|
|
38
|
+
paged?: boolean
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
export interface Query {
|
|
@@ -50,4 +57,13 @@ export interface Range {
|
|
|
50
57
|
range: [number, number]
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
export const verbs = new Set<string>([
|
|
60
|
+
export const verbs = new Set<string>([
|
|
61
|
+
'GET',
|
|
62
|
+
'HEAD',
|
|
63
|
+
'POST',
|
|
64
|
+
'PUT',
|
|
65
|
+
'PATCH',
|
|
66
|
+
'DELETE',
|
|
67
|
+
'LOCK',
|
|
68
|
+
'UNLOCK'
|
|
69
|
+
])
|
package/source/RTD/walk.test.ts
CHANGED
|
@@ -18,7 +18,11 @@ const directives = {
|
|
|
18
18
|
dispose: mock.fn()
|
|
19
19
|
} as unknown as DirectiveFactory
|
|
20
20
|
|
|
21
|
-
const node = (
|
|
21
|
+
const node = (
|
|
22
|
+
path: string,
|
|
23
|
+
verbs: string[] = [],
|
|
24
|
+
routes: syntax.Route[] = []
|
|
25
|
+
): syntax.Route => ({
|
|
22
26
|
path,
|
|
23
27
|
node: {
|
|
24
28
|
routes,
|
|
@@ -34,8 +38,9 @@ const trunk = (routes: syntax.Route[], verbs: string[] = []): syntax.Node => ({
|
|
|
34
38
|
})
|
|
35
39
|
|
|
36
40
|
/** What a walk names, which is what a caller of `/.rpc` would write. */
|
|
37
|
-
function names
|
|
38
|
-
return [...tree.walk()]
|
|
41
|
+
function names(tree: Tree): string[] {
|
|
42
|
+
return [...tree.walk()]
|
|
43
|
+
.map(({ segments, verb }) => name(segments, verb))
|
|
39
44
|
.filter((named): named is string => named !== null)
|
|
40
45
|
}
|
|
41
46
|
|
|
@@ -47,51 +52,76 @@ describe('walk', () => {
|
|
|
47
52
|
})
|
|
48
53
|
|
|
49
54
|
it('should name every method of every route', () => {
|
|
50
|
-
const tree = new Tree(
|
|
51
|
-
node('/pots', ['GET', 'POST'], [node('/:id', ['GET', 'DELETE'])])
|
|
52
|
-
|
|
55
|
+
const tree = new Tree(
|
|
56
|
+
trunk([node('/pots', ['GET', 'POST'], [node('/:id', ['GET', 'DELETE'])])]),
|
|
57
|
+
endpoints,
|
|
58
|
+
directives
|
|
59
|
+
)
|
|
53
60
|
|
|
54
61
|
assert.deepEqual(names(tree).sort(), [
|
|
55
|
-
'pots.GET',
|
|
62
|
+
'pots.GET',
|
|
63
|
+
'pots.POST',
|
|
64
|
+
'pots._id.DELETE',
|
|
65
|
+
'pots._id.GET'
|
|
56
66
|
])
|
|
57
67
|
})
|
|
58
68
|
|
|
59
69
|
it('should walk a branch that was merged', () => {
|
|
60
70
|
const tree = new Tree(trunk([]), endpoints, directives)
|
|
61
71
|
|
|
62
|
-
tree.merge(trunk([node('/pots', ['GET'])]), {
|
|
72
|
+
tree.merge(trunk([node('/pots', ['GET'])]), {
|
|
73
|
+
namespace: 'default',
|
|
74
|
+
component: 'pots'
|
|
75
|
+
})
|
|
63
76
|
|
|
64
77
|
assert.deepEqual(names(tree), ['pots.GET'])
|
|
65
78
|
})
|
|
66
79
|
|
|
67
80
|
it('should name a tail', () => {
|
|
68
|
-
const tree = new Tree(
|
|
69
|
-
|
|
81
|
+
const tree = new Tree(
|
|
82
|
+
trunk([node('/files', [], [node('/**', ['GET'])])]),
|
|
83
|
+
endpoints,
|
|
84
|
+
directives
|
|
85
|
+
)
|
|
70
86
|
|
|
71
87
|
assert.deepEqual(names(tree), ['files.__.GET'])
|
|
72
88
|
})
|
|
73
89
|
|
|
74
90
|
it('should skip an intermediate node, whose route answers in its place', () => {
|
|
75
|
-
const tree = new Tree(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
const tree = new Tree(
|
|
92
|
+
trunk([
|
|
93
|
+
// `/posts` is intermediate: `/posts/` is answered by its `/` route, not by itself
|
|
94
|
+
node('/posts', ['PATCH'], [node('/', ['PUT'])])
|
|
95
|
+
]),
|
|
96
|
+
endpoints,
|
|
97
|
+
directives
|
|
98
|
+
)
|
|
79
99
|
|
|
80
100
|
assert.deepEqual(names(tree), ['posts.PUT'])
|
|
81
101
|
})
|
|
82
102
|
|
|
83
103
|
it('should name nothing where a segment cannot be spelled', () => {
|
|
84
|
-
const tree = new Tree(
|
|
85
|
-
|
|
104
|
+
const tree = new Tree(
|
|
105
|
+
trunk([node('/v1.0', ['GET']), node('/pots', ['GET'])]),
|
|
106
|
+
endpoints,
|
|
107
|
+
directives
|
|
108
|
+
)
|
|
86
109
|
|
|
87
110
|
assert.deepEqual(names(tree), ['pots.GET'])
|
|
88
111
|
})
|
|
89
112
|
|
|
90
113
|
it('should name what the tree then matches', () => {
|
|
91
|
-
const tree = new Tree(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
114
|
+
const tree = new Tree(
|
|
115
|
+
trunk(
|
|
116
|
+
[
|
|
117
|
+
node('/pots', ['GET'], [node('/:id', ['GET']), node('/hot', ['GET'])]),
|
|
118
|
+
node('/files', [], [node('/**', ['GET'])])
|
|
119
|
+
],
|
|
120
|
+
['GET']
|
|
121
|
+
),
|
|
122
|
+
endpoints,
|
|
123
|
+
directives
|
|
124
|
+
)
|
|
95
125
|
|
|
96
126
|
const params = { id: 'a1b2', '**': 'a/b/c' }
|
|
97
127
|
|
|
@@ -103,8 +133,15 @@ describe('walk', () => {
|
|
|
103
133
|
const { path } = address(named!, params)
|
|
104
134
|
const match = tree.match(path)
|
|
105
135
|
|
|
106
|
-
assert.notStrictEqual(
|
|
107
|
-
|
|
136
|
+
assert.notStrictEqual(
|
|
137
|
+
match,
|
|
138
|
+
null,
|
|
139
|
+
`'${named!}' resolves to '${path}', which matches`
|
|
140
|
+
)
|
|
141
|
+
assert.ok(
|
|
142
|
+
verb in match!.node.methods,
|
|
143
|
+
`'${named!}' matches a node that answers ${verb}`
|
|
144
|
+
)
|
|
108
145
|
}
|
|
109
146
|
})
|
|
110
147
|
})
|