@hozu/runtime-server 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 +21 -0
- package/README.md +15 -0
- package/dist/assets.d.ts +2 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +4 -0
- package/dist/assets.js.map +1 -0
- package/dist/cache.d.ts +15 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +19 -0
- package/dist/cache.js.map +1 -0
- 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/crawl.d.ts +12 -0
- package/dist/crawl.d.ts.map +1 -0
- package/dist/crawl.js +52 -0
- package/dist/crawl.js.map +1 -0
- package/dist/escape.d.ts +4 -0
- package/dist/escape.d.ts.map +1 -0
- package/dist/escape.js +7 -0
- package/dist/escape.js.map +1 -0
- package/dist/forms.d.ts +26 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +107 -0
- package/dist/forms.js.map +1 -0
- package/dist/generate.d.ts +9 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +395 -0
- package/dist/generate.js.map +1 -0
- package/dist/handler.d.ts +41 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +567 -0
- package/dist/handler.js.map +1 -0
- package/dist/images.d.ts +4 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +54 -0
- package/dist/images.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lower.d.ts +13 -0
- package/dist/lower.d.ts.map +1 -0
- package/dist/lower.js +149 -0
- package/dist/lower.js.map +1 -0
- package/dist/pwa.d.ts +5 -0
- package/dist/pwa.d.ts.map +1 -0
- package/dist/pwa.js +66 -0
- package/dist/pwa.js.map +1 -0
- package/dist/render.d.ts +58 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +593 -0
- package/dist/render.js.map +1 -0
- package/dist/rendered.d.ts +64 -0
- package/dist/rendered.d.ts.map +1 -0
- package/dist/rendered.js +131 -0
- package/dist/rendered.js.map +1 -0
- package/dist/routing.d.ts +11 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +30 -0
- package/dist/routing.js.map +1 -0
- package/dist/search.d.ts +3 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +40 -0
- package/dist/search.js.map +1 -0
- package/dist/security.d.ts +5 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +32 -0
- package/dist/security.js.map +1 -0
- package/dist/session.d.ts +12 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +35 -0
- package/dist/session.js.map +1 -0
- package/dist/shape.d.ts +8 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +127 -0
- package/dist/shape.js.map +1 -0
- package/dist/static.d.ts +17 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +33 -0
- package/dist/static.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { BuildResult, FeatureIR, Json, ValueExpr, ViewNode } from '@hozu/core/ir';
|
|
2
|
+
import { equal, getIn } from '@hozu/machine';
|
|
3
|
+
import { escapeHtml } from './escape.ts';
|
|
4
|
+
import { type Variants } from './images.ts';
|
|
5
|
+
export interface Scope {
|
|
6
|
+
feature: FeatureIR;
|
|
7
|
+
context: Json;
|
|
8
|
+
state: string | null;
|
|
9
|
+
bindings: Json[];
|
|
10
|
+
params: Json;
|
|
11
|
+
search: Json;
|
|
12
|
+
routes: Record<string, string>;
|
|
13
|
+
url: string;
|
|
14
|
+
locale: string;
|
|
15
|
+
alternate: Record<string, string>;
|
|
16
|
+
env: Json;
|
|
17
|
+
}
|
|
18
|
+
export interface RenderRuntime {
|
|
19
|
+
island(id: string, scope: Scope, scoped: Json[]): string;
|
|
20
|
+
embed(view: string): {
|
|
21
|
+
scope: Scope;
|
|
22
|
+
} | null;
|
|
23
|
+
widget(ref: string): void;
|
|
24
|
+
}
|
|
25
|
+
export type Fns = Record<string, (x: Json) => Json>;
|
|
26
|
+
export type RenderFn = (scope: Scope, runtime: RenderRuntime, fns: Fns) => string;
|
|
27
|
+
export type RenderTable = Record<string, RenderFn>;
|
|
28
|
+
export type RenderModule = {
|
|
29
|
+
default: (helpers: Helpers) => RenderTable;
|
|
30
|
+
};
|
|
31
|
+
type Shape = true | [string, Shape][];
|
|
32
|
+
declare const project: (value: Json, shape: Shape) => Json;
|
|
33
|
+
declare const attr: (name: string, x: Json) => string;
|
|
34
|
+
declare const classAttr: (c: string) => string;
|
|
35
|
+
declare const styleAttr: (s: string) => string;
|
|
36
|
+
type Styled = Pick<Extract<ViewNode, {
|
|
37
|
+
kind: 'el';
|
|
38
|
+
}>, 'class' | 'toggle' | 'vars'>;
|
|
39
|
+
export declare function classAndStyle(n: Styled, value: (v: ValueExpr) => Json): string;
|
|
40
|
+
export declare const helpers: {
|
|
41
|
+
escapeHtml: typeof escapeHtml;
|
|
42
|
+
text: (v: Json | undefined) => string;
|
|
43
|
+
attr: typeof attr;
|
|
44
|
+
classText: (base: string | null, active: string[]) => string;
|
|
45
|
+
styleText: (vars: [string, Json][]) => string;
|
|
46
|
+
classAttr: typeof classAttr;
|
|
47
|
+
styleAttr: typeof styleAttr;
|
|
48
|
+
getIn: typeof getIn;
|
|
49
|
+
equal: typeof equal;
|
|
50
|
+
pathOf: (pattern: string, params: Json | undefined, search?: Json) => string;
|
|
51
|
+
num: (x: Json) => string | number;
|
|
52
|
+
call: (fns: Fns, name: string, arg: Json) => Json;
|
|
53
|
+
project: typeof project;
|
|
54
|
+
};
|
|
55
|
+
export type Helpers = typeof helpers;
|
|
56
|
+
export declare const instantiate: (module: RenderModule) => RenderTable;
|
|
57
|
+
export declare class RenderModuleError extends Error {
|
|
58
|
+
name: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function loadRender(source: string): Promise<RenderTable>;
|
|
61
|
+
export declare function renderTableFor(build: BuildResult, images: Variants | null): Promise<RenderTable>;
|
|
62
|
+
export declare function nodesById(build: BuildResult, images: Variants | null): Map<string, ViewNode>;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=rendered.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendered.d.ts","sourceRoot":"","sources":["../src/rendered.ts"],"names":[],"mappings":"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"}
|
package/dist/rendered.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { equal, getIn, pathOf } from '@hozu/machine';
|
|
10
|
+
import { attrText, classText, styleText, text } from '@hozu/runtime-client';
|
|
11
|
+
import { escapeHtml } from './escape.js';
|
|
12
|
+
import { generateRender } from './generate.js';
|
|
13
|
+
import { responsive } from './images.js';
|
|
14
|
+
const project = (value, shape) => {
|
|
15
|
+
if (shape === true || typeof value !== 'object' || value === null || Array.isArray(value))
|
|
16
|
+
return value;
|
|
17
|
+
const out = {};
|
|
18
|
+
for (const [k, s] of shape)
|
|
19
|
+
if (k in value)
|
|
20
|
+
out[k] = project(value[k], s);
|
|
21
|
+
return out;
|
|
22
|
+
};
|
|
23
|
+
const attr = (name, x) => {
|
|
24
|
+
const s = attrText(name, x);
|
|
25
|
+
return s === null ? '' : s === '' ? ` ${name}` : ` ${name}="${escapeHtml(s)}"`;
|
|
26
|
+
};
|
|
27
|
+
const classAttr = (c) => (c ? ` class="${escapeHtml(c)}"` : '');
|
|
28
|
+
const styleAttr = (s) => (s ? ` style="${escapeHtml(s)}"` : '');
|
|
29
|
+
export function classAndStyle(n, value) {
|
|
30
|
+
const active = [];
|
|
31
|
+
for (const c in n.toggle)
|
|
32
|
+
if (value(n.toggle[c]) === true)
|
|
33
|
+
active.push(c);
|
|
34
|
+
return (classAttr(classText(n.class, active)) +
|
|
35
|
+
styleAttr(styleText(Object.entries(n.vars).map(([k, v]) => [k, value(v)]))));
|
|
36
|
+
}
|
|
37
|
+
export const helpers = {
|
|
38
|
+
escapeHtml,
|
|
39
|
+
text,
|
|
40
|
+
attr,
|
|
41
|
+
classText,
|
|
42
|
+
styleText,
|
|
43
|
+
classAttr,
|
|
44
|
+
styleAttr,
|
|
45
|
+
getIn,
|
|
46
|
+
equal,
|
|
47
|
+
pathOf,
|
|
48
|
+
num: (x) => (typeof x === 'number' || typeof x === 'string' ? x : Number.NaN),
|
|
49
|
+
call: (fns, name, arg) => {
|
|
50
|
+
const impl = fns[name];
|
|
51
|
+
if (!impl)
|
|
52
|
+
throw new Error(`No implementation bound for fn ${name}`);
|
|
53
|
+
return impl(arg);
|
|
54
|
+
},
|
|
55
|
+
project,
|
|
56
|
+
};
|
|
57
|
+
export const instantiate = (module) => module.default(helpers);
|
|
58
|
+
export class RenderModuleError extends Error {
|
|
59
|
+
name = 'RenderModuleError';
|
|
60
|
+
}
|
|
61
|
+
export async function loadRender(source) {
|
|
62
|
+
let module;
|
|
63
|
+
try {
|
|
64
|
+
module = (await import(__rewriteRelativeImportExtension(
|
|
65
|
+
/* @vite-ignore */ `data:text/javascript,${encodeURIComponent(source)}`)));
|
|
66
|
+
}
|
|
67
|
+
catch (cause) {
|
|
68
|
+
throw new RenderModuleError('This runtime cannot load generated render code. Run `hozu build` and pass the generated module: ' +
|
|
69
|
+
"createHandler({ render: await import('./dist/server/render.js') }).", { cause });
|
|
70
|
+
}
|
|
71
|
+
return instantiate(module);
|
|
72
|
+
}
|
|
73
|
+
const loaded = new WeakMap();
|
|
74
|
+
export function renderTableFor(build, images) {
|
|
75
|
+
let byImages = loaded.get(build);
|
|
76
|
+
if (!byImages) {
|
|
77
|
+
byImages = new Map();
|
|
78
|
+
loaded.set(build, byImages);
|
|
79
|
+
}
|
|
80
|
+
let table = byImages.get(images);
|
|
81
|
+
if (!table) {
|
|
82
|
+
table = loadRender(generateRender(build, images));
|
|
83
|
+
byImages.set(images, table);
|
|
84
|
+
}
|
|
85
|
+
return table;
|
|
86
|
+
}
|
|
87
|
+
const nodeMaps = new WeakMap();
|
|
88
|
+
export function nodesById(build, images) {
|
|
89
|
+
let byImages = nodeMaps.get(build);
|
|
90
|
+
if (!byImages) {
|
|
91
|
+
byImages = new Map();
|
|
92
|
+
nodeMaps.set(build, byImages);
|
|
93
|
+
}
|
|
94
|
+
let map = byImages.get(images);
|
|
95
|
+
if (!map) {
|
|
96
|
+
const out = new Map();
|
|
97
|
+
const walk = (n) => {
|
|
98
|
+
out.set(n.id, n);
|
|
99
|
+
switch (n.kind) {
|
|
100
|
+
case 'el':
|
|
101
|
+
case 'when':
|
|
102
|
+
case 'widget':
|
|
103
|
+
n.children.forEach(walk);
|
|
104
|
+
return;
|
|
105
|
+
case 'if':
|
|
106
|
+
n.ifTrue.forEach(walk);
|
|
107
|
+
n.ifFalse.forEach(walk);
|
|
108
|
+
return;
|
|
109
|
+
case 'each':
|
|
110
|
+
walk(n.item);
|
|
111
|
+
return;
|
|
112
|
+
case 'query':
|
|
113
|
+
walk(n.ready);
|
|
114
|
+
if (n.pending)
|
|
115
|
+
walk(n.pending);
|
|
116
|
+
for (const k in n.failed)
|
|
117
|
+
walk(n.failed[k]);
|
|
118
|
+
return;
|
|
119
|
+
default:
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
for (const f of Object.values(build.ir.features))
|
|
124
|
+
for (const v of Object.values(f.views))
|
|
125
|
+
walk(images ? responsive(v.root, images) : v.root);
|
|
126
|
+
map = out;
|
|
127
|
+
byImages.set(images, map);
|
|
128
|
+
}
|
|
129
|
+
return map;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=rendered.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendered.js","sourceRoot":"","sources":["../src/rendered.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type BuildResult, type Json } from '@hozu/core/ir';
|
|
2
|
+
export interface Match {
|
|
3
|
+
route: string;
|
|
4
|
+
params: Json;
|
|
5
|
+
}
|
|
6
|
+
export declare function patternOf(path: string): {
|
|
7
|
+
keys: string[];
|
|
8
|
+
pattern: RegExp;
|
|
9
|
+
};
|
|
10
|
+
export declare function matcher(build: BuildResult): (pathname: string) => Match | null;
|
|
11
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAA6B,MAAM,eAAe,CAAA;AAEtF,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,IAAI,CAAA;CACb;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAG3E;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,CAoB9E"}
|
package/dist/routing.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { routeParams, routePattern } from '@hozu/core/ir';
|
|
2
|
+
export function patternOf(path) {
|
|
3
|
+
const { keys, pattern } = routePattern(path);
|
|
4
|
+
return { keys: keys.map((k) => k.name), pattern };
|
|
5
|
+
}
|
|
6
|
+
export function matcher(build) {
|
|
7
|
+
const table = Object.entries(build.ir.routes)
|
|
8
|
+
.filter(([id]) => build.ir.pages[id])
|
|
9
|
+
.map(([id, r]) => {
|
|
10
|
+
const { keys, pattern } = routePattern(r.path);
|
|
11
|
+
const many = keys.filter((k) => k.mod === '+' || k.mod === '*').length;
|
|
12
|
+
return { id, keys, pattern, hasParams: r.params !== null, rank: keys.length * 100 + many };
|
|
13
|
+
})
|
|
14
|
+
.sort((a, b) => a.rank - b.rank);
|
|
15
|
+
return (pathname) => {
|
|
16
|
+
for (const { id, keys, pattern, hasParams } of table) {
|
|
17
|
+
const m = pattern.exec(pathname);
|
|
18
|
+
if (!m)
|
|
19
|
+
continue;
|
|
20
|
+
if (!hasParams)
|
|
21
|
+
return { route: id, params: null };
|
|
22
|
+
const params = routeParams(keys, m);
|
|
23
|
+
if (!params || build.bindings.checks[`#route:${id}`]?.(params))
|
|
24
|
+
continue;
|
|
25
|
+
return { route: id, params };
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAOtF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAkB;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAA;QACtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,EAAE,CAAA;IAC5F,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;IAClC,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;YACrD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,CAAC,CAAC;gBAAE,SAAQ;YAChB,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;YAClD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACnC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;gBAAE,SAAQ;YACxE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;QAC9B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;AACH,CAAC"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAkB,MAAM,eAAe,CAAA;AA4B1E,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAUnF"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { searchDefaults } from '@hozu/core/ir';
|
|
2
|
+
const obj = (v) => v && typeof v === 'object' && !Array.isArray(v) ? v : null;
|
|
3
|
+
function variant(s) {
|
|
4
|
+
for (const k of ['anyOf', 'oneOf'])
|
|
5
|
+
if (Array.isArray(s[k]))
|
|
6
|
+
for (const v of s[k]) {
|
|
7
|
+
const o = obj(v);
|
|
8
|
+
if (o && o.type !== 'null')
|
|
9
|
+
return o;
|
|
10
|
+
}
|
|
11
|
+
return s;
|
|
12
|
+
}
|
|
13
|
+
function coerce(schema, raw) {
|
|
14
|
+
const s = variant(schema);
|
|
15
|
+
if (Array.isArray(s.enum))
|
|
16
|
+
return s.enum.find((e) => String(e) === raw);
|
|
17
|
+
const type = Array.isArray(s.type) ? s.type.find((t) => t !== 'null') : s.type;
|
|
18
|
+
if (type === 'number' || type === 'integer') {
|
|
19
|
+
const n = Number(raw);
|
|
20
|
+
return raw !== '' && Number.isFinite(n) && (type === 'number' || Number.isInteger(n)) ? n : undefined;
|
|
21
|
+
}
|
|
22
|
+
if (type === 'boolean')
|
|
23
|
+
return raw === 'true' ? true : raw === 'false' ? false : undefined;
|
|
24
|
+
if (type === 'string')
|
|
25
|
+
return raw;
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
export function parseSearch(schema, query) {
|
|
29
|
+
if (!schema)
|
|
30
|
+
return null;
|
|
31
|
+
const defaults = searchDefaults(schema);
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const [key, v] of Object.entries(obj(schema.properties) ?? {})) {
|
|
34
|
+
const raw = query.get(key);
|
|
35
|
+
const parsed = raw === null ? undefined : coerce(obj(v) ?? {}, raw);
|
|
36
|
+
out[key] = parsed === undefined ? (defaults[key] ?? null) : parsed;
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,cAAc,EAAE,MAAM,eAAe,CAAA;AAE1E,MAAM,GAAG,GAAG,CAAC,CAAmB,EAAqB,EAAE,CACrD,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAgB,CAAC,CAAC,CAAC,IAAI,CAAA;AAE5E,SAAS,OAAO,CAAC,CAAa;IAC5B,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAU;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;gBAChB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,CAAC,CAAA;YACtC,CAAC;IACL,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,MAAM,CAAC,MAAkB,EAAE,GAAW;IAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAqB,CAAA;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,IAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5F,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,GAAG,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvG,CAAC;IACD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1F,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACjC,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAyB,EAAE,KAAsB;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,GAAG,GAAyB,EAAE,CAAA;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QACnE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type CspSources = Partial<Record<'script' | 'style' | 'img' | 'connect' | 'font' | 'frame' | 'media', string[]>>;
|
|
2
|
+
export declare const crossSite: (request: Request) => boolean;
|
|
3
|
+
export declare function contentSecurityPolicy(extra: CspSources, scriptHashes: string[]): string;
|
|
4
|
+
export declare const ERROR_HTML = "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta name=\"robots\" content=\"noindex\"><title>Something went wrong</title></head><body><h1>Something went wrong</h1><p>Please try again later.</p></body></html>";
|
|
5
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,MAAM,CAAC,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CACtF,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,OAAO,KAAG,OAS5C,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAgBvF;AAED,eAAO,MAAM,UAAU,+SAC2Q,CAAA"}
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const crossSite = (request) => {
|
|
2
|
+
if (request.headers.get('sec-fetch-site') === 'cross-site')
|
|
3
|
+
return true;
|
|
4
|
+
const origin = request.headers.get('origin');
|
|
5
|
+
if (!origin)
|
|
6
|
+
return false;
|
|
7
|
+
try {
|
|
8
|
+
return new URL(origin).host !== new URL(request.url).host;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export function contentSecurityPolicy(extra, scriptHashes) {
|
|
15
|
+
const list = (base, more = []) => [...base, ...more].join(' ');
|
|
16
|
+
return [
|
|
17
|
+
"default-src 'self'",
|
|
18
|
+
`script-src ${list(["'self'", ...scriptHashes.map((h) => `'${h}'`)], extra.script)}`,
|
|
19
|
+
`style-src ${list(["'self'", "'unsafe-inline'"], extra.style)}`,
|
|
20
|
+
`img-src ${list(["'self'", 'data:', 'blob:'], extra.img)}`,
|
|
21
|
+
`connect-src ${list(["'self'"], extra.connect)}`,
|
|
22
|
+
`font-src ${list(["'self'", 'data:'], extra.font)}`,
|
|
23
|
+
`media-src ${list(["'self'", 'blob:'], extra.media)}`,
|
|
24
|
+
`frame-src ${list(["'self'"], extra.frame)}`,
|
|
25
|
+
"frame-ancestors 'self'",
|
|
26
|
+
"base-uri 'self'",
|
|
27
|
+
"form-action 'self'",
|
|
28
|
+
"object-src 'none'",
|
|
29
|
+
].join('; ');
|
|
30
|
+
}
|
|
31
|
+
export const ERROR_HTML = '<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="noindex"><title>Something went wrong</title></head><body><h1>Something went wrong</h1><p>Please try again later.</p></body></html>';
|
|
32
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAW,EAAE;IACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,YAAY;QAAE,OAAO,IAAI,CAAA;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAiB,EAAE,YAAsB;IAC7E,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,IAAI,GAAa,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClF,OAAO;QACL,oBAAoB;QACpB,cAAc,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QACpF,aAAa,IAAI,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;QAC/D,WAAW,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;QAC1D,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;QAChD,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;QACnD,aAAa,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;QACrD,aAAa,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;QAC5C,wBAAwB;QACxB,iBAAiB;QACjB,oBAAoB;QACpB,mBAAmB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GACrB,gSAAgS,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SessionStore {
|
|
2
|
+
read(request: Request): Promise<unknown>;
|
|
3
|
+
write(value: unknown): Promise<string>;
|
|
4
|
+
}
|
|
5
|
+
export interface SessionCookieOptions {
|
|
6
|
+
name: string;
|
|
7
|
+
secret: string;
|
|
8
|
+
maxAge?: number;
|
|
9
|
+
secure?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function sessionCookie({ name, secret, maxAge, secure, }: SessionCookieOptions): SessionStore;
|
|
12
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAaD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,MAAM,EACN,MAA0B,EAC1B,MAAa,GACd,EAAE,oBAAoB,GAAG,YAAY,CAoCrC"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const encoder = new TextEncoder();
|
|
2
|
+
const base64url = (bytes) => btoa(String.fromCharCode(...bytes))
|
|
3
|
+
.replace(/\+/g, '-')
|
|
4
|
+
.replace(/\//g, '_')
|
|
5
|
+
.replace(/=+$/, '');
|
|
6
|
+
const fromBase64url = (text) => Uint8Array.from(atob(text.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0));
|
|
7
|
+
export function sessionCookie({ name, secret, maxAge = 60 * 60 * 24 * 30, secure = true, }) {
|
|
8
|
+
if (secret.length < 32)
|
|
9
|
+
throw new Error('sessionCookie secret must be at least 32 characters');
|
|
10
|
+
const attributes = `; Path=/; HttpOnly; SameSite=Lax${secure ? '; Secure' : ''}`;
|
|
11
|
+
const key = crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);
|
|
12
|
+
return {
|
|
13
|
+
async read(request) {
|
|
14
|
+
const raw = new RegExp(`(?:^|;\\s*)${name}=([^;]+)`).exec(request.headers.get('cookie') ?? '')?.[1];
|
|
15
|
+
const [payload, signature] = raw?.split('.') ?? [];
|
|
16
|
+
if (!payload || !signature)
|
|
17
|
+
return null;
|
|
18
|
+
try {
|
|
19
|
+
const valid = await crypto.subtle.verify('HMAC', await key, fromBase64url(signature), encoder.encode(payload));
|
|
20
|
+
return valid ? JSON.parse(new TextDecoder().decode(fromBase64url(payload))) : null;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
async write(value) {
|
|
27
|
+
if (value === null)
|
|
28
|
+
return `${name}=${attributes}; Max-Age=0`;
|
|
29
|
+
const payload = base64url(encoder.encode(JSON.stringify(value)));
|
|
30
|
+
const signature = base64url(new Uint8Array(await crypto.subtle.sign('HMAC', await key, encoder.encode(payload))));
|
|
31
|
+
return `${name}=${payload}.${signature}${attributes}; Max-Age=${maxAge}`;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/shape.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Json, type ViewNode } from '@hozu/core/ir';
|
|
2
|
+
export type Uses = Map<number, string[][]>;
|
|
3
|
+
export declare function bindingUses(n: ViewNode): Uses;
|
|
4
|
+
export type Shape = true | Map<string, Shape>;
|
|
5
|
+
export declare const shapeOf: (paths: string[][]) => Shape;
|
|
6
|
+
export declare const project: (value: Json, shape: Shape) => Json;
|
|
7
|
+
export declare const pruneScope: (n: ViewNode, bindings: Json[]) => Json[];
|
|
8
|
+
//# sourceMappingURL=shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,IAAI,EAAkB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAI/F,MAAM,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;AAU1C,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAkD7C;AAED,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAE7C,eAAO,MAAM,OAAO,UAAW,MAAM,EAAE,EAAE,KAAG,KAkB3C,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,IAAI,SAAS,KAAK,KAAG,IAKnD,CAAA;AAID,eAAO,MAAM,UAAU,MAAO,QAAQ,YAAY,IAAI,EAAE,KAAG,IAAI,EAgB9D,CAAA"}
|
package/dist/shape.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { eachGuardRef, eachRef } from '@hozu/core/ir';
|
|
2
|
+
const usesMemo = new WeakMap();
|
|
3
|
+
const valueUses = (v, out) => eachRef(v, (r) => {
|
|
4
|
+
if (r.ref !== 'binding')
|
|
5
|
+
return;
|
|
6
|
+
const paths = out.get(r.depth);
|
|
7
|
+
if (paths)
|
|
8
|
+
paths.push(r.path);
|
|
9
|
+
else
|
|
10
|
+
out.set(r.depth, [r.path]);
|
|
11
|
+
});
|
|
12
|
+
export function bindingUses(n) {
|
|
13
|
+
const hit = usesMemo.get(n);
|
|
14
|
+
if (hit)
|
|
15
|
+
return hit;
|
|
16
|
+
const out = new Map();
|
|
17
|
+
const walk = (x) => {
|
|
18
|
+
switch (x.kind) {
|
|
19
|
+
case 'text':
|
|
20
|
+
valueUses(x.value, out);
|
|
21
|
+
return;
|
|
22
|
+
case 'if':
|
|
23
|
+
eachGuardRef(x.test, (r) => valueUses(r, out));
|
|
24
|
+
for (const c of [...x.ifTrue, ...x.ifFalse])
|
|
25
|
+
walk(c);
|
|
26
|
+
return;
|
|
27
|
+
case 'html':
|
|
28
|
+
valueUses(x.value, out);
|
|
29
|
+
return;
|
|
30
|
+
case 'global':
|
|
31
|
+
for (const k in x.on)
|
|
32
|
+
valueUses(x.on[k].payload, out);
|
|
33
|
+
return;
|
|
34
|
+
case 'widget':
|
|
35
|
+
valueUses(x.props, out);
|
|
36
|
+
for (const m of [x.toggle, x.vars])
|
|
37
|
+
for (const k in m)
|
|
38
|
+
valueUses(m[k], out);
|
|
39
|
+
for (const k in x.on)
|
|
40
|
+
valueUses(x.on[k].payload, out);
|
|
41
|
+
for (const c of x.children)
|
|
42
|
+
walk(c);
|
|
43
|
+
return;
|
|
44
|
+
case 'el':
|
|
45
|
+
for (const m of [x.attrs, x.toggle, x.vars])
|
|
46
|
+
for (const k in m)
|
|
47
|
+
valueUses(m[k], out);
|
|
48
|
+
for (const k in x.on)
|
|
49
|
+
valueUses(x.on[k].payload, out);
|
|
50
|
+
for (const c of x.children)
|
|
51
|
+
walk(c);
|
|
52
|
+
return;
|
|
53
|
+
case 'when':
|
|
54
|
+
for (const c of x.children)
|
|
55
|
+
walk(c);
|
|
56
|
+
return;
|
|
57
|
+
case 'each':
|
|
58
|
+
valueUses(x.source, out);
|
|
59
|
+
walk(x.item);
|
|
60
|
+
return;
|
|
61
|
+
case 'query':
|
|
62
|
+
valueUses(x.input, out);
|
|
63
|
+
walk(x.ready);
|
|
64
|
+
if (x.pending)
|
|
65
|
+
walk(x.pending);
|
|
66
|
+
for (const k in x.failed)
|
|
67
|
+
walk(x.failed[k]);
|
|
68
|
+
return;
|
|
69
|
+
default:
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
walk(n);
|
|
74
|
+
usesMemo.set(n, out);
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
export const shapeOf = (paths) => {
|
|
78
|
+
const root = new Map();
|
|
79
|
+
for (const path of paths) {
|
|
80
|
+
let at = root;
|
|
81
|
+
for (let i = 0; i < path.length; i++) {
|
|
82
|
+
const next = at.get(path[i]);
|
|
83
|
+
if (next === true)
|
|
84
|
+
break;
|
|
85
|
+
if (i === path.length - 1)
|
|
86
|
+
at.set(path[i], true);
|
|
87
|
+
else if (next)
|
|
88
|
+
at = next;
|
|
89
|
+
else {
|
|
90
|
+
const child = new Map();
|
|
91
|
+
at.set(path[i], child);
|
|
92
|
+
at = child;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (path.length === 0)
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return root;
|
|
99
|
+
};
|
|
100
|
+
export const project = (value, shape) => {
|
|
101
|
+
if (shape === true || typeof value !== 'object' || value === null || Array.isArray(value))
|
|
102
|
+
return value;
|
|
103
|
+
const out = {};
|
|
104
|
+
for (const [k, s] of shape)
|
|
105
|
+
if (k in value)
|
|
106
|
+
out[k] = project(value[k], s);
|
|
107
|
+
return out;
|
|
108
|
+
};
|
|
109
|
+
const shapesMemo = new WeakMap();
|
|
110
|
+
export const pruneScope = (n, bindings) => {
|
|
111
|
+
let shapes = shapesMemo.get(n);
|
|
112
|
+
if (!shapes) {
|
|
113
|
+
const uses = bindingUses(n);
|
|
114
|
+
shapes = bindings.map((_, i) => {
|
|
115
|
+
const paths = uses.get(i);
|
|
116
|
+
return paths ? shapeOf(paths) : null;
|
|
117
|
+
});
|
|
118
|
+
shapesMemo.set(n, shapes);
|
|
119
|
+
}
|
|
120
|
+
const out = [];
|
|
121
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
122
|
+
const shape = shapes[i];
|
|
123
|
+
out.push(shape ? project(bindings[i], shape) : null);
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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"}
|
package/dist/static.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BuildResult } from '@hozu/core/ir';
|
|
2
|
+
import { type Assets, type Stylesheet, type WidgetBundle } from './render.ts';
|
|
3
|
+
export interface StaticFile {
|
|
4
|
+
path: string;
|
|
5
|
+
text: string | null;
|
|
6
|
+
file: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function publicAssets(basePath: string, styles: {
|
|
9
|
+
href: string;
|
|
10
|
+
preload: string[];
|
|
11
|
+
} | null, widgets: Record<string, string>): Assets;
|
|
12
|
+
export declare function staticFiles(build: BuildResult, { styles, widgets, client }: {
|
|
13
|
+
styles: Stylesheet | null;
|
|
14
|
+
widgets: WidgetBundle | null;
|
|
15
|
+
client: boolean;
|
|
16
|
+
}): StaticFile[];
|
|
17
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,KAAK,MAAM,EAAa,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAExF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,EAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAQR;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACxG,UAAU,EAAE,CAiBd"}
|
package/dist/static.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { clientBundle } from './assets.js';
|
|
2
|
+
import { fnsModule } from './render.js';
|
|
3
|
+
export function publicAssets(basePath, styles, widgets) {
|
|
4
|
+
return {
|
|
5
|
+
client: `${basePath}/_hozu/client.js`,
|
|
6
|
+
fns: `${basePath}/_hozu/fns.js`,
|
|
7
|
+
styles: styles ? basePath + styles.href : null,
|
|
8
|
+
preload: (styles?.preload ?? []).map((href) => basePath + href),
|
|
9
|
+
widgets: Object.fromEntries(Object.entries(widgets).map(([k, v]) => [k, basePath + v])),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function staticFiles(build, { styles, widgets, client }) {
|
|
13
|
+
const base = build.ir.http.basePath;
|
|
14
|
+
const text = (path, body) => ({ path: base + path, text: body, file: null });
|
|
15
|
+
const out = [];
|
|
16
|
+
if (client) {
|
|
17
|
+
for (const [path, code] of Object.entries(clientBundle()))
|
|
18
|
+
out.push(text(path, code));
|
|
19
|
+
out.push(text('/_hozu/fns.js', fnsModule(build)));
|
|
20
|
+
}
|
|
21
|
+
if (styles) {
|
|
22
|
+
out.push(text(styles.href, styles.css));
|
|
23
|
+
for (const [path, file] of Object.entries(styles.assets))
|
|
24
|
+
out.push({ path: base + path, text: null, file });
|
|
25
|
+
}
|
|
26
|
+
for (const [path, a] of Object.entries(build.bindings.assets))
|
|
27
|
+
if (a.file)
|
|
28
|
+
out.push({ path, text: null, file: a.file });
|
|
29
|
+
for (const [path, code] of Object.entries(widgets?.files ?? {}))
|
|
30
|
+
out.push(text(path, code));
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=static.js.map
|