@velarscript/web 0.31.0 → 0.33.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 (393) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/calls/intrinsics/config.d.ts +10 -0
  3. package/dist/analysis/calls/intrinsics/config.d.ts.map +1 -0
  4. package/dist/analysis/calls/intrinsics/config.js +19 -0
  5. package/dist/analysis/calls/intrinsics/config.js.map +1 -0
  6. package/dist/analysis/calls/intrinsics/forms.d.ts +10 -0
  7. package/dist/analysis/calls/intrinsics/forms.d.ts.map +1 -0
  8. package/dist/analysis/calls/intrinsics/forms.js +38 -0
  9. package/dist/analysis/calls/intrinsics/forms.js.map +1 -0
  10. package/dist/analysis/calls/intrinsics/http.d.ts +10 -0
  11. package/dist/analysis/calls/intrinsics/http.d.ts.map +1 -0
  12. package/dist/analysis/calls/intrinsics/http.js +37 -0
  13. package/dist/analysis/calls/intrinsics/http.js.map +1 -0
  14. package/dist/analysis/calls/intrinsics/reactive.d.ts +10 -0
  15. package/dist/analysis/calls/intrinsics/reactive.d.ts.map +1 -0
  16. package/dist/analysis/calls/intrinsics/reactive.js +30 -0
  17. package/dist/analysis/calls/intrinsics/reactive.js.map +1 -0
  18. package/dist/analysis/calls/intrinsics/storage.d.ts +16 -0
  19. package/dist/analysis/calls/intrinsics/storage.d.ts.map +1 -0
  20. package/dist/analysis/calls/intrinsics/storage.js +91 -0
  21. package/dist/analysis/calls/intrinsics/storage.js.map +1 -0
  22. package/dist/analysis/calls/intrinsics/web.d.ts +10 -0
  23. package/dist/analysis/calls/intrinsics/web.d.ts.map +1 -0
  24. package/dist/analysis/calls/intrinsics/web.js +100 -0
  25. package/dist/analysis/calls/intrinsics/web.js.map +1 -0
  26. package/dist/analysis/calls/intrinsics.d.ts +13 -0
  27. package/dist/analysis/calls/intrinsics.d.ts.map +1 -0
  28. package/dist/analysis/calls/intrinsics.js +31 -0
  29. package/dist/analysis/calls/intrinsics.js.map +1 -0
  30. package/dist/analysis/components/contracts.d.ts +19 -0
  31. package/dist/analysis/components/contracts.d.ts.map +1 -0
  32. package/dist/analysis/components/contracts.js +83 -0
  33. package/dist/analysis/components/contracts.js.map +1 -0
  34. package/dist/analysis/components/declaration.d.ts +4 -0
  35. package/dist/analysis/components/declaration.d.ts.map +1 -0
  36. package/dist/analysis/components/declaration.js +163 -0
  37. package/dist/analysis/components/declaration.js.map +1 -0
  38. package/dist/analysis/components/host.d.ts +61 -0
  39. package/dist/analysis/components/host.d.ts.map +1 -0
  40. package/dist/analysis/components/host.js +22 -0
  41. package/dist/analysis/components/host.js.map +1 -0
  42. package/dist/analysis/components/lifecycle.d.ts +22 -0
  43. package/dist/analysis/components/lifecycle.d.ts.map +1 -0
  44. package/dist/analysis/components/lifecycle.js +33 -0
  45. package/dist/analysis/components/lifecycle.js.map +1 -0
  46. package/dist/analysis/components/ownership.d.ts +74 -0
  47. package/dist/analysis/components/ownership.d.ts.map +1 -0
  48. package/dist/analysis/components/ownership.js +106 -0
  49. package/dist/analysis/components/ownership.js.map +1 -0
  50. package/dist/analysis/declarations.d.ts +99 -0
  51. package/dist/analysis/declarations.d.ts.map +1 -0
  52. package/dist/analysis/declarations.js +176 -0
  53. package/dist/analysis/declarations.js.map +1 -0
  54. package/dist/analysis/inference.d.ts +75 -0
  55. package/dist/analysis/inference.d.ts.map +1 -0
  56. package/dist/analysis/inference.js +257 -0
  57. package/dist/analysis/inference.js.map +1 -0
  58. package/dist/analysis/jsx/attributes.d.ts +103 -0
  59. package/dist/analysis/jsx/attributes.d.ts.map +1 -0
  60. package/dist/analysis/jsx/attributes.js +601 -0
  61. package/dist/analysis/jsx/attributes.js.map +1 -0
  62. package/dist/analysis/jsx/elements.d.ts +17 -0
  63. package/dist/analysis/jsx/elements.d.ts.map +1 -0
  64. package/dist/analysis/jsx/elements.js +213 -0
  65. package/dist/analysis/jsx/elements.js.map +1 -0
  66. package/dist/analysis/jsx/host.d.ts +61 -0
  67. package/dist/analysis/jsx/host.d.ts.map +1 -0
  68. package/dist/analysis/jsx/host.js +15 -0
  69. package/dist/analysis/jsx/host.js.map +1 -0
  70. package/dist/analysis/jsx/keys.d.ts +15 -0
  71. package/dist/analysis/jsx/keys.d.ts.map +1 -0
  72. package/dist/analysis/jsx/keys.js +67 -0
  73. package/dist/analysis/jsx/keys.js.map +1 -0
  74. package/dist/analysis/jsx/security.d.ts +29 -0
  75. package/dist/analysis/jsx/security.d.ts.map +1 -0
  76. package/dist/analysis/jsx/security.js +61 -0
  77. package/dist/analysis/jsx/security.js.map +1 -0
  78. package/dist/analysis/jsx-detection.d.ts +49 -0
  79. package/dist/analysis/jsx-detection.d.ts.map +1 -0
  80. package/dist/analysis/jsx-detection.js +196 -0
  81. package/dist/analysis/jsx-detection.js.map +1 -0
  82. package/dist/analysis/keyed-rebuild.d.ts +148 -0
  83. package/dist/analysis/keyed-rebuild.d.ts.map +1 -0
  84. package/dist/analysis/keyed-rebuild.js +299 -0
  85. package/dist/analysis/keyed-rebuild.js.map +1 -0
  86. package/dist/analysis/keyframes-analysis.d.ts +6 -0
  87. package/dist/analysis/keyframes-analysis.d.ts.map +1 -0
  88. package/dist/analysis/keyframes-analysis.js +79 -0
  89. package/dist/analysis/keyframes-analysis.js.map +1 -0
  90. package/dist/analysis/look/builders.d.ts +29 -0
  91. package/dist/analysis/look/builders.d.ts.map +1 -0
  92. package/dist/analysis/look/builders.js +174 -0
  93. package/dist/analysis/look/builders.js.map +1 -0
  94. package/dist/analysis/look/conditions.d.ts +13 -0
  95. package/dist/analysis/look/conditions.d.ts.map +1 -0
  96. package/dist/analysis/look/conditions.js +84 -0
  97. package/dist/analysis/look/conditions.js.map +1 -0
  98. package/dist/analysis/look/edits.d.ts +36 -0
  99. package/dist/analysis/look/edits.d.ts.map +1 -0
  100. package/dist/analysis/look/edits.js +80 -0
  101. package/dist/analysis/look/edits.js.map +1 -0
  102. package/dist/analysis/look/entries.d.ts +56 -0
  103. package/dist/analysis/look/entries.d.ts.map +1 -0
  104. package/dist/analysis/look/entries.js +223 -0
  105. package/dist/analysis/look/entries.js.map +1 -0
  106. package/dist/analysis/look/host.d.ts +47 -0
  107. package/dist/analysis/look/host.d.ts.map +1 -0
  108. package/dist/analysis/look/host.js +16 -0
  109. package/dist/analysis/look/host.js.map +1 -0
  110. package/dist/analysis/look/tokens.d.ts +75 -0
  111. package/dist/analysis/look/tokens.d.ts.map +1 -0
  112. package/dist/analysis/look/tokens.js +156 -0
  113. package/dist/analysis/look/tokens.js.map +1 -0
  114. package/dist/analysis/look/values.d.ts +45 -0
  115. package/dist/analysis/look/values.d.ts.map +1 -0
  116. package/dist/analysis/look/values.js +148 -0
  117. package/dist/analysis/look/values.js.map +1 -0
  118. package/dist/analysis/look-conditions.d.ts +47 -0
  119. package/dist/analysis/look-conditions.d.ts.map +1 -0
  120. package/dist/analysis/look-conditions.js +157 -0
  121. package/dist/analysis/look-conditions.js.map +1 -0
  122. package/dist/analysis/look-sites.d.ts +62 -0
  123. package/dist/analysis/look-sites.d.ts.map +1 -0
  124. package/dist/analysis/look-sites.js +121 -0
  125. package/dist/analysis/look-sites.js.map +1 -0
  126. package/dist/analysis/look-values.d.ts +19 -0
  127. package/dist/analysis/look-values.d.ts.map +1 -1
  128. package/dist/analysis/look-values.js +38 -0
  129. package/dist/analysis/look-values.js.map +1 -1
  130. package/dist/analysis/look-vocabulary-guidance.d.ts +76 -0
  131. package/dist/analysis/look-vocabulary-guidance.d.ts.map +1 -0
  132. package/dist/analysis/look-vocabulary-guidance.js +338 -0
  133. package/dist/analysis/look-vocabulary-guidance.js.map +1 -0
  134. package/dist/analysis/media-conditions.d.ts +33 -0
  135. package/dist/analysis/media-conditions.d.ts.map +1 -0
  136. package/dist/analysis/media-conditions.js +92 -0
  137. package/dist/analysis/media-conditions.js.map +1 -0
  138. package/dist/analysis/program-passes.d.ts +106 -0
  139. package/dist/analysis/program-passes.d.ts.map +1 -0
  140. package/dist/analysis/program-passes.js +149 -0
  141. package/dist/analysis/program-passes.js.map +1 -0
  142. package/dist/analysis/reactivity/bindings.d.ts +37 -0
  143. package/dist/analysis/reactivity/bindings.d.ts.map +1 -0
  144. package/dist/analysis/reactivity/bindings.js +88 -0
  145. package/dist/analysis/reactivity/bindings.js.map +1 -0
  146. package/dist/analysis/reactivity/derived.d.ts +39 -0
  147. package/dist/analysis/reactivity/derived.d.ts.map +1 -0
  148. package/dist/analysis/reactivity/derived.js +80 -0
  149. package/dist/analysis/reactivity/derived.js.map +1 -0
  150. package/dist/analysis/reactivity/host.d.ts +38 -0
  151. package/dist/analysis/reactivity/host.d.ts.map +1 -0
  152. package/dist/analysis/reactivity/host.js +14 -0
  153. package/dist/analysis/reactivity/host.js.map +1 -0
  154. package/dist/analysis/reactivity/retired-accessors.d.ts +82 -0
  155. package/dist/analysis/reactivity/retired-accessors.d.ts.map +1 -0
  156. package/dist/analysis/reactivity/retired-accessors.js +118 -0
  157. package/dist/analysis/reactivity/retired-accessors.js.map +1 -0
  158. package/dist/analysis/renderable.d.ts +47 -0
  159. package/dist/analysis/renderable.d.ts.map +1 -0
  160. package/dist/analysis/renderable.js +105 -0
  161. package/dist/analysis/renderable.js.map +1 -0
  162. package/dist/analysis/routes.d.ts +64 -0
  163. package/dist/analysis/routes.d.ts.map +1 -0
  164. package/dist/analysis/routes.js +182 -0
  165. package/dist/analysis/routes.js.map +1 -0
  166. package/dist/analysis/url-attributes.d.ts +12 -0
  167. package/dist/analysis/url-attributes.d.ts.map +1 -0
  168. package/dist/analysis/url-attributes.js +48 -0
  169. package/dist/analysis/url-attributes.js.map +1 -0
  170. package/dist/analysis/watch-cycles.d.ts +102 -0
  171. package/dist/analysis/watch-cycles.d.ts.map +1 -1
  172. package/dist/analysis/watch-cycles.js +240 -1
  173. package/dist/analysis/watch-cycles.js.map +1 -1
  174. package/dist/analysis/watch-subject.d.ts +45 -0
  175. package/dist/analysis/watch-subject.d.ts.map +1 -0
  176. package/dist/analysis/watch-subject.js +272 -0
  177. package/dist/analysis/watch-subject.js.map +1 -0
  178. package/dist/analysis/web-types.d.ts +27 -0
  179. package/dist/analysis/web-types.d.ts.map +1 -0
  180. package/dist/analysis/web-types.js +170 -0
  181. package/dist/analysis/web-types.js.map +1 -0
  182. package/dist/analyzer.d.ts +18 -617
  183. package/dist/analyzer.d.ts.map +1 -1
  184. package/dist/analyzer.js +211 -4853
  185. package/dist/analyzer.js.map +1 -1
  186. package/dist/compiler.d.ts +20 -0
  187. package/dist/compiler.d.ts.map +1 -1
  188. package/dist/compiler.js +31 -864
  189. package/dist/compiler.js.map +1 -1
  190. package/dist/documentation.d.ts +28 -0
  191. package/dist/documentation.d.ts.map +1 -0
  192. package/dist/documentation.js +67 -0
  193. package/dist/documentation.js.map +1 -0
  194. package/dist/editor/completions.d.ts +12 -0
  195. package/dist/editor/completions.d.ts.map +1 -0
  196. package/dist/editor/completions.js +6 -0
  197. package/dist/editor/completions.js.map +1 -0
  198. package/dist/editor/jsx-completion.d.ts +12 -0
  199. package/dist/editor/jsx-completion.d.ts.map +1 -0
  200. package/dist/editor/jsx-completion.js +137 -0
  201. package/dist/editor/jsx-completion.js.map +1 -0
  202. package/dist/editor/look-completion.d.ts +29 -0
  203. package/dist/editor/look-completion.d.ts.map +1 -0
  204. package/dist/editor/look-completion.js +159 -0
  205. package/dist/editor/look-completion.js.map +1 -0
  206. package/dist/editor.d.ts.map +1 -1
  207. package/dist/editor.js +12 -288
  208. package/dist/editor.js.map +1 -1
  209. package/dist/emit/components.d.ts +33 -0
  210. package/dist/emit/components.d.ts.map +1 -0
  211. package/dist/emit/components.js +135 -0
  212. package/dist/emit/components.js.map +1 -0
  213. package/dist/emit/jsx.d.ts +57 -0
  214. package/dist/emit/jsx.d.ts.map +1 -0
  215. package/dist/emit/jsx.js +384 -0
  216. package/dist/emit/jsx.js.map +1 -0
  217. package/dist/emit/look-css.d.ts +44 -0
  218. package/dist/emit/look-css.d.ts.map +1 -0
  219. package/dist/emit/look-css.js +177 -0
  220. package/dist/emit/look-css.js.map +1 -0
  221. package/dist/emit/look.d.ts +39 -0
  222. package/dist/emit/look.d.ts.map +1 -0
  223. package/dist/emit/look.js +218 -0
  224. package/dist/emit/look.js.map +1 -0
  225. package/dist/emit/runtime-imports.d.ts +40 -0
  226. package/dist/emit/runtime-imports.d.ts.map +1 -0
  227. package/dist/emit/runtime-imports.js +188 -0
  228. package/dist/emit/runtime-imports.js.map +1 -0
  229. package/dist/emitter.d.ts +15 -68
  230. package/dist/emitter.d.ts.map +1 -1
  231. package/dist/emitter.js +79 -1008
  232. package/dist/emitter.js.map +1 -1
  233. package/dist/look/animation.d.ts +7 -0
  234. package/dist/look/animation.d.ts.map +1 -0
  235. package/dist/look/animation.js +13 -0
  236. package/dist/look/animation.js.map +1 -0
  237. package/dist/look/builders.d.ts +35 -0
  238. package/dist/look/builders.d.ts.map +1 -0
  239. package/dist/look/builders.js +74 -0
  240. package/dist/look/builders.js.map +1 -0
  241. package/dist/look/css-functions.d.ts +28 -0
  242. package/dist/look/css-functions.d.ts.map +1 -0
  243. package/dist/look/css-functions.js +54 -0
  244. package/dist/look/css-functions.js.map +1 -0
  245. package/dist/look/keyword-sets.d.ts +41 -0
  246. package/dist/look/keyword-sets.d.ts.map +1 -0
  247. package/dist/look/keyword-sets.js +117 -0
  248. package/dist/look/keyword-sets.js.map +1 -0
  249. package/dist/look/keywords.d.ts +55 -0
  250. package/dist/look/keywords.d.ts.map +1 -0
  251. package/dist/look/keywords.js +387 -0
  252. package/dist/look/keywords.js.map +1 -0
  253. package/dist/look/media.d.ts +19 -0
  254. package/dist/look/media.d.ts.map +1 -0
  255. package/dist/look/media.js +27 -0
  256. package/dist/look/media.js.map +1 -0
  257. package/dist/look/naming.d.ts +9 -0
  258. package/dist/look/naming.d.ts.map +1 -0
  259. package/dist/look/naming.js +45 -0
  260. package/dist/look/naming.js.map +1 -0
  261. package/dist/look/properties.d.ts +16 -0
  262. package/dist/look/properties.d.ts.map +1 -0
  263. package/dist/look/properties.js +52 -0
  264. package/dist/look/properties.js.map +1 -0
  265. package/dist/look/shorthands.d.ts +25 -0
  266. package/dist/look/shorthands.d.ts.map +1 -0
  267. package/dist/look/shorthands.js +130 -0
  268. package/dist/look/shorthands.js.map +1 -0
  269. package/dist/look/tokens.d.ts +38 -0
  270. package/dist/look/tokens.d.ts.map +1 -0
  271. package/dist/look/tokens.js +59 -0
  272. package/dist/look/tokens.js.map +1 -0
  273. package/dist/look/units.d.ts +24 -0
  274. package/dist/look/units.d.ts.map +1 -0
  275. package/dist/look/units.js +33 -0
  276. package/dist/look/units.js.map +1 -0
  277. package/dist/look.d.ts +32 -227
  278. package/dist/look.d.ts.map +1 -1
  279. package/dist/look.js +28 -933
  280. package/dist/look.js.map +1 -1
  281. package/dist/module-roster.d.ts +16 -0
  282. package/dist/module-roster.d.ts.map +1 -0
  283. package/dist/module-roster.js +28 -0
  284. package/dist/module-roster.js.map +1 -0
  285. package/dist/modules/app.d.ts +9 -0
  286. package/dist/modules/app.d.ts.map +1 -0
  287. package/dist/modules/app.js +20 -0
  288. package/dist/modules/app.js.map +1 -0
  289. package/dist/modules/browser-test.d.ts +9 -0
  290. package/dist/modules/browser-test.d.ts.map +1 -0
  291. package/dist/modules/browser-test.js +67 -0
  292. package/dist/modules/browser-test.js.map +1 -0
  293. package/dist/modules/browser.d.ts +10 -0
  294. package/dist/modules/browser.d.ts.map +1 -0
  295. package/dist/modules/browser.js +89 -0
  296. package/dist/modules/browser.js.map +1 -0
  297. package/dist/modules/config.d.ts +9 -0
  298. package/dist/modules/config.d.ts.map +1 -0
  299. package/dist/modules/config.js +14 -0
  300. package/dist/modules/config.js.map +1 -0
  301. package/dist/modules/files.d.ts +9 -0
  302. package/dist/modules/files.d.ts.map +1 -0
  303. package/dist/modules/files.js +16 -0
  304. package/dist/modules/files.js.map +1 -0
  305. package/dist/modules/forms.d.ts +9 -0
  306. package/dist/modules/forms.d.ts.map +1 -0
  307. package/dist/modules/forms.js +26 -0
  308. package/dist/modules/forms.js.map +1 -0
  309. package/dist/modules/http.d.ts +9 -0
  310. package/dist/modules/http.d.ts.map +1 -0
  311. package/dist/modules/http.js +127 -0
  312. package/dist/modules/http.js.map +1 -0
  313. package/dist/modules/look.d.ts +9 -0
  314. package/dist/modules/look.d.ts.map +1 -0
  315. package/dist/modules/look.js +58 -0
  316. package/dist/modules/look.js.map +1 -0
  317. package/dist/modules/realtime.d.ts +9 -0
  318. package/dist/modules/realtime.d.ts.map +1 -0
  319. package/dist/modules/realtime.js +163 -0
  320. package/dist/modules/realtime.js.map +1 -0
  321. package/dist/modules/storage.d.ts +9 -0
  322. package/dist/modules/storage.d.ts.map +1 -0
  323. package/dist/modules/storage.js +59 -0
  324. package/dist/modules/storage.js.map +1 -0
  325. package/dist/modules/types.d.ts +78 -0
  326. package/dist/modules/types.d.ts.map +1 -0
  327. package/dist/modules/types.js +154 -0
  328. package/dist/modules/types.js.map +1 -0
  329. package/dist/modules/web.d.ts +9 -0
  330. package/dist/modules/web.d.ts.map +1 -0
  331. package/dist/modules/web.js +63 -0
  332. package/dist/modules/web.js.map +1 -0
  333. package/dist/modules/websocket.d.ts +11 -0
  334. package/dist/modules/websocket.d.ts.map +1 -0
  335. package/dist/modules/websocket.js +75 -0
  336. package/dist/modules/websocket.js.map +1 -0
  337. package/dist/parser/expressions/jsx.d.ts +17 -0
  338. package/dist/parser/expressions/jsx.d.ts.map +1 -0
  339. package/dist/parser/expressions/jsx.js +43 -0
  340. package/dist/parser/expressions/jsx.js.map +1 -0
  341. package/dist/parser/expressions/keyframes.d.ts +15 -0
  342. package/dist/parser/expressions/keyframes.d.ts.map +1 -0
  343. package/dist/parser/expressions/keyframes.js +33 -0
  344. package/dist/parser/expressions/keyframes.js.map +1 -0
  345. package/dist/parser/expressions/look.d.ts +16 -0
  346. package/dist/parser/expressions/look.d.ts.map +1 -0
  347. package/dist/parser/expressions/look.js +37 -0
  348. package/dist/parser/expressions/look.js.map +1 -0
  349. package/dist/parser/expressions/visual-block.d.ts +17 -0
  350. package/dist/parser/expressions/visual-block.d.ts.map +1 -0
  351. package/dist/parser/expressions/visual-block.js +21 -0
  352. package/dist/parser/expressions/visual-block.js.map +1 -0
  353. package/dist/parser/keyframes-source.d.ts +24 -0
  354. package/dist/parser/keyframes-source.d.ts.map +1 -0
  355. package/dist/parser/keyframes-source.js +133 -0
  356. package/dist/parser/keyframes-source.js.map +1 -0
  357. package/dist/parser/look-source.d.ts +25 -0
  358. package/dist/parser/look-source.d.ts.map +1 -0
  359. package/dist/parser/look-source.js +189 -0
  360. package/dist/parser/look-source.js.map +1 -0
  361. package/dist/parser/spans.d.ts +24 -0
  362. package/dist/parser/spans.d.ts.map +1 -0
  363. package/dist/parser/spans.js +113 -0
  364. package/dist/parser/spans.js.map +1 -0
  365. package/dist/parser/statements/components.d.ts +37 -0
  366. package/dist/parser/statements/components.d.ts.map +1 -0
  367. package/dist/parser/statements/components.js +185 -0
  368. package/dist/parser/statements/components.js.map +1 -0
  369. package/dist/parser/statements/heads.d.ts +38 -0
  370. package/dist/parser/statements/heads.d.ts.map +1 -0
  371. package/dist/parser/statements/heads.js +55 -0
  372. package/dist/parser/statements/heads.js.map +1 -0
  373. package/dist/parser/statements/imports.d.ts +9 -0
  374. package/dist/parser/statements/imports.d.ts.map +1 -0
  375. package/dist/parser/statements/imports.js +31 -0
  376. package/dist/parser/statements/imports.js.map +1 -0
  377. package/dist/parser/statements/reactive.d.ts +31 -0
  378. package/dist/parser/statements/reactive.d.ts.map +1 -0
  379. package/dist/parser/statements/reactive.js +68 -0
  380. package/dist/parser/statements/reactive.js.map +1 -0
  381. package/dist/parser/statements/unsafe-css.d.ts +21 -0
  382. package/dist/parser/statements/unsafe-css.d.ts.map +1 -0
  383. package/dist/parser/statements/unsafe-css.js +42 -0
  384. package/dist/parser/statements/unsafe-css.js.map +1 -0
  385. package/dist/parser.d.ts +37 -50
  386. package/dist/parser.d.ts.map +1 -1
  387. package/dist/parser.js +98 -882
  388. package/dist/parser.js.map +1 -1
  389. package/dist/runtime-sources.generated.d.ts +1 -1
  390. package/dist/runtime-sources.generated.d.ts.map +1 -1
  391. package/dist/runtime-sources.generated.js +4 -4
  392. package/dist/runtime-sources.generated.js.map +1 -1
  393. package/package.json +2 -2
