@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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/assets.d.ts +2 -0
  4. package/dist/assets.d.ts.map +1 -0
  5. package/dist/assets.js +4 -0
  6. package/dist/assets.js.map +1 -0
  7. package/dist/cache.d.ts +15 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +19 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/compile.d.ts +43 -0
  12. package/dist/compile.d.ts.map +1 -0
  13. package/dist/compile.js +170 -0
  14. package/dist/compile.js.map +1 -0
  15. package/dist/crawl.d.ts +12 -0
  16. package/dist/crawl.d.ts.map +1 -0
  17. package/dist/crawl.js +52 -0
  18. package/dist/crawl.js.map +1 -0
  19. package/dist/escape.d.ts +4 -0
  20. package/dist/escape.d.ts.map +1 -0
  21. package/dist/escape.js +7 -0
  22. package/dist/escape.js.map +1 -0
  23. package/dist/forms.d.ts +26 -0
  24. package/dist/forms.d.ts.map +1 -0
  25. package/dist/forms.js +107 -0
  26. package/dist/forms.js.map +1 -0
  27. package/dist/generate.d.ts +9 -0
  28. package/dist/generate.d.ts.map +1 -0
  29. package/dist/generate.js +395 -0
  30. package/dist/generate.js.map +1 -0
  31. package/dist/handler.d.ts +41 -0
  32. package/dist/handler.d.ts.map +1 -0
  33. package/dist/handler.js +567 -0
  34. package/dist/handler.js.map +1 -0
  35. package/dist/images.d.ts +4 -0
  36. package/dist/images.d.ts.map +1 -0
  37. package/dist/images.js +54 -0
  38. package/dist/images.js.map +1 -0
  39. package/dist/index.d.ts +22 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +13 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lower.d.ts +13 -0
  44. package/dist/lower.d.ts.map +1 -0
  45. package/dist/lower.js +149 -0
  46. package/dist/lower.js.map +1 -0
  47. package/dist/pwa.d.ts +5 -0
  48. package/dist/pwa.d.ts.map +1 -0
  49. package/dist/pwa.js +66 -0
  50. package/dist/pwa.js.map +1 -0
  51. package/dist/render.d.ts +58 -0
  52. package/dist/render.d.ts.map +1 -0
  53. package/dist/render.js +593 -0
  54. package/dist/render.js.map +1 -0
  55. package/dist/rendered.d.ts +64 -0
  56. package/dist/rendered.d.ts.map +1 -0
  57. package/dist/rendered.js +131 -0
  58. package/dist/rendered.js.map +1 -0
  59. package/dist/routing.d.ts +11 -0
  60. package/dist/routing.d.ts.map +1 -0
  61. package/dist/routing.js +30 -0
  62. package/dist/routing.js.map +1 -0
  63. package/dist/search.d.ts +3 -0
  64. package/dist/search.d.ts.map +1 -0
  65. package/dist/search.js +40 -0
  66. package/dist/search.js.map +1 -0
  67. package/dist/security.d.ts +5 -0
  68. package/dist/security.d.ts.map +1 -0
  69. package/dist/security.js +32 -0
  70. package/dist/security.js.map +1 -0
  71. package/dist/session.d.ts +12 -0
  72. package/dist/session.d.ts.map +1 -0
  73. package/dist/session.js +35 -0
  74. package/dist/session.js.map +1 -0
  75. package/dist/shape.d.ts +8 -0
  76. package/dist/shape.d.ts.map +1 -0
  77. package/dist/shape.js +127 -0
  78. package/dist/shape.js.map +1 -0
  79. package/dist/static.d.ts +17 -0
  80. package/dist/static.d.ts.map +1 -0
  81. package/dist/static.js +33 -0
  82. package/dist/static.js.map +1 -0
  83. 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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"}
@@ -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"}
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { type Json, type JsonSchema } from '@hozu/core/ir';
2
+ export declare function parseSearch(schema: JsonSchema | null, query: URLSearchParams): Json;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -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":"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"}
@@ -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"}
@@ -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"}
@@ -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":"AAYA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AAEjC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,EAAE,CACtC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;KAChC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;KACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;KACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAEvB,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CACrC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3F,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,MAAM,EACN,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAC1B,MAAM,GAAG,IAAI,GACQ;IACrB,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;IAC9F,MAAM,UAAU,GAAG,mCAAmC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IAChF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CACjC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAA;IACD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACnG,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;YAClD,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAA;YACvC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,MAAM,GAAG,EACT,aAAa,CAAC,SAAS,CAAC,EACxB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CACxB,CAAA;gBACD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACpF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,KAAK;YACf,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,IAAI,UAAU,aAAa,CAAA;YAC7D,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,SAAS,GAAG,SAAS,CACzB,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CACrF,CAAA;YACD,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,SAAS,GAAG,UAAU,aAAa,MAAM,EAAE,CAAA;QAC1E,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -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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"}
@@ -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