@gyral/core 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +1 -1
  3. package/NOTICE +1 -1
  4. package/README.md +9 -7
  5. package/dist/children.d.ts +5 -2
  6. package/dist/children.js +8 -3
  7. package/dist/children.js.map +1 -1
  8. package/dist/command.js +6 -0
  9. package/dist/command.js.map +1 -1
  10. package/dist/compiler/ast.d.ts +21 -0
  11. package/dist/compiler/ast.js +145 -0
  12. package/dist/compiler/ast.js.map +1 -0
  13. package/dist/compiler/compile.d.ts +38 -0
  14. package/dist/compiler/compile.js +129 -0
  15. package/dist/compiler/compile.js.map +1 -0
  16. package/dist/compiler/hooks.d.ts +18 -0
  17. package/dist/compiler/hooks.js +186 -0
  18. package/dist/compiler/hooks.js.map +1 -0
  19. package/dist/compiler/parse5-check.d.ts +21 -0
  20. package/dist/compiler/parse5-check.js +55 -0
  21. package/dist/compiler/parse5-check.js.map +1 -0
  22. package/dist/compiler/scan.d.ts +31 -0
  23. package/dist/compiler/scan.js +152 -0
  24. package/dist/compiler/scan.js.map +1 -0
  25. package/dist/compiler/source.d.ts +34 -0
  26. package/dist/compiler/source.js +114 -0
  27. package/dist/compiler/source.js.map +1 -0
  28. package/dist/define.d.ts +2 -2
  29. package/dist/define.js +35 -334
  30. package/dist/define.js.map +1 -1
  31. package/dist/devtools-events.d.ts +5 -0
  32. package/dist/devtools-events.js.map +1 -1
  33. package/dist/devtools-off.d.ts +1 -0
  34. package/dist/devtools-off.js +1 -0
  35. package/dist/devtools-off.js.map +1 -1
  36. package/dist/devtools.d.ts +1 -0
  37. package/dist/devtools.js +3 -0
  38. package/dist/devtools.js.map +1 -1
  39. package/dist/drivers-scope.d.ts +1 -1
  40. package/dist/drivers-scope.js +1 -8
  41. package/dist/drivers-scope.js.map +1 -1
  42. package/dist/element-types.d.ts +5 -3
  43. package/dist/element-types.js.map +1 -1
  44. package/dist/element.d.ts +3 -0
  45. package/dist/element.js +269 -0
  46. package/dist/element.js.map +1 -0
  47. package/dist/eslint/imports.d.ts +24 -0
  48. package/dist/eslint/imports.js +78 -0
  49. package/dist/eslint/imports.js.map +1 -0
  50. package/dist/eslint/index.d.ts +15 -0
  51. package/dist/eslint/index.js +15 -0
  52. package/dist/eslint/index.js.map +1 -0
  53. package/dist/eslint/locate.d.ts +33 -0
  54. package/dist/eslint/locate.js +132 -0
  55. package/dist/eslint/locate.js.map +1 -0
  56. package/dist/eslint/row-purity-rule.d.ts +2 -0
  57. package/dist/eslint/row-purity-rule.js +103 -0
  58. package/dist/eslint/row-purity-rule.js.map +1 -0
  59. package/dist/eslint/template-rule.d.ts +5 -0
  60. package/dist/eslint/template-rule.js +66 -0
  61. package/dist/eslint/template-rule.js.map +1 -0
  62. package/dist/features.d.ts +39 -0
  63. package/dist/features.js +2 -0
  64. package/dist/features.js.map +1 -0
  65. package/dist/focus.d.ts +9 -2
  66. package/dist/focus.js +17 -2
  67. package/dist/focus.js.map +1 -1
  68. package/dist/hooks/invalid.d.ts +14 -0
  69. package/dist/hooks/invalid.js +72 -0
  70. package/dist/hooks/invalid.js.map +1 -0
  71. package/dist/hooks/labelled-by.d.ts +13 -0
  72. package/dist/hooks/labelled-by.js +51 -0
  73. package/dist/hooks/labelled-by.js.map +1 -0
  74. package/dist/host-model.d.ts +48 -0
  75. package/dist/host-model.js +155 -0
  76. package/dist/host-model.js.map +1 -0
  77. package/dist/hydration-client.d.ts +9 -0
  78. package/dist/hydration-client.js +35 -0
  79. package/dist/hydration-client.js.map +1 -0
  80. package/dist/hydration.d.ts +13 -19
  81. package/dist/hydration.js +45 -45
  82. package/dist/hydration.js.map +1 -1
  83. package/dist/index.d.ts +9 -16
  84. package/dist/index.js +9 -16
  85. package/dist/index.js.map +1 -1
  86. package/dist/intent.d.ts +31 -8
  87. package/dist/intent.js +82 -27
  88. package/dist/intent.js.map +1 -1
  89. package/dist/internal/interpreter.d.ts +7 -1
  90. package/dist/internal/interpreter.js +118 -73
  91. package/dist/internal/interpreter.js.map +1 -1
  92. package/dist/invokers-shim.d.ts +6 -0
  93. package/dist/invokers-shim.js +32 -0
  94. package/dist/invokers-shim.js.map +1 -0
  95. package/dist/invokers.d.ts +3 -5
  96. package/dist/invokers.js +11 -51
  97. package/dist/invokers.js.map +1 -1
  98. package/dist/islands.d.ts +0 -2
  99. package/dist/islands.js +4 -11
  100. package/dist/islands.js.map +1 -1
  101. package/dist/light-dom.d.ts +3 -52
  102. package/dist/light-dom.js +5 -100
  103. package/dist/light-dom.js.map +1 -1
  104. package/dist/prop.d.ts +66 -0
  105. package/dist/prop.js +22 -0
  106. package/dist/prop.js.map +1 -0
  107. package/dist/props.d.ts +52 -21
  108. package/dist/props.js +150 -34
  109. package/dist/props.js.map +1 -1
  110. package/dist/scheduler.d.ts +39 -0
  111. package/dist/scheduler.js +230 -0
  112. package/dist/scheduler.js.map +1 -0
  113. package/dist/server-component.d.ts +10 -0
  114. package/dist/server-component.js +102 -0
  115. package/dist/server-component.js.map +1 -0
  116. package/dist/server-specs.d.ts +6 -0
  117. package/dist/server-specs.js +13 -0
  118. package/dist/server-specs.js.map +1 -0
  119. package/dist/server.d.ts +28 -0
  120. package/dist/server.js +50 -0
  121. package/dist/server.js.map +1 -0
  122. package/dist/settled.d.ts +10 -0
  123. package/dist/settled.js +40 -0
  124. package/dist/settled.js.map +1 -0
  125. package/dist/states.d.ts +3 -3
  126. package/dist/states.js +4 -7
  127. package/dist/states.js.map +1 -1
  128. package/dist/store-binding.d.ts +6 -3
  129. package/dist/store-binding.js +5 -6
  130. package/dist/store-binding.js.map +1 -1
  131. package/dist/store-scope.d.ts +6 -7
  132. package/dist/store-scope.js +11 -26
  133. package/dist/store-scope.js.map +1 -1
  134. package/dist/store.d.ts +3 -0
  135. package/dist/store.js +9 -2
  136. package/dist/store.js.map +1 -1
  137. package/dist/stores-provider.d.ts +2 -6
  138. package/dist/stores-provider.js +21 -55
  139. package/dist/stores-provider.js.map +1 -1
  140. package/dist/transitions.d.ts +5 -6
  141. package/dist/transitions.js +11 -20
  142. package/dist/transitions.js.map +1 -1
  143. package/dist/types.d.ts +19 -23
  144. package/dist/types.js.map +1 -1
  145. package/dist/view/attributes.d.ts +6 -0
  146. package/dist/view/attributes.js +10 -0
  147. package/dist/view/attributes.js.map +1 -0
  148. package/dist/view/compiled.d.ts +1 -0
  149. package/dist/view/compiled.js +6 -0
  150. package/dist/view/compiled.js.map +1 -0
  151. package/dist/view/dev-off.d.ts +1 -0
  152. package/dist/view/dev-off.js +4 -0
  153. package/dist/view/dev-off.js.map +1 -0
  154. package/dist/view/dev.d.ts +1 -0
  155. package/dist/view/dev.js +5 -0
  156. package/dist/view/dev.js.map +1 -0
  157. package/dist/view/flags.d.ts +1 -0
  158. package/dist/view/flags.js +4 -0
  159. package/dist/view/flags.js.map +1 -0
  160. package/dist/view/index.d.ts +21 -0
  161. package/dist/view/index.js +21 -0
  162. package/dist/view/index.js.map +1 -0
  163. package/dist/view/normalize/check.d.ts +20 -0
  164. package/dist/view/normalize/check.js +78 -0
  165. package/dist/view/normalize/check.js.map +1 -0
  166. package/dist/view/normalize/emit.d.ts +13 -0
  167. package/dist/view/normalize/emit.js +136 -0
  168. package/dist/view/normalize/emit.js.map +1 -0
  169. package/dist/view/normalize/entities.d.ts +4 -0
  170. package/dist/view/normalize/entities.js +38 -0
  171. package/dist/view/normalize/entities.js.map +1 -0
  172. package/dist/view/normalize/errors.d.ts +9 -0
  173. package/dist/view/normalize/errors.js +19 -0
  174. package/dist/view/normalize/errors.js.map +1 -0
  175. package/dist/view/normalize/id.d.ts +7 -0
  176. package/dist/view/normalize/id.js +48 -0
  177. package/dist/view/normalize/id.js.map +1 -0
  178. package/dist/view/normalize/normalize.d.ts +15 -0
  179. package/dist/view/normalize/normalize.js +36 -0
  180. package/dist/view/normalize/normalize.js.map +1 -0
  181. package/dist/view/normalize/repairs.d.ts +24 -0
  182. package/dist/view/normalize/repairs.js +166 -0
  183. package/dist/view/normalize/repairs.js.map +1 -0
  184. package/dist/view/normalize/rules.d.ts +30 -0
  185. package/dist/view/normalize/rules.js +90 -0
  186. package/dist/view/normalize/rules.js.map +1 -0
  187. package/dist/view/normalize/shape.d.ts +5 -0
  188. package/dist/view/normalize/shape.js +38 -0
  189. package/dist/view/normalize/shape.js.map +1 -0
  190. package/dist/view/normalize/source.d.ts +13 -0
  191. package/dist/view/normalize/source.js +34 -0
  192. package/dist/view/normalize/source.js.map +1 -0
  193. package/dist/view/normalize/tag-states.d.ts +23 -0
  194. package/dist/view/normalize/tag-states.js +192 -0
  195. package/dist/view/normalize/tag-states.js.map +1 -0
  196. package/dist/view/normalize/tokenizer.d.ts +5 -0
  197. package/dist/view/normalize/tokenizer.js +233 -0
  198. package/dist/view/normalize/tokenizer.js.map +1 -0
  199. package/dist/view/normalize/tokens.d.ts +51 -0
  200. package/dist/view/normalize/tokens.js +24 -0
  201. package/dist/view/normalize/tokens.js.map +1 -0
  202. package/dist/view/normalize/tree.d.ts +59 -0
  203. package/dist/view/normalize/tree.js +190 -0
  204. package/dist/view/normalize/tree.js.map +1 -0
  205. package/dist/view/normalize/types.d.ts +126 -0
  206. package/dist/view/normalize/types.js +26 -0
  207. package/dist/view/normalize/types.js.map +1 -0
  208. package/dist/view/normalize/whitespace.d.ts +2 -0
  209. package/dist/view/normalize/whitespace.js +182 -0
  210. package/dist/view/normalize/whitespace.js.map +1 -0
  211. package/dist/view/prepare-stub.d.ts +3 -0
  212. package/dist/view/prepare-stub.js +7 -0
  213. package/dist/view/prepare-stub.js.map +1 -0
  214. package/dist/view/prepare.d.ts +8 -0
  215. package/dist/view/prepare.js +57 -0
  216. package/dist/view/prepare.js.map +1 -0
  217. package/dist/view/registry.d.ts +63 -0
  218. package/dist/view/registry.js +19 -0
  219. package/dist/view/registry.js.map +1 -0
  220. package/dist/view/render/adopt-attr.d.ts +14 -0
  221. package/dist/view/render/adopt-attr.js +77 -0
  222. package/dist/view/render/adopt-attr.js.map +1 -0
  223. package/dist/view/render/adopt-plan.d.ts +10 -0
  224. package/dist/view/render/adopt-plan.js +26 -0
  225. package/dist/view/render/adopt-plan.js.map +1 -0
  226. package/dist/view/render/adopt.d.ts +3 -0
  227. package/dist/view/render/adopt.js +269 -0
  228. package/dist/view/render/adopt.js.map +1 -0
  229. package/dist/view/render/attr-parts.d.ts +61 -0
  230. package/dist/view/render/attr-parts.js +229 -0
  231. package/dist/view/render/attr-parts.js.map +1 -0
  232. package/dist/view/render/child-part.d.ts +51 -0
  233. package/dist/view/render/child-part.js +170 -0
  234. package/dist/view/render/child-part.js.map +1 -0
  235. package/dist/view/render/dev-check.d.ts +12 -0
  236. package/dist/view/render/dev-check.js +122 -0
  237. package/dist/view/render/dev-check.js.map +1 -0
  238. package/dist/view/render/hook-part.d.ts +3 -0
  239. package/dist/view/render/hook-part.js +20 -0
  240. package/dist/view/render/hook-part.js.map +1 -0
  241. package/dist/view/render/hooks.d.ts +40 -0
  242. package/dist/view/render/hooks.js +46 -0
  243. package/dist/view/render/hooks.js.map +1 -0
  244. package/dist/view/render/hydrate.d.ts +10 -0
  245. package/dist/view/render/hydrate.js +33 -0
  246. package/dist/view/render/hydrate.js.map +1 -0
  247. package/dist/view/render/instance.d.ts +33 -0
  248. package/dist/view/render/instance.js +107 -0
  249. package/dist/view/render/instance.js.map +1 -0
  250. package/dist/view/render/list.d.ts +20 -0
  251. package/dist/view/render/list.js +156 -0
  252. package/dist/view/render/list.js.map +1 -0
  253. package/dist/view/render/mismatch.d.ts +10 -0
  254. package/dist/view/render/mismatch.js +53 -0
  255. package/dist/view/render/mismatch.js.map +1 -0
  256. package/dist/view/render/nodes.d.ts +10 -0
  257. package/dist/view/render/nodes.js +37 -0
  258. package/dist/view/render/nodes.js.map +1 -0
  259. package/dist/view/render/place.d.ts +18 -0
  260. package/dist/view/render/place.js +69 -0
  261. package/dist/view/render/place.js.map +1 -0
  262. package/dist/view/render/plan.d.ts +26 -0
  263. package/dist/view/render/plan.js +124 -0
  264. package/dist/view/render/plan.js.map +1 -0
  265. package/dist/view/render/raw.d.ts +18 -0
  266. package/dist/view/render/raw.js +68 -0
  267. package/dist/view/render/raw.js.map +1 -0
  268. package/dist/view/render/render.d.ts +12 -0
  269. package/dist/view/render/render.js +60 -0
  270. package/dist/view/render/render.js.map +1 -0
  271. package/dist/view/render/reorder.d.ts +4 -0
  272. package/dist/view/render/reorder.js +101 -0
  273. package/dist/view/render/reorder.js.map +1 -0
  274. package/dist/view/render/rows.d.ts +23 -0
  275. package/dist/view/render/rows.js +95 -0
  276. package/dist/view/render/rows.js.map +1 -0
  277. package/dist/view/render/seen.d.ts +11 -0
  278. package/dist/view/render/seen.js +17 -0
  279. package/dist/view/render/seen.js.map +1 -0
  280. package/dist/view/render/values.d.ts +29 -0
  281. package/dist/view/render/values.js +13 -0
  282. package/dist/view/render/values.js.map +1 -0
  283. package/dist/view/render/warn.d.ts +14 -0
  284. package/dist/view/render/warn.js +69 -0
  285. package/dist/view/render/warn.js.map +1 -0
  286. package/dist/view/server/component.d.ts +9 -0
  287. package/dist/view/server/component.js +42 -0
  288. package/dist/view/server/component.js.map +1 -0
  289. package/dist/view/server/escape.d.ts +10 -0
  290. package/dist/view/server/escape.js +34 -0
  291. package/dist/view/server/escape.js.map +1 -0
  292. package/dist/view/server/index.d.ts +28 -0
  293. package/dist/view/server/index.js +72 -0
  294. package/dist/view/server/index.js.map +1 -0
  295. package/dist/view/server/sha256.d.ts +2 -0
  296. package/dist/view/server/sha256.js +75 -0
  297. package/dist/view/server/sha256.js.map +1 -0
  298. package/dist/view/server/tags.d.ts +57 -0
  299. package/dist/view/server/tags.js +121 -0
  300. package/dist/view/server/tags.js.map +1 -0
  301. package/dist/view/server/values.d.ts +16 -0
  302. package/dist/view/server/values.js +86 -0
  303. package/dist/view/server/values.js.map +1 -0
  304. package/dist/view/server/writer.d.ts +16 -0
  305. package/dist/view/server/writer.js +155 -0
  306. package/dist/view/server/writer.js.map +1 -0
  307. package/dist/view/styles.d.ts +25 -0
  308. package/dist/view/styles.js +58 -0
  309. package/dist/view/styles.js.map +1 -0
  310. package/dist/view/template-element.d.ts +3 -0
  311. package/dist/view/template-element.js +25 -0
  312. package/dist/view/template-element.js.map +1 -0
  313. package/dist/view/template.d.ts +21 -0
  314. package/dist/view/template.js +30 -0
  315. package/dist/view/template.js.map +1 -0
  316. package/dist/vite.d.ts +45 -6
  317. package/dist/vite.js +150 -25
  318. package/dist/vite.js.map +1 -1
  319. package/package.json +41 -7
  320. package/dist/accessible-name.d.ts +0 -19
  321. package/dist/accessible-name.js +0 -56
  322. package/dist/accessible-name.js.map +0 -1
  323. package/dist/element-directive.d.ts +0 -20
  324. package/dist/element-directive.js +0 -31
  325. package/dist/element-directive.js.map +0 -1
  326. package/dist/internal/runtime.d.ts +0 -7
  327. package/dist/internal/runtime.js +0 -8
  328. package/dist/internal/runtime.js.map +0 -1
  329. package/dist/invalid.d.ts +0 -21
  330. package/dist/invalid.js +0 -70
  331. package/dist/invalid.js.map +0 -1
  332. package/dist/live-boolean.d.ts +0 -22
  333. package/dist/live-boolean.js +0 -34
  334. package/dist/live-boolean.js.map +0 -1
  335. package/dist/styles.d.ts +0 -12
  336. package/dist/styles.js +0 -11
  337. package/dist/styles.js.map +0 -1
  338. package/dist/textarea.d.ts +0 -26
  339. package/dist/textarea.js +0 -85
  340. package/dist/textarea.js.map +0 -1
