@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.
Files changed (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/ast.d.ts +7 -0
  4. package/dist/ast.d.ts.map +1 -0
  5. package/dist/ast.js +2 -0
  6. package/dist/ast.js.map +1 -0
  7. package/dist/browser-loader.bundle.js +9 -0
  8. package/dist/browser-loader.d.ts +35 -0
  9. package/dist/browser-loader.d.ts.map +1 -0
  10. package/dist/browser-loader.js +83 -0
  11. package/dist/browser-loader.js.map +1 -0
  12. package/dist/browser-source.d.ts +10 -0
  13. package/dist/browser-source.d.ts.map +1 -0
  14. package/dist/browser-source.js +97 -0
  15. package/dist/browser-source.js.map +1 -0
  16. package/dist/browser.d.ts +5 -0
  17. package/dist/browser.d.ts.map +1 -0
  18. package/dist/browser.js +9 -0
  19. package/dist/browser.js.map +1 -0
  20. package/dist/cli.d.ts +31 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +138 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/component-styles-build.d.ts +11 -0
  25. package/dist/component-styles-build.d.ts.map +1 -0
  26. package/dist/component-styles-build.js +74 -0
  27. package/dist/component-styles-build.js.map +1 -0
  28. package/dist/component-styles.d.ts +37 -0
  29. package/dist/component-styles.d.ts.map +1 -0
  30. package/dist/component-styles.js +236 -0
  31. package/dist/component-styles.js.map +1 -0
  32. package/dist/contract-platform.d.ts +5 -0
  33. package/dist/contract-platform.d.ts.map +1 -0
  34. package/dist/contract-platform.js +8 -0
  35. package/dist/contract-platform.js.map +1 -0
  36. package/dist/contract.d.ts +14 -0
  37. package/dist/contract.d.ts.map +1 -0
  38. package/dist/contract.js +234 -0
  39. package/dist/contract.js.map +1 -0
  40. package/dist/controller-files.d.ts +10 -0
  41. package/dist/controller-files.d.ts.map +1 -0
  42. package/dist/controller-files.js +54 -0
  43. package/dist/controller-files.js.map +1 -0
  44. package/dist/controller.d.ts +15 -0
  45. package/dist/controller.d.ts.map +1 -0
  46. package/dist/controller.js +33 -0
  47. package/dist/controller.js.map +1 -0
  48. package/dist/data.d.ts +28 -0
  49. package/dist/data.d.ts.map +1 -0
  50. package/dist/data.js +100 -0
  51. package/dist/data.js.map +1 -0
  52. package/dist/diagnostics.d.ts +11 -0
  53. package/dist/diagnostics.d.ts.map +1 -0
  54. package/dist/diagnostics.js +13 -0
  55. package/dist/diagnostics.js.map +1 -0
  56. package/dist/expression.d.ts +80 -0
  57. package/dist/expression.d.ts.map +1 -0
  58. package/dist/expression.js +474 -0
  59. package/dist/expression.js.map +1 -0
  60. package/dist/freeze.d.ts +2 -0
  61. package/dist/freeze.d.ts.map +1 -0
  62. package/dist/freeze.js +8 -0
  63. package/dist/freeze.js.map +1 -0
  64. package/dist/generate.d.ts +11 -0
  65. package/dist/generate.d.ts.map +1 -0
  66. package/dist/generate.js +41 -0
  67. package/dist/generate.js.map +1 -0
  68. package/dist/generated/dom-properties.d.ts +8 -0
  69. package/dist/generated/dom-properties.d.ts.map +1 -0
  70. package/dist/generated/dom-properties.js +1410 -0
  71. package/dist/generated/dom-properties.js.map +1 -0
  72. package/dist/generated-runtime.d.ts +42 -0
  73. package/dist/generated-runtime.d.ts.map +1 -0
  74. package/dist/generated-runtime.js +266 -0
  75. package/dist/generated-runtime.js.map +1 -0
  76. package/dist/graph.d.ts +37 -0
  77. package/dist/graph.d.ts.map +1 -0
  78. package/dist/graph.js +81 -0
  79. package/dist/graph.js.map +1 -0
  80. package/dist/index.d.ts +29 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +23 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/language.d.ts +7 -0
  85. package/dist/language.d.ts.map +1 -0
  86. package/dist/language.js +43 -0
  87. package/dist/language.js.map +1 -0
  88. package/dist/names.d.ts +4 -0
  89. package/dist/names.d.ts.map +1 -0
  90. package/dist/names.js +19 -0
  91. package/dist/names.js.map +1 -0
  92. package/dist/node-loader.d.ts +22 -0
  93. package/dist/node-loader.d.ts.map +1 -0
  94. package/dist/node-loader.js +109 -0
  95. package/dist/node-loader.js.map +1 -0
  96. package/dist/package-config.d.ts +22 -0
  97. package/dist/package-config.d.ts.map +1 -0
  98. package/dist/package-config.js +2 -0
  99. package/dist/package-config.js.map +1 -0
  100. package/dist/package.d.ts +9 -0
  101. package/dist/package.d.ts.map +1 -0
  102. package/dist/package.js +208 -0
  103. package/dist/package.js.map +1 -0
  104. package/dist/parser.d.ts +11 -0
  105. package/dist/parser.d.ts.map +1 -0
  106. package/dist/parser.js +938 -0
  107. package/dist/parser.js.map +1 -0
  108. package/dist/platform.d.ts +3 -0
  109. package/dist/platform.d.ts.map +1 -0
  110. package/dist/platform.js +26 -0
  111. package/dist/platform.js.map +1 -0
  112. package/dist/reactivity.d.ts +88 -0
  113. package/dist/reactivity.d.ts.map +1 -0
  114. package/dist/reactivity.js +594 -0
  115. package/dist/reactivity.js.map +1 -0
  116. package/dist/registry.d.ts +14 -0
  117. package/dist/registry.d.ts.map +1 -0
  118. package/dist/registry.js +39 -0
  119. package/dist/registry.js.map +1 -0
  120. package/dist/resolve.d.ts +24 -0
  121. package/dist/resolve.d.ts.map +1 -0
  122. package/dist/resolve.js +65 -0
  123. package/dist/resolve.js.map +1 -0
  124. package/dist/runtime.d.ts +110 -0
  125. package/dist/runtime.d.ts.map +1 -0
  126. package/dist/runtime.js +1926 -0
  127. package/dist/runtime.js.map +1 -0
  128. package/dist/sanitize.d.ts +8 -0
  129. package/dist/sanitize.d.ts.map +1 -0
  130. package/dist/sanitize.js +38 -0
  131. package/dist/sanitize.js.map +1 -0
  132. package/dist/source-graph.d.ts +5 -0
  133. package/dist/source-graph.d.ts.map +1 -0
  134. package/dist/source-graph.js +60 -0
  135. package/dist/source-graph.js.map +1 -0
  136. package/dist/source-parser.d.ts +4 -0
  137. package/dist/source-parser.d.ts.map +1 -0
  138. package/dist/source-parser.js +38 -0
  139. package/dist/source-parser.js.map +1 -0
  140. package/dist/source.d.ts +4 -0
  141. package/dist/source.d.ts.map +1 -0
  142. package/dist/source.js +6 -0
  143. package/dist/source.js.map +1 -0
  144. package/dist/targets/backend.d.ts +28 -0
  145. package/dist/targets/backend.d.ts.map +1 -0
  146. package/dist/targets/backend.js +42 -0
  147. package/dist/targets/backend.js.map +1 -0
  148. package/dist/targets/docs.d.ts +3 -0
  149. package/dist/targets/docs.d.ts.map +1 -0
  150. package/dist/targets/docs.js +85 -0
  151. package/dist/targets/docs.js.map +1 -0
  152. package/dist/targets/native-reactive.d.ts +41 -0
  153. package/dist/targets/native-reactive.d.ts.map +1 -0
  154. package/dist/targets/native-reactive.js +169 -0
  155. package/dist/targets/native-reactive.js.map +1 -0
  156. package/dist/targets/shared.d.ts +15 -0
  157. package/dist/targets/shared.d.ts.map +1 -0
  158. package/dist/targets/shared.js +122 -0
  159. package/dist/targets/shared.js.map +1 -0
  160. package/dist/targets/vanilla.d.ts +6 -0
  161. package/dist/targets/vanilla.d.ts.map +1 -0
  162. package/dist/targets/vanilla.js +442 -0
  163. package/dist/targets/vanilla.js.map +1 -0
  164. package/dist/targets/vue.d.ts +3 -0
  165. package/dist/targets/vue.d.ts.map +1 -0
  166. package/dist/targets/vue.js +577 -0
  167. package/dist/targets/vue.js.map +1 -0
  168. package/dist/template.d.ts +172 -0
  169. package/dist/template.d.ts.map +1 -0
  170. package/dist/template.js +2 -0
  171. package/dist/template.js.map +1 -0
  172. package/dist/type-system.d.ts +80 -0
  173. package/dist/type-system.d.ts.map +1 -0
  174. package/dist/type-system.js +414 -0
  175. package/dist/type-system.js.map +1 -0
  176. package/dist/types.d.ts +51 -0
  177. package/dist/types.d.ts.map +1 -0
  178. package/dist/types.js +2 -0
  179. package/dist/types.js.map +1 -0
  180. package/dist/validate.d.ts +38 -0
  181. package/dist/validate.d.ts.map +1 -0
  182. package/dist/validate.js +297 -0
  183. package/dist/validate.js.map +1 -0
  184. package/dist/validation.d.ts +6 -0
  185. package/dist/validation.d.ts.map +1 -0
  186. package/dist/validation.js +6 -0
  187. package/dist/validation.js.map +1 -0
  188. package/dist/validity-css.d.ts +6 -0
  189. package/dist/validity-css.d.ts.map +1 -0
  190. package/dist/validity-css.js +11 -0
  191. package/dist/validity-css.js.map +1 -0
  192. package/dist/validity.d.ts +45 -0
  193. package/dist/validity.d.ts.map +1 -0
  194. package/dist/validity.js +445 -0
  195. package/dist/validity.js.map +1 -0
  196. package/package.json +124 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Component style compilation (nextwebwg.org/html-next/styling).
3
+ *
4
+ * A style block applies to its component's region: from the root (`[data-component~="tag"]`) down
5
+ * to nested component roots and projected content. `:host` selects the root, `:host-state()` the root
6
+ * while resolved props and state match, and `:slotted()` projected content at any depth.
7
+ *
8
+ * The browser needs no CSS parser: the three pseudo-classes are renamed into selectors it accepts, it
9
+ * parses the block twice (the component's own markup, and projected content), each copy drops the
10
+ * other's rules, and the remaining selectors are rewritten through the CSS Object Model. Build tools
11
+ * run the same selector rewrite over a CSS parser (`component-styles-build.ts`).
12
+ */
13
+ import { fail } from "./diagnostics.js";
14
+ import { rewriteValiditySelectors } from "./validity-css.js";
15
+ /** Names a component on its root, and only its root. Delegated roots list every owner. */
16
+ export const COMPONENT_ATTRIBUTE = "data-component";
17
+ /** Marks each top-level projected node. */
18
+ export const PROJECTED_ATTRIBUTE = "data-slotted";
19
+ export function addAttributeToken(element, attribute, token) {
20
+ const tokens = new Set((element.getAttribute(attribute) ?? "").split(/\s+/).filter(Boolean));
21
+ tokens.add(token);
22
+ element.setAttribute(attribute, Array.from(tokens).join(" "));
23
+ }
24
+ export function markProjectedRoot(node) {
25
+ if (node.nodeType === 1)
26
+ node.setAttribute(PROJECTED_ATTRIBUTE, "");
27
+ }
28
+ /** The attribute carrying the resolved values a definition's `:host-state()` rules test. */
29
+ export function stateAttribute(tag) {
30
+ return `data-${tag}-state`;
31
+ }
32
+ const SENTINEL = { slotted: "[--slotted]", state: "[--state]" };
33
+ const RENAMABLE = /\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|:(slotted|host-state)\(/g;
34
+ /**
35
+ * Renames `:slotted(` and `:host-state(` into valid selectors, skipping comments and strings. A
36
+ * target that has its own `:slotted()` (Vue) renames only `:host-state(`.
37
+ */
38
+ export function renameComponentPseudoClasses(css, kinds = ["slotted", "host-state"]) {
39
+ return css.replace(RENAMABLE, (match, kind) => kind === undefined || !kinds.includes(kind) ? match : `:where(${kind === "slotted" ? SENTINEL.slotted : SENTINEL.state}):is(`);
40
+ }
41
+ /** Whether a renamed selector belongs to projected content rather than the component's own markup. */
42
+ export function styleRuleKind(selector) {
43
+ return /:where\(\s*\[--slotted\]\s*\)/.test(selector) ? "slotted" : "own";
44
+ }
45
+ /** Index of the parenthesis that closes the one opened at `open`, skipping strings. */
46
+ function closingParenthesis(value, open) {
47
+ let depth = 0;
48
+ for (let index = open; index < value.length; index += 1) {
49
+ const character = value[index];
50
+ if (character === "\"" || character === "'") {
51
+ const end = value.indexOf(character, index + 1);
52
+ index = end === -1 ? value.length : end;
53
+ }
54
+ else if (character === "(")
55
+ depth += 1;
56
+ else if (character === ")" && --depth === 0)
57
+ return index;
58
+ }
59
+ return value.length;
60
+ }
61
+ const STATE_TEST = /\[\s*([\w-]+)\s*(?:=\s*(?:"((?:\\.|[^"\\])*)"|'((?:\\.|[^'\\])*)'|([^\]\s]+))\s*)?\]/g;
62
+ /** `[name]` and `[name="value"]` tests as tokens of the state attribute. */
63
+ function stateTokens(tests, tag, names, canonical) {
64
+ let output = "";
65
+ for (const match of tests.matchAll(STATE_TEST)) {
66
+ const name = canonical(match[1]);
67
+ const value = match[2] ?? match[3] ?? match[4];
68
+ names.add(name);
69
+ output += `[${stateAttribute(tag)}~="${value === undefined ? name : `${name}=${encodeURIComponent(value)}`}"]`;
70
+ }
71
+ return output;
72
+ }
73
+ /** Type selectors naming components, outside brackets and strings. */
74
+ function rewriteComponentTags(selector) {
75
+ let output = "";
76
+ for (let index = 0; index < selector.length; index += 1) {
77
+ const character = selector[index];
78
+ if (character === "[") {
79
+ const end = selector.indexOf("]", index);
80
+ const stop = end === -1 ? selector.length : end + 1;
81
+ output += selector.slice(index, stop);
82
+ index = stop - 1;
83
+ continue;
84
+ }
85
+ const previous = output.at(-1);
86
+ const startsCompound = previous === undefined || /[\s>+~(,]/.test(previous);
87
+ const tag = startsCompound ? /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+(?![\w-]|\()/.exec(selector.slice(index))?.[0] : undefined;
88
+ if (tag !== undefined) {
89
+ output += `:is(${tag}, :where([${COMPONENT_ATTRIBUTE}~="${tag}"]))`;
90
+ index += tag.length - 1;
91
+ continue;
92
+ }
93
+ output += character;
94
+ }
95
+ return output;
96
+ }
97
+ /**
98
+ * Rewrites one renamed selector. `host` is what `:host` becomes: `:scope` inside the component's
99
+ * `@scope` rules (both of them are rooted at the component root), or the root's own selector where
100
+ * there is no `@scope` (Vue's scoped styles).
101
+ */
102
+ export function rewriteComponentSelector(selector, tag, host, names, canonical = (name) => name) {
103
+ if (/:scope(?![\w-])/.test(selector)) {
104
+ fail("HY003", `\`:scope\` is not part of component styles; select the root with \`:host\` (in <${tag}>).`);
105
+ }
106
+ let output = "";
107
+ let index = 0;
108
+ const state = /:where\(\s*\[--state\]\s*\):is\(/g;
109
+ for (let match = state.exec(selector); match !== null; match = state.exec(selector)) {
110
+ const open = match.index + match[0].length - 1;
111
+ const close = closingParenthesis(selector, open);
112
+ output += `${selector.slice(index, match.index)}${host}${stateTokens(selector.slice(open + 1, close), tag, names, canonical)}`;
113
+ index = close + 1;
114
+ state.lastIndex = index;
115
+ }
116
+ output += selector.slice(index);
117
+ output = output
118
+ .replace(/:where\(\s*\[--slotted\]\s*\):is\(/g, `:where([${PROJECTED_ATTRIBUTE}], [${PROJECTED_ATTRIBUTE}] *):is(`)
119
+ .replace(/:host(?![\w-])/g, host);
120
+ return rewriteComponentTags(rewriteValiditySelectors(output));
121
+ }
122
+ /** Wraps the compiled groups in the component's two scopes; `hoisted` rules stay document-wide. */
123
+ export function assembleComponentStyles(tag, own, slotted, hoisted) {
124
+ const root = `[${COMPONENT_ATTRIBUTE}~="${tag}"]`;
125
+ return [
126
+ hoisted,
127
+ own.trim() === "" ? "" : `@scope (${root}) to ([${COMPONENT_ATTRIBUTE}], [${PROJECTED_ATTRIBUTE}]) {\n${own}\n}`,
128
+ slotted.trim() === "" ? "" : `@scope (${root}) to ([${COMPONENT_ATTRIBUTE}]) {\n${slotted}\n}`,
129
+ ].filter((part) => part !== "").join("\n");
130
+ }
131
+ /** Scalars, keywords, enums, and unions of them can be tested; lists, records, and objects cannot. */
132
+ function stylableType(type) {
133
+ if (typeof type === "string")
134
+ return true;
135
+ if (type === null || typeof type !== "object")
136
+ return false;
137
+ if ("enum" in type)
138
+ return true;
139
+ const node = type;
140
+ if (node.kind === "union")
141
+ return (node.members ?? []).every(stylableType);
142
+ return node.kind !== "list" && node.kind !== "record" && node.kind !== "object";
143
+ }
144
+ /** Rejects `:host-state()` tests on names that are not declared props or state of a stylable type. */
145
+ export function validateStateNames(definition, names, source) {
146
+ const states = new Set((definition.declarations ?? [])
147
+ .filter((declaration) => declaration.kind === "state")
148
+ .map((declaration) => declaration.name));
149
+ for (const name of names) {
150
+ const prop = definition.contract.props[name];
151
+ if (prop === undefined && !states.has(name)) {
152
+ fail("HY001", `\`:host-state()\` tests \`${name}\`, which is not a declared prop or state.`, source);
153
+ }
154
+ if (prop !== undefined && !stylableType(prop.type)) {
155
+ fail("HY002", `\`:host-state()\` cannot test \`${name}\`, whose type is structured.`, source);
156
+ }
157
+ }
158
+ }
159
+ /** Compiles a style block in a browser through the CSS Object Model. */
160
+ export function compileComponentStyles(css, definition, document, source) {
161
+ const tag = definition.contract.tag;
162
+ if (css.trim() === "")
163
+ return { css: "", stateNames: [] };
164
+ const Sheet = (document.defaultView ?? globalThis).CSSStyleSheet;
165
+ const renamed = renameComponentPseudoClasses(css);
166
+ const names = new Set();
167
+ const hoisted = [];
168
+ const view = document.defaultView ?? globalThis;
169
+ const StyleRule = view.CSSStyleRule;
170
+ const GroupingRule = view.CSSGroupingRule;
171
+ // The Object Model serializes attribute names in lowercase, so `[validationStatus]` comes back as
172
+ // `[validationstatus]`; state tests resolve against the declared names without regard to case.
173
+ const declared = new Map([
174
+ ...Object.keys(definition.contract.props),
175
+ ...(definition.declarations ?? []).filter((declaration) => declaration.kind === "state").map((declaration) => declaration.name),
176
+ ].map((name) => [name.toLowerCase(), name]));
177
+ const canonical = (name) => declared.get(name.toLowerCase()) ?? name;
178
+ const rewriteNested = (rule) => {
179
+ rule.selectorText = rewriteComponentSelector(rule.selectorText, tag, ":scope", names, canonical);
180
+ for (const child of Array.from(rule.cssRules ?? [])) {
181
+ if (child instanceof StyleRule)
182
+ rewriteNested(child);
183
+ }
184
+ };
185
+ // Keeps the rules of one kind, rewriting their selectors; grouping rules keep their structure.
186
+ const prune = (container, want, topLevel) => {
187
+ // In source order, so state names are collected in first-use order, as build tools collect them.
188
+ const rules = container.cssRules;
189
+ for (let index = 0; index < rules.length;) {
190
+ const rule = rules[index];
191
+ if (rule instanceof StyleRule) {
192
+ if (styleRuleKind(rule.selectorText) === want) {
193
+ rewriteNested(rule);
194
+ index += 1;
195
+ }
196
+ else
197
+ container.deleteRule(index);
198
+ }
199
+ else if (rule instanceof GroupingRule) {
200
+ prune(rule, want, false);
201
+ index += 1;
202
+ }
203
+ else {
204
+ // Document-wide rules (@keyframes, @font-face, @property, …) are hoisted once, unscoped.
205
+ if (topLevel && want === "own")
206
+ hoisted.push(rule.cssText);
207
+ container.deleteRule(index);
208
+ }
209
+ }
210
+ };
211
+ const compile = (want) => {
212
+ const sheet = new Sheet();
213
+ sheet.replaceSync(renamed);
214
+ prune(sheet, want, true);
215
+ return Array.from(sheet.cssRules, (rule) => rule.cssText).join("\n");
216
+ };
217
+ const own = compile("own");
218
+ const slotted = compile("slotted");
219
+ validateStateNames(definition, names, source);
220
+ return { css: assembleComponentStyles(tag, own, slotted, hoisted.join("\n")), stateNames: [...names] };
221
+ }
222
+ /** The state attribute's tokens for the current values: `name` while truthy, `name=value` for text. */
223
+ export function stateAttributeValue(names, read) {
224
+ const tokens = [];
225
+ for (const name of names) {
226
+ const value = read(name);
227
+ const truthy = value === true || (typeof value === "string" && value.length > 0) ||
228
+ (typeof value === "number" && value !== 0 && !Number.isNaN(value));
229
+ if (truthy)
230
+ tokens.push(name);
231
+ if (typeof value === "string" || typeof value === "number")
232
+ tokens.push(`${name}=${encodeURIComponent(String(value))}`);
233
+ }
234
+ return tokens.join(" ");
235
+ }
236
+ //# sourceMappingURL=component-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-styles.js","sourceRoot":"","sources":["../src/component-styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ComponentContract, DefineContractOptions } from "./types.js";
2
+ export { serializePropTarget } from "./contract.js";
3
+ /** Defines a contract using the build-time DOM interface inventory. */
4
+ export declare function defineContract(input: unknown, options?: DefineContractOptions): ComponentContract;
5
+ //# sourceMappingURL=contract-platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-platform.d.ts","sourceRoot":"","sources":["../src/contract-platform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B,GAClC,iBAAiB,CAEnB"}
@@ -0,0 +1,8 @@
1
+ import { defineContractWithNativeCheck } from "./contract.js";
2
+ import { getDomInterface } from "./platform.js";
3
+ export { serializePropTarget } from "./contract.js";
4
+ /** Defines a contract using the build-time DOM interface inventory. */
5
+ export function defineContract(input, options = {}) {
6
+ return defineContractWithNativeCheck(input, options, (name) => getDomInterface(name) !== undefined);
7
+ }
8
+ //# sourceMappingURL=contract-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-platform.js","sourceRoot":"","sources":["../src/contract-platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,OAAO,GAA0B,EAAE;IAEnC,OAAO,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;AACtG,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ComponentContract, DefineContractOptions, PropContract, PropType, SerializedPropTarget } from "./types.js";
2
+ export { componentName as deriveName } from "./names.js";
3
+ /**
4
+ * Parses a `<prop type>` attribute into a raw prop type. A single scalar keyword
5
+ * (`string`/`number`/`boolean`) stays scalar; anything else is an enum whose members are
6
+ * split on the CSS value-definition-syntax single bar `|` (Values and Units, "one of").
7
+ */
8
+ export declare function parseTypeAttribute(value: string): PropType;
9
+ /** Coerces a `<prop default>` attribute string into a value of the declared type. */
10
+ export declare function coerceDefault(type: PropType, raw: string): unknown;
11
+ export declare function defineContractWithNativeCheck(input: unknown, options: DefineContractOptions, isNativeElement: (name: string) => boolean): ComponentContract;
12
+ export declare function serializePropTarget(prop: PropContract, provided: unknown): SerializedPropTarget;
13
+ export type { ComponentContract, DefineContractOptions, PropContract, PropTarget, PropType, SerializedPropTarget, } from "./types.js";
14
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EAErB,YAAY,EAEZ,QAAQ,EAER,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAmBzD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAgB1D;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlE;AA0ID,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,qBAAqB,EAC9B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACzC,iBAAiB,CAmDnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,OAAO,GAChB,oBAAoB,CAkCtB;AAED,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,234 @@
1
+ import { fail } from "./diagnostics.js";
2
+ import { deepFreeze } from "./freeze.js";
3
+ import { componentName } from "./names.js";
4
+ import { formatType, isAttributeType, isTypeNode, parseTypedValue, parseTypeExpression, serializeTypedValue, } from "./type-system.js";
5
+ export { componentName as deriveName } from "./names.js";
6
+ const CONTRACT_FIELDS = [
7
+ "status",
8
+ "summary",
9
+ "nativeElement",
10
+ "props",
11
+ ];
12
+ const PROP_FIELDS = [
13
+ "type",
14
+ "default",
15
+ "required",
16
+ "target",
17
+ "description",
18
+ ];
19
+ const STATUS_RE = /^(?:early|experimental|stable|deprecated)$/;
20
+ /**
21
+ * Parses a `<prop type>` attribute into a raw prop type. A single scalar keyword
22
+ * (`string`/`number`/`boolean`) stays scalar; anything else is an enum whose members are
23
+ * split on the CSS value-definition-syntax single bar `|` (Values and Units, "one of").
24
+ */
25
+ export function parseTypeAttribute(value) {
26
+ let parsed;
27
+ try {
28
+ parsed = parseTypeExpression(value);
29
+ }
30
+ catch (error) {
31
+ fail("HC013", error instanceof Error ? error.message : "Invalid prop type expression.");
32
+ }
33
+ if (parsed.kind === "terminal" &&
34
+ (parsed.name === "string" || parsed.name === "boolean" || parsed.name === "number"))
35
+ return parsed.name;
36
+ if (parsed.kind === "keyword")
37
+ return { enum: [parsed.value] };
38
+ if (parsed.kind === "union" && parsed.members.every((member) => member.kind === "keyword")) {
39
+ return { enum: parsed.members.map((member) => member.value) };
40
+ }
41
+ return parsed;
42
+ }
43
+ /** Coerces a `<prop default>` attribute string into a value of the declared type. */
44
+ export function coerceDefault(type, raw) {
45
+ const result = parseTypedValue(raw, type);
46
+ return result.ok ? result.value : raw;
47
+ }
48
+ function record(value, code, message, source) {
49
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
50
+ fail(code, message, source);
51
+ }
52
+ return value;
53
+ }
54
+ function rejectUnknownFields(value, allowed, source) {
55
+ const unknown = Object.keys(value).filter((key) => !allowed.includes(key)).sort();
56
+ if (unknown.length > 0) {
57
+ fail("HC002", `Unknown field${unknown.length === 1 ? "" : "s"}: ${unknown.join(", ")}.`, source);
58
+ }
59
+ }
60
+ function requiredString(value, field, source) {
61
+ if (typeof value !== "string" || value.trim() === "") {
62
+ fail("HC003", `\`${field}\` must be a non-empty string.`, source);
63
+ }
64
+ return value;
65
+ }
66
+ function parseType(value, source) {
67
+ if (typeof value === "string") {
68
+ let parsed;
69
+ try {
70
+ parsed = parseTypeExpression(value);
71
+ }
72
+ catch (error) {
73
+ fail("HC013", error instanceof Error ? error.message : `Unsupported prop type \`${value}\`.`, source);
74
+ }
75
+ return parsed.kind === "terminal" &&
76
+ (parsed.name === "string" || parsed.name === "boolean" || parsed.name === "number")
77
+ ? parsed.name
78
+ : parsed;
79
+ }
80
+ const object = record(value, "HC013", "A prop type must be a scalar name or enum object.", source);
81
+ if (isTypeNode(object)) {
82
+ try {
83
+ return parseTypeExpression(formatType(object));
84
+ }
85
+ catch (error) {
86
+ fail("HC013", error instanceof Error ? error.message : "Invalid type node.", source);
87
+ }
88
+ }
89
+ rejectUnknownFields(object, ["enum"], source);
90
+ if (!Array.isArray(object.enum) || object.enum.length === 0) {
91
+ fail("HC014", "An enum must contain at least one string member.", source);
92
+ }
93
+ if (!object.enum.every((member) => typeof member === "string")) {
94
+ fail("HC014", "Every enum member must be a string.", source);
95
+ }
96
+ const members = object.enum;
97
+ for (let index = 0; index < members.length; index += 1) {
98
+ if (members.indexOf(members[index], index + 1) !== -1) {
99
+ fail("HC014", "Enum members must be unique.", source);
100
+ }
101
+ }
102
+ return { enum: Object.freeze([...members]) };
103
+ }
104
+ function parseTarget(value, source) {
105
+ const object = record(value, "HC017", "A prop target must be an object.", source);
106
+ rejectUnknownFields(object, ["attribute", "property"], source);
107
+ const keys = Object.keys(object);
108
+ if (keys.length !== 1) {
109
+ fail("HC017", "A prop target must declare exactly one attribute or property.", source);
110
+ }
111
+ if ("attribute" in object) {
112
+ if (typeof object.attribute !== "string" ||
113
+ object.attribute === "" ||
114
+ // oxlint-disable-next-line no-control-regex -- HTML forbids these exact control characters.
115
+ !/^[^\u0000\t\n\f\r "'>/=]+$/.test(object.attribute)) {
116
+ fail("HC017", "An attribute target must be a valid HTML attribute name.", source);
117
+ }
118
+ return { attribute: object.attribute.toLowerCase() };
119
+ }
120
+ if (typeof object.property !== "string" ||
121
+ !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(object.property)) {
122
+ fail("HC017", "A property target must be a valid DOM property identifier.", source);
123
+ }
124
+ return { property: object.property };
125
+ }
126
+ function accepts(type, value) {
127
+ return parseTypedValue(value, type).ok;
128
+ }
129
+ function parseProp(name, value, source) {
130
+ const object = record(value, "HC012", `Prop \`${name}\` must be an object.`, source);
131
+ rejectUnknownFields(object, PROP_FIELDS, source);
132
+ const type = parseType(object.type, source);
133
+ const required = object.required ?? false;
134
+ if (typeof required !== "boolean") {
135
+ fail("HC016", `Prop \`${name}\` has a non-boolean \`required\` value.`, source);
136
+ }
137
+ if (required && "default" in object) {
138
+ fail("HC019", `Required prop \`${name}\` cannot also declare a default.`, source);
139
+ }
140
+ if ("default" in object && !accepts(type, object.default)) {
141
+ fail("HC015", `Default for prop \`${name}\` does not satisfy its type.`, source);
142
+ }
143
+ const target = parseTarget(object.target, source);
144
+ if (!isAttributeType(type)) {
145
+ fail("HC017", `Prop \`${name}\` cannot be written as an HTML attribute; function, unknown, and trusted content types have no text form.`, source);
146
+ }
147
+ const description = requiredString(object.description, `props.${name}.description`, source);
148
+ const normalized = { type, required, target, description };
149
+ if ("default" in object)
150
+ normalized.default = object.default;
151
+ return deepFreeze(normalized);
152
+ }
153
+ export function defineContractWithNativeCheck(input, options, isNativeElement) {
154
+ const source = options.source;
155
+ const object = record(input, "HC001", "A component contract must be an object.", source);
156
+ rejectUnknownFields(object, CONTRACT_FIELDS, source);
157
+ const tag = requiredString(options.tag, "component", source);
158
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/.test(tag)) {
159
+ fail("HC005", "The `component` tag must be lowercase and contain a hyphen.", source);
160
+ }
161
+ const name = componentName(tag);
162
+ if (object.status !== undefined && (typeof object.status !== "string" || !STATUS_RE.test(object.status))) {
163
+ fail("HC007", "Component `status` is not recognized.", source);
164
+ }
165
+ const summary = object.summary === undefined ? undefined : requiredString(object.summary, "summary", source);
166
+ const nativeElement = requiredString(object.nativeElement, "nativeElement", source);
167
+ if (!/^[a-z][a-z0-9-]*$/.test(nativeElement) ||
168
+ (!isNativeElement(nativeElement) &&
169
+ !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/.test(nativeElement))) {
170
+ fail("HC008", "`nativeElement` must be a lowercase HTML element or component tag.", source);
171
+ }
172
+ const rawProps = record(object.props, "HC009", "`props` must be an object.", source);
173
+ const normalizedKeys = new Map();
174
+ for (const propName of Object.keys(rawProps)) {
175
+ if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(propName)) {
176
+ fail("HC010", `Invalid prop name \`${propName}\`.`, source);
177
+ }
178
+ const key = propName.toLowerCase();
179
+ const prior = normalizedKeys.get(key);
180
+ if (prior !== undefined) {
181
+ fail("HC011", `Props \`${prior}\` and \`${propName}\` collide after lowercase normalization.`, source);
182
+ }
183
+ normalizedKeys.set(key, propName);
184
+ }
185
+ const props = {};
186
+ for (const propName of Object.keys(rawProps).sort()) {
187
+ props[propName] = parseProp(propName, rawProps[propName], source);
188
+ }
189
+ return deepFreeze({
190
+ version: 1,
191
+ name,
192
+ tag,
193
+ ...(object.status === undefined ? {} : { status: object.status }),
194
+ ...(summary === undefined ? {} : { summary }),
195
+ nativeElement,
196
+ props,
197
+ });
198
+ }
199
+ export function serializePropTarget(prop, provided) {
200
+ const value = provided === undefined ? prop.default : provided;
201
+ if (value === undefined) {
202
+ if (prop.required) {
203
+ fail("HC020", "A required prop value was omitted.");
204
+ }
205
+ if ("attribute" in prop.target) {
206
+ return { kind: "attribute", name: prop.target.attribute, value: null };
207
+ }
208
+ return { kind: "property", name: prop.target.property, value: null };
209
+ }
210
+ if (value === null) {
211
+ if (prop.required) {
212
+ fail("HC021", "A prop value does not satisfy its declared type.");
213
+ }
214
+ if ("attribute" in prop.target) {
215
+ return { kind: "attribute", name: prop.target.attribute, value: null };
216
+ }
217
+ return { kind: "property", name: prop.target.property, value: null };
218
+ }
219
+ if (!accepts(prop.type, value)) {
220
+ fail("HC021", "A prop value does not satisfy its declared type.");
221
+ }
222
+ const parsed = parseTypedValue(value, prop.type);
223
+ if (!parsed.ok)
224
+ fail("HC021", "A prop value does not satisfy its declared type.");
225
+ const canonical = parsed.value;
226
+ if ("property" in prop.target) {
227
+ return { kind: "property", name: prop.target.property, value: canonical };
228
+ }
229
+ if (typeof canonical === "boolean") {
230
+ return { kind: "attribute", name: prop.target.attribute, value: canonical ? "" : null };
231
+ }
232
+ return { kind: "attribute", name: prop.target.attribute, value: serializeTypedValue(canonical, prop.type) };
233
+ }
234
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { GeneratedArtifact } from "./generate.js";
2
+ /** The deepest directory containing every path. */
3
+ export declare function commonDirectory(paths: readonly string[]): string;
4
+ /**
5
+ * Copies a controller and its relative imports under `targetRoot`, named relative to the deepest
6
+ * directory that holds the whole graph: the component's own directory unless the controller imports
7
+ * a shared module beside it. The graph must stay inside the component's package (`trustRoot`).
8
+ */
9
+ export declare function addControllerGraph(sourceURL: string, trustRoot: string, targetRoot: string, artifacts: Map<string, GeneratedArtifact>): Promise<string>;
10
+ //# sourceMappingURL=controller-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-files.d.ts","sourceRoot":"","sources":["../src/controller-files.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAavD,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMhE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
@@ -0,0 +1,54 @@
1
+ /** Copies a component's controller module and its relative imports into generated output. */
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, relative, sep } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import ts from "typescript-compiler";
6
+ /** The controller module and its static relative imports, by file URL. */
7
+ async function readControllerGraph(sourceURL, files) {
8
+ if (files.has(sourceURL))
9
+ return;
10
+ const content = await readFile(fileURLToPath(sourceURL), "utf8");
11
+ files.set(sourceURL, content);
12
+ for (const item of ts.preProcessFile(content, true, true).importedFiles) {
13
+ if (!item.fileName.startsWith(".") && !item.fileName.startsWith("/"))
14
+ continue;
15
+ await readControllerGraph(new URL(item.fileName, sourceURL).href, files);
16
+ }
17
+ }
18
+ /** The deepest directory containing every path. */
19
+ export function commonDirectory(paths) {
20
+ let common = dirname(paths[0]);
21
+ for (const path of paths.slice(1)) {
22
+ while (relative(common, path).startsWith(`..${sep}`))
23
+ common = dirname(common);
24
+ }
25
+ return common;
26
+ }
27
+ /**
28
+ * Copies a controller and its relative imports under `targetRoot`, named relative to the deepest
29
+ * directory that holds the whole graph: the component's own directory unless the controller imports
30
+ * a shared module beside it. The graph must stay inside the component's package (`trustRoot`).
31
+ */
32
+ export async function addControllerGraph(sourceURL, trustRoot, targetRoot, artifacts) {
33
+ const files = new Map();
34
+ await readControllerGraph(sourceURL, files);
35
+ const root = fileURLToPath(trustRoot);
36
+ const paths = [...files.keys()].map((url) => fileURLToPath(url));
37
+ for (const path of paths) {
38
+ const withinRoot = relative(root, path);
39
+ if (withinRoot === ".." || withinRoot.startsWith(`..${sep}`)) {
40
+ throw new Error(`Controller module escaped its component root: ${path}.`);
41
+ }
42
+ }
43
+ const base = commonDirectory(paths);
44
+ const target = (path) => `${targetRoot}/${relative(base, path).split(sep).join("/")}`;
45
+ for (const [url, content] of files) {
46
+ const path = target(fileURLToPath(url));
47
+ const prior = artifacts.get(path);
48
+ if (prior !== undefined && prior.content !== content)
49
+ throw new Error(`Generated artifact collision at ${path}.`);
50
+ artifacts.set(path, { path, content });
51
+ }
52
+ return target(fileURLToPath(sourceURL));
53
+ }
54
+ //# sourceMappingURL=controller-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-files.js","sourceRoot":"","sources":["../src/controller-files.ts"],"names":[],"mappings":"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"}