@velastack/cms 0.1.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cms.d.ts +6 -0
  4. package/dist/cms.js +30 -0
  5. package/dist/components/admin-bar/admin-bar-internal.svelte +1697 -0
  6. package/dist/components/admin-bar/admin-bar-internal.svelte.d.ts +12 -0
  7. package/dist/components/admin-bar/admin-bar.css +5 -0
  8. package/dist/components/admin-bar/admin-bar.svelte +355 -0
  9. package/dist/components/admin-bar/admin-bar.svelte.d.ts +7 -0
  10. package/dist/components/admin-bar/click-outside.d.ts +8 -0
  11. package/dist/components/admin-bar/click-outside.js +17 -0
  12. package/dist/components/admin-bar/css-root.svelte +23 -0
  13. package/dist/components/admin-bar/css-root.svelte.d.ts +19 -0
  14. package/dist/components/admin-bar/delete-page-dialog.svelte +326 -0
  15. package/dist/components/admin-bar/delete-page-dialog.svelte.d.ts +32 -0
  16. package/dist/components/admin-bar/history-panel.svelte +264 -0
  17. package/dist/components/admin-bar/history-panel.svelte.d.ts +8 -0
  18. package/dist/components/admin-bar/icons/bold.svelte +13 -0
  19. package/dist/components/admin-bar/icons/bold.svelte.d.ts +3 -0
  20. package/dist/components/admin-bar/icons/check.svelte +11 -0
  21. package/dist/components/admin-bar/icons/check.svelte.d.ts +3 -0
  22. package/dist/components/admin-bar/icons/chevron-down.svelte +11 -0
  23. package/dist/components/admin-bar/icons/chevron-down.svelte.d.ts +3 -0
  24. package/dist/components/admin-bar/icons/chevron-right.svelte +11 -0
  25. package/dist/components/admin-bar/icons/chevron-right.svelte.d.ts +3 -0
  26. package/dist/components/admin-bar/icons/chevron-up.svelte +11 -0
  27. package/dist/components/admin-bar/icons/chevron-up.svelte.d.ts +3 -0
  28. package/dist/components/admin-bar/icons/code.svelte +14 -0
  29. package/dist/components/admin-bar/icons/code.svelte.d.ts +3 -0
  30. package/dist/components/admin-bar/icons/external-link.svelte +15 -0
  31. package/dist/components/admin-bar/icons/external-link.svelte.d.ts +3 -0
  32. package/dist/components/admin-bar/icons/file.svelte +19 -0
  33. package/dist/components/admin-bar/icons/file.svelte.d.ts +3 -0
  34. package/dist/components/admin-bar/icons/heading-2.svelte +16 -0
  35. package/dist/components/admin-bar/icons/heading-2.svelte.d.ts +3 -0
  36. package/dist/components/admin-bar/icons/heading-3.svelte +17 -0
  37. package/dist/components/admin-bar/icons/heading-3.svelte.d.ts +3 -0
  38. package/dist/components/admin-bar/icons/icon.svelte +41 -0
  39. package/dist/components/admin-bar/icons/icon.svelte.d.ts +21 -0
  40. package/dist/components/admin-bar/icons/images.svelte +16 -0
  41. package/dist/components/admin-bar/icons/images.svelte.d.ts +3 -0
  42. package/dist/components/admin-bar/icons/italic.svelte +15 -0
  43. package/dist/components/admin-bar/icons/italic.svelte.d.ts +3 -0
  44. package/dist/components/admin-bar/icons/link-2-off.svelte +16 -0
  45. package/dist/components/admin-bar/icons/link-2-off.svelte.d.ts +3 -0
  46. package/dist/components/admin-bar/icons/link.svelte +14 -0
  47. package/dist/components/admin-bar/icons/link.svelte.d.ts +3 -0
  48. package/dist/components/admin-bar/icons/list-ordered.svelte +18 -0
  49. package/dist/components/admin-bar/icons/list-ordered.svelte.d.ts +3 -0
  50. package/dist/components/admin-bar/icons/list.svelte +18 -0
  51. package/dist/components/admin-bar/icons/list.svelte.d.ts +3 -0
  52. package/dist/components/admin-bar/icons/loader-circle.svelte +11 -0
  53. package/dist/components/admin-bar/icons/loader-circle.svelte.d.ts +3 -0
  54. package/dist/components/admin-bar/icons/minus.svelte +11 -0
  55. package/dist/components/admin-bar/icons/minus.svelte.d.ts +3 -0
  56. package/dist/components/admin-bar/icons/quote.svelte +24 -0
  57. package/dist/components/admin-bar/icons/quote.svelte.d.ts +3 -0
  58. package/dist/components/admin-bar/icons/search.svelte +14 -0
  59. package/dist/components/admin-bar/icons/search.svelte.d.ts +3 -0
  60. package/dist/components/admin-bar/icons/trash-2.svelte +17 -0
  61. package/dist/components/admin-bar/icons/trash-2.svelte.d.ts +3 -0
  62. package/dist/components/admin-bar/icons/triangle-alert.svelte +15 -0
  63. package/dist/components/admin-bar/icons/triangle-alert.svelte.d.ts +3 -0
  64. package/dist/components/admin-bar/icons/types.d.ts +7 -0
  65. package/dist/components/admin-bar/icons/types.js +1 -0
  66. package/dist/components/admin-bar/icons/undo-2.svelte +14 -0
  67. package/dist/components/admin-bar/icons/undo-2.svelte.d.ts +3 -0
  68. package/dist/components/admin-bar/icons/upload.svelte +15 -0
  69. package/dist/components/admin-bar/icons/upload.svelte.d.ts +3 -0
  70. package/dist/components/admin-bar/icons/x.svelte +14 -0
  71. package/dist/components/admin-bar/icons/x.svelte.d.ts +3 -0
  72. package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte +96 -0
  73. package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte.d.ts +7 -0
  74. package/dist/components/admin-bar/locales-panel.svelte +137 -0
  75. package/dist/components/admin-bar/locales-panel.svelte.d.ts +9 -0
  76. package/dist/components/admin-bar/media-panel.svelte +282 -0
  77. package/dist/components/admin-bar/media-panel.svelte.d.ts +7 -0
  78. package/dist/components/admin-bar/new-page-chooser-dialog.svelte +56 -0
  79. package/dist/components/admin-bar/new-page-chooser-dialog.svelte.d.ts +10 -0
  80. package/dist/components/admin-bar/new-page-dialog.svelte +126 -0
  81. package/dist/components/admin-bar/new-page-dialog.svelte.d.ts +14 -0
  82. package/dist/components/admin-bar/page-config.d.ts +61 -0
  83. package/dist/components/admin-bar/page-config.js +24 -0
  84. package/dist/components/admin-bar/pages-panel.svelte +639 -0
  85. package/dist/components/admin-bar/pages-panel.svelte.d.ts +13 -0
  86. package/dist/components/admin-bar/panel-footer.svelte +21 -0
  87. package/dist/components/admin-bar/panel-footer.svelte.d.ts +8 -0
  88. package/dist/components/admin-bar/panel-header.svelte +29 -0
  89. package/dist/components/admin-bar/panel-header.svelte.d.ts +10 -0
  90. package/dist/components/admin-bar/panel.svelte +41 -0
  91. package/dist/components/admin-bar/panel.svelte.d.ts +10 -0
  92. package/dist/components/admin-bar/publish-dialog.svelte +387 -0
  93. package/dist/components/admin-bar/publish-dialog.svelte.d.ts +16 -0
  94. package/dist/components/admin-bar/resolve-route.d.ts +20 -0
  95. package/dist/components/admin-bar/resolve-route.js +50 -0
  96. package/dist/components/admin-bar/seo-panel.svelte +387 -0
  97. package/dist/components/admin-bar/seo-panel.svelte.d.ts +7 -0
  98. package/dist/components/admin-bar/share-preview-link-dialog.svelte +97 -0
  99. package/dist/components/admin-bar/share-preview-link-dialog.svelte.d.ts +9 -0
  100. package/dist/components/admin-bar/site-settings-panel.svelte +225 -0
  101. package/dist/components/admin-bar/site-settings-panel.svelte.d.ts +7 -0
  102. package/dist/components/admin-bar/status-pill.svelte +49 -0
  103. package/dist/components/admin-bar/status-pill.svelte.d.ts +11 -0
  104. package/dist/components/admin-bar/theme.svelte.d.ts +16 -0
  105. package/dist/components/admin-bar/theme.svelte.js +39 -0
  106. package/dist/components/admin-bar/ui/badge/badge.svelte +57 -0
  107. package/dist/components/admin-bar/ui/badge/badge.svelte.d.ts +16 -0
  108. package/dist/components/admin-bar/ui/badge/index.d.ts +4 -0
  109. package/dist/components/admin-bar/ui/badge/index.js +4 -0
  110. package/dist/components/admin-bar/ui/button/button.svelte +73 -0
  111. package/dist/components/admin-bar/ui/button/button.svelte.d.ts +16 -0
  112. package/dist/components/admin-bar/ui/button/index.d.ts +4 -0
  113. package/dist/components/admin-bar/ui/button/index.js +4 -0
  114. package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte +7 -0
  115. package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte.d.ts +4 -0
  116. package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte +7 -0
  117. package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte.d.ts +4 -0
  118. package/dist/components/admin-bar/ui/collapsible/collapsible.svelte +7 -0
  119. package/dist/components/admin-bar/ui/collapsible/collapsible.svelte.d.ts +4 -0
  120. package/dist/components/admin-bar/ui/collapsible/index.d.ts +4 -0
  121. package/dist/components/admin-bar/ui/collapsible/index.js +6 -0
  122. package/dist/components/admin-bar/ui/dialog/dialog-close.svelte +7 -0
  123. package/dist/components/admin-bar/ui/dialog/dialog-close.svelte.d.ts +4 -0
  124. package/dist/components/admin-bar/ui/dialog/dialog-content.svelte +46 -0
  125. package/dist/components/admin-bar/ui/dialog/dialog-content.svelte.d.ts +11 -0
  126. package/dist/components/admin-bar/ui/dialog/dialog-description.svelte +17 -0
  127. package/dist/components/admin-bar/ui/dialog/dialog-description.svelte.d.ts +4 -0
  128. package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte +23 -0
  129. package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte.d.ts +5 -0
  130. package/dist/components/admin-bar/ui/dialog/dialog-header.svelte +20 -0
  131. package/dist/components/admin-bar/ui/dialog/dialog-header.svelte.d.ts +5 -0
  132. package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte +20 -0
  133. package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
  134. package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte +7 -0
  135. package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte.d.ts +3 -0
  136. package/dist/components/admin-bar/ui/dialog/dialog-title.svelte +17 -0
  137. package/dist/components/admin-bar/ui/dialog/dialog-title.svelte.d.ts +4 -0
  138. package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte +7 -0
  139. package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
  140. package/dist/components/admin-bar/ui/dialog/dialog.svelte +7 -0
  141. package/dist/components/admin-bar/ui/dialog/dialog.svelte.d.ts +3 -0
  142. package/dist/components/admin-bar/ui/dialog/index.d.ts +11 -0
  143. package/dist/components/admin-bar/ui/dialog/index.js +13 -0
  144. package/dist/components/admin-bar/ui/input/index.d.ts +3 -0
  145. package/dist/components/admin-bar/ui/input/index.js +3 -0
  146. package/dist/components/admin-bar/ui/input/input.svelte +24 -0
  147. package/dist/components/admin-bar/ui/input/input.svelte.d.ts +5 -0
  148. package/dist/components/admin-bar/ui/kbd/index.d.ts +4 -0
  149. package/dist/components/admin-bar/ui/kbd/index.js +6 -0
  150. package/dist/components/admin-bar/ui/kbd/kbd-group.svelte +20 -0
  151. package/dist/components/admin-bar/ui/kbd/kbd-group.svelte.d.ts +5 -0
  152. package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte +52 -0
  153. package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte.d.ts +8 -0
  154. package/dist/components/admin-bar/ui/kbd/kbd.svelte +27 -0
  155. package/dist/components/admin-bar/ui/kbd/kbd.svelte.d.ts +5 -0
  156. package/dist/components/admin-bar/ui/label/index.d.ts +3 -0
  157. package/dist/components/admin-bar/ui/label/index.js +3 -0
  158. package/dist/components/admin-bar/ui/label/label.svelte +20 -0
  159. package/dist/components/admin-bar/ui/label/label.svelte.d.ts +4 -0
  160. package/dist/components/admin-bar/ui/menubar/index.d.ts +18 -0
  161. package/dist/components/admin-bar/ui/menubar/index.js +20 -0
  162. package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte +46 -0
  163. package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte.d.ts +10 -0
  164. package/dist/components/admin-bar/ui/menubar/menubar-content.svelte +28 -0
  165. package/dist/components/admin-bar/ui/menubar/menubar-content.svelte.d.ts +4 -0
  166. package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte +25 -0
  167. package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte.d.ts +8 -0
  168. package/dist/components/admin-bar/ui/menubar/menubar-group.svelte +12 -0
  169. package/dist/components/admin-bar/ui/menubar/menubar-group.svelte.d.ts +7 -0
  170. package/dist/components/admin-bar/ui/menubar/menubar-item.svelte +27 -0
  171. package/dist/components/admin-bar/ui/menubar/menubar-item.svelte.d.ts +8 -0
  172. package/dist/components/admin-bar/ui/menubar/menubar-label.svelte +25 -0
  173. package/dist/components/admin-bar/ui/menubar/menubar-label.svelte.d.ts +8 -0
  174. package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte +7 -0
  175. package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte.d.ts +3 -0
  176. package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte +7 -0
  177. package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte.d.ts +3 -0
  178. package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte +11 -0
  179. package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte.d.ts +4 -0
  180. package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte +37 -0
  181. package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte.d.ts +8 -0
  182. package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte +17 -0
  183. package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte.d.ts +4 -0
  184. package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte +23 -0
  185. package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte.d.ts +5 -0
  186. package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte +20 -0
  187. package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte.d.ts +4 -0
  188. package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte +29 -0
  189. package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte.d.ts +8 -0
  190. package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte +7 -0
  191. package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte.d.ts +4 -0
  192. package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte +20 -0
  193. package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte.d.ts +4 -0
  194. package/dist/components/admin-bar/ui/menubar/menubar.svelte +20 -0
  195. package/dist/components/admin-bar/ui/menubar/menubar.svelte.d.ts +4 -0
  196. package/dist/components/admin-bar/ui/select/index.d.ts +12 -0
  197. package/dist/components/admin-bar/ui/select/index.js +14 -0
  198. package/dist/components/admin-bar/ui/select/select-content.svelte +45 -0
  199. package/dist/components/admin-bar/ui/select/select-content.svelte.d.ts +11 -0
  200. package/dist/components/admin-bar/ui/select/select-group-heading.svelte +21 -0
  201. package/dist/components/admin-bar/ui/select/select-group-heading.svelte.d.ts +10 -0
  202. package/dist/components/admin-bar/ui/select/select-group.svelte +17 -0
  203. package/dist/components/admin-bar/ui/select/select-group.svelte.d.ts +4 -0
  204. package/dist/components/admin-bar/ui/select/select-item.svelte +40 -0
  205. package/dist/components/admin-bar/ui/select/select-item.svelte.d.ts +5 -0
  206. package/dist/components/admin-bar/ui/select/select-label.svelte +20 -0
  207. package/dist/components/admin-bar/ui/select/select-label.svelte.d.ts +6 -0
  208. package/dist/components/admin-bar/ui/select/select-portal.svelte +7 -0
  209. package/dist/components/admin-bar/ui/select/select-portal.svelte.d.ts +3 -0
  210. package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte +23 -0
  211. package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte.d.ts +5 -0
  212. package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte +23 -0
  213. package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte.d.ts +5 -0
  214. package/dist/components/admin-bar/ui/select/select-separator.svelte +21 -0
  215. package/dist/components/admin-bar/ui/select/select-separator.svelte.d.ts +4 -0
  216. package/dist/components/admin-bar/ui/select/select-trigger.svelte +31 -0
  217. package/dist/components/admin-bar/ui/select/select-trigger.svelte.d.ts +8 -0
  218. package/dist/components/admin-bar/ui/select/select.svelte +11 -0
  219. package/dist/components/admin-bar/ui/select/select.svelte.d.ts +3 -0
  220. package/dist/components/admin-bar/ui/separator/index.d.ts +2 -0
  221. package/dist/components/admin-bar/ui/separator/index.js +4 -0
  222. package/dist/components/admin-bar/ui/separator/separator.svelte +21 -0
  223. package/dist/components/admin-bar/ui/separator/separator.svelte.d.ts +4 -0
  224. package/dist/components/admin-bar/ui/textarea/index.d.ts +3 -0
  225. package/dist/components/admin-bar/ui/textarea/index.js +3 -0
  226. package/dist/components/admin-bar/ui/textarea/textarea.svelte +21 -0
  227. package/dist/components/admin-bar/ui/textarea/textarea.svelte.d.ts +5 -0
  228. package/dist/components/admin-bar/user-avatar.svelte +29 -0
  229. package/dist/components/admin-bar/user-avatar.svelte.d.ts +7 -0
  230. package/dist/components/admin-bar/utils.d.ts +10 -0
  231. package/dist/components/admin-bar/utils.js +46 -0
  232. package/dist/components/admin-bar/variants.d.ts +20 -0
  233. package/dist/components/admin-bar/variants.js +14 -0
  234. package/dist/components/cms/cms-boolean.svelte +102 -0
  235. package/dist/components/cms/cms-boolean.svelte.d.ts +10 -0
  236. package/dist/components/cms/cms-date-time-editable.svelte +66 -0
  237. package/dist/components/cms/cms-date-time-editable.svelte.d.ts +11 -0
  238. package/dist/components/cms/cms-date-time.svelte +67 -0
  239. package/dist/components/cms/cms-date-time.svelte.d.ts +19 -0
  240. package/dist/components/cms/cms-entries.svelte +24 -0
  241. package/dist/components/cms/cms-entries.svelte.d.ts +31 -0
  242. package/dist/components/cms/cms-image-editable.svelte +439 -0
  243. package/dist/components/cms/cms-image-editable.svelte.d.ts +11 -0
  244. package/dist/components/cms/cms-image.svelte +78 -0
  245. package/dist/components/cms/cms-image.svelte.d.ts +18 -0
  246. package/dist/components/cms/cms-link-editable.svelte +429 -0
  247. package/dist/components/cms/cms-link-editable.svelte.d.ts +13 -0
  248. package/dist/components/cms/cms-link.svelte +92 -0
  249. package/dist/components/cms/cms-link.svelte.d.ts +25 -0
  250. package/dist/components/cms/cms-markdown-editable.svelte +74 -0
  251. package/dist/components/cms/cms-markdown-editable.svelte.d.ts +9 -0
  252. package/dist/components/cms/cms-markdown.svelte +56 -0
  253. package/dist/components/cms/cms-markdown.svelte.d.ts +10 -0
  254. package/dist/components/cms/cms-media-picker.svelte +150 -0
  255. package/dist/components/cms/cms-media-picker.svelte.d.ts +8 -0
  256. package/dist/components/cms/cms-number-editable.svelte +77 -0
  257. package/dist/components/cms/cms-number-editable.svelte.d.ts +13 -0
  258. package/dist/components/cms/cms-number.svelte +63 -0
  259. package/dist/components/cms/cms-number.svelte.d.ts +16 -0
  260. package/dist/components/cms/cms-repeater-editable.svelte +137 -0
  261. package/dist/components/cms/cms-repeater-editable.svelte.d.ts +31 -0
  262. package/dist/components/cms/cms-repeater.svelte +55 -0
  263. package/dist/components/cms/cms-repeater.svelte.d.ts +30 -0
  264. package/dist/components/cms/cms-rich-text-editable.svelte +101 -0
  265. package/dist/components/cms/cms-rich-text-editable.svelte.d.ts +9 -0
  266. package/dist/components/cms/cms-rich-text-toolbar.svelte +246 -0
  267. package/dist/components/cms/cms-rich-text-toolbar.svelte.d.ts +9 -0
  268. package/dist/components/cms/cms-rich-text.svelte +74 -0
  269. package/dist/components/cms/cms-rich-text.svelte.d.ts +10 -0
  270. package/dist/components/cms/cms-store.svelte.d.ts +294 -0
  271. package/dist/components/cms/cms-store.svelte.js +625 -0
  272. package/dist/components/cms/cms-text.svelte +131 -0
  273. package/dist/components/cms/cms-text.svelte.d.ts +11 -0
  274. package/dist/components/cms/index.d.ts +13 -0
  275. package/dist/components/cms/index.js +11 -0
  276. package/dist/components/cms/install-scope.svelte.d.ts +7 -0
  277. package/dist/components/cms/install-scope.svelte.js +33 -0
  278. package/dist/components/cms/locale-merge.d.ts +41 -0
  279. package/dist/components/cms/locale-merge.js +77 -0
  280. package/dist/components/cms/overlay-sync.d.ts +82 -0
  281. package/dist/components/cms/overlay-sync.js +76 -0
  282. package/dist/components/cms/path.d.ts +30 -0
  283. package/dist/components/cms/path.js +156 -0
  284. package/dist/components/cms/scope.d.ts +120 -0
  285. package/dist/components/cms/scope.js +23 -0
  286. package/dist/index.d.ts +27 -0
  287. package/dist/index.js +28 -0
  288. package/dist/srv/README.md +341 -0
  289. package/dist/srv/api-adapter.d.ts +20 -0
  290. package/dist/srv/api-adapter.js +178 -0
  291. package/dist/srv/cms.d.ts +62 -0
  292. package/dist/srv/cms.js +35 -0
  293. package/dist/srv/index.d.ts +5 -0
  294. package/dist/srv/index.js +4 -0
  295. package/dist/srv/load-cms.d.ts +105 -0
  296. package/dist/srv/load-cms.js +227 -0
  297. package/dist/srv/mock-adapter.d.ts +96 -0
  298. package/dist/srv/mock-adapter.js +171 -0
  299. package/dist/srv/types.d.ts +114 -0
  300. package/dist/srv/types.js +1 -0
  301. package/package.json +116 -0
  302. package/plugin/README.md +137 -0
  303. package/plugin/dist/adapter.d.ts +35 -0
  304. package/plugin/dist/adapter.js +346 -0
  305. package/plugin/dist/adapter.js.map +1 -0
  306. package/plugin/dist/build-state.d.ts +10 -0
  307. package/plugin/dist/build-state.js +26 -0
  308. package/plugin/dist/build-state.js.map +1 -0
  309. package/plugin/dist/fallback-shim.js +194 -0
  310. package/plugin/dist/index.d.ts +56 -0
  311. package/plugin/dist/index.js +396 -0
  312. package/plugin/dist/index.js.map +1 -0
  313. package/plugin/dist/manifest.d.ts +76 -0
  314. package/plugin/dist/manifest.js +367 -0
  315. package/plugin/dist/manifest.js.map +1 -0
  316. package/plugin/dist/media.d.ts +36 -0
  317. package/plugin/dist/media.js +153 -0
  318. package/plugin/dist/media.js.map +1 -0
  319. package/plugin/dist/parse-svelte.d.ts +35 -0
  320. package/plugin/dist/parse-svelte.js +120 -0
  321. package/plugin/dist/parse-svelte.js.map +1 -0
  322. package/plugin/dist/route-tree.d.ts +27 -0
  323. package/plugin/dist/route-tree.js +69 -0
  324. package/plugin/dist/route-tree.js.map +1 -0
  325. package/plugin/dist/transforms.d.ts +42 -0
  326. package/plugin/dist/transforms.js +95 -0
  327. package/plugin/dist/transforms.js.map +1 -0