@@ -0,0 +1,152 @@
1
+ // Finds a module's `html` call sites for the template compiler (view/01-templates.md
2
+ // "Compiled"). Two steps, because matching an import against the configured sources may need
3
+ // module resolution (async, in the plugin): `htmlImports` lists the candidate imports, and
4
+ // `findUses` walks the module, scope-aware, for every reference to the matching bindings:
5
+ // - html`…` (or ns.html`…` for `import * as ns`) is a call site;
6
+ // - any other reference (`const h = html`, `html(strings)`, `ns[x]`, `{ html } = ns`) is a
7
+ // leftover the compiler can't follow: an error, since it would reach the runtime preparer;
8
+ // - `export { html }` re-exports it: a warning here, an error in generateBundle when an
9
+ // uncompiled `html` survives in the bundle.
10
+ import { children, nodeAt, nodesAt, scopeNames } from './ast.js';
11
+ const nameOf = (node) => node === undefined
12
+ ? undefined
13
+ : node.type === 'Identifier'
14
+ ? node['name']
15
+ : node.type === 'Literal' && typeof node['value'] === 'string'
16
+ ? node['value']
17
+ : undefined;
18
+ const specifierOf = (node) => nameOf(nodeAt(node, 'source'));
19
+ const isValue = (node) => node['importKind'] !== 'type' && node['exportKind'] !== 'type';
20
+ /** Imports of `html` (named) and namespace imports, plus `export { html } from` re-exports. */
21
+ export function htmlImports(program) {
22
+ const imports = [];
23
+ const reexports = [];
24
+ for (const statement of nodesAt(program, 'body')) {
25
+ const specifier = specifierOf(statement);
26
+ if (specifier === undefined || !isValue(statement))
27
+ continue;
28
+ if (statement.type === 'ImportDeclaration') {
29
+ for (const s of nodesAt(statement, 'specifiers')) {
30
+ const local = nameOf(nodeAt(s, 'local'));
31
+ if (local === undefined || !isValue(s))
32
+ continue;
33
+ if (s.type === 'ImportNamespaceSpecifier') {
34
+ imports.push({ local, namespace: true, specifier });
35
+ }
36
+ else if (s.type === 'ImportSpecifier' && nameOf(nodeAt(s, 'imported')) === 'html') {
37
+ imports.push({ local, namespace: false, specifier });
38
+ }
39
+ }
40
+ }
41
+ else if (statement.type === 'ExportNamedDeclaration') {
42
+ const html = nodesAt(statement, 'specifiers').find((s) => isValue(s) && nameOf(nodeAt(s, 'local')) === 'html');
43
+ if (html !== undefined)
44
+ reexports.push({ node: html, specifier });
45
+ }
46
+ }
47
+ return { imports, reexports };
48
+ }
49
+ const unparen = (node) => node?.type === 'ParenthesizedExpression' ? unparen(nodeAt(node, 'expression')) : node;
50
+ /** Every use of `bindings` in `program`, skipping names that a nested scope redeclares. */
51
+ export function findUses(program, bindings) {
52
+ const byName = new Map(bindings.map((b) => [b.local, b]));
53
+ const sites = [];
54
+ const leftovers = [];
55
+ const scopes = [];
56
+ const binding = (node) => {
57
+ const name = node?.type === 'Identifier' ? node['name'] : undefined;
58
+ if (name === undefined || scopes.some((s) => s.has(name)))
59
+ return undefined;
60
+ return byName.get(name);
61
+ };
62
+ /** The binding a tag refers to: `html` itself, or `ns.html`. */
63
+ const tagBinding = (tag) => {
64
+ if (tag?.type === 'Identifier') {
65
+ const b = binding(tag);
66
+ return b?.namespace === false ? b : undefined;
67
+ }
68
+ if (tag?.type !== 'MemberExpression' || tag['computed'] === true)
69
+ return undefined;
70
+ const b = binding(nodeAt(tag, 'object'));
71
+ return b?.namespace === true && nameOf(nodeAt(tag, 'property')) === 'html' ? b : undefined;
72
+ };
73
+ const walkAll = (nodes) => {
74
+ for (const n of nodes)
75
+ walk(n);
76
+ };
77
+ function visit(node) {
78
+ switch (node.type) {
79
+ case 'ImportDeclaration':
80
+ case 'ExportAllDeclaration':
81
+ case 'MetaProperty':
82
+ case 'BreakStatement':
83
+ case 'ContinueStatement':
84
+ return;
85
+ case 'ExportNamedDeclaration':
86
+ if (nodeAt(node, 'source') === undefined) {
87
+ for (const s of nodesAt(node, 'specifiers')) {
88
+ if (binding(nodeAt(s, 'local')) !== undefined)
89
+ leftovers.push({ node: s, exported: true });
90
+ }
91
+ }
92
+ walkAll(nodesAt(node, 'declaration'));
93
+ return;
94
+ case 'TaggedTemplateExpression': {
95
+ const tag = unparen(nodeAt(node, 'tag'));
96
+ const b = tagBinding(tag);
97
+ if (b === undefined)
98
+ break;
99
+ sites.push({ node, binding: b });
100
+ walkAll(nodesAt(nodeAt(node, 'quasi') ?? node, 'expressions'));
101
+ return;
102
+ }
103
+ case 'MemberExpression': {
104
+ const object = nodeAt(node, 'object');
105
+ const b = binding(object);
106
+ const computed = node['computed'] === true;
107
+ if (b !== undefined) {
108
+ // ns.other is fine; ns.html outside a tag, or ns[expr], can't be followed.
109
+ if (!b.namespace || computed || nameOf(nodeAt(node, 'property')) === 'html') {
110
+ leftovers.push({ node, exported: false });
111
+ }
112
+ }
113
+ else
114
+ walkAll(nodesAt(node, 'object'));
115
+ if (computed)
116
+ walkAll(nodesAt(node, 'property'));
117
+ return;
118
+ }
119
+ case 'Property':
120
+ case 'MethodDefinition':
121
+ case 'PropertyDefinition':
122
+ case 'AccessorProperty':
123
+ if (node['computed'] === true)
124
+ walkAll(nodesAt(node, 'key'));
125
+ walkAll(nodesAt(node, 'decorators'));
126
+ walkAll(nodesAt(node, 'value'));
127
+ return;
128
+ case 'LabeledStatement':
129
+ walkAll(nodesAt(node, 'body'));
130
+ return;
131
+ case 'Identifier':
132
+ if (binding(node) !== undefined)
133
+ leftovers.push({ node, exported: false });
134
+ return;
135
+ }
136
+ walkAll(children(node));
137
+ }
138
+ function walk(node) {
139
+ const declared = scopeNames(node)?.filter((name) => byName.has(name));
140
+ if (declared === undefined || declared.length === 0) {
141
+ visit(node);
142
+ return;
143
+ }
144
+ scopes.push(new Set(declared));
145
+ visit(node);
146
+ scopes.pop();
147
+ }
148
+ if (byName.size > 0)
149
+ walkAll(nodesAt(program, 'body'));
150
+ return { sites, leftovers };
151
+ }
152
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/compiler/scan.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,6FAA6F;AAC7F,2FAA2F;AAC3F,0FAA0F;AAC1F,mEAAmE;AACnE,6FAA6F;AAC7F,+FAA+F;AAC/F,0FAA0F;AAC1F,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAa,MAAM,UAAU,CAAC;AAsB5E,MAAM,MAAM,GAAG,CAAC,IAAsB,EAAsB,EAAE,CAC5D,IAAI,KAAK,SAAS;IAChB,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY;QAC1B,CAAC,CAAE,IAAI,CAAC,MAAM,CAAY;QAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ;YAC5D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACf,CAAC,CAAC,SAAS,CAAC;AAEpB,MAAM,WAAW,GAAG,CAAC,IAAU,EAAsB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvF,MAAM,OAAO,GAAG,CAAC,IAAU,EAAW,EAAE,CACtC,IAAI,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC;AAEjE,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,OAAa;IACvC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAwC,EAAE,CAAC;IAC1D,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,SAAS;QAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACjD,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACtD,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;oBACpF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,CAC3D,CAAC;YACF,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAsB,EAAoB,EAAE,CAC3D,IAAI,EAAE,IAAI,KAAK,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAExF,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,OAAa,EAAE,QAA+B;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAA0C,EAAE,CAAC;IACxD,MAAM,SAAS,GAAwC,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,CAAC,IAAsB,EAA0B,EAAE;QACjE,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAE,IAAI,CAAC,MAAM,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5E,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,gEAAgE;IAChE,MAAM,UAAU,GAAG,CAAC,GAAqB,EAA0B,EAAE;QACnE,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,CAAC;QACD,IAAI,GAAG,EAAE,IAAI,KAAK,kBAAkB,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACnF,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,SAAS,KAAK,CAAC,IAAU;QACvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,mBAAmB,CAAC;YACzB,KAAK,sBAAsB,CAAC;YAC5B,KAAK,cAAc,CAAC;YACpB,KAAK,gBAAgB,CAAC;YACtB,KAAK,mBAAmB;gBACtB,OAAO;YACT,KAAK,wBAAwB;gBAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;oBACzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;wBAC5C,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,SAAS;4BAC3C,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,KAAK,0BAA0B,CAAC,CAAC,CAAC;gBAChC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACzC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM;gBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,2EAA2E;oBAC3E,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;wBAC5E,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;;oBAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACxC,IAAI,QAAQ;oBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,KAAK,UAAU,CAAC;YAChB,KAAK,kBAAkB,CAAC;YACxB,KAAK,oBAAoB,CAAC;YAC1B,KAAK,kBAAkB;gBACrB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI;oBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,KAAK,kBAAkB;gBACrB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC/B,OAAO;YACT,KAAK,YAAY;gBACf,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,SAAS;oBAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3E,OAAO;QACX,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,IAAI,CAAC,IAAU;QACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["// Finds a module's `html` call sites for the template compiler (view/01-templates.md\n// \"Compiled\"). Two steps, because matching an import against the configured sources may need\n// module resolution (async, in the plugin): `htmlImports` lists the candidate imports, and\n// `findUses` walks the module, scope-aware, for every reference to the matching bindings:\n// - html`…` (or ns.html`…` for `import * as ns`) is a call site;\n// - any other reference (`const h = html`, `html(strings)`, `ns[x]`, `{ html } = ns`) is a\n// leftover the compiler can't follow: an error, since it would reach the runtime preparer;\n// - `export { html }` re-exports it: a warning here, an error in generateBundle when an\n// uncompiled `html` survives in the bundle.\nimport { children, nodeAt, nodesAt, scopeNames, type Node } from './ast.js';\n\n/** `import { html as local } from 'specifier'`, or `import * as local from 'specifier'`. */\nexport interface HtmlImport {\n readonly local: string;\n readonly namespace: boolean;\n readonly specifier: string;\n}\n\nexport interface Imports {\n readonly imports: readonly HtmlImport[];\n /** `export { html } from 'specifier'` (its node, for a code frame). */\n readonly reexports: readonly { readonly node: Node; readonly specifier: string }[];\n}\n\nexport interface Uses {\n /** TaggedTemplateExpression nodes whose tag is a matching binding. */\n readonly sites: readonly { readonly node: Node; readonly binding: HtmlImport }[];\n /** Other references; `exported`: an `export { html }` specifier. */\n readonly leftovers: readonly { readonly node: Node; readonly exported: boolean }[];\n}\n\nconst nameOf = (node: Node | undefined): string | undefined =>\n node === undefined\n ? undefined\n : node.type === 'Identifier'\n ? (node['name'] as string)\n : node.type === 'Literal' && typeof node['value'] === 'string'\n ? node['value']\n : undefined;\n\nconst specifierOf = (node: Node): string | undefined => nameOf(nodeAt(node, 'source'));\n\nconst isValue = (node: Node): boolean =>\n node['importKind'] !== 'type' && node['exportKind'] !== 'type';\n\n/** Imports of `html` (named) and namespace imports, plus `export { html } from` re-exports. */\nexport function htmlImports(program: Node): Imports {\n const imports: HtmlImport[] = [];\n const reexports: { node: Node; specifier: string }[] = [];\n for (const statement of nodesAt(program, 'body')) {\n const specifier = specifierOf(statement);\n if (specifier === undefined || !isValue(statement)) continue;\n if (statement.type === 'ImportDeclaration') {\n for (const s of nodesAt(statement, 'specifiers')) {\n const local = nameOf(nodeAt(s, 'local'));\n if (local === undefined || !isValue(s)) continue;\n if (s.type === 'ImportNamespaceSpecifier') {\n imports.push({ local, namespace: true, specifier });\n } else if (s.type === 'ImportSpecifier' && nameOf(nodeAt(s, 'imported')) === 'html') {\n imports.push({ local, namespace: false, specifier });\n }\n }\n } else if (statement.type === 'ExportNamedDeclaration') {\n const html = nodesAt(statement, 'specifiers').find(\n (s) => isValue(s) && nameOf(nodeAt(s, 'local')) === 'html',\n );\n if (html !== undefined) reexports.push({ node: html, specifier });\n }\n }\n return { imports, reexports };\n}\n\nconst unparen = (node: Node | undefined): Node | undefined =>\n node?.type === 'ParenthesizedExpression' ? unparen(nodeAt(node, 'expression')) : node;\n\n/** Every use of `bindings` in `program`, skipping names that a nested scope redeclares. */\nexport function findUses(program: Node, bindings: readonly HtmlImport[]): Uses {\n const byName = new Map(bindings.map((b) => [b.local, b]));\n const sites: { node: Node; binding: HtmlImport }[] = [];\n const leftovers: { node: Node; exported: boolean }[] = [];\n const scopes: Set<string>[] = [];\n\n const binding = (node: Node | undefined): HtmlImport | undefined => {\n const name = node?.type === 'Identifier' ? (node['name'] as string) : undefined;\n if (name === undefined || scopes.some((s) => s.has(name))) return undefined;\n return byName.get(name);\n };\n\n /** The binding a tag refers to: `html` itself, or `ns.html`. */\n const tagBinding = (tag: Node | undefined): HtmlImport | undefined => {\n if (tag?.type === 'Identifier') {\n const b = binding(tag);\n return b?.namespace === false ? b : undefined;\n }\n if (tag?.type !== 'MemberExpression' || tag['computed'] === true) return undefined;\n const b = binding(nodeAt(tag, 'object'));\n return b?.namespace === true && nameOf(nodeAt(tag, 'property')) === 'html' ? b : undefined;\n };\n\n const walkAll = (nodes: readonly Node[]): void => {\n for (const n of nodes) walk(n);\n };\n\n function visit(node: Node): void {\n switch (node.type) {\n case 'ImportDeclaration':\n case 'ExportAllDeclaration':\n case 'MetaProperty':\n case 'BreakStatement':\n case 'ContinueStatement':\n return;\n case 'ExportNamedDeclaration':\n if (nodeAt(node, 'source') === undefined) {\n for (const s of nodesAt(node, 'specifiers')) {\n if (binding(nodeAt(s, 'local')) !== undefined)\n leftovers.push({ node: s, exported: true });\n }\n }\n walkAll(nodesAt(node, 'declaration'));\n return;\n case 'TaggedTemplateExpression': {\n const tag = unparen(nodeAt(node, 'tag'));\n const b = tagBinding(tag);\n if (b === undefined) break;\n sites.push({ node, binding: b });\n walkAll(nodesAt(nodeAt(node, 'quasi') ?? node, 'expressions'));\n return;\n }\n case 'MemberExpression': {\n const object = nodeAt(node, 'object');\n const b = binding(object);\n const computed = node['computed'] === true;\n if (b !== undefined) {\n // ns.other is fine; ns.html outside a tag, or ns[expr], can't be followed.\n if (!b.namespace || computed || nameOf(nodeAt(node, 'property')) === 'html') {\n leftovers.push({ node, exported: false });\n }\n } else walkAll(nodesAt(node, 'object'));\n if (computed) walkAll(nodesAt(node, 'property'));\n return;\n }\n case 'Property':\n case 'MethodDefinition':\n case 'PropertyDefinition':\n case 'AccessorProperty':\n if (node['computed'] === true) walkAll(nodesAt(node, 'key'));\n walkAll(nodesAt(node, 'decorators'));\n walkAll(nodesAt(node, 'value'));\n return;\n case 'LabeledStatement':\n walkAll(nodesAt(node, 'body'));\n return;\n case 'Identifier':\n if (binding(node) !== undefined) leftovers.push({ node, exported: false });\n return;\n }\n walkAll(children(node));\n }\n\n function walk(node: Node): void {\n const declared = scopeNames(node)?.filter((name) => byName.has(name));\n if (declared === undefined || declared.length === 0) {\n visit(node);\n return;\n }\n scopes.push(new Set(declared));\n visit(node);\n scopes.pop();\n }\n\n if (byName.size > 0) walkAll(nodesAt(program, 'body'));\n return { sites, leftovers };\n}\n"]}
@@ -0,0 +1,34 @@
1
+ export interface Position {
2
+ /** 1-based. */
3
+ readonly line: number;
4
+ /** 0-based. */
5
+ readonly column: number;
6
+ }
7
+ export declare class Lines {
8
+ readonly code: string;
9
+ private readonly starts;
10
+ constructor(code: string);
11
+ position(offset: number): Position;
12
+ /** Two lines of context around `offset`, with a caret under it (Vite prints it). */
13
+ frame(offset: number, end?: number): string;
14
+ }
15
+ export interface Edit {
16
+ readonly start: number;
17
+ readonly end: number;
18
+ readonly text: string;
19
+ }
20
+ export interface SourceMap {
21
+ readonly version: 3;
22
+ readonly sources: string[];
23
+ readonly names: string[];
24
+ readonly mappings: string;
25
+ }
26
+ /**
27
+ * Applies non-overlapping `edits` to `lines.code` and maps the result back to it: a segment at
28
+ * the start of every output line and at every edit boundary (line-level precision, like
29
+ * magic-string without `hires`).
30
+ */
31
+ export declare function splice(lines: Lines, edits: readonly Edit[], file: string): {
32
+ code: string;
33
+ map: SourceMap;
34
+ };
@@ -0,0 +1,114 @@
1
+ // Module text helpers for the template compiler: offsets to line/column, code frames for build
2
+ // errors, and string splicing with a source map (no magic-string: @gyral/core has no runtime
3
+ // dependencies, and Vite doesn't expose one to plugins).
4
+ export class Lines {
5
+ constructor(code) {
6
+ this.code = code;
7
+ this.starts = [0];
8
+ for (let k = code.indexOf('\n'); k !== -1; k = code.indexOf('\n', k + 1)) {
9
+ this.starts.push(k + 1);
10
+ }
11
+ }
12
+ position(offset) {
13
+ let lo = 0;
14
+ let hi = this.starts.length - 1;
15
+ while (lo < hi) {
16
+ const mid = (lo + hi + 1) >> 1;
17
+ if ((this.starts[mid] ?? 0) <= offset)
18
+ lo = mid;
19
+ else
20
+ hi = mid - 1;
21
+ }
22
+ return { line: lo + 1, column: offset - (this.starts[lo] ?? 0) };
23
+ }
24
+ /** Two lines of context around `offset`, with a caret under it (Vite prints it). */
25
+ frame(offset, end = offset + 1) {
26
+ const { line, column } = this.position(offset);
27
+ const lines = this.code.split('\n');
28
+ const first = Math.max(1, line - 2);
29
+ const last = Math.min(lines.length, line + 2);
30
+ const width = String(last).length;
31
+ const out = [];
32
+ for (let n = first; n <= last; n++) {
33
+ const text = lines[n - 1] ?? '';
34
+ out.push(`${n === line ? '>' : ' '} ${String(n).padStart(width)} | ${text}`);
35
+ if (n === line) {
36
+ const span = Math.max(1, Math.min(end - offset, text.length - column));
37
+ out.push(` ${' '.repeat(width)} | ${' '.repeat(column)}${'^'.repeat(span)}`);
38
+ }
39
+ }
40
+ return out.join('\n');
41
+ }
42
+ }
43
+ const B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
44
+ function vlq(value) {
45
+ let v = value < 0 ? (-value << 1) | 1 : value << 1;
46
+ let out = '';
47
+ do {
48
+ let digit = v & 31;
49
+ v >>>= 5;
50
+ if (v > 0)
51
+ digit |= 32;
52
+ out += B64[digit] ?? '';
53
+ } while (v > 0);
54
+ return out;
55
+ }
56
+ /**
57
+ * Applies non-overlapping `edits` to `lines.code` and maps the result back to it: a segment at
58
+ * the start of every output line and at every edit boundary (line-level precision, like
59
+ * magic-string without `hires`).
60
+ */
61
+ export function splice(lines, edits, file) {
62
+ const { code } = lines;
63
+ const sorted = [...edits].sort((a, b) => a.start - b.start);
64
+ let out = '';
65
+ const mapLines = [[]];
66
+ let genCol = 0;
67
+ let prev = { line: 0, column: 0 };
68
+ let prevGenCol = 0;
69
+ const mark = (offset) => {
70
+ const { line, column } = lines.position(offset);
71
+ const at = { line: line - 1, column };
72
+ const row = mapLines.at(-1);
73
+ if (row === undefined)
74
+ return;
75
+ if (row.length === 0)
76
+ prevGenCol = 0;
77
+ row.push(vlq(genCol - prevGenCol) + 'A' + vlq(at.line - prev.line) + vlq(at.column - prev.column));
78
+ prevGenCol = genCol;
79
+ prev = at;
80
+ };
81
+ const write = (text, origin, original) => {
82
+ let from = 0;
83
+ mark(origin);
84
+ for (let nl = text.indexOf('\n'); nl !== -1; nl = text.indexOf('\n', from)) {
85
+ out += text.slice(from, nl + 1);
86
+ from = nl + 1;
87
+ mapLines.push([]);
88
+ genCol = 0;
89
+ mark(original ? origin + from : origin);
90
+ }
91
+ out += text.slice(from);
92
+ genCol += text.length - from;
93
+ };
94
+ let pos = 0;
95
+ for (const edit of sorted) {
96
+ if (edit.start > pos)
97
+ write(code.slice(pos, edit.start), pos, true);
98
+ if (edit.text !== '')
99
+ write(edit.text, edit.start, false);
100
+ pos = Math.max(pos, edit.end);
101
+ }
102
+ if (pos < code.length)
103
+ write(code.slice(pos), pos, true);
104
+ return {
105
+ code: out,
106
+ map: {
107
+ version: 3,
108
+ sources: [file],
109
+ names: [],
110
+ mappings: mapLines.map((r) => r.join(',')).join(';'),
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/compiler/source.ts"],"names":[],"mappings":"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","sourcesContent":["// Module text helpers for the template compiler: offsets to line/column, code frames for build\n// errors, and string splicing with a source map (no magic-string: @gyral/core has no runtime\n// dependencies, and Vite doesn't expose one to plugins).\n\nexport interface Position {\n /** 1-based. */\n readonly line: number;\n /** 0-based. */\n readonly column: number;\n}\n\nexport class Lines {\n private readonly starts: number[] = [0];\n\n constructor(readonly code: string) {\n for (let k = code.indexOf('\\n'); k !== -1; k = code.indexOf('\\n', k + 1)) {\n this.starts.push(k + 1);\n }\n }\n\n position(offset: number): Position {\n let lo = 0;\n let hi = this.starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if ((this.starts[mid] ?? 0) <= offset) lo = mid;\n else hi = mid - 1;\n }\n return { line: lo + 1, column: offset - (this.starts[lo] ?? 0) };\n }\n\n /** Two lines of context around `offset`, with a caret under it (Vite prints it). */\n frame(offset: number, end = offset + 1): string {\n const { line, column } = this.position(offset);\n const lines = this.code.split('\\n');\n const first = Math.max(1, line - 2);\n const last = Math.min(lines.length, line + 2);\n const width = String(last).length;\n const out: string[] = [];\n for (let n = first; n <= last; n++) {\n const text = lines[n - 1] ?? '';\n out.push(`${n === line ? '>' : ' '} ${String(n).padStart(width)} | ${text}`);\n if (n === line) {\n const span = Math.max(1, Math.min(end - offset, text.length - column));\n out.push(` ${' '.repeat(width)} | ${' '.repeat(column)}${'^'.repeat(span)}`);\n }\n }\n return out.join('\\n');\n }\n}\n\nexport interface Edit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n}\n\nexport interface SourceMap {\n readonly version: 3;\n readonly sources: string[];\n readonly names: string[];\n readonly mappings: string;\n}\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction vlq(value: number): string {\n let v = value < 0 ? (-value << 1) | 1 : value << 1;\n let out = '';\n do {\n let digit = v & 31;\n v >>>= 5;\n if (v > 0) digit |= 32;\n out += B64[digit] ?? '';\n } while (v > 0);\n return out;\n}\n\n/**\n * Applies non-overlapping `edits` to `lines.code` and maps the result back to it: a segment at\n * the start of every output line and at every edit boundary (line-level precision, like\n * magic-string without `hires`).\n */\nexport function splice(\n lines: Lines,\n edits: readonly Edit[],\n file: string,\n): { code: string; map: SourceMap } {\n const { code } = lines;\n const sorted = [...edits].sort((a, b) => a.start - b.start);\n let out = '';\n const mapLines: string[][] = [[]];\n let genCol = 0;\n let prev = { line: 0, column: 0 };\n let prevGenCol = 0;\n\n const mark = (offset: number): void => {\n const { line, column } = lines.position(offset);\n const at = { line: line - 1, column };\n const row = mapLines.at(-1);\n if (row === undefined) return;\n if (row.length === 0) prevGenCol = 0;\n row.push(\n vlq(genCol - prevGenCol) + 'A' + vlq(at.line - prev.line) + vlq(at.column - prev.column),\n );\n prevGenCol = genCol;\n prev = at;\n };\n\n const write = (text: string, origin: number, original: boolean): void => {\n let from = 0;\n mark(origin);\n for (let nl = text.indexOf('\\n'); nl !== -1; nl = text.indexOf('\\n', from)) {\n out += text.slice(from, nl + 1);\n from = nl + 1;\n mapLines.push([]);\n genCol = 0;\n mark(original ? origin + from : origin);\n }\n out += text.slice(from);\n genCol += text.length - from;\n };\n\n let pos = 0;\n for (const edit of sorted) {\n if (edit.start > pos) write(code.slice(pos, edit.start), pos, true);\n if (edit.text !== '') write(edit.text, edit.start, false);\n pos = Math.max(pos, edit.end);\n }\n if (pos < code.length) write(code.slice(pos), pos, true);\n return {\n code: out,\n map: {\n version: 3,\n sources: [file],\n names: [],\n mappings: mapLines.map((r) => r.join(',')).join(';'),\n },\n };\n}\n"]}
package/dist/define.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { ComponentSpec, Tagged } from './types.js';
3
3
  export type { GyralElement, GyralElementClass } from './element-types.js';
4
4
  /**
5
5
  * Compiles a Model-View-Intent spec into a custom element and registers it under `tag`.
6
- * See docs/design-docs/0001-mvi-parsed-intent.md, 0006-effects-and-drivers.md, 0007-props.md
7
- * 0008-forms.md and 0012-ssr.md.
6
+ * See docs/design-docs/0001-mvi-parsed-intent.md, 0006-effects-and-drivers.md, 0007-props.md,
7
+ * 0008-forms.md and view/05-element.md.
8
8
  */
9
9
  export declare function define<S, M extends Tagged, P extends object = object, O extends Tagged = never>(tag: string, spec: ComponentSpec<S, M, P>): GyralElementClass<S, M, P, O>;