@maizzle/framework 6.0.0-rc.2 → 6.0.0-rc.20
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.
- package/README.md +3 -3
- package/bin/maizzle.mjs +1 -1
- package/dist/build.d.ts +20 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/{build.mjs → build.js} +33 -19
- package/dist/build.js.map +1 -0
- package/dist/components/Body.vue +128 -0
- package/dist/components/Button.vue +148 -52
- package/dist/components/CodeBlock.vue +69 -0
- package/dist/components/CodeInline.vue +49 -0
- package/dist/components/Column.vue +108 -0
- package/dist/components/Container.vue +123 -0
- package/dist/components/Font.vue +96 -0
- package/dist/components/Head.vue +30 -0
- package/dist/components/Heading.vue +28 -0
- package/dist/components/Hr.vue +33 -0
- package/dist/components/Html.vue +137 -0
- package/dist/components/Img.vue +70 -0
- package/dist/components/Layout.vue +143 -0
- package/dist/components/Link.vue +26 -0
- package/dist/components/Markdown.vue +89 -0
- package/dist/components/MarkdownLayout.vue +39 -0
- package/dist/components/NotPlaintext.vue +14 -0
- package/dist/components/Outlook.vue +74 -11
- package/dist/components/OutlookBg.vue +241 -0
- package/dist/components/Overlap.vue +156 -0
- package/dist/components/Plaintext.vue +14 -0
- package/dist/components/Preheader.vue +15 -0
- package/dist/components/QrCode.vue +157 -0
- package/dist/components/Raw.vue +28 -0
- package/dist/components/Row.vue +184 -0
- package/dist/components/Section.vue +124 -0
- package/dist/components/Spacer.vue +70 -21
- package/dist/components/Tailwind.vue +43 -0
- package/dist/components/Text.vue +29 -0
- package/dist/components/utils.d.ts +28 -0
- package/dist/components/utils.d.ts.map +1 -0
- package/dist/components/utils.js +50 -0
- package/dist/components/utils.js.map +1 -0
- package/dist/components/utils.ts +51 -0
- package/dist/composables/{defineConfig.d.mts → defineConfig.d.ts} +2 -2
- package/dist/composables/defineConfig.d.ts.map +1 -0
- package/dist/composables/{defineConfig.mjs → defineConfig.js} +4 -5
- package/dist/composables/defineConfig.js.map +1 -0
- package/dist/composables/renderContext.d.ts +37 -0
- package/dist/composables/renderContext.d.ts.map +1 -0
- package/dist/composables/{renderContext.mjs → renderContext.js} +2 -2
- package/dist/composables/renderContext.js.map +1 -0
- package/dist/composables/useBaseUrl.d.ts +19 -0
- package/dist/composables/useBaseUrl.d.ts.map +1 -0
- package/dist/composables/useBaseUrl.js +26 -0
- package/dist/composables/useBaseUrl.js.map +1 -0
- package/dist/composables/{useConfig.d.mts → useConfig.d.ts} +2 -2
- package/dist/composables/useConfig.d.ts.map +1 -0
- package/dist/composables/{useConfig.mjs → useConfig.js} +2 -3
- package/dist/composables/useConfig.js.map +1 -0
- package/dist/composables/{useDoctype.d.mts → useDoctype.d.ts} +1 -1
- package/dist/composables/useDoctype.d.ts.map +1 -0
- package/dist/composables/{useDoctype.mjs → useDoctype.js} +3 -4
- package/dist/composables/useDoctype.js.map +1 -0
- package/dist/composables/{useEvent.d.mts → useEvent.d.ts} +2 -2
- package/dist/composables/useEvent.d.ts.map +1 -0
- package/dist/composables/{useEvent.mjs → useEvent.js} +3 -4
- package/dist/composables/useEvent.js.map +1 -0
- package/dist/composables/useFont.d.ts +50 -0
- package/dist/composables/useFont.d.ts.map +1 -0
- package/dist/composables/useFont.js +92 -0
- package/dist/composables/useFont.js.map +1 -0
- package/dist/composables/useOutlookFallback.d.ts +21 -0
- package/dist/composables/useOutlookFallback.d.ts.map +1 -0
- package/dist/composables/useOutlookFallback.js +29 -0
- package/dist/composables/useOutlookFallback.js.map +1 -0
- package/dist/composables/{usePlaintext.d.mts → usePlaintext.d.ts} +3 -1
- package/dist/composables/usePlaintext.d.ts.map +1 -0
- package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +4 -4
- package/dist/composables/usePlaintext.js.map +1 -0
- package/dist/composables/usePreheader.d.ts +24 -0
- package/dist/composables/usePreheader.d.ts.map +1 -0
- package/dist/composables/usePreheader.js +28 -0
- package/dist/composables/usePreheader.js.map +1 -0
- package/dist/composables/useTransformers.d.ts +34 -0
- package/dist/composables/useTransformers.d.ts.map +1 -0
- package/dist/composables/useTransformers.js +48 -0
- package/dist/composables/useTransformers.js.map +1 -0
- package/dist/composables/useUrlQuery.d.ts +19 -0
- package/dist/composables/useUrlQuery.d.ts.map +1 -0
- package/dist/composables/useUrlQuery.js +26 -0
- package/dist/composables/useUrlQuery.js.map +1 -0
- package/dist/config/{defaults.d.mts → defaults.d.ts} +2 -2
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/{defaults.mjs → defaults.js} +10 -6
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/{index.d.mts → index.d.ts} +4 -4
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/{index.mjs → index.js} +12 -10
- package/dist/config/index.js.map +1 -0
- package/dist/events/{index.d.mts → index.d.ts} +10 -4
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/{index.mjs → index.js} +21 -5
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +37 -0
- package/dist/{plaintext.d.mts → plaintext.d.ts} +1 -1
- package/dist/plaintext.d.ts.map +1 -0
- package/dist/{plaintext.mjs → plaintext.js} +4 -5
- package/dist/plaintext.js.map +1 -0
- package/dist/{plugin.d.mts → plugin.d.ts} +2 -2
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +57 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.d.mts → mergeMediaQueries.d.ts} +2 -2
- package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.mjs → mergeMediaQueries.js} +2 -3
- package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -0
- package/dist/plugins/postcss/{pruneVars.d.mts → pruneVars.d.ts} +1 -1
- package/dist/plugins/postcss/pruneVars.d.ts.map +1 -0
- package/dist/plugins/postcss/{pruneVars.mjs → pruneVars.js} +2 -2
- package/dist/plugins/postcss/pruneVars.js.map +1 -0
- package/dist/plugins/postcss/quoteFontFamilies.d.ts +13 -0
- package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -0
- package/dist/plugins/postcss/quoteFontFamilies.js +84 -0
- package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -0
- package/dist/plugins/postcss/{removeDeclarations.d.mts → removeDeclarations.d.ts} +1 -1
- package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -0
- package/dist/plugins/postcss/{removeDeclarations.mjs → removeDeclarations.js} +2 -2
- package/dist/plugins/postcss/removeDeclarations.js.map +1 -0
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts +16 -0
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js +39 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
- package/dist/plugins/postcss/resolveProps.d.ts +8 -0
- package/dist/plugins/postcss/resolveProps.d.ts.map +1 -0
- package/dist/plugins/postcss/resolveProps.js +144 -0
- package/dist/plugins/postcss/resolveProps.js.map +1 -0
- package/dist/plugins/postcss/{tailwindCleanup.d.mts → tailwindCleanup.d.ts} +2 -2
- package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -0
- package/dist/plugins/postcss/tailwindCleanup.js +68 -0
- package/dist/plugins/postcss/tailwindCleanup.js.map +1 -0
- package/dist/prepare.d.ts +17 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +44 -0
- package/dist/prepare.js.map +1 -0
- package/dist/render/active.d.ts +8 -0
- package/dist/render/active.d.ts.map +1 -0
- package/dist/render/active.js +12 -0
- package/dist/render/active.js.map +1 -0
- package/dist/render/{createRenderer.d.mts → createRenderer.d.ts} +15 -7
- package/dist/render/createRenderer.d.ts.map +1 -0
- package/dist/render/createRenderer.js +319 -0
- package/dist/render/createRenderer.js.map +1 -0
- package/dist/render/index.d.ts +18 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +53 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/injectFonts.d.ts +15 -0
- package/dist/render/injectFonts.d.ts.map +1 -0
- package/dist/render/injectFonts.js +45 -0
- package/dist/render/injectFonts.js.map +1 -0
- package/dist/render/plugins/codeBlockExtract.d.ts +14 -0
- package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -0
- package/dist/render/plugins/codeBlockExtract.js +34 -0
- package/dist/render/plugins/codeBlockExtract.js.map +1 -0
- package/dist/render/plugins/markdownExtract.d.ts +12 -0
- package/dist/render/plugins/markdownExtract.d.ts.map +1 -0
- package/dist/render/plugins/markdownExtract.js +49 -0
- package/dist/render/plugins/markdownExtract.js.map +1 -0
- package/dist/render/plugins/rawExtract.d.ts +14 -0
- package/dist/render/plugins/rawExtract.d.ts.map +1 -0
- package/dist/render/plugins/rawExtract.js +34 -0
- package/dist/render/plugins/rawExtract.js.map +1 -0
- package/dist/render/plugins/rowSourceLocation.d.ts +18 -0
- package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -0
- package/dist/render/plugins/rowSourceLocation.js +45 -0
- package/dist/render/plugins/rowSourceLocation.js.map +1 -0
- package/dist/{serve.d.mts → serve.d.ts} +4 -2
- package/dist/serve.d.ts.map +1 -0
- package/dist/{serve.mjs → serve.js} +203 -79
- package/dist/serve.js.map +1 -0
- package/dist/server/compatibility.d.ts +59 -0
- package/dist/server/compatibility.d.ts.map +1 -0
- package/dist/server/compatibility.js +911 -0
- package/dist/server/compatibility.js.map +1 -0
- package/dist/server/email.d.ts +17 -0
- package/dist/server/email.d.ts.map +1 -0
- package/dist/server/email.js +40 -0
- package/dist/server/email.js.map +1 -0
- package/dist/server/linter.d.ts +20 -0
- package/dist/server/linter.d.ts.map +1 -0
- package/dist/server/linter.js +339 -0
- package/dist/server/linter.js.map +1 -0
- package/dist/server/sfc-utils.d.ts +21 -0
- package/dist/server/sfc-utils.d.ts.map +1 -0
- package/dist/server/sfc-utils.js +198 -0
- package/dist/server/sfc-utils.js.map +1 -0
- package/dist/server/ui/App.vue +253 -77
- package/dist/server/ui/components/SidebarClose.vue +12 -0
- package/dist/server/ui/components/ui/checkbox/Checkbox.vue +35 -0
- package/dist/server/ui/components/ui/checkbox/index.ts +1 -0
- package/dist/server/ui/components/ui/command/Command.vue +5 -1
- package/dist/server/ui/components/ui/command/CommandDialog.vue +1 -1
- package/dist/server/ui/components/ui/command/CommandInput.vue +19 -1
- package/dist/server/ui/components/ui/command/CommandItem.vue +1 -1
- package/dist/server/ui/components/ui/command/CommandList.vue +1 -1
- package/dist/server/ui/components/ui/command/CommandShortcut.vue +1 -1
- package/dist/server/ui/components/ui/dialog/DialogOverlay.vue +9 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
- package/dist/server/ui/components/ui/input/Input.vue +1 -1
- package/dist/server/ui/components/ui/scroll-area/ScrollBar.vue +1 -1
- package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
- package/dist/server/ui/components/ui/sheet/SheetOverlay.vue +9 -1
- package/dist/server/ui/components/ui/sidebar/Sidebar.vue +8 -1
- package/dist/server/ui/components/ui/sidebar/SidebarProvider.vue +1 -1
- package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +5 -4
- package/dist/server/ui/components/ui/tags-input/TagsInput.vue +26 -0
- package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +17 -0
- package/dist/server/ui/components/ui/tags-input/TagsInputItem.vue +19 -0
- package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +22 -0
- package/dist/server/ui/components/ui/tags-input/TagsInputItemText.vue +17 -0
- package/dist/server/ui/components/ui/tags-input/index.ts +5 -0
- package/dist/server/ui/components/ui/toggle/index.ts +3 -3
- package/dist/server/ui/components/ui/toggle-group/ToggleGroup.vue +1 -1
- package/dist/server/ui/components/ui/toggle-group/ToggleGroupItem.vue +2 -2
- package/dist/server/ui/lib/emulated-dark-mode.ts +131 -0
- package/dist/server/ui/main.css +20 -20
- package/dist/server/ui/pages/Home.vue +12 -5
- package/dist/server/ui/pages/Preview.vue +716 -276
- package/dist/tests/render/_helpers.d.ts +6 -0
- package/dist/tests/render/_helpers.d.ts.map +1 -0
- package/dist/tests/render/_helpers.js +16 -0
- package/dist/tests/render/_helpers.js.map +1 -0
- package/dist/transformers/{addAttributes.d.mts → addAttributes.d.ts} +2 -2
- package/dist/transformers/addAttributes.d.ts.map +1 -0
- package/dist/transformers/{addAttributes.mjs → addAttributes.js} +16 -13
- package/dist/transformers/addAttributes.js.map +1 -0
- package/dist/transformers/attributeToStyle.d.ts +38 -0
- package/dist/transformers/attributeToStyle.d.ts.map +1 -0
- package/dist/transformers/attributeToStyle.js +94 -0
- package/dist/transformers/attributeToStyle.js.map +1 -0
- package/dist/transformers/base.d.ts +71 -0
- package/dist/transformers/base.d.ts.map +1 -0
- package/dist/transformers/{base.mjs → base.js} +56 -30
- package/dist/transformers/base.js.map +1 -0
- package/dist/transformers/columnWidth.d.ts +31 -0
- package/dist/transformers/columnWidth.d.ts.map +1 -0
- package/dist/transformers/columnWidth.js +546 -0
- package/dist/transformers/columnWidth.js.map +1 -0
- package/dist/transformers/entities.d.ts +37 -0
- package/dist/transformers/entities.d.ts.map +1 -0
- package/dist/transformers/entities.js +73 -0
- package/dist/transformers/entities.js.map +1 -0
- package/dist/transformers/filters/defaults.d.ts +6 -0
- package/dist/transformers/filters/defaults.d.ts.map +1 -0
- package/dist/transformers/filters/defaults.js +78 -0
- package/dist/transformers/filters/defaults.js.map +1 -0
- package/dist/transformers/filters/index.d.ts +43 -0
- package/dist/transformers/filters/index.d.ts.map +1 -0
- package/dist/transformers/filters/index.js +89 -0
- package/dist/transformers/filters/index.js.map +1 -0
- package/dist/transformers/format.d.ts +22 -0
- package/dist/transformers/format.d.ts.map +1 -0
- package/dist/transformers/format.js +30 -0
- package/dist/transformers/format.js.map +1 -0
- package/dist/transformers/{index.d.mts → index.d.ts} +14 -11
- package/dist/transformers/index.d.ts.map +1 -0
- package/dist/transformers/index.js +133 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/inlineCss.d.ts +84 -0
- package/dist/transformers/inlineCss.d.ts.map +1 -0
- package/dist/transformers/inlineCss.js +91 -0
- package/dist/transformers/inlineCss.js.map +1 -0
- package/dist/transformers/inlineLink.d.ts +35 -0
- package/dist/transformers/inlineLink.d.ts.map +1 -0
- package/dist/transformers/{inlineLink.mjs → inlineLink.js} +34 -10
- package/dist/transformers/inlineLink.js.map +1 -0
- package/dist/transformers/minify.d.ts +21 -0
- package/dist/transformers/minify.d.ts.map +1 -0
- package/dist/transformers/minify.js +25 -0
- package/dist/transformers/minify.js.map +1 -0
- package/dist/transformers/msoPlaceholders.d.ts +28 -0
- package/dist/transformers/msoPlaceholders.d.ts.map +1 -0
- package/dist/transformers/msoPlaceholders.js +88 -0
- package/dist/transformers/msoPlaceholders.js.map +1 -0
- package/dist/transformers/purgeCss.d.ts +43 -0
- package/dist/transformers/purgeCss.d.ts.map +1 -0
- package/dist/transformers/purgeCss.js +181 -0
- package/dist/transformers/purgeCss.js.map +1 -0
- package/dist/transformers/removeAttributes.d.ts +54 -0
- package/dist/transformers/removeAttributes.d.ts.map +1 -0
- package/dist/transformers/removeAttributes.js +70 -0
- package/dist/transformers/removeAttributes.js.map +1 -0
- package/dist/transformers/{replaceStrings.d.mts → replaceStrings.d.ts} +2 -2
- package/dist/transformers/replaceStrings.d.ts.map +1 -0
- package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +2 -2
- package/dist/transformers/replaceStrings.js.map +1 -0
- package/dist/transformers/{safeClassNames.d.mts → safeClassNames.d.ts} +2 -2
- package/dist/transformers/safeClassNames.d.ts.map +1 -0
- package/dist/transformers/{safeClassNames.mjs → safeClassNames.js} +4 -5
- package/dist/transformers/safeClassNames.js.map +1 -0
- package/dist/transformers/shorthandCss.d.ts +47 -0
- package/dist/transformers/shorthandCss.d.ts.map +1 -0
- package/dist/transformers/shorthandCss.js +61 -0
- package/dist/transformers/shorthandCss.js.map +1 -0
- package/dist/transformers/sixHex.d.ts +25 -0
- package/dist/transformers/sixHex.d.ts.map +1 -0
- package/dist/transformers/sixHex.js +42 -0
- package/dist/transformers/sixHex.js.map +1 -0
- package/dist/transformers/tailwindComponent.d.ts +16 -0
- package/dist/transformers/tailwindComponent.d.ts.map +1 -0
- package/dist/transformers/tailwindComponent.js +92 -0
- package/dist/transformers/tailwindComponent.js.map +1 -0
- package/dist/transformers/{tailwindcss.d.mts → tailwindcss.d.ts} +8 -4
- package/dist/transformers/tailwindcss.d.ts.map +1 -0
- package/dist/transformers/tailwindcss.js +97 -0
- package/dist/transformers/tailwindcss.js.map +1 -0
- package/dist/transformers/urlQuery.d.ts +36 -0
- package/dist/transformers/urlQuery.d.ts.map +1 -0
- package/dist/transformers/urlQuery.js +77 -0
- package/dist/transformers/urlQuery.js.map +1 -0
- package/dist/types/config.d.ts +727 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/ast/index.d.ts +4 -0
- package/dist/utils/ast/index.js +4 -0
- package/dist/utils/ast/{parser.d.mts → parser.d.ts} +1 -1
- package/dist/utils/ast/parser.d.ts.map +1 -0
- package/dist/utils/ast/{parser.mjs → parser.js} +2 -3
- package/dist/utils/ast/parser.js.map +1 -0
- package/dist/utils/ast/serializer.d.ts +8 -0
- package/dist/utils/ast/serializer.d.ts.map +1 -0
- package/dist/utils/ast/serializer.js +36 -0
- package/dist/utils/ast/serializer.js.map +1 -0
- package/dist/utils/ast/{walker.d.mts → walker.d.ts} +1 -1
- package/dist/utils/ast/walker.d.ts.map +1 -0
- package/dist/utils/ast/{walker.mjs → walker.js} +2 -2
- package/dist/utils/ast/walker.js.map +1 -0
- package/dist/utils/compileTailwindCss.d.ts +16 -0
- package/dist/utils/compileTailwindCss.d.ts.map +1 -0
- package/dist/utils/compileTailwindCss.js +54 -0
- package/dist/utils/compileTailwindCss.js.map +1 -0
- package/dist/utils/componentSources.d.ts +50 -0
- package/dist/utils/componentSources.d.ts.map +1 -0
- package/dist/utils/componentSources.js +50 -0
- package/dist/utils/componentSources.js.map +1 -0
- package/dist/utils/decodeStyleEntities.d.ts +15 -0
- package/dist/utils/decodeStyleEntities.d.ts.map +1 -0
- package/dist/utils/decodeStyleEntities.js +18 -0
- package/dist/utils/decodeStyleEntities.js.map +1 -0
- package/dist/utils/detect.d.ts +5 -0
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/detect.js +10 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/output-markers.d.ts +29 -0
- package/dist/utils/output-markers.d.ts.map +1 -0
- package/dist/utils/output-markers.js +68 -0
- package/dist/utils/output-markers.js.map +1 -0
- package/dist/utils/{url.d.mts → url.d.ts} +1 -1
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/{url.mjs → url.js} +2 -3
- package/dist/utils/url.js.map +1 -0
- package/node_modules/@clack/core/CHANGELOG.md +8 -0
- package/node_modules/@clack/core/dist/index.d.mts +18 -4
- package/node_modules/@clack/core/dist/index.mjs +16 -10
- package/node_modules/@clack/core/dist/index.mjs.map +1 -1
- package/node_modules/@clack/core/package.json +5 -2
- package/node_modules/@clack/prompts/CHANGELOG.md +15 -0
- package/node_modules/@clack/prompts/README.md +107 -2
- package/node_modules/@clack/prompts/dist/index.d.mts +16 -11
- package/node_modules/@clack/prompts/dist/index.mjs +114 -107
- package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
- package/node_modules/@clack/prompts/package.json +7 -4
- package/node_modules/fast-string-truncated-width/dist/index.js +36 -96
- package/node_modules/fast-string-truncated-width/dist/types.d.ts +0 -3
- package/node_modules/fast-string-truncated-width/dist/utils.d.ts +3 -3
- package/node_modules/fast-string-truncated-width/dist/utils.js +14 -9
- package/node_modules/fast-string-truncated-width/package.json +1 -1
- package/node_modules/fast-string-truncated-width/readme.md +2 -3
- package/node_modules/fast-string-width/package.json +2 -2
- package/node_modules/fast-string-width/readme.md +0 -3
- package/node_modules/fast-wrap-ansi/lib/main.js +4 -1
- package/node_modules/fast-wrap-ansi/lib/main.js.map +1 -1
- package/node_modules/fast-wrap-ansi/package.json +2 -2
- package/node_modules/maizzle/README.md +24 -0
- package/node_modules/maizzle/dist/commands/make/component.mjs +1 -1
- package/node_modules/maizzle/dist/commands/make/config.mjs +1 -1
- package/node_modules/maizzle/dist/commands/make/layout.mjs +3 -3
- package/node_modules/maizzle/dist/commands/make/scaffold.mjs +1 -1
- package/node_modules/maizzle/dist/commands/make/stubs/Layout.vue +146 -0
- package/node_modules/maizzle/dist/commands/make/stubs/component.vue +2 -4
- package/node_modules/maizzle/dist/commands/make/stubs/config.ts +1 -5
- package/node_modules/maizzle/dist/commands/make/template.mjs +1 -1
- package/node_modules/maizzle/dist/commands/new.mjs +32 -52
- package/node_modules/maizzle/dist/index.d.mts +1 -0
- package/node_modules/maizzle/dist/index.mjs +30 -7
- package/node_modules/maizzle/package.json +4 -3
- package/node_modules/nypm/dist/cli.mjs +28 -5
- package/node_modules/nypm/dist/index.d.mts +0 -8
- package/node_modules/nypm/dist/index.mjs +27 -4
- package/node_modules/nypm/package.json +12 -12
- package/node_modules/tinyexec/README.md +1 -1
- package/node_modules/tinyexec/dist/main.d.mts +6 -6
- package/node_modules/tinyexec/dist/main.mjs +126 -134
- package/node_modules/tinyexec/package.json +9 -9
- package/package.json +31 -21
- package/dist/build.d.mts +0 -19
- package/dist/build.d.mts.map +0 -1
- package/dist/build.mjs.map +0 -1
- package/dist/components/Divider.vue +0 -105
- package/dist/components/Vml.vue +0 -89
- package/dist/components/utils.d.mts +0 -5
- package/dist/components/utils.d.mts.map +0 -1
- package/dist/components/utils.mjs +0 -9
- package/dist/components/utils.mjs.map +0 -1
- package/dist/composables/defineConfig.d.mts.map +0 -1
- package/dist/composables/defineConfig.mjs.map +0 -1
- package/dist/composables/renderContext.d.mts +0 -19
- package/dist/composables/renderContext.d.mts.map +0 -1
- package/dist/composables/renderContext.mjs.map +0 -1
- package/dist/composables/useConfig.d.mts.map +0 -1
- package/dist/composables/useConfig.mjs.map +0 -1
- package/dist/composables/useDoctype.d.mts.map +0 -1
- package/dist/composables/useDoctype.mjs.map +0 -1
- package/dist/composables/useEvent.d.mts.map +0 -1
- package/dist/composables/useEvent.mjs.map +0 -1
- package/dist/composables/usePlaintext.d.mts.map +0 -1
- package/dist/composables/usePlaintext.mjs.map +0 -1
- package/dist/config/defaults.d.mts.map +0 -1
- package/dist/config/defaults.mjs.map +0 -1
- package/dist/config/index.d.mts.map +0 -1
- package/dist/config/index.mjs.map +0 -1
- package/dist/events/index.d.mts.map +0 -1
- package/dist/events/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -29
- package/dist/index.mjs +0 -29
- package/dist/plaintext.d.mts.map +0 -1
- package/dist/plaintext.mjs.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/plugin.mjs +0 -41
- package/dist/plugin.mjs.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
- package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
- package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.mjs +0 -35
- package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
- package/dist/render/createRenderer.d.mts.map +0 -1
- package/dist/render/createRenderer.mjs +0 -155
- package/dist/render/createRenderer.mjs.map +0 -1
- package/dist/render/index.d.mts +0 -26
- package/dist/render/index.d.mts.map +0 -1
- package/dist/render/index.mjs +0 -44
- package/dist/render/index.mjs.map +0 -1
- package/dist/serve.d.mts.map +0 -1
- package/dist/serve.mjs.map +0 -1
- package/dist/server/compatibility.d.mts +0 -6
- package/dist/server/compatibility.d.mts.map +0 -1
- package/dist/server/compatibility.mjs +0 -83
- package/dist/server/compatibility.mjs.map +0 -1
- package/dist/server/linter.d.mts +0 -6
- package/dist/server/linter.d.mts.map +0 -1
- package/dist/server/linter.mjs +0 -200
- package/dist/server/linter.mjs.map +0 -1
- package/dist/server/ui/components/ui/resizable/ResizableHandle.vue +0 -30
- package/dist/server/ui/components/ui/resizable/ResizablePanel.vue +0 -21
- package/dist/server/ui/components/ui/resizable/ResizablePanelGroup.vue +0 -25
- package/dist/server/ui/components/ui/resizable/index.ts +0 -3
- package/dist/transformers/addAttributes.d.mts.map +0 -1
- package/dist/transformers/addAttributes.mjs.map +0 -1
- package/dist/transformers/attributeToStyle.d.mts +0 -25
- package/dist/transformers/attributeToStyle.d.mts.map +0 -1
- package/dist/transformers/attributeToStyle.mjs +0 -80
- package/dist/transformers/attributeToStyle.mjs.map +0 -1
- package/dist/transformers/base.d.mts +0 -8
- package/dist/transformers/base.d.mts.map +0 -1
- package/dist/transformers/base.mjs.map +0 -1
- package/dist/transformers/entities.d.mts +0 -8
- package/dist/transformers/entities.d.mts.map +0 -1
- package/dist/transformers/entities.mjs +0 -38
- package/dist/transformers/entities.mjs.map +0 -1
- package/dist/transformers/format.d.mts +0 -15
- package/dist/transformers/format.d.mts.map +0 -1
- package/dist/transformers/format.mjs +0 -26
- package/dist/transformers/format.mjs.map +0 -1
- package/dist/transformers/index.d.mts.map +0 -1
- package/dist/transformers/index.mjs +0 -73
- package/dist/transformers/index.mjs.map +0 -1
- package/dist/transformers/inlineCSS.d.mts +0 -30
- package/dist/transformers/inlineCSS.d.mts.map +0 -1
- package/dist/transformers/inlineCSS.mjs +0 -79
- package/dist/transformers/inlineCSS.mjs.map +0 -1
- package/dist/transformers/inlineLink.d.mts +0 -14
- package/dist/transformers/inlineLink.d.mts.map +0 -1
- package/dist/transformers/inlineLink.mjs.map +0 -1
- package/dist/transformers/minify.d.mts +0 -17
- package/dist/transformers/minify.d.mts.map +0 -1
- package/dist/transformers/minify.mjs +0 -24
- package/dist/transformers/minify.mjs.map +0 -1
- package/dist/transformers/purgeCSS.d.mts +0 -23
- package/dist/transformers/purgeCSS.d.mts.map +0 -1
- package/dist/transformers/purgeCSS.mjs +0 -66
- package/dist/transformers/purgeCSS.mjs.map +0 -1
- package/dist/transformers/removeAttributes.d.mts +0 -31
- package/dist/transformers/removeAttributes.d.mts.map +0 -1
- package/dist/transformers/removeAttributes.mjs +0 -63
- package/dist/transformers/removeAttributes.mjs.map +0 -1
- package/dist/transformers/replaceStrings.d.mts.map +0 -1
- package/dist/transformers/replaceStrings.mjs.map +0 -1
- package/dist/transformers/safeClassNames.d.mts.map +0 -1
- package/dist/transformers/safeClassNames.mjs.map +0 -1
- package/dist/transformers/shorthandCSS.d.mts +0 -24
- package/dist/transformers/shorthandCSS.d.mts.map +0 -1
- package/dist/transformers/shorthandCSS.mjs +0 -48
- package/dist/transformers/shorthandCSS.mjs.map +0 -1
- package/dist/transformers/tailwindcss.d.mts.map +0 -1
- package/dist/transformers/tailwindcss.mjs +0 -136
- package/dist/transformers/tailwindcss.mjs.map +0 -1
- package/dist/transformers/urlQuery.d.mts +0 -24
- package/dist/transformers/urlQuery.d.mts.map +0 -1
- package/dist/transformers/urlQuery.mjs +0 -65
- package/dist/transformers/urlQuery.mjs.map +0 -1
- package/dist/types/config.d.mts +0 -149
- package/dist/types/config.d.mts.map +0 -1
- package/dist/types/config.mjs +0 -1
- package/dist/types/index.d.mts +0 -2
- package/dist/types/index.mjs +0 -1
- package/dist/utils/ast/index.d.mts +0 -4
- package/dist/utils/ast/index.mjs +0 -5
- package/dist/utils/ast/parser.d.mts.map +0 -1
- package/dist/utils/ast/parser.mjs.map +0 -1
- package/dist/utils/ast/serializer.d.mts +0 -7
- package/dist/utils/ast/serializer.d.mts.map +0 -1
- package/dist/utils/ast/serializer.mjs +0 -13
- package/dist/utils/ast/serializer.mjs.map +0 -1
- package/dist/utils/ast/walker.d.mts.map +0 -1
- package/dist/utils/ast/walker.mjs.map +0 -1
- package/dist/utils/url.d.mts.map +0 -1
- package/dist/utils/url.mjs.map +0 -1
- package/node_modules/maizzle/dist/commands/make/stubs/layout.vue +0 -39
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
import { resolveConfig } from "./config/index.
|
|
2
|
-
import { runTransformers } from "./transformers/index.
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { resolveConfig } from "./config/index.js";
|
|
2
|
+
import { runTransformers } from "./transformers/index.js";
|
|
3
|
+
import { normalizeComponentSources } from "./utils/componentSources.js";
|
|
4
|
+
import { createRenderer } from "./render/createRenderer.js";
|
|
5
|
+
import { createPlaintext } from "./plaintext.js";
|
|
6
|
+
import { stripForHtml, stripForPlaintext } from "./utils/output-markers.js";
|
|
7
|
+
import { setActiveRenderer } from "./render/active.js";
|
|
8
|
+
import { serveLint } from "./server/linter.js";
|
|
9
|
+
import { serveCompatibility } from "./server/compatibility.js";
|
|
10
|
+
import { sendEmail } from "./server/email.js";
|
|
7
11
|
import { createRequire } from "node:module";
|
|
8
12
|
import { readFileSync } from "node:fs";
|
|
9
|
-
import { basename, dirname, resolve } from "node:path";
|
|
13
|
+
import { basename, dirname, matchesGlob, resolve } from "node:path";
|
|
10
14
|
import { glob } from "tinyglobby";
|
|
11
15
|
import { fileURLToPath } from "node:url";
|
|
12
16
|
import { createLogger, createServer } from "vite";
|
|
13
17
|
import vue from "@vitejs/plugin-vue";
|
|
18
|
+
import { renderUnicodeCompact } from "uqr";
|
|
14
19
|
import tailwindcss from "@tailwindcss/vite";
|
|
15
20
|
import { createHighlighter } from "shiki";
|
|
16
|
-
|
|
17
21
|
//#region src/serve.ts
|
|
18
22
|
const devUIDir = resolve(dirname(fileURLToPath(import.meta.url)), "server/ui");
|
|
19
23
|
const require = createRequire(import.meta.url);
|
|
20
|
-
const
|
|
21
|
-
const
|
|
24
|
+
const pkg = (name) => {
|
|
25
|
+
const resolved = require.resolve(name).replace(/\\/g, "/");
|
|
26
|
+
const marker = `node_modules/${name}`;
|
|
27
|
+
const idx = resolved.lastIndexOf(marker);
|
|
28
|
+
return resolved.slice(0, idx + marker.length);
|
|
29
|
+
};
|
|
22
30
|
/**
|
|
23
31
|
* Start the Maizzle dev server.
|
|
24
32
|
*
|
|
@@ -31,13 +39,15 @@ const vuePkgDir = dirname(require.resolve("vue/package.json"));
|
|
|
31
39
|
async function serve(options = {}) {
|
|
32
40
|
const start = performance.now();
|
|
33
41
|
let config = await resolveConfig(options.config);
|
|
34
|
-
const port = config.server?.port ?? 3e3;
|
|
35
|
-
|
|
42
|
+
const port = options.port ?? config.server?.port ?? 3e3;
|
|
43
|
+
let renderer = await createRenderer({
|
|
36
44
|
dts: true,
|
|
37
45
|
markdown: config.markdown,
|
|
38
46
|
root: config.root,
|
|
39
|
-
componentDirs:
|
|
47
|
+
componentDirs: normalizeComponentSources(config.components?.source, process.cwd()),
|
|
48
|
+
vite: config.vite
|
|
40
49
|
});
|
|
50
|
+
setActiveRenderer(renderer);
|
|
41
51
|
const server = await createServer({
|
|
42
52
|
configFile: false,
|
|
43
53
|
plugins: [
|
|
@@ -54,40 +64,23 @@ async function serve(options = {}) {
|
|
|
54
64
|
},
|
|
55
65
|
{
|
|
56
66
|
find: "vue",
|
|
57
|
-
replacement: resolve(
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
find: "vue-router",
|
|
61
|
-
replacement: resolve(frameworkNodeModules, "vue-router")
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
find: "reka-ui",
|
|
65
|
-
replacement: resolve(frameworkNodeModules, "reka-ui")
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
find: "@vueuse/core",
|
|
69
|
-
replacement: resolve(frameworkNodeModules, "@vueuse/core")
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
find: "@vueuse/shared",
|
|
73
|
-
replacement: resolve(frameworkNodeModules, "@vueuse/shared")
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
find: "lucide-vue-next",
|
|
77
|
-
replacement: resolve(frameworkNodeModules, "lucide-vue-next")
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
find: "class-variance-authority",
|
|
81
|
-
replacement: resolve(frameworkNodeModules, "class-variance-authority")
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
find: "clsx",
|
|
85
|
-
replacement: resolve(frameworkNodeModules, "clsx")
|
|
67
|
+
replacement: resolve(pkg("vue"), "dist/vue.runtime.esm-bundler.js")
|
|
86
68
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
69
|
+
...[
|
|
70
|
+
"vue-router",
|
|
71
|
+
"reka-ui",
|
|
72
|
+
"@vueuse/core",
|
|
73
|
+
"@vueuse/shared",
|
|
74
|
+
"lucide-vue-next",
|
|
75
|
+
"class-variance-authority",
|
|
76
|
+
"clsx",
|
|
77
|
+
"tailwind-merge",
|
|
78
|
+
"culori",
|
|
79
|
+
"postcss-safe-parser"
|
|
80
|
+
].map((name) => ({
|
|
81
|
+
find: name,
|
|
82
|
+
replacement: pkg(name)
|
|
83
|
+
}))
|
|
91
84
|
]
|
|
92
85
|
},
|
|
93
86
|
cacheDir: resolve(devUIDir, ".vite"),
|
|
@@ -102,7 +95,9 @@ async function serve(options = {}) {
|
|
|
102
95
|
"reka-ui",
|
|
103
96
|
"class-variance-authority",
|
|
104
97
|
"clsx",
|
|
105
|
-
"tailwind-merge"
|
|
98
|
+
"tailwind-merge",
|
|
99
|
+
"culori",
|
|
100
|
+
"postcss-safe-parser"
|
|
106
101
|
]
|
|
107
102
|
},
|
|
108
103
|
server: {
|
|
@@ -112,13 +107,26 @@ async function serve(options = {}) {
|
|
|
112
107
|
process.cwd(),
|
|
113
108
|
config.root ?? process.cwd(),
|
|
114
109
|
devUIDir,
|
|
115
|
-
|
|
110
|
+
...[
|
|
111
|
+
"vue",
|
|
112
|
+
"vue-router",
|
|
113
|
+
"reka-ui",
|
|
114
|
+
"@vueuse/core",
|
|
115
|
+
"@vueuse/shared",
|
|
116
|
+
"lucide-vue-next",
|
|
117
|
+
"class-variance-authority",
|
|
118
|
+
"clsx",
|
|
119
|
+
"tailwind-merge",
|
|
120
|
+
"culori",
|
|
121
|
+
"postcss-safe-parser"
|
|
122
|
+
].map(pkg)
|
|
116
123
|
] }
|
|
117
124
|
},
|
|
118
125
|
customLogger: customLogger()
|
|
119
126
|
});
|
|
120
127
|
const originalClose = server.close.bind(server);
|
|
121
128
|
server.close = async () => {
|
|
129
|
+
setActiveRenderer(null);
|
|
122
130
|
await renderer.close();
|
|
123
131
|
return originalClose();
|
|
124
132
|
};
|
|
@@ -146,26 +154,50 @@ function maizzleDevPlugin(config, renderer, configInput) {
|
|
|
146
154
|
"maizzle.config.js",
|
|
147
155
|
"maizzle.config.ts",
|
|
148
156
|
"tailwind.config.js",
|
|
149
|
-
"tailwind.config.ts"
|
|
157
|
+
"tailwind.config.ts",
|
|
158
|
+
"locales/**"
|
|
150
159
|
];
|
|
151
160
|
const userWatchPaths = config.server?.watch ?? [];
|
|
152
161
|
const watchPaths = [...defaultWatchPaths, ...userWatchPaths];
|
|
162
|
+
const isWatchedFile = (file) => watchPaths.some((p) => matchesGlob(file, p));
|
|
153
163
|
for (const watchPath of watchPaths) server.watcher.add(watchPath);
|
|
154
|
-
server.watcher.on("add", (file) => {
|
|
155
|
-
if (isTemplateFile(file))
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
164
|
+
server.watcher.on("add", async (file) => {
|
|
165
|
+
if (isTemplateFile(file)) {
|
|
166
|
+
await renderer.invalidateAll();
|
|
167
|
+
server.ws.send({
|
|
168
|
+
type: "custom",
|
|
169
|
+
event: "maizzle:templates-changed"
|
|
170
|
+
});
|
|
171
|
+
}
|
|
159
172
|
});
|
|
160
|
-
server.watcher.on("unlink", (file) => {
|
|
161
|
-
if (isTemplateFile(file))
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
173
|
+
server.watcher.on("unlink", async (file) => {
|
|
174
|
+
if (isTemplateFile(file)) {
|
|
175
|
+
await renderer.invalidateAll();
|
|
176
|
+
server.ws.send({
|
|
177
|
+
type: "custom",
|
|
178
|
+
event: "maizzle:templates-changed"
|
|
179
|
+
});
|
|
180
|
+
}
|
|
165
181
|
});
|
|
166
182
|
server.watcher.on("change", async (file) => {
|
|
167
|
-
if (
|
|
168
|
-
|
|
183
|
+
if (isWatchedFile(file)) {
|
|
184
|
+
config = await resolveConfig(configInput);
|
|
185
|
+
await renderer.close();
|
|
186
|
+
renderer = await createRenderer({
|
|
187
|
+
dts: true,
|
|
188
|
+
markdown: config.markdown,
|
|
189
|
+
root: config.root,
|
|
190
|
+
componentDirs: normalizeComponentSources(config.components?.source, process.cwd()),
|
|
191
|
+
vite: config.vite
|
|
192
|
+
});
|
|
193
|
+
server.ws.send({
|
|
194
|
+
type: "custom",
|
|
195
|
+
event: "maizzle:config-updated",
|
|
196
|
+
data: buildUiConfig(config)
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
await renderer.invalidateAll();
|
|
200
|
+
if (isTemplateFile(file) || isWatchedFile(file)) server.ws.send({
|
|
169
201
|
type: "custom",
|
|
170
202
|
event: "maizzle:template-updated",
|
|
171
203
|
data: { file }
|
|
@@ -176,16 +208,18 @@ function maizzleDevPlugin(config, renderer, configInput) {
|
|
|
176
208
|
if (url === "/__maizzle/templates") return serveTemplateList(config, res);
|
|
177
209
|
if (url.startsWith("/__maizzle/render/")) return await serveRenderedTemplate(url, config, renderer, res);
|
|
178
210
|
if (url.startsWith("/__maizzle/source/")) return await serveHighlightedSource(url, config, renderer, res);
|
|
179
|
-
if (url.startsWith("/__maizzle/compatibility/")) return await serveCompatibility(url, config,
|
|
180
|
-
if (url.startsWith("/__maizzle/lint/")) return await serveLint(url, config,
|
|
211
|
+
if (url.startsWith("/__maizzle/compatibility/")) return await serveCompatibility(url, res, config, normalizeComponentSources(config.components?.source, process.cwd()));
|
|
212
|
+
if (url.startsWith("/__maizzle/lint/")) return await serveLint(url, res, config, normalizeComponentSources(config.components?.source, process.cwd()));
|
|
181
213
|
if (url.startsWith("/__maizzle/vue-source/")) return await serveVueSource(url, config, res);
|
|
182
214
|
if (url.startsWith("/__maizzle/plaintext/")) return await servePlaintext(url, config, renderer, res);
|
|
183
215
|
if (url.startsWith("/__maizzle/stats/")) return await serveStats(url, config, renderer, res);
|
|
216
|
+
if (url.startsWith("/__maizzle/email/") && req.method === "POST") return await serveEmailEndpoint(url, req, res, config, renderer);
|
|
217
|
+
if (url === "/__maizzle/email-config") return serveEmailConfig(config, res);
|
|
184
218
|
next();
|
|
185
219
|
});
|
|
186
220
|
return () => {
|
|
187
221
|
server.middlewares.use(async (req, res, next) => {
|
|
188
|
-
if (isNavigationRequest(req)) return await serveDevUI(server, res, req.url || "/");
|
|
222
|
+
if (isNavigationRequest(req)) return await serveDevUI(server, res, req.url || "/", config);
|
|
189
223
|
next();
|
|
190
224
|
});
|
|
191
225
|
};
|
|
@@ -199,10 +233,20 @@ function isNavigationRequest(req) {
|
|
|
199
233
|
const accept = req.headers?.accept || "";
|
|
200
234
|
return req.method === "GET" && accept.includes("text/html");
|
|
201
235
|
}
|
|
202
|
-
|
|
236
|
+
/**
|
|
237
|
+
* Shape exposed to the dev UI both at initial HTML load (as
|
|
238
|
+
* `window.__MAIZZLE_CONFIG__`) and on the `maizzle:config-updated` HMR event.
|
|
239
|
+
* Add UI-visible config bits here; consumers on both ends pick up automatically.
|
|
240
|
+
*/
|
|
241
|
+
function buildUiConfig(config) {
|
|
242
|
+
return { checks: config.server?.checks ?? true };
|
|
243
|
+
}
|
|
244
|
+
async function serveDevUI(server, res, url, config) {
|
|
203
245
|
let indexHtml = readFileSync(resolve(devUIDir, "index.html"), "utf-8");
|
|
204
246
|
indexHtml = indexHtml.replace("./main.ts", `/@fs/${resolve(devUIDir, "main.ts")}`);
|
|
205
247
|
indexHtml = indexHtml.replace("./favicon.svg", `/@fs/${resolve(devUIDir, "favicon.svg")}`);
|
|
248
|
+
const configScript = `<script>window.__MAIZZLE_CONFIG__ = ${JSON.stringify(buildUiConfig(config))};<\/script>`;
|
|
249
|
+
indexHtml = indexHtml.replace("</head>", `${configScript}</head>`);
|
|
206
250
|
const transformed = await server.transformIndexHtml(url, indexHtml);
|
|
207
251
|
res.setHeader("Content-Type", "text/html");
|
|
208
252
|
res.end(transformed);
|
|
@@ -229,14 +273,15 @@ async function serveRenderedTemplate(url, config, renderer, res) {
|
|
|
229
273
|
}
|
|
230
274
|
try {
|
|
231
275
|
const absolutePath = resolve(match);
|
|
232
|
-
await renderer.
|
|
276
|
+
await renderer.invalidateAll();
|
|
233
277
|
const rendered = await renderer.render(absolutePath, config);
|
|
234
278
|
let html = rendered.html;
|
|
235
279
|
const templateConfig = rendered.templateConfig;
|
|
236
|
-
|
|
237
|
-
html =
|
|
280
|
+
const doctype = rendered.doctype ?? templateConfig.doctype ?? "<!DOCTYPE html>";
|
|
281
|
+
html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks);
|
|
282
|
+
html = `${doctype}\n${html}`;
|
|
238
283
|
res.setHeader("Content-Type", "text/html");
|
|
239
|
-
res.end(html);
|
|
284
|
+
res.end(stripForHtml(html));
|
|
240
285
|
} catch (error) {
|
|
241
286
|
res.statusCode = 500;
|
|
242
287
|
res.end(`<pre>${error.stack || error.message}</pre>`);
|
|
@@ -260,12 +305,13 @@ async function serveHighlightedSource(url, config, renderer, res) {
|
|
|
260
305
|
}
|
|
261
306
|
try {
|
|
262
307
|
const absolutePath = resolve(match);
|
|
263
|
-
await renderer.
|
|
308
|
+
await renderer.invalidateAll();
|
|
264
309
|
const rendered = await renderer.render(absolutePath, config);
|
|
265
310
|
let html = rendered.html;
|
|
266
311
|
const templateConfig = rendered.templateConfig;
|
|
267
|
-
|
|
268
|
-
html =
|
|
312
|
+
const doctype = rendered.doctype ?? templateConfig.doctype ?? "<!DOCTYPE html>";
|
|
313
|
+
html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks);
|
|
314
|
+
html = stripForHtml(`${doctype}\n${html}`);
|
|
269
315
|
const highlighted = (await getHighlighter()).codeToHtml(html, {
|
|
270
316
|
lang: "html",
|
|
271
317
|
theme: "laserwave",
|
|
@@ -315,12 +361,13 @@ async function servePlaintext(url, config, renderer, res) {
|
|
|
315
361
|
}
|
|
316
362
|
try {
|
|
317
363
|
const absolutePath = resolve(match);
|
|
318
|
-
await renderer.
|
|
364
|
+
await renderer.invalidateAll();
|
|
319
365
|
const rendered = await renderer.render(absolutePath, config);
|
|
320
366
|
let html = rendered.html;
|
|
321
367
|
const templateConfig = rendered.templateConfig;
|
|
322
|
-
|
|
323
|
-
|
|
368
|
+
const doctype = rendered.doctype ?? templateConfig.doctype ?? "<!DOCTYPE html>";
|
|
369
|
+
html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks);
|
|
370
|
+
const plaintext = createPlaintext(stripForPlaintext(html));
|
|
324
371
|
res.setHeader("Content-Type", "text/plain");
|
|
325
372
|
res.end(plaintext);
|
|
326
373
|
} catch (error) {
|
|
@@ -359,11 +406,13 @@ async function serveStats(url, config, renderer, res) {
|
|
|
359
406
|
}
|
|
360
407
|
try {
|
|
361
408
|
const absolutePath = resolve(match);
|
|
362
|
-
await renderer.
|
|
409
|
+
await renderer.invalidateAll();
|
|
363
410
|
const rendered = await renderer.render(absolutePath, config);
|
|
364
411
|
let html = rendered.html;
|
|
365
412
|
const templateConfig = rendered.templateConfig;
|
|
366
|
-
|
|
413
|
+
const doctype = rendered.doctype ?? templateConfig.doctype ?? "<!DOCTYPE html>";
|
|
414
|
+
html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks);
|
|
415
|
+
html = stripForHtml(html);
|
|
367
416
|
const sizeBytes = Buffer.byteLength(html, "utf-8");
|
|
368
417
|
const totalImages = (html.match(/<img\b[^>]*>/gi) || []).length + (html.match(/url\s*\([^)]+\)/gi) || []).length;
|
|
369
418
|
const links = (html.match(/<a\b[^>]*href\s*=/gi) || []).length;
|
|
@@ -381,9 +430,84 @@ async function serveStats(url, config, renderer, res) {
|
|
|
381
430
|
res.end(JSON.stringify({ error: error.message }));
|
|
382
431
|
}
|
|
383
432
|
}
|
|
433
|
+
async function serveEmailEndpoint(url, req, res, config, renderer) {
|
|
434
|
+
const templateSlug = url.replace("/__maizzle/email/", "").replace(/\?.*$/, "");
|
|
435
|
+
const match = (await glob(config.content ?? ["emails/**/*.vue"])).find((t) => t.replace(/\.(vue|md)$/, "") === templateSlug);
|
|
436
|
+
if (!match) {
|
|
437
|
+
res.statusCode = 404;
|
|
438
|
+
res.end(JSON.stringify({
|
|
439
|
+
success: false,
|
|
440
|
+
message: "Template not found"
|
|
441
|
+
}));
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
let body = "";
|
|
445
|
+
for await (const chunk of req) body += chunk;
|
|
446
|
+
let payload;
|
|
447
|
+
try {
|
|
448
|
+
payload = JSON.parse(body);
|
|
449
|
+
} catch {
|
|
450
|
+
res.statusCode = 400;
|
|
451
|
+
res.end(JSON.stringify({
|
|
452
|
+
success: false,
|
|
453
|
+
message: "Invalid JSON"
|
|
454
|
+
}));
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
if (!payload.to?.length) {
|
|
458
|
+
res.statusCode = 400;
|
|
459
|
+
res.end(JSON.stringify({
|
|
460
|
+
success: false,
|
|
461
|
+
message: "Missing recipients"
|
|
462
|
+
}));
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
try {
|
|
466
|
+
const absolutePath = resolve(match);
|
|
467
|
+
await renderer.invalidateAll();
|
|
468
|
+
const rendered = await renderer.render(absolutePath, config);
|
|
469
|
+
let html = rendered.html;
|
|
470
|
+
const templateConfig = rendered.templateConfig;
|
|
471
|
+
const doctype = rendered.doctype ?? templateConfig.doctype ?? "<!DOCTYPE html>";
|
|
472
|
+
html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks);
|
|
473
|
+
html = `${doctype}\n${html}`;
|
|
474
|
+
const text = createPlaintext(stripForPlaintext(html));
|
|
475
|
+
html = stripForHtml(html);
|
|
476
|
+
const result = await sendEmail({
|
|
477
|
+
to: payload.to,
|
|
478
|
+
subject: payload.subject,
|
|
479
|
+
html,
|
|
480
|
+
text
|
|
481
|
+
}, config, templateConfig);
|
|
482
|
+
res.setHeader("Content-Type", "application/json");
|
|
483
|
+
res.end(JSON.stringify(result));
|
|
484
|
+
} catch (error) {
|
|
485
|
+
res.statusCode = 500;
|
|
486
|
+
res.end(JSON.stringify({
|
|
487
|
+
success: false,
|
|
488
|
+
message: error.message
|
|
489
|
+
}));
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function serveEmailConfig(config, res) {
|
|
493
|
+
const emailConfig = config.server?.email;
|
|
494
|
+
res.setHeader("Content-Type", "application/json");
|
|
495
|
+
res.end(JSON.stringify({
|
|
496
|
+
to: emailConfig?.to ? Array.isArray(emailConfig.to) ? emailConfig.to : [emailConfig.to] : [],
|
|
497
|
+
from: emailConfig?.from ?? "",
|
|
498
|
+
subject: emailConfig?.subject ?? "",
|
|
499
|
+
hasTransport: !!emailConfig?.transport
|
|
500
|
+
}));
|
|
501
|
+
}
|
|
384
502
|
function printBanner(server, startupTime) {
|
|
385
503
|
const info = server.config.logger.info;
|
|
386
504
|
const time = startupTime ?? server._maizzleStartupTime;
|
|
505
|
+
const networkUrl = server.resolvedUrls?.network[0];
|
|
506
|
+
if (networkUrl) {
|
|
507
|
+
const qr = renderUnicodeCompact(networkUrl, { border: 1 });
|
|
508
|
+
info("");
|
|
509
|
+
info(qr.split("\n").map((line) => ` ${line}`).join("\n"));
|
|
510
|
+
}
|
|
387
511
|
info("");
|
|
388
512
|
info(` \x1b[32m\x1b[1mMAIZZLE\x1b[0m\x1b[32m v6.0.0\x1b[0m \x1b[2mready in\x1b[0m \x1b[1m${time}\x1b[0m ms`);
|
|
389
513
|
info("");
|
|
@@ -399,7 +523,7 @@ function customLogger() {
|
|
|
399
523
|
};
|
|
400
524
|
return logger;
|
|
401
525
|
}
|
|
402
|
-
|
|
403
526
|
//#endregion
|
|
404
527
|
export { printBanner, serve };
|
|
405
|
-
|
|
528
|
+
|
|
529
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","names":[],"sources":["../src/serve.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { dirname, resolve, basename, matchesGlob } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createRequire } from 'node:module'\nimport { createServer, createLogger, type ViteDevServer } from 'vite'\nimport { renderUnicodeCompact } from 'uqr'\nimport vue from '@vitejs/plugin-vue'\nimport tailwindcss from '@tailwindcss/vite'\nimport { glob } from 'tinyglobby'\nimport { createHighlighter, type Highlighter } from 'shiki'\nimport { createPlaintext } from './plaintext.ts'\nimport { stripForHtml, stripForPlaintext } from './utils/output-markers.ts'\nimport { resolveConfig } from './config/index.ts'\nimport { runTransformers } from './transformers/index.ts'\nimport { createRenderer, type Renderer } from './render/createRenderer.ts'\nimport { setActiveRenderer } from './render/active.ts'\nimport { serveCompatibility } from './server/compatibility.ts'\nimport { serveLint } from './server/linter.ts'\nimport { sendEmail } from './server/email.ts'\nimport { normalizeComponentSources } from './utils/componentSources.ts'\nimport type { MaizzleConfig } from './types/index.ts'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst devUIDir = resolve(__dirname, 'server/ui')\n\nconst require = createRequire(import.meta.url)\nconst pkg = (name: string) => {\n const resolved = require.resolve(name).replace(/\\\\/g, '/')\n const marker = `node_modules/${name}`\n const idx = resolved.lastIndexOf(marker)\n\n return resolved.slice(0, idx + marker.length)\n}\n\nexport interface ServeOptions {\n config?: Partial<MaizzleConfig> | string\n /** Override the dev server port (takes precedence over config.server.port) */\n port?: number\n /** Expose the server on the network (e.g. --host) */\n host?: boolean | string\n /** When true, suppresses the banner/URL output (used by the Vite plugin, which prints its own) */\n silent?: boolean\n}\n\n/**\n * Start the Maizzle dev server.\n *\n * Creates two things:\n * 1. A Vite dev server for the dev UI (sidebar + preview, with Vue + Tailwind for the UI itself)\n * 2. A Renderer instance for SSR rendering email templates\n *\n * Template rendering goes through the Renderer, not the Vite dev server.\n */\nexport async function serve(options: ServeOptions = {}) {\n const start = performance.now()\n\n let config = await resolveConfig(options.config)\n const port = options.port ?? config.server?.port ?? 3000\n\n // Create a renderer for SSR rendering email templates (with dts for dev)\n let renderer = await createRenderer({ dts: true, markdown: config.markdown, root: config.root, componentDirs: normalizeComponentSources(config.components?.source, process.cwd()), vite: config.vite })\n\n // Register so user-land render() calls reuse this renderer instead of\n // spinning up another Vite SSR server (which collides when the host app\n // is itself a Vite dev process — e.g. TanStack Start).\n setActiveRenderer(renderer)\n\n const server = await createServer({\n configFile: false,\n plugins: [\n // Vue and Tailwind are only for the dev UI SPA, not for email templates\n vue(),\n tailwindcss(),\n maizzleDevPlugin(config, renderer, options.config),\n ],\n resolve: {\n dedupe: ['vue'],\n alias: [\n { find: '@', replacement: devUIDir },\n { find: 'vue', replacement: resolve(pkg('vue'), 'dist/vue.runtime.esm-bundler.js') },\n ...['vue-router', 'reka-ui', '@vueuse/core', '@vueuse/shared', 'lucide-vue-next', 'class-variance-authority', 'clsx', 'tailwind-merge', 'culori', 'postcss-safe-parser']\n .map(name => ({ find: name, replacement: pkg(name) })),\n ],\n },\n cacheDir: resolve(devUIDir, '.vite'),\n optimizeDeps: {\n noDiscovery: true,\n include: [\n 'vue',\n 'vue-router',\n 'lucide-vue-next',\n '@vueuse/core',\n '@vueuse/shared',\n 'reka-ui',\n 'class-variance-authority',\n 'clsx',\n 'tailwind-merge',\n 'culori',\n 'postcss-safe-parser',\n ],\n },\n server: {\n port,\n host: options.host,\n fs: {\n allow: [process.cwd(), config.root ?? process.cwd(), devUIDir, ...['vue', 'vue-router', 'reka-ui', '@vueuse/core', '@vueuse/shared', 'lucide-vue-next', 'class-variance-authority', 'clsx', 'tailwind-merge', 'culori', 'postcss-safe-parser'].map(pkg)],\n },\n },\n customLogger: customLogger(),\n })\n\n // Store renderer ref on server for cleanup\n const originalClose = server.close.bind(server)\n server.close = async () => {\n setActiveRenderer(null)\n await renderer.close()\n return originalClose()\n }\n\n await server.listen()\n\n const startupTime = Math.round(performance.now() - start)\n\n if (!options.silent) {\n printBanner(server, startupTime)\n }\n\n // Expose startup time so the plugin can print it later\n ; (server as any)._maizzleStartupTime = startupTime\n\n return server\n}\n\n/**\n * Internal Vite plugin that adds Maizzle middleware and file watching to the dev UI server.\n */\nfunction maizzleDevPlugin(\n config: MaizzleConfig,\n renderer: Renderer,\n configInput: Partial<MaizzleConfig> | string | undefined,\n) {\n return {\n name: 'maizzle:dev',\n enforce: 'pre' as const,\n\n hotUpdate: {\n order: 'pre' as const,\n handler({ file }: { file: string }) {\n // Prevent Tailwind/Vue from triggering a full reload for email template files.\n // Maizzle handles these via custom HMR events in the watcher below.\n if (isTemplateFile(file)) {\n return []\n }\n },\n },\n\n configureServer(server: ViteDevServer) {\n // File watching\n const defaultWatchPaths = [\n 'maizzle.config.js',\n 'maizzle.config.ts',\n 'tailwind.config.js',\n 'tailwind.config.ts',\n 'locales/**',\n ]\n\n const userWatchPaths = config.server?.watch ?? []\n const watchPaths = [...defaultWatchPaths, ...userWatchPaths]\n const isWatchedFile = (file: string) => watchPaths.some(p => matchesGlob(file, p))\n\n for (const watchPath of watchPaths) {\n server.watcher.add(watchPath)\n }\n\n server.watcher.on('add', async (file) => {\n if (isTemplateFile(file)) {\n await renderer.invalidateAll()\n server.ws.send({ type: 'custom', event: 'maizzle:templates-changed' })\n }\n })\n\n server.watcher.on('unlink', async (file) => {\n if (isTemplateFile(file)) {\n await renderer.invalidateAll()\n server.ws.send({ type: 'custom', event: 'maizzle:templates-changed' })\n }\n })\n\n server.watcher.on('change', async (file) => {\n if (isWatchedFile(file)) {\n config = await resolveConfig(configInput)\n\n // Recreate the renderer so config changes (e.g. markdown.shikiTheme) take effect\n await renderer.close()\n renderer = await createRenderer({ dts: true, markdown: config.markdown, root: config.root, componentDirs: normalizeComponentSources(config.components?.source, process.cwd()), vite: config.vite })\n\n // Push UI-relevant config bits so the dev UI reacts to live edits\n // without a page reload. Uses the same shape as the initial inject.\n server.ws.send({ type: 'custom', event: 'maizzle:config-updated', data: buildUiConfig(config) })\n }\n\n // Invalidate all renderer modules so component and config changes\n // are picked up on the next render (Tailwind recompiles with fresh content)\n await renderer.invalidateAll()\n\n if (\n isTemplateFile(file)\n || isWatchedFile(file)\n ) {\n server.ws.send({ type: 'custom', event: 'maizzle:template-updated', data: { file } })\n }\n })\n\n // API middleware (before Vite's middleware)\n server.middlewares.use(async (req: any, res: any, next: any) => {\n const url = req.url || '/'\n\n if (url === '/__maizzle/templates') {\n return serveTemplateList(config, res)\n }\n\n if (url.startsWith('/__maizzle/render/')) {\n return await serveRenderedTemplate(url, config, renderer, res)\n }\n\n if (url.startsWith('/__maizzle/source/')) {\n return await serveHighlightedSource(url, config, renderer, res)\n }\n\n if (url.startsWith('/__maizzle/compatibility/')) {\n return await serveCompatibility(url, res, config, normalizeComponentSources(config.components?.source, process.cwd()))\n }\n\n if (url.startsWith('/__maizzle/lint/')) {\n return await serveLint(url, res, config, normalizeComponentSources(config.components?.source, process.cwd()))\n }\n\n if (url.startsWith('/__maizzle/vue-source/')) {\n return await serveVueSource(url, config, res)\n }\n\n if (url.startsWith('/__maizzle/plaintext/')) {\n return await servePlaintext(url, config, renderer, res)\n }\n\n if (url.startsWith('/__maizzle/stats/')) {\n return await serveStats(url, config, renderer, res)\n }\n\n if (url.startsWith('/__maizzle/email/') && req.method === 'POST') {\n return await serveEmailEndpoint(url, req, res, config, renderer)\n }\n\n if (url === '/__maizzle/email-config') {\n return serveEmailConfig(config, res)\n }\n\n next()\n })\n\n // Dev UI fallback (after Vite's middleware)\n return () => {\n server.middlewares.use(async (req: any, res: any, next: any) => {\n if (isNavigationRequest(req)) {\n return await serveDevUI(server, res, req.url || '/', config)\n }\n\n next()\n })\n }\n },\n }\n}\n\nfunction isTemplateFile(file: string): boolean {\n return (file.endsWith('.vue') || file.endsWith('.md')) && !file.includes('server/ui')\n}\n\nfunction isNavigationRequest(req: any): boolean {\n const accept = req.headers?.accept || ''\n return req.method === 'GET' && accept.includes('text/html')\n}\n\n/**\n * Shape exposed to the dev UI both at initial HTML load (as\n * `window.__MAIZZLE_CONFIG__`) and on the `maizzle:config-updated` HMR event.\n * Add UI-visible config bits here; consumers on both ends pick up automatically.\n */\nfunction buildUiConfig(config: MaizzleConfig) {\n return {\n checks: config.server?.checks ?? true,\n }\n}\n\nasync function serveDevUI(server: ViteDevServer, res: any, url: string, config: MaizzleConfig) {\n let indexHtml = readFileSync(resolve(devUIDir, 'index.html'), 'utf-8')\n\n indexHtml = indexHtml.replace('./main.ts', `/@fs/${resolve(devUIDir, 'main.ts')}`)\n indexHtml = indexHtml.replace('./favicon.svg', `/@fs/${resolve(devUIDir, 'favicon.svg')}`)\n\n const configScript = `<script>window.__MAIZZLE_CONFIG__ = ${JSON.stringify(buildUiConfig(config))};</script>`\n indexHtml = indexHtml.replace('</head>', `${configScript}</head>`)\n\n const transformed = await server.transformIndexHtml(url, indexHtml)\n\n res.setHeader('Content-Type', 'text/html')\n res.end(transformed)\n}\n\nasync function serveTemplateList(config: MaizzleConfig, res: any) {\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n\n const data = templates.map(t => ({\n name: basename(t).replace(/\\.(vue|md)$/, ''),\n path: t,\n href: '/' + t.replace(/\\.(vue|md)$/, ''),\n }))\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(data))\n}\n\n/**\n * SSR render a .vue template using the Renderer (not the dev UI server).\n */\nasync function serveRenderedTemplate(url: string, config: MaizzleConfig, renderer: Renderer, res: any) {\n const templateSlug = url.replace('/__maizzle/render/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end('Template not found')\n return\n }\n\n try {\n const absolutePath = resolve(match)\n\n // Invalidate all modules so template + component changes are picked up\n await renderer.invalidateAll()\n\n const rendered = await renderer.render(absolutePath, config)\n let html = rendered.html\n\n const templateConfig = rendered.templateConfig\n const doctype = rendered.doctype ?? templateConfig.doctype ?? '<!DOCTYPE html>'\n\n html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks)\n html = `${doctype}\\n${html}`\n\n res.setHeader('Content-Type', 'text/html')\n res.end(stripForHtml(html))\n } catch (error: any) {\n res.statusCode = 500\n res.end(`<pre>${error.stack || error.message}</pre>`)\n }\n}\n\nlet highlighter: Highlighter | null = null\n\nasync function getHighlighter() {\n if (!highlighter) {\n highlighter = await createHighlighter({\n themes: ['laserwave'],\n langs: ['html', 'vue'],\n })\n }\n return highlighter\n}\n\nasync function serveHighlightedSource(url: string, config: MaizzleConfig, renderer: Renderer, res: any) {\n const templateSlug = url.replace('/__maizzle/source/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end('Template not found')\n return\n }\n\n try {\n const absolutePath = resolve(match)\n\n await renderer.invalidateAll()\n\n const rendered = await renderer.render(absolutePath, config)\n let html = rendered.html\n\n const templateConfig = rendered.templateConfig\n const doctype = rendered.doctype ?? templateConfig.doctype ?? '<!DOCTYPE html>'\n html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks)\n\n html = stripForHtml(`${doctype}\\n${html}`)\n\n const hl = await getHighlighter()\n const highlighted = hl.codeToHtml(html, {\n lang: 'html',\n theme: 'laserwave',\n transformers: [{\n line(node, line) {\n node.properties['data-line'] = line\n },\n }],\n })\n\n res.setHeader('Content-Type', 'text/html')\n res.end(highlighted)\n } catch (error: any) {\n res.statusCode = 500\n res.end(`<pre>${error.stack || error.message}</pre>`)\n }\n}\n\nasync function serveVueSource(url: string, config: MaizzleConfig, res: any) {\n const templateSlug = url.replace('/__maizzle/vue-source/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end('Template not found')\n return\n }\n\n try {\n const source = readFileSync(resolve(match), 'utf-8')\n const lang = match.endsWith('.md') ? 'html' : 'vue'\n\n const hl = await getHighlighter()\n const highlighted = hl.codeToHtml(source, {\n lang,\n theme: 'laserwave',\n transformers: [{\n line(node, line) {\n node.properties['data-line'] = line\n },\n }],\n })\n\n res.setHeader('Content-Type', 'text/html')\n res.end(highlighted)\n } catch (error: any) {\n res.statusCode = 500\n res.end(`<pre>${error.stack || error.message}</pre>`)\n }\n}\n\nasync function servePlaintext(url: string, config: MaizzleConfig, renderer: Renderer, res: any) {\n const templateSlug = url.replace('/__maizzle/plaintext/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end('Template not found')\n return\n }\n\n try {\n const absolutePath = resolve(match)\n await renderer.invalidateAll()\n\n const rendered = await renderer.render(absolutePath, config)\n let html = rendered.html\n const templateConfig = rendered.templateConfig\n const doctype = rendered.doctype ?? templateConfig.doctype ?? '<!DOCTYPE html>'\n html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks)\n\n const plaintext = createPlaintext(stripForPlaintext(html))\n\n res.setHeader('Content-Type', 'text/plain')\n res.end(plaintext)\n } catch (error: any) {\n res.statusCode = 500\n res.end(error.message)\n }\n}\n\nfunction humanFileSize(bytes: number, si = false, dp = 2) {\n const threshold = si ? 1000 : 1024\n\n if (Math.abs(bytes) < threshold) {\n return bytes + ' B'\n }\n\n const units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n let u = -1\n const r = 10 ** dp\n\n do {\n bytes /= threshold\n ++u\n } while (Math.round(Math.abs(bytes) * r) / r >= threshold && u < units.length - 1)\n\n return bytes.toFixed(dp) + ' ' + units[u]\n}\n\nasync function serveStats(url: string, config: MaizzleConfig, renderer: Renderer, res: any) {\n const templateSlug = url.replace('/__maizzle/stats/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end(JSON.stringify({ error: 'Template not found' }))\n return\n }\n\n try {\n const absolutePath = resolve(match)\n await renderer.invalidateAll()\n\n const rendered = await renderer.render(absolutePath, config)\n let html = rendered.html\n const templateConfig = rendered.templateConfig\n const doctype = rendered.doctype ?? templateConfig.doctype ?? '<!DOCTYPE html>'\n html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks)\n html = stripForHtml(html)\n\n const sizeBytes = Buffer.byteLength(html, 'utf-8')\n\n // Count images: <img> tags and CSS background images\n const imgTags = (html.match(/<img\\b[^>]*>/gi) || []).length\n const bgImages = (html.match(/url\\s*\\([^)]+\\)/gi) || []).length\n const totalImages = imgTags + bgImages\n\n // Count links\n const links = (html.match(/<a\\b[^>]*href\\s*=/gi) || []).length\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({\n size: {\n bytes: sizeBytes,\n formatted: humanFileSize(sizeBytes),\n },\n images: totalImages,\n links,\n }))\n } catch (error: any) {\n res.statusCode = 500\n res.end(JSON.stringify({ error: error.message }))\n }\n}\n\nasync function serveEmailEndpoint(url: string, req: any, res: any, config: MaizzleConfig, renderer: Renderer) {\n const templateSlug = url.replace('/__maizzle/email/', '').replace(/\\?.*$/, '')\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const templates = await glob(contentPatterns)\n const match = templates.find(t => t.replace(/\\.(vue|md)$/, '') === templateSlug)\n\n if (!match) {\n res.statusCode = 404\n res.end(JSON.stringify({ success: false, message: 'Template not found' }))\n return\n }\n\n let body = ''\n for await (const chunk of req) body += chunk\n\n let payload: { to: string[]; subject: string }\n\n try {\n payload = JSON.parse(body)\n } catch {\n res.statusCode = 400\n res.end(JSON.stringify({ success: false, message: 'Invalid JSON' }))\n return\n }\n\n if (!payload.to?.length) {\n res.statusCode = 400\n res.end(JSON.stringify({ success: false, message: 'Missing recipients' }))\n return\n }\n\n try {\n const absolutePath = resolve(match)\n await renderer.invalidateAll()\n\n const rendered = await renderer.render(absolutePath, config)\n let html = rendered.html\n const templateConfig = rendered.templateConfig\n const doctype = rendered.doctype ?? templateConfig.doctype ?? '<!DOCTYPE html>'\n html = await runTransformers(html, templateConfig, absolutePath, doctype, rendered.tailwindBlocks)\n html = `${doctype}\\n${html}`\n\n const text = createPlaintext(stripForPlaintext(html))\n html = stripForHtml(html)\n\n const result = await sendEmail(\n { to: payload.to, subject: payload.subject, html, text },\n config,\n templateConfig,\n )\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(result))\n } catch (error: any) {\n res.statusCode = 500\n res.end(JSON.stringify({ success: false, message: error.message }))\n }\n}\n\nfunction serveEmailConfig(config: MaizzleConfig, res: any) {\n const emailConfig = config.server?.email\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({\n to: emailConfig?.to ? (Array.isArray(emailConfig.to) ? emailConfig.to : [emailConfig.to]) : [],\n from: emailConfig?.from ?? '',\n subject: emailConfig?.subject ?? '',\n hasTransport: !!emailConfig?.transport,\n }))\n}\n\nexport function printBanner(server: ViteDevServer, startupTime?: number) {\n const info = server.config.logger.info\n const time = startupTime ?? (server as any)._maizzleStartupTime\n\n const networkUrl = server.resolvedUrls?.network[0]\n if (networkUrl) {\n const qr = renderUnicodeCompact(networkUrl, { border: 1 })\n info('')\n info(qr.split('\\n').map(line => ` ${line}`).join('\\n'))\n }\n\n info('')\n info(` \\x1b[32m\\x1b[1mMAIZZLE\\x1b[0m\\x1b[32m v6.0.0\\x1b[0m \\x1b[2mready in\\x1b[0m \\x1b[1m${time}\\x1b[0m ms`)\n info('')\n server.printUrls()\n info('')\n}\n\nfunction customLogger() {\n const logger = createLogger('info')\n const warn = logger.warn\n\n logger.warn = (message, options) => {\n if (typeof message === 'string' && message.includes('<tr> cannot be child of <table>')) {\n return\n }\n\n warn(message, options)\n }\n\n return logger\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,WAAW,QADC,QAAQ,cAAc,OAAO,KAAK,IAAI,CACtB,EAAE,YAAY;AAEhD,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAC9C,MAAM,OAAO,SAAiB;CAC5B,MAAM,WAAW,QAAQ,QAAQ,KAAK,CAAC,QAAQ,OAAO,IAAI;CAC1D,MAAM,SAAS,gBAAgB;CAC/B,MAAM,MAAM,SAAS,YAAY,OAAO;CAExC,OAAO,SAAS,MAAM,GAAG,MAAM,OAAO,OAAO;;;;;;;;;;;AAsB/C,eAAsB,MAAM,UAAwB,EAAE,EAAE;CACtD,MAAM,QAAQ,YAAY,KAAK;CAE/B,IAAI,SAAS,MAAM,cAAc,QAAQ,OAAO;CAChD,MAAM,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ;CAGpD,IAAI,WAAW,MAAM,eAAe;EAAE,KAAK;EAAM,UAAU,OAAO;EAAU,MAAM,OAAO;EAAM,eAAe,0BAA0B,OAAO,YAAY,QAAQ,QAAQ,KAAK,CAAC;EAAE,MAAM,OAAO;EAAM,CAAC;CAKvM,kBAAkB,SAAS;CAE3B,MAAM,SAAS,MAAM,aAAa;EAChC,YAAY;EACZ,SAAS;GAEP,KAAK;GACL,aAAa;GACb,iBAAiB,QAAQ,UAAU,QAAQ,OAAO;GACnD;EACD,SAAS;GACP,QAAQ,CAAC,MAAM;GACf,OAAO;IACL;KAAE,MAAM;KAAK,aAAa;KAAU;IACpC;KAAE,MAAM;KAAO,aAAa,QAAQ,IAAI,MAAM,EAAE,kCAAkC;KAAE;IACpF,GAAG;KAAC;KAAc;KAAW;KAAgB;KAAkB;KAAmB;KAA4B;KAAQ;KAAkB;KAAU;KAAsB,CACrK,KAAI,UAAS;KAAE,MAAM;KAAM,aAAa,IAAI,KAAK;KAAE,EAAE;IACzD;GACF;EACD,UAAU,QAAQ,UAAU,QAAQ;EACpC,cAAc;GACZ,aAAa;GACb,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACD,QAAQ;GACN;GACA,MAAM,QAAQ;GACd,IAAI,EACF,OAAO;IAAC,QAAQ,KAAK;IAAE,OAAO,QAAQ,QAAQ,KAAK;IAAE;IAAU,GAAG;KAAC;KAAO;KAAc;KAAW;KAAgB;KAAkB;KAAmB;KAA4B;KAAQ;KAAkB;KAAU;KAAsB,CAAC,IAAI,IAAI;IAAC,EACzP;GACF;EACD,cAAc,cAAc;EAC7B,CAAC;CAGF,MAAM,gBAAgB,OAAO,MAAM,KAAK,OAAO;CAC/C,OAAO,QAAQ,YAAY;EACzB,kBAAkB,KAAK;EACvB,MAAM,SAAS,OAAO;EACtB,OAAO,eAAe;;CAGxB,MAAM,OAAO,QAAQ;CAErB,MAAM,cAAc,KAAK,MAAM,YAAY,KAAK,GAAG,MAAM;CAEzD,IAAI,CAAC,QAAQ,QACX,YAAY,QAAQ,YAAY;CAIhC,OAAgB,sBAAsB;CAExC,OAAO;;;;;AAMT,SAAS,iBACP,QACA,UACA,aACA;CACA,OAAO;EACL,MAAM;EACN,SAAS;EAET,WAAW;GACT,OAAO;GACP,QAAQ,EAAE,QAA0B;IAGlC,IAAI,eAAe,KAAK,EACtB,OAAO,EAAE;;GAGd;EAED,gBAAgB,QAAuB;GAErC,MAAM,oBAAoB;IACxB;IACA;IACA;IACA;IACA;IACD;GAED,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;GACjD,MAAM,aAAa,CAAC,GAAG,mBAAmB,GAAG,eAAe;GAC5D,MAAM,iBAAiB,SAAiB,WAAW,MAAK,MAAK,YAAY,MAAM,EAAE,CAAC;GAElF,KAAK,MAAM,aAAa,YACtB,OAAO,QAAQ,IAAI,UAAU;GAG/B,OAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;IACvC,IAAI,eAAe,KAAK,EAAE;KACxB,MAAM,SAAS,eAAe;KAC9B,OAAO,GAAG,KAAK;MAAE,MAAM;MAAU,OAAO;MAA6B,CAAC;;KAExE;GAEF,OAAO,QAAQ,GAAG,UAAU,OAAO,SAAS;IAC1C,IAAI,eAAe,KAAK,EAAE;KACxB,MAAM,SAAS,eAAe;KAC9B,OAAO,GAAG,KAAK;MAAE,MAAM;MAAU,OAAO;MAA6B,CAAC;;KAExE;GAEF,OAAO,QAAQ,GAAG,UAAU,OAAO,SAAS;IAC1C,IAAI,cAAc,KAAK,EAAE;KACvB,SAAS,MAAM,cAAc,YAAY;KAGzC,MAAM,SAAS,OAAO;KACtB,WAAW,MAAM,eAAe;MAAE,KAAK;MAAM,UAAU,OAAO;MAAU,MAAM,OAAO;MAAM,eAAe,0BAA0B,OAAO,YAAY,QAAQ,QAAQ,KAAK,CAAC;MAAE,MAAM,OAAO;MAAM,CAAC;KAInM,OAAO,GAAG,KAAK;MAAE,MAAM;MAAU,OAAO;MAA0B,MAAM,cAAc,OAAO;MAAE,CAAC;;IAKlG,MAAM,SAAS,eAAe;IAE9B,IACE,eAAe,KAAK,IACjB,cAAc,KAAK,EAEtB,OAAO,GAAG,KAAK;KAAE,MAAM;KAAU,OAAO;KAA4B,MAAM,EAAE,MAAM;KAAE,CAAC;KAEvF;GAGF,OAAO,YAAY,IAAI,OAAO,KAAU,KAAU,SAAc;IAC9D,MAAM,MAAM,IAAI,OAAO;IAEvB,IAAI,QAAQ,wBACV,OAAO,kBAAkB,QAAQ,IAAI;IAGvC,IAAI,IAAI,WAAW,qBAAqB,EACtC,OAAO,MAAM,sBAAsB,KAAK,QAAQ,UAAU,IAAI;IAGhE,IAAI,IAAI,WAAW,qBAAqB,EACtC,OAAO,MAAM,uBAAuB,KAAK,QAAQ,UAAU,IAAI;IAGjE,IAAI,IAAI,WAAW,4BAA4B,EAC7C,OAAO,MAAM,mBAAmB,KAAK,KAAK,QAAQ,0BAA0B,OAAO,YAAY,QAAQ,QAAQ,KAAK,CAAC,CAAC;IAGxH,IAAI,IAAI,WAAW,mBAAmB,EACpC,OAAO,MAAM,UAAU,KAAK,KAAK,QAAQ,0BAA0B,OAAO,YAAY,QAAQ,QAAQ,KAAK,CAAC,CAAC;IAG/G,IAAI,IAAI,WAAW,yBAAyB,EAC1C,OAAO,MAAM,eAAe,KAAK,QAAQ,IAAI;IAG/C,IAAI,IAAI,WAAW,wBAAwB,EACzC,OAAO,MAAM,eAAe,KAAK,QAAQ,UAAU,IAAI;IAGzD,IAAI,IAAI,WAAW,oBAAoB,EACrC,OAAO,MAAM,WAAW,KAAK,QAAQ,UAAU,IAAI;IAGrD,IAAI,IAAI,WAAW,oBAAoB,IAAI,IAAI,WAAW,QACxD,OAAO,MAAM,mBAAmB,KAAK,KAAK,KAAK,QAAQ,SAAS;IAGlE,IAAI,QAAQ,2BACV,OAAO,iBAAiB,QAAQ,IAAI;IAGtC,MAAM;KACN;GAGF,aAAa;IACX,OAAO,YAAY,IAAI,OAAO,KAAU,KAAU,SAAc;KAC9D,IAAI,oBAAoB,IAAI,EAC1B,OAAO,MAAM,WAAW,QAAQ,KAAK,IAAI,OAAO,KAAK,OAAO;KAG9D,MAAM;MACN;;;EAGP;;AAGH,SAAS,eAAe,MAAuB;CAC7C,QAAQ,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,MAAM,KAAK,CAAC,KAAK,SAAS,YAAY;;AAGvF,SAAS,oBAAoB,KAAmB;CAC9C,MAAM,SAAS,IAAI,SAAS,UAAU;CACtC,OAAO,IAAI,WAAW,SAAS,OAAO,SAAS,YAAY;;;;;;;AAQ7D,SAAS,cAAc,QAAuB;CAC5C,OAAO,EACL,QAAQ,OAAO,QAAQ,UAAU,MAClC;;AAGH,eAAe,WAAW,QAAuB,KAAU,KAAa,QAAuB;CAC7F,IAAI,YAAY,aAAa,QAAQ,UAAU,aAAa,EAAE,QAAQ;CAEtE,YAAY,UAAU,QAAQ,aAAa,QAAQ,QAAQ,UAAU,UAAU,GAAG;CAClF,YAAY,UAAU,QAAQ,iBAAiB,QAAQ,QAAQ,UAAU,cAAc,GAAG;CAE1F,MAAM,eAAe,uCAAuC,KAAK,UAAU,cAAc,OAAO,CAAC,CAAC;CAClG,YAAY,UAAU,QAAQ,WAAW,GAAG,aAAa,SAAS;CAElE,MAAM,cAAc,MAAM,OAAO,mBAAmB,KAAK,UAAU;CAEnE,IAAI,UAAU,gBAAgB,YAAY;CAC1C,IAAI,IAAI,YAAY;;AAGtB,eAAe,kBAAkB,QAAuB,KAAU;CAIhE,MAAM,QAAO,MAFW,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EAEtB,KAAI,OAAM;EAC/B,MAAM,SAAS,EAAE,CAAC,QAAQ,eAAe,GAAG;EAC5C,MAAM;EACN,MAAM,MAAM,EAAE,QAAQ,eAAe,GAAG;EACzC,EAAE;CAEH,IAAI,UAAU,gBAAgB,mBAAmB;CACjD,IAAI,IAAI,KAAK,UAAU,KAAK,CAAC;;;;;AAM/B,eAAe,sBAAsB,KAAa,QAAuB,UAAoB,KAAU;CACrG,MAAM,eAAe,IAAI,QAAQ,sBAAsB,GAAG,CAAC,QAAQ,SAAS,GAAG;CAI/E,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,qBAAqB;EAC7B;;CAGF,IAAI;EACF,MAAM,eAAe,QAAQ,MAAM;EAGnC,MAAM,SAAS,eAAe;EAE9B,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc,OAAO;EAC5D,IAAI,OAAO,SAAS;EAEpB,MAAM,iBAAiB,SAAS;EAChC,MAAM,UAAU,SAAS,WAAW,eAAe,WAAW;EAE9D,OAAO,MAAM,gBAAgB,MAAM,gBAAgB,cAAc,SAAS,SAAS,eAAe;EAClG,OAAO,GAAG,QAAQ,IAAI;EAEtB,IAAI,UAAU,gBAAgB,YAAY;EAC1C,IAAI,IAAI,aAAa,KAAK,CAAC;UACpB,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,QAAQ,MAAM,SAAS,MAAM,QAAQ,QAAQ;;;AAIzD,IAAI,cAAkC;AAEtC,eAAe,iBAAiB;CAC9B,IAAI,CAAC,aACH,cAAc,MAAM,kBAAkB;EACpC,QAAQ,CAAC,YAAY;EACrB,OAAO,CAAC,QAAQ,MAAM;EACvB,CAAC;CAEJ,OAAO;;AAGT,eAAe,uBAAuB,KAAa,QAAuB,UAAoB,KAAU;CACtG,MAAM,eAAe,IAAI,QAAQ,sBAAsB,GAAG,CAAC,QAAQ,SAAS,GAAG;CAI/E,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,qBAAqB;EAC7B;;CAGF,IAAI;EACF,MAAM,eAAe,QAAQ,MAAM;EAEnC,MAAM,SAAS,eAAe;EAE9B,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc,OAAO;EAC5D,IAAI,OAAO,SAAS;EAEpB,MAAM,iBAAiB,SAAS;EAChC,MAAM,UAAU,SAAS,WAAW,eAAe,WAAW;EAC9D,OAAO,MAAM,gBAAgB,MAAM,gBAAgB,cAAc,SAAS,SAAS,eAAe;EAElG,OAAO,aAAa,GAAG,QAAQ,IAAI,OAAO;EAG1C,MAAM,eAAc,MADH,gBAAgB,EACV,WAAW,MAAM;GACtC,MAAM;GACN,OAAO;GACP,cAAc,CAAC,EACb,KAAK,MAAM,MAAM;IACf,KAAK,WAAW,eAAe;MAElC,CAAC;GACH,CAAC;EAEF,IAAI,UAAU,gBAAgB,YAAY;EAC1C,IAAI,IAAI,YAAY;UACb,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,QAAQ,MAAM,SAAS,MAAM,QAAQ,QAAQ;;;AAIzD,eAAe,eAAe,KAAa,QAAuB,KAAU;CAC1E,MAAM,eAAe,IAAI,QAAQ,0BAA0B,GAAG,CAAC,QAAQ,SAAS,GAAG;CAInF,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,qBAAqB;EAC7B;;CAGF,IAAI;EACF,MAAM,SAAS,aAAa,QAAQ,MAAM,EAAE,QAAQ;EACpD,MAAM,OAAO,MAAM,SAAS,MAAM,GAAG,SAAS;EAG9C,MAAM,eAAc,MADH,gBAAgB,EACV,WAAW,QAAQ;GACxC;GACA,OAAO;GACP,cAAc,CAAC,EACb,KAAK,MAAM,MAAM;IACf,KAAK,WAAW,eAAe;MAElC,CAAC;GACH,CAAC;EAEF,IAAI,UAAU,gBAAgB,YAAY;EAC1C,IAAI,IAAI,YAAY;UACb,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,QAAQ,MAAM,SAAS,MAAM,QAAQ,QAAQ;;;AAIzD,eAAe,eAAe,KAAa,QAAuB,UAAoB,KAAU;CAC9F,MAAM,eAAe,IAAI,QAAQ,yBAAyB,GAAG,CAAC,QAAQ,SAAS,GAAG;CAIlF,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,qBAAqB;EAC7B;;CAGF,IAAI;EACF,MAAM,eAAe,QAAQ,MAAM;EACnC,MAAM,SAAS,eAAe;EAE9B,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc,OAAO;EAC5D,IAAI,OAAO,SAAS;EACpB,MAAM,iBAAiB,SAAS;EAChC,MAAM,UAAU,SAAS,WAAW,eAAe,WAAW;EAC9D,OAAO,MAAM,gBAAgB,MAAM,gBAAgB,cAAc,SAAS,SAAS,eAAe;EAElG,MAAM,YAAY,gBAAgB,kBAAkB,KAAK,CAAC;EAE1D,IAAI,UAAU,gBAAgB,aAAa;EAC3C,IAAI,IAAI,UAAU;UACX,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,MAAM,QAAQ;;;AAI1B,SAAS,cAAc,OAAe,KAAK,OAAO,KAAK,GAAG;CACxD,MAAM,YAAY,KAAK,MAAO;CAE9B,IAAI,KAAK,IAAI,MAAM,GAAG,WACpB,OAAO,QAAQ;CAGjB,MAAM,QAAQ;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;CAC9D,IAAI,IAAI;CACR,MAAM,IAAI,MAAM;CAEhB,GAAG;EACD,SAAS;EACT,EAAE;UACK,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,EAAE,GAAG,KAAK,aAAa,IAAI,MAAM,SAAS;CAEhF,OAAO,MAAM,QAAQ,GAAG,GAAG,MAAM,MAAM;;AAGzC,eAAe,WAAW,KAAa,QAAuB,UAAoB,KAAU;CAC1F,MAAM,eAAe,IAAI,QAAQ,qBAAqB,GAAG,CAAC,QAAQ,SAAS,GAAG;CAI9E,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC,CAAC;EACxD;;CAGF,IAAI;EACF,MAAM,eAAe,QAAQ,MAAM;EACnC,MAAM,SAAS,eAAe;EAE9B,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc,OAAO;EAC5D,IAAI,OAAO,SAAS;EACpB,MAAM,iBAAiB,SAAS;EAChC,MAAM,UAAU,SAAS,WAAW,eAAe,WAAW;EAC9D,OAAO,MAAM,gBAAgB,MAAM,gBAAgB,cAAc,SAAS,SAAS,eAAe;EAClG,OAAO,aAAa,KAAK;EAEzB,MAAM,YAAY,OAAO,WAAW,MAAM,QAAQ;EAKlD,MAAM,eAFW,KAAK,MAAM,iBAAiB,IAAI,EAAE,EAAE,UACnC,KAAK,MAAM,oBAAoB,IAAI,EAAE,EAAE;EAIzD,MAAM,SAAS,KAAK,MAAM,sBAAsB,IAAI,EAAE,EAAE;EAExD,IAAI,UAAU,gBAAgB,mBAAmB;EACjD,IAAI,IAAI,KAAK,UAAU;GACrB,MAAM;IACJ,OAAO;IACP,WAAW,cAAc,UAAU;IACpC;GACD,QAAQ;GACR;GACD,CAAC,CAAC;UACI,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,MAAM,SAAS,CAAC,CAAC;;;AAIrD,eAAe,mBAAmB,KAAa,KAAU,KAAU,QAAuB,UAAoB;CAC5G,MAAM,eAAe,IAAI,QAAQ,qBAAqB,GAAG,CAAC,QAAQ,SAAS,GAAG;CAI9E,MAAM,SAAQ,MADU,KADA,OAAO,WAAW,CAAC,kBAAkB,CAChB,EACrB,MAAK,MAAK,EAAE,QAAQ,eAAe,GAAG,KAAK,aAAa;CAEhF,IAAI,CAAC,OAAO;EACV,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU;GAAE,SAAS;GAAO,SAAS;GAAsB,CAAC,CAAC;EAC1E;;CAGF,IAAI,OAAO;CACX,WAAW,MAAM,SAAS,KAAK,QAAQ;CAEvC,IAAI;CAEJ,IAAI;EACF,UAAU,KAAK,MAAM,KAAK;SACpB;EACN,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU;GAAE,SAAS;GAAO,SAAS;GAAgB,CAAC,CAAC;EACpE;;CAGF,IAAI,CAAC,QAAQ,IAAI,QAAQ;EACvB,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU;GAAE,SAAS;GAAO,SAAS;GAAsB,CAAC,CAAC;EAC1E;;CAGF,IAAI;EACF,MAAM,eAAe,QAAQ,MAAM;EACnC,MAAM,SAAS,eAAe;EAE9B,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc,OAAO;EAC5D,IAAI,OAAO,SAAS;EACpB,MAAM,iBAAiB,SAAS;EAChC,MAAM,UAAU,SAAS,WAAW,eAAe,WAAW;EAC9D,OAAO,MAAM,gBAAgB,MAAM,gBAAgB,cAAc,SAAS,SAAS,eAAe;EAClG,OAAO,GAAG,QAAQ,IAAI;EAEtB,MAAM,OAAO,gBAAgB,kBAAkB,KAAK,CAAC;EACrD,OAAO,aAAa,KAAK;EAEzB,MAAM,SAAS,MAAM,UACnB;GAAE,IAAI,QAAQ;GAAI,SAAS,QAAQ;GAAS;GAAM;GAAM,EACxD,QACA,eACD;EAED,IAAI,UAAU,gBAAgB,mBAAmB;EACjD,IAAI,IAAI,KAAK,UAAU,OAAO,CAAC;UACxB,OAAY;EACnB,IAAI,aAAa;EACjB,IAAI,IAAI,KAAK,UAAU;GAAE,SAAS;GAAO,SAAS,MAAM;GAAS,CAAC,CAAC;;;AAIvE,SAAS,iBAAiB,QAAuB,KAAU;CACzD,MAAM,cAAc,OAAO,QAAQ;CACnC,IAAI,UAAU,gBAAgB,mBAAmB;CACjD,IAAI,IAAI,KAAK,UAAU;EACrB,IAAI,aAAa,KAAM,MAAM,QAAQ,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,YAAY,GAAG,GAAI,EAAE;EAC9F,MAAM,aAAa,QAAQ;EAC3B,SAAS,aAAa,WAAW;EACjC,cAAc,CAAC,CAAC,aAAa;EAC9B,CAAC,CAAC;;AAGL,SAAgB,YAAY,QAAuB,aAAsB;CACvE,MAAM,OAAO,OAAO,OAAO,OAAO;CAClC,MAAM,OAAO,eAAgB,OAAe;CAE5C,MAAM,aAAa,OAAO,cAAc,QAAQ;CAChD,IAAI,YAAY;EACd,MAAM,KAAK,qBAAqB,YAAY,EAAE,QAAQ,GAAG,CAAC;EAC1D,KAAK,GAAG;EACR,KAAK,GAAG,MAAM,KAAK,CAAC,KAAI,SAAQ,KAAK,OAAO,CAAC,KAAK,KAAK,CAAC;;CAG1D,KAAK,GAAG;CACR,KAAK,wFAAwF,KAAK,YAAY;CAC9G,KAAK,GAAG;CACR,OAAO,WAAW;CAClB,KAAK,GAAG;;AAGV,SAAS,eAAe;CACtB,MAAM,SAAS,aAAa,OAAO;CACnC,MAAM,OAAO,OAAO;CAEpB,OAAO,QAAQ,SAAS,YAAY;EAClC,IAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,kCAAkC,EACpF;EAGF,KAAK,SAAS,QAAQ;;CAGxB,OAAO"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { MaizzleConfig } from "../types/config.js";
|
|
2
|
+
import { NormalizedComponentSource } from "../utils/componentSources.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/compatibility.d.ts
|
|
5
|
+
interface Feature {
|
|
6
|
+
slug: string;
|
|
7
|
+
title: string;
|
|
8
|
+
url: string;
|
|
9
|
+
category: string;
|
|
10
|
+
stats: any;
|
|
11
|
+
}
|
|
12
|
+
interface Indexes {
|
|
13
|
+
nicenames: {
|
|
14
|
+
supported: string;
|
|
15
|
+
mitigated: string;
|
|
16
|
+
unsupported: string;
|
|
17
|
+
unknown: string;
|
|
18
|
+
mixed: string;
|
|
19
|
+
};
|
|
20
|
+
familyNicenames: Record<string, string>;
|
|
21
|
+
cssProp: Map<string, Feature[]>;
|
|
22
|
+
cssPropValue: Map<string, Array<{
|
|
23
|
+
value: string;
|
|
24
|
+
feature: Feature;
|
|
25
|
+
}>>;
|
|
26
|
+
cssAtRule: Map<string, Feature[]>;
|
|
27
|
+
cssMediaFeature: Map<string, Feature[]>;
|
|
28
|
+
cssPseudoClass: Map<string, Feature[]>;
|
|
29
|
+
cssPseudoElement: Map<string, Feature[]>;
|
|
30
|
+
cssFunction: Map<string, Feature[]>;
|
|
31
|
+
cssUnit: Map<string, Feature[]>;
|
|
32
|
+
cssImportant?: Feature;
|
|
33
|
+
cssVariables?: Feature;
|
|
34
|
+
cssNesting?: Feature;
|
|
35
|
+
cssComments?: Feature;
|
|
36
|
+
cssModernColor?: Feature;
|
|
37
|
+
htmlTag: Map<string, Feature[]>;
|
|
38
|
+
htmlAttr: Map<string, Feature[]>;
|
|
39
|
+
htmlInputType: Map<string, Feature[]>;
|
|
40
|
+
htmlButtonType: Map<string, Feature[]>;
|
|
41
|
+
htmlDoctype?: Feature;
|
|
42
|
+
htmlComments?: Feature;
|
|
43
|
+
htmlAnchorLinks?: Feature;
|
|
44
|
+
htmlMailtoLinks?: Feature;
|
|
45
|
+
htmlMetaColorScheme?: Feature;
|
|
46
|
+
htmlSemantics?: Feature;
|
|
47
|
+
htmlStyleInBody?: Feature;
|
|
48
|
+
imageExt: Map<string, Feature[]>;
|
|
49
|
+
/** All features by slug — unfiltered, used for URL lookups (e.g. by lint). */
|
|
50
|
+
bySlug: Map<string, {
|
|
51
|
+
title: string;
|
|
52
|
+
url: string;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
declare function initCompatibility(): Promise<Indexes | null>;
|
|
56
|
+
declare function serveCompatibility(url: string, res: any, config: MaizzleConfig, componentDirs: NormalizedComponentSource[]): Promise<void>;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { initCompatibility, serveCompatibility };
|
|
59
|
+
//# sourceMappingURL=compatibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.d.ts","names":[],"sources":["../../src/server/compatibility.ts"],"mappings":";;;;UAkBU,OAAA;EACR,IAAA;EACA,KAAA;EACA,GAAA;EACA,QAAA;EACA,KAAA;AAAA;AAAA,UAoBQ,OAAA;EACR,SAAA;IAAa,SAAA;IAAmB,SAAA;IAAmB,WAAA;IAAqB,OAAA;IAAiB,KAAA;EAAA;EACzF,eAAA,EAAiB,MAAA;EACjB,OAAA,EAAS,GAAA,SAAY,OAAA;EACrB,YAAA,EAAc,GAAA,SAAY,KAAA;IAAQ,KAAA;IAAe,OAAA,EAAS,OAAA;EAAA;EAC1D,SAAA,EAAW,GAAA,SAAY,OAAA;EACvB,eAAA,EAAiB,GAAA,SAAY,OAAA;EAC7B,cAAA,EAAgB,GAAA,SAAY,OAAA;EAC5B,gBAAA,EAAkB,GAAA,SAAY,OAAA;EAC9B,WAAA,EAAa,GAAA,SAAY,OAAA;EACzB,OAAA,EAAS,GAAA,SAAY,OAAA;EACrB,YAAA,GAAe,OAAA;EACf,YAAA,GAAe,OAAA;EACf,UAAA,GAAa,OAAA;EACb,WAAA,GAAc,OAAA;EACd,cAAA,GAAiB,OAAA;EACjB,OAAA,EAAS,GAAA,SAAY,OAAA;EACrB,QAAA,EAAU,GAAA,SAAY,OAAA;EACtB,aAAA,EAAe,GAAA,SAAY,OAAA;EAC3B,cAAA,EAAgB,GAAA,SAAY,OAAA;EAC5B,WAAA,GAAc,OAAA;EACd,YAAA,GAAe,OAAA;EACf,eAAA,GAAkB,OAAA;EAClB,eAAA,GAAkB,OAAA;EAClB,mBAAA,GAAsB,OAAA;EACtB,aAAA,GAAgB,OAAA;EAChB,eAAA,GAAkB,OAAA;EAClB,QAAA,EAAU,GAAA,SAAY,OAAA;EATK;EAW3B,MAAA,EAAQ,GAAA;IAAc,KAAA;IAAe,GAAA;EAAA;AAAA;AAAA,iBAsOjB,iBAAA,CAAA,GAAqB,OAAA,CAAQ,OAAA;AAAA,iBA+jB7B,kBAAA,CACpB,GAAA,UACA,GAAA,OACA,MAAA,EAAQ,aAAA,EACR,aAAA,EAAe,yBAAA,KAA2B,OAAA"}
|