@exponential_app/engine 0.0.0-stage → 0.1.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 +201 -0
- package/NOTICE +54 -0
- package/README.md +35 -2
- package/dist/capabilities.js +29 -0
- package/dist/capabilities.js.map +9 -0
- package/dist/chunks/index-4ntgtkmb.js +6783 -0
- package/dist/chunks/index-4ntgtkmb.js.map +13 -0
- package/dist/chunks/index-ans80t68.js +382 -0
- package/dist/chunks/index-ans80t68.js.map +9 -0
- package/dist/chunks/index-ax4aay30.js +315 -0
- package/dist/chunks/index-ax4aay30.js.map +10 -0
- package/dist/chunks/index-e49v2qpf.js +2177 -0
- package/dist/chunks/index-e49v2qpf.js.map +9 -0
- package/dist/chunks/index-m2845dn6.js +72 -0
- package/dist/chunks/index-m2845dn6.js.map +10 -0
- package/dist/chunks/index-md3hz6r2.js +3015 -0
- package/dist/chunks/index-md3hz6r2.js.map +19 -0
- package/dist/chunks/index-n0acffvs.js +366 -0
- package/dist/chunks/index-n0acffvs.js.map +10 -0
- package/dist/chunks/index-nrr8x2kq.js +259 -0
- package/dist/chunks/index-nrr8x2kq.js.map +10 -0
- package/dist/chunks/index-s3xjr701.js +170 -0
- package/dist/chunks/index-s3xjr701.js.map +10 -0
- package/dist/chunks/index-t89cvabm.js +2301 -0
- package/dist/chunks/index-t89cvabm.js.map +10 -0
- package/dist/chunks/index-zw0575tv.js +126 -0
- package/dist/chunks/index-zw0575tv.js.map +10 -0
- package/dist/consent.js +24 -0
- package/dist/consent.js.map +9 -0
- package/dist/index.js +526 -0
- package/dist/index.js.map +11 -0
- package/dist/lifecycle.js +11 -0
- package/dist/lifecycle.js.map +9 -0
- package/dist/outbox.js +27 -0
- package/dist/outbox.js.map +9 -0
- package/dist/pdf.js +15 -0
- package/dist/pdf.js.map +9 -0
- package/dist/providers.js +26 -0
- package/dist/providers.js.map +9 -0
- package/dist/runner.js +24 -0
- package/dist/runner.js.map +9 -0
- package/dist/tools.js +38 -0
- package/dist/tools.js.map +9 -0
- package/dist/types/domain-contract/src/app-records.d.ts +3148 -0
- package/dist/types/domain-contract/src/app-share.d.ts +222 -0
- package/dist/types/domain-contract/src/apps.d.ts +594 -0
- package/dist/types/eengine/fixtures/providers.json +55 -0
- package/dist/types/eengine/src/broker.d.ts +80 -0
- package/dist/types/eengine/src/capabilities.d.ts +86 -0
- package/dist/types/eengine/src/consent.d.ts +50 -0
- package/dist/types/eengine/src/index.d.ts +11 -0
- package/dist/types/eengine/src/instance.d.ts +122 -0
- package/dist/types/eengine/src/lifecycle.d.ts +64 -0
- package/dist/types/eengine/src/outbox.d.ts +3 -0
- package/dist/types/eengine/src/pdf.d.ts +36 -0
- package/dist/types/eengine/src/providers.d.ts +38 -0
- package/dist/types/eengine/src/runner.d.ts +82 -0
- package/dist/types/eengine/src/stores.d.ts +125 -0
- package/dist/types/eengine/src/tools.d.ts +79 -0
- package/dist/types/eengine/src/web/index.d.ts +20 -0
- package/dist/types/eengine/src/web/mcp.d.ts +27 -0
- package/dist/types/eengine/src/web/platform.d.ts +91 -0
- package/dist/types/eengine/src/web/stores.d.ts +125 -0
- package/dist/types/emcp/fixtures/automations.json +521 -0
- package/dist/types/emcp/fixtures/hub.json +498 -0
- package/dist/types/emcp/src/access.d.ts +55 -0
- package/dist/types/emcp/src/audit.d.ts +22 -0
- package/dist/types/emcp/src/automations.d.ts +111 -0
- package/dist/types/emcp/src/exposes.d.ts +242 -0
- package/dist/types/emcp/src/hub.d.ts +63 -0
- package/dist/types/emcp/src/index.d.ts +7 -0
- package/dist/types/emcp/src/pure.d.ts +11 -0
- package/dist/types/emcp/src/upstream.d.ts +288 -0
- package/dist/types/emcp/src/vault.d.ts +34 -0
- package/dist/web/index.js +791 -0
- package/dist/web/index.js.map +13 -0
- package/fixtures/bundle.json +1165 -0
- package/fixtures/capabilities.json +373 -0
- package/fixtures/consent.json +146 -0
- package/fixtures/lifecycle.json +125 -0
- package/fixtures/outbox.json +8 -0
- package/fixtures/providers.json +55 -0
- package/fixtures/runner.json +2167 -0
- package/package.json +92 -4
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// packages/eengine/src/lifecycle.ts
|
|
2
|
+
import { crossAppTarget, resolveScreen } from "@exponential_app/eui/host";
|
|
3
|
+
var STOPPED2 = { phase: `stopped`, screen: null, params: null };
|
|
4
|
+
function plainTarget(cx) {
|
|
5
|
+
const last = cx.lastScreen;
|
|
6
|
+
const resolved = resolveScreen(cx.pkg, last?.screen ?? null, last?.params ?? null);
|
|
7
|
+
return resolved ? { screen: resolved.screen, params: resolved.params } : null;
|
|
8
|
+
}
|
|
9
|
+
function linkTarget(event, cx) {
|
|
10
|
+
if (event.type === `deepLink`)
|
|
11
|
+
return crossAppTarget(cx.pkg, event.screen ?? null, event.params ?? null);
|
|
12
|
+
if (event.type === `notificationTap`) {
|
|
13
|
+
if (event.app !== cx.pkg.id)
|
|
14
|
+
return { error: `otherApp` };
|
|
15
|
+
const resolved = resolveScreen(cx.pkg, event.screen ?? null, event.params ?? null);
|
|
16
|
+
return resolved ? { screen: resolved.screen, params: resolved.params } : { error: `no such screen` };
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
var ignored = (state) => ({ state, effects: [] });
|
|
21
|
+
function coldLaunch(target, effects) {
|
|
22
|
+
effects.push({ effect: `automations`, on: true });
|
|
23
|
+
if (target)
|
|
24
|
+
effects.push({ effect: `open`, screen: target.screen, params: target.params });
|
|
25
|
+
effects.push({ effect: `sources`, live: true }, { effect: `flush` });
|
|
26
|
+
return { state: { phase: `foreground`, screen: target?.screen ?? null, params: target?.params ?? null }, effects };
|
|
27
|
+
}
|
|
28
|
+
function lifecycleStep2(state, event, cx) {
|
|
29
|
+
const running = state.phase !== `stopped`;
|
|
30
|
+
const persist = () => state.screen !== null ? [{ effect: `persist`, screen: state.screen, params: { ...state.params ?? {} } }] : [];
|
|
31
|
+
switch (event.type) {
|
|
32
|
+
case `launch`:
|
|
33
|
+
return running ? ignored(state) : coldLaunch(plainTarget(cx), []);
|
|
34
|
+
case `foreground`:
|
|
35
|
+
if (state.phase !== `background`)
|
|
36
|
+
return ignored(state);
|
|
37
|
+
return { state: { ...state, phase: `foreground` }, effects: [{ effect: `sources`, live: true }, { effect: `flush` }] };
|
|
38
|
+
case `background`:
|
|
39
|
+
if (state.phase !== `foreground`)
|
|
40
|
+
return ignored(state);
|
|
41
|
+
return { state: { ...state, phase: `background` }, effects: [...persist(), { effect: `sources`, live: false }] };
|
|
42
|
+
case `terminate`:
|
|
43
|
+
if (!running)
|
|
44
|
+
return ignored(state);
|
|
45
|
+
return {
|
|
46
|
+
state: STOPPED2,
|
|
47
|
+
effects: [...persist(), ...state.phase === `foreground` ? [{ effect: `sources`, live: false }] : [], { effect: `automations`, on: false }]
|
|
48
|
+
};
|
|
49
|
+
case `online`:
|
|
50
|
+
return state.phase === `foreground` ? { state, effects: [{ effect: `flush` }] } : ignored(state);
|
|
51
|
+
case `deepLink`:
|
|
52
|
+
case `notificationTap`: {
|
|
53
|
+
const target = linkTarget(event, cx);
|
|
54
|
+
if (!target)
|
|
55
|
+
return ignored(state);
|
|
56
|
+
if (`error` in target) {
|
|
57
|
+
const refused = { effect: `refused`, reason: target.error };
|
|
58
|
+
return running ? { state, effects: [refused] } : coldLaunch(plainTarget(cx), [refused]);
|
|
59
|
+
}
|
|
60
|
+
if (!running)
|
|
61
|
+
return coldLaunch(target, []);
|
|
62
|
+
const open = { effect: `open`, screen: target.screen, params: target.params };
|
|
63
|
+
const next = { phase: `foreground`, screen: target.screen, params: target.params };
|
|
64
|
+
return { state: next, effects: state.phase === `background` ? [open, { effect: `sources`, live: true }, { effect: `flush` }] : [open] };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { STOPPED2, lifecycleStep2 };
|
|
70
|
+
|
|
71
|
+
//# debugId=4332753BE68640A864756E2164756E21
|
|
72
|
+
//# sourceMappingURL=index-m2845dn6.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/eengine/src/lifecycle.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// VAPP-260: an app instance's lifecycle as one pure reducer. Locked by\n// `fixtures/lifecycle.json`; screens resolve through genUI's host\n// (`resolveScreen` for the app's own taps, `crossAppTarget` for links from outside).\n\nimport { crossAppTarget, resolveScreen } from \"@exponential_app/eui/host\"\n\nexport type LifecyclePhase = `stopped` | `foreground` | `background`\n\nexport interface LifecycleState {\n phase: LifecyclePhase\n screen: string | null\n params: Record<string, string> | null\n}\n\nexport type LifecycleEvent =\n | { type: `launch` }\n | { type: `foreground` }\n | { type: `background` }\n | { type: `terminate` }\n | { type: `online` }\n | { type: `deepLink`; screen?: string | null; params?: Record<string, unknown> | null }\n | { type: `notificationTap`; app: string; screen?: string | null; params?: Record<string, unknown> | null }\n\nexport type LifecycleEffect =\n | { effect: `open`; screen: string; params: Record<string, string> }\n | { effect: `flush` }\n | { effect: `sources`; live: boolean }\n | { effect: `automations`; on: boolean }\n | { effect: `persist`; screen: string; params: Record<string, string> }\n | { effect: `refused`; reason: string }\n\nexport interface LifecyclePackage {\n id: string\n screens?: unknown\n}\n\nexport interface LifecycleContext {\n pkg: LifecyclePackage\n /** The screen the instance persisted last (null = none). */\n lastScreen: { screen: string; params: Record<string, unknown> } | null\n}\n\nexport const STOPPED: LifecycleState = { phase: `stopped`, screen: null, params: null }\n\ntype Target = { screen: string; params: Record<string, string> }\n\n/** The screen a plain launch opens: the persisted one if the package still has it, else the first navigation screen. */\nfunction plainTarget(cx: LifecycleContext): Target | null {\n const last = cx.lastScreen\n const resolved = resolveScreen(cx.pkg, last?.screen ?? null, last?.params ?? null)\n return resolved ? { screen: resolved.screen, params: resolved.params } : null\n}\n\n/** Where a link or tap goes, or why it is refused. */\nfunction linkTarget(event: LifecycleEvent, cx: LifecycleContext): Target | { error: string } | null {\n if (event.type === `deepLink`) return crossAppTarget(cx.pkg, event.screen ?? null, event.params ?? null)\n if (event.type === `notificationTap`) {\n if (event.app !== cx.pkg.id) return { error: `otherApp` }\n const resolved = resolveScreen(cx.pkg, event.screen ?? null, event.params ?? null)\n return resolved ? { screen: resolved.screen, params: resolved.params } : { error: `no such screen` }\n }\n return null\n}\n\nconst ignored = (state: LifecycleState) => ({ state, effects: [] as LifecycleEffect[] })\n\nfunction coldLaunch(target: Target | null, effects: LifecycleEffect[]): { state: LifecycleState; effects: LifecycleEffect[] } {\n effects.push({ effect: `automations`, on: true })\n if (target) effects.push({ effect: `open`, screen: target.screen, params: target.params })\n effects.push({ effect: `sources`, live: true }, { effect: `flush` })\n return { state: { phase: `foreground`, screen: target?.screen ?? null, params: target?.params ?? null }, effects }\n}\n\n/** One lifecycle event → the next state and its effects, in order. */\nexport function lifecycleStep(state: LifecycleState, event: LifecycleEvent, cx: LifecycleContext): { state: LifecycleState; effects: LifecycleEffect[] } {\n const running = state.phase !== `stopped`\n const persist = (): LifecycleEffect[] => (state.screen !== null ? [{ effect: `persist`, screen: state.screen, params: { ...(state.params ?? {}) } }] : [])\n switch (event.type) {\n case `launch`:\n return running ? ignored(state) : coldLaunch(plainTarget(cx), [])\n case `foreground`:\n if (state.phase !== `background`) return ignored(state)\n return { state: { ...state, phase: `foreground` }, effects: [{ effect: `sources`, live: true }, { effect: `flush` }] }\n case `background`:\n if (state.phase !== `foreground`) return ignored(state)\n return { state: { ...state, phase: `background` }, effects: [...persist(), { effect: `sources`, live: false }] }\n case `terminate`:\n if (!running) return ignored(state)\n return {\n state: STOPPED,\n effects: [...persist(), ...(state.phase === `foreground` ? [{ effect: `sources`, live: false } as LifecycleEffect] : []), { effect: `automations`, on: false }],\n }\n case `online`:\n return state.phase === `foreground` ? { state, effects: [{ effect: `flush` }] } : ignored(state)\n case `deepLink`:\n case `notificationTap`: {\n const target = linkTarget(event, cx)\n if (!target) return ignored(state)\n if (`error` in target) {\n const refused: LifecycleEffect = { effect: `refused`, reason: target.error }\n return running ? { state, effects: [refused] } : coldLaunch(plainTarget(cx), [refused])\n }\n if (!running) return coldLaunch(target, [])\n const open: LifecycleEffect = { effect: `open`, screen: target.screen, params: target.params }\n const next: LifecycleState = { phase: `foreground`, screen: target.screen, params: target.params }\n return { state: next, effects: state.phase === `background` ? [open, { effect: `sources`, live: true }, { effect: `flush` }] : [open] }\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "4332753BE68640A864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|