@vigla/svelte 0.0.0-stage → 5.57.4

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 (373) hide show
  1. package/action.d.ts +2 -0
  2. package/animate.d.ts +2 -0
  3. package/compiler/index.js +43266 -0
  4. package/compiler/index.js.map +1 -0
  5. package/compiler/package.json +3 -0
  6. package/compiler.d.ts +2 -0
  7. package/dist/compiler/diagnostics.d.ts +70 -0
  8. package/dist/compiler/diagnostics.d.ts.map +1 -0
  9. package/dist/compiler/diagnostics.js +166 -0
  10. package/dist/compiler/diagnostics.js.map +1 -0
  11. package/dist/compiler/index.d.ts +72 -0
  12. package/dist/compiler/index.d.ts.map +1 -0
  13. package/dist/compiler/index.js +178 -0
  14. package/dist/compiler/index.js.map +1 -0
  15. package/dist/compiler/options.d.ts +7 -0
  16. package/dist/compiler/options.d.ts.map +1 -0
  17. package/dist/compiler/options.js +126 -0
  18. package/dist/compiler/options.js.map +1 -0
  19. package/dist/compiler/preprocess/decode.d.ts +3 -0
  20. package/dist/compiler/preprocess/decode.d.ts.map +1 -0
  21. package/dist/compiler/preprocess/decode.js +60 -0
  22. package/dist/compiler/preprocess/decode.js.map +1 -0
  23. package/dist/compiler/preprocess/index.d.ts +27 -0
  24. package/dist/compiler/preprocess/index.d.ts.map +1 -0
  25. package/dist/compiler/preprocess/index.js +208 -0
  26. package/dist/compiler/preprocess/index.js.map +1 -0
  27. package/dist/compiler/preprocess/mapped.d.ts +25 -0
  28. package/dist/compiler/preprocess/mapped.d.ts.map +1 -0
  29. package/dist/compiler/preprocess/mapped.js +129 -0
  30. package/dist/compiler/preprocess/mapped.js.map +1 -0
  31. package/dist/compiler/proxy.d.ts +3 -0
  32. package/dist/compiler/proxy.d.ts.map +1 -0
  33. package/dist/compiler/proxy.js +133 -0
  34. package/dist/compiler/proxy.js.map +1 -0
  35. package/dist/entries/action.d.ts +2 -0
  36. package/dist/entries/action.d.ts.map +1 -0
  37. package/dist/entries/action.js +1 -0
  38. package/dist/entries/action.js.map +1 -0
  39. package/dist/entries/animate.d.ts +2 -0
  40. package/dist/entries/animate.d.ts.map +1 -0
  41. package/dist/entries/animate.js +2 -0
  42. package/dist/entries/animate.js.map +1 -0
  43. package/dist/entries/attachments.d.ts +2 -0
  44. package/dist/entries/attachments.d.ts.map +1 -0
  45. package/dist/entries/attachments.js +2 -0
  46. package/dist/entries/attachments.js.map +1 -0
  47. package/dist/entries/context.d.ts +15 -0
  48. package/dist/entries/context.d.ts.map +1 -0
  49. package/dist/entries/context.js +32 -0
  50. package/dist/entries/context.js.map +1 -0
  51. package/dist/entries/easing.d.ts +2 -0
  52. package/dist/entries/easing.d.ts.map +1 -0
  53. package/dist/entries/easing.js +2 -0
  54. package/dist/entries/easing.js.map +1 -0
  55. package/dist/entries/events.d.ts +2 -0
  56. package/dist/entries/events.d.ts.map +1 -0
  57. package/dist/entries/events.js +2 -0
  58. package/dist/entries/events.js.map +1 -0
  59. package/dist/entries/index-server.d.ts +4 -0
  60. package/dist/entries/index-server.d.ts.map +1 -0
  61. package/dist/entries/index-server.js +11 -0
  62. package/dist/entries/index-server.js.map +1 -0
  63. package/dist/entries/index.d.ts +10 -0
  64. package/dist/entries/index.d.ts.map +1 -0
  65. package/dist/entries/index.js +24 -0
  66. package/dist/entries/index.js.map +1 -0
  67. package/dist/entries/internal/client.d.ts +4 -0
  68. package/dist/entries/internal/client.d.ts.map +1 -0
  69. package/dist/entries/internal/client.js +9 -0
  70. package/dist/entries/internal/client.js.map +1 -0
  71. package/dist/entries/internal/disclose-version.d.ts +2 -0
  72. package/dist/entries/internal/disclose-version.d.ts.map +1 -0
  73. package/dist/entries/internal/disclose-version.js +4 -0
  74. package/dist/entries/internal/disclose-version.js.map +1 -0
  75. package/dist/entries/internal/index.d.ts +2 -0
  76. package/dist/entries/internal/index.d.ts.map +1 -0
  77. package/dist/entries/internal/index.js +2 -0
  78. package/dist/entries/internal/index.js.map +1 -0
  79. package/dist/entries/internal/server.d.ts +2 -0
  80. package/dist/entries/internal/server.d.ts.map +1 -0
  81. package/dist/entries/internal/server.js +7 -0
  82. package/dist/entries/internal/server.js.map +1 -0
  83. package/dist/entries/internal/tracing.d.ts +2 -0
  84. package/dist/entries/internal/tracing.d.ts.map +1 -0
  85. package/dist/entries/internal/tracing.js +2 -0
  86. package/dist/entries/internal/tracing.js.map +1 -0
  87. package/dist/entries/motion-server.d.ts +2 -0
  88. package/dist/entries/motion-server.d.ts.map +1 -0
  89. package/dist/entries/motion-server.js +2 -0
  90. package/dist/entries/motion-server.js.map +1 -0
  91. package/dist/entries/motion.d.ts +2 -0
  92. package/dist/entries/motion.d.ts.map +1 -0
  93. package/dist/entries/motion.js +2 -0
  94. package/dist/entries/motion.js.map +1 -0
  95. package/dist/entries/proxy.d.ts +6 -0
  96. package/dist/entries/proxy.d.ts.map +1 -0
  97. package/dist/entries/proxy.js +77 -0
  98. package/dist/entries/proxy.js.map +1 -0
  99. package/dist/entries/reactivity-server.d.ts +2 -0
  100. package/dist/entries/reactivity-server.d.ts.map +1 -0
  101. package/dist/entries/reactivity-server.js +2 -0
  102. package/dist/entries/reactivity-server.js.map +1 -0
  103. package/dist/entries/reactivity.d.ts +2 -0
  104. package/dist/entries/reactivity.d.ts.map +1 -0
  105. package/dist/entries/reactivity.js +2 -0
  106. package/dist/entries/reactivity.js.map +1 -0
  107. package/dist/entries/report.d.ts +3 -0
  108. package/dist/entries/report.d.ts.map +1 -0
  109. package/dist/entries/report.js +66 -0
  110. package/dist/entries/report.js.map +1 -0
  111. package/dist/entries/server.d.ts +8 -0
  112. package/dist/entries/server.d.ts.map +1 -0
  113. package/dist/entries/server.js +48 -0
  114. package/dist/entries/server.js.map +1 -0
  115. package/dist/entries/store-client.d.ts +12 -0
  116. package/dist/entries/store-client.d.ts.map +1 -0
  117. package/dist/entries/store-client.js +63 -0
  118. package/dist/entries/store-client.js.map +1 -0
  119. package/dist/entries/store-server.d.ts +12 -0
  120. package/dist/entries/store-server.d.ts.map +1 -0
  121. package/dist/entries/store-server.js +30 -0
  122. package/dist/entries/store-server.js.map +1 -0
  123. package/dist/entries/store.d.ts +25 -0
  124. package/dist/entries/store.d.ts.map +1 -0
  125. package/dist/entries/store.js +139 -0
  126. package/dist/entries/store.js.map +1 -0
  127. package/dist/entries/transition.d.ts +2 -0
  128. package/dist/entries/transition.d.ts.map +1 -0
  129. package/dist/entries/transition.js +2 -0
  130. package/dist/entries/transition.js.map +1 -0
  131. package/dist/entries/window-server.d.ts +2 -0
  132. package/dist/entries/window-server.d.ts.map +1 -0
  133. package/dist/entries/window-server.js +2 -0
  134. package/dist/entries/window-server.js.map +1 -0
  135. package/dist/entries/window.d.ts +2 -0
  136. package/dist/entries/window.d.ts.map +1 -0
  137. package/dist/entries/window.js +2 -0
  138. package/dist/entries/window.js.map +1 -0
  139. package/dist/front/ast.d.ts +290 -0
  140. package/dist/front/ast.d.ts.map +1 -0
  141. package/dist/front/ast.js +1 -0
  142. package/dist/front/ast.js.map +1 -0
  143. package/dist/front/diagnostics.d.ts +13 -0
  144. package/dist/front/diagnostics.d.ts.map +1 -0
  145. package/dist/front/diagnostics.js +38 -0
  146. package/dist/front/diagnostics.js.map +1 -0
  147. package/dist/front/ignores.d.ts +12 -0
  148. package/dist/front/ignores.d.ts.map +1 -0
  149. package/dist/front/ignores.js +75 -0
  150. package/dist/front/ignores.js.map +1 -0
  151. package/dist/front/index.d.ts +17 -0
  152. package/dist/front/index.d.ts.map +1 -0
  153. package/dist/front/index.js +65 -0
  154. package/dist/front/index.js.map +1 -0
  155. package/dist/front/legacy.d.ts +5 -0
  156. package/dist/front/legacy.d.ts.map +1 -0
  157. package/dist/front/legacy.js +408 -0
  158. package/dist/front/legacy.js.map +1 -0
  159. package/dist/front/locate.d.ts +4 -0
  160. package/dist/front/locate.d.ts.map +1 -0
  161. package/dist/front/locate.js +19 -0
  162. package/dist/front/locate.js.map +1 -0
  163. package/dist/front/lower.d.ts +39 -0
  164. package/dist/front/lower.d.ts.map +1 -0
  165. package/dist/front/lower.js +470 -0
  166. package/dist/front/lower.js.map +1 -0
  167. package/dist/front/parse/attribute.d.ts +12 -0
  168. package/dist/front/parse/attribute.d.ts.map +1 -0
  169. package/dist/front/parse/attribute.js +288 -0
  170. package/dist/front/parse/attribute.js.map +1 -0
  171. package/dist/front/parse/bracket.d.ts +3 -0
  172. package/dist/front/parse/bracket.d.ts.map +1 -0
  173. package/dist/front/parse/bracket.js +102 -0
  174. package/dist/front/parse/bracket.js.map +1 -0
  175. package/dist/front/parse/characters.d.ts +4 -0
  176. package/dist/front/parse/characters.d.ts.map +1 -0
  177. package/dist/front/parse/characters.js +6 -0
  178. package/dist/front/parse/characters.js.map +1 -0
  179. package/dist/front/parse/decode.d.ts +2 -0
  180. package/dist/front/parse/decode.d.ts.map +1 -0
  181. package/dist/front/parse/decode.js +89 -0
  182. package/dist/front/parse/decode.js.map +1 -0
  183. package/dist/front/parse/element.d.ts +3 -0
  184. package/dist/front/parse/element.d.ts.map +1 -0
  185. package/dist/front/parse/element.js +311 -0
  186. package/dist/front/parse/element.js.map +1 -0
  187. package/dist/front/parse/entities.d.ts +2 -0
  188. package/dist/front/parse/entities.d.ts.map +1 -0
  189. package/dist/front/parse/entities.js +2234 -0
  190. package/dist/front/parse/entities.js.map +1 -0
  191. package/dist/front/parse/expression.d.ts +5 -0
  192. package/dist/front/parse/expression.d.ts.map +1 -0
  193. package/dist/front/parse/expression.js +86 -0
  194. package/dist/front/parse/expression.js.map +1 -0
  195. package/dist/front/parse/html.d.ts +8 -0
  196. package/dist/front/parse/html.d.ts.map +1 -0
  197. package/dist/front/parse/html.js +146 -0
  198. package/dist/front/parse/html.js.map +1 -0
  199. package/dist/front/parse/identifier.d.ts +4 -0
  200. package/dist/front/parse/identifier.d.ts.map +1 -0
  201. package/dist/front/parse/identifier.js +24 -0
  202. package/dist/front/parse/identifier.js.map +1 -0
  203. package/dist/front/parse/index.d.ts +13 -0
  204. package/dist/front/parse/index.d.ts.map +1 -0
  205. package/dist/front/parse/index.js +74 -0
  206. package/dist/front/parse/index.js.map +1 -0
  207. package/dist/front/parse/js.d.ts +27 -0
  208. package/dist/front/parse/js.d.ts.map +1 -0
  209. package/dist/front/parse/js.js +241 -0
  210. package/dist/front/parse/js.js.map +1 -0
  211. package/dist/front/parse/options.d.ts +3 -0
  212. package/dist/front/parse/options.d.ts.map +1 -0
  213. package/dist/front/parse/options.js +198 -0
  214. package/dist/front/parse/options.js.map +1 -0
  215. package/dist/front/parse/parser.d.ts +50 -0
  216. package/dist/front/parse/parser.d.ts.map +1 -0
  217. package/dist/front/parse/parser.js +157 -0
  218. package/dist/front/parse/parser.js.map +1 -0
  219. package/dist/front/parse/pattern.d.ts +4 -0
  220. package/dist/front/parse/pattern.d.ts.map +1 -0
  221. package/dist/front/parse/pattern.js +53 -0
  222. package/dist/front/parse/pattern.js.map +1 -0
  223. package/dist/front/parse/script.d.ts +4 -0
  224. package/dist/front/parse/script.d.ts.map +1 -0
  225. package/dist/front/parse/script.js +60 -0
  226. package/dist/front/parse/script.js.map +1 -0
  227. package/dist/front/parse/style.d.ts +7 -0
  228. package/dist/front/parse/style.d.ts.map +1 -0
  229. package/dist/front/parse/style.js +397 -0
  230. package/dist/front/parse/style.js.map +1 -0
  231. package/dist/front/parse/tag.d.ts +3 -0
  232. package/dist/front/parse/tag.d.ts.map +1 -0
  233. package/dist/front/parse/tag.js +591 -0
  234. package/dist/front/parse/tag.js.map +1 -0
  235. package/dist/front/print/css.d.ts +5 -0
  236. package/dist/front/print/css.d.ts.map +1 -0
  237. package/dist/front/print/css.js +234 -0
  238. package/dist/front/print/css.js.map +1 -0
  239. package/dist/front/print/index.d.ts +18 -0
  240. package/dist/front/print/index.d.ts.map +1 -0
  241. package/dist/front/print/index.js +24 -0
  242. package/dist/front/print/index.js.map +1 -0
  243. package/dist/front/print/layout.d.ts +11 -0
  244. package/dist/front/print/layout.d.ts.map +1 -0
  245. package/dist/front/print/layout.js +73 -0
  246. package/dist/front/print/layout.js.map +1 -0
  247. package/dist/front/print/template.d.ts +5 -0
  248. package/dist/front/print/template.d.ts.map +1 -0
  249. package/dist/front/print/template.js +455 -0
  250. package/dist/front/print/template.js.map +1 -0
  251. package/dist/front/runes.d.ts +13 -0
  252. package/dist/front/runes.d.ts.map +1 -0
  253. package/dist/front/runes.js +253 -0
  254. package/dist/front/runes.js.map +1 -0
  255. package/dist/front/stores.d.ts +5 -0
  256. package/dist/front/stores.d.ts.map +1 -0
  257. package/dist/front/stores.js +84 -0
  258. package/dist/front/stores.js.map +1 -0
  259. package/dist/front/typescript.d.ts +2 -0
  260. package/dist/front/typescript.d.ts.map +1 -0
  261. package/dist/front/typescript.js +182 -0
  262. package/dist/front/typescript.js.map +1 -0
  263. package/dist/front/validate/anchors.d.ts +15 -0
  264. package/dist/front/validate/anchors.d.ts.map +1 -0
  265. package/dist/front/validate/anchors.js +43 -0
  266. package/dist/front/validate/anchors.js.map +1 -0
  267. package/dist/front/validate/index.d.ts +16 -0
  268. package/dist/front/validate/index.d.ts.map +1 -0
  269. package/dist/front/validate/index.js +139 -0
  270. package/dist/front/validate/index.js.map +1 -0
  271. package/dist/front/validate/legacy.d.ts +9 -0
  272. package/dist/front/validate/legacy.d.ts.map +1 -0
  273. package/dist/front/validate/legacy.js +102 -0
  274. package/dist/front/validate/legacy.js.map +1 -0
  275. package/dist/front/validate/report.d.ts +14 -0
  276. package/dist/front/validate/report.d.ts.map +1 -0
  277. package/dist/front/validate/report.js +29 -0
  278. package/dist/front/validate/report.js.map +1 -0
  279. package/dist/front/validate/template.d.ts +31 -0
  280. package/dist/front/validate/template.d.ts.map +1 -0
  281. package/dist/front/validate/template.js +507 -0
  282. package/dist/front/validate/template.js.map +1 -0
  283. package/dist/front/wording.d.ts +4 -0
  284. package/dist/front/wording.d.ts.map +1 -0
  285. package/dist/front/wording.js +110 -0
  286. package/dist/front/wording.js.map +1 -0
  287. package/dist/shared/format.d.ts +3 -0
  288. package/dist/shared/format.d.ts.map +1 -0
  289. package/dist/shared/format.js +7 -0
  290. package/dist/shared/format.js.map +1 -0
  291. package/easing.d.ts +2 -0
  292. package/elements.d.ts +1220 -0
  293. package/index.d.ts +2 -0
  294. package/motion.d.ts +2 -0
  295. package/package.json +128 -5
  296. package/src/compiler/diagnostics.ts +233 -0
  297. package/src/compiler/index.ts +292 -0
  298. package/src/compiler/options.ts +140 -0
  299. package/src/compiler/preprocess/decode.ts +85 -0
  300. package/src/compiler/preprocess/index.ts +299 -0
  301. package/src/compiler/preprocess/mapped.ts +146 -0
  302. package/src/compiler/proxy.ts +154 -0
  303. package/src/entries/action.ts +1 -0
  304. package/src/entries/animate.ts +1 -0
  305. package/src/entries/attachments.ts +1 -0
  306. package/src/entries/context.ts +50 -0
  307. package/src/entries/easing.ts +1 -0
  308. package/src/entries/events.ts +1 -0
  309. package/src/entries/index-server.ts +17 -0
  310. package/src/entries/index.ts +41 -0
  311. package/src/entries/internal/client.ts +15 -0
  312. package/src/entries/internal/disclose-version.ts +4 -0
  313. package/src/entries/internal/index.ts +3 -0
  314. package/src/entries/internal/server.ts +8 -0
  315. package/src/entries/internal/tracing.ts +1 -0
  316. package/src/entries/motion-server.ts +1 -0
  317. package/src/entries/motion.ts +1 -0
  318. package/src/entries/proxy.ts +86 -0
  319. package/src/entries/reactivity-server.ts +9 -0
  320. package/src/entries/reactivity.ts +9 -0
  321. package/src/entries/report.ts +81 -0
  322. package/src/entries/server.ts +76 -0
  323. package/src/entries/store-client.ts +80 -0
  324. package/src/entries/store-server.ts +44 -0
  325. package/src/entries/store.ts +201 -0
  326. package/src/entries/transition.ts +1 -0
  327. package/src/entries/window-server.ts +1 -0
  328. package/src/entries/window.ts +1 -0
  329. package/src/front/ast.ts +369 -0
  330. package/src/front/diagnostics.ts +53 -0
  331. package/src/front/ignores.ts +84 -0
  332. package/src/front/index.ts +86 -0
  333. package/src/front/legacy.ts +414 -0
  334. package/src/front/locate.ts +20 -0
  335. package/src/front/lower.ts +509 -0
  336. package/src/front/parse/attribute.ts +319 -0
  337. package/src/front/parse/bracket.ts +99 -0
  338. package/src/front/parse/characters.ts +19 -0
  339. package/src/front/parse/decode.ts +87 -0
  340. package/src/front/parse/element.ts +354 -0
  341. package/src/front/parse/entities.ts +2233 -0
  342. package/src/front/parse/expression.ts +85 -0
  343. package/src/front/parse/html.ts +158 -0
  344. package/src/front/parse/identifier.ts +29 -0
  345. package/src/front/parse/index.ts +88 -0
  346. package/src/front/parse/js.ts +284 -0
  347. package/src/front/parse/options.ts +194 -0
  348. package/src/front/parse/parser.ts +189 -0
  349. package/src/front/parse/pattern.ts +57 -0
  350. package/src/front/parse/script.ts +74 -0
  351. package/src/front/parse/style.ts +399 -0
  352. package/src/front/parse/tag.ts +601 -0
  353. package/src/front/print/css.ts +239 -0
  354. package/src/front/print/index.ts +40 -0
  355. package/src/front/print/layout.ts +87 -0
  356. package/src/front/print/template.ts +448 -0
  357. package/src/front/runes.ts +267 -0
  358. package/src/front/stores.ts +98 -0
  359. package/src/front/typescript.ts +178 -0
  360. package/src/front/validate/anchors.ts +54 -0
  361. package/src/front/validate/index.ts +174 -0
  362. package/src/front/validate/legacy.ts +119 -0
  363. package/src/front/validate/report.ts +38 -0
  364. package/src/front/validate/template.ts +549 -0
  365. package/src/front/wording.ts +112 -0
  366. package/src/shared/format.ts +8 -0
  367. package/store.d.ts +2 -0
  368. package/svelte-html.d.ts +53 -0
  369. package/transition.d.ts +2 -0
  370. package/types/compiler/interfaces.d.ts +2 -0
  371. package/types/compiler/preprocess.d.ts +2 -0
  372. package/types/index.d.ts +1453 -0
  373. package/README.md +0 -3
