@maizzle/framework 6.0.0-rc.1 → 6.0.0-rc.10

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 (341) hide show
  1. package/bin/maizzle.mjs +1 -1
  2. package/dist/_virtual/_rolldown/runtime.mjs +32 -0
  3. package/dist/build.mjs +6 -3
  4. package/dist/build.mjs.map +1 -1
  5. package/dist/components/Body.vue +111 -0
  6. package/dist/components/Button.vue +68 -14
  7. package/dist/components/CodeBlock.vue +68 -0
  8. package/dist/components/CodeInline.vue +49 -0
  9. package/dist/components/Column.vue +86 -0
  10. package/dist/components/Container.vue +48 -0
  11. package/dist/components/Divider.vue +28 -0
  12. package/dist/components/Head.vue +30 -0
  13. package/dist/components/Heading.vue +28 -0
  14. package/dist/components/Html.vue +104 -0
  15. package/dist/components/Image.vue +70 -0
  16. package/dist/components/Layout.vue +93 -0
  17. package/dist/components/Link.vue +26 -0
  18. package/dist/components/Markdown.vue +89 -0
  19. package/dist/components/Outlook.vue +36 -0
  20. package/dist/components/Overlap.vue +80 -0
  21. package/dist/components/Preheader.vue +20 -0
  22. package/dist/components/Row.vue +91 -0
  23. package/dist/components/Section.vue +83 -0
  24. package/dist/components/Spacer.vue +50 -7
  25. package/dist/components/Text.vue +29 -0
  26. package/dist/components/Vml.vue +165 -13
  27. package/dist/composables/renderContext.d.mts +5 -0
  28. package/dist/composables/renderContext.d.mts.map +1 -1
  29. package/dist/composables/renderContext.mjs.map +1 -1
  30. package/dist/composables/usePreviewText.d.mts +24 -0
  31. package/dist/composables/usePreviewText.d.mts.map +1 -0
  32. package/dist/composables/usePreviewText.mjs +29 -0
  33. package/dist/composables/usePreviewText.mjs.map +1 -0
  34. package/dist/config/index.mjs +7 -0
  35. package/dist/config/index.mjs.map +1 -1
  36. package/dist/index.d.mts +4 -2
  37. package/dist/index.mjs +3 -1
  38. package/dist/node_modules/picomatch/index.mjs +13 -0
  39. package/dist/node_modules/picomatch/index.mjs.map +1 -0
  40. package/dist/node_modules/picomatch/lib/constants.mjs +174 -0
  41. package/dist/node_modules/picomatch/lib/constants.mjs.map +1 -0
  42. package/dist/node_modules/picomatch/lib/parse.mjs +1067 -0
  43. package/dist/node_modules/picomatch/lib/parse.mjs.map +1 -0
  44. package/dist/node_modules/picomatch/lib/picomatch.mjs +304 -0
  45. package/dist/node_modules/picomatch/lib/picomatch.mjs.map +1 -0
  46. package/dist/node_modules/picomatch/lib/scan.mjs +296 -0
  47. package/dist/node_modules/picomatch/lib/scan.mjs.map +1 -0
  48. package/dist/node_modules/picomatch/lib/utils.mjs +53 -0
  49. package/dist/node_modules/picomatch/lib/utils.mjs.map +1 -0
  50. package/dist/plugin.d.mts.map +1 -1
  51. package/dist/plugin.mjs +24 -7
  52. package/dist/plugin.mjs.map +1 -1
  53. package/dist/plugins/postcss/tailwindCleanup.d.mts.map +1 -1
  54. package/dist/plugins/postcss/tailwindCleanup.mjs +44 -13
  55. package/dist/plugins/postcss/tailwindCleanup.mjs.map +1 -1
  56. package/dist/render/createRenderer.d.mts +8 -3
  57. package/dist/render/createRenderer.d.mts.map +1 -1
  58. package/dist/render/createRenderer.mjs +146 -10
  59. package/dist/render/createRenderer.mjs.map +1 -1
  60. package/dist/render/index.mjs +6 -3
  61. package/dist/render/index.mjs.map +1 -1
  62. package/dist/serve.d.mts.map +1 -1
  63. package/dist/serve.mjs +157 -63
  64. package/dist/serve.mjs.map +1 -1
  65. package/dist/server/compatibility.d.mts +1 -2
  66. package/dist/server/compatibility.d.mts.map +1 -1
  67. package/dist/server/compatibility.mjs +30 -16
  68. package/dist/server/compatibility.mjs.map +1 -1
  69. package/dist/server/email.d.mts +17 -0
  70. package/dist/server/email.d.mts.map +1 -0
  71. package/dist/server/email.mjs +41 -0
  72. package/dist/server/email.mjs.map +1 -0
  73. package/dist/server/linter.d.mts +1 -2
  74. package/dist/server/linter.d.mts.map +1 -1
  75. package/dist/server/linter.mjs +60 -71
  76. package/dist/server/linter.mjs.map +1 -1
  77. package/dist/server/ui/App.vue +205 -69
  78. package/dist/server/ui/components/ui/checkbox/Checkbox.vue +35 -0
  79. package/dist/server/ui/components/ui/checkbox/index.ts +1 -0
  80. package/dist/server/ui/components/ui/command/CommandDialog.vue +1 -1
  81. package/dist/server/ui/components/ui/command/CommandInput.vue +19 -1
  82. package/dist/server/ui/components/ui/command/CommandItem.vue +1 -1
  83. package/dist/server/ui/components/ui/command/CommandList.vue +1 -1
  84. package/dist/server/ui/components/ui/command/CommandShortcut.vue +1 -1
  85. package/dist/server/ui/components/ui/dialog/DialogOverlay.vue +9 -1
  86. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  87. package/dist/server/ui/components/ui/scroll-area/ScrollBar.vue +1 -1
  88. package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
  89. package/dist/server/ui/components/ui/sheet/SheetOverlay.vue +9 -1
  90. package/dist/server/ui/components/ui/sidebar/Sidebar.vue +8 -1
  91. package/dist/server/ui/components/ui/sidebar/SidebarProvider.vue +1 -1
  92. package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +5 -4
  93. package/dist/server/ui/components/ui/tags-input/TagsInput.vue +26 -0
  94. package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +17 -0
  95. package/dist/server/ui/components/ui/tags-input/TagsInputItem.vue +19 -0
  96. package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +22 -0
  97. package/dist/server/ui/components/ui/tags-input/TagsInputItemText.vue +17 -0
  98. package/dist/server/ui/components/ui/tags-input/index.ts +5 -0
  99. package/dist/server/ui/components/ui/toggle/index.ts +3 -3
  100. package/dist/server/ui/components/ui/toggle-group/ToggleGroup.vue +1 -1
  101. package/dist/server/ui/components/ui/toggle-group/ToggleGroupItem.vue +2 -2
  102. package/dist/server/ui/main.css +20 -20
  103. package/dist/server/ui/pages/Home.vue +12 -5
  104. package/dist/server/ui/pages/Preview.vue +506 -216
  105. package/dist/transformers/entities.d.mts.map +1 -1
  106. package/dist/transformers/entities.mjs +3 -0
  107. package/dist/transformers/entities.mjs.map +1 -1
  108. package/dist/transformers/filters/defaults.d.mts +6 -0
  109. package/dist/transformers/filters/defaults.d.mts.map +1 -0
  110. package/dist/transformers/filters/defaults.mjs +78 -0
  111. package/dist/transformers/filters/defaults.mjs.map +1 -0
  112. package/dist/transformers/filters/index.d.mts +22 -0
  113. package/dist/transformers/filters/index.d.mts.map +1 -0
  114. package/dist/transformers/filters/index.mjs +67 -0
  115. package/dist/transformers/filters/index.mjs.map +1 -0
  116. package/dist/transformers/index.d.mts +11 -9
  117. package/dist/transformers/index.d.mts.map +1 -1
  118. package/dist/transformers/index.mjs +19 -11
  119. package/dist/transformers/index.mjs.map +1 -1
  120. package/dist/transformers/inlineCSS.d.mts +1 -14
  121. package/dist/transformers/inlineCSS.d.mts.map +1 -1
  122. package/dist/transformers/inlineCSS.mjs +25 -34
  123. package/dist/transformers/inlineCSS.mjs.map +1 -1
  124. package/dist/transformers/purgeCSS.d.mts.map +1 -1
  125. package/dist/transformers/purgeCSS.mjs +67 -1
  126. package/dist/transformers/purgeCSS.mjs.map +1 -1
  127. package/dist/transformers/sixHex.d.mts +16 -0
  128. package/dist/transformers/sixHex.d.mts.map +1 -0
  129. package/dist/transformers/sixHex.mjs +30 -0
  130. package/dist/transformers/sixHex.mjs.map +1 -0
  131. package/dist/transformers/tailwindcss.d.mts +6 -2
  132. package/dist/transformers/tailwindcss.d.mts.map +1 -1
  133. package/dist/transformers/tailwindcss.mjs +52 -28
  134. package/dist/transformers/tailwindcss.mjs.map +1 -1
  135. package/dist/types/config.d.mts +446 -21
  136. package/dist/types/config.d.mts.map +1 -1
  137. package/dist/types/index.d.mts +2 -2
  138. package/dist/utils/ast/serializer.d.mts +3 -2
  139. package/dist/utils/ast/serializer.d.mts.map +1 -1
  140. package/dist/utils/ast/serializer.mjs +24 -0
  141. package/dist/utils/ast/serializer.mjs.map +1 -1
  142. package/dist/utils/detect.d.mts +5 -0
  143. package/dist/utils/detect.d.mts.map +1 -0
  144. package/dist/utils/detect.mjs +11 -0
  145. package/dist/utils/detect.mjs.map +1 -0
  146. package/node_modules/@clack/core/CHANGELOG.md +87 -4
  147. package/node_modules/@clack/core/README.md +1 -1
  148. package/node_modules/@clack/core/dist/index.d.mts +186 -48
  149. package/node_modules/@clack/core/dist/index.mjs +10 -14
  150. package/node_modules/@clack/core/dist/index.mjs.map +1 -1
  151. package/node_modules/@clack/core/package.json +7 -9
  152. package/node_modules/@clack/prompts/CHANGELOG.md +171 -7
  153. package/node_modules/@clack/prompts/README.md +66 -3
  154. package/node_modules/@clack/prompts/dist/index.d.mts +302 -76
  155. package/node_modules/@clack/prompts/dist/index.mjs +134 -84
  156. package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
  157. package/node_modules/@clack/prompts/package.json +14 -10
  158. package/node_modules/citty/LICENSE +0 -15
  159. package/node_modules/citty/README.md +166 -69
  160. package/node_modules/citty/dist/index.d.mts +88 -56
  161. package/node_modules/citty/dist/index.mjs +399 -437
  162. package/node_modules/citty/package.json +28 -35
  163. package/node_modules/giget/README.md +59 -11
  164. package/node_modules/giget/dist/THIRD-PARTY-LICENSES.md +205 -0
  165. package/node_modules/giget/dist/_chunks/giget.mjs +508 -0
  166. package/node_modules/giget/dist/_chunks/libs/citty.mjs +269 -0
  167. package/node_modules/giget/dist/_chunks/libs/nypm.d.mts +1 -0
  168. package/node_modules/giget/dist/_chunks/libs/nypm.mjs +669 -0
  169. package/node_modules/giget/dist/_chunks/libs/tar.mjs +2931 -0
  170. package/node_modules/giget/dist/_chunks/rolldown-runtime.mjs +14 -0
  171. package/node_modules/giget/dist/cli.d.mts +1 -0
  172. package/node_modules/giget/dist/cli.mjs +89 -111
  173. package/node_modules/giget/dist/index.d.mts +46 -35
  174. package/node_modules/giget/dist/index.mjs +2 -22
  175. package/node_modules/giget/package.json +32 -45
  176. package/node_modules/maizzle/README.md +140 -0
  177. package/node_modules/maizzle/bin/maizzle.mjs +5 -0
  178. package/node_modules/maizzle/dist/commands/new.d.mts +7 -0
  179. package/node_modules/maizzle/dist/commands/new.mjs +278 -0
  180. package/node_modules/{@maizzle/cli → maizzle}/dist/index.d.mts +1 -1
  181. package/node_modules/maizzle/dist/index.mjs +44 -0
  182. package/node_modules/{commander → maizzle/node_modules/commander}/Readme.md +94 -67
  183. package/node_modules/{commander → maizzle/node_modules/commander}/lib/argument.js +5 -4
  184. package/node_modules/{commander → maizzle/node_modules/commander}/lib/command.js +154 -39
  185. package/node_modules/{commander → maizzle/node_modules/commander}/lib/help.js +77 -39
  186. package/node_modules/{commander → maizzle/node_modules/commander}/lib/option.js +16 -3
  187. package/node_modules/{commander → maizzle/node_modules/commander}/package-support.json +4 -1
  188. package/node_modules/{commander → maizzle/node_modules/commander}/package.json +8 -8
  189. package/node_modules/{commander → maizzle/node_modules/commander}/typings/index.d.ts +71 -3
  190. package/node_modules/{@maizzle/cli → maizzle}/package.json +13 -11
  191. package/node_modules/tinyexec/README.md +49 -3
  192. package/node_modules/tinyexec/dist/main.d.mts +25 -14
  193. package/node_modules/tinyexec/dist/main.mjs +148 -100
  194. package/node_modules/tinyexec/package.json +9 -8
  195. package/package.json +9 -4
  196. package/dist/server/ui/components/ui/resizable/ResizableHandle.vue +0 -30
  197. package/dist/server/ui/components/ui/resizable/ResizablePanel.vue +0 -21
  198. package/dist/server/ui/components/ui/resizable/ResizablePanelGroup.vue +0 -25
  199. package/dist/server/ui/components/ui/resizable/index.ts +0 -3
  200. package/node_modules/@clack/core/dist/index.cjs +0 -15
  201. package/node_modules/@clack/core/dist/index.cjs.map +0 -1
  202. package/node_modules/@clack/core/dist/index.d.cts +0 -211
  203. package/node_modules/@clack/core/dist/index.d.ts +0 -211
  204. package/node_modules/@clack/prompts/dist/index.cjs +0 -87
  205. package/node_modules/@clack/prompts/dist/index.cjs.map +0 -1
  206. package/node_modules/@clack/prompts/dist/index.d.cts +0 -165
  207. package/node_modules/@clack/prompts/dist/index.d.ts +0 -165
  208. package/node_modules/@maizzle/cli/README.md +0 -58
  209. package/node_modules/@maizzle/cli/dist/index.mjs +0 -42
  210. package/node_modules/citty/dist/index.cjs +0 -475
  211. package/node_modules/citty/dist/index.d.cts +0 -80
  212. package/node_modules/citty/dist/index.d.ts +0 -80
  213. package/node_modules/consola/LICENSE +0 -47
  214. package/node_modules/consola/README.md +0 -352
  215. package/node_modules/consola/basic.d.ts +0 -1
  216. package/node_modules/consola/browser.d.ts +0 -1
  217. package/node_modules/consola/core.d.ts +0 -1
  218. package/node_modules/consola/dist/basic.cjs +0 -32
  219. package/node_modules/consola/dist/basic.d.cts +0 -23
  220. package/node_modules/consola/dist/basic.d.mts +0 -21
  221. package/node_modules/consola/dist/basic.d.ts +0 -23
  222. package/node_modules/consola/dist/basic.mjs +0 -24
  223. package/node_modules/consola/dist/browser.cjs +0 -84
  224. package/node_modules/consola/dist/browser.d.cts +0 -23
  225. package/node_modules/consola/dist/browser.d.mts +0 -21
  226. package/node_modules/consola/dist/browser.d.ts +0 -23
  227. package/node_modules/consola/dist/browser.mjs +0 -76
  228. package/node_modules/consola/dist/chunks/prompt.cjs +0 -288
  229. package/node_modules/consola/dist/chunks/prompt.mjs +0 -280
  230. package/node_modules/consola/dist/core.cjs +0 -517
  231. package/node_modules/consola/dist/core.d.cts +0 -459
  232. package/node_modules/consola/dist/core.d.mts +0 -459
  233. package/node_modules/consola/dist/core.d.ts +0 -459
  234. package/node_modules/consola/dist/core.mjs +0 -512
  235. package/node_modules/consola/dist/index.cjs +0 -663
  236. package/node_modules/consola/dist/index.d.cts +0 -24
  237. package/node_modules/consola/dist/index.d.mts +0 -22
  238. package/node_modules/consola/dist/index.d.ts +0 -24
  239. package/node_modules/consola/dist/index.mjs +0 -651
  240. package/node_modules/consola/dist/shared/consola.DCGIlDNP.cjs +0 -75
  241. package/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +0 -72
  242. package/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +0 -288
  243. package/node_modules/consola/dist/shared/consola.DwRq1yyg.cjs +0 -312
  244. package/node_modules/consola/dist/utils.cjs +0 -64
  245. package/node_modules/consola/dist/utils.d.cts +0 -286
  246. package/node_modules/consola/dist/utils.d.mts +0 -286
  247. package/node_modules/consola/dist/utils.d.ts +0 -286
  248. package/node_modules/consola/dist/utils.mjs +0 -54
  249. package/node_modules/consola/lib/index.cjs +0 -10
  250. package/node_modules/consola/package.json +0 -136
  251. package/node_modules/consola/utils.d.ts +0 -1
  252. package/node_modules/create-maizzle/README.md +0 -86
  253. package/node_modules/create-maizzle/bin/create-maizzle.mjs +0 -4
  254. package/node_modules/create-maizzle/node_modules/@clack/core/CHANGELOG.md +0 -340
  255. package/node_modules/create-maizzle/node_modules/@clack/core/LICENSE +0 -9
  256. package/node_modules/create-maizzle/node_modules/@clack/core/README.md +0 -22
  257. package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.d.mts +0 -349
  258. package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.mjs +0 -11
  259. package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.mjs.map +0 -1
  260. package/node_modules/create-maizzle/node_modules/@clack/core/package.json +0 -60
  261. package/node_modules/create-maizzle/node_modules/@clack/prompts/CHANGELOG.md +0 -576
  262. package/node_modules/create-maizzle/node_modules/@clack/prompts/LICENSE +0 -9
  263. package/node_modules/create-maizzle/node_modules/@clack/prompts/README.md +0 -270
  264. package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.d.mts +0 -391
  265. package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.mjs +0 -137
  266. package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.mjs.map +0 -1
  267. package/node_modules/create-maizzle/node_modules/@clack/prompts/package.json +0 -65
  268. package/node_modules/create-maizzle/package.json +0 -47
  269. package/node_modules/create-maizzle/src/index.js +0 -242
  270. package/node_modules/defu/LICENSE +0 -21
  271. package/node_modules/defu/README.md +0 -171
  272. package/node_modules/defu/dist/defu.cjs +0 -77
  273. package/node_modules/defu/dist/defu.d.cts +0 -31
  274. package/node_modules/defu/dist/defu.d.mts +0 -29
  275. package/node_modules/defu/dist/defu.d.ts +0 -31
  276. package/node_modules/defu/dist/defu.mjs +0 -69
  277. package/node_modules/defu/lib/defu.cjs +0 -10
  278. package/node_modules/defu/lib/defu.d.cts +0 -12
  279. package/node_modules/defu/package.json +0 -48
  280. package/node_modules/giget/dist/shared/giget.OCaTp9b-.mjs +0 -468
  281. package/node_modules/node-fetch-native/LICENSE +0 -114
  282. package/node_modules/node-fetch-native/README.md +0 -225
  283. package/node_modules/node-fetch-native/dist/chunks/multipart-parser.cjs +0 -2
  284. package/node_modules/node-fetch-native/dist/chunks/multipart-parser.mjs +0 -2
  285. package/node_modules/node-fetch-native/dist/index.cjs +0 -1
  286. package/node_modules/node-fetch-native/dist/index.mjs +0 -1
  287. package/node_modules/node-fetch-native/dist/native.cjs +0 -1
  288. package/node_modules/node-fetch-native/dist/native.mjs +0 -1
  289. package/node_modules/node-fetch-native/dist/node.cjs +0 -19
  290. package/node_modules/node-fetch-native/dist/node.mjs +0 -19
  291. package/node_modules/node-fetch-native/dist/polyfill.cjs +0 -1
  292. package/node_modules/node-fetch-native/dist/polyfill.mjs +0 -1
  293. package/node_modules/node-fetch-native/dist/proxy-stub.cjs +0 -1
  294. package/node_modules/node-fetch-native/dist/proxy-stub.mjs +0 -1
  295. package/node_modules/node-fetch-native/dist/proxy.cjs +0 -58
  296. package/node_modules/node-fetch-native/dist/shared/node-fetch-native.DfbY2q-x.mjs +0 -1
  297. package/node_modules/node-fetch-native/dist/shared/node-fetch-native.DhEqb06g.cjs +0 -1
  298. package/node_modules/node-fetch-native/index.d.ts +0 -1
  299. package/node_modules/node-fetch-native/lib/empty.cjs +0 -0
  300. package/node_modules/node-fetch-native/lib/empty.mjs +0 -0
  301. package/node_modules/node-fetch-native/lib/index.cjs +0 -11
  302. package/node_modules/node-fetch-native/lib/index.d.cts +0 -10
  303. package/node_modules/node-fetch-native/lib/index.d.mts +0 -10
  304. package/node_modules/node-fetch-native/lib/index.d.ts +0 -10
  305. package/node_modules/node-fetch-native/lib/native.cjs +0 -11
  306. package/node_modules/node-fetch-native/lib/polyfill.d.cts +0 -1
  307. package/node_modules/node-fetch-native/lib/polyfill.d.mts +0 -1
  308. package/node_modules/node-fetch-native/lib/polyfill.d.ts +0 -1
  309. package/node_modules/node-fetch-native/lib/proxy.d.ts +0 -32
  310. package/node_modules/node-fetch-native/node.d.ts +0 -1
  311. package/node_modules/node-fetch-native/package.json +0 -138
  312. package/node_modules/node-fetch-native/polyfill.d.ts +0 -1
  313. package/node_modules/node-fetch-native/proxy.d.ts +0 -1
  314. package/node_modules/nypm/node_modules/citty/LICENSE +0 -21
  315. package/node_modules/nypm/node_modules/citty/README.md +0 -231
  316. package/node_modules/nypm/node_modules/citty/dist/index.d.mts +0 -112
  317. package/node_modules/nypm/node_modules/citty/dist/index.mjs +0 -425
  318. package/node_modules/nypm/node_modules/citty/package.json +0 -42
  319. /package/node_modules/{nypm/node_modules/citty → citty}/dist/THIRD-PARTY-LICENSES.md +0 -0
  320. /package/node_modules/{nypm/node_modules/citty → citty}/dist/_chunks/libs/scule.mjs +0 -0
  321. /package/node_modules/{@maizzle/cli → maizzle}/LICENSE +0 -0
  322. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/component.d.mts +0 -0
  323. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/component.mjs +0 -0
  324. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/config.d.mts +0 -0
  325. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/config.mjs +0 -0
  326. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/layout.d.mts +0 -0
  327. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/layout.mjs +0 -0
  328. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/scaffold.d.mts +0 -0
  329. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/scaffold.mjs +0 -0
  330. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/component.vue +0 -0
  331. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/config.ts +0 -0
  332. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/layout.vue +0 -0
  333. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/template.vue +0 -0
  334. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/template.d.mts +0 -0
  335. /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/template.mjs +0 -0
  336. /package/node_modules/{commander → maizzle/node_modules/commander}/LICENSE +0 -0
  337. /package/node_modules/{commander → maizzle/node_modules/commander}/esm.mjs +0 -0
  338. /package/node_modules/{commander → maizzle/node_modules/commander}/index.js +0 -0
  339. /package/node_modules/{commander → maizzle/node_modules/commander}/lib/error.js +0 -0
  340. /package/node_modules/{commander → maizzle/node_modules/commander}/lib/suggestSimilar.js +0 -0
  341. /package/node_modules/{commander → maizzle/node_modules/commander}/typings/esm.d.mts +0 -0
