@graview/guest 0.1.9 → 0.1.12
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/README.md +353 -3
- package/client.js +2 -0
- package/dist/channel.d.ts +11 -3
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +5 -1
- package/dist/channel.js.map +1 -1
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-script.d.ts +3 -0
- package/dist/client-script.d.ts.map +1 -0
- package/dist/client-script.js +21 -0
- package/dist/client-script.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.generated.d.ts +4 -0
- package/dist/client.generated.d.ts.map +1 -0
- package/dist/client.generated.js +9 -0
- package/dist/client.generated.js.map +1 -0
- package/dist/client.js +12 -0
- package/dist/client.js.map +1 -0
- package/dist/headless/describe.d.ts +19 -0
- package/dist/headless/describe.d.ts.map +1 -0
- package/dist/headless/describe.js +255 -0
- package/dist/headless/describe.js.map +1 -0
- package/dist/headless/draw.d.ts +17 -0
- package/dist/headless/draw.d.ts.map +1 -0
- package/dist/headless/draw.js +25 -0
- package/dist/headless/draw.js.map +1 -0
- package/dist/headless/index.d.ts +99 -0
- package/dist/headless/index.d.ts.map +1 -0
- package/dist/headless/index.js +143 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/headless/judge.d.ts +16 -0
- package/dist/headless/judge.d.ts.map +1 -0
- package/dist/headless/judge.js +52 -0
- package/dist/headless/judge.js.map +1 -0
- package/dist/headless/node.d.ts +8 -0
- package/dist/headless/node.d.ts.map +1 -0
- package/dist/headless/node.js +80 -0
- package/dist/headless/node.js.map +1 -0
- package/dist/headless/protocol.d.ts +75 -0
- package/dist/headless/protocol.d.ts.map +1 -0
- package/dist/headless/protocol.js +14 -0
- package/dist/headless/protocol.js.map +1 -0
- package/dist/headless/runtime.d.ts +2 -0
- package/dist/headless/runtime.d.ts.map +1 -0
- package/dist/headless/runtime.generated.d.ts +2 -0
- package/dist/headless/runtime.generated.d.ts.map +1 -0
- package/dist/headless/runtime.generated.js +8 -0
- package/dist/headless/runtime.generated.js.map +1 -0
- package/dist/headless/runtime.js +171 -0
- package/dist/headless/runtime.js.map +1 -0
- package/dist/headless/tree.d.ts +54 -0
- package/dist/headless/tree.d.ts.map +1 -0
- package/dist/headless/tree.js +128 -0
- package/dist/headless/tree.js.map +1 -0
- package/dist/host/css.d.ts +118 -0
- package/dist/host/css.d.ts.map +1 -0
- package/dist/host/css.js +963 -0
- package/dist/host/css.js.map +1 -0
- package/dist/host/draw-budget.d.ts +10 -0
- package/dist/host/draw-budget.d.ts.map +1 -0
- package/dist/host/draw-budget.js +29 -0
- package/dist/host/draw-budget.js.map +1 -0
- package/dist/host/frame.d.ts +19 -1
- package/dist/host/frame.d.ts.map +1 -1
- package/dist/host/frame.js +21 -2
- package/dist/host/frame.js.map +1 -1
- package/dist/host/index.d.ts +4 -3
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +7 -1
- package/dist/host/index.js.map +1 -1
- package/dist/host/kit.d.ts +6 -2
- package/dist/host/kit.d.ts.map +1 -1
- package/dist/host/kit.js +12 -5
- package/dist/host/kit.js.map +1 -1
- package/dist/host/links.d.ts +24 -0
- package/dist/host/links.d.ts.map +1 -0
- package/dist/host/links.js +35 -0
- package/dist/host/links.js.map +1 -0
- package/dist/host/manifest.d.ts +50 -0
- package/dist/host/manifest.d.ts.map +1 -0
- package/dist/host/manifest.js +103 -0
- package/dist/host/manifest.js.map +1 -0
- package/dist/host/open-draw.d.ts +44 -0
- package/dist/host/open-draw.d.ts.map +1 -0
- package/dist/host/open-draw.js +108 -0
- package/dist/host/open-draw.js.map +1 -0
- package/dist/host/open-judge.d.ts +53 -0
- package/dist/host/open-judge.d.ts.map +1 -0
- package/dist/host/open-judge.js +95 -0
- package/dist/host/open-judge.js.map +1 -0
- package/dist/host/open-render.d.ts +32 -0
- package/dist/host/open-render.d.ts.map +1 -0
- package/dist/host/open-render.js +262 -0
- package/dist/host/open-render.js.map +1 -0
- package/dist/host/press.d.ts +15 -0
- package/dist/host/press.d.ts.map +1 -0
- package/dist/host/press.js +156 -0
- package/dist/host/press.js.map +1 -0
- package/dist/host/react.d.ts +15 -2
- package/dist/host/react.d.ts.map +1 -1
- package/dist/host/react.js +13 -5
- package/dist/host/react.js.map +1 -1
- package/dist/host/session.d.ts +94 -1
- package/dist/host/session.d.ts.map +1 -1
- package/dist/host/session.js +103 -14
- package/dist/host/session.js.map +1 -1
- package/dist/host/theme.d.ts +14 -0
- package/dist/host/theme.d.ts.map +1 -0
- package/dist/host/theme.js +51 -0
- package/dist/host/theme.js.map +1 -0
- package/dist/host/view-runtime.generated.d.ts +2 -0
- package/dist/host/view-runtime.generated.d.ts.map +1 -0
- package/dist/host/view-runtime.generated.js +7 -0
- package/dist/host/view-runtime.generated.js.map +1 -0
- package/dist/host/view-source.d.ts +10 -0
- package/dist/host/view-source.d.ts.map +1 -0
- package/dist/host/view-source.js +44 -0
- package/dist/host/view-source.js.map +1 -0
- package/dist/host/view.d.ts +138 -0
- package/dist/host/view.d.ts.map +1 -0
- package/dist/host/view.js +381 -0
- package/dist/host/view.js.map +1 -0
- package/dist/host/views.d.ts +10 -0
- package/dist/host/views.d.ts.map +1 -0
- package/dist/host/views.js +15 -0
- package/dist/host/views.js.map +1 -0
- package/dist/host/worker-react.d.ts +57 -0
- package/dist/host/worker-react.d.ts.map +1 -0
- package/dist/host/worker-react.js +129 -0
- package/dist/host/worker-react.js.map +1 -0
- package/dist/host/worker-start.d.ts +66 -0
- package/dist/host/worker-start.d.ts.map +1 -0
- package/dist/host/worker-start.js +188 -0
- package/dist/host/worker-start.js.map +1 -0
- package/dist/host/worker.d.ts +28 -19
- package/dist/host/worker.d.ts.map +1 -1
- package/dist/host/worker.js +60 -119
- package/dist/host/worker.js.map +1 -1
- package/dist/host/writes.d.ts +49 -0
- package/dist/host/writes.d.ts.map +1 -0
- package/dist/host/writes.js +76 -0
- package/dist/host/writes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/open-kit.d.ts +148 -0
- package/dist/open-kit.d.ts.map +1 -0
- package/dist/open-kit.js +321 -0
- package/dist/open-kit.js.map +1 -0
- package/dist/protocol.d.ts +109 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +13 -0
- package/dist/protocol.js.map +1 -1
- package/dist/worker/harden.d.ts +13 -2
- package/dist/worker/harden.d.ts.map +1 -1
- package/dist/worker/harden.js +10 -4
- package/dist/worker/harden.js.map +1 -1
- package/dist/worker/natives.d.ts +1 -0
- package/dist/worker/natives.d.ts.map +1 -1
- package/dist/worker/natives.js +4 -0
- package/dist/worker/natives.js.map +1 -1
- package/dist/worker/view-global.d.ts +70 -0
- package/dist/worker/view-global.d.ts.map +1 -0
- package/dist/worker/view-global.js +264 -0
- package/dist/worker/view-global.js.map +1 -0
- package/dist/worker/view.d.ts +14 -0
- package/dist/worker/view.d.ts.map +1 -0
- package/dist/worker/view.js +64 -0
- package/dist/worker/view.js.map +1 -0
- package/package.json +30 -4
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { plainNode, readAcross } from "./session.js";
|
|
2
|
+
/** An act of a manifest, said in full. */
|
|
3
|
+
export function manifestActs(manifest) {
|
|
4
|
+
return (manifest.acts ?? []).map((one) => (typeof one === "string" ? { act: one } : one));
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* WHAT IS WRONG WITH A MANIFEST, in sentences: a kind, an edge or an act the
|
|
8
|
+
* app does not declare, a name that is not a name. Empty when it is sound.
|
|
9
|
+
* A host refuses to mount a view whose manifest says anything here.
|
|
10
|
+
*/
|
|
11
|
+
export function checkManifest(manifest, store) {
|
|
12
|
+
const findings = [];
|
|
13
|
+
const kinds = new Set(store.schema.kinds);
|
|
14
|
+
const edges = new Set(store.schema.edgeKinds);
|
|
15
|
+
const acts = new Set(store.allMutations().map((mutation) => mutation.name));
|
|
16
|
+
if (typeof manifest.name !== "string" || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(manifest.name))
|
|
17
|
+
findings.push(`The view's name "${String(manifest.name)}" is not lower-case letters, digits and hyphens.`);
|
|
18
|
+
if (manifest.title !== undefined && (typeof manifest.title !== "string" || manifest.title.trim() === "" || manifest.title.length > 80))
|
|
19
|
+
findings.push("The view's title is empty or longer than 80 characters.");
|
|
20
|
+
if (manifest.attach !== "home" && !kinds.has(manifest.attach))
|
|
21
|
+
findings.push(`The view attaches to "${manifest.attach}", which is no kind of this app.`);
|
|
22
|
+
if (manifest.cardinality !== "one" && manifest.cardinality !== "many")
|
|
23
|
+
findings.push(`The view's cardinality is "${String(manifest.cardinality)}", not one or many.`);
|
|
24
|
+
if (manifest.attach === "home" && manifest.cardinality !== "many")
|
|
25
|
+
findings.push("A view of the home draws many records: its cardinality is many.");
|
|
26
|
+
for (const kind of manifest.reads?.kinds ?? [])
|
|
27
|
+
if (!kinds.has(kind))
|
|
28
|
+
findings.push(`The view reads "${kind}", which is no kind of this app.`);
|
|
29
|
+
for (const edge of manifest.reads?.edges ?? [])
|
|
30
|
+
if (!edges.has(edge))
|
|
31
|
+
findings.push(`The view reads the edge "${edge}", which no kind of this app declares.`);
|
|
32
|
+
const named = new Set();
|
|
33
|
+
for (const one of manifestActs(manifest)) {
|
|
34
|
+
if (!acts.has(one.act))
|
|
35
|
+
findings.push(`The view asks for the act "${one.act}", which this app does not declare.`);
|
|
36
|
+
const as = one.as ?? one.act;
|
|
37
|
+
if (named.has(as))
|
|
38
|
+
findings.push(`Two of the view's acts are called "${as}".`);
|
|
39
|
+
named.add(as);
|
|
40
|
+
}
|
|
41
|
+
return findings;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* WHAT A WORKER VIEW IS HANDED: the viewer's sight, limited to its manifest.
|
|
45
|
+
* For a kind, the record (`one`) or the members (`many`; every member the
|
|
46
|
+
* viewer sees when the face names none); for the home, nothing of its own.
|
|
47
|
+
* Then every record of the kinds it reads, and the edges of the kinds it
|
|
48
|
+
* reads among all of those — every one read through `seenBy(principal)`.
|
|
49
|
+
*/
|
|
50
|
+
export function workerViewProps(store, principal, given) {
|
|
51
|
+
const { manifest } = given;
|
|
52
|
+
const input = given.input ?? {};
|
|
53
|
+
const seen = store.seenBy(principal);
|
|
54
|
+
const graph = seen.graph;
|
|
55
|
+
const attached = manifest.attach === "home" ? undefined : manifest.attach;
|
|
56
|
+
const node = attached && manifest.cardinality === "one" && input.node ? graph.getNode(input.node.id) : undefined;
|
|
57
|
+
const own = node && node.kind === attached ? [node] : [];
|
|
58
|
+
const members = attached && manifest.cardinality === "many"
|
|
59
|
+
? input.nodes
|
|
60
|
+
? input.nodes.flatMap((member) => {
|
|
61
|
+
const found = graph.getNode(member.id);
|
|
62
|
+
return found && found.kind === attached ? [found] : [];
|
|
63
|
+
})
|
|
64
|
+
: graph.nodesOfKind(attached)
|
|
65
|
+
: [];
|
|
66
|
+
/* What it reads across kinds (session.ts's `readAcross`, the frame guest's rule too): a view of many never reads more of its own kind than the face handed it. */
|
|
67
|
+
const ownIds = new Set([...own, ...members].map((one) => one.id));
|
|
68
|
+
const read = readAcross(graph, ownIds, { kinds: (manifest.reads?.kinds ?? []).filter((kind) => kind !== attached || manifest.cardinality === "one"), edges: manifest.reads?.edges ?? [] });
|
|
69
|
+
const listed = new Map();
|
|
70
|
+
for (const one of [...members, ...read.nodes])
|
|
71
|
+
if (!own.some((mine) => mine.id === one.id))
|
|
72
|
+
listed.set(one.id, one);
|
|
73
|
+
const shown = new Set([...own.map((one) => one.id), ...listed.keys()]);
|
|
74
|
+
const edges = [...read.edges];
|
|
75
|
+
const declared = new Set(manifestActs(manifest).map((one) => one.act));
|
|
76
|
+
const acts = store
|
|
77
|
+
.permittedMutations(principal)
|
|
78
|
+
.filter((mutation) => declared.has(mutation.name))
|
|
79
|
+
.map((mutation) => ({
|
|
80
|
+
name: mutation.name,
|
|
81
|
+
title: mutation.title ?? mutation.name,
|
|
82
|
+
...(mutation.description !== undefined ? { description: mutation.description } : {}),
|
|
83
|
+
...(mutation.subject ? { subject: { kinds: mutation.subject.kinds, arg: mutation.subject.arg } } : {}),
|
|
84
|
+
}));
|
|
85
|
+
const visible = (ids) => ids?.filter((id) => shown.has(id));
|
|
86
|
+
return {
|
|
87
|
+
view: manifest.name,
|
|
88
|
+
...(own[0] ? { node: plainNode(store, own[0]) } : {}),
|
|
89
|
+
nodes: [...listed.values()].map((one) => plainNode(store, one)),
|
|
90
|
+
edges,
|
|
91
|
+
...(manifest.title !== undefined ? { label: manifest.title } : input.label !== undefined ? { label: input.label } : {}),
|
|
92
|
+
cardinality: manifest.cardinality,
|
|
93
|
+
...(input.fidelity !== undefined ? { fidelity: input.fidelity } : {}),
|
|
94
|
+
...(input.mode !== undefined ? { mode: input.mode } : {}),
|
|
95
|
+
...(input.selected !== undefined ? { selected: input.selected } : {}),
|
|
96
|
+
...(input.implicated ? { implicated: visible(input.implicated) } : {}),
|
|
97
|
+
...(input.flagged ? { flagged: visible(input.flagged) } : {}),
|
|
98
|
+
acts,
|
|
99
|
+
...(given.theme ? { theme: given.theme } : {}),
|
|
100
|
+
...(given.places ? { places: given.places.map(({ as, title, kind }) => ({ as, title, kind })) } : {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/host/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { GuestDomEvent } from "../protocol.js";
|
|
2
|
+
import { type CssRefusal } from "./css.js";
|
|
3
|
+
import type { OpenNamespace, OpenRefusal } from "./open-judge.js";
|
|
4
|
+
import { type OpenRenderer } from "./open-render.js";
|
|
5
|
+
/** The host's own rules for the region: what a view's stylesheet cannot reach, because it cannot write `:host`. */
|
|
6
|
+
export declare const REGION_CSS = "\n:host { display: block; position: relative; contain: layout paint style; isolation: isolate; overflow: clip; min-width: 0; }\n[data-graview-view-root] { color: var(--graview-ink, CanvasText); font-family: var(--graview-font-body, system-ui, sans-serif); line-height: 1.45; }\n[data-graview-view-root] [data-graview-link] { cursor: pointer; }\n";
|
|
7
|
+
export interface OpenDrawingOptions {
|
|
8
|
+
/** The host page's origin, for a `blob:` image of its own. */
|
|
9
|
+
readonly origin: string;
|
|
10
|
+
readonly maxNodes?: number;
|
|
11
|
+
readonly onOverBudget?: () => void;
|
|
12
|
+
/** Tell the view what the viewer did. */
|
|
13
|
+
readonly send: (message: GuestDomEvent) => void;
|
|
14
|
+
readonly decorate?: (element: Element, name: string, namespace: OpenNamespace) => void;
|
|
15
|
+
readonly onFieldSet?: (field: Element) => void;
|
|
16
|
+
readonly onAttribute?: (element: Element, name: string) => void;
|
|
17
|
+
/**
|
|
18
|
+
* The viewer did something on what the view drew, before the view is
|
|
19
|
+
* told: the host's own handling (a press bound to an act, a link), in the
|
|
20
|
+
* event's own handler. What it returns goes with what the view is told
|
|
21
|
+
* (`pressed`); `false` keeps the view from being told.
|
|
22
|
+
*/
|
|
23
|
+
readonly before?: (event: Event, element: Element, root: Element) => Partial<GuestDomEvent> | false | void;
|
|
24
|
+
}
|
|
25
|
+
export type ViewRefusal = OpenRefusal | {
|
|
26
|
+
readonly reason: "css";
|
|
27
|
+
readonly name: "stylesheet";
|
|
28
|
+
readonly css: CssRefusal;
|
|
29
|
+
};
|
|
30
|
+
export interface OpenDrawing {
|
|
31
|
+
/** Draw one batch of the view's mutation records; false if `spent` stopped it partway (OpenRenderer.apply). */
|
|
32
|
+
apply(records: unknown, spent?: () => boolean): boolean;
|
|
33
|
+
/** Draw the view's one stylesheet, as the open kit allows it. */
|
|
34
|
+
style(css: string): void;
|
|
35
|
+
readonly renderer: OpenRenderer;
|
|
36
|
+
/** What was refused of the drawing and the stylesheet (the last 200 of each). */
|
|
37
|
+
readonly refused: readonly ViewRefusal[];
|
|
38
|
+
/** The stylesheet as drawn. */
|
|
39
|
+
readonly css: string;
|
|
40
|
+
dispose(): void;
|
|
41
|
+
}
|
|
42
|
+
/** Draw into `shadow`: the host's region rules, the view's stylesheet, and the view's drawing under one root. */
|
|
43
|
+
export declare function createOpenDrawing(shadow: ShadowRoot, options: OpenDrawingOptions): OpenDrawing;
|
|
44
|
+
//# sourceMappingURL=open-draw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-draw.d.ts","sourceRoot":"","sources":["../../src/host/open-draw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUzE,mHAAmH;AACnH,eAAO,MAAM,UAAU,8VAItB,CAAC;AAMF,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACvF,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;CAC5G;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1H,MAAM,WAAW,WAAW;IAC1B,+GAA+G;IAC/G,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC;IACxD,iEAAiE;IACjE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,iHAAiH;AACjH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAiF9F"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { sanitizeStylesheet } from "./css.js";
|
|
2
|
+
import { createOpenRenderer } from "./open-render.js";
|
|
3
|
+
/*
|
|
4
|
+
* A WORKER VIEW'S REGION, DRAWN (FR-90): the open kit's renderer and
|
|
5
|
+
* stylesheet in a shadow root the host owns, and the viewer's clicks,
|
|
6
|
+
* typing and choices on what was drawn told to the view. This module is
|
|
7
|
+
* what `mountWorkerView` fetches when it first draws an open-kit view, so a
|
|
8
|
+
* page that draws none loads none of the sanitiser.
|
|
9
|
+
*/
|
|
10
|
+
/** The host's own rules for the region: what a view's stylesheet cannot reach, because it cannot write `:host`. */
|
|
11
|
+
export const REGION_CSS = `
|
|
12
|
+
:host { display: block; position: relative; contain: layout paint style; isolation: isolate; overflow: clip; min-width: 0; }
|
|
13
|
+
[data-graview-view-root] { color: var(--graview-ink, CanvasText); font-family: var(--graview-font-body, system-ui, sans-serif); line-height: 1.45; }
|
|
14
|
+
[data-graview-view-root] [data-graview-link] { cursor: pointer; }
|
|
15
|
+
`;
|
|
16
|
+
/** The keys a view hears: enough to move and choose, never what the viewer types into the app elsewhere. */
|
|
17
|
+
const KEYS = new Set(["Enter", " ", "Escape", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Home", "End"]);
|
|
18
|
+
const EVENTS = ["click", "input", "change", "keydown"];
|
|
19
|
+
/** Draw into `shadow`: the host's region rules, the view's stylesheet, and the view's drawing under one root. */
|
|
20
|
+
export function createOpenDrawing(shadow, options) {
|
|
21
|
+
const document = shadow.ownerDocument;
|
|
22
|
+
const base = document.createElement("style");
|
|
23
|
+
base.setAttribute("data-graview-region", "");
|
|
24
|
+
base.textContent = REGION_CSS;
|
|
25
|
+
const sheet = document.createElement("style");
|
|
26
|
+
sheet.setAttribute("data-graview-view-style", "");
|
|
27
|
+
const into = document.createElement("div");
|
|
28
|
+
into.setAttribute("data-graview-view-root", "");
|
|
29
|
+
shadow.append(base, sheet, into);
|
|
30
|
+
const renderer = createOpenRenderer(into, {
|
|
31
|
+
origin: options.origin,
|
|
32
|
+
...(options.maxNodes !== undefined ? { maxNodes: options.maxNodes } : {}),
|
|
33
|
+
...(options.onOverBudget ? { onOverBudget: options.onOverBudget } : {}),
|
|
34
|
+
decorate: (element, name, namespace) => {
|
|
35
|
+
/* A button presses, and never submits; a field is never filled from what the browser remembers of the viewer. */
|
|
36
|
+
if (namespace === "html" && name === "button")
|
|
37
|
+
element.setAttribute("type", "button");
|
|
38
|
+
if (namespace === "html" && (name === "input" || name === "textarea" || name === "select"))
|
|
39
|
+
element.setAttribute("autocomplete", "off");
|
|
40
|
+
options.decorate?.(element, name, namespace);
|
|
41
|
+
},
|
|
42
|
+
...(options.onFieldSet ? { onFieldSet: options.onFieldSet } : {}),
|
|
43
|
+
...(options.onAttribute ? { onAttribute: options.onAttribute } : {}),
|
|
44
|
+
});
|
|
45
|
+
const cssRefused = [];
|
|
46
|
+
let css = "";
|
|
47
|
+
/** The nearest element the view drew, at or above where it happened. */
|
|
48
|
+
const drawnAt = (event) => {
|
|
49
|
+
for (let at = event.composedPath()[0]; at && at !== into && at !== shadow; at = at.parentNode) {
|
|
50
|
+
if (at.nodeType === 1 && renderer.idOf(at) !== undefined)
|
|
51
|
+
return at;
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
};
|
|
55
|
+
const hear = (event) => {
|
|
56
|
+
const element = drawnAt(event);
|
|
57
|
+
if (!element)
|
|
58
|
+
return;
|
|
59
|
+
if (event.type === "keydown" && !KEYS.has(event.key))
|
|
60
|
+
return;
|
|
61
|
+
const said = options.before?.(event, element, into);
|
|
62
|
+
if (said === false)
|
|
63
|
+
return;
|
|
64
|
+
const field = element;
|
|
65
|
+
const isField = element.namespaceURI === "http://www.w3.org/1999/xhtml" && ["input", "select", "textarea"].includes(element.localName);
|
|
66
|
+
options.send({
|
|
67
|
+
type: "dom-event",
|
|
68
|
+
target: renderer.idOf(element),
|
|
69
|
+
event: event.type,
|
|
70
|
+
...(isField ? { value: String(field.value ?? "") } : {}),
|
|
71
|
+
...(isField && (field.type === "checkbox" || field.type === "radio") ? { checked: field.checked } : {}),
|
|
72
|
+
...(event.type === "keydown" ? { key: event.key } : {}),
|
|
73
|
+
...(said ?? {}),
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
for (const type of EVENTS)
|
|
77
|
+
shadow.addEventListener(type, hear);
|
|
78
|
+
/* `toggle` does not bubble: heard on the way down. */
|
|
79
|
+
shadow.addEventListener("toggle", hear, true);
|
|
80
|
+
return {
|
|
81
|
+
apply: (records, spent) => renderer.apply(records, spent),
|
|
82
|
+
style(given) {
|
|
83
|
+
const judged = sanitizeStylesheet(given);
|
|
84
|
+
for (const one of judged.refused) {
|
|
85
|
+
cssRefused.push({ reason: "css", name: "stylesheet", css: one });
|
|
86
|
+
if (cssRefused.length > 200)
|
|
87
|
+
cssRefused.shift();
|
|
88
|
+
}
|
|
89
|
+
css = judged.css;
|
|
90
|
+
sheet.textContent = css;
|
|
91
|
+
},
|
|
92
|
+
renderer,
|
|
93
|
+
get refused() {
|
|
94
|
+
return [...renderer.refused, ...cssRefused];
|
|
95
|
+
},
|
|
96
|
+
get css() {
|
|
97
|
+
return css;
|
|
98
|
+
},
|
|
99
|
+
dispose() {
|
|
100
|
+
for (const type of EVENTS)
|
|
101
|
+
shadow.removeEventListener(type, hear);
|
|
102
|
+
shadow.removeEventListener("toggle", hear, true);
|
|
103
|
+
renderer.dispose();
|
|
104
|
+
shadow.replaceChildren();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=open-draw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-draw.js","sourceRoot":"","sources":["../../src/host/open-draw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type CssRefusal } from "./css.js";
|
|
2
|
+
export type OpenNamespace = "html" | "svg";
|
|
3
|
+
/** Why part of what a view drew was not drawn. */
|
|
4
|
+
export type OpenRefusalReason =
|
|
5
|
+
/** An element outside the open kit, or in a place it may not stand (HTML inside SVG). */
|
|
6
|
+
"element"
|
|
7
|
+
/** An attribute its element does not take (`src` outside `img`, `href`, `srcset`, `on*`, `formaction`, …). */
|
|
8
|
+
| "attribute"
|
|
9
|
+
/** A value of the wrong kind: not a number, not on the list, a role the app's chrome speaks with. */
|
|
10
|
+
| "value"
|
|
11
|
+
/** An address: an image not `data:` or the host's own `blob:`, a reference not `#id`. */
|
|
12
|
+
| "url"
|
|
13
|
+
/** CSS refused, in a `style` attribute, a presentation attribute or the stylesheet: `css` says what. */
|
|
14
|
+
| "css"
|
|
15
|
+
/** A child its element may not hold. */
|
|
16
|
+
| "child"
|
|
17
|
+
/** A record the format does not know, or one about a node that is not drawn. */
|
|
18
|
+
| "record"
|
|
19
|
+
/** More nodes than the view is allowed. */
|
|
20
|
+
| "budget";
|
|
21
|
+
export interface OpenRefusal {
|
|
22
|
+
readonly reason: OpenRefusalReason;
|
|
23
|
+
readonly element?: string;
|
|
24
|
+
readonly name?: string;
|
|
25
|
+
readonly css?: CssRefusal;
|
|
26
|
+
}
|
|
27
|
+
/** An element as the host draws it, or a refusal. */
|
|
28
|
+
export declare function judgeElement(name: string, parent: OpenNamespace): {
|
|
29
|
+
readonly namespace: OpenNamespace;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly as?: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly refused: OpenRefusal;
|
|
34
|
+
};
|
|
35
|
+
/** Whether an element holds nothing (`img`, `input`, `br`). */
|
|
36
|
+
export declare function isEmptyElement(namespace: OpenNamespace, name: string): boolean;
|
|
37
|
+
export interface JudgeContext {
|
|
38
|
+
/** The host page's origin, for a `blob:` image of its own. "null" in an opaque origin. */
|
|
39
|
+
readonly origin: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* An attribute as the host draws it: its canonical name and value, `null`
|
|
43
|
+
* to draw it removed, or a refusal. A value the view sets to `null` (Remote
|
|
44
|
+
* DOM's removal) is always a removal.
|
|
45
|
+
*/
|
|
46
|
+
export declare function judgeAttribute(namespace: OpenNamespace, element: string, name: string, value: string | null, context: JudgeContext): {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly value: string | null;
|
|
49
|
+
readonly dropped?: readonly OpenRefusal[];
|
|
50
|
+
} | {
|
|
51
|
+
readonly refused: OpenRefusal;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=open-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-judge.d.ts","sourceRoot":"","sources":["../../src/host/open-judge.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAQhF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC;AAE3C,kDAAkD;AAClD,MAAM,MAAM,iBAAiB;AAC3B,yFAAyF;AACvF,SAAS;AACX,8GAA8G;GAC5G,WAAW;AACb,qGAAqG;GACnG,OAAO;AACT,yFAAyF;GACvF,KAAK;AACP,wGAAwG;GACtG,KAAK;AACP,wCAAwC;GACtC,OAAO;AACT,gFAAgF;GAC9E,QAAQ;AACV,2CAA2C;GACzC,QAAQ,CAAC;AAEb,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAUxL;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9E;AAQD,MAAM,WAAW,YAAY;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,OAAO,EAAE,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAYzI"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { HTML_DRAWN_AS, HTML_ELEMENTS, OPEN_MAX_ATTRIBUTE, OPEN_MAX_GEOMETRY, OPEN_MAX_IMAGE, REFUSED_ROLES, SVG_ELEMENTS, UNNAMED_ELEMENTS, openAttribute, svgElementName, } from "../open-kit.js";
|
|
2
|
+
import { sanitizeDeclarations, sanitizeValue } from "./css.js";
|
|
3
|
+
/** An element as the host draws it, or a refusal. */
|
|
4
|
+
export function judgeElement(name, parent) {
|
|
5
|
+
if (parent === "svg") {
|
|
6
|
+
const canonical = svgElementName(name);
|
|
7
|
+
return canonical ? { namespace: "svg", name: canonical } : { refused: { reason: "element", element: name } };
|
|
8
|
+
}
|
|
9
|
+
const lower = name.toLowerCase();
|
|
10
|
+
if (lower === "svg")
|
|
11
|
+
return { namespace: "svg", name: "svg" };
|
|
12
|
+
if (!Object.prototype.hasOwnProperty.call(HTML_ELEMENTS, lower))
|
|
13
|
+
return { refused: { reason: "element", element: name } };
|
|
14
|
+
/* A landmark's or a notice's element is drawn as one with no role of its own (HTML_DRAWN_AS), and says what it was asked to be (`data-graview-as`). */
|
|
15
|
+
return Object.prototype.hasOwnProperty.call(HTML_DRAWN_AS, lower) ? { namespace: "html", name: HTML_DRAWN_AS[lower], as: lower } : { namespace: "html", name: lower };
|
|
16
|
+
}
|
|
17
|
+
/** Whether an element holds nothing (`img`, `input`, `br`). */
|
|
18
|
+
export function isEmptyElement(namespace, name) {
|
|
19
|
+
return (namespace === "html" ? HTML_ELEMENTS[name] : SVG_ELEMENTS[name])?.empty === true;
|
|
20
|
+
}
|
|
21
|
+
const NUMBER = /^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/;
|
|
22
|
+
/* SVG geometry and transforms: numbers, path letters, commas, brackets and the transform words; never `url`. */
|
|
23
|
+
const GEOMETRY = /^[0-9A-Za-z\s.,+\-%()]*$/;
|
|
24
|
+
const FRAGMENT = /^#[A-Za-z_][A-Za-z0-9_.:-]*$/;
|
|
25
|
+
const DATA_IMAGE = /^data:image\/(png|gif|jpeg|webp|avif|bmp|svg\+xml)(;[A-Za-z0-9=._+-]+)*,/i;
|
|
26
|
+
/**
|
|
27
|
+
* An attribute as the host draws it: its canonical name and value, `null`
|
|
28
|
+
* to draw it removed, or a refusal. A value the view sets to `null` (Remote
|
|
29
|
+
* DOM's removal) is always a removal.
|
|
30
|
+
*/
|
|
31
|
+
export function judgeAttribute(namespace, element, name, value, context) {
|
|
32
|
+
const found = openAttribute(namespace, element, name);
|
|
33
|
+
if (!found)
|
|
34
|
+
return { refused: { reason: "attribute", element, name } };
|
|
35
|
+
/* A named section is a region landmark: a section is never named, so it stays a section. */
|
|
36
|
+
if (namespace === "html" && UNNAMED_ELEMENTS[element]?.includes(found.name))
|
|
37
|
+
return { refused: { reason: "attribute", element, name } };
|
|
38
|
+
if (value === null)
|
|
39
|
+
return { name: found.name, value: null };
|
|
40
|
+
const judged = judgeValue(found.name, found.kind, value, context);
|
|
41
|
+
if ("refused" in judged)
|
|
42
|
+
return { refused: { ...judged.refused, element } };
|
|
43
|
+
/* What the app's chrome and notices speak with stays the app's (ADR 0007: a view never uses the app's bar or notices). */
|
|
44
|
+
if (found.name === "role" && judged.value.split(/\s+/).some((role) => REFUSED_ROLES.includes(role.toLowerCase())))
|
|
45
|
+
return { refused: { reason: "value", element, name } };
|
|
46
|
+
if (found.name === "aria-live" && !["polite", "off"].includes(judged.value.toLowerCase()))
|
|
47
|
+
return { refused: { reason: "value", element, name } };
|
|
48
|
+
return { name: found.name, value: judged.value, ...(judged.dropped ? { dropped: judged.dropped.map((css) => ({ reason: css.reason === "url" ? "url" : "css", element, name: found.name, css })) } : {}) };
|
|
49
|
+
}
|
|
50
|
+
function judgeValue(name, kind, value, context) {
|
|
51
|
+
const refused = (reason, css) => ({ refused: { reason, name, ...(css ? { css } : {}) } });
|
|
52
|
+
if (kind === "geometry") {
|
|
53
|
+
if (value.length > OPEN_MAX_GEOMETRY || !GEOMETRY.test(value) || /url/i.test(value))
|
|
54
|
+
return refused("value");
|
|
55
|
+
return { value };
|
|
56
|
+
}
|
|
57
|
+
if (kind === "image") {
|
|
58
|
+
if (value.length > OPEN_MAX_IMAGE)
|
|
59
|
+
return refused("url");
|
|
60
|
+
if (DATA_IMAGE.test(value))
|
|
61
|
+
return { value };
|
|
62
|
+
/* A blob: of the host's own page: it is in the page's memory already, and loading it asks nobody. */
|
|
63
|
+
if (value.startsWith(`blob:${context.origin}/`) && /^blob:[^\s"'<>]+$/.test(value))
|
|
64
|
+
return { value };
|
|
65
|
+
return refused("url");
|
|
66
|
+
}
|
|
67
|
+
if (value.length > OPEN_MAX_ATTRIBUTE)
|
|
68
|
+
return refused("value");
|
|
69
|
+
if (typeof kind === "object") {
|
|
70
|
+
const one = kind.oneOf.find((option) => option.toLowerCase() === value.toLowerCase());
|
|
71
|
+
return one === undefined ? refused("value") : { value: one };
|
|
72
|
+
}
|
|
73
|
+
switch (kind) {
|
|
74
|
+
case "text":
|
|
75
|
+
return { value };
|
|
76
|
+
case "number":
|
|
77
|
+
return NUMBER.test(value.trim()) && Number.isFinite(Number(value)) ? { value: value.trim() } : refused("value");
|
|
78
|
+
case "boolean":
|
|
79
|
+
return { value: "" };
|
|
80
|
+
case "fragment":
|
|
81
|
+
return FRAGMENT.test(value) ? { value } : refused("url");
|
|
82
|
+
case "style": {
|
|
83
|
+
const judged = sanitizeDeclarations(value, OPEN_MAX_ATTRIBUTE);
|
|
84
|
+
if (judged.refused.length > 0 && judged.css === "")
|
|
85
|
+
return refused(judged.refused[0].reason === "url" ? "url" : "css", judged.refused[0]);
|
|
86
|
+
/* What was kept is drawn; what was not is written down beside it. */
|
|
87
|
+
return { value: judged.css, ...(judged.refused.length > 0 ? { dropped: judged.refused } : {}) };
|
|
88
|
+
}
|
|
89
|
+
case "css": {
|
|
90
|
+
const judged = sanitizeValue(name, value);
|
|
91
|
+
return "refused" in judged ? refused(judged.refused.reason === "url" ? "url" : "css", judged.refused) : { value: judged.value };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=open-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-judge.js","sourceRoot":"","sources":["../../src/host/open-judge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,cAAc,GAEf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAmB,MAAM,UAAU,CAAC;AAoChF,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAqB;IAC9D,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC/G,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC1H,uJAAuJ;IACvJ,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzK,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,SAAwB,EAAE,IAAY;IACnE,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,MAAM,GAAG,yCAAyC,CAAC;AACzD,gHAAgH;AAChH,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAC5C,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAChD,MAAM,UAAU,GAAG,2EAA2E,CAAC;AAO/F;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAwB,EACxB,OAAe,EACf,IAAY,EACZ,KAAoB,EACpB,OAAqB;IAErB,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACvE,4FAA4F;IAC5F,IAAI,SAAS,KAAK,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACxI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;IAC5E,0HAA0H;IAC1H,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,aAAmC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACjM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAClJ,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAE,KAAe,CAAC,CAAC,CAAE,KAAe,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClO,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,IAAmB,EAAE,KAAa,EAAE,OAAqB;IACzF,MAAM,OAAO,GAAG,CAAC,MAAyB,EAAE,GAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1H,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7G,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,qGAAqG;QACrG,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrG,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC/D,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClH,KAAK,SAAS;YACZ,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3D,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3I,qEAAqE;YACrE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAClG,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAClI,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type JudgeContext, type OpenNamespace, type OpenRefusal } from "./open-judge.js";
|
|
2
|
+
export interface OpenRendererOptions extends JudgeContext {
|
|
3
|
+
/** The most nodes a view may have drawn at once. 5 000 by default. */
|
|
4
|
+
readonly maxNodes?: number;
|
|
5
|
+
/** The view went past `maxNodes`. Called once. */
|
|
6
|
+
readonly onOverBudget?: () => void;
|
|
7
|
+
/** An element was made, with its first attributes: the host's chance to set what is its own on it (a button's type, a link's role). */
|
|
8
|
+
readonly decorate?: (element: Element, name: string, namespace: OpenNamespace) => void;
|
|
9
|
+
/** An attribute the view gave was drawn, or taken away. */
|
|
10
|
+
readonly onAttribute?: (element: Element, name: string) => void;
|
|
11
|
+
/** The view set what a field holds (its `value`, `checked`, `selected`, or a textarea's text): it is no longer what the person typed. */
|
|
12
|
+
readonly onFieldSet?: (field: Element) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface OpenRenderer {
|
|
15
|
+
/**
|
|
16
|
+
* Draw one batch. `spent`, asked between records, says the host's time
|
|
17
|
+
* for drawing this view has run out: the rest of the batch is not drawn,
|
|
18
|
+
* and `apply` says false.
|
|
19
|
+
*/
|
|
20
|
+
apply(records: unknown, spent?: () => boolean): boolean;
|
|
21
|
+
/** What was refused, oldest first (the last 200). */
|
|
22
|
+
readonly refused: readonly OpenRefusal[];
|
|
23
|
+
/** How many nodes are drawn. */
|
|
24
|
+
readonly size: number;
|
|
25
|
+
/** The view's id for a node the host drew, for an event to name. */
|
|
26
|
+
idOf(node: Node): string | undefined;
|
|
27
|
+
/** The element the host drew for a view's id. */
|
|
28
|
+
elementOf(id: string): Element | undefined;
|
|
29
|
+
dispose(): void;
|
|
30
|
+
}
|
|
31
|
+
export declare function createOpenRenderer(into: Node, options: OpenRendererOptions): OpenRenderer;
|
|
32
|
+
//# sourceMappingURL=open-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-render.d.ts","sourceRoot":"","sources":["../../src/host/open-render.ts"],"names":[],"mappings":"AACA,OAAO,EAAgD,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA0BxI,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,uIAAuI;IACvI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACvF,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,yIAAyI;IACzI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC;IACxD,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,iDAAiD;IACjD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB;AAkBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAwMzF"}
|