@maizzle/framework 6.0.0-rc.7 → 6.0.0-rc.9

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 (76) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +32 -0
  2. package/dist/build.mjs +2 -1
  3. package/dist/build.mjs.map +1 -1
  4. package/dist/components/Body.vue +105 -36
  5. package/dist/components/Button.vue +4 -1
  6. package/dist/components/CodeBlock.vue +1 -1
  7. package/dist/components/CodeInline.vue +6 -1
  8. package/dist/components/Column.vue +30 -5
  9. package/dist/components/Container.vue +10 -2
  10. package/dist/components/Divider.vue +28 -0
  11. package/dist/components/Head.vue +22 -0
  12. package/dist/components/Heading.vue +28 -0
  13. package/dist/components/Html.vue +98 -47
  14. package/dist/components/Layout.vue +93 -0
  15. package/dist/components/Link.vue +26 -0
  16. package/dist/components/Markdown.vue +22 -3
  17. package/dist/components/Outlook.vue +36 -0
  18. package/dist/components/Overlap.vue +25 -5
  19. package/dist/components/Preheader.vue +1 -1
  20. package/dist/components/Row.vue +16 -5
  21. package/dist/components/Section.vue +83 -0
  22. package/dist/components/Text.vue +29 -0
  23. package/dist/components/Vml.vue +165 -13
  24. package/dist/index.d.mts +2 -1
  25. package/dist/index.mjs +2 -1
  26. package/dist/node_modules/picomatch/index.mjs +13 -0
  27. package/dist/node_modules/picomatch/index.mjs.map +1 -0
  28. package/dist/node_modules/picomatch/lib/constants.mjs +174 -0
  29. package/dist/node_modules/picomatch/lib/constants.mjs.map +1 -0
  30. package/dist/node_modules/picomatch/lib/parse.mjs +1067 -0
  31. package/dist/node_modules/picomatch/lib/parse.mjs.map +1 -0
  32. package/dist/node_modules/picomatch/lib/picomatch.mjs +304 -0
  33. package/dist/node_modules/picomatch/lib/picomatch.mjs.map +1 -0
  34. package/dist/node_modules/picomatch/lib/scan.mjs +296 -0
  35. package/dist/node_modules/picomatch/lib/scan.mjs.map +1 -0
  36. package/dist/node_modules/picomatch/lib/utils.mjs +53 -0
  37. package/dist/node_modules/picomatch/lib/utils.mjs.map +1 -0
  38. package/dist/plugin.mjs +11 -7
  39. package/dist/plugin.mjs.map +1 -1
  40. package/dist/plugins/postcss/tailwindCleanup.d.mts.map +1 -1
  41. package/dist/plugins/postcss/tailwindCleanup.mjs +24 -2
  42. package/dist/plugins/postcss/tailwindCleanup.mjs.map +1 -1
  43. package/dist/render/createRenderer.d.mts +3 -0
  44. package/dist/render/createRenderer.d.mts.map +1 -1
  45. package/dist/render/createRenderer.mjs +26 -7
  46. package/dist/render/createRenderer.mjs.map +1 -1
  47. package/dist/render/index.mjs +2 -1
  48. package/dist/render/index.mjs.map +1 -1
  49. package/dist/serve.d.mts.map +1 -1
  50. package/dist/serve.mjs +13 -6
  51. package/dist/serve.mjs.map +1 -1
  52. package/dist/server/compatibility.mjs +15 -1
  53. package/dist/server/compatibility.mjs.map +1 -1
  54. package/dist/server/email.mjs +2 -1
  55. package/dist/server/email.mjs.map +1 -1
  56. package/dist/server/linter.d.mts +1 -2
  57. package/dist/server/linter.d.mts.map +1 -1
  58. package/dist/server/linter.mjs +60 -71
  59. package/dist/server/linter.mjs.map +1 -1
  60. package/dist/server/ui/App.vue +9 -9
  61. package/dist/server/ui/pages/Preview.vue +215 -150
  62. package/dist/transformers/index.d.mts +10 -9
  63. package/dist/transformers/index.d.mts.map +1 -1
  64. package/dist/transformers/index.mjs +12 -9
  65. package/dist/transformers/index.mjs.map +1 -1
  66. package/dist/transformers/inlineCSS.d.mts +1 -14
  67. package/dist/transformers/inlineCSS.d.mts.map +1 -1
  68. package/dist/transformers/inlineCSS.mjs +16 -34
  69. package/dist/transformers/inlineCSS.mjs.map +1 -1
  70. package/dist/transformers/sixHex.d.mts +16 -0
  71. package/dist/transformers/sixHex.d.mts.map +1 -0
  72. package/dist/transformers/sixHex.mjs +30 -0
  73. package/dist/transformers/sixHex.mjs.map +1 -0
  74. package/dist/types/config.d.mts +57 -28
  75. package/dist/types/config.d.mts.map +1 -1
  76. package/package.json +2 -1