@@ -0,0 +1,367 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { dirname, join, resolve, sep } from 'node:path';
3
+ import { parseAstAsync } from 'vite';
4
+ import { parseSvelteFile } from './parse-svelte.js';
5
+ import { ancestorRouteIds, discoverRoutes, extractRouteParams } from './route-tree.js';
6
+ /**
7
+ * Default page-metadata paths surfaced to the editor when a route has no
8
+ * explicit schema. Always live under the `metadata` branch.
9
+ */
10
+ const DEFAULT_PAGE_METADATA_PATHS = [
11
+ 'metadata.title',
12
+ 'metadata.description',
13
+ 'metadata.canonical',
14
+ 'metadata.robots'
15
+ ];
16
+ const tryStatFile = (path) => {
17
+ try {
18
+ return existsSync(path) && statSync(path).isFile();
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ };
24
+ /**
25
+ * Parse a `page.cms.ts` file and return whether its default export declares
26
+ * `creatable: true`. Robust against `satisfies`/`as` type assertions and the
27
+ * `definePage(...)` wrapper form. Returns `false` on parse failure or when
28
+ * the export is shaped in a way we don't recognize — the static-adapter
29
+ * post-pass treats `false` as "not in the manifest", which is the safe
30
+ * default.
31
+ */
32
+ const parsePageCmsCreatable = async (filePath) => {
33
+ let source;
34
+ try {
35
+ source = readFileSync(filePath, 'utf-8');
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ let program;
41
+ try {
42
+ program = (await parseAstAsync(source, { lang: 'ts' }));
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ const defaultExport = program.body.find((n) => n.type === 'ExportDefaultDeclaration');
48
+ if (!defaultExport)
49
+ return false;
50
+ let expr = defaultExport.declaration;
51
+ for (let i = 0; i < 8 && expr; i++) {
52
+ if (expr.type === 'TSSatisfiesExpression' ||
53
+ expr.type === 'TSAsExpression' ||
54
+ expr.type === 'TSTypeAssertion' ||
55
+ expr.type === 'ParenthesizedExpression') {
56
+ expr = expr.expression;
57
+ continue;
58
+ }
59
+ if (expr.type === 'CallExpression' && expr.arguments && expr.arguments.length > 0) {
60
+ expr = expr.arguments[0];
61
+ continue;
62
+ }
63
+ break;
64
+ }
65
+ if (!expr || expr.type !== 'ObjectExpression' || !expr.properties)
66
+ return false;
67
+ for (const prop of expr.properties) {
68
+ if (prop.type !== 'Property')
69
+ continue;
70
+ const k = prop.key;
71
+ const isCreatableKey = (k?.type === 'Identifier' && k.name === 'creatable') ||
72
+ (k?.type === 'Literal' && k.value === 'creatable');
73
+ if (!isCreatableKey)
74
+ continue;
75
+ if (prop.value?.type === 'Literal' && prop.value.value === true)
76
+ return true;
77
+ return false;
78
+ }
79
+ return false;
80
+ };
81
+ /**
82
+ * Synchronous resolver for `$lib/...` and relative specifiers — the in-tree
83
+ * paths the plugin handles without any bundler context. Returns `null` for
84
+ * bare specifiers; callers fall through to the external resolver.
85
+ */
86
+ const resolveLocal = (source, fromFile, libDir) => {
87
+ let base;
88
+ if (source.startsWith('$lib/'))
89
+ base = join(libDir, source.slice(5));
90
+ else if (source === '$lib')
91
+ base = libDir;
92
+ else if (source.startsWith('./') || source.startsWith('../'))
93
+ base = resolve(dirname(fromFile), source);
94
+ else
95
+ return null;
96
+ const candidates = [
97
+ base,
98
+ base.replace(/\.js$/, '.ts'),
99
+ base + '.svelte',
100
+ base + '.ts',
101
+ base + '.js',
102
+ join(base, 'index.ts'),
103
+ join(base, 'index.js'),
104
+ join(base, 'index.svelte')
105
+ ];
106
+ for (const c of candidates) {
107
+ if (tryStatFile(c))
108
+ return c;
109
+ }
110
+ return null;
111
+ };
112
+ const isCmsBarrelPath = (libDir, path) => {
113
+ const barrel = join(libDir, 'components', 'cms');
114
+ return path === join(barrel, 'index.ts') || path === join(barrel, 'index.js') || path === barrel;
115
+ };
116
+ const isCmsComponentFile = (libDir, path) => {
117
+ const dir = join(libDir, 'components', 'cms');
118
+ const rel = path.slice(dir.length + 1);
119
+ // Any .svelte file directly under <libDir>/components/cms/ — no allowlist of names.
120
+ return rel.length > 0 && !rel.includes(sep) && rel.endsWith('.svelte');
121
+ };
122
+ const isInVelacmsPackage = (path, roots) => {
123
+ for (const root of roots) {
124
+ const prefix = root.endsWith(sep) ? root : root + sep;
125
+ if (path === root || path.startsWith(prefix))
126
+ return true;
127
+ }
128
+ return false;
129
+ };
130
+ const matchTraverse = (source, patterns) => {
131
+ for (const pattern of patterns) {
132
+ if (typeof pattern === 'string') {
133
+ if (source === pattern || source.startsWith(pattern + '/'))
134
+ return true;
135
+ }
136
+ else if (pattern.test(source)) {
137
+ return true;
138
+ }
139
+ }
140
+ return false;
141
+ };
142
+ /**
143
+ * Try local resolution first, then fall back to the external resolver if the
144
+ * source matches a `traverse` pattern. Returns `null` when neither succeeds.
145
+ */
146
+ const resolveOrExternal = async (source, fromFile, libDir, resolveExternal, traversePatterns) => {
147
+ const local = resolveLocal(source, fromFile, libDir);
148
+ if (local)
149
+ return local;
150
+ if (!resolveExternal)
151
+ return null;
152
+ if (!matchTraverse(source, traversePatterns))
153
+ return null;
154
+ return resolveExternal(source, fromFile);
155
+ };
156
+ /**
157
+ * Walk one entrypoint's static import graph (only `.svelte` files), collecting
158
+ * field names referenced by CMS component usages plus any `routeId=` literals
159
+ * that `<CmsEntries>`-shaped components carry. Classification iterates three
160
+ * rule sets per import: in-tree barrel/file, velacms package, then
161
+ * user-supplied spec map.
162
+ */
163
+ const collectFieldsForEntry = async (entry, options) => {
164
+ const { libDir, velacmsRoots, specByResolvedPath, specBySource, traversePatterns, resolveExternal, cache, allVisited } = options;
165
+ const visited = new Set();
166
+ const fields = [];
167
+ const entriesRouteIds = [];
168
+ const classify = (spec, bindings, cmsLocals) => {
169
+ if ('default' in spec && spec.default) {
170
+ for (const b of bindings) {
171
+ if (b.imported === 'default')
172
+ cmsLocals.add(b.local);
173
+ }
174
+ }
175
+ else if ('names' in spec) {
176
+ const set = new Set(spec.names);
177
+ for (const b of bindings) {
178
+ if (b.imported !== 'default' && set.has(b.imported))
179
+ cmsLocals.add(b.local);
180
+ }
181
+ }
182
+ };
183
+ const walk = async (filePath) => {
184
+ if (visited.has(filePath))
185
+ return;
186
+ visited.add(filePath);
187
+ allVisited.add(filePath);
188
+ let parsed = cache.get(filePath);
189
+ if (!parsed) {
190
+ parsed = parseSvelteFile(filePath);
191
+ cache.set(filePath, parsed);
192
+ }
193
+ const resolvedByImport = new Map();
194
+ for (let i = 0; i < parsed.imports.length; i++) {
195
+ const imp = parsed.imports[i];
196
+ resolvedByImport.set(i, await resolveOrExternal(imp.source, filePath, libDir, resolveExternal, traversePatterns));
197
+ }
198
+ const cmsLocals = new Set();
199
+ for (let i = 0; i < parsed.imports.length; i++) {
200
+ const imp = parsed.imports[i];
201
+ const resolved = resolvedByImport.get(i) ?? null;
202
+ // Rule 1 + 2: in-tree barrel & files under <libDir>/components/cms/.
203
+ if (resolved && isCmsBarrelPath(libDir, resolved)) {
204
+ for (const b of imp.bindings) {
205
+ if (b.imported !== 'default')
206
+ cmsLocals.add(b.local);
207
+ }
208
+ continue;
209
+ }
210
+ if (resolved && isCmsComponentFile(libDir, resolved)) {
211
+ for (const b of imp.bindings) {
212
+ if (b.imported === 'default')
213
+ cmsLocals.add(b.local);
214
+ }
215
+ continue;
216
+ }
217
+ // Rule 3: any import resolving inside the velacms package itself.
218
+ if (resolved && velacmsRoots.length > 0 && isInVelacmsPackage(resolved, velacmsRoots)) {
219
+ for (const b of imp.bindings) {
220
+ if (b.imported === 'default') {
221
+ if (resolved.endsWith('.svelte'))
222
+ cmsLocals.add(b.local);
223
+ }
224
+ else {
225
+ cmsLocals.add(b.local);
226
+ }
227
+ }
228
+ continue;
229
+ }
230
+ // Rule 4: user-supplied spec — match by resolved path first, then raw source.
231
+ let spec = resolved ? specByResolvedPath.get(resolved) : undefined;
232
+ if (!spec)
233
+ spec = specBySource.get(imp.source);
234
+ if (spec)
235
+ classify(spec, imp.bindings, cmsLocals);
236
+ }
237
+ for (const usage of parsed.componentUsages) {
238
+ if (!cmsLocals.has(usage.componentName))
239
+ continue;
240
+ if (usage.routeIdAttr)
241
+ entriesRouteIds.push(usage.routeIdAttr);
242
+ if (usage.hasValueAttr || !usage.fieldName)
243
+ continue;
244
+ fields.push(usage.fieldName);
245
+ }
246
+ for (let i = 0; i < parsed.imports.length; i++) {
247
+ const resolved = resolvedByImport.get(i) ?? null;
248
+ if (resolved && resolved.endsWith('.svelte'))
249
+ await walk(resolved);
250
+ }
251
+ };
252
+ await walk(entry);
253
+ return {
254
+ fields: [...new Set(fields)],
255
+ entriesRouteIds: [...new Set(entriesRouteIds)]
256
+ };
257
+ };
258
+ const buildScopeChain = async (leaf, byRouteId, collectOptions) => {
259
+ const scopes = [];
260
+ const entriesRouteIds = [];
261
+ for (const dir of ancestorRouteIds(leaf.routeId)) {
262
+ const dirNode = byRouteId.get(dir);
263
+ if (!dirNode?.layoutPath)
264
+ continue;
265
+ const collected = await collectFieldsForEntry(dirNode.layoutPath, collectOptions);
266
+ entriesRouteIds.push(...collected.entriesRouteIds);
267
+ scopes.push({
268
+ scopeId: 'layout:' + dir,
269
+ kind: 'layout',
270
+ routeId: dir,
271
+ ownedParams: extractRouteParams(dir),
272
+ fields: collected.fields
273
+ });
274
+ }
275
+ const pageCollected = await collectFieldsForEntry(leaf.pagePath, collectOptions);
276
+ entriesRouteIds.push(...pageCollected.entriesRouteIds);
277
+ const fieldsWithDefaults = Array.from(new Set([...pageCollected.fields, ...DEFAULT_PAGE_METADATA_PATHS]));
278
+ scopes.push({
279
+ scopeId: 'page:' + leaf.routeId,
280
+ kind: 'page',
281
+ routeId: leaf.routeId,
282
+ ownedParams: extractRouteParams(leaf.routeId),
283
+ fields: fieldsWithDefaults
284
+ });
285
+ const seen = new Set();
286
+ for (const scope of scopes) {
287
+ const owned = scope.ownedParams.filter((p) => !seen.has(p));
288
+ scope.ownedParams = owned;
289
+ for (const p of owned)
290
+ seen.add(p);
291
+ }
292
+ return { scopes, entriesRouteIds: [...new Set(entriesRouteIds)] };
293
+ };
294
+ export const buildManifest = async (options) => {
295
+ const { routesDir, libDir, velacmsRoots = [], components = [], traverse = [], resolveExternal } = options;
296
+ const nodes = discoverRoutes(routesDir);
297
+ const byRouteId = new Map(nodes.map((n) => [n.routeId, n]));
298
+ const cache = new Map();
299
+ const visitedFiles = new Set();
300
+ const scopeByEntryPath = new Map();
301
+ const routeIdByScriptPath = new Map();
302
+ // Auto-register every `components[].source` for traversal so users don't
303
+ // have to repeat themselves.
304
+ const traversePatterns = [...traverse, ...components.map((c) => c.source)];
305
+ // Pre-resolve user spec sources once. Build two lookup maps: by canonical
306
+ // resolved path (preferred) and by raw source string (fallback).
307
+ const specByResolvedPath = new Map();
308
+ const specBySource = new Map();
309
+ for (const spec of components) {
310
+ specBySource.set(spec.source, spec);
311
+ if (resolveExternal) {
312
+ const resolved = await resolveExternal(spec.source, undefined);
313
+ if (resolved)
314
+ specByResolvedPath.set(resolved, spec);
315
+ }
316
+ }
317
+ const collectOptions = {
318
+ libDir,
319
+ velacmsRoots,
320
+ specByResolvedPath,
321
+ specBySource,
322
+ traversePatterns,
323
+ resolveExternal,
324
+ cache,
325
+ allVisited: visitedFiles
326
+ };
327
+ const routes = {};
328
+ const pageCmsModules = [];
329
+ for (const node of nodes) {
330
+ if (!node.pagePath)
331
+ continue;
332
+ const { scopes, entriesRouteIds } = await buildScopeChain(node, byRouteId, collectOptions);
333
+ routes[node.routeId] = { scopes, entriesRouteIds };
334
+ // Index every entry path encountered while walking this leaf's chain so
335
+ // the transform hook can look up scope info by file path. Layouts may be
336
+ // indexed multiple times via different leaves — same scope, same entry,
337
+ // so the writes are idempotent.
338
+ for (const scope of scopes) {
339
+ const entryNode = byRouteId.get(scope.routeId);
340
+ const entryPath = scope.kind === 'layout' ? entryNode?.layoutPath : entryNode?.pagePath;
341
+ if (!entryPath)
342
+ continue;
343
+ scopeByEntryPath.set(entryPath, {
344
+ scopeId: scope.scopeId,
345
+ kind: scope.kind,
346
+ routeId: scope.routeId,
347
+ ownedParams: scope.ownedParams
348
+ });
349
+ }
350
+ if (node.pageScriptPath)
351
+ routeIdByScriptPath.set(node.pageScriptPath, node.routeId);
352
+ if (node.pageServerScriptPath)
353
+ routeIdByScriptPath.set(node.pageServerScriptPath, node.routeId);
354
+ if (node.pageCmsPath) {
355
+ const creatable = await parsePageCmsCreatable(node.pageCmsPath);
356
+ pageCmsModules.push({ routeId: node.routeId, path: node.pageCmsPath, creatable });
357
+ }
358
+ }
359
+ return {
360
+ manifest: { version: 1, routes },
361
+ visitedFiles: [...visitedFiles],
362
+ scopeByEntryPath,
363
+ routeIdByScriptPath,
364
+ pageCmsModules
365
+ };
366
+ };
367
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Backend serves uploaded files at the endpoint origin (`/uploads/<filename>`)
3
+ * via SvelteKit's static handler — confirmed in `cms.velastack/_store.ts`. The
4
+ * project-scoped CMS endpoint (`/v1/projects/PID/cms`) only governs the API,
5
+ * not the upload path. So `uploadsBase` is the bare origin + `/uploads`.
6
+ */
7
+ export declare const deriveUploadsBase: (endpoint: string) => string;
8
+ /**
9
+ * Walk an arbitrary deserialized JSON value and collect every media filename
10
+ * referenced as a string — either as a relative `/uploads/<file>` path or an
11
+ * absolute `<uploadsBase>/<file>` URL. Cycle-safe via a WeakSet.
12
+ */
13
+ export declare const extractMediaUrls: (value: unknown, uploadsBase: string) => Set<string>;
14
+ /**
15
+ * Deep-clone `value` and replace every recognized media URL string with
16
+ * `${mediaPrefix}/<filename>`. Returns the cloned tree; the input is left
17
+ * untouched. Cycle-safe (cycles are flattened to a fresh object — payloads
18
+ * passed through `devalue` won't have cycles, but defensive).
19
+ */
20
+ export declare const rewriteMediaUrls: <T>(value: T, uploadsBase: string, mediaPrefix: string) => T;
21
+ export type DownloadResult = {
22
+ written: number;
23
+ skipped: number;
24
+ failed: Array<{
25
+ filename: string;
26
+ reason: string;
27
+ }>;
28
+ };
29
+ /**
30
+ * Download every filename in `filenames` from `${uploadsBase}/<filename>` into
31
+ * `destDir`. Files already on disk are skipped (no etag check — backend
32
+ * filenames are unique slugs, content is stable per name). Failures are
33
+ * logged and collected, never thrown — one missing image shouldn't break the
34
+ * build.
35
+ */
36
+ export declare const downloadMedia: (filenames: Iterable<string>, uploadsBase: string, destDir: string) => Promise<DownloadResult>;
@@ -0,0 +1,153 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ /**
4
+ * Backend serves uploaded files at the endpoint origin (`/uploads/<filename>`)
5
+ * via SvelteKit's static handler — confirmed in `cms.velastack/_store.ts`. The
6
+ * project-scoped CMS endpoint (`/v1/projects/PID/cms`) only governs the API,
7
+ * not the upload path. So `uploadsBase` is the bare origin + `/uploads`.
8
+ */
9
+ export const deriveUploadsBase = (endpoint) => {
10
+ const url = new URL(endpoint);
11
+ return `${url.origin}/uploads`;
12
+ };
13
+ const RELATIVE_UPLOADS_RE = /^\/uploads\/([^/?#]+)$/;
14
+ /**
15
+ * Walk an arbitrary deserialized JSON value and collect every media filename
16
+ * referenced as a string — either as a relative `/uploads/<file>` path or an
17
+ * absolute `<uploadsBase>/<file>` URL. Cycle-safe via a WeakSet.
18
+ */
19
+ export const extractMediaUrls = (value, uploadsBase) => {
20
+ const out = new Set();
21
+ const seen = new WeakSet();
22
+ const prefix = `${uploadsBase}/`;
23
+ const walk = (v) => {
24
+ if (typeof v === 'string') {
25
+ const m = RELATIVE_UPLOADS_RE.exec(v);
26
+ if (m) {
27
+ out.add(m[1]);
28
+ return;
29
+ }
30
+ if (v.startsWith(prefix)) {
31
+ const rest = v.slice(prefix.length).split(/[?#]/)[0];
32
+ if (rest && !rest.includes('/'))
33
+ out.add(rest);
34
+ }
35
+ return;
36
+ }
37
+ if (!v || typeof v !== 'object')
38
+ return;
39
+ if (seen.has(v))
40
+ return;
41
+ seen.add(v);
42
+ if (Array.isArray(v)) {
43
+ for (const x of v)
44
+ walk(x);
45
+ return;
46
+ }
47
+ for (const k of Object.keys(v)) {
48
+ walk(v[k]);
49
+ }
50
+ };
51
+ walk(value);
52
+ return out;
53
+ };
54
+ /**
55
+ * Deep-clone `value` and replace every recognized media URL string with
56
+ * `${mediaPrefix}/<filename>`. Returns the cloned tree; the input is left
57
+ * untouched. Cycle-safe (cycles are flattened to a fresh object — payloads
58
+ * passed through `devalue` won't have cycles, but defensive).
59
+ */
60
+ export const rewriteMediaUrls = (value, uploadsBase, mediaPrefix) => {
61
+ const seen = new WeakMap();
62
+ const prefix = `${uploadsBase}/`;
63
+ const normalizedMediaPrefix = mediaPrefix.replace(/\/$/, '');
64
+ const walk = (v) => {
65
+ if (typeof v === 'string') {
66
+ const m = RELATIVE_UPLOADS_RE.exec(v);
67
+ if (m)
68
+ return `${normalizedMediaPrefix}/${m[1]}`;
69
+ if (v.startsWith(prefix)) {
70
+ const rest = v.slice(prefix.length).split(/[?#]/)[0];
71
+ if (rest && !rest.includes('/'))
72
+ return `${normalizedMediaPrefix}/${rest}`;
73
+ }
74
+ return v;
75
+ }
76
+ if (!v || typeof v !== 'object')
77
+ return v;
78
+ const cached = seen.get(v);
79
+ if (cached !== undefined)
80
+ return cached;
81
+ if (Array.isArray(v)) {
82
+ const arr = [];
83
+ seen.set(v, arr);
84
+ for (const x of v)
85
+ arr.push(walk(x));
86
+ return arr;
87
+ }
88
+ const obj = {};
89
+ seen.set(v, obj);
90
+ for (const k of Object.keys(v)) {
91
+ obj[k] = walk(v[k]);
92
+ }
93
+ return obj;
94
+ };
95
+ return walk(value);
96
+ };
97
+ const fileExists = (p) => {
98
+ try {
99
+ fs.accessSync(p, fs.constants.F_OK);
100
+ return true;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ };
106
+ const CONCURRENCY = 8;
107
+ /**
108
+ * Download every filename in `filenames` from `${uploadsBase}/<filename>` into
109
+ * `destDir`. Files already on disk are skipped (no etag check — backend
110
+ * filenames are unique slugs, content is stable per name). Failures are
111
+ * logged and collected, never thrown — one missing image shouldn't break the
112
+ * build.
113
+ */
114
+ export const downloadMedia = async (filenames, uploadsBase, destDir) => {
115
+ const list = [...new Set(filenames)];
116
+ const result = { written: 0, skipped: 0, failed: [] };
117
+ if (list.length === 0)
118
+ return result;
119
+ fs.mkdirSync(destDir, { recursive: true });
120
+ let cursor = 0;
121
+ const workers = [];
122
+ const next = async () => {
123
+ while (cursor < list.length) {
124
+ const filename = list[cursor++];
125
+ const target = path.join(destDir, filename);
126
+ if (fileExists(target)) {
127
+ result.skipped++;
128
+ continue;
129
+ }
130
+ try {
131
+ const res = await fetch(`${uploadsBase}/${filename}`);
132
+ if (!res.ok) {
133
+ result.failed.push({ filename, reason: `HTTP ${res.status}` });
134
+ continue;
135
+ }
136
+ const buf = Buffer.from(await res.arrayBuffer());
137
+ fs.writeFileSync(target, buf);
138
+ result.written++;
139
+ }
140
+ catch (e) {
141
+ result.failed.push({
142
+ filename,
143
+ reason: e instanceof Error ? e.message : String(e)
144
+ });
145
+ }
146
+ }
147
+ };
148
+ for (let i = 0; i < Math.min(CONCURRENCY, list.length); i++)
149
+ workers.push(next());
150
+ await Promise.all(workers);
151
+ return result;
152
+ };
153
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type ParsedImport = {
2
+ source: string;
3
+ bindings: Array<{
4
+ imported: string;
5
+ local: string;
6
+ }>;
7
+ };
8
+ export type ComponentUsage = {
9
+ /** Local binding name as used in the template, e.g. `CmsText` or `Title`. */
10
+ componentName: string;
11
+ /** Static value of the `name=` prop, or `null` if absent / non-static. */
12
+ fieldName: string | null;
13
+ /** Whether a `value=` prop was present (marks per-item overrides). */
14
+ hasValueAttr: boolean;
15
+ /** Static value of the `routeId=` prop, or `null` if absent / non-static. */
16
+ routeIdAttr: string | null;
17
+ };
18
+ export type InstanceScriptRange = {
19
+ /** Source offset where the inner script content begins (just after `<script ...>`). */
20
+ contentStart: number;
21
+ /** Source offset where the inner script content ends (just before `</script>`). */
22
+ contentEnd: number;
23
+ };
24
+ export type ParsedSvelte = {
25
+ /** Static imports declared in `<script>` / `<script context="module">`. */
26
+ imports: ParsedImport[];
27
+ /** Every `<Component>` usage in the template (CMS or otherwise). */
28
+ componentUsages: ComponentUsage[];
29
+ /** Position of the instance `<script>` block, or `null` if absent. */
30
+ instanceScript: InstanceScriptRange | null;
31
+ /** Source length, so callers don't have to keep the raw text around. */
32
+ sourceLength: number;
33
+ };
34
+ export declare const parseSvelteSource: (code: string, filename?: string) => ParsedSvelte;
35
+ export declare const parseSvelteFile: (filePath: string) => ParsedSvelte;