@fougere/core 0.2.0-alpha.1 → 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} +13 -5
- 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} +14 -2
- package/dist/boot/seed.d.ts.map +1 -0
- package/dist/{seed.js → boot/seed.js} +25 -4
- 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 +62 -38
- 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 +38 -8
- 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 -36
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -31
- 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 +123 -12
- 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} +186 -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} +42 -13
- 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 -848
- 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 -78
- package/dist/egress.d.ts.map +0 -1
- package/dist/egress.js +0 -185
- 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/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 -407
- 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) {
|
|
@@ -479,6 +491,7 @@ async function scanFrond(frondPath, name, source, projectRoot) {
|
|
|
479
491
|
collectors,
|
|
480
492
|
seeds,
|
|
481
493
|
surfaces: frondConfig?.surfaces,
|
|
494
|
+
reads: frondConfig?.reads,
|
|
482
495
|
operationsOverrides,
|
|
483
496
|
};
|
|
484
497
|
}
|
|
@@ -489,7 +502,7 @@ async function scanFrond(frondPath, name, source, projectRoot) {
|
|
|
489
502
|
* Carrying the convention is what makes a frond; the key never marked anything and
|
|
490
503
|
* nothing read it. It earns its keep as the one thing the directory cannot say: that
|
|
491
504
|
* `fronds/blog-v2/` serves the frond still called `blog` — so a rename on disk does not
|
|
492
|
-
* rename the entity keys, the `@
|
|
505
|
+
* rename the entity keys, the `@fronds/*` import or a `remotes:` entry.
|
|
493
506
|
*/
|
|
494
507
|
async function frondNameOf(frondPath, dirName) {
|
|
495
508
|
try {
|
|
@@ -512,20 +525,20 @@ async function frondNameOf(frondPath, dirName) {
|
|
|
512
525
|
* are ordinary top-level names in projects that never heard of Fougere, and a domain
|
|
513
526
|
* without a single entity is not a domain.
|
|
514
527
|
*/
|
|
515
|
-
async function rootFrondOf(root, workspaceRoot) {
|
|
516
|
-
if ((await files(join(root,
|
|
528
|
+
async function rootFrondOf(root, workspaceRoot, conventions) {
|
|
529
|
+
if ((await files(join(root, conventions.dirs.entities))).length === 0)
|
|
517
530
|
return null;
|
|
518
531
|
const name = await frondNameOf(root, basename(resolvePath(root)));
|
|
519
|
-
return scanFrond(root, name, { path: root, package:
|
|
532
|
+
return scanFrond(root, name, { path: root, package: frondPackage(name, conventions) }, conventions, workspaceRoot);
|
|
520
533
|
}
|
|
521
534
|
/**
|
|
522
|
-
* `@
|
|
535
|
+
* `@fronds/<name>` → the directory it names, for every frond of a project.
|
|
523
536
|
*
|
|
524
537
|
* The framework states this convention — `FrondSource.package` has always spelled it, and
|
|
525
538
|
* `fougere sync` writes it into a consumer's tsconfig — and until now its own reader could
|
|
526
539
|
* not resolve it. The Nuxt module registered a Vite alias, so a `.vue` page could import
|
|
527
|
-
* `@
|
|
528
|
-
* 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
|
|
529
542
|
* form that survives a split was the one form that did not run.
|
|
530
543
|
*
|
|
531
544
|
* Hand it to the module loader — `createJiti(url, { alias: await frondAliases(root) })` —
|
|
@@ -533,23 +546,23 @@ async function rootFrondOf(root, workspaceRoot) {
|
|
|
533
546
|
* `package.json` read, no parsing: it is deliberately callable BEFORE the loader exists,
|
|
534
547
|
* which is what makes the chicken-and-egg go away.
|
|
535
548
|
*/
|
|
536
|
-
export async function frondAliases(root) {
|
|
537
|
-
const frondsDir = join(root,
|
|
549
|
+
export async function frondAliases(root, conventions = DEFAULT_CONVENTIONS) {
|
|
550
|
+
const frondsDir = join(root, conventions.fronds);
|
|
538
551
|
const aliases = {};
|
|
539
552
|
// The root itself is a frond when it carries `entities/` — same rule as the scan.
|
|
540
|
-
if ((await files(join(root,
|
|
541
|
-
aliases[
|
|
553
|
+
if ((await files(join(root, conventions.dirs.entities))).length > 0) {
|
|
554
|
+
aliases[frondPackage(await frondNameOf(root, basename(resolvePath(root))), conventions)] = resolvePath(root);
|
|
542
555
|
}
|
|
543
556
|
for (const dir of await dirs(frondsDir)) {
|
|
544
557
|
const path = join(frondsDir, dir);
|
|
545
|
-
aliases[
|
|
558
|
+
aliases[frondPackage(await frondNameOf(path, dir), conventions)] = resolvePath(path);
|
|
546
559
|
}
|
|
547
560
|
/**
|
|
548
561
|
* A SYNCED frond answers to the same name.
|
|
549
562
|
*
|
|
550
563
|
* `fougere sync` writes `.fougere/remotes/<name>/` and registers it in `remotes.json`,
|
|
551
|
-
* which the Nuxt module already reads to alias `@
|
|
552
|
-
* 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`
|
|
553
566
|
* and never learns whether that frond is on this disk or was fetched from a card.
|
|
554
567
|
*
|
|
555
568
|
* A local frond wins a name collision — its source is the truth, a synced copy is a
|
|
@@ -558,9 +571,9 @@ export async function frondAliases(root) {
|
|
|
558
571
|
try {
|
|
559
572
|
const registry = JSON.parse(await readFile(join(root, '.fougere', 'remotes.json'), 'utf8'));
|
|
560
573
|
for (const [name, entry] of Object.entries(registry)) {
|
|
561
|
-
if (typeof entry?.path !== 'string' || aliases[
|
|
574
|
+
if (typeof entry?.path !== 'string' || aliases[frondPackage(name, conventions)])
|
|
562
575
|
continue;
|
|
563
|
-
aliases[
|
|
576
|
+
aliases[frondPackage(name, conventions)] = resolvePath(entry.path);
|
|
564
577
|
}
|
|
565
578
|
}
|
|
566
579
|
catch {
|
|
@@ -569,27 +582,33 @@ export async function frondAliases(root) {
|
|
|
569
582
|
}
|
|
570
583
|
return aliases;
|
|
571
584
|
}
|
|
572
|
-
export async function scanProject(root, filter) {
|
|
573
|
-
|
|
585
|
+
export async function scanProject(root, filter, conventionsInput) {
|
|
586
|
+
const conventions = resolveConventions(conventionsInput);
|
|
587
|
+
resetTypePrograms();
|
|
574
588
|
// A run owns its findings: two scans in one process (a test suite, a watcher)
|
|
575
589
|
// must not inherit each other's.
|
|
576
590
|
diagnostics = [];
|
|
577
|
-
const frondsDir = join(root,
|
|
591
|
+
const frondsDir = join(root, conventions.fronds);
|
|
578
592
|
const dirNames = await dirs(frondsDir);
|
|
579
593
|
// Resolve workspace root (parent of packages/) for package import resolution
|
|
580
594
|
// For monorepo: root is the project dir (e.g. demos/nuxt-blog), workspace root is the repo root
|
|
581
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);
|
|
582
602
|
const [rootFrond, under] = await Promise.all([
|
|
583
|
-
rootFrondOf(root, workspaceRoot),
|
|
603
|
+
rootFrondOf(root, workspaceRoot, conventions),
|
|
584
604
|
Promise.all(dirNames.map(async (dir) => {
|
|
585
605
|
const name = await frondNameOf(join(frondsDir, dir), dir);
|
|
586
|
-
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);
|
|
587
607
|
})),
|
|
588
608
|
]);
|
|
589
609
|
// The app's own domain first, then the ones it took in.
|
|
590
610
|
const all = rootFrond ? [rootFrond, ...under] : under;
|
|
591
|
-
const fronds = filter ? all.filter((f) => filter.includes(f.name)) : all;
|
|
592
|
-
flushCache();
|
|
611
|
+
const fronds = Fronds.scanned(filter ? all.filter((f) => filter.includes(f.name)) : all);
|
|
593
612
|
return { fronds, diagnostics };
|
|
594
613
|
}
|
|
595
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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"}
|