@@ -0,0 +1,296 @@
1
+ import { __commonJSMin } from "../../../_virtual/_rolldown/runtime.mjs";
2
+ import { require_constants } from "./constants.mjs";
3
+ import { require_utils } from "./utils.mjs";
4
+
5
+ //#region node_modules/picomatch/lib/scan.js
6
+ var require_scan = /* @__PURE__ */ __commonJSMin(((exports, module) => {
7
+ const utils = require_utils();
8
+ const { CHAR_ASTERISK, CHAR_AT, CHAR_BACKWARD_SLASH, CHAR_COMMA, CHAR_DOT, CHAR_EXCLAMATION_MARK, CHAR_FORWARD_SLASH, CHAR_LEFT_CURLY_BRACE, CHAR_LEFT_PARENTHESES, CHAR_LEFT_SQUARE_BRACKET, CHAR_PLUS, CHAR_QUESTION_MARK, CHAR_RIGHT_CURLY_BRACE, CHAR_RIGHT_PARENTHESES, CHAR_RIGHT_SQUARE_BRACKET } = require_constants();
9
+ const isPathSeparator = (code) => {
10
+ return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
11
+ };
12
+ const depth = (token) => {
13
+ if (token.isPrefix !== true) token.depth = token.isGlobstar ? Infinity : 1;
14
+ };
15
+ /**
16
+ * Quickly scans a glob pattern and returns an object with a handful of
17
+ * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
18
+ * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
19
+ * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
20
+ *
21
+ * ```js
22
+ * const pm = require('picomatch');
23
+ * console.log(pm.scan('foo/bar/*.js'));
24
+ * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
25
+ * ```
26
+ * @param {String} `str`
27
+ * @param {Object} `options`
28
+ * @return {Object} Returns an object with tokens and regex source string.
29
+ * @api public
30
+ */
31
+ const scan = (input, options) => {
32
+ const opts = options || {};
33
+ const length = input.length - 1;
34
+ const scanToEnd = opts.parts === true || opts.scanToEnd === true;
35
+ const slashes = [];
36
+ const tokens = [];
37
+ const parts = [];
38
+ let str = input;
39
+ let index = -1;
40
+ let start = 0;
41
+ let lastIndex = 0;
42
+ let isBrace = false;
43
+ let isBracket = false;
44
+ let isGlob = false;
45
+ let isExtglob = false;
46
+ let isGlobstar = false;
47
+ let braceEscaped = false;
48
+ let backslashes = false;
49
+ let negated = false;
50
+ let negatedExtglob = false;
51
+ let finished = false;
52
+ let braces = 0;
53
+ let prev;
54
+ let code;
55
+ let token = {
56
+ value: "",
57
+ depth: 0,
58
+ isGlob: false
59
+ };
60
+ const eos = () => index >= length;
61
+ const peek = () => str.charCodeAt(index + 1);
62
+ const advance = () => {
63
+ prev = code;
64
+ return str.charCodeAt(++index);
65
+ };
66
+ while (index < length) {
67
+ code = advance();
68
+ let next;
69
+ if (code === CHAR_BACKWARD_SLASH) {
70
+ backslashes = token.backslashes = true;
71
+ code = advance();
72
+ if (code === CHAR_LEFT_CURLY_BRACE) braceEscaped = true;
73
+ continue;
74
+ }
75
+ if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {
76
+ braces++;
77
+ while (eos() !== true && (code = advance())) {
78
+ if (code === CHAR_BACKWARD_SLASH) {
79
+ backslashes = token.backslashes = true;
80
+ advance();
81
+ continue;
82
+ }
83
+ if (code === CHAR_LEFT_CURLY_BRACE) {
84
+ braces++;
85
+ continue;
86
+ }
87
+ if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {
88
+ isBrace = token.isBrace = true;
89
+ isGlob = token.isGlob = true;
90
+ finished = true;
91
+ if (scanToEnd === true) continue;
92
+ break;
93
+ }
94
+ if (braceEscaped !== true && code === CHAR_COMMA) {
95
+ isBrace = token.isBrace = true;
96
+ isGlob = token.isGlob = true;
97
+ finished = true;
98
+ if (scanToEnd === true) continue;
99
+ break;
100
+ }
101
+ if (code === CHAR_RIGHT_CURLY_BRACE) {
102
+ braces--;
103
+ if (braces === 0) {
104
+ braceEscaped = false;
105
+ isBrace = token.isBrace = true;
106
+ finished = true;
107
+ break;
108
+ }
109
+ }
110
+ }
111
+ if (scanToEnd === true) continue;
112
+ break;
113
+ }
114
+ if (code === CHAR_FORWARD_SLASH) {
115
+ slashes.push(index);
116
+ tokens.push(token);
117
+ token = {
118
+ value: "",
119
+ depth: 0,
120
+ isGlob: false
121
+ };
122
+ if (finished === true) continue;
123
+ if (prev === CHAR_DOT && index === start + 1) {
124
+ start += 2;
125
+ continue;
126
+ }
127
+ lastIndex = index + 1;
128
+ continue;
129
+ }
130
+ if (opts.noext !== true) {
131
+ if ((code === CHAR_PLUS || code === CHAR_AT || code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK || code === CHAR_EXCLAMATION_MARK) === true && peek() === CHAR_LEFT_PARENTHESES) {
132
+ isGlob = token.isGlob = true;
133
+ isExtglob = token.isExtglob = true;
134
+ finished = true;
135
+ if (code === CHAR_EXCLAMATION_MARK && index === start) negatedExtglob = true;
136
+ if (scanToEnd === true) {
137
+ while (eos() !== true && (code = advance())) {
138
+ if (code === CHAR_BACKWARD_SLASH) {
139
+ backslashes = token.backslashes = true;
140
+ code = advance();
141
+ continue;
142
+ }
143
+ if (code === CHAR_RIGHT_PARENTHESES) {
144
+ isGlob = token.isGlob = true;
145
+ finished = true;
146
+ break;
147
+ }
148
+ }
149
+ continue;
150
+ }
151
+ break;
152
+ }
153
+ }
154
+ if (code === CHAR_ASTERISK) {
155
+ if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
156
+ isGlob = token.isGlob = true;
157
+ finished = true;
158
+ if (scanToEnd === true) continue;
159
+ break;
160
+ }
161
+ if (code === CHAR_QUESTION_MARK) {
162
+ isGlob = token.isGlob = true;
163
+ finished = true;
164
+ if (scanToEnd === true) continue;
165
+ break;
166
+ }
167
+ if (code === CHAR_LEFT_SQUARE_BRACKET) {
168
+ while (eos() !== true && (next = advance())) {
169
+ if (next === CHAR_BACKWARD_SLASH) {
170
+ backslashes = token.backslashes = true;
171
+ advance();
172
+ continue;
173
+ }
174
+ if (next === CHAR_RIGHT_SQUARE_BRACKET) {
175
+ isBracket = token.isBracket = true;
176
+ isGlob = token.isGlob = true;
177
+ finished = true;
178
+ break;
179
+ }
180
+ }
181
+ if (scanToEnd === true) continue;
182
+ break;
183
+ }
184
+ if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
185
+ negated = token.negated = true;
186
+ start++;
187
+ continue;
188
+ }
189
+ if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {
190
+ isGlob = token.isGlob = true;
191
+ if (scanToEnd === true) {
192
+ while (eos() !== true && (code = advance())) {
193
+ if (code === CHAR_LEFT_PARENTHESES) {
194
+ backslashes = token.backslashes = true;
195
+ code = advance();
196
+ continue;
197
+ }
198
+ if (code === CHAR_RIGHT_PARENTHESES) {
199
+ finished = true;
200
+ break;
201
+ }
202
+ }
203
+ continue;
204
+ }
205
+ break;
206
+ }
207
+ if (isGlob === true) {
208
+ finished = true;
209
+ if (scanToEnd === true) continue;
210
+ break;
211
+ }
212
+ }
213
+ if (opts.noext === true) {
214
+ isExtglob = false;
215
+ isGlob = false;
216
+ }
217
+ let base = str;
218
+ let prefix = "";
219
+ let glob = "";
220
+ if (start > 0) {
221
+ prefix = str.slice(0, start);
222
+ str = str.slice(start);
223
+ lastIndex -= start;
224
+ }
225
+ if (base && isGlob === true && lastIndex > 0) {
226
+ base = str.slice(0, lastIndex);
227
+ glob = str.slice(lastIndex);
228
+ } else if (isGlob === true) {
229
+ base = "";
230
+ glob = str;
231
+ } else base = str;
232
+ if (base && base !== "" && base !== "/" && base !== str) {
233
+ if (isPathSeparator(base.charCodeAt(base.length - 1))) base = base.slice(0, -1);
234
+ }
235
+ if (opts.unescape === true) {
236
+ if (glob) glob = utils.removeBackslashes(glob);
237
+ if (base && backslashes === true) base = utils.removeBackslashes(base);
238
+ }
239
+ const state = {
240
+ prefix,
241
+ input,
242
+ start,
243
+ base,
244
+ glob,
245
+ isBrace,
246
+ isBracket,
247
+ isGlob,
248
+ isExtglob,
249
+ isGlobstar,
250
+ negated,
251
+ negatedExtglob
252
+ };
253
+ if (opts.tokens === true) {
254
+ state.maxDepth = 0;
255
+ if (!isPathSeparator(code)) tokens.push(token);
256
+ state.tokens = tokens;
257
+ }
258
+ if (opts.parts === true || opts.tokens === true) {
259
+ let prevIndex;
260
+ for (let idx = 0; idx < slashes.length; idx++) {
261
+ const n = prevIndex ? prevIndex + 1 : start;
262
+ const i = slashes[idx];
263
+ const value = input.slice(n, i);
264
+ if (opts.tokens) {
265
+ if (idx === 0 && start !== 0) {
266
+ tokens[idx].isPrefix = true;
267
+ tokens[idx].value = prefix;
268
+ } else tokens[idx].value = value;
269
+ depth(tokens[idx]);
270
+ state.maxDepth += tokens[idx].depth;
271
+ }
272
+ if (idx !== 0 || value !== "") parts.push(value);
273
+ prevIndex = i;
274
+ }
275
+ if (prevIndex && prevIndex + 1 < input.length) {
276
+ const value = input.slice(prevIndex + 1);
277
+ parts.push(value);
278
+ if (opts.tokens) {
279
+ tokens[tokens.length - 1].value = value;
280
+ depth(tokens[tokens.length - 1]);
281
+ state.maxDepth += tokens[tokens.length - 1].depth;
282
+ }
283
+ }
284
+ state.slashes = slashes;
285
+ state.parts = parts;
286
+ }
287
+ return state;
288
+ };
289
+ module.exports = scan;
290
+ }));
291
+
292
+ //#endregion
293
+ export default require_scan();
294
+
295
+ export { require_scan };
296
+ //# sourceMappingURL=scan.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.mjs","names":[],"sources":["../../../../node_modules/picomatch/lib/scan.js"],"sourcesContent":["'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n"],"x_google_ignoreList":[0],"mappings":";;;;;;CAEA,MAAM;CACN,MAAM,EACJ,eACA,SACA,qBACA,YACA,UACA,uBACA,oBACA,uBACA,uBACA,0BACA,WACA,oBACA,wBACA,wBACA;CAGF,MAAM,mBAAkB,SAAQ;AAC9B,SAAO,SAAS,sBAAsB,SAAS;;CAGjD,MAAM,SAAQ,UAAS;AACrB,MAAI,MAAM,aAAa,KACrB,OAAM,QAAQ,MAAM,aAAa,WAAW;;;;;;;;;;;;;;;;;;CAqBhD,MAAM,QAAQ,OAAO,YAAY;EAC/B,MAAM,OAAO,WAAW,EAAE;EAE1B,MAAM,SAAS,MAAM,SAAS;EAC9B,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK,cAAc;EAC5D,MAAM,UAAU,EAAE;EAClB,MAAM,SAAS,EAAE;EACjB,MAAM,QAAQ,EAAE;EAEhB,IAAI,MAAM;EACV,IAAI,QAAQ;EACZ,IAAI,QAAQ;EACZ,IAAI,YAAY;EAChB,IAAI,UAAU;EACd,IAAI,YAAY;EAChB,IAAI,SAAS;EACb,IAAI,YAAY;EAChB,IAAI,aAAa;EACjB,IAAI,eAAe;EACnB,IAAI,cAAc;EAClB,IAAI,UAAU;EACd,IAAI,iBAAiB;EACrB,IAAI,WAAW;EACf,IAAI,SAAS;EACb,IAAI;EACJ,IAAI;EACJ,IAAI,QAAQ;GAAE,OAAO;GAAI,OAAO;GAAG,QAAQ;GAAO;EAElD,MAAM,YAAY,SAAS;EAC3B,MAAM,aAAa,IAAI,WAAW,QAAQ,EAAE;EAC5C,MAAM,gBAAgB;AACpB,UAAO;AACP,UAAO,IAAI,WAAW,EAAE,MAAM;;AAGhC,SAAO,QAAQ,QAAQ;AACrB,UAAO,SAAS;GAChB,IAAI;AAEJ,OAAI,SAAS,qBAAqB;AAChC,kBAAc,MAAM,cAAc;AAClC,WAAO,SAAS;AAEhB,QAAI,SAAS,sBACX,gBAAe;AAEjB;;AAGF,OAAI,iBAAiB,QAAQ,SAAS,uBAAuB;AAC3D;AAEA,WAAO,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,SAAI,SAAS,qBAAqB;AAChC,oBAAc,MAAM,cAAc;AAClC,eAAS;AACT;;AAGF,SAAI,SAAS,uBAAuB;AAClC;AACA;;AAGF,SAAI,iBAAiB,QAAQ,SAAS,aAAa,OAAO,SAAS,MAAM,UAAU;AACjF,gBAAU,MAAM,UAAU;AAC1B,eAAS,MAAM,SAAS;AACxB,iBAAW;AAEX,UAAI,cAAc,KAChB;AAGF;;AAGF,SAAI,iBAAiB,QAAQ,SAAS,YAAY;AAChD,gBAAU,MAAM,UAAU;AAC1B,eAAS,MAAM,SAAS;AACxB,iBAAW;AAEX,UAAI,cAAc,KAChB;AAGF;;AAGF,SAAI,SAAS,wBAAwB;AACnC;AAEA,UAAI,WAAW,GAAG;AAChB,sBAAe;AACf,iBAAU,MAAM,UAAU;AAC1B,kBAAW;AACX;;;;AAKN,QAAI,cAAc,KAChB;AAGF;;AAGF,OAAI,SAAS,oBAAoB;AAC/B,YAAQ,KAAK,MAAM;AACnB,WAAO,KAAK,MAAM;AAClB,YAAQ;KAAE,OAAO;KAAI,OAAO;KAAG,QAAQ;KAAO;AAE9C,QAAI,aAAa,KAAM;AACvB,QAAI,SAAS,YAAY,UAAW,QAAQ,GAAI;AAC9C,cAAS;AACT;;AAGF,gBAAY,QAAQ;AACpB;;AAGF,OAAI,KAAK,UAAU,MAOjB;SANsB,SAAS,aAC1B,SAAS,WACT,SAAS,iBACT,SAAS,sBACT,SAAS,2BAEQ,QAAQ,MAAM,KAAK,uBAAuB;AAC9D,cAAS,MAAM,SAAS;AACxB,iBAAY,MAAM,YAAY;AAC9B,gBAAW;AACX,SAAI,SAAS,yBAAyB,UAAU,MAC9C,kBAAiB;AAGnB,SAAI,cAAc,MAAM;AACtB,aAAO,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,WAAI,SAAS,qBAAqB;AAChC,sBAAc,MAAM,cAAc;AAClC,eAAO,SAAS;AAChB;;AAGF,WAAI,SAAS,wBAAwB;AACnC,iBAAS,MAAM,SAAS;AACxB,mBAAW;AACX;;;AAGJ;;AAEF;;;AAIJ,OAAI,SAAS,eAAe;AAC1B,QAAI,SAAS,cAAe,cAAa,MAAM,aAAa;AAC5D,aAAS,MAAM,SAAS;AACxB,eAAW;AAEX,QAAI,cAAc,KAChB;AAEF;;AAGF,OAAI,SAAS,oBAAoB;AAC/B,aAAS,MAAM,SAAS;AACxB,eAAW;AAEX,QAAI,cAAc,KAChB;AAEF;;AAGF,OAAI,SAAS,0BAA0B;AACrC,WAAO,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,SAAI,SAAS,qBAAqB;AAChC,oBAAc,MAAM,cAAc;AAClC,eAAS;AACT;;AAGF,SAAI,SAAS,2BAA2B;AACtC,kBAAY,MAAM,YAAY;AAC9B,eAAS,MAAM,SAAS;AACxB,iBAAW;AACX;;;AAIJ,QAAI,cAAc,KAChB;AAGF;;AAGF,OAAI,KAAK,aAAa,QAAQ,SAAS,yBAAyB,UAAU,OAAO;AAC/E,cAAU,MAAM,UAAU;AAC1B;AACA;;AAGF,OAAI,KAAK,YAAY,QAAQ,SAAS,uBAAuB;AAC3D,aAAS,MAAM,SAAS;AAExB,QAAI,cAAc,MAAM;AACtB,YAAO,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,UAAI,SAAS,uBAAuB;AAClC,qBAAc,MAAM,cAAc;AAClC,cAAO,SAAS;AAChB;;AAGF,UAAI,SAAS,wBAAwB;AACnC,kBAAW;AACX;;;AAGJ;;AAEF;;AAGF,OAAI,WAAW,MAAM;AACnB,eAAW;AAEX,QAAI,cAAc,KAChB;AAGF;;;AAIJ,MAAI,KAAK,UAAU,MAAM;AACvB,eAAY;AACZ,YAAS;;EAGX,IAAI,OAAO;EACX,IAAI,SAAS;EACb,IAAI,OAAO;AAEX,MAAI,QAAQ,GAAG;AACb,YAAS,IAAI,MAAM,GAAG,MAAM;AAC5B,SAAM,IAAI,MAAM,MAAM;AACtB,gBAAa;;AAGf,MAAI,QAAQ,WAAW,QAAQ,YAAY,GAAG;AAC5C,UAAO,IAAI,MAAM,GAAG,UAAU;AAC9B,UAAO,IAAI,MAAM,UAAU;aAClB,WAAW,MAAM;AAC1B,UAAO;AACP,UAAO;QAEP,QAAO;AAGT,MAAI,QAAQ,SAAS,MAAM,SAAS,OAAO,SAAS,KAClD;OAAI,gBAAgB,KAAK,WAAW,KAAK,SAAS,EAAE,CAAC,CACnD,QAAO,KAAK,MAAM,GAAG,GAAG;;AAI5B,MAAI,KAAK,aAAa,MAAM;AAC1B,OAAI,KAAM,QAAO,MAAM,kBAAkB,KAAK;AAE9C,OAAI,QAAQ,gBAAgB,KAC1B,QAAO,MAAM,kBAAkB,KAAK;;EAIxC,MAAM,QAAQ;GACZ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;AAED,MAAI,KAAK,WAAW,MAAM;AACxB,SAAM,WAAW;AACjB,OAAI,CAAC,gBAAgB,KAAK,CACxB,QAAO,KAAK,MAAM;AAEpB,SAAM,SAAS;;AAGjB,MAAI,KAAK,UAAU,QAAQ,KAAK,WAAW,MAAM;GAC/C,IAAI;AAEJ,QAAK,IAAI,MAAM,GAAG,MAAM,QAAQ,QAAQ,OAAO;IAC7C,MAAM,IAAI,YAAY,YAAY,IAAI;IACtC,MAAM,IAAI,QAAQ;IAClB,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;AAC/B,QAAI,KAAK,QAAQ;AACf,SAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,aAAO,KAAK,WAAW;AACvB,aAAO,KAAK,QAAQ;WAEpB,QAAO,KAAK,QAAQ;AAEtB,WAAM,OAAO,KAAK;AAClB,WAAM,YAAY,OAAO,KAAK;;AAEhC,QAAI,QAAQ,KAAK,UAAU,GACzB,OAAM,KAAK,MAAM;AAEnB,gBAAY;;AAGd,OAAI,aAAa,YAAY,IAAI,MAAM,QAAQ;IAC7C,MAAM,QAAQ,MAAM,MAAM,YAAY,EAAE;AACxC,UAAM,KAAK,MAAM;AAEjB,QAAI,KAAK,QAAQ;AACf,YAAO,OAAO,SAAS,GAAG,QAAQ;AAClC,WAAM,OAAO,OAAO,SAAS,GAAG;AAChC,WAAM,YAAY,OAAO,OAAO,SAAS,GAAG;;;AAIhD,SAAM,UAAU;AAChB,SAAM,QAAQ;;AAGhB,SAAO;;AAGT,QAAO,UAAU"}
@@ -0,0 +1,53 @@
1
+ import { __commonJSMin, __require } from "../../../_virtual/_rolldown/runtime.mjs";
2
+ import { require_constants } from "./constants.mjs";
3
+
4
+ //#region node_modules/picomatch/lib/utils.js
5
+ var require_utils = /* @__PURE__ */ __commonJSMin(((exports) => {
6
+ const path = __require("path");
7
+ const win32 = process.platform === "win32";
8
+ const { REGEX_BACKSLASH, REGEX_REMOVE_BACKSLASH, REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL } = require_constants();
9
+ exports.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val);
10
+ exports.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str);
11
+ exports.isRegexChar = (str) => str.length === 1 && exports.hasRegexChars(str);
12
+ exports.escapeRegex = (str) => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, "\\$1");
13
+ exports.toPosixSlashes = (str) => str.replace(REGEX_BACKSLASH, "/");
14
+ exports.removeBackslashes = (str) => {
15
+ return str.replace(REGEX_REMOVE_BACKSLASH, (match) => {
16
+ return match === "\\" ? "" : match;
17
+ });
18
+ };
19
+ exports.supportsLookbehinds = () => {
20
+ const segs = process.version.slice(1).split(".").map(Number);
21
+ if (segs.length === 3 && segs[0] >= 9 || segs[0] === 8 && segs[1] >= 10) return true;
22
+ return false;
23
+ };
24
+ exports.isWindows = (options) => {
25
+ if (options && typeof options.windows === "boolean") return options.windows;
26
+ return win32 === true || path.sep === "\\";
27
+ };
28
+ exports.escapeLast = (input, char, lastIdx) => {
29
+ const idx = input.lastIndexOf(char, lastIdx);
30
+ if (idx === -1) return input;
31
+ if (input[idx - 1] === "\\") return exports.escapeLast(input, char, idx - 1);
32
+ return `${input.slice(0, idx)}\\${input.slice(idx)}`;
33
+ };
34
+ exports.removePrefix = (input, state = {}) => {
35
+ let output = input;
36
+ if (output.startsWith("./")) {
37
+ output = output.slice(2);
38
+ state.prefix = "./";
39
+ }
40
+ return output;
41
+ };
42
+ exports.wrapOutput = (input, state = {}, options = {}) => {
43
+ let output = `${options.contains ? "" : "^"}(?:${input})${options.contains ? "" : "$"}`;
44
+ if (state.negated === true) output = `(?:^(?!${output}).*$)`;
45
+ return output;
46
+ };
47
+ }));
48
+
49
+ //#endregion
50
+ export default require_utils();
51
+
52
+ export { require_utils };
53
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../node_modules/picomatch/lib/utils.js"],"sourcesContent":["'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n"],"x_google_ignoreList":[0],"mappings":";;;;;CAEA,MAAM,iBAAe,OAAO;CAC5B,MAAM,QAAQ,QAAQ,aAAa;CACnC,MAAM,EACJ,iBACA,wBACA,qBACA;AAGF,SAAQ,YAAW,QAAO,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI;AACxF,SAAQ,iBAAgB,QAAO,oBAAoB,KAAK,IAAI;AAC5D,SAAQ,eAAc,QAAO,IAAI,WAAW,KAAK,QAAQ,cAAc,IAAI;AAC3E,SAAQ,eAAc,QAAO,IAAI,QAAQ,4BAA4B,OAAO;AAC5E,SAAQ,kBAAiB,QAAO,IAAI,QAAQ,iBAAiB,IAAI;AAEjE,SAAQ,qBAAoB,QAAO;AACjC,SAAO,IAAI,QAAQ,yBAAwB,UAAS;AAClD,UAAO,UAAU,OAAO,KAAK;IAC7B;;AAGJ,SAAQ,4BAA4B;EAClC,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO;AAC5D,MAAI,KAAK,WAAW,KAAK,KAAK,MAAM,KAAM,KAAK,OAAO,KAAK,KAAK,MAAM,GACpE,QAAO;AAET,SAAO;;AAGT,SAAQ,aAAY,YAAW;AAC7B,MAAI,WAAW,OAAO,QAAQ,YAAY,UACxC,QAAO,QAAQ;AAEjB,SAAO,UAAU,QAAQ,KAAK,QAAQ;;AAGxC,SAAQ,cAAc,OAAO,MAAM,YAAY;EAC7C,MAAM,MAAM,MAAM,YAAY,MAAM,QAAQ;AAC5C,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,MAAM,MAAM,OAAO,KAAM,QAAO,QAAQ,WAAW,OAAO,MAAM,MAAM,EAAE;AAC5E,SAAO,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,MAAM,MAAM,IAAI;;AAGpD,SAAQ,gBAAgB,OAAO,QAAQ,EAAE,KAAK;EAC5C,IAAI,SAAS;AACb,MAAI,OAAO,WAAW,KAAK,EAAE;AAC3B,YAAS,OAAO,MAAM,EAAE;AACxB,SAAM,SAAS;;AAEjB,SAAO;;AAGT,SAAQ,cAAc,OAAO,QAAQ,EAAE,EAAE,UAAU,EAAE,KAAK;EAIxD,IAAI,SAAS,GAHG,QAAQ,WAAW,KAAK,IAGhB,KAAK,MAAM,GAFpB,QAAQ,WAAW,KAAK;AAGvC,MAAI,MAAM,YAAY,KACpB,UAAS,UAAU,OAAO;AAE5B,SAAO"}
package/dist/plugin.mjs CHANGED
@@ -26,13 +26,17 @@ function maizzle(configInput) {
26
26
  return [{
27
27
  name: "maizzle",
28
28
  async configureServer(hostServer) {
29
- const { serve, printBanner } = await import("./serve.mjs");
30
- maizzleServer = await serve({
31
- config: configInput,
32
- silent: true
33
- });
34
- hostServer.httpServer?.on("listening", () => {
35
- printBanner(maizzleServer);
29
+ if (maizzleServer) {
30
+ await maizzleServer.close();
31
+ maizzleServer = null;
32
+ }
33
+ const { serve } = await import("./serve.mjs");
34
+ maizzleServer = await serve({ config: configInput });
35
+ hostServer.httpServer?.on("close", () => {
36
+ if (maizzleServer) {
37
+ maizzleServer.close();
38
+ maizzleServer = null;
39
+ }
36
40
  });
37
41
  },
38
42
  async closeBundle() {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\nimport type { MaizzleConfig } from './types/index.ts'\nimport { isLaravel } from './utils/detect.ts'\n\n/**\n * Maizzle Vite plugin for use inside an existing Vite project.\n *\n * - During `vite dev`: starts a separate Maizzle dev server on its own port\n * - During `vite build`: builds email templates alongside the host app\n *\n * Does NOT inject Vue, Tailwind, or any other plugins into the host's pipeline.\n * The host app manages its own stack. Maizzle runs in its own process.\n */\nexport function maizzle(configInput?: Partial<MaizzleConfig>): Plugin[] {\n let maizzleServer: ViteDevServer | null = null\n\n // Auto-configure defaults for Laravel projects\n if (isLaravel()) {\n const existing = configInput?.components?.source\n const laravelComponentDir = 'resources/js/components/email'\n\n if (!existing) {\n configInput = {\n ...configInput,\n components: {\n ...configInput?.components,\n source: [laravelComponentDir],\n },\n }\n }\n }\n\n return [{\n name: 'maizzle',\n\n async configureServer(hostServer) {\n const { serve, printBanner } = await import('./serve.ts')\n maizzleServer = await serve({ config: configInput, silent: true })\n\n // Print Maizzle banner after the host server prints its URLs\n hostServer.httpServer?.on('listening', () => {\n printBanner(maizzleServer!)\n })\n },\n\n async closeBundle() {\n if (this.meta.watchMode) return\n\n const { build } = await import('./build.ts')\n await build({ config: configInput })\n },\n\n async buildEnd() {\n if (maizzleServer) {\n await maizzleServer.close()\n maizzleServer = null\n }\n },\n }]\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,QAAQ,aAAgD;CACtE,IAAI,gBAAsC;AAG1C,KAAI,WAAW,EAAE;EACf,MAAM,WAAW,aAAa,YAAY;EAC1C,MAAM,sBAAsB;AAE5B,MAAI,CAAC,SACH,eAAc;GACZ,GAAG;GACH,YAAY;IACV,GAAG,aAAa;IAChB,QAAQ,CAAC,oBAAoB;IAC9B;GACF;;AAIL,QAAO,CAAC;EACN,MAAM;EAEN,MAAM,gBAAgB,YAAY;GAChC,MAAM,EAAE,OAAO,gBAAgB,MAAM,OAAO;AAC5C,mBAAgB,MAAM,MAAM;IAAE,QAAQ;IAAa,QAAQ;IAAM,CAAC;AAGlE,cAAW,YAAY,GAAG,mBAAmB;AAC3C,gBAAY,cAAe;KAC3B;;EAGJ,MAAM,cAAc;AAClB,OAAI,KAAK,KAAK,UAAW;GAEzB,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,SAAM,MAAM,EAAE,QAAQ,aAAa,CAAC;;EAGtC,MAAM,WAAW;AACf,OAAI,eAAe;AACjB,UAAM,cAAc,OAAO;AAC3B,oBAAgB;;;EAGrB,CAAC"}
1
+ {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\nimport type { MaizzleConfig } from './types/index.ts'\nimport { isLaravel } from './utils/detect.ts'\n\n/**\n * Maizzle Vite plugin for use inside an existing Vite project.\n *\n * - During `vite dev`: starts a separate Maizzle dev server on its own port\n * - During `vite build`: builds email templates alongside the host app\n *\n * Does NOT inject Vue, Tailwind, or any other plugins into the host's pipeline.\n * The host app manages its own stack. Maizzle runs in its own process.\n */\nexport function maizzle(configInput?: Partial<MaizzleConfig>): Plugin[] {\n let maizzleServer: ViteDevServer | null = null\n\n // Auto-configure defaults for Laravel projects\n if (isLaravel()) {\n const existing = configInput?.components?.source\n const laravelComponentDir = 'resources/js/components/email'\n\n if (!existing) {\n configInput = {\n ...configInput,\n components: {\n ...configInput?.components,\n source: [laravelComponentDir],\n },\n }\n }\n }\n\n return [{\n name: 'maizzle',\n\n async configureServer(hostServer) {\n // Close previous Maizzle server if the host restarts\n if (maizzleServer) {\n await maizzleServer.close()\n maizzleServer = null\n }\n\n const { serve } = await import('./serve.ts')\n maizzleServer = await serve({ config: configInput })\n\n // Clean up when the host server closes\n hostServer.httpServer?.on('close', () => {\n if (maizzleServer) {\n maizzleServer.close()\n maizzleServer = null\n }\n })\n },\n\n async closeBundle() {\n if (this.meta.watchMode) return\n\n const { build } = await import('./build.ts')\n await build({ config: configInput })\n },\n\n async buildEnd() {\n if (maizzleServer) {\n await maizzleServer.close()\n maizzleServer = null\n }\n },\n }]\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,QAAQ,aAAgD;CACtE,IAAI,gBAAsC;AAG1C,KAAI,WAAW,EAAE;EACf,MAAM,WAAW,aAAa,YAAY;EAC1C,MAAM,sBAAsB;AAE5B,MAAI,CAAC,SACH,eAAc;GACZ,GAAG;GACH,YAAY;IACV,GAAG,aAAa;IAChB,QAAQ,CAAC,oBAAoB;IAC9B;GACF;;AAIL,QAAO,CAAC;EACN,MAAM;EAEN,MAAM,gBAAgB,YAAY;AAEhC,OAAI,eAAe;AACjB,UAAM,cAAc,OAAO;AAC3B,oBAAgB;;GAGlB,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,mBAAgB,MAAM,MAAM,EAAE,QAAQ,aAAa,CAAC;AAGpD,cAAW,YAAY,GAAG,eAAe;AACvC,QAAI,eAAe;AACjB,mBAAc,OAAO;AACrB,qBAAgB;;KAElB;;EAGJ,MAAM,cAAc;AAClB,OAAI,KAAK,KAAK,UAAW;GAEzB,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,SAAM,MAAM,EAAE,QAAQ,aAAa,CAAC;;EAGtC,MAAM,WAAW;AACf,OAAI,eAAe;AACjB,UAAM,cAAc,OAAO;AAC3B,oBAAgB;;;EAGrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tailwindCleanup.d.mts","names":[],"sources":["../../../src/plugins/postcss/tailwindCleanup.ts"],"mappings":";;;;;;AAgBA;;;;;;;;iBAAgB,eAAA,CAAgB,MAAA,EAAQ,aAAA,GAAgB,OAAA,CAAQ,MAAA"}
1
+ {"version":3,"file":"tailwindCleanup.d.mts","names":[],"sources":["../../../src/plugins/postcss/tailwindCleanup.ts"],"mappings":";;;;;;AA0CA;;;;;;;;iBAAgB,eAAA,CAAgB,MAAA,EAAQ,aAAA,GAAgB,OAAA,CAAQ,MAAA"}
@@ -2,6 +2,28 @@
2
2
  const DEFAULT_SELECTORS = [":host", ":lang"];
3
3
  const DEFAULT_AT_RULES = ["layer", "property"];
4
4
  /**
5
+ * Split a selector list on top-level commas only.
6
+ *
7
+ * Commas inside parenthesised groups like `:not(:is(:lang(ae), :lang(ar)))`
8
+ * are not treated as selector separators.
9
+ */
10
+ function splitSelector(selector) {
11
+ const parts = [];
12
+ let depth = 0;
13
+ let start = 0;
14
+ for (let i = 0; i < selector.length; i++) {
15
+ const ch = selector[i];
16
+ if (ch === "(") depth++;
17
+ else if (ch === ")") depth--;
18
+ else if (ch === "," && depth === 0) {
19
+ parts.push(selector.slice(start, i).trim());
20
+ start = i + 1;
21
+ }
22
+ }
23
+ parts.push(selector.slice(start).trim());
24
+ return parts.filter(Boolean);
25
+ }
26
+ /**
5
27
  * Removes CSS rules whose every comma-separated selector part starts with
6
28
  * one of the configured prefixes (e.g. ':host', ':lang'). Rules with mixed
7
29
  * selectors have the unwanted parts stripped.
@@ -18,8 +40,8 @@ function tailwindCleanup(config) {
18
40
  {
19
41
  postcssPlugin: "tailwind-cleanup-selectors",
20
42
  Rule(rule) {
21
- const parts = rule.selector.split(",").map((s) => s.trim());
22
- const kept = parts.filter((p) => !selectors.some((s) => p === s || p.startsWith(`${s}(`)));
43
+ const parts = splitSelector(rule.selector);
44
+ const kept = parts.filter((p) => !selectors.some((s) => p === s || p.includes(`${s}(`)));
23
45
  if (kept.length === 0) rule.remove();
24
46
  else if (kept.length < parts.length) rule.selector = kept.join(", ");
25
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tailwindCleanup.mjs","names":[],"sources":["../../../src/plugins/postcss/tailwindCleanup.ts"],"sourcesContent":["import postcss from 'postcss'\nimport type { MaizzleConfig } from '../../types/config.ts'\n\nconst DEFAULT_SELECTORS = [':host', ':lang']\nconst DEFAULT_AT_RULES = ['layer', 'property']\n\n/**\n * Removes CSS rules whose every comma-separated selector part starts with\n * one of the configured prefixes (e.g. ':host', ':lang'). Rules with mixed\n * selectors have the unwanted parts stripped.\n *\n * Also removes entire at-rules by name (e.g. '@layer', '@property').\n *\n * Intended to clean up Tailwind's compiled output after lightningcss has\n * flattened all modern CSS syntax.\n */\nexport function tailwindCleanup(config: MaizzleConfig): postcss.Plugin[] {\n const selectors: string[] = config.postcss?.removeSelectors ?? DEFAULT_SELECTORS\n const atRules: string[] = config.postcss?.removeAtRules ?? DEFAULT_AT_RULES\n\n return [\n {\n postcssPlugin: 'tailwind-cleanup-selectors',\n Rule(rule) {\n const parts = rule.selector.split(',').map(s => s.trim())\n const kept = parts.filter(p => !selectors.some(s => p === s || p.startsWith(`${s}(`)))\n if (kept.length === 0) {\n rule.remove()\n } else if (kept.length < parts.length) {\n rule.selector = kept.join(', ')\n }\n },\n },\n {\n postcssPlugin: 'tailwind-cleanup-at-rules',\n AtRule(rule) {\n if (atRules.includes(rule.name)) {\n rule.remove()\n }\n },\n },\n {\n postcssPlugin: 'tailwind-cleanup-text-decoration',\n Declaration(decl) {\n if (decl.prop === 'text-decoration-line') {\n decl.prop = 'text-decoration'\n }\n },\n },\n ]\n}\n"],"mappings":";AAGA,MAAM,oBAAoB,CAAC,SAAS,QAAQ;AAC5C,MAAM,mBAAmB,CAAC,SAAS,WAAW;;;;;;;;;;;AAY9C,SAAgB,gBAAgB,QAAyC;CACvE,MAAM,YAAsB,OAAO,SAAS,mBAAmB;CAC/D,MAAM,UAAoB,OAAO,SAAS,iBAAiB;AAE3D,QAAO;EACL;GACE,eAAe;GACf,KAAK,MAAM;IACT,MAAM,QAAQ,KAAK,SAAS,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;IACzD,MAAM,OAAO,MAAM,QAAO,MAAK,CAAC,UAAU,MAAK,MAAK,MAAM,KAAK,EAAE,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC;AACtF,QAAI,KAAK,WAAW,EAClB,MAAK,QAAQ;aACJ,KAAK,SAAS,MAAM,OAC7B,MAAK,WAAW,KAAK,KAAK,KAAK;;GAGpC;EACD;GACE,eAAe;GACf,OAAO,MAAM;AACX,QAAI,QAAQ,SAAS,KAAK,KAAK,CAC7B,MAAK,QAAQ;;GAGlB;EACD;GACE,eAAe;GACf,YAAY,MAAM;AAChB,QAAI,KAAK,SAAS,uBAChB,MAAK,OAAO;;GAGjB;EACF"}
1
+ {"version":3,"file":"tailwindCleanup.mjs","names":[],"sources":["../../../src/plugins/postcss/tailwindCleanup.ts"],"sourcesContent":["import postcss from 'postcss'\nimport type { MaizzleConfig } from '../../types/config.ts'\n\nconst DEFAULT_SELECTORS = [':host', ':lang']\nconst DEFAULT_AT_RULES = ['layer', 'property']\n\n/**\n * Split a selector list on top-level commas only.\n *\n * Commas inside parenthesised groups like `:not(:is(:lang(ae), :lang(ar)))`\n * are not treated as selector separators.\n */\nfunction splitSelector(selector: string): string[] {\n const parts: string[] = []\n let depth = 0\n let start = 0\n\n for (let i = 0; i < selector.length; i++) {\n const ch = selector[i]\n if (ch === '(') depth++\n else if (ch === ')') depth--\n else if (ch === ',' && depth === 0) {\n parts.push(selector.slice(start, i).trim())\n start = i + 1\n }\n }\n\n parts.push(selector.slice(start).trim())\n\n return parts.filter(Boolean)\n}\n\n/**\n * Removes CSS rules whose every comma-separated selector part starts with\n * one of the configured prefixes (e.g. ':host', ':lang'). Rules with mixed\n * selectors have the unwanted parts stripped.\n *\n * Also removes entire at-rules by name (e.g. '@layer', '@property').\n *\n * Intended to clean up Tailwind's compiled output after lightningcss has\n * flattened all modern CSS syntax.\n */\nexport function tailwindCleanup(config: MaizzleConfig): postcss.Plugin[] {\n const selectors: string[] = config.postcss?.removeSelectors ?? DEFAULT_SELECTORS\n const atRules: string[] = config.postcss?.removeAtRules ?? DEFAULT_AT_RULES\n\n return [\n {\n postcssPlugin: 'tailwind-cleanup-selectors',\n Rule(rule) {\n const parts = splitSelector(rule.selector)\n const kept = parts.filter(p => !selectors.some(s => p === s || p.includes(`${s}(`)))\n if (kept.length === 0) {\n rule.remove()\n } else if (kept.length < parts.length) {\n rule.selector = kept.join(', ')\n }\n },\n },\n {\n postcssPlugin: 'tailwind-cleanup-at-rules',\n AtRule(rule) {\n if (atRules.includes(rule.name)) {\n rule.remove()\n }\n },\n },\n {\n postcssPlugin: 'tailwind-cleanup-text-decoration',\n Declaration(decl) {\n if (decl.prop === 'text-decoration-line') {\n decl.prop = 'text-decoration'\n }\n },\n },\n ]\n}\n"],"mappings":";AAGA,MAAM,oBAAoB,CAAC,SAAS,QAAQ;AAC5C,MAAM,mBAAmB,CAAC,SAAS,WAAW;;;;;;;AAQ9C,SAAS,cAAc,UAA4B;CACjD,MAAM,QAAkB,EAAE;CAC1B,IAAI,QAAQ;CACZ,IAAI,QAAQ;AAEZ,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,KAAK,SAAS;AACpB,MAAI,OAAO,IAAK;WACP,OAAO,IAAK;WACZ,OAAO,OAAO,UAAU,GAAG;AAClC,SAAM,KAAK,SAAS,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC;AAC3C,WAAQ,IAAI;;;AAIhB,OAAM,KAAK,SAAS,MAAM,MAAM,CAAC,MAAM,CAAC;AAExC,QAAO,MAAM,OAAO,QAAQ;;;;;;;;;;;;AAa9B,SAAgB,gBAAgB,QAAyC;CACvE,MAAM,YAAsB,OAAO,SAAS,mBAAmB;CAC/D,MAAM,UAAoB,OAAO,SAAS,iBAAiB;AAE3D,QAAO;EACL;GACE,eAAe;GACf,KAAK,MAAM;IACT,MAAM,QAAQ,cAAc,KAAK,SAAS;IAC1C,MAAM,OAAO,MAAM,QAAO,MAAK,CAAC,UAAU,MAAK,MAAK,MAAM,KAAK,EAAE,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;AACpF,QAAI,KAAK,WAAW,EAClB,MAAK,QAAQ;aACJ,KAAK,SAAS,MAAM,OAC7B,MAAK,WAAW,KAAK,KAAK,KAAK;;GAGpC;EACD;GACE,eAAe;GACf,OAAO,MAAM;AACX,QAAI,QAAQ,SAAS,KAAK,KAAK,CAC7B,MAAK,QAAQ;;GAGlB;EACD;GACE,eAAe;GACf,YAAY,MAAM;AAChB,QAAI,KAAK,SAAS,uBAChB,MAAK,OAAO;;GAGjB;EACF"}
@@ -1,6 +1,7 @@
1
1
  import { MaizzleConfig, MarkdownConfig } from "../types/config.mjs";
2
2
  import { RenderContext } from "../composables/renderContext.mjs";
3
3
  import { Component } from "vue";
4
+ import { InlineConfig } from "vite";
4
5
 
5
6
  //#region src/render/createRenderer.d.ts
6
7
  interface RenderedTemplate {
@@ -25,6 +26,8 @@ interface CreateRendererOptions {
25
26
  root?: string;
26
27
  /** Additional component directories to register for auto-import */
27
28
  componentDirs?: string[];
29
+ /** User Vite config options to merge into the internal SSR server */
30
+ vite?: InlineConfig;
28
31
  }
29
32
  /**
30
33
  * Lightweight Vite SSR loader for rendering Vue SFC email templates.
@@ -1 +1 @@
1
- {"version":3,"file":"createRenderer.d.mts","names":[],"sources":["../../src/render/createRenderer.ts"],"mappings":";;;;;UAwJiB,gBAAA;EACf,IAAA;EACA,OAAA;EACA,cAAA,EAAgB,aAAA;EAChB,gBAAA,EAAkB,aAAA;EAClB,SAAA,GAAY,aAAA;AAAA;AAAA,UAGG,QAAA;EACf,MAAA,CAAO,KAAA,WAAgB,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAClE,UAAA,CAAW,QAAA,WAAmB,OAAA;EAC9B,aAAA,IAAiB,OAAA;EACjB,KAAA,IAAS,OAAA;AAAA;AAAA,UAGM,qBAAA;EAZC;EAchB,GAAA;EAbkB;EAelB,QAAA,GAAW,cAAA;EAdC;EAgBZ,IAAA;EAhByB;EAkBzB,aAAA;AAAA;;;;;;;iBASoB,cAAA,CACpB,OAAA,GAAS,qBAAA,GACR,OAAA,CAAQ,QAAA"}
1
+ {"version":3,"file":"createRenderer.d.mts","names":[],"sources":["../../src/render/createRenderer.ts"],"mappings":";;;;;;UAyJiB,gBAAA;EACf,IAAA;EACA,OAAA;EACA,cAAA,EAAgB,aAAA;EAChB,gBAAA,EAAkB,aAAA;EAClB,SAAA,GAAY,aAAA;AAAA;AAAA,UAGG,QAAA;EACf,MAAA,CAAO,KAAA,WAAgB,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAClE,UAAA,CAAW,QAAA,WAAmB,OAAA;EAC9B,aAAA,IAAiB,OAAA;EACjB,KAAA,IAAS,OAAA;AAAA;AAAA,UAGM,qBAAA;EAZC;EAchB,GAAA;EAbkB;EAelB,QAAA,GAAW,cAAA;EAdC;EAgBZ,IAAA;EAhByB;EAkBzB,aAAA;EAfuB;EAiBvB,IAAA,GAAO,YAAA;AAAA;;;;;;;iBASa,cAAA,CACpB,OAAA,GAAS,qBAAA,GACR,OAAA,CAAQ,QAAA"}
@@ -1,12 +1,12 @@
1
1
  import { MaizzleConfigKey } from "../composables/useConfig.mjs";
2
2
  import { RenderContextKey } from "../composables/renderContext.mjs";
3
3
  import { isLaravel } from "../utils/detect.mjs";
4
- import { readFileSync } from "node:fs";
4
+ import { existsSync, readFileSync } from "node:fs";
5
5
  import { dirname, resolve } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { defu } from "defu";
8
8
  import { createSSRApp } from "vue";
9
- import { createServer } from "vite";
9
+ import { createServer, mergeConfig } from "vite";
10
10
  import vue from "@vitejs/plugin-vue";
11
11
  import Markdown from "unplugin-vue-markdown/vite";
12
12
  import AutoImport from "unplugin-auto-import/vite";
@@ -99,13 +99,14 @@ const vueRouterPkgDir = dirname(fileURLToPath(import.meta.resolve("vue-router/pa
99
99
  * Tailwind CSS compilation is handled by the transformer pipeline.
100
100
  */
101
101
  async function createRenderer(options = {}) {
102
- const { dts = false, markdown: markdownOptionsRaw, root = process.cwd(), componentDirs = [] } = options;
102
+ const { dts = false, markdown: markdownOptionsRaw, root = process.cwd(), componentDirs = [], vite: userViteConfig } = options;
103
103
  const { shikiTheme = "github-light", ...markdownOptions } = markdownOptionsRaw ?? {};
104
104
  const dtsDir = isLaravel() ? resolve(process.cwd(), "resources/js/types/maizzle") : resolve(root, ".maizzle");
105
105
  const VIRTUAL_SFC_ID = "virtual:maizzle-sfc.vue";
106
106
  let virtualSfcSource = "";
107
- const server = await createServer({
108
- 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,
109
110
  plugins: [
110
111
  codeBlockExtract(),
111
112
  markdownExtract(),
@@ -125,13 +126,25 @@ async function createRenderer(options = {}) {
125
126
  Markdown(defu(markdownOptions ?? {}, {
126
127
  headEnabled: true,
127
128
  wrapperDiv: false,
129
+ wrapperClasses: "prose",
128
130
  markdownOptions: { async highlight(code, lang) {
129
131
  const { codeToHtml } = await import("shiki");
130
132
  return codeToHtml(code, {
131
133
  lang,
132
134
  theme: shikiTheme
133
135
  });
134
- } }
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
+ }
135
148
  })),
136
149
  AutoImport({
137
150
  dirs: [resolve(__dirname, "../composables"), resolve(__dirname, "../filters")],
@@ -177,7 +190,8 @@ async function createRenderer(options = {}) {
177
190
  appType: "custom",
178
191
  logLevel: "silent",
179
192
  optimizeDeps: { noDiscovery: true }
180
- });
193
+ };
194
+ const server = await createServer(userViteConfig && !viteConfigFile ? mergeConfig(userViteConfig, maizzleConfig) : maizzleConfig);
181
195
  return {
182
196
  async render(input, config) {
183
197
  let component;
@@ -207,6 +221,11 @@ async function createRenderer(options = {}) {
207
221
  const head = createHead({ disableDefaults: true });
208
222
  const app = createSSRApp(component);
209
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
+ }
210
229
  app.provide(configKey, config);
211
230
  app.provide(contextKey, renderContext);
212
231
  const ssrContext = {};