@fougere/core 0.1.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/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/binding.d.ts +63 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +107 -0
- package/dist/binding.js.map +1 -0
- package/dist/boot.d.ts +38 -0
- package/dist/boot.d.ts.map +1 -0
- package/dist/boot.js +53 -0
- package/dist/boot.js.map +1 -0
- package/dist/bootstrap.d.ts +4 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +825 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/builtins/config.d.ts +4 -0
- package/dist/builtins/config.d.ts.map +1 -0
- package/dist/builtins/config.js +6 -0
- package/dist/builtins/config.js.map +1 -0
- package/dist/builtins/logger.d.ts +28 -0
- package/dist/builtins/logger.d.ts.map +1 -0
- package/dist/builtins/logger.js +76 -0
- package/dist/builtins/logger.js.map +1 -0
- package/dist/call.d.ts +172 -0
- package/dist/call.d.ts.map +1 -0
- package/dist/call.js +209 -0
- package/dist/call.js.map +1 -0
- package/dist/collector.d.ts +28 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +32 -0
- package/dist/collector.js.map +1 -0
- package/dist/config-loader.d.ts +59 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +97 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/contract.d.ts +43 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +29 -0
- package/dist/contract.js.map +1 -0
- package/dist/crud.d.ts +61 -0
- package/dist/crud.d.ts.map +1 -0
- package/dist/crud.js +85 -0
- package/dist/crud.js.map +1 -0
- package/dist/define.d.ts +8 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +9 -0
- package/dist/define.js.map +1 -0
- package/dist/egress.d.ts +78 -0
- package/dist/egress.d.ts.map +1 -0
- package/dist/egress.js +185 -0
- package/dist/egress.js.map +1 -0
- package/dist/emit.d.ts +51 -0
- package/dist/emit.d.ts.map +1 -0
- package/dist/emit.js +57 -0
- package/dist/emit.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +74 -0
- package/dist/errors.js.map +1 -0
- package/dist/frond-config.d.ts +80 -0
- package/dist/frond-config.d.ts.map +1 -0
- package/dist/frond-config.js +32 -0
- package/dist/frond-config.js.map +1 -0
- package/dist/graph.d.ts +33 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +142 -0
- package/dist/graph.js.map +1 -0
- package/dist/handler-parser.d.ts +82 -0
- package/dist/handler-parser.d.ts.map +1 -0
- package/dist/handler-parser.js +505 -0
- package/dist/handler-parser.js.map +1 -0
- package/dist/imports.d.ts +22 -0
- package/dist/imports.d.ts.map +1 -0
- package/dist/imports.js +80 -0
- package/dist/imports.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/invocation.d.ts +20 -0
- package/dist/invocation.d.ts.map +1 -0
- package/dist/invocation.js +15 -0
- package/dist/invocation.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +15 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +29 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/logger.d.ts +14 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +25 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware.d.ts +75 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +89 -0
- package/dist/middleware.js.map +1 -0
- package/dist/operation.d.ts +87 -0
- package/dist/operation.d.ts.map +1 -0
- package/dist/operation.js +95 -0
- package/dist/operation.js.map +1 -0
- package/dist/orm.d.ts +96 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +33 -0
- package/dist/orm.js.map +1 -0
- package/dist/presenter.d.ts +63 -0
- package/dist/presenter.d.ts.map +1 -0
- package/dist/presenter.js +72 -0
- package/dist/presenter.js.map +1 -0
- package/dist/remote.d.ts +48 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +135 -0
- package/dist/remote.js.map +1 -0
- package/dist/repository.d.ts +55 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +26 -0
- package/dist/repository.js.map +1 -0
- package/dist/scan-cache.d.ts +10 -0
- package/dist/scan-cache.d.ts.map +1 -0
- package/dist/scan-cache.js +92 -0
- package/dist/scan-cache.js.map +1 -0
- package/dist/scanner.d.ts +34 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +595 -0
- package/dist/scanner.js.map +1 -0
- package/dist/seed.d.ts +28 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +110 -0
- package/dist/seed.js.map +1 -0
- package/dist/types.d.ts +387 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +57 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +147 -0
- package/dist/verify.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fougere contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @fougere/core
|
|
2
|
+
> The core — scan, call contract, façades
|
|
3
|
+
A frond call is a **value**: `(entity, op, invocation)`. `createLocalRunner` executes it
|
|
4
|
+
strictly locally; `createAppRunner` follows the topology (local façades, remote
|
|
5
|
+
stand-ins). Transports move the value — they never reshape it.
|
|
6
|
+
|
|
7
|
+
The façade judges the input, projects the output, and exposes only what a contract
|
|
8
|
+
declares.
|
|
9
|
+
|
|
10
|
+
Node-free surface, for the browser: the `@fougere/core/contract` subpath.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @fougere/core
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
Part of [Fougere](https://github.com/chok/fougere) — one schema, a gradient from
|
|
20
|
+
monolith to distributed, the same user code.
|
|
21
|
+
Reference documentation: [the site](https://chok.github.io/fougere/) (en/fr).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding — unified parameter resolution for handler operations.
|
|
3
|
+
*
|
|
4
|
+
* A BindingPlan is computed once at boot from parsed method signatures.
|
|
5
|
+
* At call time, resolveArgs() produces the argument array from an InvocationContext.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm (by param type):
|
|
8
|
+
* 1. Collector entity type → resolved via Collector.collect(ctx)
|
|
9
|
+
* 2. InvocationContext → the context itself
|
|
10
|
+
* 3. Primitive (string, number, boolean) → matched by name from params then query
|
|
11
|
+
* 4. Object/entity type → matched from body
|
|
12
|
+
*/
|
|
13
|
+
import type { ParsedParam } from './handler-parser.js';
|
|
14
|
+
import type { InvocationContext } from './invocation.js';
|
|
15
|
+
export type ParamSource = {
|
|
16
|
+
kind: 'collector';
|
|
17
|
+
entityName: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `Fact<PostPublished>` — something that happened, not something a caller typed.
|
|
21
|
+
*
|
|
22
|
+
* It resolves from the body exactly like `body` does, and that is deliberate: an
|
|
23
|
+
* emission and a direct call ARE the same call, so a subscriber cannot tell them apart
|
|
24
|
+
* and does not need to. The branch exists so the PLAN says what this parameter is —
|
|
25
|
+
* that sentence is what makes the subscriber index readable without reparsing types.
|
|
26
|
+
*/
|
|
27
|
+
| {
|
|
28
|
+
kind: 'fact';
|
|
29
|
+
factName: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'param';
|
|
32
|
+
name: string;
|
|
33
|
+
coerce?: 'number' | 'boolean';
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'body';
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'context';
|
|
38
|
+
}
|
|
39
|
+
/** The whole query bag, for an op whose argument IS the options (list). */
|
|
40
|
+
| {
|
|
41
|
+
kind: 'query';
|
|
42
|
+
};
|
|
43
|
+
export interface ParamBinding {
|
|
44
|
+
name: string;
|
|
45
|
+
source: ParamSource;
|
|
46
|
+
optional: boolean;
|
|
47
|
+
}
|
|
48
|
+
export type BindingPlan = ParamBinding[];
|
|
49
|
+
/**
|
|
50
|
+
* Build a BindingPlan from parsed method params.
|
|
51
|
+
*
|
|
52
|
+
* @param params - Parsed parameter list from AST
|
|
53
|
+
* @param collectorEntityNames - Set of entity names that have a Collector
|
|
54
|
+
*/
|
|
55
|
+
export declare function computeBindingPlan(params: ParsedParam[], collectorEntityNames: Set<string>): BindingPlan;
|
|
56
|
+
export interface CollectorResolver {
|
|
57
|
+
collect(ctx: InvocationContext): Promise<unknown>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve handler arguments from a BindingPlan + InvocationContext.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveArgs(plan: BindingPlan, ctx: InvocationContext, resolveCollector?: (entityName: string) => CollectorResolver | undefined): Promise<unknown[]>;
|
|
63
|
+
//# sourceMappingURL=binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAKzD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC3C;;;;;;;GAOG;GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE;AACrB,2EAA2E;GACzE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC;AAczC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EAAE,EACrB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,WAAW,CAuDb;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,iBAAiB,EACtB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,GACvE,OAAO,CAAC,OAAO,EAAE,CAAC,CAkCpB"}
|
package/dist/binding.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { toRegistrationName } from './contract.js';
|
|
2
|
+
// ── Primitives ────────────────────────────────
|
|
3
|
+
const PRIMITIVES = new Set(['string', 'number', 'boolean']);
|
|
4
|
+
function coercionFor(typeName) {
|
|
5
|
+
if (typeName === 'number')
|
|
6
|
+
return 'number';
|
|
7
|
+
if (typeName === 'boolean')
|
|
8
|
+
return 'boolean';
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
// ── Compute ───────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Build a BindingPlan from parsed method params.
|
|
14
|
+
*
|
|
15
|
+
* @param params - Parsed parameter list from AST
|
|
16
|
+
* @param collectorEntityNames - Set of entity names that have a Collector
|
|
17
|
+
*/
|
|
18
|
+
export function computeBindingPlan(params, collectorEntityNames) {
|
|
19
|
+
return params.map((param) => {
|
|
20
|
+
const typeName = param.type.name;
|
|
21
|
+
const typeNameLower = typeName.toLowerCase();
|
|
22
|
+
// 0. Fact — `Fact<X>` names itself, so nothing has to be known in advance. It comes
|
|
23
|
+
// FIRST because branch 4 would otherwise hand it the caller's body under the name
|
|
24
|
+
// of something that happened.
|
|
25
|
+
const factOf = param.type.name === 'Fact' ? param.type.generics?.[0]?.name : undefined;
|
|
26
|
+
if (factOf) {
|
|
27
|
+
return {
|
|
28
|
+
name: param.name,
|
|
29
|
+
source: { kind: 'fact', factName: toRegistrationName(factOf) },
|
|
30
|
+
optional: param.optional ?? false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// 1. Collector — param type matches a known collector entity
|
|
34
|
+
if (collectorEntityNames.has(typeNameLower)) {
|
|
35
|
+
return {
|
|
36
|
+
name: param.name,
|
|
37
|
+
source: { kind: 'collector', entityName: typeNameLower },
|
|
38
|
+
optional: param.optional ?? false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// 2. InvocationContext — inject the full context
|
|
42
|
+
if (typeName === 'InvocationContext') {
|
|
43
|
+
return {
|
|
44
|
+
name: param.name,
|
|
45
|
+
source: { kind: 'context' },
|
|
46
|
+
optional: param.optional ?? false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// 3. Primitives — matched by name from params > query
|
|
50
|
+
if (PRIMITIVES.has(typeName)) {
|
|
51
|
+
return {
|
|
52
|
+
name: param.name,
|
|
53
|
+
source: {
|
|
54
|
+
kind: 'param',
|
|
55
|
+
name: param.name,
|
|
56
|
+
coerce: coercionFor(typeName),
|
|
57
|
+
},
|
|
58
|
+
optional: param.optional ?? false,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// 4. Everything else — body
|
|
62
|
+
return {
|
|
63
|
+
name: param.name,
|
|
64
|
+
source: { kind: 'body' },
|
|
65
|
+
optional: param.optional ?? false,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve handler arguments from a BindingPlan + InvocationContext.
|
|
71
|
+
*/
|
|
72
|
+
export async function resolveArgs(plan, ctx, resolveCollector) {
|
|
73
|
+
const args = [];
|
|
74
|
+
for (const binding of plan) {
|
|
75
|
+
switch (binding.source.kind) {
|
|
76
|
+
case 'collector': {
|
|
77
|
+
const collector = resolveCollector?.(binding.source.entityName);
|
|
78
|
+
args.push(collector ? await collector.collect(ctx) : undefined);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'context': {
|
|
82
|
+
args.push(ctx);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'param': {
|
|
86
|
+
let val = ctx.params[binding.source.name] ?? ctx.query[binding.source.name];
|
|
87
|
+
if (val != null && binding.source.coerce === 'number')
|
|
88
|
+
val = Number(val);
|
|
89
|
+
if (val != null && binding.source.coerce === 'boolean')
|
|
90
|
+
val = val === 'true' || val === '1' || val === true;
|
|
91
|
+
args.push(val);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'fact':
|
|
95
|
+
case 'body': {
|
|
96
|
+
args.push(ctx.body);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case 'query': {
|
|
100
|
+
args.push(ctx.query);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return args;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"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"}
|
package/dist/boot.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type FougereConfig } from './config-loader.js';
|
|
2
|
+
import type { App, CreateAppOptions } from './types.js';
|
|
3
|
+
import type { Transport } from './call.js';
|
|
4
|
+
import type { Container } from '@fougere/container';
|
|
5
|
+
export interface BootOptions {
|
|
6
|
+
/** Project root. Defaults to process.cwd(). */
|
|
7
|
+
root?: string;
|
|
8
|
+
/** Override config (merged with fougere.config.ts). */
|
|
9
|
+
config?: Partial<FougereConfig>;
|
|
10
|
+
/** Container factory. Required. */
|
|
11
|
+
createContainer: () => Container;
|
|
12
|
+
/** Only boot these fronds (by name). Absent = all. */
|
|
13
|
+
fronds?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Remote fronds — label → address. A declared remote wins over local
|
|
16
|
+
* presence (the frond runs elsewhere). Requires `remoteTransport`.
|
|
17
|
+
*/
|
|
18
|
+
remotes?: Record<string, string>;
|
|
19
|
+
/** Builds the transport to reach `remotes`. Supplied by a layer-2 package. */
|
|
20
|
+
remoteTransport?: (url: string) => Transport;
|
|
21
|
+
/**
|
|
22
|
+
* ORM setup — returns the storage handle (db), an ormFactory and an optional afterBoot.
|
|
23
|
+
* The `db` value is forwarded to the auth provider via AuthContext when `auth` is set.
|
|
24
|
+
*/
|
|
25
|
+
db?: (config: FougereConfig) => {
|
|
26
|
+
db?: unknown;
|
|
27
|
+
ormFactory: CreateAppOptions['ormFactory'];
|
|
28
|
+
afterBoot?: (app: App) => Promise<void> | void;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Boot a Fougere app from fougere.config.ts.
|
|
33
|
+
*
|
|
34
|
+
* Handles: config loading, container creation, DB setup, seeding.
|
|
35
|
+
* Works for any surface (Nuxt, GraphQL standalone, CLI, tests).
|
|
36
|
+
*/
|
|
37
|
+
export declare function boot(options: BootOptions): Promise<App>;
|
|
38
|
+
//# sourceMappingURL=boot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,mCAAmC;IACnC,eAAe,EAAE,MAAM,SAAS,CAAC;IACjC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8EAA8E;IAC9E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7C;;;OAGG;IACH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK;QAC9B,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC3C,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAChD,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAiD7D"}
|
package/dist/boot.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createApp } from './bootstrap.js';
|
|
2
|
+
import { orderSeeds, runSeeds } from './seed.js';
|
|
3
|
+
import { loadConfig } from './config-loader.js';
|
|
4
|
+
import { Logger } from './builtins/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Boot a Fougere app from fougere.config.ts.
|
|
7
|
+
*
|
|
8
|
+
* Handles: config loading, container creation, DB setup, seeding.
|
|
9
|
+
* Works for any surface (Nuxt, GraphQL standalone, CLI, tests).
|
|
10
|
+
*/
|
|
11
|
+
export async function boot(options) {
|
|
12
|
+
const bootStart = performance.now();
|
|
13
|
+
const log = new Logger('boot', { level: process.env.FOUGERE_LOG_LEVEL ?? 'debug' });
|
|
14
|
+
const root = options.root ?? process.cwd();
|
|
15
|
+
log.info(`root: ${root}`);
|
|
16
|
+
log.debug('loading config');
|
|
17
|
+
const fileConfig = await loadConfig(root);
|
|
18
|
+
const config = { ...fileConfig, ...options.config };
|
|
19
|
+
log.info('config loaded');
|
|
20
|
+
let dbSetup;
|
|
21
|
+
if (options.db) {
|
|
22
|
+
log.debug('initializing database');
|
|
23
|
+
dbSetup = options.db(config);
|
|
24
|
+
log.info('database initialized');
|
|
25
|
+
}
|
|
26
|
+
log.debug('creating app (scan + container)');
|
|
27
|
+
const app = await createApp({
|
|
28
|
+
root,
|
|
29
|
+
createContainer: options.createContainer,
|
|
30
|
+
ormFactory: dbSetup?.ormFactory,
|
|
31
|
+
db: dbSetup?.db,
|
|
32
|
+
auth: config.auth,
|
|
33
|
+
fronds: options.fronds,
|
|
34
|
+
remotes: options.remotes,
|
|
35
|
+
remoteTransport: options.remoteTransport,
|
|
36
|
+
});
|
|
37
|
+
if (dbSetup?.afterBoot) {
|
|
38
|
+
log.debug('running migrations');
|
|
39
|
+
await dbSetup.afterBoot(app);
|
|
40
|
+
log.info('migrations done');
|
|
41
|
+
}
|
|
42
|
+
// Run seeds — in dependency order, so a referrer never lands before its target.
|
|
43
|
+
const seeds = orderSeeds(app.fronds);
|
|
44
|
+
if (seeds.length > 0) {
|
|
45
|
+
log.debug(`seeding ${seeds.length} entities: ${seeds.map((s) => s.entityName).join(' → ')}`);
|
|
46
|
+
await runSeeds(app, seeds, (message) => log.debug(message));
|
|
47
|
+
log.info('seeding done');
|
|
48
|
+
}
|
|
49
|
+
const ms = (performance.now() - bootStart).toFixed(0);
|
|
50
|
+
log.info(`ready in ${ms}ms — ${app.fronds.length} frond(s)`);
|
|
51
|
+
return app;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=boot.js.map
|
package/dist/boot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAA6C,MAAM,YAAY,CAAC;AA8EnG,uCAAuC;AACvC,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CA2zBvE"}
|