@@ -1,10 +1,12 @@
1
1
  import { MaizzleConfigKey } from "../composables/useConfig.mjs";
2
2
  import { RenderContextKey } from "../composables/renderContext.mjs";
3
+ import { isLaravel } from "../utils/detect.mjs";
4
+ import { existsSync, readFileSync } from "node:fs";
3
5
  import { dirname, resolve } from "node:path";
4
6
  import { fileURLToPath } from "node:url";
5
7
  import { defu } from "defu";
6
8
  import { createSSRApp } from "vue";
7
- import { createServer } from "vite";
9
+ import { createServer, mergeConfig } from "vite";
8
10
  import vue from "@vitejs/plugin-vue";
9
11
  import Markdown from "unplugin-vue-markdown/vite";
10
12
  import AutoImport from "unplugin-auto-import/vite";
@@ -15,6 +17,77 @@ import { createHead, renderSSRHead } from "@unhead/vue/server";
15
17
 
16
18
  //#region src/render/createRenderer.ts
17
19
  const __dirname = dirname(fileURLToPath(import.meta.url));
20
+ /**
21
+ * Vite plugin that extracts raw slot content from <CodeBlock> tags
22
+ * and passes it as a :code prop before Vue compiles the template.
23
+ *
24
+ * This lets users write HTML naturally inside CodeBlock slots without
25
+ * Vue attempting to compile it as template syntax.
26
+ */
27
+ function codeBlockExtract() {
28
+ const re = /<(CodeBlock|code-block)((?:\s[^>]*?)?)>([\s\S]*?)<\/\1>/g;
29
+ return {
30
+ name: "maizzle:code-block-extract",
31
+ enforce: "pre",
32
+ transform(code, id) {
33
+ if (!id.endsWith(".vue") && !id.endsWith(".md")) return;
34
+ if (!code.includes("CodeBlock") && !code.includes("code-block")) return;
35
+ const transformed = code.replace(re, (_match, tag, attrs, content) => {
36
+ if (/(?:^|\s):code\b/.test(attrs) || /v-bind:code\b/.test(attrs)) return _match;
37
+ const stripped = content.replace(/^\n+/, "").replace(/\s+$/, "");
38
+ if (!stripped) return _match;
39
+ const minIndent = stripped.match(/^[ \t]*(?=\S)/gm)?.reduce((min, ws) => Math.min(min, ws.length), Infinity) ?? 0;
40
+ return `<${tag}${attrs} code="${(minIndent > 0 ? stripped.replace(new RegExp(`^[ \\t]{${minIndent}}`, "gm"), "") : stripped).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}" />`;
41
+ });
42
+ if (transformed !== code) return {
43
+ code: transformed,
44
+ map: null
45
+ };
46
+ }
47
+ };
48
+ }
49
+ /**
50
+ * Vite plugin that pre-processes <Markdown> tags:
51
+ * - Extracts slot content, dedents it, and passes as :content prop
52
+ * - Resolves `src` prop to read file contents at build time
53
+ */
54
+ function markdownExtract() {
55
+ const re = /<(Markdown|markdown)((?:\s[^>]*?)?)>([\s\S]*?)<\/\1>/g;
56
+ const selfClosingRe = /<(Markdown|markdown)((?:\s[^>]*?\bsrc\s*=\s*"[^"]*"[^>]*?))\/>/g;
57
+ return {
58
+ name: "maizzle:markdown-extract",
59
+ enforce: "pre",
60
+ transform(code, id) {
61
+ if (!id.endsWith(".vue") && !id.endsWith(".md")) return;
62
+ if (!code.includes("Markdown") && !code.includes("markdown")) return;
63
+ let transformed = code;
64
+ transformed = transformed.replace(re, (_match, tag, attrs, content) => {
65
+ if (/(?:^|\s):content\b/.test(attrs) || /v-bind:content\b/.test(attrs)) return _match;
66
+ const stripped = content.replace(/^\n+/, "").replace(/\s+$/, "");
67
+ if (!stripped) return _match;
68
+ const minIndent = stripped.match(/^[ \t]*(?=\S)/gm)?.reduce((min, ws) => Math.min(min, ws.length), Infinity) ?? 0;
69
+ return `<${tag}${attrs} content="${(minIndent > 0 ? stripped.replace(new RegExp(`^[ \\t]{${minIndent}}`, "gm"), "") : stripped).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}" />`;
70
+ });
71
+ transformed = transformed.replace(selfClosingRe, (_match, tag, attrs) => {
72
+ const srcMatch = attrs.match(/\bsrc\s*=\s*"([^"]*)"/);
73
+ if (!srcMatch) return _match;
74
+ const srcPath = srcMatch[1];
75
+ const resolvedPath = resolve(dirname(id), srcPath);
76
+ let fileContent;
77
+ try {
78
+ fileContent = readFileSync(resolvedPath, "utf-8").trim();
79
+ } catch {
80
+ return _match;
81
+ }
82
+ return `<${tag}${attrs.replace(/\s*\bsrc\s*=\s*"[^"]*"/, "")} content="${fileContent.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}" />`;
83
+ });
84
+ if (transformed !== code) return {
85
+ code: transformed,
86
+ map: null
87
+ };
88
+ }
89
+ };
90
+ }
18
91
  const vuePkgDir = dirname(fileURLToPath(import.meta.resolve("vue/package.json")));