@@ -0,0 +1,509 @@
1
+ import type * as ES from 'estree';
2
+ import type * as IR from 'vigla/compiler';
3
+ import type * as AST from './ast.ts';
4
+ import type { Diagnostic } from 'vigla/compiler';
5
+ import { extractIgnores } from './ignores.ts';
6
+ import { Resolution } from './runes.ts';
7
+ import { stripTypes } from './typescript.ts';
8
+
9
+ const targets: Readonly<Record<string, IR.Target>> = {
10
+ SvelteHead: 'head',
11
+ SvelteWindow: 'window',
12
+ SvelteDocument: 'document',
13
+ SvelteBody: 'body'
14
+ };
15
+
16
+ const prefixes: Readonly<Record<string, string>> = {
17
+ StyleDirective: 'style',
18
+ BindDirective: 'bind',
19
+ ClassDirective: 'class',
20
+ UseDirective: 'use',
21
+ AnimateDirective: 'animate',
22
+ OnDirective: 'on',
23
+ LetDirective: 'let'
24
+ };
25
+
26
+ function nameStart(attribute: AST.Directive | AST.StyleDirective): number {
27
+ const prefix =
28
+ attribute.type === 'TransitionDirective'
29
+ ? attribute.intro && attribute.outro
30
+ ? 'transition'
31
+ : attribute.intro
32
+ ? 'in'
33
+ : 'out'
34
+ : (prefixes[attribute.type] ?? '');
35
+ return attribute.start + prefix.length + 1;
36
+ }
37
+
38
+ function located<T extends ES.Node>(node: T, start: number, end: number): T {
39
+ return Object.assign(node, { start, end });
40
+ }
41
+
42
+ function chain(name: string, start: number): ES.Expression {
43
+ const parts = name.split('.');
44
+ let offset = start;
45
+ let node: ES.Expression | null = null;
46
+ for (const part of parts) {
47
+ const identifier = located<ES.Identifier>(
48
+ { type: 'Identifier', name: part },
49
+ offset,
50
+ offset + part.length
51
+ );
52
+ node =
53
+ node === null
54
+ ? identifier
55
+ : located<ES.MemberExpression>(
56
+ {
57
+ type: 'MemberExpression',
58
+ object: node,
59
+ property: identifier,
60
+ computed: false,
61
+ optional: false
62
+ },
63
+ start,
64
+ offset + part.length
65
+ );
66
+ offset += part.length + 1;
67
+ }
68
+ return node as ES.Expression;
69
+ }
70
+
71
+ type Commented = ES.Node & { leadingComments?: { value: string; start?: number }[] };
72
+
73
+ export class Lowering {
74
+ readonly resolution: Resolution;
75
+ readonly ts: boolean;
76
+ readonly ignores = new Map<object, ReadonlySet<string>>();
77
+ readonly anchored = new Map<object, Diagnostic[]>();
78
+ readonly lowered = new Map<object, object>();
79
+
80
+ constructor(ts: boolean) {
81
+ this.ts = ts;
82
+ this.resolution = new Resolution((node) => this.commented(node));
83
+ }
84
+
85
+ anchor(node: object, diagnostics: readonly Diagnostic[]): void {
86
+ if (diagnostics.length === 0) return;
87
+ const list = this.anchored.get(node);
88
+ if (list === undefined) this.anchored.set(node, [...diagnostics]);
89
+ else list.push(...diagnostics);
90
+ }
91
+
92
+ commented(node: Commented): void {
93
+ const comments = node.leadingComments;
94
+ if (comments === undefined) return;
95
+ const codes: string[] = [];
96
+ for (const comment of comments) {
97
+ const extracted = extractIgnores((comment.start ?? Number.NaN) + 2, comment.value);
98
+ codes.push(...extracted.codes);
99
+ this.anchor(node, extracted.warnings);
100
+ }
101
+ if (codes.length > 0) this.ignores.set(node, new Set(codes));
102
+ }
103
+
104
+ clean<T>(node: T): T {
105
+ return this.ts ? stripTypes(node) : node;
106
+ }
107
+
108
+ program(program: ES.Program): ES.Program {
109
+ const cleaned = this.clean(program);
110
+ this.resolution.program(cleaned);
111
+ return cleaned;
112
+ }
113
+
114
+ expression<T extends ES.Node>(expression: T): T {
115
+ const cleaned = this.clean(expression);
116
+ this.resolution.expression(cleaned);
117
+ return cleaned;
118
+ }
119
+
120
+ pattern<T extends ES.Node>(pattern: T): T {
121
+ const cleaned = this.clean(pattern);
122
+ this.resolution.expression(cleaned);
123
+ return cleaned;
124
+ }
125
+
126
+ options(options: AST.SvelteOptions | null): IR.Options | null {
127
+ if (options === null) return null;
128
+ const element = options.customElement;
129
+ let customElement: IR.CustomElement | null = null;
130
+ if (element !== undefined) {
131
+ const shadow = element.shadow;
132
+ customElement = {
133
+ tag: element.tag ?? null,
134
+ shadow:
135
+ shadow === undefined
136
+ ? null
137
+ : typeof shadow === 'string'
138
+ ? shadow
139
+ : this.expression(shadow),
140
+ props: this.customProps(options),
141
+ extend: element.extend === undefined ? null : this.expression(element.extend)
142
+ };
143
+ }
144
+ return {
145
+ start: options.start,
146
+ end: options.end,
147
+ namespace: options.namespace ?? null,
148
+ css: options.css ?? null,
149
+ customElement,
150
+ preserveWhitespace: options.preserveWhitespace ?? null
151
+ };
152
+ }
153
+
154
+ customProps(options: AST.SvelteOptions): ES.ObjectExpression | null {
155
+ for (const attribute of options.attributes) {
156
+ if (attribute.type !== 'Attribute' || attribute.name !== 'customElement') continue;
157
+ const value = attribute.value;
158
+ const tag = Array.isArray(value) ? value[0] : value;
159
+ if (tag === undefined || tag === true || tag.type !== 'ExpressionTag') return null;
160
+ const object = tag.expression;
161
+ if (object.type !== 'ObjectExpression') return null;
162
+ for (const property of object.properties) {
163
+ if (
164
+ property.type === 'Property' &&
165
+ property.key.type === 'Identifier' &&
166
+ property.key.name === 'props' &&
167
+ property.value.type === 'ObjectExpression'
168
+ ) {
169
+ return this.expression(property.value);
170
+ }
171
+ }
172
+ }
173
+ return null;
174
+ }
175
+
176
+ fragment(fragment: AST.Fragment | null | undefined): IR.Fragment {
177
+ const nodes: IR.Node[] = [];
178
+ const comments: AST.Comment[] = [];
179
+ for (const node of fragment?.nodes ?? []) {
180
+ if (node.type === 'Comment') comments.push(node);
181
+ const lowered = this.node(node);
182
+ if (lowered === null) continue;
183
+ this.lowered.set(node, lowered);
184
+ nodes.push(lowered);
185
+ if (node.type === 'Comment' || node.type === 'Text') continue;
186
+ if (comments.length > 0) this.templateIgnores(lowered, comments.splice(0));
187
+ }
188
+ return { nodes };
189
+ }
190
+
191
+ templateIgnores(node: object, comments: readonly AST.Comment[]): void {
192
+ const codes: string[] = [];
193
+ for (let index = comments.length - 1; index >= 0; index--) {
194
+ const comment = comments[index] as AST.Comment;
195
+ const extracted = extractIgnores(comment.start + 4, comment.data);
196
+ codes.push(...extracted.codes);
197
+ this.anchor(node, extracted.warnings);
198
+ }
199
+ if (codes.length > 0) this.ignores.set(node, new Set(codes));
200
+ }
201
+
202
+ part(part: AST.Text | AST.ExpressionTag): IR.Text | IR.Expression {
203
+ return part.type === 'Text'
204
+ ? { kind: 'text', start: part.start, end: part.end, data: part.data }
205
+ : {
206
+ kind: 'expression',
207
+ start: part.start,
208
+ end: part.end,
209
+ expression: this.expression(part.expression)
210
+ };
211
+ }
212
+
213
+ value(value: AST.AttributeValue): IR.Value {
214
+ if (value === true) return { kind: 'boolean' };
215
+ const only = Array.isArray(value) && value.length === 1 ? value[0] : value;
216
+ if (!Array.isArray(only) && only?.type === 'ExpressionTag') {
217
+ return { kind: 'expression', expression: this.expression(only.expression) };
218
+ }
219
+ const parts = value as (AST.Text | AST.ExpressionTag)[];
220
+ return { kind: 'text', parts: parts.map((part) => this.part(part)) };
221
+ }
222
+
223
+ attribute(attribute: AST.AttributeLike): IR.Attribute | null {
224
+ const span = { start: attribute.start, end: attribute.end };
225
+ switch (attribute.type) {
226
+ case 'Attribute':
227
+ return {
228
+ kind: 'attribute',
229
+ ...span,
230
+ name: attribute.name,
231
+ value: this.value(attribute.value)
232
+ };
233
+ case 'SpreadAttribute':
234
+ return { kind: 'spread', ...span, expression: this.expression(attribute.expression) };
235
+ case 'AttachTag':
236
+ return { kind: 'attachment', ...span, expression: this.expression(attribute.expression) };
237
+ case 'StyleDirective':
238
+ return {
239
+ kind: 'style',
240
+ ...span,
241
+ name: attribute.name,
242
+ value:
243
+ attribute.value === true
244
+ ? {
245
+ kind: 'expression',
246
+ expression: this.expression(chain(attribute.name, nameStart(attribute)))
247
+ }
248
+ : this.value(attribute.value),
249
+ important: attribute.modifiers.includes('important')
250
+ };
251
+ case 'BindDirective':
252
+ return {
253
+ kind: 'binding',
254
+ ...span,
255
+ name: attribute.name,
256
+ expression: this.expression(attribute.expression as ES.Expression)
257
+ };
258
+ case 'ClassDirective':
259
+ return {
260
+ kind: 'class',
261
+ ...span,
262
+ name: attribute.name,
263
+ expression: this.expression(attribute.expression as ES.Expression)
264
+ };
265
+ case 'UseDirective':
266
+ return {
267
+ kind: 'action',
268
+ ...span,
269
+ action: this.expression(chain(attribute.name, nameStart(attribute))),
270
+ argument: attribute.expression === null ? null : this.expression(attribute.expression)
271
+ };
272
+ case 'TransitionDirective':
273
+ return {
274
+ kind: 'transition',
275
+ ...span,
276
+ direction: attribute.intro && attribute.outro ? 'both' : attribute.intro ? 'in' : 'out',
277
+ transition: this.expression(chain(attribute.name, nameStart(attribute))),
278
+ argument: attribute.expression === null ? null : this.expression(attribute.expression),
279
+ global: attribute.modifiers.includes('global')
280
+ };
281
+ case 'AnimateDirective':
282
+ return {
283
+ kind: 'animation',
284
+ ...span,
285
+ animation: this.expression(chain(attribute.name, nameStart(attribute))),
286
+ argument: attribute.expression === null ? null : this.expression(attribute.expression)
287
+ };
288
+ case 'OnDirective':
289
+ case 'LetDirective':
290
+ return null;
291
+ }
292
+ }
293
+
294
+ attributes(node: AST.ElementLike): IR.Attribute[] {
295
+ const lowered: IR.Attribute[] = [];
296
+ for (const attribute of node.attributes) {
297
+ const one = this.attribute(attribute);
298
+ if (one !== null) lowered.push(one);
299
+ }
300
+ return lowered;
301
+ }
302
+
303
+ branch(block: AST.IfBlock): IR.Branch {
304
+ const arms: IR.Arm[] = [];
305
+ let current = block;
306
+ let fallback: IR.Fragment | null = null;
307
+ for (;;) {
308
+ arms.push({
309
+ start: current.start,
310
+ end: current.end,
311
+ test: this.expression(current.test),
312
+ body: this.fragment(current.consequent)
313
+ });
314
+ const alternate = current.alternate;
315
+ const only = alternate?.nodes[0];
316
+ if (
317
+ alternate !== null &&
318
+ alternate.nodes.length === 1 &&
319
+ only?.type === 'IfBlock' &&
320
+ only.elseif
321
+ ) {
322
+ current = only;
323
+ continue;
324
+ }
325
+ fallback = alternate === null ? null : this.fragment(alternate);
326
+ break;
327
+ }
328
+ return { kind: 'branch', start: block.start, end: block.end, arms, fallback };
329
+ }
330
+
331
+ each(node: AST.EachBlock): IR.KeyedList | IR.UnkeyedList {
332
+ const list = {
333
+ start: node.start,
334
+ end: node.end,
335
+ collection: this.expression(node.expression),
336
+ item: node.context === null ? null : this.pattern(node.context),
337
+ index:
338
+ node.index === undefined
339
+ ? null
340
+ : ({ type: 'Identifier', name: node.index } as ES.Identifier),
341
+ body: this.fragment(node.body),
342
+ fallback: node.fallback === undefined ? null : this.fragment(node.fallback)
343
+ };
344
+ return node.key === undefined
345
+ ? { kind: 'unkeyed-list', ...list }
346
+ : { kind: 'keyed-list', ...list, key: this.expression(node.key) };
347
+ }
348
+
349
+ element(node: AST.ElementLike): IR.Node | null {
350
+ const span = { start: node.start, end: node.end };
351
+ switch (node.type) {
352
+ case 'RegularElement':
353
+ return {
354
+ kind: 'element',
355
+ ...span,
356
+ name: node.name,
357
+ attributes: this.attributes(node),
358
+ body: this.fragment(node.fragment)
359
+ };
360
+ case 'Component':
361
+ return {
362
+ kind: 'component',
363
+ ...span,
364
+ reference: this.expression(chain(node.name, node.start + 1)),
365
+ attributes: this.attributes(node),
366
+ body: this.fragment(node.fragment)
367
+ };
368
+ case 'TitleElement':
369
+ return {
370
+ kind: 'title',
371
+ ...span,
372
+ parts: node.fragment.nodes
373
+ .filter(
374
+ (child): child is AST.Text | AST.ExpressionTag =>
375
+ child.type === 'Text' || child.type === 'ExpressionTag'
376
+ )
377
+ .map((child) => this.part(child))
378
+ };
379
+ case 'SvelteHead':
380
+ case 'SvelteWindow':
381
+ case 'SvelteDocument':
382
+ case 'SvelteBody':
383
+ return {
384
+ kind: 'special',
385
+ ...span,
386
+ target: targets[node.type] as IR.Target,
387
+ attributes: this.attributes(node),
388
+ body: this.fragment(node.fragment)
389
+ };
390
+ case 'SvelteElement':
391
+ return {
392
+ kind: 'dynamic-element',
393
+ ...span,
394
+ tag: this.expression(node.tag as ES.Expression),
395
+ namespace: null,
396
+ attributes: this.attributes(node),
397
+ body: this.fragment(node.fragment)
398
+ };
399
+ case 'SvelteBoundary':
400
+ return {
401
+ kind: 'boundary',
402
+ ...span,
403
+ attributes: this.attributes(node),
404
+ body: this.fragment(node.fragment)
405
+ };
406
+ case 'SlotElement': {
407
+ const name = node.attributes.find(
408
+ (attribute): attribute is AST.Attribute =>
409
+ attribute.type === 'Attribute' && attribute.name === 'name'
410
+ );
411
+ const value = name?.value;
412
+ const text =
413
+ Array.isArray(value) && value.length === 1 && value[0]?.type === 'Text'
414
+ ? value[0].data
415
+ : null;
416
+ return {
417
+ kind: 'slot',
418
+ ...span,
419
+ name: text,
420
+ attributes: this.attributes(node),
421
+ fallback: this.fragment(node.fragment)
422
+ };
423
+ }
424
+ case 'SvelteOptions':
425
+ return null;
426
+ case 'SvelteComponent':
427
+ case 'SvelteSelf':
428
+ case 'SvelteFragment':
429
+ return null;
430
+ }
431
+ }
432
+
433
+ node(node: AST.TemplateNode): IR.Node | null {
434
+ const span = { start: node.start, end: node.end };
435
+ switch (node.type) {
436
+ case 'Text':
437
+ case 'ExpressionTag':
438
+ return this.part(node);
439
+ case 'Comment':
440
+ return { kind: 'comment', ...span, data: node.data };
441
+ case 'HtmlTag':
442
+ return { kind: 'raw-html', ...span, expression: this.expression(node.expression) };
443
+ case 'ConstTag': {
444
+ const declaration = this.clean(node.declaration);
445
+ this.resolution.expression(declaration);
446
+ return {
447
+ kind: 'constant',
448
+ ...span,
449
+ declarator: declaration.declarations[0] as ES.VariableDeclarator
450
+ };
451
+ }
452
+ case 'DebugTag':
453
+ return {
454
+ kind: 'debug',
455
+ ...span,
456
+ identifiers: node.identifiers.map((identifier) => this.expression(identifier))
457
+ };
458
+ case 'RenderTag':
459
+ return { kind: 'render', ...span, call: this.expression(node.expression) };
460
+ case 'DeclarationTag': {
461
+ const declaration = this.clean(node.declaration);
462
+ this.resolution.expression(declaration);
463
+ return { kind: 'declaration', ...span, declaration };
464
+ }
465
+ case 'IfBlock':
466
+ return this.branch(node);
467
+ case 'EachBlock':
468
+ return this.each(node);
469
+ case 'AwaitBlock':
470
+ return {
471
+ kind: 'async-block',
472
+ ...span,
473
+ promise: this.expression(node.expression),
474
+ pending: node.pending === null ? null : this.fragment(node.pending),
475
+ resolved:
476
+ node.then === null
477
+ ? null
478
+ : {
479
+ binding: node.value === null ? null : this.pattern(node.value),
480
+ body: this.fragment(node.then)
481
+ },
482
+ rejected:
483
+ node.catch === null
484
+ ? null
485
+ : {
486
+ binding: node.error === null ? null : this.pattern(node.error),
487
+ body: this.fragment(node.catch)
488
+ }
489
+ };
490
+ case 'KeyBlock':
491
+ return {
492
+ kind: 'keyed-block',
493
+ ...span,
494
+ key: this.expression(node.expression),
495
+ body: this.fragment(node.fragment)
496
+ };
497
+ case 'SnippetBlock':
498
+ return {
499
+ kind: 'snippet',
500
+ ...span,
501
+ name: node.expression,
502
+ parameters: node.parameters.map((parameter) => this.pattern(parameter)),
503
+ body: this.fragment(node.body)
504
+ };
505
+ default:
506
+ return this.element(node);
507
+ }
508
+ }
509
+ }