@nextwebwg/html-next 1.0.0-alpha.1
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 +26 -0
- package/dist/ast.d.ts +7 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/browser-loader.bundle.js +9 -0
- package/dist/browser-loader.d.ts +35 -0
- package/dist/browser-loader.d.ts.map +1 -0
- package/dist/browser-loader.js +83 -0
- package/dist/browser-loader.js.map +1 -0
- package/dist/browser-source.d.ts +10 -0
- package/dist/browser-source.d.ts.map +1 -0
- package/dist/browser-source.js +97 -0
- package/dist/browser-source.js.map +1 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +9 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +31 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/component-styles-build.d.ts +11 -0
- package/dist/component-styles-build.d.ts.map +1 -0
- package/dist/component-styles-build.js +74 -0
- package/dist/component-styles-build.js.map +1 -0
- package/dist/component-styles.d.ts +37 -0
- package/dist/component-styles.d.ts.map +1 -0
- package/dist/component-styles.js +236 -0
- package/dist/component-styles.js.map +1 -0
- package/dist/contract-platform.d.ts +5 -0
- package/dist/contract-platform.d.ts.map +1 -0
- package/dist/contract-platform.js +8 -0
- package/dist/contract-platform.js.map +1 -0
- package/dist/contract.d.ts +14 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +234 -0
- package/dist/contract.js.map +1 -0
- package/dist/controller-files.d.ts +10 -0
- package/dist/controller-files.d.ts.map +1 -0
- package/dist/controller-files.js +54 -0
- package/dist/controller-files.js.map +1 -0
- package/dist/controller.d.ts +15 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.js +33 -0
- package/dist/controller.js.map +1 -0
- package/dist/data.d.ts +28 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +100 -0
- package/dist/data.js.map +1 -0
- package/dist/diagnostics.d.ts +11 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +13 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/expression.d.ts +80 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +474 -0
- package/dist/expression.js.map +1 -0
- package/dist/freeze.d.ts +2 -0
- package/dist/freeze.d.ts.map +1 -0
- package/dist/freeze.js +8 -0
- package/dist/freeze.js.map +1 -0
- package/dist/generate.d.ts +11 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +41 -0
- package/dist/generate.js.map +1 -0
- package/dist/generated/dom-properties.d.ts +8 -0
- package/dist/generated/dom-properties.d.ts.map +1 -0
- package/dist/generated/dom-properties.js +1410 -0
- package/dist/generated/dom-properties.js.map +1 -0
- package/dist/generated-runtime.d.ts +42 -0
- package/dist/generated-runtime.d.ts.map +1 -0
- package/dist/generated-runtime.js +266 -0
- package/dist/generated-runtime.js.map +1 -0
- package/dist/graph.d.ts +37 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +81 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/language.d.ts +7 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +43 -0
- package/dist/language.js.map +1 -0
- package/dist/names.d.ts +4 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +19 -0
- package/dist/names.js.map +1 -0
- package/dist/node-loader.d.ts +22 -0
- package/dist/node-loader.d.ts.map +1 -0
- package/dist/node-loader.js +109 -0
- package/dist/node-loader.js.map +1 -0
- package/dist/package-config.d.ts +22 -0
- package/dist/package-config.d.ts.map +1 -0
- package/dist/package-config.js +2 -0
- package/dist/package-config.js.map +1 -0
- package/dist/package.d.ts +9 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +208 -0
- package/dist/package.js.map +1 -0
- package/dist/parser.d.ts +11 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +938 -0
- package/dist/parser.js.map +1 -0
- package/dist/platform.d.ts +3 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +26 -0
- package/dist/platform.js.map +1 -0
- package/dist/reactivity.d.ts +88 -0
- package/dist/reactivity.d.ts.map +1 -0
- package/dist/reactivity.js +594 -0
- package/dist/reactivity.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +39 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolve.d.ts +24 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +65 -0
- package/dist/resolve.js.map +1 -0
- package/dist/runtime.d.ts +110 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1926 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sanitize.d.ts +8 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +38 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/source-graph.d.ts +5 -0
- package/dist/source-graph.d.ts.map +1 -0
- package/dist/source-graph.js +60 -0
- package/dist/source-graph.js.map +1 -0
- package/dist/source-parser.d.ts +4 -0
- package/dist/source-parser.d.ts.map +1 -0
- package/dist/source-parser.js +38 -0
- package/dist/source-parser.js.map +1 -0
- package/dist/source.d.ts +4 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +6 -0
- package/dist/source.js.map +1 -0
- package/dist/targets/backend.d.ts +28 -0
- package/dist/targets/backend.d.ts.map +1 -0
- package/dist/targets/backend.js +42 -0
- package/dist/targets/backend.js.map +1 -0
- package/dist/targets/docs.d.ts +3 -0
- package/dist/targets/docs.d.ts.map +1 -0
- package/dist/targets/docs.js +85 -0
- package/dist/targets/docs.js.map +1 -0
- package/dist/targets/native-reactive.d.ts +41 -0
- package/dist/targets/native-reactive.d.ts.map +1 -0
- package/dist/targets/native-reactive.js +169 -0
- package/dist/targets/native-reactive.js.map +1 -0
- package/dist/targets/shared.d.ts +15 -0
- package/dist/targets/shared.d.ts.map +1 -0
- package/dist/targets/shared.js +122 -0
- package/dist/targets/shared.js.map +1 -0
- package/dist/targets/vanilla.d.ts +6 -0
- package/dist/targets/vanilla.d.ts.map +1 -0
- package/dist/targets/vanilla.js +442 -0
- package/dist/targets/vanilla.js.map +1 -0
- package/dist/targets/vue.d.ts +3 -0
- package/dist/targets/vue.d.ts.map +1 -0
- package/dist/targets/vue.js +577 -0
- package/dist/targets/vue.js.map +1 -0
- package/dist/template.d.ts +172 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +2 -0
- package/dist/template.js.map +1 -0
- package/dist/type-system.d.ts +80 -0
- package/dist/type-system.d.ts.map +1 -0
- package/dist/type-system.js +414 -0
- package/dist/type-system.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +38 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +297 -0
- package/dist/validate.js.map +1 -0
- package/dist/validation.d.ts +6 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +6 -0
- package/dist/validation.js.map +1 -0
- package/dist/validity-css.d.ts +6 -0
- package/dist/validity-css.d.ts.map +1 -0
- package/dist/validity-css.js +11 -0
- package/dist/validity-css.js.map +1 -0
- package/dist/validity.d.ts +45 -0
- package/dist/validity.d.ts.map +1 -0
- package/dist/validity.js +445 -0
- package/dist/validity.js.map +1 -0
- package/package.json +124 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/** The complete HTML Next value-type grammar and its canonical runtime representation. */
|
|
2
|
+
import { deepFreeze } from "./freeze.js";
|
|
3
|
+
const TERMINALS = new Set([
|
|
4
|
+
"string", "boolean", "number", "integer", "null", "absent",
|
|
5
|
+
"trusted-html", "trusted-script", "function", "unknown",
|
|
6
|
+
]);
|
|
7
|
+
export class TypeSyntaxError extends SyntaxError {
|
|
8
|
+
position;
|
|
9
|
+
constructor(message, position) {
|
|
10
|
+
super(`${message} at character ${position + 1}.`);
|
|
11
|
+
this.position = position;
|
|
12
|
+
this.name = "TypeSyntaxError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class Parser {
|
|
16
|
+
source;
|
|
17
|
+
#index = 0;
|
|
18
|
+
constructor(source) {
|
|
19
|
+
this.source = source;
|
|
20
|
+
}
|
|
21
|
+
parse() {
|
|
22
|
+
const result = this.#union();
|
|
23
|
+
this.#space();
|
|
24
|
+
if (this.#index !== this.source.length)
|
|
25
|
+
this.#error("Unexpected type syntax");
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
#union() {
|
|
29
|
+
const members = [this.#postfix()];
|
|
30
|
+
while (this.#take("|"))
|
|
31
|
+
members.push(this.#postfix());
|
|
32
|
+
return members.length === 1 ? members[0] : union(members);
|
|
33
|
+
}
|
|
34
|
+
#postfix() {
|
|
35
|
+
let type = this.#primary();
|
|
36
|
+
while (this.#take("?")) {
|
|
37
|
+
type = union([
|
|
38
|
+
type,
|
|
39
|
+
{ kind: "terminal", name: "null" },
|
|
40
|
+
{ kind: "terminal", name: "absent" },
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
return type;
|
|
44
|
+
}
|
|
45
|
+
#primary() {
|
|
46
|
+
if (this.#take("(")) {
|
|
47
|
+
const type = this.#union();
|
|
48
|
+
this.#expect(")");
|
|
49
|
+
return type;
|
|
50
|
+
}
|
|
51
|
+
const quoted = this.#quoted();
|
|
52
|
+
if (quoted !== undefined)
|
|
53
|
+
return { kind: "keyword", value: quoted };
|
|
54
|
+
const name = this.#identifier();
|
|
55
|
+
if (name === undefined)
|
|
56
|
+
this.#error("Expected a type, keyword, or group");
|
|
57
|
+
if (name === "list" || name === "record") {
|
|
58
|
+
this.#expect("(");
|
|
59
|
+
const nested = this.#union();
|
|
60
|
+
this.#expect(")");
|
|
61
|
+
return name === "list" ? { kind: "list", item: nested } : { kind: "record", value: nested };
|
|
62
|
+
}
|
|
63
|
+
if (name === "object")
|
|
64
|
+
return this.#object();
|
|
65
|
+
if (TERMINALS.has(name)) {
|
|
66
|
+
return { kind: "terminal", name: name };
|
|
67
|
+
}
|
|
68
|
+
return { kind: "keyword", value: name };
|
|
69
|
+
}
|
|
70
|
+
#object() {
|
|
71
|
+
this.#expect("(");
|
|
72
|
+
this.#expect("{");
|
|
73
|
+
const fields = [];
|
|
74
|
+
let open = false;
|
|
75
|
+
while (!this.#take("}")) {
|
|
76
|
+
this.#space();
|
|
77
|
+
if (this.source.startsWith("...", this.#index)) {
|
|
78
|
+
this.#index += 3;
|
|
79
|
+
open = true;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const name = this.#quoted() ?? this.#identifier();
|
|
83
|
+
if (name === undefined)
|
|
84
|
+
this.#error("Expected an object field or `...`");
|
|
85
|
+
const optional = this.#take("?");
|
|
86
|
+
this.#expect(":");
|
|
87
|
+
const type = this.#union();
|
|
88
|
+
if (fields.some((field) => field.name === name))
|
|
89
|
+
this.#error(`Duplicate object field \`${name}\``);
|
|
90
|
+
fields.push({ name, type, optional });
|
|
91
|
+
}
|
|
92
|
+
if (this.#take("}"))
|
|
93
|
+
break;
|
|
94
|
+
this.#expect(",");
|
|
95
|
+
if (open) {
|
|
96
|
+
this.#space();
|
|
97
|
+
if (!this.source.startsWith("}", this.#index))
|
|
98
|
+
this.#error("The open marker must be last");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this.#expect(")");
|
|
102
|
+
return { kind: "object", fields, open };
|
|
103
|
+
}
|
|
104
|
+
#identifier() {
|
|
105
|
+
this.#space();
|
|
106
|
+
const match = /^[A-Za-z_][A-Za-z0-9_-]*/.exec(this.source.slice(this.#index));
|
|
107
|
+
if (match === null)
|
|
108
|
+
return undefined;
|
|
109
|
+
this.#index += match[0].length;
|
|
110
|
+
return match[0];
|
|
111
|
+
}
|
|
112
|
+
#quoted() {
|
|
113
|
+
this.#space();
|
|
114
|
+
const quote = this.source[this.#index];
|
|
115
|
+
if (quote !== "\"" && quote !== "'")
|
|
116
|
+
return undefined;
|
|
117
|
+
this.#index += 1;
|
|
118
|
+
let result = "";
|
|
119
|
+
while (this.#index < this.source.length) {
|
|
120
|
+
const character = this.source[this.#index++];
|
|
121
|
+
if (character === quote)
|
|
122
|
+
return result;
|
|
123
|
+
if (character !== "\\") {
|
|
124
|
+
result += character;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (this.#index >= this.source.length)
|
|
128
|
+
this.#error("Unterminated escape");
|
|
129
|
+
const escaped = this.source[this.#index++];
|
|
130
|
+
const escapes = {
|
|
131
|
+
"n": "\n", "r": "\r", "t": "\t", "\\": "\\", "\"": "\"", "'": "'",
|
|
132
|
+
};
|
|
133
|
+
result += escapes[escaped] ?? escaped;
|
|
134
|
+
}
|
|
135
|
+
this.#error("Unterminated quoted keyword");
|
|
136
|
+
}
|
|
137
|
+
#take(token) {
|
|
138
|
+
this.#space();
|
|
139
|
+
if (!this.source.startsWith(token, this.#index))
|
|
140
|
+
return false;
|
|
141
|
+
this.#index += token.length;
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
#expect(token) {
|
|
145
|
+
if (!this.#take(token))
|
|
146
|
+
this.#error(`Expected \`${token}\``);
|
|
147
|
+
}
|
|
148
|
+
#space() {
|
|
149
|
+
while (/\s/.test(this.source[this.#index] ?? ""))
|
|
150
|
+
this.#index += 1;
|
|
151
|
+
}
|
|
152
|
+
#error(message) {
|
|
153
|
+
throw new TypeSyntaxError(message, this.#index);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function union(members) {
|
|
157
|
+
const flat = members.flatMap((member) => member.kind === "union" ? member.members : [member]);
|
|
158
|
+
const unique = new Map(flat.map((member) => [formatType(member), member]));
|
|
159
|
+
const values = Array.from(unique.values());
|
|
160
|
+
return values.length === 1 ? values[0] : { kind: "union", members: values };
|
|
161
|
+
}
|
|
162
|
+
/** Parse an HTML Next type expression into an immutable semantic node. */
|
|
163
|
+
export function parseTypeExpression(source) {
|
|
164
|
+
if (source.trim() === "")
|
|
165
|
+
throw new TypeSyntaxError("A type expression cannot be empty", 0);
|
|
166
|
+
return deepFreeze(new Parser(source).parse());
|
|
167
|
+
}
|
|
168
|
+
export function isTypeNode(value) {
|
|
169
|
+
return typeof value === "object" && value !== null && "kind" in value &&
|
|
170
|
+
["terminal", "keyword", "union", "list", "record", "object"].includes(String(value.kind));
|
|
171
|
+
}
|
|
172
|
+
export function normalizeType(type) {
|
|
173
|
+
if (isTypeNode(type))
|
|
174
|
+
return type;
|
|
175
|
+
if (typeof type === "string")
|
|
176
|
+
return { kind: "terminal", name: type };
|
|
177
|
+
return union(type.enum.map((value) => ({ kind: "keyword", value })));
|
|
178
|
+
}
|
|
179
|
+
/** The canonical source spelling used by serializers, diagnostics, and generated docs. */
|
|
180
|
+
export function formatType(type) {
|
|
181
|
+
const node = isTypeNode(type) ? type : normalizeType(type);
|
|
182
|
+
switch (node.kind) {
|
|
183
|
+
case "terminal": return node.name;
|
|
184
|
+
case "keyword": return /^[A-Za-z_][A-Za-z0-9_-]*$/.test(node.value)
|
|
185
|
+
? node.value
|
|
186
|
+
: JSON.stringify(node.value);
|
|
187
|
+
case "union": return node.members.map((member) => formatType(member)).join(" | ");
|
|
188
|
+
case "list": return `list(${formatType(node.item)})`;
|
|
189
|
+
case "record": return `record(${formatType(node.value)})`;
|
|
190
|
+
case "object": return `object({ ${[
|
|
191
|
+
...node.fields.map((field) => `${field.name}${field.optional ? "?" : ""}: ${formatType(field.type)}`),
|
|
192
|
+
...(node.open ? ["..."] : []),
|
|
193
|
+
].join(", ")} })`;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function typeScriptType(type) {
|
|
197
|
+
const node = normalizeType(type);
|
|
198
|
+
switch (node.kind) {
|
|
199
|
+
case "terminal": {
|
|
200
|
+
const values = {
|
|
201
|
+
string: "string", boolean: "boolean", number: "number", integer: "number",
|
|
202
|
+
null: "null", absent: "undefined", "trusted-html": "TrustedHTML",
|
|
203
|
+
"trusted-script": "TrustedScript", "function": "(...args: readonly unknown[]) => unknown",
|
|
204
|
+
unknown: "unknown",
|
|
205
|
+
};
|
|
206
|
+
return values[node.name];
|
|
207
|
+
}
|
|
208
|
+
case "keyword": return JSON.stringify(node.value);
|
|
209
|
+
case "union": return node.members.map(typeScriptType).join(" | ");
|
|
210
|
+
case "list": return `readonly (${typeScriptType(node.item)})[]`;
|
|
211
|
+
case "record": return `Readonly<Record<string, ${typeScriptType(node.value)}>>`;
|
|
212
|
+
case "object": {
|
|
213
|
+
const fields = node.fields.map((field) => `${typescriptKey(field.name)}${field.optional ? "?" : ""}: ${typeScriptType(field.type)}`);
|
|
214
|
+
if (node.open)
|
|
215
|
+
fields.push("[name: string]: unknown");
|
|
216
|
+
return `{ readonly ${fields.join("; readonly ")} }`;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function typescriptKey(value) {
|
|
221
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value) ? value : JSON.stringify(value);
|
|
222
|
+
}
|
|
223
|
+
function issue(reason, message, path) {
|
|
224
|
+
return { ok: false, issues: [{ reason, message, path }] };
|
|
225
|
+
}
|
|
226
|
+
/** Canonical structured-value path spelling shared by every typed and schema diagnostic. */
|
|
227
|
+
export function childPath(path, key) {
|
|
228
|
+
if (typeof key === "number")
|
|
229
|
+
return `${path}[${key}]`;
|
|
230
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? `${path}.${key}` : `${path}[${JSON.stringify(key)}]`;
|
|
231
|
+
}
|
|
232
|
+
function plainObject(value) {
|
|
233
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
234
|
+
return false;
|
|
235
|
+
const prototype = Object.getPrototypeOf(value);
|
|
236
|
+
return prototype === Object.prototype || prototype === null;
|
|
237
|
+
}
|
|
238
|
+
function structuredInput(value) {
|
|
239
|
+
if (typeof value !== "string")
|
|
240
|
+
return value;
|
|
241
|
+
try {
|
|
242
|
+
return JSON.parse(value);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return Symbol.for("html-next.bad-json");
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function browserTrusted(value, type) {
|
|
249
|
+
if (typeof value !== "object" || value === null)
|
|
250
|
+
return false;
|
|
251
|
+
if (value.kind === type && "value" in value)
|
|
252
|
+
return true;
|
|
253
|
+
const expected = type === "trusted-html" ? "TrustedHTML" : "TrustedScript";
|
|
254
|
+
return value.constructor?.name === expected ||
|
|
255
|
+
Object.prototype.toString.call(value) === `[object ${expected}]`;
|
|
256
|
+
}
|
|
257
|
+
function parseTerminal(value, name, path) {
|
|
258
|
+
switch (name) {
|
|
259
|
+
case "string":
|
|
260
|
+
return typeof value === "string" ? { ok: true, value } : issue("typeMismatch", "Must be a string.", path);
|
|
261
|
+
case "boolean":
|
|
262
|
+
if (typeof value === "boolean")
|
|
263
|
+
return { ok: true, value };
|
|
264
|
+
if (value === "" || value === "true")
|
|
265
|
+
return { ok: true, value: true };
|
|
266
|
+
if (value === "false")
|
|
267
|
+
return { ok: true, value: false };
|
|
268
|
+
return issue("typeMismatch", "Must be true or false.", path);
|
|
269
|
+
case "number":
|
|
270
|
+
case "integer": {
|
|
271
|
+
const parsed = typeof value === "number" ? value :
|
|
272
|
+
typeof value === "string" && value.trim() !== "" ? Number(value) : Number.NaN;
|
|
273
|
+
if (!Number.isFinite(parsed))
|
|
274
|
+
return issue("badInput", `Must be ${name === "integer" ? "an integer" : "a finite number"}.`, path);
|
|
275
|
+
if (name === "integer" && !Number.isInteger(parsed))
|
|
276
|
+
return issue("typeMismatch", "Must be an integer.", path);
|
|
277
|
+
return { ok: true, value: parsed };
|
|
278
|
+
}
|
|
279
|
+
case "null": return value === null ? { ok: true, value: null } : issue("typeMismatch", "Must be null.", path);
|
|
280
|
+
case "absent": return value === undefined ? { ok: true, value: undefined } : issue("typeMismatch", "Must be absent.", path);
|
|
281
|
+
case "trusted-html":
|
|
282
|
+
case "trusted-script": return browserTrusted(value, name)
|
|
283
|
+
? { ok: true, value }
|
|
284
|
+
: issue("untrustedValue", `Must be a ${name === "trusted-html" ? "TrustedHTML" : "TrustedScript"} value.`, path);
|
|
285
|
+
case "function": return typeof value === "function"
|
|
286
|
+
? { ok: true, value }
|
|
287
|
+
: issue("typeMismatch", "Must be a function supplied through a property.", path);
|
|
288
|
+
case "unknown": return { ok: true, value };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function parseNode(value, node, path) {
|
|
292
|
+
switch (node.kind) {
|
|
293
|
+
case "terminal": return parseTerminal(value, node.name, path);
|
|
294
|
+
case "keyword": return value === node.value
|
|
295
|
+
? { ok: true, value }
|
|
296
|
+
: issue("typeMismatch", `Must be ${JSON.stringify(node.value)}.`, path);
|
|
297
|
+
case "union": {
|
|
298
|
+
for (const member of node.members) {
|
|
299
|
+
const result = parseNode(value, member, path);
|
|
300
|
+
if (result.ok)
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
return issue("typeMismatch", `Must match ${formatType(node)}.`, path);
|
|
304
|
+
}
|
|
305
|
+
case "list": {
|
|
306
|
+
const input = structuredInput(value);
|
|
307
|
+
if (!Array.isArray(input))
|
|
308
|
+
return issue("typeMismatch", "Must be a list.", path);
|
|
309
|
+
const output = [];
|
|
310
|
+
const issues = [];
|
|
311
|
+
input.forEach((item, index) => {
|
|
312
|
+
const result = parseNode(item, node.item, childPath(path, index));
|
|
313
|
+
if (result.ok)
|
|
314
|
+
output.push(result.value);
|
|
315
|
+
else
|
|
316
|
+
issues.push(...result.issues);
|
|
317
|
+
});
|
|
318
|
+
return issues.length === 0 ? { ok: true, value: output } : { ok: false, issues };
|
|
319
|
+
}
|
|
320
|
+
case "record": {
|
|
321
|
+
const input = structuredInput(value);
|
|
322
|
+
if (!plainObject(input))
|
|
323
|
+
return issue("typeMismatch", "Must be a string-keyed record.", path);
|
|
324
|
+
const output = {};
|
|
325
|
+
const issues = [];
|
|
326
|
+
for (const [key, item] of Object.entries(input)) {
|
|
327
|
+
const result = parseNode(item, node.value, childPath(path, key));
|
|
328
|
+
if (result.ok)
|
|
329
|
+
output[key] = result.value;
|
|
330
|
+
else
|
|
331
|
+
issues.push(...result.issues);
|
|
332
|
+
}
|
|
333
|
+
return issues.length === 0 ? { ok: true, value: output } : { ok: false, issues };
|
|
334
|
+
}
|
|
335
|
+
case "object": {
|
|
336
|
+
const input = structuredInput(value);
|
|
337
|
+
if (!plainObject(input))
|
|
338
|
+
return issue("typeMismatch", "Must be an object.", path);
|
|
339
|
+
const output = {};
|
|
340
|
+
const issues = [];
|
|
341
|
+
const fields = new Map(node.fields.map((field) => [field.name, field]));
|
|
342
|
+
for (const field of node.fields) {
|
|
343
|
+
if (!(field.name in input)) {
|
|
344
|
+
if (!field.optional)
|
|
345
|
+
issues.push({ reason: "typeMismatch", message: "Required field is absent.", path: childPath(path, field.name) });
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
const result = parseNode(input[field.name], field.type, childPath(path, field.name));
|
|
349
|
+
if (result.ok)
|
|
350
|
+
output[field.name] = result.value;
|
|
351
|
+
else
|
|
352
|
+
issues.push(...result.issues);
|
|
353
|
+
}
|
|
354
|
+
for (const [key, item] of Object.entries(input)) {
|
|
355
|
+
if (fields.has(key))
|
|
356
|
+
continue;
|
|
357
|
+
if (node.open)
|
|
358
|
+
output[key] = item;
|
|
359
|
+
else
|
|
360
|
+
issues.push({ reason: "typeMismatch", message: "Field is not declared by this closed object type.", path: childPath(path, key) });
|
|
361
|
+
}
|
|
362
|
+
return issues.length === 0 ? { ok: true, value: output } : { ok: false, issues };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/** Parse and canonicalize a value at a typed boundary without implicit JS coercion. */
|
|
367
|
+
export function parseTypedValue(value, type, path = "$") {
|
|
368
|
+
return parseNode(value, normalizeType(type), path);
|
|
369
|
+
}
|
|
370
|
+
/** Serialize a value using its declared type, never JavaScript's object stringification. */
|
|
371
|
+
export function serializeTypedValue(value, type) {
|
|
372
|
+
const parsed = parseTypedValue(value, type);
|
|
373
|
+
if (!parsed.ok)
|
|
374
|
+
throw new TypeError(parsed.issues.map((item) => `${item.path}: ${item.message}`).join("; "));
|
|
375
|
+
const node = normalizeType(type);
|
|
376
|
+
if (node.kind === "terminal" && (node.name === "function" || node.name === "unknown")) {
|
|
377
|
+
throw new TypeError(`The ${node.name} type is property-only and cannot be serialized.`);
|
|
378
|
+
}
|
|
379
|
+
if (node.kind === "list" || node.kind === "record" || node.kind === "object" ||
|
|
380
|
+
(node.kind === "union" && typeof parsed.value === "object" && parsed.value !== null)) {
|
|
381
|
+
return JSON.stringify(parsed.value);
|
|
382
|
+
}
|
|
383
|
+
if (parsed.value === null)
|
|
384
|
+
return "null";
|
|
385
|
+
if (parsed.value === undefined)
|
|
386
|
+
return "";
|
|
387
|
+
return String(parsed.value);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Whether a prop type can be written as an HTML attribute. Props are attributes on the component
|
|
391
|
+
* invocation, so every declared type with a text form qualifies: terminals and keyword unions as
|
|
392
|
+
* their text, and collection and structured shapes as JSON text parsed against the declared shape.
|
|
393
|
+
* `function`, `unknown`, and trusted content have no text form and cannot be props.
|
|
394
|
+
*/
|
|
395
|
+
export function isAttributeType(type) {
|
|
396
|
+
const node = normalizeType(type);
|
|
397
|
+
if (node.kind === "terminal") {
|
|
398
|
+
return !["function", "unknown", "trusted-html", "trusted-script"].includes(node.name);
|
|
399
|
+
}
|
|
400
|
+
if (node.kind === "keyword")
|
|
401
|
+
return true;
|
|
402
|
+
if (node.kind === "union")
|
|
403
|
+
return node.members.every(isAttributeType);
|
|
404
|
+
if (node.kind === "list")
|
|
405
|
+
return isAttributeType(node.item);
|
|
406
|
+
if (node.kind === "record")
|
|
407
|
+
return isAttributeType(node.value);
|
|
408
|
+
return node.fields.every((field) => isAttributeType(field.type));
|
|
409
|
+
}
|
|
410
|
+
/** Explicitly brand an already-approved Trusted Types-compatible value for non-browser hosts. */
|
|
411
|
+
export function trustedContent(kind, value) {
|
|
412
|
+
return Object.freeze({ kind, value });
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=type-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-system.js","sourceRoot":"","sources":["../src/type-system.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { TrustedContentValue, TypeNode } from "./type-system.js";
|
|
2
|
+
export type ContractStatus = "early" | "experimental" | "stable" | "deprecated";
|
|
3
|
+
export type ScalarType = "string" | "boolean" | "number";
|
|
4
|
+
export interface EnumType {
|
|
5
|
+
readonly enum: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export type PropType = ScalarType | EnumType | TypeNode;
|
|
8
|
+
export interface AttributeTarget {
|
|
9
|
+
readonly attribute: string;
|
|
10
|
+
readonly property?: never;
|
|
11
|
+
}
|
|
12
|
+
export interface PropertyTarget {
|
|
13
|
+
readonly property: string;
|
|
14
|
+
readonly attribute?: never;
|
|
15
|
+
}
|
|
16
|
+
export type PropTarget = AttributeTarget | PropertyTarget;
|
|
17
|
+
export type PropValue = string | boolean | number | null | TrustedContentValue | readonly PropValue[] | PropValueRecord;
|
|
18
|
+
export interface PropValueRecord {
|
|
19
|
+
readonly [name: string]: PropValue | undefined;
|
|
20
|
+
}
|
|
21
|
+
export interface PropContract {
|
|
22
|
+
readonly type: PropType;
|
|
23
|
+
readonly required: boolean;
|
|
24
|
+
readonly default?: PropValue;
|
|
25
|
+
readonly target: PropTarget;
|
|
26
|
+
readonly description: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ComponentContract {
|
|
29
|
+
readonly version: 1;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly tag: string;
|
|
32
|
+
readonly status?: ContractStatus;
|
|
33
|
+
readonly summary?: string;
|
|
34
|
+
readonly nativeElement: string;
|
|
35
|
+
readonly props: Readonly<Record<string, PropContract>>;
|
|
36
|
+
}
|
|
37
|
+
export interface DefineContractOptions {
|
|
38
|
+
readonly source?: string;
|
|
39
|
+
/** The component tag, taken from the carrier's `component=` attribute. */
|
|
40
|
+
readonly tag?: string;
|
|
41
|
+
}
|
|
42
|
+
export type SerializedPropTarget = {
|
|
43
|
+
readonly kind: "attribute";
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly value: string | null;
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "property";
|
|
48
|
+
readonly name: string;
|
|
49
|
+
readonly value: PropValue | undefined;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,YAAY,CAAC;AAEjB,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;AAC1D,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,mBAAmB,GACnB,SAAS,SAAS,EAAE,GACpB,eAAe,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { PropType } from "./types.js";
|
|
2
|
+
/** One normalized validation failure. Structured values always include a stable path. */
|
|
3
|
+
export interface ValidityError {
|
|
4
|
+
readonly reason: ValidityReason;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
readonly path?: string;
|
|
7
|
+
}
|
|
8
|
+
export type ValidityReason = "valueMissing" | "typeMismatch" | "patternMismatch" | "tooLong" | "tooShort" | "rangeUnderflow" | "rangeOverflow" | "stepMismatch" | "badInput" | "customError" | "schemaMismatch" | "untrustedValue";
|
|
9
|
+
export type Validity = {
|
|
10
|
+
readonly valid: true;
|
|
11
|
+
readonly errors: readonly [];
|
|
12
|
+
} | {
|
|
13
|
+
readonly valid: false;
|
|
14
|
+
readonly errors: readonly ValidityError[];
|
|
15
|
+
};
|
|
16
|
+
/** Constraints shared by props, data, controls, and arbitrary managed elements. */
|
|
17
|
+
export interface Constraint {
|
|
18
|
+
readonly type?: PropType | string;
|
|
19
|
+
readonly required?: boolean;
|
|
20
|
+
readonly multiple?: boolean;
|
|
21
|
+
readonly min?: number | string;
|
|
22
|
+
readonly max?: number | string;
|
|
23
|
+
readonly minLength?: number;
|
|
24
|
+
readonly maxLength?: number;
|
|
25
|
+
readonly pattern?: string;
|
|
26
|
+
readonly step?: number | "any";
|
|
27
|
+
}
|
|
28
|
+
/** Native ValidityState field for each normalized issue. */
|
|
29
|
+
export declare const NATIVE_FLAG: Readonly<Record<ValidityReason, keyof ValidityState | "schemaMismatch" | "untrustedValue">>;
|
|
30
|
+
/**
|
|
31
|
+
* Validate a value against HTML Next types and HTML constraints. Empty optional values stop
|
|
32
|
+
* after requiredness, matching the Constraint Validation API. All other applicable failures
|
|
33
|
+
* are returned rather than hiding later failures behind the first message.
|
|
34
|
+
*/
|
|
35
|
+
export declare function validate(value: unknown, constraint?: Constraint): Validity;
|
|
36
|
+
/** Read the browser's authoritative constraint result without replacing native algorithms. */
|
|
37
|
+
export declare function validityFromNative(state: ValidityState, validationMessage: string): Validity;
|
|
38
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,iBAAiB,GACjB,SAAS,GACT,UAAU,GACV,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,UAAU,GACV,aAAa,GACb,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAEzE,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAChC;AAED,4DAA4D;AAC5D,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAanH,CAAC;AAyKF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,UAAe,GAAG,QAAQ,CAkE9E;AAOD,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAQ5F"}
|