@hozu/runtime-server 0.10.0 → 0.12.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/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js.map +1 -1
- package/dist/bus.d.ts +31 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +73 -0
- package/dist/bus.js.map +1 -0
- package/dist/cache.d.ts +7 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +10 -12
- package/dist/cache.js.map +1 -1
- package/dist/compile.d.ts +43 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +170 -0
- package/dist/compile.js.map +1 -0
- package/dist/components.d.ts +2 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +13 -0
- package/dist/components.js.map +1 -1
- package/dist/fn-modules.d.ts +22 -0
- package/dist/fn-modules.d.ts.map +1 -0
- package/dist/fn-modules.js +127 -0
- package/dist/fn-modules.js.map +1 -0
- package/dist/forms.d.ts +2 -0
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +5 -0
- package/dist/forms.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +7 -1
- package/dist/generate.js.map +1 -1
- package/dist/handler.d.ts +20 -1
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js +82 -22
- package/dist/handler.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +18 -4
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +70 -19
- package/dist/render.js.map +1 -1
- package/dist/static.d.ts +2 -2
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +6 -4
- package/dist/static.js.map +1 -1
- package/package.json +6 -6
package/dist/app.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DevOptions } from '@hozu/core/ir';
|
|
2
2
|
import { type BuildResult, type ImageSet, type Manifest } from '@hozu/core/ir';
|
|
3
|
+
import { type FetchLoader } from '@hozu/data';
|
|
3
4
|
import type { HandlerOptions } from './handler.ts';
|
|
4
5
|
import type { ComponentBundle, Stylesheet } from './render.ts';
|
|
5
6
|
import type { RenderModule } from './rendered.ts';
|
|
@@ -21,6 +22,7 @@ export interface AppHost {
|
|
|
21
22
|
readFile?: (file: string) => Promise<Uint8Array>;
|
|
22
23
|
session?: SessionStore;
|
|
23
24
|
dev?: DevOptions;
|
|
25
|
+
fetches?: FetchLoader;
|
|
24
26
|
}
|
|
25
27
|
export declare const app: (options: AppOptions) => App;
|
|
26
28
|
export declare const appOptionsOf: (value: unknown) => AppOptions | null;
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAgB,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAgB,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5F,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,QAAA,MAAM,GAAG,eAAyB,CAAA;AAElC,MAAM,WAAW,UACf,SAAQ,IAAI,CACV,cAAc,EACd,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAC1F;IACD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;CAC9D;AAED,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,CAAA;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IAChD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAED,eAAO,MAAM,GAAG,YAAa,UAAU,KAAG,GAAwC,CAAA;AAElF,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,UAAU,GAAG,IACkC,CAAA;AAE7F,eAAO,MAAM,YAAY,MAAO,GAAG,KAAG,OAAkD,CAAA;AAExF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,GAAE,OAAY,GAAG,cAAc,CAO5E"}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,YAAY,EAAgC,MAAM,eAAe,CAAA;AAC5F,OAAO,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,YAAY,EAAgC,MAAM,eAAe,CAAA;AAC5F,OAAO,EAAoB,aAAa,EAAE,MAAM,YAAY,CAAA;AAM5D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AA2BlC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAmB,EAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AAElF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAqB,EAAE,CAChE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,KAAsB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAM,EAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAA;AAExF,MAAM,UAAU,iBAAiB,CAAC,CAAM,EAAE,IAAI,GAAY,EAAE;IAC1D,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;QAC1C,OAAO,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS;QAC/B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAA;AACvC,CAAC"}
|
package/dist/bus.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carries invalidated tags between the instances of one app (ADR 0050 B). Tags, never data: an instance that
|
|
3
|
+
* receives tags drops its own pages and entries and pushes to its own live clients. Delivery is at least once and
|
|
4
|
+
* unordered; dropping a tag twice is harmless.
|
|
5
|
+
*/
|
|
6
|
+
export interface InvalidationBus {
|
|
7
|
+
publish(tags: string[]): void | Promise<void>;
|
|
8
|
+
subscribe(onTags: (tags: string[]) => void): () => void;
|
|
9
|
+
/** For a transport that receives over the app's own HTTP: answers `POST /_hozu/invalidate`. */
|
|
10
|
+
accept?(request: Request): Promise<Response>;
|
|
11
|
+
}
|
|
12
|
+
/** One process: nothing to tell. */
|
|
13
|
+
export declare function localBus(): InvalidationBus;
|
|
14
|
+
export interface HttpBusOptions {
|
|
15
|
+
/** The base URL of every instance, including this one and the app's base path: `http://10.0.0.2:3000`. */
|
|
16
|
+
peers: string[];
|
|
17
|
+
/** Shared by every instance; at least 32 characters. */
|
|
18
|
+
secret: string;
|
|
19
|
+
/** Reports a peer that stayed unreachable after the retries. */
|
|
20
|
+
onError?: (error: unknown, peer: string) => void;
|
|
21
|
+
/** Delays between attempts, in milliseconds. */
|
|
22
|
+
retries?: number[];
|
|
23
|
+
fetch?: typeof fetch;
|
|
24
|
+
now?: () => number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Signed `POST /_hozu/invalidate` to every peer (HMAC-SHA256 over the body, which carries a timestamp; messages
|
|
28
|
+
* older than 30 s or from the future are refused). Zero dependencies: Web Crypto and `fetch`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function httpBus({ peers, secret, onError, retries, fetch: send, now, }: HttpBusOptions): InvalidationBus;
|
|
31
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACvD,+FAA+F;IAC/F,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC7C;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,IAAI,eAAe,CAE1C;AAED,MAAM,WAAW,cAAc;IAC7B,0GAA0G;IAC1G,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAQD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,MAAM,EACN,OAAiF,EACjF,OAAsB,EACtB,KAAK,EAAE,IAAY,EACnB,GAAc,GACf,EAAE,cAAc,GAAG,eAAe,CA2DlC"}
|
package/dist/bus.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** One process: nothing to tell. */
|
|
2
|
+
export function localBus() {
|
|
3
|
+
return { publish: () => { }, subscribe: () => () => { } };
|
|
4
|
+
}
|
|
5
|
+
const WINDOW_MS = 30_000;
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
const hex = (bytes) => [...new Uint8Array(bytes)].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
8
|
+
/**
|
|
9
|
+
* Signed `POST /_hozu/invalidate` to every peer (HMAC-SHA256 over the body, which carries a timestamp; messages
|
|
10
|
+
* older than 30 s or from the future are refused). Zero dependencies: Web Crypto and `fetch`.
|
|
11
|
+
*/
|
|
12
|
+
export function httpBus({ peers, secret, onError = (error, peer) => console.error('[hozu] invalidation bus:', peer, error), retries = [100, 1_000], fetch: send = fetch, now = Date.now, }) {
|
|
13
|
+
if (secret.length < 32)
|
|
14
|
+
throw new Error('httpBus needs a secret of at least 32 characters');
|
|
15
|
+
const id = crypto.randomUUID();
|
|
16
|
+
const key = crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);
|
|
17
|
+
const sign = async (body) => hex(await crypto.subtle.sign('HMAC', await key, encoder.encode(body)));
|
|
18
|
+
const listeners = new Set();
|
|
19
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
20
|
+
async function deliver(peer, body, signature) {
|
|
21
|
+
const url = `${peer.replace(/\/$/, '')}/_hozu/invalidate`;
|
|
22
|
+
for (let attempt = 0;; attempt++) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await send(url, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'content-type': 'application/json', 'x-hozu-signature': signature },
|
|
27
|
+
body,
|
|
28
|
+
});
|
|
29
|
+
if (response.ok)
|
|
30
|
+
return;
|
|
31
|
+
throw new Error(`${url} answered ${response.status}`);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const delay = retries[attempt];
|
|
35
|
+
if (delay === undefined)
|
|
36
|
+
return onError(error, peer);
|
|
37
|
+
await wait(delay);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
async publish(tags) {
|
|
43
|
+
if (!tags.length)
|
|
44
|
+
return;
|
|
45
|
+
const body = JSON.stringify({ tags, at: now(), from: id });
|
|
46
|
+
const signature = await sign(body);
|
|
47
|
+
await Promise.all(peers.map((peer) => deliver(peer, body, signature)));
|
|
48
|
+
},
|
|
49
|
+
subscribe(onTags) {
|
|
50
|
+
listeners.add(onTags);
|
|
51
|
+
return () => listeners.delete(onTags);
|
|
52
|
+
},
|
|
53
|
+
async accept(request) {
|
|
54
|
+
if (request.method !== 'POST')
|
|
55
|
+
return new Response(null, { status: 405, headers: { allow: 'POST' } });
|
|
56
|
+
const body = await request.text();
|
|
57
|
+
const signature = request.headers.get('x-hozu-signature') ?? '';
|
|
58
|
+
const given = new Uint8Array(signature.match(/../g)?.map((b) => Number.parseInt(b, 16)) ?? []);
|
|
59
|
+
const valid = /^[0-9a-f]{64}$/.test(signature) &&
|
|
60
|
+
(await crypto.subtle.verify('HMAC', await key, given, encoder.encode(body)));
|
|
61
|
+
if (!valid)
|
|
62
|
+
return new Response('Invalid signature', { status: 403 });
|
|
63
|
+
const message = JSON.parse(body);
|
|
64
|
+
if (Math.abs(now() - message.at) > WINDOW_MS)
|
|
65
|
+
return new Response('Expired message', { status: 403 });
|
|
66
|
+
if (message.from !== id)
|
|
67
|
+
for (const listener of listeners)
|
|
68
|
+
listener(message.tags);
|
|
69
|
+
return new Response(null, { status: 204 });
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=bus.js.map
|
package/dist/bus.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
CHANGED
|
@@ -10,6 +10,12 @@ export interface PageCache {
|
|
|
10
10
|
get(key: string): Promise<CachedPage | undefined>;
|
|
11
11
|
set(key: string, page: CachedPage): Promise<void>;
|
|
12
12
|
deleteTags(tags: string[]): Promise<number>;
|
|
13
|
+
/** Pages now cached and pages dropped to stay within a bound, for `server.stats()`; optional. */
|
|
14
|
+
readonly size?: number;
|
|
15
|
+
readonly evictions?: number;
|
|
13
16
|
}
|
|
14
|
-
|
|
17
|
+
/** The default page cache: at most `maxPages` pages, least recently used first out (ADR 0050 D1). */
|
|
18
|
+
export declare function memoryCache({ maxPages }?: {
|
|
19
|
+
maxPages?: number;
|
|
20
|
+
}): PageCache;
|
|
15
21
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,iGAAiG;IACjG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,EAAE,QAAgB,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,SAAS,CAavF"}
|
package/dist/cache.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { Lru } from '@hozu/data';
|
|
2
|
+
/** The default page cache: at most `maxPages` pages, least recently used first out (ADR 0050 D1). */
|
|
3
|
+
export function memoryCache({ maxPages = 5_000 } = {}) {
|
|
4
|
+
const pages = new Lru(maxPages);
|
|
3
5
|
return {
|
|
4
6
|
get: async (key) => pages.get(key),
|
|
5
|
-
set: async (key, page) =>
|
|
6
|
-
|
|
7
|
+
set: async (key, page) => pages.set(key, page, page.tags),
|
|
8
|
+
deleteTags: async (tags) => pages.deleteTags(tags),
|
|
9
|
+
get size() {
|
|
10
|
+
return pages.size;
|
|
7
11
|
},
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
for (const [key, page] of pages)
|
|
11
|
-
if (tags.some((t) => page.tags.includes(t))) {
|
|
12
|
-
pages.delete(key);
|
|
13
|
-
count++;
|
|
14
|
-
}
|
|
15
|
-
return count;
|
|
12
|
+
get evictions() {
|
|
13
|
+
return pages.evictions;
|
|
16
14
|
},
|
|
17
15
|
};
|
|
18
16
|
}
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAoBhC,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAA0B,EAAE;IAC1E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAa,QAAQ,CAAC,CAAA;IAC3C,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAClC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;QACzD,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAClD,IAAI,IAAI;YACN,OAAO,KAAK,CAAC,IAAI,CAAA;QACnB,CAAC;QACD,IAAI,SAAS;YACX,OAAO,KAAK,CAAC,SAAS,CAAA;QACxB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type FeatureIR, type Json, type ValueExpr, type ViewNode, type WidgetIR } from '@tenon/core/ir';
|
|
2
|
+
import { type Fns, type Getter } from '@tenon/machine';
|
|
3
|
+
import { text } from '@tenon/runtime-client';
|
|
4
|
+
export interface Scope {
|
|
5
|
+
feature: FeatureIR;
|
|
6
|
+
context: Json;
|
|
7
|
+
state: string | null;
|
|
8
|
+
bindings: Json[];
|
|
9
|
+
params: Json;
|
|
10
|
+
search: Json;
|
|
11
|
+
routes: Record<string, string>;
|
|
12
|
+
url: string;
|
|
13
|
+
locale: string;
|
|
14
|
+
alternate: Record<string, string>;
|
|
15
|
+
env: Json;
|
|
16
|
+
}
|
|
17
|
+
export interface Runtime {
|
|
18
|
+
open(n: ViewNode, scope: Scope): string;
|
|
19
|
+
embed(view: string): {
|
|
20
|
+
root: ViewNode;
|
|
21
|
+
scope: Scope;
|
|
22
|
+
} | null;
|
|
23
|
+
widget(ref: string): void;
|
|
24
|
+
}
|
|
25
|
+
export interface Compile {
|
|
26
|
+
islands: Set<string>;
|
|
27
|
+
fns: Fns;
|
|
28
|
+
widgets: Record<string, WidgetIR>;
|
|
29
|
+
}
|
|
30
|
+
export type Frag = string | ((scope: Scope, r: Runtime) => string);
|
|
31
|
+
export declare const SEP = "<!---->";
|
|
32
|
+
export declare const OPEN = "<!--[-->";
|
|
33
|
+
export declare const CLOSE = "<!--]-->";
|
|
34
|
+
export { text };
|
|
35
|
+
export declare const expr: (v: ValueExpr, fns: Fns) => Getter;
|
|
36
|
+
type El = Pick<Extract<ViewNode, {
|
|
37
|
+
kind: 'el';
|
|
38
|
+
}>, 'class' | 'toggle' | 'vars'>;
|
|
39
|
+
export declare function classAndStyle(n: El, value: (v: ValueExpr) => Json): string;
|
|
40
|
+
export declare const run: (f: Frag, s: Scope, r: Runtime) => string;
|
|
41
|
+
export declare const separated: (list: ViewNode[], i: number) => boolean;
|
|
42
|
+
export declare function compileNode(n: ViewNode, island: boolean, c: Compile, sep?: boolean): Frag;
|
|
43
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAGd,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAA8B,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAClF,OAAO,EAAkC,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAG5E,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,IAAI,EAAE,CAAA;IAChB,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,GAAG,EAAE,IAAI,CAAA;CACV;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAClC;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,CAAA;AAIlE,eAAO,MAAM,GAAG,YAAY,CAAA;AAC5B,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,KAAK,aAAa,CAAA;AAE/B,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,MAAO,SAAS,OAAO,GAAG,KAAG,MAA8B,CAAA;AAO5E,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAA;AAK9E,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,CAO1E;AAkCD,eAAO,MAAM,GAAG,MAAO,IAAI,KAAK,KAAK,KAAK,OAAO,WAA0C,CAAA;AAE3F,eAAO,MAAM,SAAS,SAAU,QAAQ,EAAE,KAAK,MAAM,YAAiC,CAAA;AAEtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,UAAQ,GAAG,IAAI,CAqGvF"}
|
package/dist/compile.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { FORM_FIELD, formRunnable, voidTags, } from '@tenon/core/ir';
|
|
2
|
+
import { compileGuard, compileValue } from '@tenon/machine';
|
|
3
|
+
import { attrText, classText, styleText, text } from '@tenon/runtime-client';
|
|
4
|
+
import { escapeHtml } from './escape.js';
|
|
5
|
+
const voids = new Set(voidTags);
|
|
6
|
+
export const SEP = '<!---->';
|
|
7
|
+
export const OPEN = '<!--[-->';
|
|
8
|
+
export const CLOSE = '<!--]-->';
|
|
9
|
+
export { text };
|
|
10
|
+
export const expr = (v, fns) => compileValue(v, fns);
|
|
11
|
+
const attr = (name, x) => {
|
|
12
|
+
const s = attrText(name, x);
|
|
13
|
+
return s === null ? '' : s === '' ? ` ${name}` : ` ${name}="${escapeHtml(s)}"`;
|
|
14
|
+
};
|
|
15
|
+
const classAttr = (c) => (c ? ` class="${escapeHtml(c)}"` : '');
|
|
16
|
+
const styleAttr = (s) => (s ? ` style="${escapeHtml(s)}"` : '');
|
|
17
|
+
export function classAndStyle(n, value) {
|
|
18
|
+
const active = [];
|
|
19
|
+
for (const c in n.toggle)
|
|
20
|
+
if (value(n.toggle[c]) === true)
|
|
21
|
+
active.push(c);
|
|
22
|
+
return (classAttr(classText(n.class, active)) +
|
|
23
|
+
styleAttr(styleText(Object.entries(n.vars).map(([k, v]) => [k, value(v)]))));
|
|
24
|
+
}
|
|
25
|
+
function classAndStyleFrag(n, fns) {
|
|
26
|
+
const toggles = Object.entries(n.toggle).map(([c, v]) => [c, expr(v, fns)]);
|
|
27
|
+
const vars = Object.entries(n.vars).map(([k, v]) => [k, expr(v, fns)]);
|
|
28
|
+
const base = n.class;
|
|
29
|
+
const cls = toggles.length
|
|
30
|
+
? (s) => {
|
|
31
|
+
const active = [];
|
|
32
|
+
for (const [c, get] of toggles)
|
|
33
|
+
if (get(s) === true)
|
|
34
|
+
active.push(c);
|
|
35
|
+
return classAttr(classText(base, active));
|
|
36
|
+
}
|
|
37
|
+
: classAttr(base ?? '');
|
|
38
|
+
const style = vars.length ? (s) => styleAttr(styleText(vars.map(([k, get]) => [k, get(s)]))) : '';
|
|
39
|
+
return seq([cls, style]);
|
|
40
|
+
}
|
|
41
|
+
function seq(parts) {
|
|
42
|
+
const merged = [];
|
|
43
|
+
for (const p of parts) {
|
|
44
|
+
const last = merged.at(-1);
|
|
45
|
+
if (typeof p === 'string' && typeof last === 'string')
|
|
46
|
+
merged[merged.length - 1] = last + p;
|
|
47
|
+
else if (p !== '')
|
|
48
|
+
merged.push(p);
|
|
49
|
+
}
|
|
50
|
+
if (merged.length === 0)
|
|
51
|
+
return '';
|
|
52
|
+
if (merged.length === 1)
|
|
53
|
+
return merged[0];
|
|
54
|
+
const list = merged;
|
|
55
|
+
return (s, r) => {
|
|
56
|
+
let out = '';
|
|
57
|
+
for (const p of list)
|
|
58
|
+
out += typeof p === 'string' ? p : p(s, r);
|
|
59
|
+
return out;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export const run = (f, s, r) => (typeof f === 'string' ? f : f(s, r));
|
|
63
|
+
export const separated = (list, i) => list[i + 1]?.kind === 'text';
|
|
64
|
+
export function compileNode(n, island, c, sep = false) {
|
|
65
|
+
const { fns } = c;
|
|
66
|
+
const children = (list) => list.map((x, i) => compileNode(x, island, c, separated(list, i)));
|
|
67
|
+
if (!island && c.islands.has(n.id)) {
|
|
68
|
+
const inner = compileNode(n, true, c, sep);
|
|
69
|
+
return (s, r) => r.open(n, s) + run(inner, s, r);
|
|
70
|
+
}
|
|
71
|
+
const wrap = (body) => (island ? seq([OPEN, body, CLOSE]) : body);
|
|
72
|
+
switch (n.kind) {
|
|
73
|
+
case 'text': {
|
|
74
|
+
const tail = island && sep ? SEP : '';
|
|
75
|
+
if ('literal' in n.value)
|
|
76
|
+
return escapeHtml(text(n.value.literal)) + tail;
|
|
77
|
+
const get = expr(n.value, fns);
|
|
78
|
+
return (s) => escapeHtml(text(get(s))) + tail;
|
|
79
|
+
}
|
|
80
|
+
case 'el': {
|
|
81
|
+
const parts = [`<${n.tag}`, classAndStyleFrag(n, fns)];
|
|
82
|
+
let content = null;
|
|
83
|
+
for (const [name, v] of Object.entries(n.attrs)) {
|
|
84
|
+
if (n.tag === 'textarea' && name === 'value') {
|
|
85
|
+
const get = expr(v, fns);
|
|
86
|
+
content = 'literal' in v ? escapeHtml(text(v.literal)) : (s) => escapeHtml(text(get(s)));
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if ('literal' in v) {
|
|
90
|
+
parts.push(attr(name, v.literal));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const get = expr(v, fns);
|
|
94
|
+
parts.push((s) => attr(name, get(s)));
|
|
95
|
+
}
|
|
96
|
+
const submit = n.tag === 'form' ? n.on.submit : undefined;
|
|
97
|
+
if (submit && !('method' in n.attrs) && formRunnable(submit.payload)) {
|
|
98
|
+
const id = encodeURIComponent(n.id);
|
|
99
|
+
parts.push(' method="post"', (s) => attr('action', `${s.url}${s.url.includes('?') ? '&' : '?'}${FORM_FIELD}=${id}`));
|
|
100
|
+
}
|
|
101
|
+
parts.push('>');
|
|
102
|
+
if (voids.has(n.tag))
|
|
103
|
+
return seq(parts);
|
|
104
|
+
if (content !== null)
|
|
105
|
+
parts.push(content);
|
|
106
|
+
else
|
|
107
|
+
parts.push(...children(n.children));
|
|
108
|
+
parts.push(`</${n.tag}>`);
|
|
109
|
+
return seq(parts);
|
|
110
|
+
}
|
|
111
|
+
case 'when': {
|
|
112
|
+
const body = seq(children(n.children));
|
|
113
|
+
const states = n.states;
|
|
114
|
+
return wrap((s, r) => (s.state !== null && states.includes(s.state) ? run(body, s, r) : ''));
|
|
115
|
+
}
|
|
116
|
+
case 'each': {
|
|
117
|
+
const item = compileNode(n.item, island, c, true);
|
|
118
|
+
const source = expr(n.source, fns);
|
|
119
|
+
return wrap((s, r) => {
|
|
120
|
+
const items = source(s);
|
|
121
|
+
let out = '';
|
|
122
|
+
if (Array.isArray(items))
|
|
123
|
+
for (const x of items)
|
|
124
|
+
out += run(item, { ...s, bindings: [...s.bindings, x] }, r);
|
|
125
|
+
return out;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
case 'embed': {
|
|
129
|
+
const view = n.view;
|
|
130
|
+
const cache = new WeakMap();
|
|
131
|
+
return wrap((_, r) => {
|
|
132
|
+
const e = r.embed(view);
|
|
133
|
+
if (!e)
|
|
134
|
+
return '';
|
|
135
|
+
let f = cache.get(e.root);
|
|
136
|
+
if (f === undefined) {
|
|
137
|
+
f = compileNode(e.root, island, c);
|
|
138
|
+
cache.set(e.root, f);
|
|
139
|
+
}
|
|
140
|
+
return run(f, e.scope, r);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
case 'if': {
|
|
144
|
+
const test = compileGuard(n.test, fns);
|
|
145
|
+
const yes = seq(children(n.ifTrue));
|
|
146
|
+
const no = seq(children(n.ifFalse));
|
|
147
|
+
return wrap((s, r) => run(test(s) ? yes : no, s, r));
|
|
148
|
+
}
|
|
149
|
+
case 'html': {
|
|
150
|
+
const get = expr(n.value, fns);
|
|
151
|
+
return wrap((s) => text(get(s)));
|
|
152
|
+
}
|
|
153
|
+
case 'global':
|
|
154
|
+
return '<!--g-->';
|
|
155
|
+
case 'widget': {
|
|
156
|
+
const tag = c.widgets[n.widget]?.tag ?? 'div';
|
|
157
|
+
const ref = n.widget;
|
|
158
|
+
const use = (_, r) => {
|
|
159
|
+
r.widget(ref);
|
|
160
|
+
return '';
|
|
161
|
+
};
|
|
162
|
+
const own = island && c.islands.has(n.id);
|
|
163
|
+
const kids = n.children.map((x, i) => compileNode(x, !own && island, c, separated(n.children, i)));
|
|
164
|
+
return seq([use, `<${tag}`, classAndStyleFrag(n, fns), '>', ...kids, `</${tag}>`]);
|
|
165
|
+
}
|
|
166
|
+
default:
|
|
167
|
+
return '';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
|
package/dist/components.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { type ProjectIR } from '@hozu/core/ir';
|
|
2
2
|
export declare function assertComponentBundle(ir: ProjectIR, urls: Record<string, string>, given: boolean): void;
|
|
3
|
+
/** Features whose effects run in the browser need their fetch bundle (ADR 0049), or those effects never load. */
|
|
4
|
+
export declare function assertFetchBundle(ir: ProjectIR, urls: Record<string, string>, given: boolean): void;
|
|
3
5
|
//# sourceMappingURL=components.d.ts.map
|
package/dist/components.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,eAAe,CAAA;AAEpE,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,QAQhG"}
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,eAAe,CAAA;AAEpE,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,QAQhG;AAED,iHAAiH;AACjH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,QAe5F"}
|
package/dist/components.js
CHANGED
|
@@ -7,4 +7,17 @@ export function assertComponentBundle(ir, urls, given) {
|
|
|
7
7
|
? `The component bundle has no client code for ${missing.join(', ')}; check the diagnostics of bundleComponents (HZ029).`
|
|
8
8
|
: `Client components ${missing.join(', ')} are used in views, but no component bundle was given, so their client code would never load. Pass \`components: await bundleComponents(build)\` from @hozu/bundle (npm install @hozu/bundle), or serve the output of \`hozu build\`.`);
|
|
9
9
|
}
|
|
10
|
+
/** Features whose effects run in the browser need their fetch bundle (ADR 0049), or those effects never load. */
|
|
11
|
+
export function assertFetchBundle(ir, urls, given) {
|
|
12
|
+
const missing = Object.values(ir.features)
|
|
13
|
+
.filter((f) => f.fetch &&
|
|
14
|
+
[...Object.values(f.queries), ...Object.values(f.mutations)].some((e) => e.runs !== 'server') &&
|
|
15
|
+
!urls[f.id])
|
|
16
|
+
.map((f) => f.id);
|
|
17
|
+
if (!missing.length)
|
|
18
|
+
return;
|
|
19
|
+
throw new Error(given
|
|
20
|
+
? `The bundle has no fetch module for ${missing.join(', ')}; check the diagnostics of bundleComponents (HZ081).`
|
|
21
|
+
: `Features ${missing.join(', ')} have effects that run in the browser, but no bundle was given, so their fetch.ts would never load. Pass \`components: await bundleComponents(build)\` from @hozu/bundle (npm install @hozu/bundle), or serve the output of \`hozu build\`.`);
|
|
22
|
+
}
|
|
10
23
|
//# sourceMappingURL=components.js.map
|
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEpE,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,IAA4B,EAAE,KAAc;IAC/F,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAM;IAC3B,MAAM,IAAI,KAAK,CACb,KAAK;QACH,CAAC,CAAC,+CAA+C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sDAAsD;QACzH,CAAC,CAAC,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uOAAuO,CACnR,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEpE,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,IAA4B,EAAE,KAAc;IAC/F,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAM;IAC3B,MAAM,IAAI,KAAK,CACb,KAAK;QACH,CAAC,CAAC,+CAA+C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sDAAsD;QACzH,CAAC,CAAC,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uOAAuO,CACnR,CAAA;AACH,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,iBAAiB,CAAC,EAAa,EAAE,IAA4B,EAAE,KAAc;IAC3F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;SACvC,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK;QACP,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC7F,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CACd;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnB,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAM;IAC3B,MAAM,IAAI,KAAK,CACb,KAAK;QACH,CAAC,CAAC,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sDAAsD;QAChH,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6OAA6O,CAChR,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type BuildResult, type ProjectIR } from '@hozu/core/ir';
|
|
2
|
+
/** One browser module of `fn` implementations (ADR 0050 C). */
|
|
3
|
+
export interface FnModule {
|
|
4
|
+
path: string;
|
|
5
|
+
source: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Framework builtins (`%…` operators, `#…` formats and messages, which server lowering may add to an island) share
|
|
9
|
+
* one module that every island page loads; a feature's `fn`s go in its own.
|
|
10
|
+
*/
|
|
11
|
+
export declare const moduleOfFn: (ref: string) => string;
|
|
12
|
+
/** Every `fn` reference in an IR value: `{ fn, arg }` values and `{ op: 'fn', fn, arg }` guards. */
|
|
13
|
+
export declare function fnRefs(value: unknown, out?: Set<string>): Set<string>;
|
|
14
|
+
/** The `fn`s the browser can call: those in machines and in views bound to a machine. */
|
|
15
|
+
export declare function clientFns(ir: ProjectIR): Set<string>;
|
|
16
|
+
/** The routes and endpoints an island can reach: `ui.link(route | endpoint, …)` values in nodes and machines (ADR 0050 E). */
|
|
17
|
+
export declare function linkTargets(value: unknown, out?: Set<string>): Set<string>;
|
|
18
|
+
/** The fn modules a page's islands can call: its machine-bound views and their machines, plus builtins. */
|
|
19
|
+
export declare function modulesOfPage(ir: ProjectIR, views: string[], available: Record<string, string>): string[];
|
|
20
|
+
/** The browser `fn` modules of a build, by module name, at content-hashed paths under `/_hozu/f/`. */
|
|
21
|
+
export declare function fnModules(build: BuildResult): Record<string, FnModule>;
|
|
22
|
+
//# sourceMappingURL=fn-modules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fn-modules.d.ts","sourceRoot":"","sources":["../src/fn-modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAY,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAE1E,+DAA+D;AAC/D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAS,MAAM,WAAkE,CAAA;AAExG,oGAAoG;AACpG,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,cAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,CAQ3E;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CASpD;AAED,8HAA8H;AAC9H,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,cAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,CAShF;AAID,2GAA2G;AAC3G,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAqBzG;AA2BD,sGAAsG;AACtG,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CActE"}
|