@fougere/core 0.9.3-alpha.0 → 0.11.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/dist/AdapterConfig.d.ts +10 -0
- package/dist/AdapterConfig.d.ts.map +1 -0
- package/dist/AdapterConfig.js +3 -0
- package/dist/AdapterConfig.js.map +1 -0
- package/dist/AnswerFor.d.ts +5 -0
- package/dist/AnswerFor.d.ts.map +1 -0
- package/dist/AnswerFor.js +2 -0
- package/dist/AnswerFor.js.map +1 -0
- package/dist/Binding.d.ts +4 -0
- package/dist/Binding.d.ts.map +1 -0
- package/dist/Binding.js +2 -0
- package/dist/Binding.js.map +1 -0
- package/dist/{identity.d.ts → CallIdentity.d.ts} +4 -17
- package/dist/CallIdentity.d.ts.map +1 -0
- package/dist/{identity.js → CallIdentity.js} +3 -6
- package/dist/CallIdentity.js.map +1 -0
- package/dist/Constraint.d.ts +3 -0
- package/dist/Constraint.d.ts.map +1 -0
- package/dist/Constraint.js +2 -0
- package/dist/Constraint.js.map +1 -0
- package/dist/{conventions.d.ts → Conventions.d.ts} +14 -8
- package/dist/Conventions.d.ts.map +1 -0
- package/dist/{conventions.js → Conventions.js} +7 -3
- package/dist/Conventions.js.map +1 -0
- package/dist/ConventionsInput.d.ts +8 -0
- package/dist/ConventionsInput.d.ts.map +1 -0
- package/dist/ConventionsInput.js +2 -0
- package/dist/ConventionsInput.js.map +1 -0
- package/dist/Ctor.d.ts +3 -0
- package/dist/Ctor.d.ts.map +1 -0
- package/dist/Ctor.js +2 -0
- package/dist/Ctor.js.map +1 -0
- package/dist/Declared.d.ts +8 -0
- package/dist/Declared.d.ts.map +1 -0
- package/dist/Declared.js +2 -0
- package/dist/Declared.js.map +1 -0
- package/dist/DeclaredHandler.d.ts +18 -0
- package/dist/DeclaredHandler.d.ts.map +1 -0
- package/dist/DeclaredHandler.js +2 -0
- package/dist/DeclaredHandler.js.map +1 -0
- package/dist/DeclaredSubject.d.ts +7 -0
- package/dist/DeclaredSubject.d.ts.map +1 -0
- package/dist/DeclaredSubject.js +2 -0
- package/dist/DeclaredSubject.js.map +1 -0
- package/dist/{graph.d.ts → DomainCluster.d.ts} +3 -12
- package/dist/DomainCluster.d.ts.map +1 -0
- package/dist/{graph.js → DomainCluster.js} +1 -1
- package/dist/DomainCluster.js.map +1 -0
- package/dist/EffectiveCollector.d.ts +8 -0
- package/dist/EffectiveCollector.d.ts.map +1 -0
- package/dist/EffectiveCollector.js +2 -0
- package/dist/EffectiveCollector.js.map +1 -0
- package/dist/EffectiveOperation.d.ts +65 -0
- package/dist/EffectiveOperation.d.ts.map +1 -0
- package/dist/EffectiveOperation.js +2 -0
- package/dist/EffectiveOperation.js.map +1 -0
- package/dist/EffectiveOperationModel.d.ts +24 -0
- package/dist/EffectiveOperationModel.d.ts.map +1 -0
- package/dist/{effective-operation.js → EffectiveOperationModel.js} +9 -23
- package/dist/EffectiveOperationModel.js.map +1 -0
- package/dist/EffectiveOperationOptions.d.ts +7 -0
- package/dist/EffectiveOperationOptions.d.ts.map +1 -0
- package/dist/EffectiveOperationOptions.js +2 -0
- package/dist/EffectiveOperationOptions.js.map +1 -0
- package/dist/EffectiveOperationSemantics.d.ts +8 -0
- package/dist/EffectiveOperationSemantics.d.ts.map +1 -0
- package/dist/EffectiveOperationSemantics.js +8 -0
- package/dist/EffectiveOperationSemantics.js.map +1 -0
- package/dist/EffectiveOperationsMap.d.ts +3 -0
- package/dist/EffectiveOperationsMap.d.ts.map +1 -0
- package/dist/EffectiveOperationsMap.js +2 -0
- package/dist/EffectiveOperationsMap.js.map +1 -0
- package/dist/EffectiveParameter.d.ts +14 -0
- package/dist/EffectiveParameter.d.ts.map +1 -0
- package/dist/EffectiveParameter.js +2 -0
- package/dist/EffectiveParameter.js.map +1 -0
- package/dist/EntityNode.d.ts +7 -0
- package/dist/EntityNode.d.ts.map +1 -0
- package/dist/EntityNode.js +2 -0
- package/dist/EntityNode.js.map +1 -0
- package/dist/{config-loader.d.ts → FougereConfig.d.ts} +16 -16
- package/dist/FougereConfig.d.ts.map +1 -0
- package/dist/{config-loader.js → FougereConfig.js} +1 -2
- package/dist/FougereConfig.js.map +1 -0
- package/dist/FougereNames.d.ts +4 -0
- package/dist/FougereNames.d.ts.map +1 -0
- package/dist/FougereNames.js +2 -0
- package/dist/FougereNames.js.map +1 -0
- package/dist/FougerePorts.d.ts +9 -0
- package/dist/FougerePorts.d.ts.map +1 -0
- package/dist/FougerePorts.js +2 -0
- package/dist/FougerePorts.js.map +1 -0
- package/dist/FrondConfig.d.ts +36 -0
- package/dist/FrondConfig.d.ts.map +1 -0
- package/dist/{frond-config.js → FrondConfig.js} +1 -1
- package/dist/FrondConfig.js.map +1 -0
- package/dist/{declare.d.ts → FrondDeclaration.d.ts} +7 -29
- package/dist/FrondDeclaration.d.ts.map +1 -0
- package/dist/{declare.js → FrondDeclaration.js} +2 -3
- package/dist/FrondDeclaration.js.map +1 -0
- package/dist/FrondIdentity.d.ts +8 -0
- package/dist/FrondIdentity.d.ts.map +1 -0
- package/dist/FrondIdentity.js +2 -0
- package/dist/FrondIdentity.js.map +1 -0
- package/dist/NameOf.d.ts +10 -0
- package/dist/NameOf.d.ts.map +1 -0
- package/dist/NameOf.js +2 -0
- package/dist/NameOf.js.map +1 -0
- package/dist/OperationOverride.d.ts +38 -0
- package/dist/OperationOverride.d.ts.map +1 -0
- package/dist/OperationOverride.js +2 -0
- package/dist/OperationOverride.js.map +1 -0
- package/dist/PortChoice.d.ts +13 -0
- package/dist/PortChoice.d.ts.map +1 -0
- package/dist/PortChoice.js +2 -0
- package/dist/PortChoice.js.map +1 -0
- package/dist/{source.d.ts → Source.d.ts} +5 -24
- package/dist/Source.d.ts.map +1 -0
- package/dist/{source.js → Source.js} +5 -4
- package/dist/Source.js.map +1 -0
- package/dist/SourceConfig.d.ts +10 -0
- package/dist/SourceConfig.d.ts.map +1 -0
- package/dist/SourceConfig.js +2 -0
- package/dist/SourceConfig.js.map +1 -0
- package/dist/SourceView.d.ts +13 -0
- package/dist/SourceView.d.ts.map +1 -0
- package/dist/SourceView.js +2 -0
- package/dist/SourceView.js.map +1 -0
- package/dist/VerifiedCall.d.ts +8 -0
- package/dist/VerifiedCall.d.ts.map +1 -0
- package/dist/VerifiedCall.js +2 -0
- package/dist/VerifiedCall.js.map +1 -0
- package/dist/boot/App.d.ts +71 -0
- package/dist/boot/App.d.ts.map +1 -0
- package/dist/boot/App.js +2 -0
- package/dist/boot/App.js.map +1 -0
- package/dist/boot/AppLifecycle.d.ts +2 -19
- package/dist/boot/AppLifecycle.d.ts.map +1 -1
- package/dist/boot/AppLifecycle.js.map +1 -1
- package/dist/boot/AuthConfig.d.ts +14 -0
- package/dist/boot/AuthConfig.d.ts.map +1 -0
- package/dist/boot/AuthConfig.js +2 -0
- package/dist/boot/AuthConfig.js.map +1 -0
- package/dist/boot/AuthContext.d.ts +12 -0
- package/dist/boot/AuthContext.d.ts.map +1 -0
- package/dist/boot/AuthContext.js +2 -0
- package/dist/boot/AuthContext.js.map +1 -0
- package/dist/boot/AuthRuntime.d.ts +19 -0
- package/dist/boot/AuthRuntime.d.ts.map +1 -0
- package/dist/boot/AuthRuntime.js +2 -0
- package/dist/boot/AuthRuntime.js.map +1 -0
- package/dist/boot/CreateAppOptions.d.ts +81 -0
- package/dist/boot/CreateAppOptions.d.ts.map +1 -0
- package/dist/boot/CreateAppOptions.js +2 -0
- package/dist/boot/CreateAppOptions.js.map +1 -0
- package/dist/boot/Emissions.d.ts +11 -7
- package/dist/boot/Emissions.d.ts.map +1 -1
- package/dist/boot/Emissions.js +83 -45
- package/dist/boot/Emissions.js.map +1 -1
- package/dist/boot/Extension.d.ts +20 -0
- package/dist/boot/Extension.d.ts.map +1 -0
- package/dist/boot/Extension.js +2 -0
- package/dist/boot/Extension.js.map +1 -0
- package/dist/boot/Hosting.d.ts +38 -0
- package/dist/boot/Hosting.d.ts.map +1 -0
- package/dist/boot/Hosting.js +2 -0
- package/dist/boot/Hosting.js.map +1 -0
- package/dist/boot/Peer.d.ts +16 -0
- package/dist/boot/Peer.d.ts.map +1 -0
- package/dist/boot/Peer.js +2 -0
- package/dist/boot/Peer.js.map +1 -0
- package/dist/boot/apply.d.ts +1 -1
- package/dist/boot/apply.js +1 -1
- package/dist/boot/apply.js.map +1 -1
- package/dist/boot/bootstrap.d.ts +2 -1
- package/dist/boot/bootstrap.d.ts.map +1 -1
- package/dist/boot/bootstrap.js +196 -59
- package/dist/boot/bootstrap.js.map +1 -1
- package/dist/boot/card.d.ts +2 -2
- package/dist/boot/card.d.ts.map +1 -1
- package/dist/boot/card.js +11 -8
- package/dist/boot/card.js.map +1 -1
- package/dist/boot/declared.d.ts +2 -2
- package/dist/boot/declared.d.ts.map +1 -1
- package/dist/boot/declared.js +36 -4
- package/dist/boot/declared.js.map +1 -1
- package/dist/boot/frame.d.ts +1 -1
- package/dist/boot/frame.js +1 -1
- package/dist/boot/hosted.d.ts +1 -1
- package/dist/boot/hosted.d.ts.map +1 -1
- package/dist/boot/install.d.ts +21 -7
- package/dist/boot/install.d.ts.map +1 -1
- package/dist/boot/install.js +41 -27
- package/dist/boot/install.js.map +1 -1
- package/dist/boot/ownership.d.ts +7 -5
- package/dist/boot/ownership.d.ts.map +1 -1
- package/dist/boot/ownership.js +81 -40
- package/dist/boot/ownership.js.map +1 -1
- package/dist/boot/peerOver.d.ts +4 -0
- package/dist/boot/peerOver.d.ts.map +1 -0
- package/dist/boot/peerOver.js +12 -0
- package/dist/boot/peerOver.js.map +1 -0
- package/dist/boot/ports.d.ts +4 -3
- package/dist/boot/ports.d.ts.map +1 -1
- package/dist/boot/ports.js +48 -37
- package/dist/boot/ports.js.map +1 -1
- package/dist/boot/relations.d.ts +54 -0
- package/dist/boot/relations.d.ts.map +1 -0
- package/dist/boot/relations.js +150 -0
- package/dist/boot/relations.js.map +1 -0
- package/dist/boot/remote.d.ts +3 -8
- package/dist/boot/remote.d.ts.map +1 -1
- package/dist/boot/remote.js +19 -15
- package/dist/boot/remote.js.map +1 -1
- package/dist/boot/runner.d.ts +2 -2
- package/dist/boot/runner.d.ts.map +1 -1
- package/dist/boot/seed.d.ts +4 -3
- package/dist/boot/seed.d.ts.map +1 -1
- package/dist/boot/seed.js +6 -6
- package/dist/boot/seed.js.map +1 -1
- package/dist/boot/statement-drift.d.ts +4 -3
- package/dist/boot/statement-drift.d.ts.map +1 -1
- package/dist/boot/statement-drift.js.map +1 -1
- package/dist/boot/together.d.ts +11 -4
- package/dist/boot/together.d.ts.map +1 -1
- package/dist/boot/together.js +62 -28
- package/dist/boot/together.js.map +1 -1
- package/dist/builtin/Carry.d.ts +29 -0
- package/dist/builtin/Carry.d.ts.map +1 -0
- package/dist/builtin/Carry.js +46 -0
- package/dist/builtin/Carry.js.map +1 -0
- package/dist/builtin/LogLevel.d.ts +2 -0
- package/dist/builtin/LogLevel.d.ts.map +1 -0
- package/dist/builtin/LogLevel.js +2 -0
- package/dist/builtin/LogLevel.js.map +1 -0
- package/dist/builtin/LogRecord.d.ts +12 -0
- package/dist/builtin/LogRecord.d.ts.map +1 -0
- package/dist/builtin/LogRecord.js +2 -0
- package/dist/builtin/LogRecord.js.map +1 -0
- package/dist/builtin/LogSink.d.ts +4 -0
- package/dist/builtin/LogSink.d.ts.map +1 -0
- package/dist/builtin/LogSink.js +2 -0
- package/dist/builtin/LogSink.js.map +1 -0
- package/dist/builtin/Logger.d.ts +27 -0
- package/dist/builtin/Logger.d.ts.map +1 -0
- package/dist/builtin/{logger.js → Logger.js} +1 -47
- package/dist/builtin/Logger.js.map +1 -0
- package/dist/builtin/LoggerOptions.d.ts +14 -0
- package/dist/builtin/LoggerOptions.d.ts.map +1 -0
- package/dist/builtin/LoggerOptions.js +2 -0
- package/dist/builtin/LoggerOptions.js.map +1 -0
- package/dist/builtin/Rendered.d.ts +21 -0
- package/dist/builtin/Rendered.d.ts.map +1 -0
- package/dist/builtin/Rendered.js +2 -0
- package/dist/builtin/Rendered.js.map +1 -0
- package/dist/contract.d.ts +35 -13
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +9 -6
- package/dist/contract.js.map +1 -1
- package/dist/crypto/CryptoPort.d.ts +12 -0
- package/dist/crypto/CryptoPort.d.ts.map +1 -0
- package/dist/crypto/CryptoPort.js +2 -0
- package/dist/crypto/CryptoPort.js.map +1 -0
- package/dist/crypto/PublicJwk.d.ts +8 -0
- package/dist/crypto/PublicJwk.d.ts.map +1 -0
- package/dist/crypto/PublicJwk.js +2 -0
- package/dist/crypto/PublicJwk.js.map +1 -0
- package/dist/crypto/Signer.d.ts +5 -0
- package/dist/crypto/Signer.d.ts.map +1 -0
- package/dist/crypto/Signer.js +2 -0
- package/dist/crypto/Signer.js.map +1 -0
- package/dist/crypto/Verifier.d.ts +6 -0
- package/dist/crypto/Verifier.d.ts.map +1 -0
- package/dist/crypto/Verifier.js +2 -0
- package/dist/crypto/Verifier.js.map +1 -0
- package/dist/crypto/node.d.ts +4 -1
- package/dist/crypto/node.d.ts.map +1 -1
- package/dist/crypto/node.js.map +1 -1
- package/dist/crypto/webcrypto.d.ts +4 -1
- package/dist/crypto/webcrypto.d.ts.map +1 -1
- package/dist/crypto/webcrypto.js.map +1 -1
- package/dist/define.d.ts +1 -1
- package/dist/descriptor/CollectorEntry.d.ts +12 -0
- package/dist/descriptor/CollectorEntry.d.ts.map +1 -0
- package/dist/descriptor/CollectorEntry.js +2 -0
- package/dist/descriptor/CollectorEntry.js.map +1 -0
- package/dist/descriptor/EntityEntry.d.ts +13 -0
- package/dist/descriptor/EntityEntry.d.ts.map +1 -0
- package/dist/descriptor/EntityEntry.js +2 -0
- package/dist/descriptor/EntityEntry.js.map +1 -0
- package/dist/descriptor/ExtensionEntry.d.ts +20 -0
- package/dist/descriptor/ExtensionEntry.d.ts.map +1 -0
- package/dist/descriptor/ExtensionEntry.js +2 -0
- package/dist/descriptor/ExtensionEntry.js.map +1 -0
- package/dist/descriptor/FrondDescriptor.d.ts +61 -0
- package/dist/descriptor/FrondDescriptor.d.ts.map +1 -0
- package/dist/descriptor/{frond.js → FrondDescriptor.js} +1 -1
- package/dist/descriptor/FrondDescriptor.js.map +1 -0
- package/dist/descriptor/FrondSource.d.ts +8 -0
- package/dist/descriptor/FrondSource.d.ts.map +1 -0
- package/dist/descriptor/FrondSource.js +2 -0
- package/dist/descriptor/FrondSource.js.map +1 -0
- package/dist/descriptor/Fronds.d.ts +2 -1
- package/dist/descriptor/Fronds.d.ts.map +1 -1
- package/dist/descriptor/Fronds.js.map +1 -1
- package/dist/descriptor/HandlerEntry.d.ts +27 -0
- package/dist/descriptor/HandlerEntry.d.ts.map +1 -0
- package/dist/descriptor/HandlerEntry.js +2 -0
- package/dist/descriptor/HandlerEntry.js.map +1 -0
- package/dist/descriptor/MiddlewareEntry.d.ts +17 -0
- package/dist/descriptor/MiddlewareEntry.d.ts.map +1 -0
- package/dist/descriptor/MiddlewareEntry.js +2 -0
- package/dist/descriptor/MiddlewareEntry.js.map +1 -0
- package/dist/descriptor/PresenterEntry.d.ts +23 -0
- package/dist/descriptor/PresenterEntry.d.ts.map +1 -0
- package/dist/descriptor/PresenterEntry.js +2 -0
- package/dist/descriptor/PresenterEntry.js.map +1 -0
- package/dist/descriptor/PresenterFieldMeta.d.ts +14 -0
- package/dist/descriptor/PresenterFieldMeta.d.ts.map +1 -0
- package/dist/descriptor/PresenterFieldMeta.js +2 -0
- package/dist/descriptor/PresenterFieldMeta.js.map +1 -0
- package/dist/descriptor/ProviderEntry.d.ts +19 -0
- package/dist/descriptor/ProviderEntry.d.ts.map +1 -0
- package/dist/descriptor/ProviderEntry.js +2 -0
- package/dist/descriptor/ProviderEntry.js.map +1 -0
- package/dist/descriptor/SeedEntry.d.ts +11 -0
- package/dist/descriptor/SeedEntry.d.ts.map +1 -0
- package/dist/descriptor/SeedEntry.js +2 -0
- package/dist/descriptor/SeedEntry.js.map +1 -0
- package/dist/descriptor/SeedFactory.d.ts +3 -0
- package/dist/descriptor/SeedFactory.d.ts.map +1 -0
- package/dist/descriptor/SeedFactory.js +2 -0
- package/dist/descriptor/SeedFactory.js.map +1 -0
- package/dist/descriptor/bases.d.ts +17 -0
- package/dist/descriptor/bases.d.ts.map +1 -0
- package/dist/descriptor/bases.js +26 -0
- package/dist/descriptor/bases.js.map +1 -0
- package/dist/descriptor/index.d.ts +22 -6
- package/dist/descriptor/index.d.ts.map +1 -1
- package/dist/descriptor/index.js +19 -5
- package/dist/descriptor/index.js.map +1 -1
- package/dist/descriptor/surface.d.ts +3 -2
- package/dist/descriptor/surface.d.ts.map +1 -1
- package/dist/descriptor/surface.js +1 -1
- package/dist/descriptor/surface.js.map +1 -1
- package/dist/diagnostic.d.ts +33 -0
- package/dist/diagnostic.d.ts.map +1 -0
- package/dist/diagnostic.js +12 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/dispatch/ArgumentResolver.d.ts +2 -5
- package/dist/dispatch/ArgumentResolver.d.ts.map +1 -1
- package/dist/dispatch/ArgumentResolver.js.map +1 -1
- package/dist/dispatch/CollectorLookup.d.ts +3 -0
- package/dist/dispatch/CollectorLookup.d.ts.map +1 -0
- package/dist/dispatch/CollectorLookup.js +2 -0
- package/dist/dispatch/CollectorLookup.js.map +1 -0
- package/dist/dispatch/CollectorResolver.d.ts +5 -0
- package/dist/dispatch/CollectorResolver.d.ts.map +1 -0
- package/dist/dispatch/CollectorResolver.js +2 -0
- package/dist/dispatch/CollectorResolver.js.map +1 -0
- package/dist/dispatch/Dependent.d.ts +19 -0
- package/dist/dispatch/Dependent.d.ts.map +1 -0
- package/dist/dispatch/Dependent.js +2 -0
- package/dist/dispatch/Dependent.js.map +1 -0
- package/dist/dispatch/DispatchEvent.d.ts +3 -4
- package/dist/dispatch/DispatchEvent.d.ts.map +1 -1
- package/dist/dispatch/DispatchEvent.js.map +1 -1
- package/dist/dispatch/DispatchLifecycle.d.ts +2 -1
- package/dist/dispatch/DispatchLifecycle.d.ts.map +1 -1
- package/dist/dispatch/DispatchLifecycle.js.map +1 -1
- package/dist/dispatch/DispatchObserver.d.ts +3 -0
- package/dist/dispatch/DispatchObserver.d.ts.map +1 -0
- package/dist/dispatch/DispatchObserver.js +2 -0
- package/dist/dispatch/DispatchObserver.js.map +1 -0
- package/dist/dispatch/DispatchPort.d.ts +1 -1
- package/dist/dispatch/DispatchStage.d.ts +2 -0
- package/dist/dispatch/DispatchStage.d.ts.map +1 -0
- package/dist/dispatch/DispatchStage.js +2 -0
- package/dist/dispatch/DispatchStage.js.map +1 -0
- package/dist/dispatch/Dispatcher.d.ts +15 -2
- package/dist/dispatch/Dispatcher.d.ts.map +1 -1
- package/dist/dispatch/Dispatcher.js +36 -8
- package/dist/dispatch/Dispatcher.js.map +1 -1
- package/dist/dispatch/Facade.d.ts +25 -0
- package/dist/dispatch/Facade.d.ts.map +1 -0
- package/dist/dispatch/Facade.js +2 -0
- package/dist/dispatch/Facade.js.map +1 -0
- package/dist/dispatch/GuardReport.d.ts +9 -0
- package/dist/dispatch/GuardReport.d.ts.map +1 -0
- package/dist/dispatch/GuardReport.js +2 -0
- package/dist/dispatch/GuardReport.js.map +1 -0
- package/dist/dispatch/HandlerFacade.d.ts +9 -28
- package/dist/dispatch/HandlerFacade.d.ts.map +1 -1
- package/dist/dispatch/HandlerFacade.js +19 -19
- package/dist/dispatch/HandlerFacade.js.map +1 -1
- package/dist/dispatch/InFlight.d.ts.map +1 -1
- package/dist/dispatch/InFlight.js +2 -1
- package/dist/dispatch/InFlight.js.map +1 -1
- package/dist/dispatch/Journal.d.ts +25 -0
- package/dist/dispatch/Journal.d.ts.map +1 -0
- package/dist/dispatch/Journal.js +3 -0
- package/dist/dispatch/Journal.js.map +1 -0
- package/dist/dispatch/LocalRoutePolicy.d.ts +1 -1
- package/dist/dispatch/LocalRoutePolicy.d.ts.map +1 -1
- package/dist/dispatch/LocalRoutePolicy.js +2 -1
- package/dist/dispatch/LocalRoutePolicy.js.map +1 -1
- package/dist/dispatch/OperationRoute.d.ts +2 -2
- package/dist/dispatch/OperationRoute.d.ts.map +1 -1
- package/dist/dispatch/OperationRoute.js.map +1 -1
- package/dist/dispatch/PresenterArgs.d.ts +2 -0
- package/dist/dispatch/PresenterArgs.d.ts.map +1 -0
- package/dist/dispatch/PresenterArgs.js +2 -0
- package/dist/dispatch/PresenterArgs.js.map +1 -0
- package/dist/dispatch/PresenterExecutor.d.ts +1 -1
- package/dist/dispatch/PresenterExecutor.d.ts.map +1 -1
- package/dist/dispatch/PresenterExecutor.js +2 -1
- package/dist/dispatch/PresenterExecutor.js.map +1 -1
- package/dist/dispatch/RelationCheck.d.ts +22 -0
- package/dist/dispatch/RelationCheck.d.ts.map +1 -0
- package/dist/dispatch/RelationCheck.js +2 -0
- package/dist/dispatch/RelationCheck.js.map +1 -0
- package/dist/dispatch/Release.d.ts +36 -0
- package/dist/dispatch/Release.d.ts.map +1 -0
- package/dist/dispatch/Release.js +124 -0
- package/dist/dispatch/Release.js.map +1 -0
- package/dist/dispatch/Route.d.ts +3 -2
- package/dist/dispatch/Route.d.ts.map +1 -1
- package/dist/dispatch/RouteExecution.d.ts +3 -0
- package/dist/dispatch/RouteExecution.d.ts.map +1 -0
- package/dist/dispatch/RouteExecution.js +2 -0
- package/dist/dispatch/RouteExecution.js.map +1 -0
- package/dist/dispatch/RoutePolicy.d.ts +1 -1
- package/dist/dispatch/StorageGuard.d.ts +24 -13
- package/dist/dispatch/StorageGuard.d.ts.map +1 -1
- package/dist/dispatch/StorageGuard.js +69 -12
- package/dist/dispatch/StorageGuard.js.map +1 -1
- package/dist/dispatch/presenterArguments.d.ts +3 -3
- package/dist/dispatch/presenterArguments.d.ts.map +1 -1
- package/dist/dispatch/routeNotFound.d.ts +2 -2
- package/dist/dispatch/routeNotFound.d.ts.map +1 -1
- package/dist/dispatch/routeNotFound.js +2 -1
- package/dist/dispatch/routeNotFound.js.map +1 -1
- package/dist/dispatch/validateInput.d.ts +1 -1
- package/dist/dispatch/validateInput.d.ts.map +1 -1
- package/dist/dispatch/validateInput.js +2 -1
- package/dist/dispatch/validateInput.js.map +1 -1
- package/dist/entry/facade.js +1 -1
- package/dist/entry/transport.d.ts +1 -1
- package/dist/entry/transport.d.ts.map +1 -1
- package/dist/entry/transport.js +1 -1
- package/dist/index.d.ts +97 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -13
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -2
- package/dist/node.js.map +1 -1
- package/dist/prefab/AggregateConstructor.d.ts +8 -0
- package/dist/prefab/AggregateConstructor.d.ts.map +1 -0
- package/dist/prefab/AggregateConstructor.js +2 -0
- package/dist/prefab/AggregateConstructor.js.map +1 -0
- package/dist/prefab/AggregateOf.d.ts +7 -0
- package/dist/prefab/AggregateOf.d.ts.map +1 -0
- package/dist/prefab/AggregateOf.js +2 -0
- package/dist/prefab/AggregateOf.js.map +1 -0
- package/dist/prefab/AggregateShape.d.ts +9 -0
- package/dist/prefab/AggregateShape.d.ts.map +1 -0
- package/dist/prefab/AggregateShape.js +2 -0
- package/dist/prefab/AggregateShape.js.map +1 -0
- package/dist/prefab/{crud.d.ts → CrudConstructor.d.ts} +5 -21
- package/dist/prefab/CrudConstructor.d.ts.map +1 -0
- package/dist/prefab/{crud.js → CrudConstructor.js} +1 -1
- package/dist/prefab/CrudConstructor.js.map +1 -0
- package/dist/prefab/CrudOpName.d.ts +3 -0
- package/dist/prefab/CrudOpName.d.ts.map +1 -0
- package/dist/prefab/CrudOpName.js +2 -0
- package/dist/prefab/CrudOpName.js.map +1 -0
- package/dist/prefab/CrudOps.d.ts +20 -0
- package/dist/prefab/CrudOps.d.ts.map +1 -0
- package/dist/prefab/CrudOps.js +2 -0
- package/dist/prefab/CrudOps.js.map +1 -0
- package/dist/prefab/CrudViews.d.ts +5 -0
- package/dist/prefab/CrudViews.d.ts.map +1 -0
- package/dist/prefab/CrudViews.js +2 -0
- package/dist/prefab/CrudViews.js.map +1 -0
- package/dist/prefab/MirrorConstructor.d.ts +9 -0
- package/dist/prefab/MirrorConstructor.d.ts.map +1 -0
- package/dist/prefab/{mirror.js → MirrorConstructor.js} +1 -1
- package/dist/prefab/MirrorConstructor.js.map +1 -0
- package/dist/prefab/MirrorOf.d.ts +19 -0
- package/dist/prefab/MirrorOf.d.ts.map +1 -0
- package/dist/prefab/MirrorOf.js +2 -0
- package/dist/prefab/MirrorOf.js.map +1 -0
- package/dist/prefab/Refreshed.d.ts +10 -0
- package/dist/prefab/Refreshed.d.ts.map +1 -0
- package/dist/prefab/Refreshed.js +2 -0
- package/dist/prefab/Refreshed.js.map +1 -0
- package/dist/prefab/RepositoryConstructor.d.ts +15 -0
- package/dist/prefab/RepositoryConstructor.d.ts.map +1 -0
- package/dist/prefab/{repository.js → RepositoryConstructor.js} +1 -1
- package/dist/prefab/RepositoryConstructor.js.map +1 -0
- package/dist/prefab/RepositoryOf.d.ts +7 -0
- package/dist/prefab/RepositoryOf.d.ts.map +1 -0
- package/dist/prefab/RepositoryOf.js +2 -0
- package/dist/prefab/RepositoryOf.js.map +1 -0
- package/dist/scan.d.ts +3 -22
- package/dist/scan.d.ts.map +1 -1
- package/dist/storage/{criterion.d.ts → Comparison.d.ts} +2 -3
- package/dist/storage/Comparison.d.ts.map +1 -0
- package/dist/storage/{criterion.js → Comparison.js} +1 -2
- package/dist/storage/Comparison.js.map +1 -0
- package/dist/storage/ComparisonName.d.ts +3 -0
- package/dist/storage/ComparisonName.d.ts.map +1 -0
- package/dist/storage/ComparisonName.js +2 -0
- package/dist/storage/ComparisonName.js.map +1 -0
- package/dist/storage/ListOptions.d.ts +23 -0
- package/dist/storage/ListOptions.d.ts.map +1 -0
- package/dist/storage/ListOptions.js +2 -0
- package/dist/storage/ListOptions.js.map +1 -0
- package/dist/storage/ListResult.d.ts +10 -0
- package/dist/storage/ListResult.d.ts.map +1 -0
- package/dist/storage/ListResult.js +2 -0
- package/dist/storage/ListResult.js.map +1 -0
- package/dist/storage/SelectOption.d.ts +6 -0
- package/dist/storage/SelectOption.d.ts.map +1 -0
- package/dist/storage/SelectOption.js +2 -0
- package/dist/storage/SelectOption.js.map +1 -0
- package/dist/storage/{port.d.ts → Storage.d.ts} +4 -47
- package/dist/storage/Storage.d.ts.map +1 -0
- package/dist/storage/{port.js → Storage.js} +1 -1
- package/dist/storage/Storage.js.map +1 -0
- package/dist/storage/StorageFactory.d.ts +8 -0
- package/dist/storage/StorageFactory.d.ts.map +1 -0
- package/dist/storage/StorageFactory.js +2 -0
- package/dist/storage/StorageFactory.js.map +1 -0
- package/dist/storage/{store.d.ts → Store.d.ts} +3 -5
- package/dist/storage/Store.d.ts.map +1 -0
- package/dist/storage/{store.js → Store.js} +3 -4
- package/dist/storage/Store.js.map +1 -0
- package/dist/storage/Together.d.ts +8 -0
- package/dist/storage/Together.d.ts.map +1 -0
- package/dist/storage/Together.js +2 -0
- package/dist/storage/Together.js.map +1 -0
- package/dist/storage/Values.d.ts +3 -0
- package/dist/storage/Values.d.ts.map +1 -0
- package/dist/storage/Values.js +2 -0
- package/dist/storage/Values.js.map +1 -0
- package/dist/verify.d.ts +6 -15
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +5 -5
- package/dist/verify.js.map +1 -1
- package/dist/wire/Addresses.d.ts +16 -0
- package/dist/wire/Addresses.d.ts.map +1 -0
- package/dist/wire/Addresses.js +2 -0
- package/dist/wire/Addresses.js.map +1 -0
- package/dist/wire/Answer.d.ts +3 -0
- package/dist/wire/Answer.d.ts.map +1 -0
- package/dist/wire/Answer.js +2 -0
- package/dist/wire/Answer.js.map +1 -0
- package/dist/wire/AnyHandler.d.ts +3 -0
- package/dist/wire/AnyHandler.d.ts.map +1 -0
- package/dist/wire/AnyHandler.js +2 -0
- package/dist/wire/AnyHandler.js.map +1 -0
- package/dist/wire/AppMiddleware.d.ts +8 -0
- package/dist/wire/AppMiddleware.d.ts.map +1 -0
- package/dist/wire/{middleware.js → AppMiddleware.js} +1 -2
- package/dist/wire/AppMiddleware.js.map +1 -0
- package/dist/wire/AppNext.d.ts +2 -0
- package/dist/wire/AppNext.d.ts.map +1 -0
- package/dist/wire/AppNext.js +2 -0
- package/dist/wire/AppNext.js.map +1 -0
- package/dist/wire/Call.d.ts +10 -0
- package/dist/wire/Call.d.ts.map +1 -0
- package/dist/wire/Call.js +12 -0
- package/dist/wire/Call.js.map +1 -0
- package/dist/wire/CallPage.d.ts +9 -0
- package/dist/wire/CallPage.d.ts.map +1 -0
- package/dist/wire/CallPage.js +2 -0
- package/dist/wire/CallPage.js.map +1 -0
- package/dist/wire/{CallLog.d.ts → CallRecord.d.ts} +3 -10
- package/dist/wire/CallRecord.d.ts.map +1 -0
- package/dist/wire/CallRecord.js +2 -0
- package/dist/wire/CallRecord.js.map +1 -0
- package/dist/wire/{emit.d.ts → Emit.d.ts} +10 -18
- package/dist/wire/Emit.d.ts.map +1 -0
- package/dist/wire/{emit.js → Emit.js} +17 -6
- package/dist/wire/Emit.js.map +1 -0
- package/dist/wire/ErrorCode.d.ts +23 -0
- package/dist/wire/ErrorCode.d.ts.map +1 -0
- package/dist/wire/ErrorCode.js +30 -0
- package/dist/wire/ErrorCode.js.map +1 -0
- package/dist/wire/Facade.d.ts +10 -0
- package/dist/wire/Facade.d.ts.map +1 -0
- package/dist/wire/Facade.js +9 -0
- package/dist/wire/Facade.js.map +1 -0
- package/dist/wire/FacadeName.d.ts +14 -0
- package/dist/wire/FacadeName.d.ts.map +1 -0
- package/dist/wire/FacadeName.js +2 -0
- package/dist/wire/FacadeName.js.map +1 -0
- package/dist/wire/Fact.d.ts +9 -0
- package/dist/wire/Fact.d.ts.map +1 -0
- package/dist/wire/Fact.js +2 -0
- package/dist/wire/Fact.js.map +1 -0
- package/dist/wire/FougereError.d.ts +35 -0
- package/dist/wire/FougereError.d.ts.map +1 -0
- package/dist/wire/{errors.js → FougereError.js} +9 -32
- package/dist/wire/FougereError.js.map +1 -0
- package/dist/wire/FougereErrorOptions.d.ts +10 -0
- package/dist/wire/FougereErrorOptions.d.ts.map +1 -0
- package/dist/wire/FougereErrorOptions.js +2 -0
- package/dist/wire/FougereErrorOptions.js.map +1 -0
- package/dist/wire/FougereHandlers.d.ts +10 -0
- package/dist/wire/FougereHandlers.d.ts.map +1 -0
- package/dist/wire/FougereHandlers.js +2 -0
- package/dist/wire/FougereHandlers.js.map +1 -0
- package/dist/wire/FougereOperations.d.ts +4 -0
- package/dist/wire/FougereOperations.d.ts.map +1 -0
- package/dist/wire/FougereOperations.js +2 -0
- package/dist/wire/FougereOperations.js.map +1 -0
- package/dist/wire/FrondCall.d.ts +10 -0
- package/dist/wire/FrondCall.d.ts.map +1 -0
- package/dist/wire/FrondCall.js +2 -0
- package/dist/wire/FrondCall.js.map +1 -0
- package/dist/wire/HandlerOf.d.ts +10 -0
- package/dist/wire/HandlerOf.d.ts.map +1 -0
- package/dist/wire/HandlerOf.js +2 -0
- package/dist/wire/HandlerOf.js.map +1 -0
- package/dist/wire/Invocation.d.ts +4 -11
- package/dist/wire/Invocation.d.ts.map +1 -1
- package/dist/wire/Invocation.js +4 -1
- package/dist/wire/Invocation.js.map +1 -1
- package/dist/wire/InvocationContext.d.ts +12 -0
- package/dist/wire/InvocationContext.d.ts.map +1 -0
- package/dist/wire/InvocationContext.js +2 -0
- package/dist/wire/InvocationContext.js.map +1 -0
- package/dist/wire/{middleware.d.ts → OperationContext.d.ts} +2 -9
- package/dist/wire/OperationContext.d.ts.map +1 -0
- package/dist/wire/OperationContext.js +2 -0
- package/dist/wire/OperationContext.js.map +1 -0
- package/dist/wire/{operation.d.ts → OperationContract.d.ts} +15 -12
- package/dist/wire/OperationContract.d.ts.map +1 -0
- package/dist/wire/{operation.js → OperationContract.js} +1 -1
- package/dist/wire/OperationContract.js.map +1 -0
- package/dist/wire/OperationKind.d.ts +2 -0
- package/dist/wire/OperationKind.d.ts.map +1 -0
- package/dist/wire/OperationKind.js +2 -0
- package/dist/wire/OperationKind.js.map +1 -0
- package/dist/wire/OperationKindInference.d.ts +8 -0
- package/dist/wire/OperationKindInference.d.ts.map +1 -0
- package/dist/wire/OperationKindInference.js +2 -0
- package/dist/wire/OperationKindInference.js.map +1 -0
- package/dist/wire/OperationsMap.d.ts +7 -0
- package/dist/wire/OperationsMap.d.ts.map +1 -0
- package/dist/wire/OperationsMap.js +7 -0
- package/dist/wire/OperationsMap.js.map +1 -0
- package/dist/wire/Param.d.ts +8 -0
- package/dist/wire/Param.d.ts.map +1 -0
- package/dist/wire/Param.js +2 -0
- package/dist/wire/Param.js.map +1 -0
- package/dist/wire/PartialInvocation.d.ts +3 -0
- package/dist/wire/PartialInvocation.d.ts.map +1 -0
- package/dist/wire/PartialInvocation.js +2 -0
- package/dist/wire/PartialInvocation.js.map +1 -0
- package/dist/wire/Pipe.d.ts +10 -0
- package/dist/wire/Pipe.d.ts.map +1 -0
- package/dist/wire/Pipe.js +2 -0
- package/dist/wire/Pipe.js.map +1 -0
- package/dist/wire/Refused.d.ts +10 -0
- package/dist/wire/Refused.d.ts.map +1 -0
- package/dist/wire/Refused.js +2 -0
- package/dist/wire/Refused.js.map +1 -0
- package/dist/wire/RouteAddress.d.ts +1 -7
- package/dist/wire/RouteAddress.d.ts.map +1 -1
- package/dist/wire/RouteAddress.js.map +1 -1
- package/dist/wire/RouteAddressInput.d.ts +6 -0
- package/dist/wire/RouteAddressInput.d.ts.map +1 -0
- package/dist/wire/RouteAddressInput.js +2 -0
- package/dist/wire/RouteAddressInput.js.map +1 -0
- package/dist/wire/RouteKind.d.ts +3 -0
- package/dist/wire/RouteKind.d.ts.map +1 -0
- package/dist/wire/RouteKind.js +2 -0
- package/dist/wire/RouteKind.js.map +1 -0
- package/dist/wire/Rows.d.ts +8 -0
- package/dist/wire/Rows.d.ts.map +1 -0
- package/dist/wire/Rows.js +2 -0
- package/dist/wire/Rows.js.map +1 -0
- package/dist/wire/RpcAnswer.d.ts +6 -0
- package/dist/wire/RpcAnswer.d.ts.map +1 -0
- package/dist/wire/RpcAnswer.js +3 -0
- package/dist/wire/RpcAnswer.js.map +1 -0
- package/dist/wire/Signature.d.ts +13 -0
- package/dist/wire/Signature.d.ts.map +1 -0
- package/dist/wire/Signature.js +2 -0
- package/dist/wire/Signature.js.map +1 -0
- package/dist/wire/SignedCall.d.ts +14 -0
- package/dist/wire/SignedCall.d.ts.map +1 -0
- package/dist/wire/SignedCall.js +3 -0
- package/dist/wire/SignedCall.js.map +1 -0
- package/dist/wire/Transport.d.ts +5 -0
- package/dist/wire/Transport.d.ts.map +1 -0
- package/dist/wire/Transport.js +2 -0
- package/dist/wire/Transport.js.map +1 -0
- package/dist/wire/{signature.d.ts → TypeRef.d.ts} +1 -17
- package/dist/wire/TypeRef.d.ts.map +1 -0
- package/dist/wire/TypeRef.js +2 -0
- package/dist/wire/TypeRef.js.map +1 -0
- package/dist/wire/binding.d.ts +1 -1
- package/dist/wire/binding.d.ts.map +1 -1
- package/dist/wire/card/CardOp.d.ts +22 -0
- package/dist/wire/card/CardOp.d.ts.map +1 -0
- package/dist/wire/card/CardOp.js +2 -0
- package/dist/wire/card/CardOp.js.map +1 -0
- package/dist/wire/card/IdentityCard.d.ts +22 -0
- package/dist/wire/card/IdentityCard.d.ts.map +1 -0
- package/dist/wire/card/IdentityCard.js +25 -0
- package/dist/wire/card/IdentityCard.js.map +1 -0
- package/dist/wire/drift.d.ts +6 -6
- package/dist/wire/drift.d.ts.map +1 -1
- package/dist/wire/drift.js +18 -18
- package/dist/wire/drift.js.map +1 -1
- package/dist/wire/http-error.d.ts +1 -2
- package/dist/wire/http-error.d.ts.map +1 -1
- package/dist/wire/http-error.js +4 -3
- package/dist/wire/http-error.js.map +1 -1
- package/dist/wire/loggerMiddleware.d.ts +2 -2
- package/dist/wire/loggerMiddleware.d.ts.map +1 -1
- package/dist/wire/refusals.d.ts +33 -0
- package/dist/wire/refusals.d.ts.map +1 -0
- package/dist/wire/refusals.js +44 -0
- package/dist/wire/refusals.js.map +1 -0
- package/dist/wire/topology/DeclaredEdge.d.ts +6 -0
- package/dist/wire/topology/DeclaredEdge.d.ts.map +1 -0
- package/dist/wire/topology/DeclaredEdge.js +2 -0
- package/dist/wire/topology/DeclaredEdge.js.map +1 -0
- package/dist/wire/topology/DeclaredFrond.d.ts +11 -0
- package/dist/wire/topology/DeclaredFrond.d.ts.map +1 -0
- package/dist/wire/topology/DeclaredFrond.js +2 -0
- package/dist/wire/topology/DeclaredFrond.js.map +1 -0
- package/dist/wire/topology/DeclaredTopology.d.ts +12 -0
- package/dist/wire/topology/DeclaredTopology.d.ts.map +1 -0
- package/dist/wire/topology/DeclaredTopology.js +2 -0
- package/dist/wire/topology/DeclaredTopology.js.map +1 -0
- package/dist/wire/topology/Edge.d.ts +8 -0
- package/dist/wire/topology/Edge.d.ts.map +1 -0
- package/dist/wire/topology/Edge.js +2 -0
- package/dist/wire/topology/Edge.js.map +1 -0
- package/dist/wire/topology/FrondPlacement.d.ts +8 -0
- package/dist/wire/topology/FrondPlacement.d.ts.map +1 -0
- package/dist/wire/topology/FrondPlacement.js +2 -0
- package/dist/wire/topology/FrondPlacement.js.map +1 -0
- package/dist/wire/topology/TopologyReport.d.ts +14 -0
- package/dist/wire/topology/TopologyReport.d.ts.map +1 -0
- package/dist/wire/topology/TopologyReport.js +2 -0
- package/dist/wire/topology/TopologyReport.js.map +1 -0
- package/package.json +4 -4
- package/src/AdapterConfig.ts +11 -0
- package/src/AnswerFor.ts +7 -0
- package/src/Binding.ts +4 -0
- package/src/{identity.ts → CallIdentity.ts} +9 -25
- package/src/Constraint.ts +2 -0
- package/src/{conventions.ts → Conventions.ts} +20 -9
- package/src/ConventionsInput.ts +8 -0
- package/src/Ctor.ts +2 -0
- package/src/Declared.ts +8 -0
- package/src/DeclaredHandler.ts +18 -0
- package/src/DeclaredSubject.ts +6 -0
- package/src/{graph.ts → DomainCluster.ts} +2 -12
- package/src/EffectiveCollector.ts +7 -0
- package/src/EffectiveOperation.ts +62 -0
- package/src/{effective-operation.ts → EffectiveOperationModel.ts} +28 -125
- package/src/EffectiveOperationOptions.ts +7 -0
- package/src/EffectiveOperationSemantics.ts +7 -0
- package/src/EffectiveOperationsMap.ts +3 -0
- package/src/EffectiveParameter.ts +13 -0
- package/src/EntityNode.ts +6 -0
- package/src/{config-loader.ts → FougereConfig.ts} +15 -20
- package/src/FougereNames.ts +2 -0
- package/src/FougerePorts.ts +7 -0
- package/src/{frond-config.ts → FrondConfig.ts} +8 -46
- package/src/{declare.ts → FrondDeclaration.ts} +14 -35
- package/src/FrondIdentity.ts +7 -0
- package/src/NameOf.ts +12 -0
- package/src/OperationOverride.ts +38 -0
- package/src/PortChoice.ts +13 -0
- package/src/{source.ts → Source.ts} +7 -23
- package/src/SourceConfig.ts +10 -0
- package/src/SourceView.ts +7 -0
- package/src/VerifiedCall.ts +7 -0
- package/src/boot/App.ts +71 -0
- package/src/boot/AppLifecycle.ts +2 -20
- package/src/boot/AuthConfig.ts +14 -0
- package/src/boot/AuthContext.ts +12 -0
- package/src/boot/AuthRuntime.ts +19 -0
- package/src/boot/CreateAppOptions.ts +81 -0
- package/src/boot/Emissions.ts +86 -56
- package/src/boot/Extension.ts +20 -0
- package/src/boot/Hosting.ts +38 -0
- package/src/boot/Peer.ts +15 -0
- package/src/boot/apply.ts +2 -2
- package/src/boot/bootstrap.ts +240 -87
- package/src/boot/card.ts +15 -11
- package/src/boot/declared.ts +40 -5
- package/src/boot/frame.ts +2 -2
- package/src/boot/hosted.ts +1 -1
- package/src/boot/install.ts +65 -33
- package/src/boot/ownership.ts +92 -52
- package/src/boot/peerOver.ts +17 -0
- package/src/boot/ports.ts +52 -41
- package/src/boot/relations.ts +172 -0
- package/src/boot/remote.ts +24 -17
- package/src/boot/runner.ts +2 -2
- package/src/boot/seed.ts +12 -10
- package/src/boot/statement-drift.ts +6 -5
- package/src/boot/together.ts +82 -38
- package/src/builtin/Carry.ts +49 -0
- package/src/builtin/LogLevel.ts +1 -0
- package/src/builtin/LogRecord.ts +12 -0
- package/src/builtin/LogSink.ts +4 -0
- package/src/builtin/{logger.ts → Logger.ts} +5 -98
- package/src/builtin/LoggerOptions.ts +14 -0
- package/src/builtin/Rendered.ts +21 -0
- package/src/contract.ts +36 -16
- package/src/crypto/CryptoPort.ts +12 -0
- package/src/crypto/PublicJwk.ts +7 -0
- package/src/crypto/Signer.ts +4 -0
- package/src/crypto/Verifier.ts +5 -0
- package/src/crypto/node.ts +4 -1
- package/src/crypto/webcrypto.ts +4 -1
- package/src/define.ts +1 -1
- package/src/descriptor/CollectorEntry.ts +11 -0
- package/src/descriptor/EntityEntry.ts +13 -0
- package/src/descriptor/ExtensionEntry.ts +15 -0
- package/src/descriptor/FrondDescriptor.ts +58 -0
- package/src/descriptor/FrondSource.ts +7 -0
- package/src/descriptor/Fronds.ts +2 -1
- package/src/descriptor/HandlerEntry.ts +27 -0
- package/src/descriptor/MiddlewareEntry.ts +16 -0
- package/src/descriptor/PresenterEntry.ts +23 -0
- package/src/descriptor/PresenterFieldMeta.ts +14 -0
- package/src/descriptor/ProviderEntry.ts +18 -0
- package/src/descriptor/SeedEntry.ts +11 -0
- package/src/descriptor/SeedFactory.ts +2 -0
- package/src/descriptor/bases.ts +30 -0
- package/src/descriptor/index.ts +24 -6
- package/src/descriptor/surface.ts +3 -2
- package/src/diagnostic.ts +41 -0
- package/src/dispatch/ArgumentResolver.ts +2 -7
- package/src/dispatch/CollectorLookup.ts +3 -0
- package/src/dispatch/CollectorResolver.ts +5 -0
- package/src/dispatch/Dependent.ts +19 -0
- package/src/dispatch/DispatchEvent.ts +3 -6
- package/src/dispatch/DispatchLifecycle.ts +2 -1
- package/src/dispatch/DispatchObserver.ts +3 -0
- package/src/dispatch/DispatchPort.ts +1 -1
- package/src/dispatch/DispatchStage.ts +1 -0
- package/src/dispatch/Dispatcher.ts +44 -8
- package/src/dispatch/Facade.ts +25 -0
- package/src/dispatch/GuardReport.ts +9 -0
- package/src/dispatch/HandlerFacade.ts +28 -46
- package/src/dispatch/InFlight.ts +2 -1
- package/src/dispatch/Journal.ts +26 -0
- package/src/dispatch/LocalRoutePolicy.ts +3 -2
- package/src/dispatch/OperationRoute.ts +2 -3
- package/src/dispatch/PresenterArgs.ts +1 -0
- package/src/dispatch/PresenterExecutor.ts +3 -3
- package/src/dispatch/RelationCheck.ts +21 -0
- package/src/dispatch/Release.ts +156 -0
- package/src/dispatch/Route.ts +3 -2
- package/src/dispatch/RouteExecution.ts +3 -0
- package/src/dispatch/RoutePolicy.ts +1 -1
- package/src/dispatch/StorageGuard.ts +75 -19
- package/src/dispatch/presenterArguments.ts +3 -3
- package/src/dispatch/routeNotFound.ts +3 -2
- package/src/dispatch/validateInput.ts +3 -2
- package/src/entry/facade.ts +2 -2
- package/src/entry/transport.ts +2 -2
- package/src/index.ts +101 -52
- package/src/node.ts +2 -2
- package/src/prefab/AggregateConstructor.ts +9 -0
- package/src/prefab/AggregateOf.ts +6 -0
- package/src/prefab/AggregateShape.ts +7 -0
- package/src/prefab/{crud.ts → CrudConstructor.ts} +10 -18
- package/src/prefab/CrudOpName.ts +2 -0
- package/src/prefab/CrudOps.ts +24 -0
- package/src/prefab/CrudViews.ts +5 -0
- package/src/prefab/MirrorConstructor.ts +35 -0
- package/src/prefab/MirrorOf.ts +19 -0
- package/src/prefab/Refreshed.ts +9 -0
- package/src/prefab/{repository.ts → RepositoryConstructor.ts} +8 -24
- package/src/prefab/RepositoryOf.ts +7 -0
- package/src/scan.ts +3 -23
- package/src/storage/{criterion.ts → Comparison.ts} +1 -3
- package/src/storage/ComparisonName.ts +3 -0
- package/src/storage/ListOptions.ts +29 -0
- package/src/storage/ListResult.ts +9 -0
- package/src/storage/SelectOption.ts +6 -0
- package/src/storage/{port.ts → Storage.ts} +5 -56
- package/src/storage/StorageFactory.ts +8 -0
- package/src/storage/{store.ts → Store.ts} +5 -7
- package/src/storage/Together.ts +6 -0
- package/src/storage/Values.ts +2 -0
- package/src/verify.ts +12 -21
- package/src/wire/Addresses.ts +17 -0
- package/src/wire/Answer.ts +3 -0
- package/src/wire/AnyHandler.ts +2 -0
- package/src/wire/AppMiddleware.ts +24 -0
- package/src/wire/AppNext.ts +1 -0
- package/src/wire/Call.ts +15 -0
- package/src/wire/CallPage.ts +9 -0
- package/src/wire/{CallLog.ts → CallRecord.ts} +2 -10
- package/src/wire/{emit.ts → Emit.ts} +24 -24
- package/src/wire/ErrorCode.ts +33 -0
- package/src/wire/Facade.ts +28 -0
- package/src/wire/FacadeName.ts +13 -0
- package/src/wire/Fact.ts +8 -0
- package/src/wire/{errors.ts → FougereError.ts} +14 -53
- package/src/wire/FougereErrorOptions.ts +10 -0
- package/src/wire/FougereHandlers.ts +8 -0
- package/src/wire/FougereOperations.ts +2 -0
- package/src/wire/FrondCall.ts +9 -0
- package/src/wire/HandlerOf.ts +10 -0
- package/src/wire/Invocation.ts +5 -12
- package/src/wire/InvocationContext.ts +11 -0
- package/src/wire/OperationContext.ts +18 -0
- package/src/wire/{operation.ts → OperationContract.ts} +14 -23
- package/src/wire/OperationKind.ts +1 -0
- package/src/wire/OperationKindInference.ts +8 -0
- package/src/wire/OperationsMap.ts +14 -0
- package/src/wire/Param.ts +8 -0
- package/src/wire/PartialInvocation.ts +3 -0
- package/src/wire/Pipe.ts +9 -0
- package/src/wire/Refused.ts +13 -0
- package/src/wire/RouteAddress.ts +1 -8
- package/src/wire/RouteAddressInput.ts +5 -0
- package/src/wire/RouteKind.ts +2 -0
- package/src/wire/Rows.ts +7 -0
- package/src/wire/RpcAnswer.ts +7 -0
- package/src/wire/Signature.ts +13 -0
- package/src/wire/SignedCall.ts +14 -0
- package/src/wire/Transport.ts +5 -0
- package/src/wire/{signature.ts → TypeRef.ts} +0 -18
- package/src/wire/binding.ts +1 -1
- package/src/wire/card/CardOp.ts +22 -0
- package/src/wire/card/IdentityCard.ts +41 -0
- package/src/wire/drift.ts +22 -22
- package/src/wire/http-error.ts +4 -3
- package/src/wire/loggerMiddleware.ts +2 -2
- package/src/wire/refusals.ts +55 -0
- package/src/wire/topology/DeclaredEdge.ts +5 -0
- package/src/wire/topology/DeclaredFrond.ts +10 -0
- package/src/wire/topology/DeclaredTopology.ts +12 -0
- package/src/wire/topology/Edge.ts +7 -0
- package/src/wire/topology/FrondPlacement.ts +7 -0
- package/src/wire/topology/TopologyReport.ts +14 -0
- package/dist/boot/auth.d.ts +0 -43
- package/dist/boot/auth.d.ts.map +0 -1
- package/dist/boot/auth.js +0 -2
- package/dist/boot/auth.js.map +0 -1
- package/dist/boot/types.d.ts +0 -147
- package/dist/boot/types.d.ts.map +0 -1
- package/dist/boot/types.js +0 -2
- package/dist/boot/types.js.map +0 -1
- package/dist/builtin/logger.d.ts +0 -96
- package/dist/builtin/logger.d.ts.map +0 -1
- package/dist/builtin/logger.js.map +0 -1
- package/dist/config-loader.d.ts.map +0 -1
- package/dist/config-loader.js.map +0 -1
- package/dist/conventions.d.ts.map +0 -1
- package/dist/conventions.js.map +0 -1
- package/dist/crypto/port.d.ts +0 -26
- package/dist/crypto/port.d.ts.map +0 -1
- package/dist/crypto/port.js +0 -3
- package/dist/crypto/port.js.map +0 -1
- package/dist/declare.d.ts.map +0 -1
- package/dist/declare.js.map +0 -1
- package/dist/descriptor/frond.d.ts +0 -187
- package/dist/descriptor/frond.d.ts.map +0 -1
- package/dist/descriptor/frond.js.map +0 -1
- package/dist/effective-operation.d.ts +0 -113
- package/dist/effective-operation.d.ts.map +0 -1
- package/dist/effective-operation.js.map +0 -1
- package/dist/frond-config.d.ts +0 -71
- package/dist/frond-config.d.ts.map +0 -1
- package/dist/frond-config.js.map +0 -1
- package/dist/graph.d.ts.map +0 -1
- package/dist/graph.js.map +0 -1
- package/dist/identity.d.ts.map +0 -1
- package/dist/identity.js.map +0 -1
- package/dist/prefab/crud.d.ts.map +0 -1
- package/dist/prefab/crud.js.map +0 -1
- package/dist/prefab/mirror.d.ts +0 -33
- package/dist/prefab/mirror.d.ts.map +0 -1
- package/dist/prefab/mirror.js.map +0 -1
- package/dist/prefab/repository.d.ts +0 -40
- package/dist/prefab/repository.d.ts.map +0 -1
- package/dist/prefab/repository.js.map +0 -1
- package/dist/source.d.ts.map +0 -1
- package/dist/source.js.map +0 -1
- package/dist/storage/criterion.d.ts.map +0 -1
- package/dist/storage/criterion.js.map +0 -1
- package/dist/storage/port.d.ts.map +0 -1
- package/dist/storage/port.js.map +0 -1
- package/dist/storage/store.d.ts.map +0 -1
- package/dist/storage/store.js.map +0 -1
- package/dist/wire/CallLog.d.ts.map +0 -1
- package/dist/wire/CallLog.js +0 -2
- package/dist/wire/CallLog.js.map +0 -1
- package/dist/wire/call.d.ts +0 -130
- package/dist/wire/call.d.ts.map +0 -1
- package/dist/wire/call.js +0 -47
- package/dist/wire/call.js.map +0 -1
- package/dist/wire/emit.d.ts.map +0 -1
- package/dist/wire/emit.js.map +0 -1
- package/dist/wire/errors.d.ts +0 -58
- package/dist/wire/errors.d.ts.map +0 -1
- package/dist/wire/errors.js.map +0 -1
- package/dist/wire/middleware.d.ts.map +0 -1
- package/dist/wire/middleware.js.map +0 -1
- package/dist/wire/operation.d.ts.map +0 -1
- package/dist/wire/operation.js.map +0 -1
- package/dist/wire/signature.d.ts.map +0 -1
- package/dist/wire/signature.js +0 -2
- package/dist/wire/signature.js.map +0 -1
- package/src/boot/auth.ts +0 -45
- package/src/boot/types.ts +0 -148
- package/src/crypto/port.ts +0 -29
- package/src/descriptor/frond.ts +0 -195
- package/src/prefab/mirror.ts +0 -60
- package/src/wire/call.ts +0 -178
- package/src/wire/middleware.ts +0 -43
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SchemaView } from '@fougere/schema';
|
|
2
|
+
import type { Constraint } from '../Constraint.js';
|
|
3
|
+
import type { Peer } from './Peer.js';
|
|
4
|
+
import type { Journal } from '../dispatch/Journal.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Where an entity's rows are hosted, and what the host keeps — what a `ref()` asks the boot.
|
|
8
|
+
*
|
|
9
|
+
* Documented: [entities](https://fougere.dev/docs/schema/entities).
|
|
10
|
+
*/
|
|
11
|
+
export interface Hosting {
|
|
12
|
+
/** False behind `remotes:` — whose `sourceOf` still answers the default, and means nothing. */
|
|
13
|
+
hostedHere(entity: string): boolean;
|
|
14
|
+
sourceOf(entity: string): string;
|
|
15
|
+
enforces(source: string, constraint: Constraint): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Resolved through the frond that owns it, never the asking frond's scope: a scope sees its
|
|
18
|
+
* parent and not its siblings, so a target of another frond was answered by nothing.
|
|
19
|
+
*/
|
|
20
|
+
storageOf(entity: string): unknown | undefined;
|
|
21
|
+
/** Every entity of every frond — a row is named from wherever its namer was declared. */
|
|
22
|
+
entities(): ReadonlyMap<string, SchemaView>;
|
|
23
|
+
/**
|
|
24
|
+
* The process that HOLDS an entity's rows, when this one does not. Absent when nothing can
|
|
25
|
+
* reach it: no `remotes:` entry, or no transport to carry the ask.
|
|
26
|
+
*/
|
|
27
|
+
peerOf(entity: string): Peer | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* One per declared remote, whatever this process knows of what lives there.
|
|
30
|
+
*
|
|
31
|
+
* A frond behind `remotes:` may have no sources here at all — `fougere sync` writes a card
|
|
32
|
+
* and nothing else — so this process cannot see that its rows name ours. Only the process
|
|
33
|
+
* holding them can, which is why a release asks every remote rather than deciding for it.
|
|
34
|
+
*/
|
|
35
|
+
peers(): readonly Peer[];
|
|
36
|
+
/** The journal a package registered, resolved per call — absent for what CARRIES one. */
|
|
37
|
+
journal(entity: string): Journal | undefined;
|
|
38
|
+
}
|
package/src/boot/Peer.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** The process that holds rows this one names, reached by the two readings core always serves. */
|
|
2
|
+
export interface Peer {
|
|
3
|
+
/** Which of these keys no row answers over there — the write's question, asked across. */
|
|
4
|
+
missing(entity: string, keys: readonly unknown[]): Promise<readonly unknown[]>;
|
|
5
|
+
/** Who names these rows over there, and what becomes of them — its own `dependentsOf`. */
|
|
6
|
+
dependents(entity: string): Promise<unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* Release a row over there: its rows go first, then the row, on its side of the wire.
|
|
9
|
+
*
|
|
10
|
+
* `visited` travels so a release cannot bounce: two processes that declare each other would
|
|
11
|
+
* otherwise ask each other about the same row forever. It is carried rather than held,
|
|
12
|
+
* because the two sides share no memory.
|
|
13
|
+
*/
|
|
14
|
+
release(entity: string, key: unknown, visited: readonly string[]): Promise<void>;
|
|
15
|
+
}
|
package/src/boot/apply.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FougereConfig } from '../
|
|
2
|
-
import {
|
|
1
|
+
import type { FougereConfig } from '../FougereConfig.js';
|
|
2
|
+
import { envLevel, logLevel, setLogLevel } from '../builtin/Logger.js';
|
|
3
3
|
import { dequal } from 'dequal';
|
|
4
4
|
|
|
5
5
|
export interface ConfigApplication {
|
package/src/boot/bootstrap.ts
CHANGED
|
@@ -1,56 +1,62 @@
|
|
|
1
1
|
import type { Container } from '@fougere/container';
|
|
2
|
-
import { lowerFirst, type
|
|
3
|
-
|
|
4
|
-
import type {
|
|
2
|
+
import { lowerFirst, type SchemaView } from '@fougere/schema';
|
|
3
|
+
|
|
4
|
+
import type { HandlerEntry } from '../descriptor/HandlerEntry.js';
|
|
5
|
+
import type { PresenterEntry } from '../descriptor/PresenterEntry.js';
|
|
5
6
|
import { hostedBy } from './hosted.js';
|
|
6
7
|
import { installFrond, type Assembly } from './install.js';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
11
|
-
import type
|
|
8
|
+
import { dependentsOf, releasing, unfinishable, unheldAmong } from './relations.js';
|
|
9
|
+
import { release as releaseRow } from '../dispatch/Release.js';
|
|
10
|
+
import type { Hosting } from './Hosting.js';
|
|
11
|
+
import { peerOver } from './peerOver.js';
|
|
12
|
+
import { JOURNAL, type Journal } from '../dispatch/Journal.js';
|
|
13
|
+
import type { RelationCheck } from '../dispatch/RelationCheck.js';
|
|
14
|
+
import { refusalOf, type Diagnostic } from '../diagnostic.js';
|
|
15
|
+
import type { AuthRuntime } from './AuthRuntime.js';
|
|
16
|
+
import type { App } from './App.js';
|
|
17
|
+
import type { CreateAppOptions } from './CreateAppOptions.js';
|
|
18
|
+
import type { AppMiddleware } from '../wire/AppMiddleware.js';
|
|
19
|
+
import { Carry } from '../builtin/Carry.js';
|
|
20
|
+
import { Logger } from '../builtin/Logger.js';
|
|
21
|
+
import type { LogRecord } from '../builtin/LogRecord.js';
|
|
12
22
|
import LogLine, { CARRIES_LINE } from '../builtin/LogLine.js';
|
|
13
|
-
import { emitKeyOf, type Emit } from '../wire/
|
|
23
|
+
import { emitKeyOf, type Emit } from '../wire/Emit.js';
|
|
14
24
|
|
|
15
25
|
/** The fact the boot announces, spelled once. */
|
|
16
26
|
const LOG_LINE = lowerFirst(LogLine.name);
|
|
17
27
|
import { Config } from '../builtin/config.js';
|
|
18
28
|
import { createRemoteRouter, createRemoteFacade } from './remote.js';
|
|
19
|
-
|
|
29
|
+
|
|
20
30
|
import { Emissions } from './Emissions.js';
|
|
21
|
-
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
type EffectiveOperationsMap,
|
|
28
|
-
} from '../effective-operation.js';
|
|
29
|
-
import { StorageGuard } from '../dispatch/StorageGuard.js';
|
|
30
|
-
import { portBindings } from './ports.js';
|
|
31
|
+
|
|
32
|
+
import type { OperationContract } from '../wire/OperationContract.js';
|
|
33
|
+
import type { OperationsMap } from '../wire/OperationsMap.js';
|
|
34
|
+
import { resolveEffectiveOperations } from '../EffectiveOperationModel.js';
|
|
35
|
+
import { type EffectiveOperationsMap } from '../EffectiveOperationsMap.js';
|
|
36
|
+
|
|
31
37
|
import { InFlight } from '../dispatch/InFlight.js';
|
|
32
38
|
// The keys, each read from where its concept is declared — never respelled here.
|
|
33
|
-
import {
|
|
39
|
+
import { RPC_ENTITY, type RpcAnswer } from '../wire/RpcAnswer.js';
|
|
40
|
+
import { Invocation } from '../wire/Invocation.js';
|
|
41
|
+
import { facadeKeyOf } from '../wire/Facade.js';
|
|
34
42
|
import { identityCardOf } from './card.js';
|
|
35
43
|
import { AppLifecycle, migrating } from './AppLifecycle.js';
|
|
36
44
|
import { seeding } from './seed.js';
|
|
37
|
-
|
|
38
|
-
import {
|
|
39
|
-
|
|
40
|
-
import { declares } from '../source.js';
|
|
45
|
+
|
|
46
|
+
import { storageKeyOf } from '../storage/Storage.js';
|
|
47
|
+
|
|
41
48
|
import { presenterKeyOf } from '../prefab/presenter.js';
|
|
42
|
-
|
|
49
|
+
|
|
43
50
|
import { RouteAddress } from '../wire/RouteAddress.js';
|
|
44
51
|
import { DispatchLifecycle } from '../dispatch/DispatchLifecycle.js';
|
|
45
52
|
import { Dispatcher } from '../dispatch/Dispatcher.js';
|
|
46
53
|
import { LocalRoutePolicy } from '../dispatch/LocalRoutePolicy.js';
|
|
47
|
-
|
|
54
|
+
|
|
48
55
|
import { OperationRoute } from '../dispatch/OperationRoute.js';
|
|
49
56
|
import { remoteRoutes } from '../dispatch/remoteRoutes.js';
|
|
50
57
|
import { RouteRegistry } from '../dispatch/RouteRegistry.js';
|
|
51
58
|
import { facadeOperations } from '../entry/facade.js';
|
|
52
59
|
|
|
53
|
-
|
|
54
60
|
/** The one wording for "nobody hosts this here", with both ways out. */
|
|
55
61
|
const notLoaded = (entity: string) =>
|
|
56
62
|
`Frond for '${entity}' is not loaded.\n` +
|
|
@@ -58,29 +64,39 @@ const notLoaded = (entity: string) =>
|
|
|
58
64
|
` - Or declare a remote: remotes: { ${entity}: 'http://...' }`;
|
|
59
65
|
|
|
60
66
|
/** Two fronds cannot claim one name — said at boot, because nothing else says it. */
|
|
61
|
-
function
|
|
67
|
+
function keyClaims(
|
|
62
68
|
fronds: { name: string; handlers: HandlerEntry[]; presenters: PresenterEntry[] }[],
|
|
63
69
|
remotes: Record<string, string> | undefined,
|
|
70
|
+
refused: Diagnostic[],
|
|
64
71
|
): void {
|
|
65
72
|
const owner = new Map<string, string>();
|
|
73
|
+
const fileOf = new Map<string, string>();
|
|
66
74
|
|
|
67
|
-
const claim = (key: string, frond: string, what: string) => {
|
|
75
|
+
const claim = (key: string, frond: string, what: string, filePath: string) => {
|
|
68
76
|
const first = owner.get(key);
|
|
69
77
|
if (first !== undefined && first !== frond) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
refused.push({
|
|
79
|
+
severity: 'blocking',
|
|
80
|
+
code: 'frond-key-taken',
|
|
81
|
+
filePath,
|
|
82
|
+
frond,
|
|
83
|
+
subject: key,
|
|
84
|
+
message: `'${first}' and '${frond}' both claim the key '${key}'. A ${what} is registered `
|
|
85
|
+
+ 'under a key that names no frond, so one would silently replace the other. Rename one '
|
|
86
|
+
+ 'of the two classes, or keep one frond out of this process (--fronds). '
|
|
87
|
+
+ `'${first}' declares it in ${fileOf.get(key)}.`,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return;
|
|
76
91
|
}
|
|
77
92
|
owner.set(key, frond);
|
|
93
|
+
fileOf.set(key, filePath);
|
|
78
94
|
};
|
|
79
95
|
|
|
80
96
|
for (const frond of fronds) {
|
|
81
97
|
if (remotes && frond.name in remotes) continue;
|
|
82
|
-
for (const handler of frond.handlers) claim(facadeKeyOf(handler.address, handler.surface), frond.name, '
|
|
83
|
-
for (const presenter of frond.presenters) claim(presenterKeyOf(presenter.entityName), frond.name, 'presenter');
|
|
98
|
+
for (const handler of frond.handlers) claim(facadeKeyOf(handler.address, handler.surface), frond.name, 'facade', handler.filePath);
|
|
99
|
+
for (const presenter of frond.presenters) claim(presenterKeyOf(presenter.entityName), frond.name, 'presenter', presenter.filePath);
|
|
84
100
|
}
|
|
85
101
|
}
|
|
86
102
|
|
|
@@ -171,7 +187,9 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
171
187
|
if (!options.fronds && !options.scan && !options.auth && brought.length === 0) {
|
|
172
188
|
throw new Error(
|
|
173
189
|
'createApp needs `fronds:` (what this app states) or `scan:` (what a scanner found). '
|
|
174
|
-
+ 'Neither was given, and nothing else declares entities of its own
|
|
190
|
+
+ 'Neither was given, and nothing else declares entities of its own.\n'
|
|
191
|
+
+ ' createApp({ fronds: [blog] })\n'
|
|
192
|
+
+ ' createApp({ scan: await scanProject(root) })',
|
|
175
193
|
);
|
|
176
194
|
}
|
|
177
195
|
const operationModel = resolveEffectiveOperations(fronds, {
|
|
@@ -189,17 +207,8 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
189
207
|
for (const d of diagnostics) if (d.severity === 'warning') log.warn(`[${d.code}] ${d.message}`);
|
|
190
208
|
|
|
191
209
|
/** An ambiguous convention is not a partial scan. */
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
if (invalidOperations.length > 0) {
|
|
195
|
-
const details = invalidOperations.map((d) =>
|
|
196
|
-
` [${d.code}]${d.subject ? ` ${d.subject}` : ''}\n ${d.message}\n ${d.filePath}`,
|
|
197
|
-
);
|
|
198
|
-
throw new Error(
|
|
199
|
-
`Fougere boot refused: ${invalidOperations.length} unresolved operation contract(s):\n`
|
|
200
|
-
+ details.join('\n'),
|
|
201
|
-
);
|
|
202
|
-
}
|
|
210
|
+
const unresolved = refusalOf(operationModel.resolutionDiagnostics, 'unresolved operation contract(s)');
|
|
211
|
+
if (unresolved) throw unresolved;
|
|
203
212
|
|
|
204
213
|
// Auth runtime — built once from the lazy AuthConfig produced by a provider factory
|
|
205
214
|
// (e.g. betterAuth({...})) in fougere.config.ts. The provider receives our db +
|
|
@@ -207,7 +216,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
207
216
|
let authRuntime: AuthRuntime | undefined;
|
|
208
217
|
if (options.auth) {
|
|
209
218
|
if (!options.storageFactory) {
|
|
210
|
-
throw new Error('createApp: `auth` is set but `storageFactory` is missing — auth providers need it to back their adapter.');
|
|
219
|
+
throw new Error('createApp: `auth` is set but `storageFactory` is missing — auth providers need it to back their adapter. Pass one through CreateAppOptions.storageFactory.');
|
|
211
220
|
}
|
|
212
221
|
if (options.db === undefined) {
|
|
213
222
|
throw new Error('createApp: `auth` is set but `db` is missing — pass the storage handle through CreateAppOptions.db.');
|
|
@@ -233,7 +242,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
233
242
|
? createRemoteRouter(Object.fromEntries(declaredRemotes), options.remoteTransport)
|
|
234
243
|
: undefined;
|
|
235
244
|
|
|
236
|
-
// What is running on this app — counted at the one
|
|
245
|
+
// What is running on this app — counted at the one facade every caller goes through,
|
|
237
246
|
// so releasing it can wait for the work instead of pulling the floor out.
|
|
238
247
|
const inflight = new InFlight();
|
|
239
248
|
|
|
@@ -249,12 +258,16 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
249
258
|
error,
|
|
250
259
|
),
|
|
251
260
|
);
|
|
252
|
-
|
|
261
|
+
// Resolved at the call and never here: a journal is a provider of a brought frond, and
|
|
262
|
+
// the extension that registers it rises long after this line.
|
|
263
|
+
const keeping = (): Journal | undefined => journalOf();
|
|
264
|
+
const dispatcher = new Dispatcher(routeRegistry, inflight, dispatchLifecycle, undefined, keeping);
|
|
253
265
|
const localDispatcher = new Dispatcher(
|
|
254
266
|
routeRegistry,
|
|
255
267
|
inflight,
|
|
256
268
|
dispatchLifecycle,
|
|
257
269
|
new LocalRoutePolicy((surface) => fronds.servedNames(surface)),
|
|
270
|
+
keeping,
|
|
258
271
|
);
|
|
259
272
|
|
|
260
273
|
function getMiddlewares(entity: string): AppMiddleware[] {
|
|
@@ -276,7 +289,14 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
276
289
|
scopedMiddlewares.set(entity, scoped);
|
|
277
290
|
}
|
|
278
291
|
|
|
279
|
-
|
|
292
|
+
/** What every check of this boot writes into — refused together, once they have all run. */
|
|
293
|
+
const refused: Diagnostic[] = [];
|
|
294
|
+
const relations: RelationCheck[] = [];
|
|
295
|
+
keyClaims(fronds, options.remotes, refused);
|
|
296
|
+
// Said before anything is installed: a key claimed twice makes every later error worse —
|
|
297
|
+
// the route registry collides first, and names a route instead of the two fronds.
|
|
298
|
+
const claimed = refusalOf(refused, 'declaration(s) that do not hold');
|
|
299
|
+
if (claimed) throw claimed;
|
|
280
300
|
|
|
281
301
|
// Every entity of every frond, by name — so a fact can be validated where it LANDS, and
|
|
282
302
|
// so a `reads:` clause can name a neighbour's.
|
|
@@ -295,6 +315,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
295
315
|
fronds, entityByName, container,
|
|
296
316
|
// No carry: this is what CARRIES a fact, and a line about carrying one comes back.
|
|
297
317
|
new Logger('boot:app'),
|
|
318
|
+
refused,
|
|
298
319
|
options.onEmit,
|
|
299
320
|
);
|
|
300
321
|
/** Canonical operation tables, indexed by the same audience key as their facades. */
|
|
@@ -304,6 +325,78 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
304
325
|
[...operations].map(([name, operation]) => [name, operation as OperationContract] as const),
|
|
305
326
|
);
|
|
306
327
|
|
|
328
|
+
/**
|
|
329
|
+
* The storage an entity is backed by — the dual of `facadeFor`, which serves its client-facing
|
|
330
|
+
* facade.
|
|
331
|
+
*/
|
|
332
|
+
const storageFor = (entity: string): unknown | undefined => {
|
|
333
|
+
const owner = fronds.owner(entity);
|
|
334
|
+
if (!owner) return undefined;
|
|
335
|
+
|
|
336
|
+
const key = storageKeyOf(entity);
|
|
337
|
+
try {
|
|
338
|
+
return container.resolve<Container>(`frond:${owner.name}`).resolve(key);
|
|
339
|
+
} catch {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// What carries a release writes none: an instrumentation frond's own rows are kept while a
|
|
345
|
+
// release happens, and journalling them would begin one inside the one being written down.
|
|
346
|
+
const carriesRelease = new Set(
|
|
347
|
+
fronds.filter((one) => one.brought).flatMap((one) => one.entities.map((e) => e.name)),
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* The journal a package registered, found where its own frond put it — a provider lands in
|
|
352
|
+
* its frond's scope, and the app container sees none of them.
|
|
353
|
+
*/
|
|
354
|
+
const journalOf = (): Journal | undefined => {
|
|
355
|
+
for (const frond of fronds) {
|
|
356
|
+
if (!frond.brought) continue;
|
|
357
|
+
const scope = container.resolve<Container>(`frond:${frond.name}`);
|
|
358
|
+
if (scope.has(JOURNAL)) return scope.resolve<Journal>(JOURNAL);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return undefined;
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
const hosting: Hosting = {
|
|
365
|
+
hostedHere: (entity) => !(options.remotes && (frondOf.get(entity) ?? '') in options.remotes),
|
|
366
|
+
sourceOf: (name) => options.sourceOf?.(name) ?? 'db',
|
|
367
|
+
enforces: (source, constraint) => options.enforces?.(source, constraint) ?? false,
|
|
368
|
+
storageOf: storageFor,
|
|
369
|
+
entities: () => entityByName,
|
|
370
|
+
// The two readings core serves in EVERY process, asked of the one that holds the rows.
|
|
371
|
+
// Nothing is cached: a peer that was down at boot answers the next call.
|
|
372
|
+
// Built from `remotes:` itself, not from the router: the router indexes by ENTITY, read
|
|
373
|
+
// off a card, and the question here is asked of a PROCESS about rows it may be alone
|
|
374
|
+
// in knowing about.
|
|
375
|
+
// Resolved per call and never at boot: the package that registers it rises in the
|
|
376
|
+
// ascent, long after this answer is built.
|
|
377
|
+
journal: (entity) => (carriesRelease.has(entity) ? undefined : journalOf()),
|
|
378
|
+
peers: () => (options.remoteTransport
|
|
379
|
+
? declaredRemotes.map(([, url]) => peerOver(options.remoteTransport!(url)))
|
|
380
|
+
: []),
|
|
381
|
+
peerOf: (entity) => (remoteRouter ? {
|
|
382
|
+
dependents: async (named) => (await remoteRouter.route(entity))
|
|
383
|
+
.transport({ entity: RPC_ENTITY, op: 'dependents' },
|
|
384
|
+
{ ...Invocation.empty, params: { entity: named } as never }),
|
|
385
|
+
missing: async (named, keys) => {
|
|
386
|
+
const answer = await (await remoteRouter.route(entity))
|
|
387
|
+
.transport({ entity: RPC_ENTITY, op: 'holds' },
|
|
388
|
+
{ ...Invocation.empty, params: { entity: named, keys } as never });
|
|
389
|
+
|
|
390
|
+
return (answer as { missing: readonly unknown[] }).missing;
|
|
391
|
+
},
|
|
392
|
+
release: async (named, key) => {
|
|
393
|
+
const route = await remoteRouter.route(entity);
|
|
394
|
+
await route.transport({ entity: RPC_ENTITY, op: 'release' },
|
|
395
|
+
{ ...Invocation.empty, params: { entity: named, key } as never });
|
|
396
|
+
},
|
|
397
|
+
} : undefined),
|
|
398
|
+
};
|
|
399
|
+
|
|
307
400
|
// Every port an implementation was bound to, so a `ports:` entry that named none
|
|
308
401
|
// can say so rather than look obeyed.
|
|
309
402
|
const boundPorts = new Set<string>();
|
|
@@ -313,11 +406,39 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
313
406
|
// table, one emission list — so what a frond serves is there for the next one to find.
|
|
314
407
|
const assembly: Assembly = {
|
|
315
408
|
container, routeRegistry, emissions, dispatcher, localDispatcher, effectiveByKey,
|
|
316
|
-
boundPorts, operationModel, entityByName, frondOf, contractsOf,
|
|
317
|
-
log, options,
|
|
409
|
+
boundPorts, refused, relations, hosting, operationModel, entityByName, frondOf, contractsOf,
|
|
410
|
+
getMiddlewares, use, log, options,
|
|
318
411
|
};
|
|
319
412
|
for (const frond of fronds) await installFrond(frond, assembly);
|
|
320
413
|
|
|
414
|
+
// A reference no key holds and no storage answers: said at the END, for the reason the
|
|
415
|
+
// `ports:` warning below is — a target is another frond's, so no single frond can tell
|
|
416
|
+
// an absence from a neighbour that had not been installed yet.
|
|
417
|
+
const unheld = unheldAmong(relations, hosting);
|
|
418
|
+
// Declared here, and this process cannot finish what it starts — both halves are local,
|
|
419
|
+
// so nothing is asked of anyone. Said once, after every frond installed, because a journal
|
|
420
|
+
// arrives with an extension and an extension rises last.
|
|
421
|
+
const unfinished = unfinishable(hosting);
|
|
422
|
+
if (unfinished.length > 0) {
|
|
423
|
+
log.warn(
|
|
424
|
+
`[relations] ${unfinished.join(', ')} — declared, and this process keeps nothing on `
|
|
425
|
+
+ 'restart: a release interrupted here is not resumed. Install @fougere/workflow, or '
|
|
426
|
+
+ 'expect to finish one by hand.',
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (unheld.length > 0) {
|
|
431
|
+
log.warn(
|
|
432
|
+
`[relations] ${unheld.join(', ')} — declared, and nothing in this process holds them: `
|
|
433
|
+
+ 'no foreign key, and the target answers elsewhere. A row may name one that is gone.',
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Every check of the install, said at once — a boot that stops at the first makes the
|
|
438
|
+
// next one visible only after a fix and a restart.
|
|
439
|
+
const bootRefusal = refusalOf(refused, 'declaration(s) that do not hold');
|
|
440
|
+
if (bootRefusal) throw bootRefusal;
|
|
441
|
+
|
|
321
442
|
// A `ports:` key that matched no port anywhere reads as a choice that was made, and
|
|
322
443
|
// was not. Said once, at the end, because the entry is app-wide while a port is a
|
|
323
444
|
// frond's — no single frond can tell whether a key is a typo or a neighbour's.
|
|
@@ -329,14 +450,19 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
329
450
|
);
|
|
330
451
|
}
|
|
331
452
|
|
|
332
|
-
// Once every
|
|
453
|
+
// Once every facade exists: what is announced here and what is listened to are both known.
|
|
333
454
|
emissions.register();
|
|
334
455
|
|
|
335
|
-
//
|
|
456
|
+
// The third phase: what a fact's links and its answer type state. Said after `register`,
|
|
457
|
+
// which is where a pipe order and an `Emit<T, A>` are read.
|
|
458
|
+
const announced = refusalOf(refused, 'declaration(s) that do not hold');
|
|
459
|
+
if (announced) throw announced;
|
|
460
|
+
|
|
461
|
+
// Which facades carry a line, read from who SUBSCRIBED — so a third party's destination
|
|
336
462
|
// is left alone by the two middlewares that observe every operation.
|
|
337
|
-
for (const
|
|
338
|
-
CARRIES_LINE.add(
|
|
339
|
-
CARRIES_LINE.add(
|
|
463
|
+
for (const facade of emissions.facadesFor(LOG_LINE)) {
|
|
464
|
+
CARRIES_LINE.add(facade.replace(/Handler$/, '').replace(/^./, (c) => c.toLowerCase()));
|
|
465
|
+
CARRIES_LINE.add(facade);
|
|
340
466
|
}
|
|
341
467
|
|
|
342
468
|
/** The last resort, held by the container so every resolution path shares it. */
|
|
@@ -353,7 +479,6 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
353
479
|
);
|
|
354
480
|
});
|
|
355
481
|
|
|
356
|
-
|
|
357
482
|
/** Stop taking calls, and resolve once the ones already running are done. */
|
|
358
483
|
const drain = async (timeoutMs?: number): Promise<void> => {
|
|
359
484
|
inflight.close();
|
|
@@ -386,7 +511,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
386
511
|
if (found) return found.entityClass;
|
|
387
512
|
if (remoteRouter) {
|
|
388
513
|
const route = await remoteRouter.route(entity);
|
|
389
|
-
// A remote
|
|
514
|
+
// A remote facade that stores nothing publishes ops and no shape. Saying so beats
|
|
390
515
|
// handing back an empty schema, which would validate every input it was given.
|
|
391
516
|
if (!route.schema) {
|
|
392
517
|
throw new Error(
|
|
@@ -409,12 +534,12 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
409
534
|
}
|
|
410
535
|
};
|
|
411
536
|
|
|
412
|
-
/** Said once per pair, so a
|
|
537
|
+
/** Said once per pair, so a facade that registers in a loop says it once. */
|
|
413
538
|
const saidAbsent = new Set<string>();
|
|
414
539
|
|
|
415
540
|
/**
|
|
416
541
|
* A surface is declared in the frond that serves it. When that frond runs in another
|
|
417
|
-
* process, this one never asked for its
|
|
542
|
+
* process, this one never asked for its facades, and answering 'no' is the only thing a
|
|
418
543
|
* synchronous rule can do — so it says so rather than registering nothing in silence.
|
|
419
544
|
*/
|
|
420
545
|
const sayNoSurfaceAcross = (entity: string, surface: string): void => {
|
|
@@ -422,8 +547,8 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
422
547
|
saidAbsent.add(`${surface}:${entity}`);
|
|
423
548
|
log.warn(
|
|
424
549
|
`surface '${surface}' serves nothing for '${entity}' — the frond that declares it runs `
|
|
425
|
-
+ 'elsewhere, and a remote is asked for its
|
|
426
|
-
+ 'The default
|
|
550
|
+
+ 'elsewhere, and a remote is asked for its facades at the first call, not at boot. '
|
|
551
|
+
+ 'The default facade answers.',
|
|
427
552
|
);
|
|
428
553
|
};
|
|
429
554
|
|
|
@@ -465,7 +590,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
465
590
|
}));
|
|
466
591
|
}
|
|
467
592
|
|
|
468
|
-
/** The terms beside a
|
|
593
|
+
/** The terms beside a facade, with the exact same named-surface fallback rule. */
|
|
469
594
|
const operationsFor = (entity: string, surface?: string): EffectiveOperationsMap | undefined => {
|
|
470
595
|
if (!surface) return effectiveByKey.get(facadeKeyOf(entity));
|
|
471
596
|
|
|
@@ -477,22 +602,6 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
477
602
|
: undefined;
|
|
478
603
|
};
|
|
479
604
|
|
|
480
|
-
/**
|
|
481
|
-
* The storage an entity is backed by — the dual of `facadeFor`, which serves its client-facing
|
|
482
|
-
* door.
|
|
483
|
-
*/
|
|
484
|
-
const storageFor = (entity: string): unknown | undefined => {
|
|
485
|
-
const owner = fronds.owner(entity);
|
|
486
|
-
if (!owner) return undefined;
|
|
487
|
-
|
|
488
|
-
const key = storageKeyOf(entity);
|
|
489
|
-
try {
|
|
490
|
-
return container.resolve<Container>(`frond:${owner.name}`).resolve(key);
|
|
491
|
-
} catch {
|
|
492
|
-
return undefined;
|
|
493
|
-
}
|
|
494
|
-
};
|
|
495
|
-
|
|
496
605
|
/** The presenter of an entity, resolved through its owning frond's scope. */
|
|
497
606
|
const presenterFor = (entity: string): unknown | undefined => {
|
|
498
607
|
const owner = fronds.owner(entity);
|
|
@@ -508,7 +617,7 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
508
617
|
const app: App = {
|
|
509
618
|
container,
|
|
510
619
|
fronds,
|
|
511
|
-
// What this app publishes, straight from fougere.config.ts — the
|
|
620
|
+
// What this app publishes, straight from fougere.config.ts — the facades read it,
|
|
512
621
|
// so an undeclared adapter serves nothing whatever a host mounted.
|
|
513
622
|
adapters: options.adapters ?? {},
|
|
514
623
|
// Where a call goes, as DECLARED. Kept because a reader needs it beside what the
|
|
@@ -534,7 +643,10 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
534
643
|
// depend on wiring order, and `discover` is in here precisely so it cannot be taken.
|
|
535
644
|
const address = new RouteAddress({ entity: 'rpc', operation: op });
|
|
536
645
|
if (routeRegistry.find(address)) {
|
|
537
|
-
throw new Error(
|
|
646
|
+
throw new Error(
|
|
647
|
+
`[claim] rpc operation '${op}' is already served; a second declaration would depend on wiring order.\n`
|
|
648
|
+
+ ' Two extensions declare it — keep one out of `extensions:`.',
|
|
649
|
+
);
|
|
538
650
|
}
|
|
539
651
|
routeRegistry.register(new OperationRoute(
|
|
540
652
|
'system',
|
|
@@ -556,15 +668,56 @@ export async function createApp(options: CreateAppOptions): Promise<App> {
|
|
|
556
668
|
|
|
557
669
|
// The card is an rpc op like any other, so one registry answers and one refusal names
|
|
558
670
|
// what is served. A package's op is declared the same way, from outside.
|
|
671
|
+
// What a release is, resolved once and registered: a package that drives one asks for it
|
|
672
|
+
// by type, the way every other dependency is asked for.
|
|
673
|
+
container.registerValue('Releasing', releasing(hosting));
|
|
674
|
+
|
|
559
675
|
app.serveRpc('discover', (_invocation, surface) => identityCardOf(app, surface));
|
|
560
676
|
|
|
677
|
+
// What a release asks another process, and what it tells it to do. Served by EVERY process
|
|
678
|
+
// the way `discover` is: a frond that hosts rows is the only one that can answer for them.
|
|
679
|
+
//
|
|
680
|
+
// Read off the STORAGE and never off a facade: a facade answers what its handler chose to
|
|
681
|
+
// show — `PostHandler.list` hands back published posts — so a draft naming a deleted user
|
|
682
|
+
// would be invisible to the very question that exists to find it.
|
|
683
|
+
// The dual of `release`, and the same reason it is served by every process: only the one
|
|
684
|
+
// that holds the rows can say a key is missing, and only from the STORAGE — a facade
|
|
685
|
+
// answers what its handler chose to show.
|
|
686
|
+
app.serveRpc('holds', async (invocation) => {
|
|
687
|
+
const named = String(invocation.params.entity);
|
|
688
|
+
const keys = (invocation.params.keys ?? []) as readonly unknown[];
|
|
689
|
+
const rows = storageFor(named) as { findByKeys(k: readonly string[]): Promise<Map<string, unknown>> } | undefined;
|
|
690
|
+
if (!rows) return { missing: [] };
|
|
691
|
+
const found = await rows.findByKeys(keys.map(String));
|
|
692
|
+
|
|
693
|
+
return { missing: keys.filter((key) => !found.has(String(key))) };
|
|
694
|
+
});
|
|
695
|
+
app.serveRpc('dependents', (invocation) =>
|
|
696
|
+
dependentsOf(String(invocation.params.entity), hosting));
|
|
697
|
+
app.serveRpc('release', async (invocation) => {
|
|
698
|
+
await releaseRow(String(invocation.params.entity), invocation.params.key, releasing(hosting),
|
|
699
|
+
(invocation.params.visited ?? []) as readonly string[]);
|
|
700
|
+
|
|
701
|
+
return { released: true };
|
|
702
|
+
});
|
|
703
|
+
|
|
561
704
|
// The last thing the boot does, and the first thing a release undoes. An extension may
|
|
562
705
|
// await here — which is what a provider needing to OPEN something could never do.
|
|
563
706
|
built = app;
|
|
707
|
+
|
|
708
|
+
// What the FRONDS declared, folded in after what the host handed over — a frond's
|
|
709
|
+
// extension is written beside the code it instruments and travels with it, so it mounts
|
|
710
|
+
// on whichever process ends up serving that frond. Added here rather than at the top
|
|
711
|
+
// because the fronds are read below that line, and `up` has not run yet.
|
|
712
|
+
appLifecycle.add(...fronds.flatMap((frond) => (frond.extensions ?? []).map((one) => ({
|
|
713
|
+
name: one.name,
|
|
714
|
+
...one.extension,
|
|
715
|
+
}))));
|
|
716
|
+
|
|
564
717
|
await appLifecycle.up(app);
|
|
565
718
|
|
|
566
719
|
// The boot's own lines, and every line after them. Held until here because a boot
|
|
567
|
-
// writes most of what a process logs and writes it before any
|
|
720
|
+
// writes most of what a process logs and writes it before any facade exists — so the
|
|
568
721
|
// lines that say what this app is made of are the ones a destination would miss.
|
|
569
722
|
// `LogLine` is core's for this reason: naming it costs no optional package.
|
|
570
723
|
//
|