@fougere/core 0.2.0-alpha.2 → 0.3.0-alpha.0
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/README.md +2 -1
- package/dist/boot/AppLifecycle.d.ts +18 -0
- package/dist/boot/AppLifecycle.d.ts.map +1 -0
- package/dist/boot/AppLifecycle.js +42 -0
- package/dist/boot/AppLifecycle.js.map +1 -0
- package/dist/boot/Emissions.d.ts +126 -0
- package/dist/boot/Emissions.d.ts.map +1 -0
- package/dist/boot/Emissions.js +233 -0
- package/dist/boot/Emissions.js.map +1 -0
- package/dist/boot/HandlerFacade.d.ts +72 -0
- package/dist/boot/HandlerFacade.d.ts.map +1 -0
- package/dist/boot/HandlerFacade.js +174 -0
- package/dist/boot/HandlerFacade.js.map +1 -0
- package/dist/boot/Lifecycle.d.ts +4 -0
- package/dist/boot/Lifecycle.d.ts.map +1 -0
- package/dist/boot/Lifecycle.js +3 -0
- package/dist/boot/Lifecycle.js.map +1 -0
- package/dist/boot/ambient-port.d.ts +38 -0
- package/dist/boot/ambient-port.d.ts.map +1 -0
- package/dist/boot/ambient-port.js +2 -0
- package/dist/boot/ambient-port.js.map +1 -0
- package/dist/boot/ambient.als.d.ts +3 -0
- package/dist/boot/ambient.als.d.ts.map +1 -0
- package/dist/boot/ambient.als.js +34 -0
- package/dist/boot/ambient.als.js.map +1 -0
- package/dist/boot/ambient.queue.d.ts +10 -0
- package/dist/boot/ambient.queue.d.ts.map +1 -0
- package/dist/boot/ambient.queue.js +60 -0
- package/dist/boot/ambient.queue.js.map +1 -0
- package/dist/boot/apply.d.ts +22 -0
- package/dist/boot/apply.d.ts.map +1 -0
- package/dist/boot/apply.js +48 -0
- package/dist/boot/apply.js.map +1 -0
- package/dist/boot/auth.d.ts +53 -0
- package/dist/boot/auth.d.ts.map +1 -0
- package/dist/boot/auth.js +2 -0
- package/dist/boot/auth.js.map +1 -0
- package/dist/{binding.d.ts → boot/binding.d.ts} +14 -17
- package/dist/boot/binding.d.ts.map +1 -0
- package/dist/{binding.js → boot/binding.js} +19 -10
- package/dist/boot/binding.js.map +1 -0
- package/dist/{boot.d.ts → boot/boot.d.ts} +25 -5
- package/dist/boot/boot.d.ts.map +1 -0
- package/dist/boot/boot.js +70 -0
- package/dist/boot/boot.js.map +1 -0
- package/dist/boot/bootstrap.d.ts.map +1 -0
- package/dist/boot/bootstrap.js +721 -0
- package/dist/boot/bootstrap.js.map +1 -0
- package/dist/boot/egress.d.ts +8 -0
- package/dist/boot/egress.d.ts.map +1 -0
- package/dist/boot/egress.js +11 -0
- package/dist/boot/egress.js.map +1 -0
- package/dist/boot/frame.d.ts +44 -0
- package/dist/boot/frame.d.ts.map +1 -0
- package/dist/boot/frame.js +181 -0
- package/dist/boot/frame.js.map +1 -0
- package/dist/boot/ownership.d.ts +42 -0
- package/dist/boot/ownership.d.ts.map +1 -0
- package/dist/boot/ownership.js +127 -0
- package/dist/boot/ownership.js.map +1 -0
- package/dist/boot/ports.d.ts +17 -0
- package/dist/boot/ports.d.ts.map +1 -0
- package/dist/boot/ports.js +57 -0
- package/dist/boot/ports.js.map +1 -0
- package/dist/{remote.d.ts → boot/remote.d.ts} +11 -3
- package/dist/boot/remote.d.ts.map +1 -0
- package/dist/{remote.js → boot/remote.js} +24 -26
- package/dist/boot/remote.js.map +1 -0
- package/dist/{seed.d.ts → boot/seed.d.ts} +13 -1
- package/dist/boot/seed.d.ts.map +1 -0
- package/dist/{seed.js → boot/seed.js} +24 -3
- package/dist/boot/seed.js.map +1 -0
- package/dist/boot/together.d.ts +26 -0
- package/dist/boot/together.d.ts.map +1 -0
- package/dist/boot/together.js +163 -0
- package/dist/boot/together.js.map +1 -0
- package/dist/boot/types.d.ts +260 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/boot/types.js.map +1 -0
- package/dist/builtins/config.d.ts +9 -0
- package/dist/builtins/config.d.ts.map +1 -1
- package/dist/builtins/config.js +16 -1
- package/dist/builtins/config.js.map +1 -1
- package/dist/builtins/logger.d.ts +37 -4
- package/dist/builtins/logger.d.ts.map +1 -1
- package/dist/builtins/logger.js +66 -7
- package/dist/builtins/logger.js.map +1 -1
- package/dist/config-loader.d.ts +39 -35
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +15 -54
- package/dist/config-loader.js.map +1 -1
- package/dist/contract/Call.d.ts +10 -0
- package/dist/contract/Call.d.ts.map +1 -0
- package/dist/contract/Call.js +15 -0
- package/dist/contract/Call.js.map +1 -0
- package/dist/contract/Invocation.d.ts +27 -0
- package/dist/contract/Invocation.d.ts.map +1 -0
- package/dist/contract/Invocation.js +59 -0
- package/dist/contract/Invocation.js.map +1 -0
- package/dist/contract/RouteAddress.d.ts +17 -0
- package/dist/contract/RouteAddress.d.ts.map +1 -0
- package/dist/contract/RouteAddress.js +38 -0
- package/dist/contract/RouteAddress.js.map +1 -0
- package/dist/contract.d.ts +25 -19
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +25 -10
- package/dist/contract.js.map +1 -1
- package/dist/crypto/encoding.d.ts +25 -0
- package/dist/crypto/encoding.d.ts.map +1 -0
- package/dist/crypto/encoding.js +58 -0
- package/dist/crypto/encoding.js.map +1 -0
- package/dist/crypto/node.d.ts +4 -0
- package/dist/crypto/node.d.ts.map +1 -0
- package/dist/crypto/node.js +25 -0
- package/dist/crypto/node.js.map +1 -0
- package/dist/crypto/port.d.ts +42 -0
- package/dist/crypto/port.d.ts.map +1 -0
- package/dist/crypto/port.js +19 -0
- package/dist/crypto/port.js.map +1 -0
- package/dist/crypto/webcrypto.d.ts +4 -0
- package/dist/crypto/webcrypto.d.ts.map +1 -0
- package/dist/crypto/webcrypto.js +34 -0
- package/dist/crypto/webcrypto.js.map +1 -0
- package/dist/dispatch/ArgumentResolver.d.ts +10 -0
- package/dist/dispatch/ArgumentResolver.d.ts.map +1 -0
- package/dist/dispatch/ArgumentResolver.js +12 -0
- package/dist/dispatch/ArgumentResolver.js.map +1 -0
- package/dist/dispatch/ArrayResult.d.ts +3 -0
- package/dist/dispatch/ArrayResult.d.ts.map +1 -0
- package/dist/dispatch/ArrayResult.js +11 -0
- package/dist/dispatch/ArrayResult.js.map +1 -0
- package/dist/dispatch/DispatchEvent.d.ts +18 -0
- package/dist/dispatch/DispatchEvent.d.ts.map +1 -0
- package/dist/dispatch/DispatchEvent.js +30 -0
- package/dist/dispatch/DispatchEvent.js.map +1 -0
- package/dist/dispatch/DispatchLifecycle.d.ts +9 -0
- package/dist/dispatch/DispatchLifecycle.d.ts.map +1 -0
- package/dist/dispatch/DispatchLifecycle.js +25 -0
- package/dist/dispatch/DispatchLifecycle.js.map +1 -0
- package/dist/dispatch/DispatchPort.d.ts +6 -0
- package/dist/dispatch/DispatchPort.d.ts.map +1 -0
- package/dist/dispatch/DispatchPort.js +2 -0
- package/dist/dispatch/DispatchPort.js.map +1 -0
- package/dist/dispatch/Dispatcher.d.ts +16 -0
- package/dist/dispatch/Dispatcher.d.ts.map +1 -0
- package/dist/dispatch/Dispatcher.js +44 -0
- package/dist/dispatch/Dispatcher.js.map +1 -0
- package/dist/dispatch/InFlight.d.ts +12 -0
- package/dist/dispatch/InFlight.d.ts.map +1 -0
- package/dist/dispatch/InFlight.js +46 -0
- package/dist/dispatch/InFlight.js.map +1 -0
- package/dist/dispatch/InputValidator.d.ts +7 -0
- package/dist/dispatch/InputValidator.d.ts.map +1 -0
- package/dist/dispatch/InputValidator.js +21 -0
- package/dist/dispatch/InputValidator.js.map +1 -0
- package/dist/dispatch/LocalRoutePolicy.d.ts +11 -0
- package/dist/dispatch/LocalRoutePolicy.d.ts.map +1 -0
- package/dist/dispatch/LocalRoutePolicy.js +32 -0
- package/dist/dispatch/LocalRoutePolicy.js.map +1 -0
- package/dist/dispatch/OperationExecutor.d.ts +25 -0
- package/dist/dispatch/OperationExecutor.d.ts.map +1 -0
- package/dist/dispatch/OperationExecutor.js +32 -0
- package/dist/dispatch/OperationExecutor.js.map +1 -0
- package/dist/dispatch/OperationRoute.d.ts +13 -0
- package/dist/dispatch/OperationRoute.d.ts.map +1 -0
- package/dist/dispatch/OperationRoute.js +15 -0
- package/dist/dispatch/OperationRoute.js.map +1 -0
- package/dist/dispatch/OutputProjector.d.ts +12 -0
- package/dist/dispatch/OutputProjector.d.ts.map +1 -0
- package/dist/dispatch/OutputProjector.js +30 -0
- package/dist/dispatch/OutputProjector.js.map +1 -0
- package/dist/dispatch/OutputView.d.ts +8 -0
- package/dist/dispatch/OutputView.d.ts.map +1 -0
- package/dist/dispatch/OutputView.js +10 -0
- package/dist/dispatch/OutputView.js.map +1 -0
- package/dist/dispatch/PresenterArgumentResolver.d.ts +12 -0
- package/dist/dispatch/PresenterArgumentResolver.d.ts.map +1 -0
- package/dist/dispatch/PresenterArgumentResolver.js +20 -0
- package/dist/dispatch/PresenterArgumentResolver.js.map +1 -0
- package/dist/dispatch/PresenterExecutor.d.ts +11 -0
- package/dist/dispatch/PresenterExecutor.d.ts.map +1 -0
- package/dist/dispatch/PresenterExecutor.js +56 -0
- package/dist/dispatch/PresenterExecutor.js.map +1 -0
- package/dist/dispatch/RemoteRouteResolver.d.ts +13 -0
- package/dist/dispatch/RemoteRouteResolver.d.ts.map +1 -0
- package/dist/dispatch/RemoteRouteResolver.js +18 -0
- package/dist/dispatch/RemoteRouteResolver.js.map +1 -0
- package/dist/dispatch/Route.d.ts +10 -0
- package/dist/dispatch/Route.d.ts.map +1 -0
- package/dist/dispatch/Route.js +2 -0
- package/dist/dispatch/Route.js.map +1 -0
- package/dist/dispatch/RouteNotFoundError.d.ts +10 -0
- package/dist/dispatch/RouteNotFoundError.d.ts.map +1 -0
- package/dist/dispatch/RouteNotFoundError.js +24 -0
- package/dist/dispatch/RouteNotFoundError.js.map +1 -0
- package/dist/dispatch/RoutePolicy.d.ts +8 -0
- package/dist/dispatch/RoutePolicy.d.ts.map +1 -0
- package/dist/dispatch/RoutePolicy.js +2 -0
- package/dist/dispatch/RoutePolicy.js.map +1 -0
- package/dist/dispatch/RouteRegistry.d.ts +18 -0
- package/dist/dispatch/RouteRegistry.d.ts.map +1 -0
- package/dist/dispatch/RouteRegistry.js +62 -0
- package/dist/dispatch/RouteRegistry.js.map +1 -0
- package/dist/dispatch/RouteResolver.d.ts +7 -0
- package/dist/dispatch/RouteResolver.d.ts.map +1 -0
- package/dist/dispatch/RouteResolver.js +2 -0
- package/dist/dispatch/RouteResolver.js.map +1 -0
- package/dist/dispatch/StorageGuard.d.ts +15 -0
- package/dist/dispatch/StorageGuard.d.ts.map +1 -0
- package/dist/dispatch/StorageGuard.js +63 -0
- package/dist/dispatch/StorageGuard.js.map +1 -0
- package/dist/effective-operation.d.ts +90 -0
- package/dist/effective-operation.d.ts.map +1 -0
- package/dist/effective-operation.js +450 -0
- package/dist/effective-operation.js.map +1 -0
- package/dist/emit.js +2 -2
- package/dist/emit.js.map +1 -1
- package/dist/entry/DynamicFacade.d.ts +10 -0
- package/dist/entry/DynamicFacade.d.ts.map +1 -0
- package/dist/entry/DynamicFacade.js +27 -0
- package/dist/entry/DynamicFacade.js.map +1 -0
- package/dist/entry/FacadeEntry.d.ts +11 -0
- package/dist/entry/FacadeEntry.d.ts.map +1 -0
- package/dist/entry/FacadeEntry.js +26 -0
- package/dist/entry/FacadeEntry.js.map +1 -0
- package/dist/entry/TransportEntry.d.ts +13 -0
- package/dist/entry/TransportEntry.d.ts.map +1 -0
- package/dist/entry/TransportEntry.js +24 -0
- package/dist/entry/TransportEntry.js.map +1 -0
- package/dist/frond-config.d.ts +24 -7
- package/dist/frond-config.d.ts.map +1 -1
- package/dist/frond-config.js.map +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +3 -2
- package/dist/graph.js.map +1 -1
- package/dist/identity-keys.d.ts +14 -0
- package/dist/identity-keys.d.ts.map +1 -0
- package/dist/identity-keys.js +37 -0
- package/dist/identity-keys.js.map +1 -0
- package/dist/identity.d.ts +58 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +182 -0
- package/dist/identity.js.map +1 -0
- package/dist/imports.d.ts +1 -1
- package/dist/imports.d.ts.map +1 -1
- package/dist/imports.js +7 -3
- package/dist/imports.js.map +1 -1
- package/dist/index.d.ts +57 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -32
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +16 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +25 -0
- package/dist/loader.js.map +1 -0
- package/dist/node.d.ts +21 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +24 -0
- package/dist/node.js.map +1 -0
- package/dist/orm.d.ts +69 -8
- package/dist/orm.d.ts.map +1 -1
- package/dist/orm.js +35 -2
- package/dist/orm.js.map +1 -1
- package/dist/prefab/collector.d.ts +29 -0
- package/dist/prefab/collector.d.ts.map +1 -0
- package/dist/prefab/collector.js +34 -0
- package/dist/prefab/collector.js.map +1 -0
- package/dist/{crud.d.ts → prefab/crud.d.ts} +7 -8
- package/dist/prefab/crud.d.ts.map +1 -0
- package/dist/{crud.js → prefab/crud.js} +39 -5
- package/dist/prefab/crud.js.map +1 -0
- package/dist/prefab/mirror.d.ts +52 -0
- package/dist/prefab/mirror.d.ts.map +1 -0
- package/dist/prefab/mirror.js +66 -0
- package/dist/prefab/mirror.js.map +1 -0
- package/dist/prefab/prefab.d.ts +15 -0
- package/dist/prefab/prefab.d.ts.map +1 -0
- package/dist/prefab/prefab.js +19 -0
- package/dist/prefab/prefab.js.map +1 -0
- package/dist/{presenter.d.ts → prefab/presenter.d.ts} +6 -17
- package/dist/prefab/presenter.d.ts.map +1 -0
- package/dist/{presenter.js → prefab/presenter.js} +5 -23
- package/dist/prefab/presenter.js.map +1 -0
- package/dist/prefab/repository.d.ts +104 -0
- package/dist/prefab/repository.d.ts.map +1 -0
- package/dist/prefab/repository.js +62 -0
- package/dist/prefab/repository.js.map +1 -0
- package/dist/scan/Fronds.d.ts +45 -0
- package/dist/scan/Fronds.d.ts.map +1 -0
- package/dist/scan/Fronds.js +66 -0
- package/dist/scan/Fronds.js.map +1 -0
- package/dist/scan/conventions.d.ts +74 -0
- package/dist/scan/conventions.d.ts.map +1 -0
- package/dist/scan/conventions.js +82 -0
- package/dist/scan/conventions.js.map +1 -0
- package/dist/scan/emit.d.ts +14 -0
- package/dist/scan/emit.d.ts.map +1 -0
- package/dist/scan/emit.js +211 -0
- package/dist/scan/emit.js.map +1 -0
- package/dist/scan/frond.d.ts +224 -0
- package/dist/scan/frond.d.ts.map +1 -0
- package/dist/scan/frond.js +2 -0
- package/dist/scan/frond.js.map +1 -0
- package/dist/{handler-parser.d.ts → scan/handler-parser.d.ts} +18 -9
- package/dist/scan/handler-parser.d.ts.map +1 -0
- package/dist/scan/handler-parser.js +625 -0
- package/dist/scan/handler-parser.js.map +1 -0
- package/dist/scan/scan-cache.d.ts +16 -0
- package/dist/scan/scan-cache.d.ts.map +1 -0
- package/dist/{scan-cache.js → scan/scan-cache.js} +27 -20
- package/dist/scan/scan-cache.js.map +1 -0
- package/dist/scan/scanner.d.ts +20 -0
- package/dist/scan/scanner.d.ts.map +1 -0
- package/dist/{scanner.js → scan/scanner.js} +185 -167
- package/dist/scan/scanner.js.map +1 -0
- package/dist/verify.d.ts +16 -3
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +21 -18
- package/dist/verify.js.map +1 -1
- package/dist/{call.d.ts → wire/call.d.ts} +70 -1
- package/dist/wire/call.d.ts.map +1 -0
- package/dist/{call.js → wire/call.js} +48 -75
- package/dist/wire/call.js.map +1 -0
- package/dist/{middleware.d.ts → wire/errors.d.ts} +18 -19
- package/dist/wire/errors.d.ts.map +1 -0
- package/dist/{middleware.js → wire/errors.js} +26 -14
- package/dist/wire/errors.js.map +1 -0
- package/dist/{errors.d.ts → wire/http-error.d.ts} +5 -6
- package/dist/wire/http-error.d.ts.map +1 -0
- package/dist/{errors.js → wire/http-error.js} +7 -6
- package/dist/wire/http-error.js.map +1 -0
- package/dist/wire/invocation.d.ts +4 -0
- package/dist/wire/invocation.d.ts.map +1 -0
- package/dist/wire/invocation.js +3 -0
- package/dist/wire/invocation.js.map +1 -0
- package/dist/{middleware/logger.d.ts → wire/loggerMiddleware.d.ts} +3 -3
- package/dist/wire/loggerMiddleware.d.ts.map +1 -0
- package/dist/{middleware/logger.js → wire/loggerMiddleware.js} +2 -2
- package/dist/wire/loggerMiddleware.js.map +1 -0
- package/dist/wire/middleware.d.ts +29 -0
- package/dist/wire/middleware.d.ts.map +1 -0
- package/dist/wire/middleware.js +20 -0
- package/dist/wire/middleware.js.map +1 -0
- package/dist/{operation.d.ts → wire/operation.d.ts} +39 -10
- package/dist/wire/operation.d.ts.map +1 -0
- package/dist/wire/operation.js +167 -0
- package/dist/wire/operation.js.map +1 -0
- package/package.json +24 -7
- package/dist/binding.d.ts.map +0 -1
- package/dist/binding.js.map +0 -1
- package/dist/boot.d.ts.map +0 -1
- package/dist/boot.js +0 -53
- package/dist/boot.js.map +0 -1
- package/dist/bootstrap.d.ts.map +0 -1
- package/dist/bootstrap.js +0 -879
- package/dist/bootstrap.js.map +0 -1
- package/dist/call.d.ts.map +0 -1
- package/dist/call.js.map +0 -1
- package/dist/collector.d.ts +0 -28
- package/dist/collector.d.ts.map +0 -1
- package/dist/collector.js +0 -32
- package/dist/collector.js.map +0 -1
- package/dist/crud.d.ts.map +0 -1
- package/dist/crud.js.map +0 -1
- package/dist/egress.d.ts +0 -52
- package/dist/egress.d.ts.map +0 -1
- package/dist/egress.js +0 -186
- package/dist/egress.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/handler-parser.d.ts.map +0 -1
- package/dist/handler-parser.js +0 -505
- package/dist/handler-parser.js.map +0 -1
- package/dist/invocation.d.ts +0 -20
- package/dist/invocation.d.ts.map +0 -1
- package/dist/invocation.js +0 -15
- package/dist/invocation.js.map +0 -1
- package/dist/middleware/error-handler.d.ts +0 -15
- package/dist/middleware/error-handler.d.ts.map +0 -1
- package/dist/middleware/error-handler.js +0 -29
- package/dist/middleware/error-handler.js.map +0 -1
- package/dist/middleware/logger.d.ts.map +0 -1
- package/dist/middleware/logger.js.map +0 -1
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js.map +0 -1
- package/dist/mirror.d.ts +0 -93
- package/dist/mirror.d.ts.map +0 -1
- package/dist/mirror.js +0 -96
- package/dist/mirror.js.map +0 -1
- package/dist/operation.d.ts.map +0 -1
- package/dist/operation.js +0 -95
- package/dist/operation.js.map +0 -1
- package/dist/presenter.d.ts.map +0 -1
- package/dist/presenter.js.map +0 -1
- package/dist/remote.d.ts.map +0 -1
- package/dist/remote.js.map +0 -1
- package/dist/repository.d.ts +0 -55
- package/dist/repository.d.ts.map +0 -1
- package/dist/repository.js +0 -26
- package/dist/repository.js.map +0 -1
- package/dist/scan-cache.d.ts +0 -10
- package/dist/scan-cache.d.ts.map +0 -1
- package/dist/scan-cache.js.map +0 -1
- package/dist/scanner.d.ts +0 -34
- package/dist/scanner.d.ts.map +0 -1
- package/dist/scanner.js.map +0 -1
- package/dist/seed.d.ts.map +0 -1
- package/dist/seed.js.map +0 -1
- package/dist/types.d.ts +0 -421
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{bootstrap.d.ts → boot/bootstrap.d.ts} +0 -0
- /package/dist/{types.js → boot/types.js} +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OutputView } from './OutputView.js';
|
|
2
|
+
/**
|
|
3
|
+
* Projects one operation result onto the fields its audience may read.
|
|
4
|
+
*
|
|
5
|
+
* One of the two exits a judge watches; `StorageGuard` is the other.
|
|
6
|
+
*/
|
|
7
|
+
export declare class OutputProjector {
|
|
8
|
+
private readonly view;
|
|
9
|
+
constructor(view: OutputView);
|
|
10
|
+
project(result: unknown): unknown;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=OutputProjector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputProjector.d.ts","sourceRoot":"","sources":["../../src/dispatch/OutputProjector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;CAmBlC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { encodeFields } from '@fougere/schema';
|
|
2
|
+
import { preserveArrayProperties } from './ArrayResult.js';
|
|
3
|
+
/**
|
|
4
|
+
* Projects one operation result onto the fields its audience may read.
|
|
5
|
+
*
|
|
6
|
+
* One of the two exits a judge watches; `StorageGuard` is the other.
|
|
7
|
+
*/
|
|
8
|
+
export class OutputProjector {
|
|
9
|
+
view;
|
|
10
|
+
constructor(view) {
|
|
11
|
+
this.view = view;
|
|
12
|
+
}
|
|
13
|
+
project(result) {
|
|
14
|
+
if (result === null || result === undefined)
|
|
15
|
+
return result;
|
|
16
|
+
if (Array.isArray(result)) {
|
|
17
|
+
return preserveArrayProperties(result, result.map((item) => this.project(item)));
|
|
18
|
+
}
|
|
19
|
+
if (typeof result !== 'object')
|
|
20
|
+
return result;
|
|
21
|
+
const record = result;
|
|
22
|
+
const scoped = this.view.closed
|
|
23
|
+
? Object.fromEntries(Object.keys(this.view.fields)
|
|
24
|
+
.filter((key) => key in record)
|
|
25
|
+
.map((key) => [key, record[key]]))
|
|
26
|
+
: record;
|
|
27
|
+
return encodeFields(this.view.fields, scoped);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=OutputProjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputProjector.js","sourceRoot":"","sources":["../../src/dispatch/OutputProjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAG3D;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,OAAO,CAAC,MAAe;QACrB,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;YAC7B,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;iBAC1B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC;iBAC9B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CACpC;YACH,CAAC,CAAC,MAAM,CAAC;QACX,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Fields } from '@fougere/schema';
|
|
2
|
+
/** Immutable projection boundary of one operation result. */
|
|
3
|
+
export declare class OutputView {
|
|
4
|
+
readonly fields: Fields;
|
|
5
|
+
readonly closed: boolean;
|
|
6
|
+
constructor(fields: Fields, closed?: boolean);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=OutputView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputView.d.ts","sourceRoot":"","sources":["../../src/dispatch/OutputView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,6DAA6D;AAC7D,qBAAa,UAAU;IAEnB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ;CAE1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputView.js","sourceRoot":"","sources":["../../src/dispatch/OutputView.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,MAAM,OAAO,UAAU;IAEV;IACA;IAFX,YACW,MAAc,EACd,SAAS,KAAK;QADd,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;IACtB,CAAC;CACL"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InvocationContext } from '../contract/Invocation.js';
|
|
2
|
+
import type { PresenterEntry } from '../scan/frond.js';
|
|
3
|
+
import type { ArgumentResolver } from './ArgumentResolver.js';
|
|
4
|
+
import type { PresenterArgs } from './PresenterExecutor.js';
|
|
5
|
+
/** Resolves the invocation-dependent arguments of every computed presenter field. */
|
|
6
|
+
export declare class PresenterArgumentResolver {
|
|
7
|
+
private readonly argumentsResolver;
|
|
8
|
+
private readonly collectorTypes;
|
|
9
|
+
constructor(argumentsResolver: ArgumentResolver, collectorTypes: Set<string>);
|
|
10
|
+
resolve(meta: PresenterEntry, invocation: InvocationContext): Promise<PresenterArgs>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=PresenterArgumentResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresenterArgumentResolver.d.ts","sourceRoot":"","sources":["../../src/dispatch/PresenterArgumentResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qFAAqF;AACrF,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBADd,iBAAiB,EAAE,gBAAgB,EACnC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAGxC,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;CAW3F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { computeBindingPlan } from '../boot/binding.js';
|
|
2
|
+
/** Resolves the invocation-dependent arguments of every computed presenter field. */
|
|
3
|
+
export class PresenterArgumentResolver {
|
|
4
|
+
argumentsResolver;
|
|
5
|
+
collectorTypes;
|
|
6
|
+
constructor(argumentsResolver, collectorTypes) {
|
|
7
|
+
this.argumentsResolver = argumentsResolver;
|
|
8
|
+
this.collectorTypes = collectorTypes;
|
|
9
|
+
}
|
|
10
|
+
async resolve(meta, invocation) {
|
|
11
|
+
const argumentsByField = {};
|
|
12
|
+
for (const field of meta.fieldMeta) {
|
|
13
|
+
if (!field.params?.length)
|
|
14
|
+
continue;
|
|
15
|
+
argumentsByField[field.name] = await this.argumentsResolver.resolve(computeBindingPlan(field.params, this.collectorTypes), invocation);
|
|
16
|
+
}
|
|
17
|
+
return argumentsByField;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=PresenterArgumentResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresenterArgumentResolver.js","sourceRoot":"","sources":["../../src/dispatch/PresenterArgumentResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,qFAAqF;AACrF,MAAM,OAAO,yBAAyB;IAEjB;IACA;IAFnB,YACmB,iBAAmC,EACnC,cAA2B;QAD3B,sBAAiB,GAAjB,iBAAiB,CAAkB;QACnC,mBAAc,GAAd,cAAc,CAAa;IAC3C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,IAAoB,EAAE,UAA6B;QAC/D,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM;gBAAE,SAAS;YACpC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CACjE,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,EACrD,UAAU,CACX,CAAC;QACJ,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PresenterArgs = Record<string, unknown[]>;
|
|
2
|
+
/** Adds a presenter's computed fields after output projection. */
|
|
3
|
+
export declare class PresenterExecutor {
|
|
4
|
+
private readonly presenter;
|
|
5
|
+
private readonly fieldNames;
|
|
6
|
+
private readonly entity;
|
|
7
|
+
private readonly operation;
|
|
8
|
+
constructor(presenter: Record<string, unknown> | undefined, fieldNames: readonly string[] | undefined, entity?: string, operation?: string);
|
|
9
|
+
present(result: unknown, args?: PresenterArgs): Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=PresenterExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresenterExecutor.d.ts","sourceRoot":"","sources":["../../src/dispatch/PresenterExecutor.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEtD,kEAAkE;AAClE,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9C,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACzC,MAAM,SAAY,EAClB,SAAS,SAAY;IAGlC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;CAwC3E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ErrorCode, FougereError } from '../wire/errors.js';
|
|
2
|
+
import { preserveArrayProperties } from './ArrayResult.js';
|
|
3
|
+
/** Adds a presenter's computed fields after output projection. */
|
|
4
|
+
export class PresenterExecutor {
|
|
5
|
+
presenter;
|
|
6
|
+
fieldNames;
|
|
7
|
+
entity;
|
|
8
|
+
operation;
|
|
9
|
+
constructor(presenter, fieldNames, entity = 'unknown', operation = 'unknown') {
|
|
10
|
+
this.presenter = presenter;
|
|
11
|
+
this.fieldNames = fieldNames;
|
|
12
|
+
this.entity = entity;
|
|
13
|
+
this.operation = operation;
|
|
14
|
+
}
|
|
15
|
+
async present(result, args = {}) {
|
|
16
|
+
if (!this.presenter || !this.fieldNames?.length || result === null || typeof result !== 'object') {
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
const rows = Array.isArray(result) ? result : [result];
|
|
20
|
+
const values = new Map();
|
|
21
|
+
for (const name of this.fieldNames) {
|
|
22
|
+
const field = this.presenter[name];
|
|
23
|
+
if (typeof field !== 'function')
|
|
24
|
+
continue;
|
|
25
|
+
try {
|
|
26
|
+
const answered = await field.call(this.presenter, rows, ...(args[name] ?? []));
|
|
27
|
+
if (!Array.isArray(answered) || answered.length !== rows.length) {
|
|
28
|
+
const actual = Array.isArray(answered) ? answered.length : typeof answered;
|
|
29
|
+
throw new Error(`expected ${rows.length} value(s) for ${rows.length} row(s), got ${actual}`);
|
|
30
|
+
}
|
|
31
|
+
values.set(name, answered);
|
|
32
|
+
}
|
|
33
|
+
catch (cause) {
|
|
34
|
+
throw new FougereError({
|
|
35
|
+
code: ErrorCode.INTERNAL_ERROR,
|
|
36
|
+
message: `Computed field '${name}' failed: ${cause?.message ?? cause}`,
|
|
37
|
+
entity: this.entity,
|
|
38
|
+
operation: this.operation,
|
|
39
|
+
cause,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const enriched = rows.map((item, index) => {
|
|
44
|
+
if (item === null || typeof item !== 'object')
|
|
45
|
+
return item;
|
|
46
|
+
const output = { ...item };
|
|
47
|
+
for (const [name, answered] of values)
|
|
48
|
+
output[name] = answered[index];
|
|
49
|
+
return output;
|
|
50
|
+
});
|
|
51
|
+
return Array.isArray(result)
|
|
52
|
+
? preserveArrayProperties(result, enriched)
|
|
53
|
+
: enriched[0];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=PresenterExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresenterExecutor.js","sourceRoot":"","sources":["../../src/dispatch/PresenterExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RouteAddress } from '../contract/RouteAddress.js';
|
|
2
|
+
import type { Route } from './Route.js';
|
|
3
|
+
import type { RouteResolver } from './RouteResolver.js';
|
|
4
|
+
type RemoteFacade = Record<string, Function>;
|
|
5
|
+
export type RemoteFacadeResolver = (entity: string) => RemoteFacade | undefined;
|
|
6
|
+
/** Builds a remote route on the first call, after the remote façade can be resolved. */
|
|
7
|
+
export declare class RemoteRouteResolver implements RouteResolver {
|
|
8
|
+
private readonly facades;
|
|
9
|
+
constructor(facades: RemoteFacadeResolver);
|
|
10
|
+
resolve(address: RouteAddress): Route | undefined;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=RemoteRouteResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteRouteResolver.d.ts","sourceRoot":"","sources":["../../src/dispatch/RemoteRouteResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;AAEhF,wFAAwF;AACxF,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE1D,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,GAAG,SAAS;CAQlD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { OperationRoute } from './OperationRoute.js';
|
|
2
|
+
/** Builds a remote route on the first call, after the remote façade can be resolved. */
|
|
3
|
+
export class RemoteRouteResolver {
|
|
4
|
+
facades;
|
|
5
|
+
constructor(facades) {
|
|
6
|
+
this.facades = facades;
|
|
7
|
+
}
|
|
8
|
+
resolve(address) {
|
|
9
|
+
if (address.surface !== undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
const facade = this.facades(address.entity);
|
|
12
|
+
const operation = facade?.[address.operation];
|
|
13
|
+
if (typeof operation !== 'function')
|
|
14
|
+
return undefined;
|
|
15
|
+
return new OperationRoute('remote', address, (call) => operation(call.invocation));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=RemoteRouteResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteRouteResolver.js","sourceRoot":"","sources":["../../src/dispatch/RemoteRouteResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD,wFAAwF;AACxF,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAE9D,OAAO,CAAC,OAAqB;QAC3B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,OAAO,SAAS,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QACtD,OAAO,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACrF,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Call } from '../contract/Call.js';
|
|
2
|
+
import type { RouteAddress } from '../contract/RouteAddress.js';
|
|
3
|
+
export type RouteKind = 'local' | 'remote' | 'system';
|
|
4
|
+
/** Executable destination known by the dispatcher. */
|
|
5
|
+
export interface Route {
|
|
6
|
+
readonly kind: RouteKind;
|
|
7
|
+
readonly address: RouteAddress;
|
|
8
|
+
execute(call: Call): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=Route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../src/dispatch/Route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,sDAAsD;AACtD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../../src/dispatch/Route.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Call } from '../contract/Call.js';
|
|
2
|
+
import { FougereError } from '../wire/errors.js';
|
|
3
|
+
import type { Route } from './Route.js';
|
|
4
|
+
import type { RoutePolicy } from './RoutePolicy.js';
|
|
5
|
+
/** Describes an unresolved route from the destinations visible to one dispatcher. */
|
|
6
|
+
export declare class RouteNotFoundError extends FougereError {
|
|
7
|
+
readonly servedOperations: readonly string[];
|
|
8
|
+
constructor(call: Call, routes: readonly Route[], policy?: RoutePolicy);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=RouteNotFoundError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteNotFoundError.d.ts","sourceRoot":"","sources":["../../src/dispatch/RouteNotFoundError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qFAAqF;AACrF,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEjC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW;CAmBvE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ErrorCode, FougereError } from '../wire/errors.js';
|
|
2
|
+
/** Describes an unresolved route from the destinations visible to one dispatcher. */
|
|
3
|
+
export class RouteNotFoundError extends FougereError {
|
|
4
|
+
servedOperations;
|
|
5
|
+
constructor(call, routes, policy) {
|
|
6
|
+
const served = routes
|
|
7
|
+
.filter((route) => !policy || policy.accepts(route))
|
|
8
|
+
.filter((route) => route.address.entity === call.address.entity)
|
|
9
|
+
.filter((route) => route.kind === 'system'
|
|
10
|
+
|| route.address.surface === call.address.surface)
|
|
11
|
+
.map((route) => route.address.operation);
|
|
12
|
+
const operation = call.address.operation;
|
|
13
|
+
const entity = call.address.entity;
|
|
14
|
+
const message = entity === 'rpc'
|
|
15
|
+
? `Unknown rpc operation '${operation}'. `
|
|
16
|
+
+ (served.length ? `It serves ${served.join(', ')}.` : 'It serves nothing.')
|
|
17
|
+
: served.length
|
|
18
|
+
? `Unknown operation '${operation}' on '${entity}'. It serves ${served.join(', ')}.`
|
|
19
|
+
: `No route serves '${call.address}'`;
|
|
20
|
+
super({ code: ErrorCode.NOT_FOUND, message, entity, operation });
|
|
21
|
+
this.servedOperations = served;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=RouteNotFoundError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteNotFoundError.js","sourceRoot":"","sources":["../../src/dispatch/RouteNotFoundError.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI5D,qFAAqF;AACrF,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACzC,gBAAgB,CAAoB;IAE7C,YAAY,IAAU,EAAE,MAAwB,EAAE,MAAoB;QACpE,MAAM,MAAM,GAAG,MAAM;aAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aACnD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;aAC/D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;eACrC,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;aACnD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK;YAC9B,CAAC,CAAC,0BAA0B,SAAS,KAAK;kBACtC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAC9E,CAAC,CAAC,MAAM,CAAC,MAAM;gBACb,CAAC,CAAC,sBAAsB,SAAS,SAAS,MAAM,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACpF,CAAC,CAAC,oBAAoB,IAAI,CAAC,OAAO,GAAG,CAAC;QAE1C,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Call } from '../contract/Call.js';
|
|
2
|
+
import type { Route } from './Route.js';
|
|
3
|
+
/** Restricts which registered routes one dispatch capability may enter. */
|
|
4
|
+
export interface RoutePolicy {
|
|
5
|
+
accepts(route: Route): boolean;
|
|
6
|
+
notFound?(call: Call, routes: readonly Route[]): Error | undefined;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=RoutePolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutePolicy.d.ts","sourceRoot":"","sources":["../../src/dispatch/RoutePolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IAC/B,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC;CACpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutePolicy.js","sourceRoot":"","sources":["../../src/dispatch/RoutePolicy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RouteAddress } from '../contract/RouteAddress.js';
|
|
2
|
+
import type { Route } from './Route.js';
|
|
3
|
+
import type { RouteResolver } from './RouteResolver.js';
|
|
4
|
+
/** Exact registry of every operation the application can dispatch. */
|
|
5
|
+
export declare class RouteRegistry {
|
|
6
|
+
private readonly byAddress;
|
|
7
|
+
private readonly resolvers;
|
|
8
|
+
private readonly pending;
|
|
9
|
+
get size(): number;
|
|
10
|
+
register(route: Route): void;
|
|
11
|
+
addResolver(resolver: RouteResolver): void;
|
|
12
|
+
find(address: RouteAddress): Route | undefined;
|
|
13
|
+
resolve(address: RouteAddress): Promise<Route | undefined>;
|
|
14
|
+
private resolveUnknown;
|
|
15
|
+
routes(): Route[];
|
|
16
|
+
operationNames(entity: string, surface?: string): string[];
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=RouteRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteRegistry.d.ts","sourceRoot":"","sources":["../../src/dispatch/RouteRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,sEAAsE;AACtE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiD;IAEzE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAW5B,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,GAAG,SAAS;IAWxC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;YAalD,cAAc;IAU5B,MAAM,IAAI,KAAK,EAAE;IAIjB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;CAK3D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { RouteAddress } from '../contract/RouteAddress.js';
|
|
2
|
+
/** Exact registry of every operation the application can dispatch. */
|
|
3
|
+
export class RouteRegistry {
|
|
4
|
+
byAddress = new Map();
|
|
5
|
+
resolvers = [];
|
|
6
|
+
pending = new Map();
|
|
7
|
+
get size() {
|
|
8
|
+
return this.byAddress.size;
|
|
9
|
+
}
|
|
10
|
+
register(route) {
|
|
11
|
+
const key = route.address.key();
|
|
12
|
+
const existing = this.byAddress.get(key);
|
|
13
|
+
if (existing) {
|
|
14
|
+
throw new Error(`Route collision at '${route.address}': ${existing.kind} and ${route.kind}`);
|
|
15
|
+
}
|
|
16
|
+
this.byAddress.set(key, route);
|
|
17
|
+
}
|
|
18
|
+
addResolver(resolver) {
|
|
19
|
+
this.resolvers.push(resolver);
|
|
20
|
+
}
|
|
21
|
+
find(address) {
|
|
22
|
+
const exact = this.byAddress.get(address.key());
|
|
23
|
+
if (exact || address.surface === undefined)
|
|
24
|
+
return exact;
|
|
25
|
+
const shared = this.byAddress.get(new RouteAddress({
|
|
26
|
+
entity: address.entity,
|
|
27
|
+
operation: address.operation,
|
|
28
|
+
}).key());
|
|
29
|
+
return shared?.kind === 'system' ? shared : undefined;
|
|
30
|
+
}
|
|
31
|
+
async resolve(address) {
|
|
32
|
+
const known = this.find(address);
|
|
33
|
+
if (known)
|
|
34
|
+
return known;
|
|
35
|
+
const key = address.key();
|
|
36
|
+
const running = this.pending.get(key);
|
|
37
|
+
if (running)
|
|
38
|
+
return running;
|
|
39
|
+
const resolution = this.resolveUnknown(address).finally(() => this.pending.delete(key));
|
|
40
|
+
this.pending.set(key, resolution);
|
|
41
|
+
return resolution;
|
|
42
|
+
}
|
|
43
|
+
async resolveUnknown(address) {
|
|
44
|
+
for (const resolver of this.resolvers) {
|
|
45
|
+
const route = await resolver.resolve(address);
|
|
46
|
+
if (!route)
|
|
47
|
+
continue;
|
|
48
|
+
this.register(route);
|
|
49
|
+
return route;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
routes() {
|
|
54
|
+
return [...this.byAddress.values()];
|
|
55
|
+
}
|
|
56
|
+
operationNames(entity, surface) {
|
|
57
|
+
return this.routes()
|
|
58
|
+
.filter((route) => route.address.entity === entity && route.address.surface === surface)
|
|
59
|
+
.map((route) => route.address.operation);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=RouteRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteRegistry.js","sourceRoot":"","sources":["../../src/dispatch/RouteRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RouteAddress } from '../contract/RouteAddress.js';
|
|
2
|
+
import type { Route } from './Route.js';
|
|
3
|
+
/** Resolves routes that cannot be known when the registry is built. */
|
|
4
|
+
export interface RouteResolver {
|
|
5
|
+
resolve(address: RouteAddress): Route | undefined | Promise<Route | undefined>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=RouteResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteResolver.d.ts","sourceRoot":"","sources":["../../src/dispatch/RouteResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;CAChF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteResolver.js","sourceRoot":"","sources":["../../src/dispatch/RouteResolver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Fields } from '@fougere/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Judges storage writes and list options without narrowing the ORM interface.
|
|
4
|
+
*
|
|
5
|
+
* Storage is a way out like the client surface, so what goes to it is judged too — the
|
|
6
|
+
* same rule `OutputProjector` applies on the other exit.
|
|
7
|
+
*/
|
|
8
|
+
export declare class StorageGuard {
|
|
9
|
+
private readonly fields;
|
|
10
|
+
private readonly entity;
|
|
11
|
+
constructor(fields: Fields, entity: string);
|
|
12
|
+
guard<T extends object>(orm: T): T;
|
|
13
|
+
private judge;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=StorageGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageGuard.d.ts","sourceRoot":"","sources":["../../src/dispatch/StorageGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AASrD;;;;;GAKG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;IAGjC,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IA4BlC,OAAO,CAAC,KAAK;CAqBd"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Judge } from '@fougere/schema';
|
|
2
|
+
import { assertListOptions } from '../orm.js';
|
|
3
|
+
import { ErrorCode, FougereError } from '../wire/errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Judges storage writes and list options without narrowing the ORM interface.
|
|
6
|
+
*
|
|
7
|
+
* Storage is a way out like the client surface, so what goes to it is judged too — the
|
|
8
|
+
* same rule `OutputProjector` applies on the other exit.
|
|
9
|
+
*/
|
|
10
|
+
export class StorageGuard {
|
|
11
|
+
fields;
|
|
12
|
+
entity;
|
|
13
|
+
constructor(fields, entity) {
|
|
14
|
+
this.fields = fields;
|
|
15
|
+
this.entity = entity;
|
|
16
|
+
}
|
|
17
|
+
guard(orm) {
|
|
18
|
+
const writer = orm;
|
|
19
|
+
if (typeof writer.create !== 'function' || typeof writer.update !== 'function')
|
|
20
|
+
return orm;
|
|
21
|
+
const validation = this;
|
|
22
|
+
const guarded = Object.create(orm);
|
|
23
|
+
guarded.create = async function (...args) {
|
|
24
|
+
validation.judge(args[0], 'create');
|
|
25
|
+
return writer.create.apply(this, args);
|
|
26
|
+
};
|
|
27
|
+
guarded.update = async function (...args) {
|
|
28
|
+
validation.judge(args[1], 'update');
|
|
29
|
+
return writer.update.apply(this, args);
|
|
30
|
+
};
|
|
31
|
+
const reader = orm;
|
|
32
|
+
if (typeof reader.list === 'function') {
|
|
33
|
+
guarded.list = async function (...args) {
|
|
34
|
+
assertListOptions(args[0], validation.entity);
|
|
35
|
+
return reader.list.apply(this, args);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return guarded;
|
|
39
|
+
}
|
|
40
|
+
judge(value, operation) {
|
|
41
|
+
if (typeof value !== 'object' || value === null)
|
|
42
|
+
return;
|
|
43
|
+
const errors = [];
|
|
44
|
+
for (const [key, item] of Object.entries(value)) {
|
|
45
|
+
const field = this.fields[key];
|
|
46
|
+
if (!field || item === undefined)
|
|
47
|
+
continue;
|
|
48
|
+
const checked = Judge.value(field, item);
|
|
49
|
+
if ('error' in checked)
|
|
50
|
+
errors.push(`${key}: ${checked.error}`);
|
|
51
|
+
}
|
|
52
|
+
if (errors.length > 0) {
|
|
53
|
+
throw new FougereError({
|
|
54
|
+
code: ErrorCode.INTERNAL_ERROR,
|
|
55
|
+
message: `Refused on the way out — ${errors.join(', ')}`,
|
|
56
|
+
entity: this.entity,
|
|
57
|
+
operation,
|
|
58
|
+
details: errors,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=StorageGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageGuard.js","sourceRoot":"","sources":["../../src/dispatch/StorageGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAO5D;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IAEJ;IACA;IAFnB,YACmB,MAAc,EACd,MAAc;QADd,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAmB,GAAM;QAC5B,MAAM,MAAM,GAAG,GAAwB,CAAC;QACxC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,GAAG,CAAC;QAE3F,MAAM,UAAU,GAAG,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAe,CAAC;QAEjD,OAAO,CAAC,MAAM,GAAG,KAAK,WAAW,GAAG,IAAI;YACtC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,OAAO,CAAC,MAAM,GAAG,KAAK,WAAW,GAAG,IAAI;YACtC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAA4D,CAAC;QAC5E,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,OAAoC,CAAC,IAAI,GAAG,KAAK,WAAW,GAAG,IAAe;gBAC7E,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAuB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBACpE,OAAQ,MAAM,CAAC,IAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,KAAc,EAAE,SAAiB;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAExD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,OAAO,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CAAC;gBACrB,IAAI,EAAE,SAAS,CAAC,cAAc;gBAC9B,OAAO,EAAE,4BAA4B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxD,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS;gBACT,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|