@@ -0,0 +1,299 @@
1
+ /**
2
+ * D89 A4: a 'map' callback that rebuilds its rows instead of carrying them
3
+ * over, which is what a keyed list stops recognising — what one rebuild records,
4
+ * and the module reading that decides whether a helper builds fresh records at
5
+ * all.
6
+ *
7
+ * D115 P4 R3a: the advisory is raised from the analyzer's JSX pass, but every
8
+ * reading it rests on is a reading of the program, so they read as a module.
9
+ *
10
+ * D115 P4 R3c: the four rules that record a rebuild and raise the advisory join
11
+ * them, over a `KeyedRebuildHost`.
12
+ */
13
+ import {} from "@velarscript/compiler";
14
+ import { spanIdentity } from "@velarscript/compiler/extension";
15
+ import { isWebStatement } from "../ast.js";
16
+ import { rowFieldPassthrough } from "./jsx-detection.js";
17
+ /**
18
+ * D89 A4: what a `map` callback rebuilds, when it returns a newly built record
19
+ * instead of the row it was handed. Null is the non-trigger answer the ruling
20
+ * names — a callback that returns its parameter, or anything else that is not a
21
+ * record literal, builds nothing and moves no identity. A record is reported
22
+ * even when no field can be named, because it is the rebuilt row's own identity
23
+ * that the keyed list stops recognising, not any one field it carries.
24
+ *
25
+ * A conditional is read through because the React spelling nearly always
26
+ * carries one, `t.id == id ? {...t, done: true} : t`, and its `else` branch is
27
+ * the returns-the-original case rather than a second shape. A branch that names
28
+ * a field is preferred, since a suggestion that names one is the whole product.
29
+ */
30
+ export function keyedRebuiltRecord(body, row) {
31
+ if (body.kind === "ObjectExpression") {
32
+ // `{ id: item.id, done: true }` copies the key across and rewrites `done`.
33
+ // Naming `id` would send the author to write the one field whose value the
34
+ // keyed list reads, so a field that only carries the row's own value over
35
+ // is not the field the message is about.
36
+ for (const property of body.properties) {
37
+ if (property.kind !== "ObjectProperty")
38
+ continue;
39
+ if (rowFieldPassthrough(property.value, row, property.name))
40
+ continue;
41
+ return { field: property.name };
42
+ }
43
+ // A pure `{...item}` rewrites no field at all; the copy itself is what
44
+ // moves the row's identity, so there is no field name for the message.
45
+ return body.properties.length > 0 ? { field: null } : null;
46
+ }
47
+ if (body.kind === "ConditionalExpression") {
48
+ const thenSide = keyedRebuiltRecord(body.thenValue, row);
49
+ const elseSide = keyedRebuiltRecord(body.elseValue, row);
50
+ if (thenSide?.field)
51
+ return thenSide;
52
+ if (elseSide?.field)
53
+ return elseSide;
54
+ return thenSide ?? elseSide;
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * D89 A4, the wider proven shape: every `def` of the module by name, so a
60
+ * `computed` whose initializer calls one can be read through to what that call
61
+ * builds. A name declared twice maps to null — two bodies under one name make
62
+ * the question unanswerable, and an advisory that cannot prove which body runs
63
+ * stays silent rather than guessing.
64
+ */
65
+ export function collectModuleFunctions(program) {
66
+ const functions = new Map();
67
+ const record = (statements) => {
68
+ for (const statement of statements) {
69
+ if (statement.kind === "FunctionDeclaration") {
70
+ functions.set(statement.name, functions.has(statement.name) ? null : statement);
71
+ record(statement.body);
72
+ continue;
73
+ }
74
+ if (isWebStatement(statement) && statement.kind === "ExtensionStatement:web:component") {
75
+ record(statement.body);
76
+ }
77
+ }
78
+ };
79
+ record(program.body);
80
+ return functions;
81
+ }
82
+ /** Every name a binding pattern introduces, added to `names`. */
83
+ function collectPatternNames(pattern, names) {
84
+ if (pattern.kind === "NameBindingPattern") {
85
+ names.add(pattern.name);
86
+ return;
87
+ }
88
+ if (pattern.kind === "ListBindingPattern") {
89
+ for (const element of pattern.elements)
90
+ if (element)
91
+ collectPatternNames(element, names);
92
+ }
93
+ else {
94
+ for (const entry of pattern.entries)
95
+ collectPatternNames(entry.pattern, names);
96
+ }
97
+ if (pattern.rest)
98
+ names.add(pattern.rest.name);
99
+ }
100
+ /** True when the expression reads one of `names` anywhere inside it. */
101
+ function readsAnyName(value, names) {
102
+ if (!value || typeof value !== "object")
103
+ return false;
104
+ if (Array.isArray(value))
105
+ return value.some((item) => readsAnyName(item, names));
106
+ const record = value;
107
+ if (record.kind === "IdentifierExpression" && typeof record.name === "string" && names.has(record.name))
108
+ return true;
109
+ return Object.values(record).some((child) => readsAnyName(child, names));
110
+ }
111
+ /**
112
+ * D89 A4, the wider proven shape: whether a `def` answers a list it filled with
113
+ * freshly constructed records — the `for`/`append` builder that spells the same
114
+ * churn `list = list.map(item => {…})` spells with `map`, and the spelling the
115
+ * P2b consumer actually wrote.
116
+ *
117
+ * Four things are proven, and any one of them missing leaves the advisory
118
+ * silent, because the whole product is naming a rebuild that really happens:
119
+ *
120
+ * 1. the body's last statement returns a name it declared here, initialized to
121
+ * an empty list literal — so the list is the `def`'s own, not one handed in;
122
+ * 2. every value appended to that list is a record literal, so every element is
123
+ * a new value on every call. One `append(row)` of a source record is the
124
+ * identity-preserving spelling this advisory teaches, and one member call
125
+ * the proof cannot read leaves the whole answer unproven;
126
+ * 3. at least one such record reads a parameter of the `def` or the binding of
127
+ * the `for` that appends it. A builder whose records are constant answers
128
+ * the same content every call, so nothing it is derived from can move and
129
+ * the `computed` over it never recomputes;
130
+ * 4. nothing else touches the list — it is built and answered, nothing more.
131
+ */
132
+ export function buildsFreshRecords(declaration) {
133
+ const returned = declaration.body.at(-1);
134
+ if (!returned || returned.kind !== "ReturnStatement" || returned.value?.kind !== "IdentifierExpression")
135
+ return false;
136
+ const built = returned.value.name;
137
+ const local = declaration.body.find((statement) => statement.kind === "VariableDeclaration"
138
+ && statement.pattern.kind === "NameBindingPattern" && statement.pattern.name === built);
139
+ if (!local || local.kind !== "VariableDeclaration")
140
+ return false;
141
+ if (local.initializer.kind !== "ListExpression" || local.initializer.elements.length > 0)
142
+ return false;
143
+ const parameters = new Set(declaration.parameters.map((parameter) => parameter.name));
144
+ let records = 0;
145
+ let varying = false;
146
+ let unproven = false;
147
+ const walk = (statements, visible) => {
148
+ for (const statement of statements) {
149
+ if (statement.kind === "ForStatement") {
150
+ const inner = new Set(visible);
151
+ collectPatternNames(statement.pattern, inner);
152
+ if (statement.secondPattern)
153
+ collectPatternNames(statement.secondPattern, inner);
154
+ walk(statement.body, inner);
155
+ continue;
156
+ }
157
+ if (statement.kind === "IfStatement") {
158
+ walk(statement.thenBody, visible);
159
+ walk(statement.elseBody ?? [], visible);
160
+ continue;
161
+ }
162
+ if (statement.kind === "WhileStatement") {
163
+ walk(statement.body, visible);
164
+ continue;
165
+ }
166
+ if (statement.kind !== "ExpressionStatement")
167
+ continue;
168
+ const call = statement.expression;
169
+ if (call.kind !== "CallExpression" || call.callee.kind !== "MemberExpression")
170
+ continue;
171
+ if (call.callee.object.kind !== "IdentifierExpression" || call.callee.object.name !== built)
172
+ continue;
173
+ const [appended] = call.arguments;
174
+ if (call.callee.property !== "append" || !appended || appended.kind !== "ObjectExpression") {
175
+ unproven = true;
176
+ continue;
177
+ }
178
+ records += 1;
179
+ if (readsAnyName(appended, visible))
180
+ varying = true;
181
+ }
182
+ };
183
+ walk(declaration.body, parameters);
184
+ return !unproven && records > 0 && varying;
185
+ }
186
+ /**
187
+ * D89 A4: records `list = list.map(item => {…})`, React's immutable update,
188
+ * where the callback builds a new record rather than changing a field.
189
+ *
190
+ * D90 R2 stands — `__velarKeyed` compares identity and that does not move,
191
+ * and the framework does not accommodate the idiom. This channel is not the
192
+ * framework taking responsibility; it is the compiler telling the author that
193
+ * the row he is typing into is about to be destroyed. Nothing is reported
194
+ * yet: the advisory is owed only if the rewritten list is what a keyed list
195
+ * renders, and the render usually sits below the update.
196
+ */
197
+ export function recordKeyedListRebuild(host, statement) {
198
+ if (statement.kind !== "AssignmentStatement" || statement.operator !== "=")
199
+ return;
200
+ if (statement.target.kind !== "IdentifierExpression")
201
+ return;
202
+ const value = statement.value;
203
+ if (value.kind !== "CallExpression" || value.callee.kind !== "MemberExpression" || value.callee.property !== "map")
204
+ return;
205
+ // The map has to be over the list being replaced; `rows = source.map(...)`
206
+ // builds a new list, and a new list has no identity to preserve.
207
+ if (value.callee.object.kind !== "IdentifierExpression" || value.callee.object.name !== statement.target.name)
208
+ return;
209
+ const callback = value.arguments[0];
210
+ if (!callback || callback.kind !== "ArrowFunctionExpression")
211
+ return;
212
+ const [row] = callback.parameters;
213
+ if (!row || callback.parameters.length !== 1)
214
+ return;
215
+ const rebuilt = keyedRebuiltRecord(callback.body, row.name);
216
+ if (!rebuilt)
217
+ return;
218
+ const binding = host.lookup(statement.target.name);
219
+ if (!binding)
220
+ return;
221
+ host.keyedListRebuilds.push({
222
+ kind: "assignment",
223
+ source: spanIdentity(binding.span),
224
+ name: statement.target.name,
225
+ field: rebuilt.field,
226
+ span: statement.span,
227
+ });
228
+ }
229
+ /**
230
+ * D89 A4, the wider proven shape: the same churn written as a derived value.
231
+ * `computed rows = source.map(item => {…})` and `computed rows = build(...)`
232
+ * over a `for`/`append` builder both hand a keyed position a fresh record for
233
+ * every row on every recompute, which is exactly what the assignment shape
234
+ * does — the reconciliation wave compiled both and found only one of them
235
+ * named. It is one advisory with a wider proof, not a second code: the defect,
236
+ * the consequence, and the suppression are the same.
237
+ *
238
+ * A `const` in a component body is deliberately not here. It is constructed
239
+ * once, so its records never move, and advising it would be a guess rather
240
+ * than a proof.
241
+ */
242
+ export function recordDerivedKeyedListRebuild(host, statement) {
243
+ if (!rebuildsRecordsPerElement(host, statement.initializer))
244
+ return;
245
+ host.keyedListRebuilds.push({
246
+ kind: "derived",
247
+ source: spanIdentity(statement.span),
248
+ name: statement.name,
249
+ field: null,
250
+ span: statement.span,
251
+ });
252
+ }
253
+ /**
254
+ * Whether a derived initializer constructs one fresh record per source
255
+ * element. Two spellings are proven and everything else is silent: a `map`
256
+ * whose callback answers a record literal — the same recognizer the
257
+ * assignment shape uses — and a call to a `def` this module declares whose
258
+ * whole answer is a list it filled with record literals.
259
+ */
260
+ export function rebuildsRecordsPerElement(host, value) {
261
+ if (value.kind !== "CallExpression")
262
+ return false;
263
+ if (value.callee.kind === "MemberExpression" && value.callee.property === "map") {
264
+ const callback = value.arguments[0];
265
+ if (!callback || callback.kind !== "ArrowFunctionExpression" || callback.parameters.length !== 1)
266
+ return false;
267
+ const [row] = callback.parameters;
268
+ return row !== undefined && keyedRebuiltRecord(callback.body, row.name) !== null;
269
+ }
270
+ if (value.callee.kind !== "IdentifierExpression")
271
+ return false;
272
+ const declaration = host.moduleFunctions.get(value.callee.name);
273
+ return declaration !== undefined && declaration !== null && buildsFreshRecords(declaration);
274
+ }
275
+ /**
276
+ * D89 A4: raises the advisory for the rebuilds whose list a keyed position
277
+ * really renders. The advisory channel cannot reach `this.diagnostics`, so
278
+ * nothing here fails a build, changes an emitted byte, or moves a semantic
279
+ * rule; `// velar-allow A4: <reason>` suppresses it where building the rows is
280
+ * the only spelling, which a `readonly` list or one API response makes it.
281
+ */
282
+ export function adviseKeyedListRebuilds(host) {
283
+ for (const rebuild of host.keyedListRebuilds) {
284
+ if (!host.keyedListSources.has(rebuild.source))
285
+ continue;
286
+ // The keys do not move; the rows do. `__velarKeyed` finds the entry under
287
+ // the same key and then drops it because the row it holds is no longer
288
+ // the same value, so a message blaming the key sends an author to check
289
+ // `id`, find it unchanged, and conclude the advisory is wrong.
290
+ // A derived value has no row to write: whatever it hands the keyed
291
+ // position it built itself. The two ways out are to render the rows that
292
+ // do have an identity, or to carry those same records through.
293
+ const remedy = rebuild.kind === "derived"
294
+ ? "A derived value cannot keep rows it builds: render the source rows and change the field on them in place, or carry the source records through instead of constructing new ones."
295
+ : `Change the field in place instead: '${rebuild.name}[index].${rebuild.field ?? "<field>"} = ...'`;
296
+ host.advise("A4", `This rebuilds every row of '${rebuild.name}'${rebuild.kind === "derived" ? " on every recompute" : ""}, so every row is a new value and the keyed list that renders '${rebuild.name}' no longer recognises any of them: it destroys and rebuilds all of its children — an input being typed into loses focus. ${remedy}`, rebuild.span);
297
+ }
298
+ }
299
+ //# sourceMappingURL=keyed-rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed-rebuild.js","sourceRoot":"","sources":["../../src/analysis/keyed-rebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type Expression } from "@velarscript/compiler/extension";
2
+ import { type WebKeyframesExpression } from "../ast.ts";
3
+ import { type LookAnalysisHost } from "./look/host.ts";
4
+ export declare function analyzeKeyframes(host: LookAnalysisHost, expression: WebKeyframesExpression): void;
5
+ export declare function reportKeyframeSnapshotReads(host: LookAnalysisHost, expression: Expression): void;
6
+ //# sourceMappingURL=keyframes-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframes-analysis.d.ts","sourceRoot":"","sources":["../../src/analysis/keyframes-analysis.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAMxD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAkCjG;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAmBhG"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The analysis half of `keyframes:` — the stops, their offsets, and the Look
3
+ * values each stop carries.
4
+ *
5
+ * D115 P4 R3b. It reads the same `LookAnalysisHost` the `look/` family does,
6
+ * because a keyframe stop is a Look value in a position that has no run time:
7
+ * every builder call in it is folded at compile time, so a call the builder
8
+ * check already refused drops its consequence here rather than reporting twice.
9
+ * Named apart from `../keyframes.ts`, which is the CSS lowering.
10
+ */
11
+ import {} from "@velarscript/compiler";
12
+ import { stringType } from "@velarscript/compiler/extension";
13
+ import {} from "../ast.js";
14
+ import { keyframeCssValue } from "../keyframes.js";
15
+ import { LOOK_NON_ANIMATABLE_PROPERTIES } from "../look.js";
16
+ import { lookLiteralZero, mentionsLookUnitType } from "./look-sites.js";
17
+ import { refusedBuilderCallWithin } from "./look/builders.js";
18
+ import { analyzeLookValue } from "./look/entries.js";
19
+ import {} from "./look/host.js";
20
+ import { reportLookNumberWithoutUnit } from "./look/values.js";
21
+ import { diagnostic, LOOK_PROPERTY_TYPES } from "./web-types.js";
22
+ export function analyzeKeyframes(host, expression) {
23
+ for (const stop of expression.stops) {
24
+ const properties = new Set();
25
+ for (const entry of stop.entries) {
26
+ if (properties.has(entry.name)) {
27
+ host.diagnostics.push(diagnostic("VEL5039", `Keyframe property '${entry.name}' is defined more than once at the same stop`, entry.span));
28
+ continue;
29
+ }
30
+ properties.add(entry.name);
31
+ if (LOOK_NON_ANIMATABLE_PROPERTIES.has(entry.name)) {
32
+ host.diagnostics.push(diagnostic("VEL5060", `Look property '${entry.name}' does not participate in animation interpolation`, entry.span));
33
+ host.inferExpression(entry.value);
34
+ continue;
35
+ }
36
+ if (!analyzeLookValue(host, entry.name, entry.value, entry.span, null))
37
+ continue;
38
+ const expected = LOOK_PROPERTY_TYPES.get(entry.name) ?? stringType;
39
+ const actual = host.inferExpression(entry.value, expected);
40
+ reportKeyframeSnapshotReads(host, entry.value);
41
+ // LK-I2: a builder that failed its own argument check has already been told what
42
+ // is wrong with it, and "does not resolve to static CSS" is only the consequence —
43
+ // a sentence that sends its author looking for a rule against named arguments in
44
+ // a stop, which there is not (`spread=2px` in range compiles).
45
+ if (keyframeCssValue(entry.value, host.lookStatic.values) === null && !refusedBuilderCallWithin(host, entry.value.span)) {
46
+ host.diagnostics.push(diagnostic("VEL5060", "A keyframe value must resolve to static CSS from literals, unit values, arithmetic, velar/look builders, or const bindings — local or imported — that hold any of those, and the text it resolves to must read as one declaration value: no ';', '{', '}', or '@' outside a string, with parentheses, strings, and comments all closed", entry.value.span));
47
+ }
48
+ if (mentionsLookUnitType(expected) && lookLiteralZero(entry.value))
49
+ continue;
50
+ if (reportLookNumberWithoutUnit(host, entry.name, actual, expected, entry.value.span))
51
+ continue;
52
+ if (actual.kind !== "null" && expected.kind !== "unknown")
53
+ host.requireAssignable(actual, expected, entry.value.span);
54
+ }
55
+ }
56
+ }
57
+ export function reportKeyframeSnapshotReads(host, expression) {
58
+ const visit = (value) => {
59
+ if (Array.isArray(value)) {
60
+ value.forEach(visit);
61
+ return;
62
+ }
63
+ if (!value || typeof value !== "object")
64
+ return;
65
+ const record = value;
66
+ if (record.kind === "IdentifierExpression" && typeof record.name === "string") {
67
+ const name = record.name;
68
+ if (host.reactiveBindingKind(name) !== null || host.derivedReactiveRead(name)) {
69
+ host.diagnostics.push(diagnostic("VEL5060", `Keyframes generate static CSS, so reactive '${name}' cannot be read inside a stop; make animation presence dynamic with look:animation={condition ? animate(frames, 1s) : null}`, record.span));
70
+ }
71
+ return;
72
+ }
73
+ for (const [key, child] of Object.entries(record))
74
+ if (key !== "span")
75
+ visit(child);
76
+ };
77
+ visit(expression);
78
+ }
79
+ //# sourceMappingURL=keyframes-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframes-analysis.js","sourceRoot":"","sources":["../../src/analysis/keyframes-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The compile-time half of the velar/look builders: the numeric domains each
3
+ * one publishes, the animation vocabulary `animate` takes, and the record of
4
+ * which calls were refused on their own arguments.
5
+ *
6
+ * D115 P4 R3b. That record lives with the check that made it because a
7
+ * `keyframes:` stop lowers its builder calls at compile time — no call survives
8
+ * to run the runtime guard, so the stop reads what this file already decided
9
+ * rather than reporting the same argument twice.
10
+ */
11
+ import { type Span } from "@velarscript/compiler";
12
+ import { type Expression } from "@velarscript/compiler/extension";
13
+ import { type LookAnalysisHost } from "./host.ts";
14
+ /**
15
+ * LOK-U8: the velar/look builders check their numeric domains at run time, so
16
+ * a literal out-of-range colour used to compile clean and blank the page on
17
+ * the first paint. Literal arguments are checked in the same terms while the
18
+ * module compiles; dynamic arguments keep the runtime guard.
19
+ */
20
+ export declare function checkLookBuilderCall(host: LookAnalysisHost, expression: Extract<Expression, {
21
+ kind: "CallExpression";
22
+ }>): void;
23
+ export declare function checkAnimateBuilderCall(host: LookAnalysisHost, expression: Extract<Expression, {
24
+ kind: "CallExpression";
25
+ }>): void;
26
+ export declare function checkAnimationKeyword(host: LookAnalysisHost, value: Expression | null, name: string, vocabulary: ReadonlySet<string>): void;
27
+ /** Whether a builder call this compile refused on its own arguments lies inside `sourceSpan`. */
28
+ export declare function refusedBuilderCallWithin(host: LookAnalysisHost, sourceSpan: Span): boolean;
29
+ //# sourceMappingURL=builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../src/analysis/look/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,iCAAiC,CAAC;AAMhF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIlD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,IAAI,CA8F9H;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,IAAI,CAgCjI;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAK3I;AAED,iGAAiG;AACjG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAE1F"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * The compile-time half of the velar/look builders: the numeric domains each
3
+ * one publishes, the animation vocabulary `animate` takes, and the record of
4
+ * which calls were refused on their own arguments.
5
+ *
6
+ * D115 P4 R3b. That record lives with the check that made it because a
7
+ * `keyframes:` stop lowers its builder calls at compile time — no call survives
8
+ * to run the runtime guard, so the stop reads what this file already decided
9
+ * rather than reporting the same argument twice.
10
+ */
11
+ import {} from "@velarscript/compiler";
12
+ import { spanIdentity } from "@velarscript/compiler/extension";
13
+ import { evaluateLookStaticExpression } from "../../look-static.js";
14
+ import { LOOK_ANIMATION_DIRECTIONS, LOOK_ANIMATION_EASINGS, LOOK_ANIMATION_FILLS, LOOK_BORDER_STYLE_NAMES, LOOK_BUILDER_NUMERIC_RANGES, LOOK_BUILDER_SIGNATURES, LOOK_LENGTH_BUILDERS } from "../../look.js";
15
+ import { teachLookFilterSlot, teachLookLengthSlot, teachLookPercentageSlot } from "../look-values.js";
16
+ import { lookDurationLiteral, numericLiteral } from "../look-vocabulary-guidance.js";
17
+ import { diagnostic } from "../web-types.js";
18
+ import {} from "./host.js";
19
+ import { checkLookTokenCall, reportLookColorVarReference } from "./tokens.js";
20
+ import { validateLookStringVocabulary } from "./values.js";
21
+ /**
22
+ * LOK-U8: the velar/look builders check their numeric domains at run time, so
23
+ * a literal out-of-range colour used to compile clean and blank the page on
24
+ * the first paint. Literal arguments are checked in the same terms while the
25
+ * module compiles; dynamic arguments keep the runtime guard.
26
+ */
27
+ export function checkLookBuilderCall(host, expression) {
28
+ const callee = expression.callee.kind === "IdentifierExpression" ? expression.callee.name : "";
29
+ const builder = host.lookBuilderNames.get(callee);
30
+ if (!builder)
31
+ return;
32
+ const key = spanIdentity(expression.span);
33
+ if (host.checkedBuilderCalls.has(key))
34
+ return;
35
+ host.checkedBuilderCalls.add(key);
36
+ if (builder === "animate") {
37
+ checkAnimateBuilderCall(host, expression);
38
+ return;
39
+ }
40
+ if (builder === "token") {
41
+ checkLookTokenCall(host, expression);
42
+ return;
43
+ }
44
+ const ranges = LOOK_BUILDER_NUMERIC_RANGES.get(builder);
45
+ // A named argument fills the same slot its positional spelling does, so the
46
+ // position comes from the builder's own signature — the one table the
47
+ // module interface, the named-argument arity check, and the `keyframes:`
48
+ // lowering already derive from. Reading `-1` here instead put every check
49
+ // in this loop out of reach of the named spelling, not only the range
50
+ // table: `rgba(0, 0, 0, alpha=2)` compiled clean while `rgba(0, 0, 0, 2)`
51
+ // was refused.
52
+ const parameters = LOOK_BUILDER_SIGNATURES.get(builder)?.parameters;
53
+ // LOK-D3: which slots take a length is the builder's own published type,
54
+ // read from the binding this call resolved through — the declaration core's
55
+ // assignability check refused against — and not a second table of positions.
56
+ const declared = host.expandAliases(host.lookup(callee)?.type ?? { kind: "unknown" });
57
+ const before = host.diagnostics.length;
58
+ let taught = false;
59
+ for (const [index, argument] of expression.arguments.entries()) {
60
+ const named = expression.argumentNames?.[index] ?? null;
61
+ const position = named === null ? index : parameters?.indexOf(named) ?? -1;
62
+ const range = position >= 0 ? ranges?.[position] : undefined;
63
+ // LOK-U8 completed: a `keyframes:` stop lowers its builder calls at
64
+ // compile time, so no call survives to run the runtime guard. Reading the
65
+ // folded value rather than the literal node is what makes the promise
66
+ // "a computed argument keeps the same check" true where the run time the
67
+ // charter names does not exist.
68
+ const folded = evaluateLookStaticExpression(argument, host.lookStatic.values);
69
+ const literal = folded?.kind === "number" ? folded.value : null;
70
+ // D114 P6 item 2 (LK-I3): a slot whose domain carries a unit states its
71
+ // bound in that unit and reads the value out of the unit's own number, so
72
+ // `hsl(200, 120%, 50%)` is refused in the same VEL5042 wording that
73
+ // refused `hsl(200, 120, 50)` before the slot became a `Percentage`.
74
+ const rangeUnit = range?.[3];
75
+ const ranged = rangeUnit === undefined ? literal
76
+ : folded?.kind === "unit" && folded.unit === rangeUnit ? folded.value : null;
77
+ if (range && ranged !== null && (ranged < range[1] || ranged > range[2])) {
78
+ const unit = rangeUnit ?? "";
79
+ host.diagnostics.push(diagnostic("VEL5042", `${range[0]} must be from ${range[1]}${unit} through ${range[2]}${unit}; ${builder} received ${ranged}${unit}`, argument.span));
80
+ }
81
+ if (rangeUnit === "%" && literal !== null && teachLookPercentageSlot(host.diagnostics, range[0], argument, literal, host.lookStatic.sites))
82
+ taught = true;
83
+ const nonNegativeBlur = (builder === "blur" && position === 0) || (builder === "dropShadow" && position === 2);
84
+ if (nonNegativeBlur && folded?.kind === "unit" && folded.value < 0) {
85
+ host.diagnostics.push(diagnostic("VEL5042", `${builder} blur cannot be negative`, argument.span));
86
+ }
87
+ // LOK-D3, builder half: a unitless number in a length position is dead
88
+ // CSS exactly as it is on a property — except in a slot whose own type
89
+ // refuses the number outright, where core's refusal is already the report
90
+ // and gains the remedy rather than a neighbour.
91
+ if (LOOK_LENGTH_BUILDERS.has(builder) && literal !== null
92
+ && teachLookLengthSlot(host.diagnostics, builder, position, declared, argument, literal, host.lookStatic.sites))
93
+ taught = true;
94
+ // WB-I1: and a slot whose published type is a `Filter` — `filters`, at
95
+ // every position its rest parameter collects — teaches the vocabulary that
96
+ // makes one instead of leaving core's bare refusal to name a type the
97
+ // author has no way to construct from the message.
98
+ if (teachLookFilterSlot(host.diagnostics, builder, position, declared, argument))
99
+ taught = true;
100
+ if (builder === "border" && position === 2 && argument.kind === "LiteralExpression" && typeof argument.value === "string"
101
+ && !LOOK_BORDER_STYLE_NAMES.has(argument.value)) {
102
+ host.diagnostics.push(diagnostic("VEL5042", `Border style '${argument.value}' is not a CSS border style; use one of ${[...LOOK_BORDER_STYLE_NAMES].join(", ")}`, argument.span));
103
+ }
104
+ // D60 rule 150 gave `transitionProperty` a real vocabulary and the
105
+ // charter says the builder takes the same one. It took none, so the
106
+ // longhand's refusal taught the camelCase spelling the builder accepted
107
+ // and the browser discarded. Routing the argument through the property's
108
+ // own checker keeps one vocabulary and one message.
109
+ if (builder === "transition" && position === 0) {
110
+ validateLookStringVocabulary(host, "transitionProperty", argument, "The transition builder's property argument");
111
+ }
112
+ // D103 rule 4: one spelling. `color(string)` used to be the only checked
113
+ // Look value that let a design token through, and it let it through as
114
+ // text nobody read — so the same reference was legal on `color` and
115
+ // refused on `width`, and the accepting half checked nothing.
116
+ if (builder === "color" && position === 0)
117
+ reportLookColorVarReference(host, expression, argument);
118
+ }
119
+ if (builder === "tracks" && expression.arguments.length > 1024) {
120
+ host.diagnostics.push(diagnostic("VEL5042", "tracks cannot contain more than 1024 values", expression.span));
121
+ }
122
+ if (builder === "filters" && expression.arguments.length > 64) {
123
+ host.diagnostics.push(diagnostic("VEL5042", "filters cannot compose more than 64 values", expression.span));
124
+ }
125
+ // D114 0.29.0 LK-I2: a call its own argument check refused is recorded so a `keyframes:` stop can drop the consequence. The record is the call rather than the code, because a bad token name and a stop's one-declaration rule are two facts about one value (D103-2) and both are still reported. A slot lesson written *into* core's refusal grows no diagnostic, so it says so itself.
126
+ if (taught || host.diagnostics.length > before)
127
+ host.refusedBuilderCalls.push(expression.span);
128
+ }
129
+ export function checkAnimateBuilderCall(host, expression) {
130
+ const argument = (name, position) => {
131
+ const named = expression.argumentNames?.findIndex((candidate) => candidate === name) ?? -1;
132
+ if (named >= 0)
133
+ return expression.arguments[named] ?? null;
134
+ const sourceName = expression.argumentNames?.[position];
135
+ return sourceName === null || sourceName === undefined ? expression.arguments[position] ?? null : null;
136
+ };
137
+ const duration = argument("duration", 1);
138
+ const delay = argument("delay", 3);
139
+ const count = argument("count", 4);
140
+ const loop = argument("loop", 5);
141
+ const easing = argument("easing", 2);
142
+ const direction = argument("direction", 6);
143
+ const fill = argument("fill", 7);
144
+ const durationValue = lookDurationLiteral(duration);
145
+ const delayValue = lookDurationLiteral(delay);
146
+ if (durationValue !== null && durationValue <= 0) {
147
+ host.diagnostics.push(diagnostic("VEL5060", "Animation duration must be greater than zero", duration.span));
148
+ }
149
+ if (delayValue !== null && delayValue < 0) {
150
+ host.diagnostics.push(diagnostic("VEL5060", "Animation delay cannot be negative", delay.span));
151
+ }
152
+ const countValue = numericLiteral(count);
153
+ if (countValue !== null && (!Number.isInteger(countValue) || countValue <= 0 || countValue > 1_000_000)) {
154
+ host.diagnostics.push(diagnostic("VEL5060", "Animation count must be a positive integer no greater than 1000000", count.span));
155
+ }
156
+ if (count && loop) {
157
+ host.diagnostics.push(diagnostic("VEL5060", "animate accepts either count or loop, not both: count names the number of runs, and loop=true replaces that count with an unbounded one", expression.span));
158
+ }
159
+ checkAnimationKeyword(host, easing, "easing", LOOK_ANIMATION_EASINGS);
160
+ checkAnimationKeyword(host, direction, "direction", LOOK_ANIMATION_DIRECTIONS);
161
+ checkAnimationKeyword(host, fill, "fill", LOOK_ANIMATION_FILLS);
162
+ }
163
+ export function checkAnimationKeyword(host, value, name, vocabulary) {
164
+ if (!value || value.kind !== "LiteralExpression" || typeof value.value !== "string")
165
+ return;
166
+ if (!vocabulary.has(value.value)) {
167
+ host.diagnostics.push(diagnostic("VEL5060", `Animation ${name} '${value.value}' is not supported; use one of ${[...vocabulary].join(", ")}`, value.span));
168
+ }
169
+ }
170
+ /** Whether a builder call this compile refused on its own arguments lies inside `sourceSpan`. */
171
+ export function refusedBuilderCallWithin(host, sourceSpan) {
172
+ return host.refusedBuilderCalls.some((call) => call.start >= sourceSpan.start && call.end <= sourceSpan.end);
173
+ }
174
+ //# sourceMappingURL=builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/analysis/look/builders.ts"],"names":[],"mappings":"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"}