19
92
  const vueServerRendererPkgDir = dirname(fileURLToPath(import.meta.resolve("@vue/server-renderer/package.json")));
20
93
  const unheadVuePkgDir = resolve(dirname(fileURLToPath(import.meta.resolve("@unhead/vue"))), "..");
@@ -26,12 +99,17 @@ const vueRouterPkgDir = dirname(fileURLToPath(import.meta.resolve("vue-router/pa
26
99
  * Tailwind CSS compilation is handled by the transformer pipeline.
27
100
  */
28
101
  async function createRenderer(options = {}) {
29
- const { dts = false, markdown: markdownOptions, root = process.cwd() } = options;
102
+ const { dts = false, markdown: markdownOptionsRaw, root = process.cwd(), componentDirs = [], vite: userViteConfig } = options;
103
+ const { shikiTheme = "github-light", ...markdownOptions } = markdownOptionsRaw ?? {};
104
+ const dtsDir = isLaravel() ? resolve(process.cwd(), "resources/js/types/maizzle") : resolve(root, ".maizzle");
30
105
  const VIRTUAL_SFC_ID = "virtual:maizzle-sfc.vue";
31
106
  let virtualSfcSource = "";
32
- const server = await createServer({
33
- configFile: false,
107
+ const viteConfigFile = ["vite.config.ts", "vite.config.js"].map((f) => resolve(root, f)).find((f) => existsSync(f));
108
+ const maizzleConfig = {
109
+ configFile: viteConfigFile ?? false,
34
110
  plugins: [
111
+ codeBlockExtract(),
112
+ markdownExtract(),
35
113
  {
36
114
  name: "maizzle:virtual-sfc",
37
115
  resolveId(id) {
@@ -47,12 +125,31 @@ async function createRenderer(options = {}) {
47
125
  }),
48
126
  Markdown(defu(markdownOptions ?? {}, {
49
127
  headEnabled: true,
50
- wrapperDiv: false
128
+ wrapperDiv: false,
129
+ wrapperClasses: "prose",
130
+ markdownOptions: { async highlight(code, lang) {
131
+ const { codeToHtml } = await import("shiki");
132
+ return codeToHtml(code, {
133
+ lang,
134
+ theme: shikiTheme
135
+ });
136
+ } },
137
+ markdownSetup(md) {
138
+ const wrapPre = (html) => `<table class="w-full"><tr><td class="max-w-0 mso-padding-alt-4">${html}</td></tr></table>\n`;
139
+ const defaultFence = md.renderer.rules.fence;
140
+ md.renderer.rules.fence = (...args) => {
141
+ const result = defaultFence(...args);
142
+ if (typeof result === "string") return wrapPre(result);
143
+ return result.then(wrapPre);
144
+ };
145
+ const defaultCodeBlock = md.renderer.rules.code_block;
146
+ md.renderer.rules.code_block = (...args) => wrapPre(defaultCodeBlock(...args));
147
+ }
51
148
  })),
52
149
  AutoImport({
53
150
  dirs: [resolve(__dirname, "../composables"), resolve(__dirname, "../filters")],
54
151
  imports: ["vue", unheadVueComposablesImports],
55
- dts: dts ? resolve(root, "types/auto-imports.d.ts") : false
152
+ dts: dts ? resolve(dtsDir, "auto-imports.d.ts") : false
56
153
  }),
57
154
  Components({
58
155
  extensions: ["vue", "md"],
@@ -61,8 +158,12 @@ async function createRenderer(options = {}) {
61
158
  /\.vue\?vue/,
62
159
  /\.md$/
63
160
  ],
64
- dirs: [resolve(__dirname, "../components"), resolve(root, "components")],
65
- dts: dts ? resolve(root, "types/components.d.ts") : false
161
+ dirs: [
162
+ resolve(__dirname, "../components"),
163
+ resolve(root, "components"),
164
+ ...componentDirs
165
+ ],
166
+ dts: dts ? resolve(dtsDir, "components.d.ts") : false
66
167
  })
67
168
  ],
68
169
  resolve: { alias: {
@@ -79,6 +180,7 @@ async function createRenderer(options = {}) {
79
180
  fs: { allow: [
80
181
  process.cwd(),
81
182
  root,
183
+ ...componentDirs,
82
184
  vuePkgDir,
83
185
  vueServerRendererPkgDir,
84
186
  unheadVuePkgDir,
@@ -88,7 +190,8 @@ async function createRenderer(options = {}) {
88
190
  appType: "custom",
89
191
  logLevel: "silent",
90
192
  optimizeDeps: { noDiscovery: true }
91
- });
193
+ };
194
+ const server = await createServer(userViteConfig && !viteConfigFile ? mergeConfig(userViteConfig, maizzleConfig) : maizzleConfig);
92
195
  return {
93
196
  async render(input, config) {
94
197
  let component;
@@ -118,15 +221,45 @@ async function createRenderer(options = {}) {
118
221
  const head = createHead({ disableDefaults: true });
119
222
  const app = createSSRApp(component);
120
223
  app.use(head);
224
+ if (config.vue) {
225
+ for (const plugin of config.vue.plugins ?? []) app.use(plugin);
226
+ for (const [name, directive] of Object.entries(config.vue.directives ?? {})) app.directive(name, directive);
227
+ Object.assign(app.config.globalProperties, config.vue.globalProperties);
228
+ }
121
229
  app.provide(configKey, config);
122
230
  app.provide(contextKey, renderContext);
123
- let html = await renderToString(app);
231
+ const ssrContext = {};
232
+ let html = await renderToString(app, ssrContext);
124
233
  const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(head);
125
234
  if (htmlAttrs) html = html.replace(/<html([^>]*)>/, `<html$1 ${htmlAttrs}>`);
126
235
  if (headTags) html = html.replace("</head>", `${headTags}\n</head>`);
127
236
  if (bodyAttrs) html = html.replace(/<body([^>]*)>/, `<body$1 ${bodyAttrs}>`);
128
237
  if (bodyTagsOpen) html = html.replace(/<body([^>]*)>/, `<body$1>\n${bodyTagsOpen}`);
129
238
  if (bodyTags) html = html.replace("</body>", `${bodyTags}\n</body>`);
239
+ if (ssrContext.teleports) {
240
+ const { parse: parseDom, serialize: serializeDom, walk } = await import("../utils/ast/index.mjs");
241
+ let dom = parseDom(html);
242
+ for (const [rawTarget, content] of Object.entries(ssrContext.teleports)) {
243
+ if (!content) continue;
244
+ const prepend = rawTarget.endsWith(":start");
245
+ const target = prepend ? rawTarget.slice(0, -6) : rawTarget;
246
+ const targetChildren = parseDom(content);
247
+ walk(dom, (node) => {
248
+ const el = node;
249
+ if (!el.name) return;
250
+ if (target === el.name || target.startsWith("#") && el.attribs?.id === target.slice(1) || target.startsWith(".") && el.attribs?.class?.split(/\s+/).includes(target.slice(1))) {
251
+ for (const child of targetChildren) child.parent = el;
252
+ el.children = prepend ? [...targetChildren, ...el.children || []] : [...el.children || [], ...targetChildren];
253
+ }
254
+ });
255
+ }
256
+ html = serializeDom(dom);
257
+ }
258
+ if (renderContext.previewText) {
259
+ const { text, fillerCount, shyCount } = renderContext.previewText;
260
+ const previewHtml = `<div style="display:none">${text}${" ͏ ".repeat(fillerCount)}${"­ ".repeat(shyCount)}\u00A0</div>`;
261
+ html = html.replace(/<body([^>]*)>/, `<body$1>${previewHtml}`);
262
+ }
130
263
  return {
131
264
  html,
132
265
  doctype: renderContext.doctype,
@@ -139,6 +272,9 @@ async function createRenderer(options = {}) {
139
272
  const mod = await server.moduleGraph.getModuleByUrl(filePath);
140
273
  if (mod) server.moduleGraph.invalidateModule(mod);
141
274
  },
275
+ async invalidateAll() {
276
+ for (const mod of server.moduleGraph.idToModuleMap.values()) server.moduleGraph.invalidateModule(mod);
277
+ },
142
278
  async close() {
143
279
  await server.close();
144
280
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createRenderer.mjs","names":["merge"],"sources":["../../src/render/createRenderer.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createServer } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport Markdown from 'unplugin-vue-markdown/vite'\nimport AutoImport from 'unplugin-auto-import/vite'\nimport Components from 'unplugin-vue-components/vite'\nimport { unheadVueComposablesImports } from '@unhead/vue'\nimport { defu as merge } from 'defu'\nimport { createSSRApp } from 'vue'\nimport { renderToString } from 'vue/server-renderer'\nimport { createHead, renderSSRHead } from '@unhead/vue/server'\nimport { MaizzleConfigKey } from '../composables/useConfig.ts'\nimport { RenderContextKey } from '../composables/renderContext.ts'\nimport type { Component, InjectionKey } from 'vue'\nimport type { MaizzleConfig } from '../types/index.ts'\nimport type { Options as MarkdownOptions } from 'unplugin-vue-markdown/types'\nimport type { RenderContext } from '../composables/renderContext.ts'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nconst vuePkgDir = dirname(fileURLToPath(import.meta.resolve('vue/package.json')))\nconst vueServerRendererPkgDir = dirname(fileURLToPath(import.meta.resolve('@vue/server-renderer/package.json')))\nconst unheadVuePkgDir = resolve(dirname(fileURLToPath(import.meta.resolve('@unhead/vue'))), '..')\nconst vueRouterPkgDir = dirname(fileURLToPath(import.meta.resolve('vue-router/package.json')))\n\nexport interface RenderedTemplate {\n html: string\n doctype?: string\n templateConfig: MaizzleConfig\n sfcEventHandlers: RenderContext['sfcEventHandlers']\n plaintext?: RenderContext['plaintext']\n}\n\nexport interface Renderer {\n render(input: string | Component, config: MaizzleConfig): Promise<RenderedTemplate>\n invalidate(filePath: string): Promise<void>\n close(): Promise<void>\n}\n\nexport interface CreateRendererOptions {\n /** Generate .d.ts files for auto-imports and components (default: false) */\n dts?: boolean\n /** Options passed to unplugin-vue-markdown */\n markdown?: MarkdownOptions\n /** Root directory for resolving user component dirs and .d.ts output */\n root?: string\n}\n\n/**\n * Lightweight Vite SSR loader for rendering Vue SFC email templates.\n *\n * Uses only Vue + unplugin for component/auto-import resolution.\n * Tailwind CSS compilation is handled by the transformer pipeline.\n */\nexport async function createRenderer(\n options: CreateRendererOptions = {},\n): Promise<Renderer> {\n const { dts = false, markdown: markdownOptions, root = process.cwd() } = options\n\n const VIRTUAL_SFC_ID = 'virtual:maizzle-sfc.vue'\n let virtualSfcSource = ''\n\n const server = await createServer({\n configFile: false,\n plugins: [\n {\n name: 'maizzle:virtual-sfc',\n resolveId(id) {\n if (id === VIRTUAL_SFC_ID) return id\n },\n load(id) {\n if (id === VIRTUAL_SFC_ID) return virtualSfcSource\n },\n },\n vue({\n include: [/\\.vue$/, /\\.md$/],\n template: {\n transformAssetUrls: false,\n },\n }),\n Markdown(merge(markdownOptions ?? {}, {\n headEnabled: true,\n wrapperDiv: false,\n })),\n AutoImport({\n dirs: [\n resolve(__dirname, '../composables'),\n resolve(__dirname, '../filters'),\n ],\n imports: ['vue', unheadVueComposablesImports],\n dts: dts ? resolve(root, 'types/auto-imports.d.ts') : false,\n }),\n Components({\n extensions: ['vue', 'md'],\n include: [/\\.vue$/, /\\.vue\\?vue/, /\\.md$/],\n dirs: [\n resolve(__dirname, '../components'),\n resolve(root, 'components'),\n ],\n dts: dts ? resolve(root, 'types/components.d.ts') : false,\n }),\n ],\n resolve: {\n alias: {\n 'vue/server-renderer': resolve(vueServerRendererPkgDir, 'dist/server-renderer.esm-bundler.js'),\n 'vue': resolve(vuePkgDir, 'dist/vue.runtime.esm-bundler.js'),\n 'vue-router': vueRouterPkgDir,\n '@unhead/vue/server': resolve(unheadVuePkgDir, 'dist/server.mjs'),\n '@unhead/vue': resolve(unheadVuePkgDir, 'dist/index.mjs'),\n },\n },\n server: {\n middlewareMode: true,\n hmr: false,\n watch: null,\n fs: {\n allow: [process.cwd(), root, vuePkgDir, vueServerRendererPkgDir, unheadVuePkgDir, vueRouterPkgDir],\n },\n },\n appType: 'custom',\n logLevel: 'silent',\n optimizeDeps: {\n noDiscovery: true,\n },\n })\n\n return {\n async render(input: string | Component, config: MaizzleConfig): Promise<RenderedTemplate> {\n let component: Component\n let configKey: InjectionKey<MaizzleConfig>\n let contextKey: InjectionKey<RenderContext>\n\n if (typeof input === 'string') {\n // String input goes through Vite — must use ssrLoadModule for injection keys\n // so they share the same module instance as the SFC\n const configModule = await server.ssrLoadModule(resolve(__dirname, '../composables/useConfig'))\n const contextModule = await server.ssrLoadModule(resolve(__dirname, '../composables/renderContext'))\n configKey = configModule.MaizzleConfigKey\n contextKey = contextModule.RenderContextKey\n\n if (input.includes('<template') || input.includes('<script')) {\n virtualSfcSource = input\n const mod = server.moduleGraph.getModuleById(VIRTUAL_SFC_ID)\n if (mod) server.moduleGraph.invalidateModule(mod)\n component = (await server.ssrLoadModule(VIRTUAL_SFC_ID)).default\n } else {\n component = (await server.ssrLoadModule(input)).default\n }\n } else {\n // Pre-compiled component — use directly imported keys\n component = input\n configKey = MaizzleConfigKey\n contextKey = RenderContextKey\n }\n\n const renderContext: RenderContext = {\n doctype: undefined,\n sfcConfig: undefined,\n sfcEventHandlers: [],\n }\n\n const head = createHead({ disableDefaults: true })\n const app = createSSRApp(component)\n app.use(head)\n app.provide(configKey, config)\n app.provide(contextKey, renderContext)\n\n let html: string = await renderToString(app)\n\n const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(head)\n\n // Inject head entries into the rendered HTML\n if (htmlAttrs) {\n html = html.replace(/<html([^>]*)>/, `<html$1 ${htmlAttrs}>`)\n }\n if (headTags) {\n html = html.replace('</head>', `${headTags}\\n</head>`)\n }\n if (bodyAttrs) {\n html = html.replace(/<body([^>]*)>/, `<body$1 ${bodyAttrs}>`)\n }\n if (bodyTagsOpen) {\n html = html.replace(/<body([^>]*)>/, `<body$1>\\n${bodyTagsOpen}`)\n }\n if (bodyTags) {\n html = html.replace('</body>', `${bodyTags}\\n</body>`)\n }\n\n return {\n html,\n doctype: renderContext.doctype,\n templateConfig: renderContext.sfcConfig ?? config,\n sfcEventHandlers: renderContext.sfcEventHandlers,\n plaintext: renderContext.plaintext,\n }\n },\n\n async invalidate(filePath: string): Promise<void> {\n const mod = await server.moduleGraph.getModuleByUrl(filePath)\n if (mod) {\n server.moduleGraph.invalidateModule(mod)\n }\n },\n\n async close(): Promise<void> {\n await server.close()\n },\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createRenderer.mjs","names":["merge"],"sources":["../../src/render/createRenderer.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { isLaravel } from '../utils/detect.ts'\nimport { createServer, mergeConfig, type InlineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport Markdown from 'unplugin-vue-markdown/vite'\nimport AutoImport from 'unplugin-auto-import/vite'\nimport Components from 'unplugin-vue-components/vite'\nimport { unheadVueComposablesImports } from '@unhead/vue'\nimport { defu as merge } from 'defu'\nimport { createSSRApp } from 'vue'\nimport { renderToString } from 'vue/server-renderer'\nimport { createHead, renderSSRHead } from '@unhead/vue/server'\nimport { MaizzleConfigKey } from '../composables/useConfig.ts'\nimport { RenderContextKey } from '../composables/renderContext.ts'\nimport type { Component, InjectionKey } from 'vue'\nimport type { MaizzleConfig, MarkdownConfig } from '../types/index.ts'\nimport type { MarkdownExit } from 'markdown-exit'\nimport type { RenderContext } from '../composables/renderContext.ts'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n/**\n * Vite plugin that extracts raw slot content from <CodeBlock> tags\n * and passes it as a :code prop before Vue compiles the template.\n *\n * This lets users write HTML naturally inside CodeBlock slots without\n * Vue attempting to compile it as template syntax.\n */\nfunction codeBlockExtract() {\n // Matches <CodeBlock ...>content</CodeBlock> (and kebab-case <code-block>)\n const re = /<(CodeBlock|code-block)((?:\\s[^>]*?)?)>([\\s\\S]*?)<\\/\\1>/g\n\n return {\n name: 'maizzle:code-block-extract',\n enforce: 'pre' as const,\n transform(code: string, id: string) {\n if (!id.endsWith('.vue') && !id.endsWith('.md')) return\n if (!code.includes('CodeBlock') && !code.includes('code-block')) return\n\n const transformed = code.replace(re, (_match, tag, attrs, content) => {\n // Skip if already has a :code or v-bind:code prop\n if (/(?:^|\\s):code\\b/.test(attrs) || /v-bind:code\\b/.test(attrs)) return _match\n\n // Strip leading/trailing blank lines, then dedent based on\n // the minimum indent of non-empty lines (à la min-indent)\n const stripped = content.replace(/^\\n+/, '').replace(/\\s+$/, '')\n if (!stripped) return _match\n\n const minIndent = stripped.match(/^[ \\t]*(?=\\S)/gm)\n ?.reduce((min, ws) => Math.min(min, ws.length), Infinity) ?? 0\n\n const dedented = minIndent > 0\n ? stripped.replace(new RegExp(`^[ \\\\t]{${minIndent}}`, 'gm'), '')\n : stripped\n\n // HTML-escape for safe embedding in a static attribute value.\n const escaped = dedented\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n\n return `<${tag}${attrs} code=\"${escaped}\" />`\n })\n\n if (transformed !== code) {\n return { code: transformed, map: null }\n }\n },\n }\n}\n\n/**\n * Vite plugin that pre-processes <Markdown> tags:\n * - Extracts slot content, dedents it, and passes as :content prop\n * - Resolves `src` prop to read file contents at build time\n */\nfunction markdownExtract() {\n const re = /<(Markdown|markdown)((?:\\s[^>]*?)?)>([\\s\\S]*?)<\\/\\1>/g\n const selfClosingRe = /<(Markdown|markdown)((?:\\s[^>]*?\\bsrc\\s*=\\s*\"[^\"]*\"[^>]*?))\\/>/g\n\n return {\n name: 'maizzle:markdown-extract',\n enforce: 'pre' as const,\n transform(code: string, id: string) {\n if (!id.endsWith('.vue') && !id.endsWith('.md')) return\n if (!code.includes('Markdown') && !code.includes('markdown')) return\n\n let transformed = code\n\n // Handle <Markdown>content</Markdown>\n transformed = transformed.replace(re, (_match, tag, attrs, content) => {\n if (/(?:^|\\s):content\\b/.test(attrs) || /v-bind:content\\b/.test(attrs)) return _match\n\n const stripped = content.replace(/^\\n+/, '').replace(/\\s+$/, '')\n if (!stripped) return _match\n\n const minIndent = stripped.match(/^[ \\t]*(?=\\S)/gm)\n ?.reduce((min: number, ws: string) => Math.min(min, ws.length), Infinity) ?? 0\n\n const dedented = minIndent > 0\n ? stripped.replace(new RegExp(`^[ \\\\t]{${minIndent}}`, 'gm'), '')\n : stripped\n\n const escaped = dedented\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n\n return `<${tag}${attrs} content=\"${escaped}\" />`\n })\n\n // Handle <Markdown src=\"./file.md\" /> — resolve and inline file content\n transformed = transformed.replace(selfClosingRe, (_match, tag, attrs) => {\n const srcMatch = attrs.match(/\\bsrc\\s*=\\s*\"([^\"]*)\"/)\n if (!srcMatch) return _match\n\n const srcPath = srcMatch[1]\n const resolvedPath = resolve(dirname(id), srcPath)\n\n let fileContent: string\n try {\n fileContent = readFileSync(resolvedPath, 'utf-8').trim()\n } catch {\n return _match\n }\n\n // Remove src prop, add content prop\n const cleanAttrs = attrs.replace(/\\s*\\bsrc\\s*=\\s*\"[^\"]*\"/, '')\n const escaped = fileContent\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n\n return `<${tag}${cleanAttrs} content=\"${escaped}\" />`\n })\n\n if (transformed !== code) {\n return { code: transformed, map: null }\n }\n },\n }\n}\n\nconst vuePkgDir = dirname(fileURLToPath(import.meta.resolve('vue/package.json')))\nconst vueServerRendererPkgDir = dirname(fileURLToPath(import.meta.resolve('@vue/server-renderer/package.json')))\nconst unheadVuePkgDir = resolve(dirname(fileURLToPath(import.meta.resolve('@unhead/vue'))), '..')\nconst vueRouterPkgDir = dirname(fileURLToPath(import.meta.resolve('vue-router/package.json')))\n\nexport interface RenderedTemplate {\n html: string\n doctype?: string\n templateConfig: MaizzleConfig\n sfcEventHandlers: RenderContext['sfcEventHandlers']\n plaintext?: RenderContext['plaintext']\n}\n\nexport interface Renderer {\n render(input: string | Component, config: MaizzleConfig): Promise<RenderedTemplate>\n invalidate(filePath: string): Promise<void>\n invalidateAll(): Promise<void>\n close(): Promise<void>\n}\n\nexport interface CreateRendererOptions {\n /** Generate .d.ts files for auto-imports and components (default: false) */\n dts?: boolean\n /** Options passed to unplugin-vue-markdown */\n markdown?: MarkdownConfig\n /** Root directory for resolving user component dirs and .d.ts output */\n root?: string\n /** Additional component directories to register for auto-import */\n componentDirs?: string[]\n /** User Vite config options to merge into the internal SSR server */\n vite?: InlineConfig\n}\n\n/**\n * Lightweight Vite SSR loader for rendering Vue SFC email templates.\n *\n * Uses only Vue + unplugin for component/auto-import resolution.\n * Tailwind CSS compilation is handled by the transformer pipeline.\n */\nexport async function createRenderer(\n options: CreateRendererOptions = {},\n): Promise<Renderer> {\n const { dts = false, markdown: markdownOptionsRaw, root = process.cwd(), componentDirs = [], vite: userViteConfig } = options\n const { shikiTheme = 'github-light', ...markdownOptions } = markdownOptionsRaw ?? {}\n\n const dtsDir = isLaravel()\n ? resolve(process.cwd(), 'resources/js/types/maizzle')\n : resolve(root, '.maizzle')\n\n const VIRTUAL_SFC_ID = 'virtual:maizzle-sfc.vue'\n let virtualSfcSource = ''\n\n // Check for a user vite.config file in the project root\n const viteConfigFile = ['vite.config.ts', 'vite.config.js']\n .map(f => resolve(root, f))\n .find(f => existsSync(f))\n\n const maizzleConfig: InlineConfig = {\n configFile: viteConfigFile ?? false,\n plugins: [\n codeBlockExtract(),\n markdownExtract(),\n {\n name: 'maizzle:virtual-sfc',\n resolveId(id) {\n if (id === VIRTUAL_SFC_ID) return id\n },\n load(id) {\n if (id === VIRTUAL_SFC_ID) return virtualSfcSource\n },\n },\n vue({\n include: [/\\.vue$/, /\\.md$/],\n template: {\n transformAssetUrls: false,\n },\n }),\n Markdown(merge(markdownOptions ?? {}, {\n headEnabled: true,\n wrapperDiv: false,\n wrapperClasses: 'prose',\n markdownOptions: {\n async highlight(code: string, lang: string) {\n const { codeToHtml } = await import('shiki')\n return codeToHtml(code, { lang, theme: shikiTheme })\n },\n },\n markdownSetup(md: MarkdownExit) {\n const wrapPre = (html: string) =>\n `<table class=\"w-full\"><tr><td class=\"max-w-0 mso-padding-alt-4\">${html}</td></tr></table>\\n`\n\n const defaultFence = md.renderer.rules.fence!\n md.renderer.rules.fence = (...args) => {\n const result = defaultFence(...args)\n if (typeof result === 'string') return wrapPre(result)\n return result.then(wrapPre)\n }\n\n const defaultCodeBlock = md.renderer.rules.code_block!\n md.renderer.rules.code_block = (...args) => wrapPre(defaultCodeBlock(...args) as string)\n },\n })),\n AutoImport({\n dirs: [\n resolve(__dirname, '../composables'),\n resolve(__dirname, '../filters'),\n ],\n imports: ['vue', unheadVueComposablesImports],\n dts: dts ? resolve(dtsDir, 'auto-imports.d.ts') : false,\n }),\n Components({\n extensions: ['vue', 'md'],\n include: [/\\.vue$/, /\\.vue\\?vue/, /\\.md$/],\n dirs: [\n resolve(__dirname, '../components'),\n resolve(root, 'components'),\n ...componentDirs,\n ],\n dts: dts ? resolve(dtsDir, 'components.d.ts') : false,\n }),\n ],\n resolve: {\n alias: {\n 'vue/server-renderer': resolve(vueServerRendererPkgDir, 'dist/server-renderer.esm-bundler.js'),\n 'vue': resolve(vuePkgDir, 'dist/vue.runtime.esm-bundler.js'),\n 'vue-router': vueRouterPkgDir,\n '@unhead/vue/server': resolve(unheadVuePkgDir, 'dist/server.mjs'),\n '@unhead/vue': resolve(unheadVuePkgDir, 'dist/index.mjs'),\n },\n },\n server: {\n middlewareMode: true,\n hmr: false,\n watch: null,\n fs: {\n allow: [process.cwd(), root, ...componentDirs, vuePkgDir, vueServerRendererPkgDir, unheadVuePkgDir, vueRouterPkgDir],\n },\n },\n appType: 'custom',\n logLevel: 'silent',\n optimizeDeps: {\n noDiscovery: true,\n },\n }\n\n // Merge user's vite config (from config.vite) under Maizzle's config.\n // mergeConfig(a, b) → b overrides a for scalars, arrays are concatenated.\n // This ensures Maizzle's critical settings (middlewareMode, appType, etc.) always win,\n // while user plugins and other options are included.\n const finalConfig = userViteConfig && !viteConfigFile\n ? mergeConfig(userViteConfig, maizzleConfig)\n : maizzleConfig\n\n const server = await createServer(finalConfig)\n\n return {\n async render(input: string | Component, config: MaizzleConfig): Promise<RenderedTemplate> {\n let component: Component\n let configKey: InjectionKey<MaizzleConfig>\n let contextKey: InjectionKey<RenderContext>\n\n if (typeof input === 'string') {\n // String input goes through Vite — must use ssrLoadModule for injection keys\n // so they share the same module instance as the SFC\n const configModule = await server.ssrLoadModule(resolve(__dirname, '../composables/useConfig'))\n const contextModule = await server.ssrLoadModule(resolve(__dirname, '../composables/renderContext'))\n configKey = configModule.MaizzleConfigKey\n contextKey = contextModule.RenderContextKey\n\n if (input.includes('<template') || input.includes('<script')) {\n virtualSfcSource = input\n const mod = server.moduleGraph.getModuleById(VIRTUAL_SFC_ID)\n if (mod) server.moduleGraph.invalidateModule(mod)\n component = (await server.ssrLoadModule(VIRTUAL_SFC_ID)).default\n } else {\n component = (await server.ssrLoadModule(input)).default\n }\n } else {\n // Pre-compiled component — use directly imported keys\n component = input\n configKey = MaizzleConfigKey\n contextKey = RenderContextKey\n }\n\n const renderContext: RenderContext = {\n doctype: undefined,\n sfcConfig: undefined,\n sfcEventHandlers: [],\n }\n\n const head = createHead({ disableDefaults: true })\n const app = createSSRApp(component)\n app.use(head)\n\n // Register user Vue plugins, directives, and global properties\n if (config.vue) {\n for (const plugin of config.vue.plugins ?? []) {\n app.use(plugin)\n }\n for (const [name, directive] of Object.entries(config.vue.directives ?? {})) {\n app.directive(name, directive)\n }\n Object.assign(app.config.globalProperties, config.vue.globalProperties)\n }\n\n app.provide(configKey, config)\n app.provide(contextKey, renderContext)\n\n const ssrContext: Record<string, any> = {}\n let html: string = await renderToString(app, ssrContext)\n\n const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(head)\n\n // Inject head entries into the rendered HTML\n if (htmlAttrs) {\n html = html.replace(/<html([^>]*)>/, `<html$1 ${htmlAttrs}>`)\n }\n if (headTags) {\n html = html.replace('</head>', `${headTags}\\n</head>`)\n }\n if (bodyAttrs) {\n html = html.replace(/<body([^>]*)>/, `<body$1 ${bodyAttrs}>`)\n }\n if (bodyTagsOpen) {\n html = html.replace(/<body([^>]*)>/, `<body$1>\\n${bodyTagsOpen}`)\n }\n if (bodyTags) {\n html = html.replace('</body>', `${bodyTags}\\n</body>`)\n }\n\n // Inject SSR teleport content into their target elements\n if (ssrContext.teleports) {\n const { parse: parseDom, serialize: serializeDom, walk } = await import('../utils/ast/index.ts')\n let dom = parseDom(html)\n\n for (const [rawTarget, content] of Object.entries(ssrContext.teleports) as [string, string][]) {\n if (!content) continue\n\n const prepend = rawTarget.endsWith(':start')\n const target = prepend ? rawTarget.slice(0, -6) : rawTarget\n const targetChildren = parseDom(content)\n\n walk(dom, (node) => {\n const el = node as import('domhandler').Element\n\n if (!el.name) return\n\n const matched\n = target === el.name\n || (target.startsWith('#') && el.attribs?.id === target.slice(1))\n || (target.startsWith('.') && el.attribs?.class?.split(/\\s+/).includes(target.slice(1)))\n\n if (matched) {\n for (const child of targetChildren) {\n child.parent = el as any\n }\n\n el.children = prepend\n ? [...targetChildren, ...(el.children || [])] as any\n : [...(el.children || []), ...targetChildren] as any\n }\n })\n }\n\n html = serializeDom(dom)\n }\n\n // Inject preview/preheader text from usePreviewText() composable\n if (renderContext.previewText) {\n const { text, fillerCount, shyCount } = renderContext.previewText\n const filler = '\\u2007\\u034F '.repeat(fillerCount)\n const shys = '\\u00AD '.repeat(shyCount)\n const previewHtml = `<div style=\"display:none\">${text}${filler}${shys}\\u00A0</div>`\n html = html.replace(/<body([^>]*)>/, `<body$1>${previewHtml}`)\n }\n\n return {\n html,\n doctype: renderContext.doctype,\n templateConfig: renderContext.sfcConfig ?? config,\n sfcEventHandlers: renderContext.sfcEventHandlers,\n plaintext: renderContext.plaintext,\n }\n },\n\n async invalidate(filePath: string): Promise<void> {\n const mod = await server.moduleGraph.getModuleByUrl(filePath)\n if (mod) {\n server.moduleGraph.invalidateModule(mod)\n }\n },\n\n async invalidateAll(): Promise<void> {\n for (const mod of server.moduleGraph.idToModuleMap.values()) {\n server.moduleGraph.invalidateModule(mod)\n }\n },\n\n async close(): Promise<void> {\n await server.close()\n },\n }\n}\n"],"mappings":"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"}
@@ -15,15 +15,18 @@ async function render(template, options = {}) {
15
15
  const config = await resolveConfig(options.config);
16
16
  const renderer = options._renderer ?? await createRenderer({
17
17
  markdown: config.markdown,
18
- root: config.root
18
+ root: config.root,
19
+ componentDirs: [config.components?.source ?? []].flat(),
20
+ vite: config.vite
19
21
  });
20
22
  const ownsRenderer = !options._renderer;
21
23
  try {
22
24
  const isFile = typeof template === "string" && [".vue", ".md"].includes(extname(template)) && !template.includes("\n");
23
25
  const rendered = await renderer.render(isFile ? resolve(template) : template, config);
24
26
  let html = rendered.html;
25
- if (rendered.templateConfig.useTransformers !== false) html = await runTransformers(html, rendered.templateConfig, isFile ? resolve(template) : void 0);
26
- html = `${rendered.doctype ?? rendered.templateConfig.doctype ?? "<!DOCTYPE html>"}\n${html}`;
27
+ const doctype = rendered.doctype ?? rendered.templateConfig.doctype ?? "<!DOCTYPE html>";
28
+ if (rendered.templateConfig.useTransformers !== false) html = await runTransformers(html, rendered.templateConfig, isFile ? resolve(template) : void 0, doctype);
29
+ html = `${doctype}\n${html}`;
27
30
  const globalPlaintext = rendered.templateConfig.plaintext;
28
31
  const sfcPlaintext = rendered.plaintext;
29
32
  let plaintextResult;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/render/index.ts"],"sourcesContent":["import { resolve, extname } from 'node:path'\nimport { resolveConfig } from '../config/index.ts'\nimport { runTransformers } from '../transformers/index.ts'\nimport { createPlaintext } from '../plaintext.ts'\nimport type { Component } from 'vue'\nimport type { MaizzleConfig } from '../types/index.ts'\nimport { createRenderer, type Renderer } from './createRenderer.ts'\n\nexport type { Renderer, RenderedTemplate, CreateRendererOptions } from './createRenderer.ts'\nexport { createRenderer } from './createRenderer.ts'\n\nexport interface RenderOptions {\n /** Already-resolved or partial config. If not provided, resolves from disk + defaults. */\n config?: Partial<MaizzleConfig>\n /** Reuse an existing renderer (used internally by build/serve to avoid creating one per template) */\n _renderer?: Renderer\n}\n\nexport interface RenderResult {\n html: string\n config: MaizzleConfig\n plaintext?: string\n}\n\n/**\n * Render a Vue SFC email template to a fully-transformed HTML string.\n *\n * Accepts a file path, a raw SFC source string, or an imported Vue component.\n * Runs the full pipeline: SSR render → transformers → doctype.\n */\nexport async function render(\n template: string | Component,\n options: RenderOptions = {},\n): Promise<RenderResult> {\n const config = await resolveConfig(options.config)\n\n // Reuse provided renderer or create a temporary one\n const renderer = options._renderer ?? await createRenderer({ markdown: config.markdown, root: config.root })\n const ownsRenderer = !options._renderer\n\n try {\n const isFile = typeof template === 'string'\n && ['.vue', '.md'].includes(extname(template))\n && !template.includes('\\n')\n\n const rendered = await renderer.render(isFile ? resolve(template) : template, config)\n let html = rendered.html\n\n // Run transformers\n if (rendered.templateConfig.useTransformers !== false) {\n html = await runTransformers(html, rendered.templateConfig, isFile ? resolve(template) : undefined)\n }\n\n // Prepend doctype\n const doctype = rendered.doctype ?? rendered.templateConfig.doctype ?? '<!DOCTYPE html>'\n html = `${doctype}\\n${html}`\n\n const globalPlaintext = rendered.templateConfig.plaintext\n const sfcPlaintext = rendered.plaintext\n\n let plaintextResult: string | undefined\n\n if (globalPlaintext || sfcPlaintext) {\n const stripOptions = typeof globalPlaintext === 'object' ? globalPlaintext : {}\n plaintextResult = createPlaintext(html, stripOptions)\n }\n\n return { html, config: rendered.templateConfig, plaintext: plaintextResult }\n } finally {\n if (ownsRenderer) {\n await renderer.close()\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,eAAsB,OACpB,UACA,UAAyB,EAAE,EACJ;CACvB,MAAM,SAAS,MAAM,cAAc,QAAQ,OAAO;CAGlD,MAAM,WAAW,QAAQ,aAAa,MAAM,eAAe;EAAE,UAAU,OAAO;EAAU,MAAM,OAAO;EAAM,CAAC;CAC5G,MAAM,eAAe,CAAC,QAAQ;AAE9B,KAAI;EACF,MAAM,SAAS,OAAO,aAAa,YAC9B,CAAC,QAAQ,MAAM,CAAC,SAAS,QAAQ,SAAS,CAAC,IAC3C,CAAC,SAAS,SAAS,KAAK;EAE7B,MAAM,WAAW,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS,GAAG,UAAU,OAAO;EACrF,IAAI,OAAO,SAAS;AAGpB,MAAI,SAAS,eAAe,oBAAoB,MAC9C,QAAO,MAAM,gBAAgB,MAAM,SAAS,gBAAgB,SAAS,QAAQ,SAAS,GAAG,OAAU;AAKrG,SAAO,GADS,SAAS,WAAW,SAAS,eAAe,WAAW,kBACrD,IAAI;EAEtB,MAAM,kBAAkB,SAAS,eAAe;EAChD,MAAM,eAAe,SAAS;EAE9B,IAAI;AAEJ,MAAI,mBAAmB,aAErB,mBAAkB,gBAAgB,MADb,OAAO,oBAAoB,WAAW,kBAAkB,EAAE,CAC1B;AAGvD,SAAO;GAAE;GAAM,QAAQ,SAAS;GAAgB,WAAW;GAAiB;WACpE;AACR,MAAI,aACF,OAAM,SAAS,OAAO"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/render/index.ts"],"sourcesContent":["import { resolve, extname } from 'node:path'\nimport { resolveConfig } from '../config/index.ts'\nimport { runTransformers } from '../transformers/index.ts'\nimport { createPlaintext } from '../plaintext.ts'\nimport type { Component } from 'vue'\nimport type { MaizzleConfig } from '../types/index.ts'\nimport { createRenderer, type Renderer } from './createRenderer.ts'\n\nexport type { Renderer, RenderedTemplate, CreateRendererOptions } from './createRenderer.ts'\nexport { createRenderer } from './createRenderer.ts'\n\nexport interface RenderOptions {\n /** Already-resolved or partial config. If not provided, resolves from disk + defaults. */\n config?: Partial<MaizzleConfig>\n /** Reuse an existing renderer (used internally by build/serve to avoid creating one per template) */\n _renderer?: Renderer\n}\n\nexport interface RenderResult {\n html: string\n config: MaizzleConfig\n plaintext?: string\n}\n\n/**\n * Render a Vue SFC email template to a fully-transformed HTML string.\n *\n * Accepts a file path, a raw SFC source string, or an imported Vue component.\n * Runs the full pipeline: SSR render → transformers → doctype.\n */\nexport async function render(\n template: string | Component,\n options: RenderOptions = {},\n): Promise<RenderResult> {\n const config = await resolveConfig(options.config)\n\n // Reuse provided renderer or create a temporary one\n const renderer = options._renderer ?? await createRenderer({ markdown: config.markdown, root: config.root, componentDirs: [config.components?.source ?? []].flat(), vite: config.vite })\n const ownsRenderer = !options._renderer\n\n try {\n const isFile = typeof template === 'string'\n && ['.vue', '.md'].includes(extname(template))\n && !template.includes('\\n')\n\n const rendered = await renderer.render(isFile ? resolve(template) : template, config)\n let html = rendered.html\n\n // Prepend doctype\n const doctype = rendered.doctype ?? rendered.templateConfig.doctype ?? '<!DOCTYPE html>'\n\n // Run transformers\n if (rendered.templateConfig.useTransformers !== false) {\n html = await runTransformers(html, rendered.templateConfig, isFile ? resolve(template) : undefined, doctype)\n }\n html = `${doctype}\\n${html}`\n\n const globalPlaintext = rendered.templateConfig.plaintext\n const sfcPlaintext = rendered.plaintext\n\n let plaintextResult: string | undefined\n\n if (globalPlaintext || sfcPlaintext) {\n const stripOptions = typeof globalPlaintext === 'object' ? globalPlaintext : {}\n plaintextResult = createPlaintext(html, stripOptions)\n }\n\n return { html, config: rendered.templateConfig, plaintext: plaintextResult }\n } finally {\n if (ownsRenderer) {\n await renderer.close()\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,eAAsB,OACpB,UACA,UAAyB,EAAE,EACJ;CACvB,MAAM,SAAS,MAAM,cAAc,QAAQ,OAAO;CAGlD,MAAM,WAAW,QAAQ,aAAa,MAAM,eAAe;EAAE,UAAU,OAAO;EAAU,MAAM,OAAO;EAAM,eAAe,CAAC,OAAO,YAAY,UAAU,EAAE,CAAC,CAAC,MAAM;EAAE,MAAM,OAAO;EAAM,CAAC;CACxL,MAAM,eAAe,CAAC,QAAQ;AAE9B,KAAI;EACF,MAAM,SAAS,OAAO,aAAa,YAC9B,CAAC,QAAQ,MAAM,CAAC,SAAS,QAAQ,SAAS,CAAC,IAC3C,CAAC,SAAS,SAAS,KAAK;EAE7B,MAAM,WAAW,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS,GAAG,UAAU,OAAO;EACrF,IAAI,OAAO,SAAS;EAGpB,MAAM,UAAU,SAAS,WAAW,SAAS,eAAe,WAAW;AAGvE,MAAI,SAAS,eAAe,oBAAoB,MAC9C,QAAO,MAAM,gBAAgB,MAAM,SAAS,gBAAgB,SAAS,QAAQ,SAAS,GAAG,QAAW,QAAQ;AAE9G,SAAO,GAAG,QAAQ,IAAI;EAEtB,MAAM,kBAAkB,SAAS,eAAe;EAChD,MAAM,eAAe,SAAS;EAE9B,IAAI;AAEJ,MAAI,mBAAmB,aAErB,mBAAkB,gBAAgB,MADb,OAAO,oBAAoB,WAAW,kBAAkB,EAAE,CAC1B;AAGvD,SAAO;GAAE;GAAM,QAAQ,SAAS;GAAgB,WAAW;GAAiB;WACpE;AACR,MAAI,aACF,OAAM,SAAS,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.mts","names":[],"sources":["../src/serve.ts"],"mappings":";;;;UAwBiB,YAAA;EACf,MAAA,GAAS,OAAA,CAAQ,aAAA;;EAEjB,IAAA;EAH2B;EAK3B,MAAA;AAAA;;;;;;;;AAYF;;iBAAsB,KAAA,CAAM,OAAA,GAAS,YAAA,GAAiB,OAAA,CAAA,aAAA;AAAA,iBA8ctC,WAAA,CAAY,MAAA,EAAQ,aAAA,EAAe,WAAA"}
1
+ {"version":3,"file":"serve.d.mts","names":[],"sources":["../src/serve.ts"],"mappings":";;;;UA+BiB,YAAA;EACf,MAAA,GAAS,OAAA,CAAQ,aAAA;;EAEjB,IAAA;EAH2B;EAK3B,MAAA;AAAA;;;;;;;;AAYF;;iBAAsB,KAAA,CAAM,OAAA,GAAS,YAAA,GAAiB,OAAA,CAAA,aAAA;AAAA,iBAmiBtC,WAAA,CAAY,MAAA,EAAQ,aAAA,EAAe,WAAA"}