@fougere/core 0.12.4-alpha.0 → 0.12.5-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FougereConfig.d.ts +0 -3
- package/dist/FougereConfig.d.ts.map +1 -1
- package/dist/FougereConfig.js.map +1 -1
- package/dist/FrondDeclaration.d.ts +5 -0
- package/dist/FrondDeclaration.d.ts.map +1 -1
- package/dist/FrondDeclaration.js +3 -0
- package/dist/FrondDeclaration.js.map +1 -1
- package/dist/FrondsStated.d.ts +4 -2
- package/dist/FrondsStated.d.ts.map +1 -1
- package/dist/FrondsStated.js.map +1 -1
- package/dist/StatedFrond.d.ts +3 -0
- package/dist/StatedFrond.d.ts.map +1 -1
- package/dist/StatedFrond.js +4 -0
- package/dist/StatedFrond.js.map +1 -1
- package/dist/StatedModules.d.ts +5 -2
- package/dist/StatedModules.d.ts.map +1 -1
- package/dist/StatedModules.js +11 -6
- package/dist/StatedModules.js.map +1 -1
- package/dist/boot/AppLifecycle.d.ts +3 -0
- package/dist/boot/AppLifecycle.d.ts.map +1 -1
- package/dist/boot/AppLifecycle.js +5 -0
- package/dist/boot/AppLifecycle.js.map +1 -1
- package/dist/boot/Extension.d.ts +6 -0
- package/dist/boot/Extension.d.ts.map +1 -1
- package/dist/boot/bootstrap.d.ts.map +1 -1
- package/dist/boot/bootstrap.js +14 -5
- package/dist/boot/bootstrap.js.map +1 -1
- package/dist/boot/install.d.ts +3 -0
- package/dist/boot/install.d.ts.map +1 -1
- package/dist/boot/install.js +1 -0
- package/dist/boot/install.js.map +1 -1
- package/dist/boot/nesting.d.ts.map +1 -1
- package/dist/boot/nesting.js +2 -1
- package/dist/boot/nesting.js.map +1 -1
- package/dist/boot/remote.d.ts +2 -1
- package/dist/boot/remote.d.ts.map +1 -1
- package/dist/boot/remote.js +7 -4
- package/dist/boot/remote.js.map +1 -1
- package/dist/boot/seed.d.ts +2 -1
- package/dist/boot/seed.d.ts.map +1 -1
- package/dist/boot/seed.js +10 -29
- package/dist/boot/seed.js.map +1 -1
- package/dist/descriptor/ExtensionEntry.d.ts +4 -0
- package/dist/descriptor/ExtensionEntry.d.ts.map +1 -1
- package/dist/descriptor/ExtensionEntry.js +6 -1
- package/dist/descriptor/ExtensionEntry.js.map +1 -1
- package/dist/descriptor/FrondDescriptor.d.ts +2 -0
- package/dist/descriptor/FrondDescriptor.d.ts.map +1 -1
- package/dist/descriptor/FrondDescriptor.js +5 -0
- package/dist/descriptor/FrondDescriptor.js.map +1 -1
- package/dist/dispatch/ArgumentResolver.d.ts.map +1 -1
- package/dist/dispatch/ArgumentResolver.js +2 -1
- package/dist/dispatch/ArgumentResolver.js.map +1 -1
- package/dist/dispatch/Facade.d.ts +3 -0
- package/dist/dispatch/Facade.d.ts.map +1 -1
- package/dist/dispatch/HandlerFacade.d.ts.map +1 -1
- package/dist/dispatch/HandlerFacade.js +8 -4
- package/dist/dispatch/HandlerFacade.js.map +1 -1
- package/dist/prefab/collector.d.ts +6 -0
- package/dist/prefab/collector.d.ts.map +1 -1
- package/dist/prefab/collector.js +26 -1
- package/dist/prefab/collector.js.map +1 -1
- package/dist/storage/Storage.d.ts +3 -2
- package/dist/storage/Storage.d.ts.map +1 -1
- package/dist/storage/Storage.js +23 -10
- package/dist/storage/Storage.js.map +1 -1
- package/dist/storage/Store.d.ts.map +1 -1
- package/dist/storage/Store.js +4 -2
- package/dist/storage/Store.js.map +1 -1
- package/dist/wire/Invocation.d.ts +2 -1
- package/dist/wire/Invocation.d.ts.map +1 -1
- package/dist/wire/Invocation.js +4 -1
- package/dist/wire/Invocation.js.map +1 -1
- package/dist/wire/InvocationContext.d.ts +2 -0
- package/dist/wire/InvocationContext.d.ts.map +1 -1
- package/dist/wire/StateShape.d.ts +27 -0
- package/dist/wire/StateShape.d.ts.map +1 -0
- package/dist/wire/StateShape.js +59 -0
- package/dist/wire/StateShape.js.map +1 -0
- package/package.json +4 -4
- package/src/FougereConfig.ts +0 -3
- package/src/FrondDeclaration.ts +6 -0
- package/src/FrondsStated.ts +4 -2
- package/src/StatedFrond.ts +5 -0
- package/src/StatedModules.ts +17 -9
- package/src/boot/AppLifecycle.ts +6 -0
- package/src/boot/Extension.ts +6 -0
- package/src/boot/bootstrap.ts +16 -5
- package/src/boot/install.ts +4 -0
- package/src/boot/nesting.ts +2 -1
- package/src/boot/remote.ts +8 -3
- package/src/boot/seed.ts +11 -36
- package/src/descriptor/ExtensionEntry.ts +16 -1
- package/src/descriptor/FrondDescriptor.ts +7 -0
- package/src/dispatch/ArgumentResolver.ts +2 -1
- package/src/dispatch/Facade.ts +3 -0
- package/src/dispatch/HandlerFacade.ts +8 -3
- package/src/prefab/collector.ts +29 -1
- package/src/storage/Storage.ts +26 -12
- package/src/storage/Store.ts +4 -2
- package/src/wire/Invocation.ts +3 -1
- package/src/wire/InvocationContext.ts +2 -0
- package/src/wire/StateShape.ts +76 -0
package/dist/prefab/collector.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Documented: [collectors](https://fougere.dev/docs/business/collectors).
|
|
5
5
|
*/
|
|
6
|
-
import { upperFirst } from '@fougere/schema';
|
|
6
|
+
import { FieldValueValidator, dotted, json, upperFirst } from '@fougere/schema';
|
|
7
|
+
import { ErrorCode } from '../wire/ErrorCode.js';
|
|
8
|
+
import { FougereError } from '../wire/FougereError.js';
|
|
7
9
|
export function Collector(target) {
|
|
8
10
|
class CollectorBase {
|
|
9
11
|
static __entity = target;
|
|
@@ -14,4 +16,27 @@ export function Collector(target) {
|
|
|
14
16
|
export function collectorKeyOf(type) {
|
|
15
17
|
return `${upperFirst(type)}Collector`;
|
|
16
18
|
}
|
|
19
|
+
const readers = new WeakMap();
|
|
20
|
+
/**
|
|
21
|
+
* What a collector answered, read by the entity it names — judged and rebuilt, so a `User` that
|
|
22
|
+
* crossed a process as JSON reaches the handler with its dates. A collector naming no entity
|
|
23
|
+
* answers what it built.
|
|
24
|
+
*/
|
|
25
|
+
export function collectedAs(collector, value) {
|
|
26
|
+
const target = collector.constructor.__entity;
|
|
27
|
+
if (value === null || value === undefined || typeof target?.getFields !== 'function')
|
|
28
|
+
return value;
|
|
29
|
+
let reader = readers.get(target);
|
|
30
|
+
if (!reader) {
|
|
31
|
+
reader = json(target);
|
|
32
|
+
readers.set(target, reader);
|
|
33
|
+
}
|
|
34
|
+
const verdict = FieldValueValidator.of(reader).parse(value);
|
|
35
|
+
if ('value' in verdict)
|
|
36
|
+
return verdict.value;
|
|
37
|
+
throw new FougereError({
|
|
38
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
39
|
+
message: `${collector.constructor.name}: ${verdict.path?.length ? `${dotted(verdict.path)}: ` : ''}${verdict.message}`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
17
42
|
//# sourceMappingURL=collector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/prefab/collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/prefab/collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAA+B,MAAM,iBAAiB,CAAC;AAC7G,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,UAAU,SAAS,CAAiD,MAAS;IACjF,MAAM,aAAa;QACjB,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC;;IAGpC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAc;IAC3D,MAAM,MAAM,GAAI,SAAS,CAAC,WAAkD,CAAC,QAAQ,CAAC;IACtF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,MAAM,EAAE,SAAS,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAEnG,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,CAAC,MAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC;IAE7C,MAAM,IAAI,YAAY,CAAC;QACrB,IAAI,EAAE,SAAS,CAAC,iBAAiB;QACjC,OAAO,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;KACvH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,8 +3,9 @@ import type { ListOptions } from './ListOptions.js';
|
|
|
3
3
|
import type { ListResult } from './ListResult.js';
|
|
4
4
|
import type { SelectOption } from './SelectOption.js';
|
|
5
5
|
/**
|
|
6
|
-
* Refuse an option the port does not answer to, and an order by a
|
|
7
|
-
* declare — an unhonoured `orderBy` returns the page in whatever order
|
|
6
|
+
* Refuse an option the port does not answer to, a count that is not one, and an order by a
|
|
7
|
+
* field the entity does not declare — an unhonoured `orderBy` returns the page in whatever order
|
|
8
|
+
* the engine chose. Refused as BAD_REQUEST: a plain Error left as INTERNAL_ERROR, its message hidden.
|
|
8
9
|
*/
|
|
9
10
|
export declare function assertListOptions(options: object | undefined, entity: string, declared: readonly string[]): void;
|
|
10
11
|
/** Per-entity storage — scoped CRUD operations on a single entity type. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/Storage.js
CHANGED
|
@@ -1,25 +1,38 @@
|
|
|
1
1
|
import { upperFirst, lowerFirst } from '@fougere/schema';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { ErrorCode } from '../wire/ErrorCode.js';
|
|
3
|
+
import { FougereError } from '../wire/FougereError.js';
|
|
4
|
+
/** The keys `list()` answers to, checked against `ListOptions` so neither can drift. */
|
|
5
|
+
const LIST_OPTION_KEYS = Object.keys({
|
|
6
|
+
limit: true, offset: true, page: true, after: true, orderBy: true, order: true, count: true, where: true, select: true,
|
|
7
|
+
});
|
|
8
|
+
/** What a count must be — a text that did not read as a number arrives as `NaN`. */
|
|
9
|
+
const COUNTS = ['limit', 'offset', 'page'];
|
|
6
10
|
/**
|
|
7
|
-
* Refuse an option the port does not answer to, and an order by a
|
|
8
|
-
* declare — an unhonoured `orderBy` returns the page in whatever order
|
|
11
|
+
* Refuse an option the port does not answer to, a count that is not one, and an order by a
|
|
12
|
+
* field the entity does not declare — an unhonoured `orderBy` returns the page in whatever order
|
|
13
|
+
* the engine chose. Refused as BAD_REQUEST: a plain Error left as INTERNAL_ERROR, its message hidden.
|
|
9
14
|
*/
|
|
10
15
|
export function assertListOptions(options, entity, declared) {
|
|
11
16
|
if (!options)
|
|
12
17
|
return;
|
|
13
|
-
const
|
|
14
|
-
const strangers = Object.keys(options).filter((key) => !legal.has(key));
|
|
18
|
+
const strangers = Object.keys(options).filter((key) => !LIST_OPTION_KEYS.includes(key));
|
|
15
19
|
if (strangers.length > 0) {
|
|
16
|
-
|
|
20
|
+
refuse(`${entity}.list(): unknown option ${strangers.map((s) => `\`${s}\``).join(', ')}. ` +
|
|
17
21
|
`Known options are ${LIST_OPTION_KEYS.join(', ')} — to filter, pass \`where: { ${strangers[0]}: … }\`.`);
|
|
18
22
|
}
|
|
23
|
+
for (const count of COUNTS) {
|
|
24
|
+
const value = options[count];
|
|
25
|
+
if (value !== undefined && !(Number.isInteger(value) && value >= 0)) {
|
|
26
|
+
refuse(`${entity}.list(): \`${count}\` is ${typeof value === 'number' ? value : JSON.stringify(value)}, not a whole number.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
19
29
|
const { orderBy } = options;
|
|
20
30
|
if (orderBy === undefined || declared.includes(orderBy))
|
|
21
31
|
return;
|
|
22
|
-
|
|
32
|
+
refuse(`${entity}.list(): unknown orderBy \`${orderBy}\`. ${entity} declares ${declared.join(', ')}.`);
|
|
33
|
+
}
|
|
34
|
+
function refuse(message) {
|
|
35
|
+
throw new FougereError({ code: ErrorCode.BAD_REQUEST, message });
|
|
23
36
|
}
|
|
24
37
|
/**
|
|
25
38
|
* What each link of a chain stands in front of.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.js","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Storage.js","sourceRoot":"","sources":["../../src/storage/Storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/storage/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/storage/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,4EAA4E;AAC5E,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,6FAA6F;IAC7F,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,cAAc,CAoI7F"}
|
package/dist/storage/Store.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { applyCreate, applyUpdate, Role } from '@fougere/schema';
|
|
2
2
|
import { comparisonOf, comparisonsIn } from './Comparison.js';
|
|
3
|
+
import { ErrorCode } from '../wire/ErrorCode.js';
|
|
4
|
+
import { FougereError } from '../wire/FougereError.js';
|
|
3
5
|
export function storageOver(open) {
|
|
4
6
|
return (entity, name) => {
|
|
5
7
|
const fields = entity.getFields();
|
|
@@ -110,7 +112,7 @@ export function storageOver(open) {
|
|
|
110
112
|
// constraint violation, and a store that loses data silently is worse than one
|
|
111
113
|
// that fails.
|
|
112
114
|
if (await store.has(keyOf(id))) {
|
|
113
|
-
throw new
|
|
115
|
+
throw new FougereError({ code: ErrorCode.CONFLICT, message: `${name}.create: '${pk}' ${JSON.stringify(id)} already exists.` });
|
|
114
116
|
}
|
|
115
117
|
await store.set(keyOf(id), values);
|
|
116
118
|
return pick(values);
|
|
@@ -118,7 +120,7 @@ export function storageOver(open) {
|
|
|
118
120
|
async update(id, input) {
|
|
119
121
|
const existing = await store.get(keyOf(id));
|
|
120
122
|
if (!existing)
|
|
121
|
-
throw new
|
|
123
|
+
throw new FougereError({ code: ErrorCode.NOT_FOUND, message: `No row in ${name} for ${JSON.stringify(id)}.` });
|
|
122
124
|
const updated = { ...existing, ...applyUpdate(fields, input), [pk]: existing[pk] };
|
|
123
125
|
await store.set(keyOf(id), updated);
|
|
124
126
|
return pick(updated);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../src/storage/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAmB,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../src/storage/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAmB,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAmB,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAiBvD,MAAM,UAAU,WAAW,CAAC,IAAiD;IAC3E,OAAO,CAAC,MAAkB,EAAE,IAAY,EAAW,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC/F,mFAAmF;QACnF,iFAAiF;QACjF,mCAAmC;QACnC,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,sFAAsF;QACtF,sFAAsF;QACtF,MAAM,OAAO,GAAG,CAAC,MAA+B,EAAE,QAAiC,EAAE,EAAE,CACrF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,UAAU;gBAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;YAEzD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEL,mFAAmF;QACnF,qFAAqF;QACrF,4EAA4E;QAC5E,MAAM,MAAM,GAAG,CAAC,QAAsB,EAAW,EAAE;YACjD,MAAM,IAAI,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,CAAC,QAAQ;gBAChD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjF,CAAC,CAAC,MAAM,CAAC,CAAC;YAEZ,yFAAyF;YACzF,0BAA0B;YAC1B,mFAAmF;YACnF,6EAA6E;YAC7E,MAAM,MAAM,GAAG,KAAK,EAAE,KAAuC,EAAmB,EAAE;gBAChF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAChE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAuB,CAAC;gBAC7C,IAAI,EAAE,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mBAAmB,EAAE,4CAA4C,CAAC,CAAC;gBAChH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnF,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAEnC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC,CAAC;YAEF,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,CAAC,IAAI,CAAC,OAAa;oBACtB,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,OAAO,EAAE,KAAK;wBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACrF,IAAI,OAAO,EAAE,OAAO;wBAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAE5E,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;gBACD,KAAK,CAAC,QAAQ,CAAC,EAAU;oBACvB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBAE1C,OAAO,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,QAAiC;oBAC5C,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAE3E,OAAO,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC;gBACD,KAAK,CAAC,SAAS,CAAC,QAAiC;oBAC/C,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrF,CAAC;gBACD,oFAAoF;gBACpF,KAAK,CAAC,UAAU,CAAC,GAAsB;oBACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;oBACzD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;wBACrB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC1C,IAAI,MAAM;4BAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBAClD,CAAC;oBAED,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,8EAA8E;gBAC9E,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,IAAuB;oBACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;oBAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,OAAO,CAAC;oBACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzC,KAAK,MAAM,MAAM,IAAI,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;wBACvC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;4BAAE,SAAS;wBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAChC,IAAI,MAAM;4BAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;;4BAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC/E,CAAC;oBAED,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,MAAM;gBACN,KAAK,CAAC,SAAS,CAAC,MAAmD;oBACjE,KAAK,MAAM,KAAK,IAAI,MAAM;wBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;oBAEhD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACvB,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,KAAuC;oBAClD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAuB,CAAC;oBAC5C,6EAA6E;oBAC7E,iFAAiF;oBACjF,8EAA8E;oBAC9E,yBAAyB;oBACzB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,EAAE,0FAA0F,CAAC,CAAC;oBACpI,CAAC;oBACD,gFAAgF;oBAChF,qFAAqF;oBACrF,+EAA+E;oBAC/E,cAAc;oBACd,IAAI,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;wBAC/B,MAAM,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACjI,CAAC;oBACD,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;oBAEnC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAAuC;oBAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC5C,IAAI,CAAC,QAAQ;wBAAE,MAAM,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC9H,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnF,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;oBAEpC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,EAAU,IAAI,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,MAAM,CAAC,MAAkB,IAAI,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxF,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAa,EAAE,UAAsB;IACrD,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACvD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,KAAK,KAAK,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,KAAK,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,UAAU,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,KAAK,OAAO,CAAC,CAAC,OAAO,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACxF,KAAK,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/E,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,KAA2B,CAAC;gBAEhD,OAAO,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,KAAc,EAAE,KAAwC,EAAW,EAAE,CACnG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjF,8EAA8E;AAC9E,MAAM,KAAK,GAAG,CAAC,KAAc,EAAU,EAAE,CACvC,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAE,KAAgB,CAAC;AAE9D,0FAA0F;AAC1F,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,KAAa,EAAE,SAAqC,EAAY,EAAE,CAChG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC7B,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEvE,iEAAiE;AACjE,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,KAAc,EAAU,EAAE;IACrD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,KAAK,CACZ,OAAiB,EACjB,OAAwF,EACxF,EAAU,EACV,IAAgC;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IAE1F,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,IAAI,KAAK;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEzC,8FAA8F;IAC9F,iBAAiB;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,MAAM,CAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAA6B,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACxE,CAAC,CAAC,SAAS,CAAC;IAEd,2EAA2E;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAuB,CAAC;IACrD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,IAAI,OAAO,EAAE,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -11,7 +11,8 @@ export declare class Invocation implements InvocationContext {
|
|
|
11
11
|
readonly identity?: string;
|
|
12
12
|
readonly caller?: string;
|
|
13
13
|
readonly runAt?: number;
|
|
14
|
-
|
|
14
|
+
readonly crossed?: true;
|
|
15
|
+
/** Gives every entry and every transport the same nine-member value, frozen. */
|
|
15
16
|
private constructor();
|
|
16
17
|
/** Takes a raw object or an invocation, so a caller never has to know which it holds. */
|
|
17
18
|
static from(context?: PartialInvocation): Invocation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invocation.d.ts","sourceRoot":"","sources":["../../src/wire/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAyBhE,gEAAgE;AAChE,qBAAa,UAAW,YAAW,iBAAiB;IAClD,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAqB;IAE1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,
|
|
1
|
+
{"version":3,"file":"Invocation.d.ts","sourceRoot":"","sources":["../../src/wire/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAyBhE,gEAAgE;AAChE,qBAAa,UAAW,YAAW,iBAAiB;IAClD,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAqB;IAE1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IAExB,gFAAgF;IAChF,OAAO;IAeP,yFAAyF;IACzF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU;IAKpD,wEAAwE;IACxE,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;IAIrC,0FAA0F;IAC1F,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAGtD"}
|
package/dist/wire/Invocation.js
CHANGED
|
@@ -31,7 +31,8 @@ export class Invocation {
|
|
|
31
31
|
identity;
|
|
32
32
|
caller;
|
|
33
33
|
runAt;
|
|
34
|
-
|
|
34
|
+
crossed;
|
|
35
|
+
/** Gives every entry and every transport the same nine-member value, frozen. */
|
|
35
36
|
constructor(context) {
|
|
36
37
|
this.params = canonicalRecord(context.params);
|
|
37
38
|
this.query = canonicalRecord(context.query);
|
|
@@ -47,6 +48,8 @@ export class Invocation {
|
|
|
47
48
|
this.caller = context.caller;
|
|
48
49
|
if (context.runAt !== undefined)
|
|
49
50
|
this.runAt = context.runAt;
|
|
51
|
+
if (context.crossed)
|
|
52
|
+
this.crossed = true;
|
|
50
53
|
Object.freeze(this);
|
|
51
54
|
}
|
|
52
55
|
/** Takes a raw object or an invocation, so a caller never has to know which it holds. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../../src/wire/Invocation.ts"],"names":[],"mappings":"AAGA,+FAA+F;AAC/F,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEvE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,oFAAoF;AACpF,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE1F,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,gEAAgE;AAChE,MAAM,OAAO,UAAU;IACrB,MAAM,CAAU,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAEjC,MAAM,CAA0B;IAChC,KAAK,CAA0B;IAC/B,KAAK,CAAU;IACf,KAAK,CAA0B;IAC/B,KAAK,CAAU;IACf,QAAQ,CAAU;IAClB,MAAM,CAAU;IAChB,KAAK,CAAU;IAExB,
|
|
1
|
+
{"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../../src/wire/Invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,7 @@ export interface InvocationContext {
|
|
|
8
8
|
caller?: string;
|
|
9
9
|
/** Epoch milliseconds before which this call is not to run. */
|
|
10
10
|
runAt?: number;
|
|
11
|
+
/** Written by the receiver of a call from another process, whose state was judged where it entered. */
|
|
12
|
+
crossed?: true;
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=InvocationContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvocationContext.d.ts","sourceRoot":"","sources":["../../src/wire/InvocationContext.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"InvocationContext.d.ts","sourceRoot":"","sources":["../../src/wire/InvocationContext.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Field } from '@fougere/schema';
|
|
2
|
+
/** An extension and the members it puts on a call's `state`. */
|
|
3
|
+
export interface StateDeclaration {
|
|
4
|
+
name: string;
|
|
5
|
+
state?: Readonly<Record<string, Field>>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* What a call's `state` may hold in this process: the members its extensions declare, each one
|
|
9
|
+
* absent until a host fills it. Judged at the facade, so a member arriving over the wire is
|
|
10
|
+
* rebuilt by its field exactly as it would have been handed over in-process.
|
|
11
|
+
*
|
|
12
|
+
* Documented: [collectors](https://fougere.dev/docs/business/collectors).
|
|
13
|
+
*/
|
|
14
|
+
export declare class StateShape {
|
|
15
|
+
private readonly fields;
|
|
16
|
+
static readonly empty: StateShape;
|
|
17
|
+
private readonly validator;
|
|
18
|
+
private constructor();
|
|
19
|
+
/** Two extensions declaring one member refuse: the field that judges it would depend on wiring order. */
|
|
20
|
+
static of(declarations: readonly StateDeclaration[]): StateShape;
|
|
21
|
+
/**
|
|
22
|
+
* The members written since `entered` rebuilt by their fields, or a refusal naming the member
|
|
23
|
+
* and what this process declares. What `entered` already held was judged where it entered.
|
|
24
|
+
*/
|
|
25
|
+
judge(state: Record<string, unknown>, entity: string, operation: string, entered?: Record<string, unknown>): Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=StateShape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateShape.d.ts","sourceRoot":"","sources":["../../src/wire/StateShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,KAAK,EAAe,MAAM,iBAAiB,CAAC;AAI5F,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;CACzC;AAED;;;;;;GAMG;AACH,qBAAa,UAAU;IAKD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3C,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAsB;IAE3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,OAAO;IAIP,yGAAyG;IACzG,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,GAAG,UAAU;IAoBhE;;;OAGG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAmB3B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { InputValidator, dotted, optional } from '@fougere/schema';
|
|
2
|
+
import { ErrorCode } from './ErrorCode.js';
|
|
3
|
+
import { FougereError } from './FougereError.js';
|
|
4
|
+
/**
|
|
5
|
+
* What a call's `state` may hold in this process: the members its extensions declare, each one
|
|
6
|
+
* absent until a host fills it. Judged at the facade, so a member arriving over the wire is
|
|
7
|
+
* rebuilt by its field exactly as it would have been handed over in-process.
|
|
8
|
+
*
|
|
9
|
+
* Documented: [collectors](https://fougere.dev/docs/business/collectors).
|
|
10
|
+
*/
|
|
11
|
+
export class StateShape {
|
|
12
|
+
fields;
|
|
13
|
+
static empty = new StateShape({});
|
|
14
|
+
validator;
|
|
15
|
+
constructor(fields) {
|
|
16
|
+
this.fields = fields;
|
|
17
|
+
this.validator = InputValidator.of(fields);
|
|
18
|
+
}
|
|
19
|
+
/** Two extensions declaring one member refuse: the field that judges it would depend on wiring order. */
|
|
20
|
+
static of(declarations) {
|
|
21
|
+
const fields = {};
|
|
22
|
+
const owners = new Map();
|
|
23
|
+
for (const { name, state } of declarations) {
|
|
24
|
+
for (const [member, field] of Object.entries(state ?? {})) {
|
|
25
|
+
const owner = owners.get(member);
|
|
26
|
+
if (owner) {
|
|
27
|
+
throw new Error(`[state] '${member}' is declared by two extensions, '${owner}' and '${name}'.\n`
|
|
28
|
+
+ ' A member has one owner — keep one of them out of `extensions:`.');
|
|
29
|
+
}
|
|
30
|
+
owners.set(member, name);
|
|
31
|
+
fields[member] = optional(field);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return new StateShape(fields);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The members written since `entered` rebuilt by their fields, or a refusal naming the member
|
|
38
|
+
* and what this process declares. What `entered` already held was judged where it entered.
|
|
39
|
+
*/
|
|
40
|
+
judge(state, entity, operation, entered = {}) {
|
|
41
|
+
const written = Object.fromEntries(Object.entries(state).filter(([member, value]) => entered[member] !== value));
|
|
42
|
+
if (Object.keys(written).length === 0)
|
|
43
|
+
return state;
|
|
44
|
+
const result = this.validator.validate(written);
|
|
45
|
+
if (result.success)
|
|
46
|
+
return { ...state, ...result.data };
|
|
47
|
+
const declared = Object.keys(this.fields);
|
|
48
|
+
const errors = result.errors.map((error) => ({ ...error, path: ['state', ...error.path] }));
|
|
49
|
+
throw new FougereError({
|
|
50
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
51
|
+
message: errors.map((error) => `${dotted(error.path)}: ${error.message}`).join(', ')
|
|
52
|
+
+ (declared.length ? ` — this process declares ${declared.join(', ')}` : ' — this process declares no state member'),
|
|
53
|
+
details: errors,
|
|
54
|
+
entity,
|
|
55
|
+
operation,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=StateShape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateShape.js","sourceRoot":"","sources":["../../src/wire/StateShape.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/core",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.5-alpha.0",
|
|
4
4
|
"description": "The core — scan, call contract, façades, remote stand-ins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
@@ -60,13 +60,13 @@
|
|
|
60
60
|
],
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"dequal": "^2.0.3",
|
|
63
|
-
"@fougere/container": "0.12.
|
|
64
|
-
"@fougere/schema": "0.12.
|
|
63
|
+
"@fougere/container": "0.12.5-alpha.0",
|
|
64
|
+
"@fougere/schema": "0.12.5-alpha.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/node": "^22.0.0",
|
|
68
68
|
"@typescript/typescript6": "^6.0.2",
|
|
69
|
-
"@fougere/compiler": "0.12.
|
|
69
|
+
"@fougere/compiler": "0.12.5-alpha.0"
|
|
70
70
|
},
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
package/src/FougereConfig.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
import type { Extension } from './boot/Extension.js';
|
|
4
3
|
import type { LogLevel } from './builtin/LogLevel.js';
|
|
5
4
|
import type { ConventionsInput } from './ConventionsInput.js';
|
|
6
5
|
import type { NameOf } from './NameOf.js';
|
|
@@ -29,8 +28,6 @@ export interface FougereConfig {
|
|
|
29
28
|
fronds?: FrondsStated;
|
|
30
29
|
/** What answers a port — a name, or the chain from the outside in. */
|
|
31
30
|
ports?: PortChoice;
|
|
32
|
-
/** The auth provider — an extension, which brings the frond its rows live in. */
|
|
33
|
-
auth?: Extension;
|
|
34
31
|
/** Which protocol adapters this app serves. */
|
|
35
32
|
adapters?: AdapterConfig;
|
|
36
33
|
}
|
package/src/FrondDeclaration.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type { MiddlewareEntry } from './descriptor/MiddlewareEntry.js';
|
|
|
8
8
|
import type { PresenterEntry } from './descriptor/PresenterEntry.js';
|
|
9
9
|
import type { ProviderEntry } from './descriptor/ProviderEntry.js';
|
|
10
10
|
import type { SeedEntry } from './descriptor/SeedEntry.js';
|
|
11
|
+
import type { ExtensionEntry } from './descriptor/ExtensionEntry.js';
|
|
11
12
|
import { DEFAULT_CONVENTIONS } from './Conventions.js';
|
|
12
13
|
import { getPresenterFields } from './prefab/presenter.js';
|
|
13
14
|
import type { OperationContract } from './wire/OperationContract.js';
|
|
@@ -73,6 +74,8 @@ export interface FrondDeclaration {
|
|
|
73
74
|
scope?: string;
|
|
74
75
|
/** What `frond.config.ts` states — the third producer of an operation contract. */
|
|
75
76
|
operationsOverrides?: FrondDescriptor['operationsOverrides'];
|
|
77
|
+
/** What rises with the process serving this frond — the same thing its `extensions/` states. */
|
|
78
|
+
extensions?: (ExtensionEntry['extension'] & { name: string })[];
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
/** State a frond without reading a disk. */
|
|
@@ -176,5 +179,8 @@ export function frond(name: string, declared: FrondDeclaration = {}): FrondDescr
|
|
|
176
179
|
middlewares,
|
|
177
180
|
...(declared.pipes ? { pipes: declared.pipes } : {}),
|
|
178
181
|
...(declared.surfaces ? { surfaces: declared.surfaces } : {}),
|
|
182
|
+
...(declared.extensions
|
|
183
|
+
? { extensions: declared.extensions.map((extension) => ({ name: extension.name, extension, filePath: '' })) }
|
|
184
|
+
: {}),
|
|
179
185
|
};
|
|
180
186
|
}
|
package/src/FrondsStated.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { NameOf } from './NameOf.js';
|
|
2
|
+
import type { FrondDescriptor } from './descriptor/FrondDescriptor.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* What the config says about the fronds this app is made of — where each one comes from, and
|
|
@@ -20,9 +21,10 @@ export type FrondsStated = {
|
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Everything an entry says, or the one string that is the whole of it — an address for a frond
|
|
23
|
-
* that answers elsewhere, the argument for a module key
|
|
24
|
+
* that answers elsewhere, the argument for a module key — or the frond itself, built by the
|
|
25
|
+
* config's own import: `auth: betterAuth({ … })`.
|
|
24
26
|
*/
|
|
25
|
-
export type FrondStated = string | FrondAttributes;
|
|
27
|
+
export type FrondStated = string | FrondAttributes | FrondDescriptor;
|
|
26
28
|
|
|
27
29
|
export interface FrondAttributes {
|
|
28
30
|
/**
|
package/src/StatedFrond.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { statesModule, type FrondAttributes, type FrondStated, type FrondsStated } from './FrondsStated.js';
|
|
2
|
+
import { isFrondDescriptor, type FrondDescriptor } from './descriptor/FrondDescriptor.js';
|
|
2
3
|
|
|
3
4
|
/** One entry of the config, read whole. */
|
|
4
5
|
export interface StatedFrond {
|
|
@@ -10,10 +11,13 @@ export interface StatedFrond {
|
|
|
10
11
|
path: string;
|
|
11
12
|
/** An address for a frond that is elsewhere, an argument for a module. */
|
|
12
13
|
value?: string;
|
|
14
|
+
/** The frond the config built in place, which the host installs like one it scanned. */
|
|
15
|
+
held?: FrondDescriptor;
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
/** What an entry says, whichever of its two forms it was written in. */
|
|
16
19
|
function attributesOf(stated: FrondStated, key: string): FrondAttributes {
|
|
20
|
+
if (isFrondDescriptor(stated)) return {};
|
|
17
21
|
if (typeof stated !== 'string') return stated;
|
|
18
22
|
|
|
19
23
|
return statesModule(key) ? { options: stated } : { remote: stated };
|
|
@@ -41,6 +45,7 @@ export function statedFronds(stated: FrondsStated | undefined): StatedFrond[] {
|
|
|
41
45
|
path: above !== undefined ? `${above}.${key}` : key,
|
|
42
46
|
...(above !== undefined ? { extends: above } : {}),
|
|
43
47
|
...(carries !== undefined ? { value: carries } : {}),
|
|
48
|
+
...(isFrondDescriptor(value) ? { held: value } : {}),
|
|
44
49
|
};
|
|
45
50
|
};
|
|
46
51
|
|
package/src/StatedModules.ts
CHANGED
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
* of your own. Reading one means importing it, which is why this lives on the node entry and
|
|
4
4
|
* never on the one a Worker runs.
|
|
5
5
|
*
|
|
6
|
-
* What a module hands back decides where it goes: a shape stating `up` or `
|
|
6
|
+
* What a module hands back decides where it goes: a shape stating `up`, `down` or `state` is an
|
|
7
7
|
* extension and rises with the app, anything else is a frond and is installed like the rest.
|
|
8
8
|
* The author of a config does not have to know which one their package exports — the same
|
|
9
9
|
* reading `extensions/` already does off a module's form.
|
|
10
|
+
*
|
|
11
|
+
* A frond the config BUILT in place — `auth: betterAuth({ … })` — is handed over the same way,
|
|
12
|
+
* with nothing to import: the config file already did.
|
|
10
13
|
*/
|
|
11
14
|
import type { Extension } from './boot/Extension.js';
|
|
12
15
|
import type { FrondDescriptor } from './descriptor/FrondDescriptor.js';
|
|
16
|
+
import { isExtension } from './descriptor/ExtensionEntry.js';
|
|
13
17
|
import { statesModule, type FrondsStated } from './FrondsStated.js';
|
|
14
18
|
import { statedFronds } from './StatedFrond.js';
|
|
15
19
|
import { getModuleLoader } from './loader.js';
|
|
@@ -21,13 +25,7 @@ function exportedBy(specifier: string): string {
|
|
|
21
25
|
return last.replace(/\.[cm]?[jt]s$/, '');
|
|
22
26
|
}
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
const shape = built as { up?: unknown; down?: unknown } | null;
|
|
26
|
-
|
|
27
|
-
return typeof shape?.up === 'function' || typeof shape?.down === 'function';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** What a config's module keys hand over, sorted by what each one turned out to be. */
|
|
28
|
+
/** What a config hands over as code — its module keys and the fronds it built — sorted by what each one is. */
|
|
31
29
|
export async function statedModules(
|
|
32
30
|
stated: FrondsStated | undefined,
|
|
33
31
|
): Promise<{ fronds: FrondDescriptor[]; extensions: Extension[] }> {
|
|
@@ -36,6 +34,16 @@ export async function statedModules(
|
|
|
36
34
|
const loader = getModuleLoader();
|
|
37
35
|
|
|
38
36
|
for (const entry of statedFronds(stated)) {
|
|
37
|
+
if (entry.held) {
|
|
38
|
+
if (entry.held.name !== entry.key) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Fougere config: the entry '${entry.path}' holds the frond '${entry.held.name}'. `
|
|
41
|
+
+ `Name the entry '${entry.held.name}' — the key is how \`only:\` and an address find it.`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
fronds.push(entry.held);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
39
47
|
if (!statesModule(entry.key)) continue;
|
|
40
48
|
|
|
41
49
|
const module = await loader(entry.key) as Record<string, unknown>;
|
|
@@ -50,7 +58,7 @@ export async function statedModules(
|
|
|
50
58
|
}
|
|
51
59
|
|
|
52
60
|
const built = (factory as (argument?: unknown) => unknown)(entry.value);
|
|
53
|
-
if (
|
|
61
|
+
if (isExtension(built)) extensions.push(built as Extension);
|
|
54
62
|
else fronds.push(built as FrondDescriptor);
|
|
55
63
|
}
|
|
56
64
|
|
package/src/boot/AppLifecycle.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { App } from './App.js';
|
|
2
2
|
import type { Extension } from './Extension.js';
|
|
3
|
+
import { StateShape } from '../wire/StateShape.js';
|
|
3
4
|
|
|
4
5
|
/** Runs application extensions up in order and down in reverse order. */
|
|
5
6
|
export class AppLifecycle {
|
|
@@ -20,6 +21,11 @@ export class AppLifecycle {
|
|
|
20
21
|
return this.members.map((extension) => extension.name);
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
/** Read off the members that stay, so an extension replaced by name declares nothing. */
|
|
25
|
+
state(): StateShape {
|
|
26
|
+
return StateShape.of(this.members);
|
|
27
|
+
}
|
|
28
|
+
|
|
23
29
|
async up(app: App): Promise<void> {
|
|
24
30
|
for (const extension of this.members) await extension.up?.(app);
|
|
25
31
|
}
|
package/src/boot/Extension.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { App } from './App.js';
|
|
2
|
+
import type { Field } from '@fougere/schema';
|
|
2
3
|
import type { FrondDescriptor } from '../descriptor/FrondDescriptor.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -15,6 +16,11 @@ export interface Extension {
|
|
|
15
16
|
* signature is the only way to ask for one.
|
|
16
17
|
*/
|
|
17
18
|
fronds?: readonly FrondDescriptor[];
|
|
19
|
+
/**
|
|
20
|
+
* The members it puts on a call's `state` — `{ user: json(User) }`. A member nobody declares
|
|
21
|
+
* is refused at the facade, and one declared twice refuses the boot.
|
|
22
|
+
*/
|
|
23
|
+
state?: Readonly<Record<string, Field>>;
|
|
18
24
|
up?(app: App): void | Promise<void>;
|
|
19
25
|
down?(app: App): void | Promise<void>;
|
|
20
26
|
}
|