@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
|
@@ -1,34 +1,27 @@
|
|
|
1
1
|
import { readdir, readFile } from 'node:fs/promises';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join, dirname, basename, resolve as resolvePath } from 'node:path';
|
|
4
|
-
import { pathToFileURL } from 'node:url';
|
|
5
4
|
import { ANONYMOUS_SCHEMA_NAME } from '@fougere/schema';
|
|
6
|
-
import { cardinalityOf } from '
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { loadFrondConfig } from '
|
|
10
|
-
import { emitKeyOf } from '
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
activeLoader = loader;
|
|
20
|
-
}
|
|
21
|
-
/** Used by config-loader to load fougere.config.ts via the same TS-aware loader. */
|
|
22
|
-
export function getModuleLoader() {
|
|
23
|
-
return activeLoader;
|
|
24
|
-
}
|
|
5
|
+
import { cardinalityOf } from '../wire/operation.js';
|
|
6
|
+
import { computeBindingPlan } from '../boot/binding.js';
|
|
7
|
+
import { parseAllHandlerMethods, parsePresenterMethods, parseConstructorParams, resetTypePrograms, seedTypeProgram, } from './handler-parser.js';
|
|
8
|
+
import { loadFrondConfig } from '../frond-config.js';
|
|
9
|
+
import { emitKeyOf } from '../emit.js';
|
|
10
|
+
import { getPresenterFields } from '../prefab/presenter.js';
|
|
11
|
+
import { ormKeyOf, togetherKeyOf } from '../orm.js';
|
|
12
|
+
import { targetOf, viewsOf, outputOf } from '../prefab/prefab.js';
|
|
13
|
+
import { ownedBy, repositoryKeyOf } from '../prefab/repository.js';
|
|
14
|
+
import { registrationKeyOf } from '@fougere/schema';
|
|
15
|
+
import { Fronds } from './Fronds.js';
|
|
16
|
+
import { getModuleLoader } from '../loader.js';
|
|
17
|
+
import { DEFAULT_CONVENTIONS, resolveConventions, frondPackage, providerDirsOf, frondDirsOf, } from './conventions.js';
|
|
25
18
|
// FS
|
|
26
19
|
/**
|
|
27
20
|
* What this scan run could not do. Reset by {@link scanProject}, which owns a run.
|
|
28
21
|
*
|
|
29
|
-
* Module-scoped like the loader and the cache root above: the scanner already has
|
|
30
|
-
*
|
|
31
|
-
*
|
|
22
|
+
* Module-scoped like the loader and the cache root above: the scanner already has a
|
|
23
|
+
* notion of "the current run". Three sites record — measured — so a per-run object
|
|
24
|
+
* would carry twenty methods to spare one line of reset.
|
|
32
25
|
*/
|
|
33
26
|
let diagnostics = [];
|
|
34
27
|
function record(d) {
|
|
@@ -72,7 +65,7 @@ async function files(path) {
|
|
|
72
65
|
}
|
|
73
66
|
// Module
|
|
74
67
|
async function loadModule(filePath) {
|
|
75
|
-
return await
|
|
68
|
+
return await getModuleLoader()(filePath);
|
|
76
69
|
}
|
|
77
70
|
async function loadDefault(filePath) {
|
|
78
71
|
const mod = await loadModule(filePath);
|
|
@@ -98,21 +91,6 @@ function findWorkspaceRoot(from) {
|
|
|
98
91
|
}
|
|
99
92
|
return resolvePath(from); // fallback: use project root itself
|
|
100
93
|
}
|
|
101
|
-
// Convention
|
|
102
|
-
/** Directories whose classes register as providers — two spellings, one behaviour. */
|
|
103
|
-
const PROVIDER_DIRS = ['services', 'repositories'];
|
|
104
|
-
/**
|
|
105
|
-
* The frond vocabulary — every directory {@link scanFrond} reads. A frond directory says
|
|
106
|
-
* nothing else, which is why this list is what a reader needs to bound one: the Nuxt
|
|
107
|
-
* module watches these for the root frond (watching the root itself would match every
|
|
108
|
-
* write), and a flat app's tsconfig lists them instead of `["."]`, which would swallow
|
|
109
|
-
* `app/` and `nuxt.config.ts`.
|
|
110
|
-
*/
|
|
111
|
-
export const FROND_DIRS = [
|
|
112
|
-
'entities', 'handlers', 'presenters', 'collectors', 'seeds', ...PROVIDER_DIRS,
|
|
113
|
-
];
|
|
114
|
-
export { toRegistrationName } from './contract.js';
|
|
115
|
-
import { toRegistrationName } from './contract.js';
|
|
116
94
|
/**
|
|
117
95
|
* Strip the 'Handler' suffix → the name the handler answers to. 'PostHandler' → 'post'.
|
|
118
96
|
*
|
|
@@ -122,7 +100,7 @@ import { toRegistrationName } from './contract.js';
|
|
|
122
100
|
*/
|
|
123
101
|
function toAddress(className) {
|
|
124
102
|
const base = className.endsWith('Handler') ? className.slice(0, -7) : className;
|
|
125
|
-
return
|
|
103
|
+
return registrationKeyOf(base);
|
|
126
104
|
}
|
|
127
105
|
// Scan
|
|
128
106
|
/**
|
|
@@ -146,53 +124,73 @@ function depKeyOf(type) {
|
|
|
146
124
|
// façade or a doublure, which is what makes the topology invisible from a signature.
|
|
147
125
|
const facadeOf = type.name === 'Facade' ? type.generics?.[0]?.name : undefined;
|
|
148
126
|
if (facadeOf)
|
|
149
|
-
return
|
|
127
|
+
return registrationKeyOf(facadeOf);
|
|
150
128
|
// `Emit<PostPublished>` — the third port, and the only one that names a SUBJECT rather
|
|
151
129
|
// than an interlocutor. Read like the other two: the type names what arrives, here a
|
|
152
130
|
// function that announces. Who receives it is not in the signature and never will be.
|
|
153
131
|
const factOf = type.name === 'Emit' ? type.generics?.[0]?.name : undefined;
|
|
154
132
|
if (factOf)
|
|
155
133
|
return emitKeyOf(factOf);
|
|
134
|
+
// `Together<[Account, Ledger], [RateMirror]>` — the fifth reading, and the only one whose
|
|
135
|
+
// argument is a SET rather than one subject. The AST hands each tuple back as a single
|
|
136
|
+
// string, so they are split here, where every other question of "how was it written" lives.
|
|
137
|
+
const frame = type.name === 'Together' ? type.generics?.[0]?.name : undefined;
|
|
138
|
+
if (frame)
|
|
139
|
+
return togetherKeyOf(tupleMembers(frame), tupleMembers(type.generics?.[1]?.name ?? ''));
|
|
140
|
+
// `RepositoryOf<Post>` — what an author writes when no repository file exists. The dual
|
|
141
|
+
// of the line below: one names the port, the other the holder, and both resolve to a key
|
|
142
|
+
// rather than to a class the author would have to invent.
|
|
143
|
+
const held = type.name === 'RepositoryOf' ? type.generics?.[0]?.name : undefined;
|
|
144
|
+
if (held)
|
|
145
|
+
return repositoryKeyOf(held);
|
|
156
146
|
const target = type.name === 'EntityOrm' ? type.generics?.[0]?.name : undefined;
|
|
157
147
|
if (!target)
|
|
158
148
|
return type.name;
|
|
159
149
|
return ormKeyOf(target);
|
|
160
150
|
}
|
|
161
|
-
/**
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return
|
|
171
|
-
}
|
|
172
|
-
/** Cached parsePresenterMethods — skips TS loading when cache is warm. */
|
|
173
|
-
async function cachedPresenterMethods(filePath) {
|
|
174
|
-
const hash = hashFile(filePath);
|
|
175
|
-
const key = filePath + ':presenter';
|
|
176
|
-
const cached = getCached(key, hash);
|
|
177
|
-
if (cached)
|
|
178
|
-
return cached;
|
|
179
|
-
const methods = await parsePresenterMethods(filePath);
|
|
180
|
-
setCached(key, hash, methods);
|
|
181
|
-
return methods;
|
|
151
|
+
/**
|
|
152
|
+
* `'[Account, Ledger]'` → `['Account', 'Ledger']`.
|
|
153
|
+
*
|
|
154
|
+
* The tuple was chosen over the variadic form the parser reads more cleanly, because the
|
|
155
|
+
* variadic one costs arities-with-defaults and a `never` filter on the TypeScript side
|
|
156
|
+
* while the tuple maps to `[EntityOrm<Account>, EntityOrm<Ledger>]` in one line. The
|
|
157
|
+
* parser does not get to decide alone; this split is what that choice costs.
|
|
158
|
+
*/
|
|
159
|
+
function tupleMembers(raw) {
|
|
160
|
+
return raw.replace(/^\[|\]$/g, '').split(',').map((member) => member.trim()).filter(Boolean);
|
|
182
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* These readings are semantic: an unchanged file can mean something different after an
|
|
164
|
+
* imported alias changes. The parser's TypeScript Program is the cache for one scan; a
|
|
165
|
+
* cache keyed only by this file's bytes would be unsound.
|
|
166
|
+
*/
|
|
167
|
+
const ctorParamsOf = (filePath) => parseConstructorParams(filePath);
|
|
168
|
+
const presenterMethodsOf = (filePath) => parsePresenterMethods(filePath);
|
|
169
|
+
const handlerMethodsOf = (filePath, projectRoot) => parseAllHandlerMethods(filePath, projectRoot);
|
|
183
170
|
async function toProvider(filePath) {
|
|
184
171
|
const ctor = await loadClass(filePath);
|
|
185
|
-
const params = await
|
|
172
|
+
const params = await ctorParamsOf(filePath);
|
|
186
173
|
const deps = params.map((p) => depKeyOf(p.type));
|
|
187
|
-
// A repository inherits its constructor from `Repository(
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
174
|
+
// A repository inherits its constructor from `Repository(…)`, so the file declares none
|
|
175
|
+
// and the scan reads no parameter. The mixin knows what it was built for and says so at
|
|
176
|
+
// runtime — same escape as `Crud.__ops`, and the same reason: what a prefab fabricates,
|
|
177
|
+
// only the prefab can describe.
|
|
178
|
+
//
|
|
179
|
+
// An AGGREGATE owns several, and its base takes them in the declared order. It is handed
|
|
180
|
+
// no frame: the boundary and the unit of work are two statements, and a frame is ASKED FOR
|
|
181
|
+
// like anywhere else — see `prefab/repository.ts`.
|
|
182
|
+
const owned = ownedBy(ctor);
|
|
183
|
+
const target = targetOf(ctor);
|
|
184
|
+
if (owned.length > 1 && deps.length === 0) {
|
|
185
|
+
deps.push(...owned.map((entity) => ormKeyOf(registrationKeyOf(entity.name))));
|
|
186
|
+
}
|
|
187
|
+
else if (target && deps.length === 0) {
|
|
188
|
+
deps.push(ormKeyOf(registrationKeyOf(target.name)));
|
|
194
189
|
}
|
|
195
|
-
|
|
190
|
+
// No `name` beside `ctor`: a provider registers under `ctor.name`, which is what
|
|
191
|
+
// `depKeyOf` returns since it reads the type as written. The camelCase field that
|
|
192
|
+
// used to sit here called itself the registration key and was one nowhere.
|
|
193
|
+
return { ctor, deps, filePath };
|
|
196
194
|
}
|
|
197
195
|
async function toEntityEntry(filePath) {
|
|
198
196
|
const exported = await loadDefault(filePath);
|
|
@@ -206,7 +204,7 @@ async function toEntityEntry(filePath) {
|
|
|
206
204
|
const declaredName = runtimeName && runtimeName !== ANONYMOUS_SCHEMA_NAME
|
|
207
205
|
? runtimeName
|
|
208
206
|
: basename(filePath).replace(/\.[^.]+$/, '');
|
|
209
|
-
const name =
|
|
207
|
+
const name = registrationKeyOf(declaredName);
|
|
210
208
|
return { name, entityClass: exported, filePath };
|
|
211
209
|
}
|
|
212
210
|
/**
|
|
@@ -214,8 +212,8 @@ async function toEntityEntry(filePath) {
|
|
|
214
212
|
* Handles arrays, generics (uses base name), and simple references.
|
|
215
213
|
*/
|
|
216
214
|
function resolveSchema(type, moduleExports) {
|
|
217
|
-
//
|
|
218
|
-
|
|
215
|
+
// An array's element type IS `type.name` — the arity rides beside it, so nothing has
|
|
216
|
+
// to be unwrapped here.
|
|
219
217
|
// For generics like Pagination<Post>, also check inner types
|
|
220
218
|
if (type.generics) {
|
|
221
219
|
for (const g of type.generics) {
|
|
@@ -231,7 +229,7 @@ function resolveSchema(type, moduleExports) {
|
|
|
231
229
|
}
|
|
232
230
|
}
|
|
233
231
|
}
|
|
234
|
-
const resolved = moduleExports[name];
|
|
232
|
+
const resolved = moduleExports[type.name];
|
|
235
233
|
if (resolved && typeof resolved === 'function' && 'getFields' in resolved) {
|
|
236
234
|
return resolved;
|
|
237
235
|
}
|
|
@@ -243,20 +241,11 @@ function resolveSchema(type, moduleExports) {
|
|
|
243
241
|
* Resolves schemas for all params (not just the first) and stores
|
|
244
242
|
* full signatures for the binding algorithm.
|
|
245
243
|
*/
|
|
246
|
-
async function inferOperations(filePath, moduleExports, projectRoot) {
|
|
244
|
+
async function inferOperations(filePath, handlerName, moduleExports, collectorTypeNames, explicitInputs, declared, projectRoot) {
|
|
247
245
|
const map = new Map();
|
|
248
246
|
let parsed;
|
|
249
247
|
try {
|
|
250
|
-
|
|
251
|
-
const cacheKey = filePath + ':all' + (projectRoot ? ':inherited' : '');
|
|
252
|
-
const cached = getCached(cacheKey, hash);
|
|
253
|
-
if (cached) {
|
|
254
|
-
parsed = cached;
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
parsed = await parseAllHandlerMethods(filePath, projectRoot);
|
|
258
|
-
setCached(cacheKey, hash, parsed);
|
|
259
|
-
}
|
|
248
|
+
parsed = await handlerMethodsOf(filePath, projectRoot);
|
|
260
249
|
}
|
|
261
250
|
catch (cause) {
|
|
262
251
|
// The handler still gets a façade — its methods exist at runtime — but with no
|
|
@@ -302,11 +291,34 @@ async function inferOperations(filePath, moduleExports, projectRoot) {
|
|
|
302
291
|
signature: method,
|
|
303
292
|
...(method.description && { description: method.description }),
|
|
304
293
|
};
|
|
305
|
-
//
|
|
306
|
-
|
|
294
|
+
// A convention may omit a declaration only when it has one answer. Only values the
|
|
295
|
+
// caller supplies through the body are candidates: a schema-typed collector, fact or
|
|
296
|
+
// context parameter is not input merely because it names an entity. The old loop
|
|
297
|
+
// ignored provenance and assigned the first schema it met, so swapping two parameters
|
|
298
|
+
// silently changed the contract the façade used to judge the request body.
|
|
299
|
+
const binding = computeBindingPlan(method.params, collectorTypeNames);
|
|
300
|
+
const candidates = method.params.flatMap((param, index) => {
|
|
301
|
+
if (binding[index]?.source.kind !== 'body')
|
|
302
|
+
return [];
|
|
307
303
|
const schema = resolveSchema(param.type, moduleExports);
|
|
308
|
-
|
|
309
|
-
|
|
304
|
+
return schema ? [{ param, schema }] : [];
|
|
305
|
+
});
|
|
306
|
+
if (candidates.length === 1) {
|
|
307
|
+
meta.input = candidates[0].schema;
|
|
308
|
+
}
|
|
309
|
+
else if (candidates.length > 1
|
|
310
|
+
&& declared[method.name]?.input === undefined
|
|
311
|
+
&& !explicitInputs.has(method.name)) {
|
|
312
|
+
const subject = `${handlerName}.${method.name}`;
|
|
313
|
+
record({
|
|
314
|
+
severity: 'blocking',
|
|
315
|
+
code: 'input-contract-ambiguous',
|
|
316
|
+
filePath,
|
|
317
|
+
subject,
|
|
318
|
+
message: `Cannot infer the input contract for ${subject}: ${candidates.length} entity `
|
|
319
|
+
+ `candidates — ${candidates.map(({ param }) => `${param.name}: ${param.type.raw}`).join('; ')}. `
|
|
320
|
+
+ `Declare operations.${method.name}.input in frond.config.ts.`,
|
|
321
|
+
});
|
|
310
322
|
}
|
|
311
323
|
if (method.returnType) {
|
|
312
324
|
meta.output = resolveSchema(method.returnType, moduleExports);
|
|
@@ -317,7 +329,7 @@ async function inferOperations(filePath, moduleExports, projectRoot) {
|
|
|
317
329
|
}
|
|
318
330
|
return map;
|
|
319
331
|
}
|
|
320
|
-
async function toHandlerEntry(filePath, entityByClassName, projectRoot, surface) {
|
|
332
|
+
async function toHandlerEntry(filePath, entityByClassName, collectorTypeNames, explicitInputs, projectRoot, surface) {
|
|
321
333
|
const mod = await loadModule(filePath);
|
|
322
334
|
const ctor = mod.default;
|
|
323
335
|
if (typeof ctor !== 'function' || !ctor.prototype)
|
|
@@ -330,15 +342,20 @@ async function toHandlerEntry(filePath, entityByClassName, projectRoot, surface)
|
|
|
330
342
|
augmented[className] = entityClass;
|
|
331
343
|
}
|
|
332
344
|
const address = toAddress(ctor.name);
|
|
333
|
-
const
|
|
334
|
-
const
|
|
345
|
+
const declaredOps = ctor.__ops ?? {};
|
|
346
|
+
const operations = await inferOperations(filePath, ctor.name, augmented, collectorTypeNames, explicitInputs, declaredOps, projectRoot);
|
|
347
|
+
const ctorParams = await ctorParamsOf(filePath);
|
|
335
348
|
const deps = ctorParams.map((p) => depKeyOf(p.type));
|
|
336
349
|
// Read output override from Crud(Entity, Output) — static __output property
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const
|
|
350
|
+
// A handler-wide view, when it is not simply the entity — the two are compared by
|
|
351
|
+
// identity, which is why both slots are read through the same door.
|
|
352
|
+
const subject = targetOf(ctor);
|
|
353
|
+
const declared = outputOf(ctor);
|
|
354
|
+
const outputOverride = declared && subject && declared !== subject
|
|
355
|
+
? declared
|
|
356
|
+
: undefined;
|
|
340
357
|
return {
|
|
341
|
-
name:
|
|
358
|
+
name: registrationKeyOf(ctor.name),
|
|
342
359
|
address,
|
|
343
360
|
ctor: ctor,
|
|
344
361
|
operations,
|
|
@@ -351,7 +368,7 @@ async function toHandlerEntry(filePath, entityByClassName, projectRoot, surface)
|
|
|
351
368
|
/** Strip '.seed' suffix → entity name. 'Author.seed.ts' → 'author'. */
|
|
352
369
|
function toSeedEntityName(fileName) {
|
|
353
370
|
const base = fileName.replace(/\.seed\.(ts|js)$/, '').replace(/\.(ts|js)$/, '');
|
|
354
|
-
return
|
|
371
|
+
return registrationKeyOf(base);
|
|
355
372
|
}
|
|
356
373
|
async function toSeedEntry(filePath) {
|
|
357
374
|
const data = await loadDefault(filePath);
|
|
@@ -363,17 +380,17 @@ async function toSeedEntry(filePath) {
|
|
|
363
380
|
}
|
|
364
381
|
async function toPresenterEntry(filePath) {
|
|
365
382
|
const ctor = await loadClass(filePath);
|
|
366
|
-
const target =
|
|
383
|
+
const target = targetOf(ctor);
|
|
367
384
|
if (!target)
|
|
368
385
|
return null;
|
|
369
|
-
const entityName =
|
|
386
|
+
const entityName = registrationKeyOf(target.name);
|
|
370
387
|
const fields = getPresenterFields(ctor);
|
|
371
|
-
const presenterParams = await
|
|
388
|
+
const presenterParams = await ctorParamsOf(filePath);
|
|
372
389
|
const deps = presenterParams.map((p) => depKeyOf(p.type));
|
|
373
390
|
// Parse method return types from source
|
|
374
391
|
let fieldMeta = [];
|
|
375
392
|
try {
|
|
376
|
-
const parsed = await
|
|
393
|
+
const parsed = await presenterMethodsOf(filePath);
|
|
377
394
|
fieldMeta = parsed.map((m) => ({
|
|
378
395
|
name: m.name,
|
|
379
396
|
returnType: m.returnType?.name,
|
|
@@ -387,58 +404,53 @@ async function toPresenterEntry(filePath) {
|
|
|
387
404
|
}
|
|
388
405
|
catch { /* parse failure — fall back to untyped */ }
|
|
389
406
|
// Declared at runtime on the class, so it survives a scan that resolved nothing.
|
|
390
|
-
return { entityName, ctor, fields, fieldMeta, views:
|
|
407
|
+
return { entityName, ctor, fields, fieldMeta, views: viewsOf(ctor), deps, filePath };
|
|
391
408
|
}
|
|
392
409
|
async function toCollectorEntry(filePath) {
|
|
393
410
|
const ctor = await loadClass(filePath);
|
|
394
|
-
const target =
|
|
411
|
+
const target = targetOf(ctor);
|
|
395
412
|
if (!target)
|
|
396
413
|
return null;
|
|
397
|
-
|
|
398
|
-
|
|
414
|
+
// The target's NAME and nothing else — a collector reads no fields, so the class it
|
|
415
|
+
// was built on needs no schema.
|
|
416
|
+
const typeName = registrationKeyOf(target.name);
|
|
417
|
+
const collectorParams = await ctorParamsOf(filePath);
|
|
399
418
|
const deps = collectorParams.map((p) => depKeyOf(p.type));
|
|
400
|
-
return {
|
|
419
|
+
return { typeName, ctor, deps, filePath };
|
|
401
420
|
}
|
|
402
|
-
async function scanFrond(frondPath, name, source, projectRoot) {
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
const
|
|
417
|
-
entities
|
|
418
|
-
|
|
421
|
+
async function scanFrond(frondPath, name, source, conventions, projectRoot) {
|
|
422
|
+
const { entities: entitiesDir, handlers: handlersDir, presenters: presentersDir, collectors: collectorsDir, seeds: seedsDir, } = conventions.dirs;
|
|
423
|
+
/**
|
|
424
|
+
* A convention directory, read by whoever knows the shape it holds.
|
|
425
|
+
*
|
|
426
|
+
* The same three lines were written six times — list, read in parallel, drop what the
|
|
427
|
+
* reader refused — which is what made `handlers/` quietly special: it grew a second
|
|
428
|
+
* pass for its surfaces and nothing else could.
|
|
429
|
+
*/
|
|
430
|
+
const collect = async (dir, read) => {
|
|
431
|
+
const entries = await Promise.all((await files(join(frondPath, dir))).map(read));
|
|
432
|
+
return entries.filter((entry) => entry !== null);
|
|
433
|
+
};
|
|
434
|
+
// services/ and repositories/ — two spellings, one provider list.
|
|
435
|
+
const providers = (await Promise.all(providerDirsOf(conventions).map((dir) => collect(dir, toProvider)))).flat();
|
|
436
|
+
const entities = await collect(entitiesDir, toEntityEntry);
|
|
437
|
+
const collectors = await collect(collectorsDir, toCollectorEntry);
|
|
438
|
+
const collectorTypeNames = new Set(collectors.map((collector) => collector.typeName));
|
|
439
|
+
const frondConfig = await loadFrondConfig(frondPath);
|
|
440
|
+
const explicitInputs = new Set(Object.entries(frondConfig?.operations ?? {})
|
|
441
|
+
.filter(([, contract]) => contract.input !== undefined)
|
|
442
|
+
.map(([operation]) => operation));
|
|
443
|
+
// Handlers resolve `T` against the entities, so those come first.
|
|
419
444
|
const entityByClassName = new Map(entities.map((e) => [e.entityClass.name, e.entityClass]));
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
const surfacePaths = await files(join(frondPath, 'handlers', surfaceName));
|
|
426
|
-
handlers.push(...await Promise.all(surfacePaths.map((f) => toHandlerEntry(f, entityByClassName, projectRoot, surfaceName))));
|
|
445
|
+
const handlers = await collect(handlersDir, (f) => toHandlerEntry(f, entityByClassName, collectorTypeNames, explicitInputs, projectRoot));
|
|
446
|
+
// A subdirectory of handlers/ is a named surface — the one directory whose CHILDREN
|
|
447
|
+
// are part of the convention too.
|
|
448
|
+
for (const surface of await dirs(join(frondPath, handlersDir))) {
|
|
449
|
+
handlers.push(...await collect(join(handlersDir, surface), (f) => toHandlerEntry(f, entityByClassName, collectorTypeNames, explicitInputs, projectRoot, surface)));
|
|
427
450
|
}
|
|
428
|
-
|
|
429
|
-
const
|
|
430
|
-
const presenterEntries = await Promise.all(presenterPaths.map((f) => toPresenterEntry(f)));
|
|
431
|
-
presenters.push(...presenterEntries.filter((p) => p !== null));
|
|
432
|
-
// Scan collectors/
|
|
433
|
-
const collectorPaths = await files(join(frondPath, 'collectors'));
|
|
434
|
-
const collectorEntries = await Promise.all(collectorPaths.map((f) => toCollectorEntry(f)));
|
|
435
|
-
collectors.push(...collectorEntries.filter((c) => c !== null));
|
|
436
|
-
// Scan seeds/
|
|
437
|
-
const seedPaths = await files(join(frondPath, 'seeds'));
|
|
438
|
-
const seedEntries = await Promise.all(seedPaths.map((f) => toSeedEntry(f)));
|
|
439
|
-
seeds.push(...seedEntries.filter((s) => s !== null));
|
|
451
|
+
const presenters = await collect(presentersDir, toPresenterEntry);
|
|
452
|
+
const seeds = await collect(seedsDir, toSeedEntry);
|
|
440
453
|
// Mark exposed entries: frond.config.ts takes precedence, then @expose decorator
|
|
441
|
-
const frondConfig = await loadFrondConfig(frondPath);
|
|
442
454
|
if (frondConfig?.expose) {
|
|
443
455
|
const exposeSet = new Set(frondConfig.expose);
|
|
444
456
|
for (const e of entities) {
|
|
@@ -490,7 +502,7 @@ async function scanFrond(frondPath, name, source, projectRoot) {
|
|
|
490
502
|
* Carrying the convention is what makes a frond; the key never marked anything and
|
|
491
503
|
* nothing read it. It earns its keep as the one thing the directory cannot say: that
|
|
492
504
|
* `fronds/blog-v2/` serves the frond still called `blog` — so a rename on disk does not
|
|
493
|
-
* rename the entity keys, the `@
|
|
505
|
+
* rename the entity keys, the `@fronds/*` import or a `remotes:` entry.
|
|
494
506
|
*/
|
|
495
507
|
async function frondNameOf(frondPath, dirName) {
|
|
496
508
|
try {
|
|
@@ -513,20 +525,20 @@ async function frondNameOf(frondPath, dirName) {
|
|
|
513
525
|
* are ordinary top-level names in projects that never heard of Fougere, and a domain
|
|
514
526
|
* without a single entity is not a domain.
|
|
515
527
|
*/
|
|
516
|
-
async function rootFrondOf(root, workspaceRoot) {
|
|
517
|
-
if ((await files(join(root,
|
|
528
|
+
async function rootFrondOf(root, workspaceRoot, conventions) {
|
|
529
|
+
if ((await files(join(root, conventions.dirs.entities))).length === 0)
|
|
518
530
|
return null;
|
|
519
531
|
const name = await frondNameOf(root, basename(resolvePath(root)));
|
|
520
|
-
return scanFrond(root, name, { path: root, package:
|
|
532
|
+
return scanFrond(root, name, { path: root, package: frondPackage(name, conventions) }, conventions, workspaceRoot);
|
|
521
533
|
}
|
|
522
534
|
/**
|
|
523
|
-
* `@
|
|
535
|
+
* `@fronds/<name>` → the directory it names, for every frond of a project.
|
|
524
536
|
*
|
|
525
537
|
* The framework states this convention — `FrondSource.package` has always spelled it, and
|
|
526
538
|
* `fougere sync` writes it into a consumer's tsconfig — and until now its own reader could
|
|
527
539
|
* not resolve it. The Nuxt module registered a Vite alias, so a `.vue` page could import
|
|
528
|
-
* `@
|
|
529
|
-
* naming its neighbour got `Cannot find module '@
|
|
540
|
+
* `@fronds/blog/entities/Post`, while the SCAN loaded sources through a bare jiti: a frond
|
|
541
|
+
* naming its neighbour got `Cannot find module '@fronds/user/entities/User.js'`. So the one
|
|
530
542
|
* form that survives a split was the one form that did not run.
|
|
531
543
|
*
|
|
532
544
|
* Hand it to the module loader — `createJiti(url, { alias: await frondAliases(root) })` —
|
|
@@ -534,23 +546,23 @@ async function rootFrondOf(root, workspaceRoot) {
|
|
|
534
546
|
* `package.json` read, no parsing: it is deliberately callable BEFORE the loader exists,
|
|
535
547
|
* which is what makes the chicken-and-egg go away.
|
|
536
548
|
*/
|
|
537
|
-
export async function frondAliases(root) {
|
|
538
|
-
const frondsDir = join(root,
|
|
549
|
+
export async function frondAliases(root, conventions = DEFAULT_CONVENTIONS) {
|
|
550
|
+
const frondsDir = join(root, conventions.fronds);
|
|
539
551
|
const aliases = {};
|
|
540
552
|
// The root itself is a frond when it carries `entities/` — same rule as the scan.
|
|
541
|
-
if ((await files(join(root,
|
|
542
|
-
aliases[
|
|
553
|
+
if ((await files(join(root, conventions.dirs.entities))).length > 0) {
|
|
554
|
+
aliases[frondPackage(await frondNameOf(root, basename(resolvePath(root))), conventions)] = resolvePath(root);
|
|
543
555
|
}
|
|
544
556
|
for (const dir of await dirs(frondsDir)) {
|
|
545
557
|
const path = join(frondsDir, dir);
|
|
546
|
-
aliases[
|
|
558
|
+
aliases[frondPackage(await frondNameOf(path, dir), conventions)] = resolvePath(path);
|
|
547
559
|
}
|
|
548
560
|
/**
|
|
549
561
|
* A SYNCED frond answers to the same name.
|
|
550
562
|
*
|
|
551
563
|
* `fougere sync` writes `.fougere/remotes/<name>/` and registers it in `remotes.json`,
|
|
552
|
-
* which the Nuxt module already reads to alias `@
|
|
553
|
-
* what makes the convention mean ONE thing: a consumer writes `@
|
|
564
|
+
* which the Nuxt module already reads to alias `@fronds/<name>`. Doing it here too is
|
|
565
|
+
* what makes the convention mean ONE thing: a consumer writes `@fronds/blog/entities/Post`
|
|
554
566
|
* and never learns whether that frond is on this disk or was fetched from a card.
|
|
555
567
|
*
|
|
556
568
|
* A local frond wins a name collision — its source is the truth, a synced copy is a
|
|
@@ -559,9 +571,9 @@ export async function frondAliases(root) {
|
|
|
559
571
|
try {
|
|
560
572
|
const registry = JSON.parse(await readFile(join(root, '.fougere', 'remotes.json'), 'utf8'));
|
|
561
573
|
for (const [name, entry] of Object.entries(registry)) {
|
|
562
|
-
if (typeof entry?.path !== 'string' || aliases[
|
|
574
|
+
if (typeof entry?.path !== 'string' || aliases[frondPackage(name, conventions)])
|
|
563
575
|
continue;
|
|
564
|
-
aliases[
|
|
576
|
+
aliases[frondPackage(name, conventions)] = resolvePath(entry.path);
|
|
565
577
|
}
|
|
566
578
|
}
|
|
567
579
|
catch {
|
|
@@ -570,27 +582,33 @@ export async function frondAliases(root) {
|
|
|
570
582
|
}
|
|
571
583
|
return aliases;
|
|
572
584
|
}
|
|
573
|
-
export async function scanProject(root, filter) {
|
|
574
|
-
|
|
585
|
+
export async function scanProject(root, filter, conventionsInput) {
|
|
586
|
+
const conventions = resolveConventions(conventionsInput);
|
|
587
|
+
resetTypePrograms();
|
|
575
588
|
// A run owns its findings: two scans in one process (a test suite, a watcher)
|
|
576
589
|
// must not inherit each other's.
|
|
577
590
|
diagnostics = [];
|
|
578
|
-
const frondsDir = join(root,
|
|
591
|
+
const frondsDir = join(root, conventions.fronds);
|
|
579
592
|
const dirNames = await dirs(frondsDir);
|
|
580
593
|
// Resolve workspace root (parent of packages/) for package import resolution
|
|
581
594
|
// For monorepo: root is the project dir (e.g. demos/nuxt-blog), workspace root is the repo root
|
|
582
595
|
const workspaceRoot = findWorkspaceRoot(root);
|
|
596
|
+
// One program for this run. Seeded here because the parser rebuilds on every root it
|
|
597
|
+
// has not seen, and a frond lives outside its project's tsconfig `include`. Both keys
|
|
598
|
+
// are seeded: heritage reads under the workspace root, a constructor under none.
|
|
599
|
+
const declarations = (await Promise.all([root, ...dirNames.map((dir) => join(frondsDir, dir))].flatMap((frondPath) => frondDirsOf(conventions).map((dir) => files(join(frondPath, dir)))))).flat();
|
|
600
|
+
await seedTypeProgram(declarations, workspaceRoot);
|
|
601
|
+
await seedTypeProgram(declarations);
|
|
583
602
|
const [rootFrond, under] = await Promise.all([
|
|
584
|
-
rootFrondOf(root, workspaceRoot),
|
|
603
|
+
rootFrondOf(root, workspaceRoot, conventions),
|
|
585
604
|
Promise.all(dirNames.map(async (dir) => {
|
|
586
605
|
const name = await frondNameOf(join(frondsDir, dir), dir);
|
|
587
|
-
return scanFrond(join(frondsDir, dir), name, { path: join(frondsDir, dir), package:
|
|
606
|
+
return scanFrond(join(frondsDir, dir), name, { path: join(frondsDir, dir), package: frondPackage(name, conventions) }, conventions, workspaceRoot);
|
|
588
607
|
})),
|
|
589
608
|
]);
|
|
590
609
|
// The app's own domain first, then the ones it took in.
|
|
591
610
|
const all = rootFrond ? [rootFrond, ...under] : under;
|
|
592
|
-
const fronds = filter ? all.filter((f) => filter.includes(f.name)) : all;
|
|
593
|
-
flushCache();
|
|
611
|
+
const fronds = Fronds.scanned(filter ? all.filter((f) => filter.includes(f.name)) : all);
|
|
594
612
|
return { fronds, diagnostics };
|
|
595
613
|
}
|
|
596
614
|
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scan/scanner.ts"],"names":[],"mappings":"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"}
|