@maizzle/framework 6.0.0-rc.21 → 6.0.0-rc.23
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/dist/build.d.ts.map +1 -1
- package/dist/build.js +11 -0
- package/dist/build.js.map +1 -1
- package/dist/components/Body.vue +1 -1
- package/dist/components/CodeBlock.vue +1 -1
- package/dist/components/CodeInline.vue +72 -2
- package/dist/components/Column.vue +2 -1
- package/dist/components/Container.vue +1 -11
- package/dist/components/Heading.vue +1 -1
- package/dist/components/Img.vue +252 -7
- package/dist/components/Link.vue +1 -1
- package/dist/components/Preheader.vue +35 -5
- package/dist/components/Section.vue +9 -14
- package/dist/components/Tailwind.vue +4 -2
- package/dist/components/Text.vue +2 -2
- package/dist/components/Vml.vue +354 -0
- package/dist/components/utils.d.ts.map +1 -1
- package/dist/components/utils.js.map +1 -1
- package/dist/composables/defineConfig.d.ts +3 -4
- package/dist/composables/defineConfig.d.ts.map +1 -1
- package/dist/composables/defineConfig.js +3 -4
- package/dist/composables/defineConfig.js.map +1 -1
- package/dist/composables/renderContext.d.ts +0 -1
- package/dist/composables/renderContext.d.ts.map +1 -1
- package/dist/composables/renderContext.js.map +1 -1
- package/dist/composables/useBaseUrl.d.ts.map +1 -1
- package/dist/composables/useBaseUrl.js.map +1 -1
- package/dist/composables/useConfig.d.ts.map +1 -1
- package/dist/composables/useConfig.js.map +1 -1
- package/dist/composables/useCurrentTemplate.d.ts.map +1 -1
- package/dist/composables/useCurrentTemplate.js +10 -3
- package/dist/composables/useCurrentTemplate.js.map +1 -1
- package/dist/composables/useDoctype.d.ts.map +1 -1
- package/dist/composables/useDoctype.js.map +1 -1
- package/dist/composables/useEvent.js.map +1 -1
- package/dist/composables/useFont.d.ts.map +1 -1
- package/dist/composables/useFont.js.map +1 -1
- package/dist/composables/useOutlookFallback.d.ts.map +1 -1
- package/dist/composables/useOutlookFallback.js.map +1 -1
- package/dist/composables/usePlaintext.d.ts.map +1 -1
- package/dist/composables/usePlaintext.js.map +1 -1
- package/dist/composables/usePreheader.d.ts +6 -5
- package/dist/composables/usePreheader.d.ts.map +1 -1
- package/dist/composables/usePreheader.js +3 -3
- package/dist/composables/usePreheader.js.map +1 -1
- package/dist/composables/useTransformers.d.ts +1 -1
- package/dist/composables/useTransformers.d.ts.map +1 -1
- package/dist/composables/useTransformers.js +1 -1
- package/dist/composables/useTransformers.js.map +1 -1
- package/dist/composables/useUrlQuery.d.ts.map +1 -1
- package/dist/composables/useUrlQuery.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.js +12 -0
- package/dist/config/index.js.map +1 -1
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/plaintext.d.ts.map +1 -1
- package/dist/plaintext.js.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -1
- package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -1
- package/dist/plugins/postcss/pruneVars.d.ts.map +1 -1
- package/dist/plugins/postcss/pruneVars.js.map +1 -1
- package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -1
- package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -1
- package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -1
- package/dist/plugins/postcss/removeDeclarations.js.map +1 -1
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -1
- package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -1
- package/dist/plugins/postcss/resolveProps.d.ts.map +1 -1
- package/dist/plugins/postcss/resolveProps.js +14 -0
- package/dist/plugins/postcss/resolveProps.js.map +1 -1
- package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -1
- package/dist/plugins/postcss/tailwindCleanup.js.map +1 -1
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js.map +1 -1
- package/dist/render/active.d.ts.map +1 -1
- package/dist/render/active.js.map +1 -1
- package/dist/render/createRenderer.d.ts.map +1 -1
- package/dist/render/createRenderer.js +91 -3
- package/dist/render/createRenderer.js.map +1 -1
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +6 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/injectFonts.js.map +1 -1
- package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -1
- package/dist/render/plugins/codeBlockExtract.js +4 -0
- package/dist/render/plugins/codeBlockExtract.js.map +1 -1
- package/dist/render/plugins/markdownExtract.d.ts.map +1 -1
- package/dist/render/plugins/markdownExtract.js.map +1 -1
- package/dist/render/plugins/rawExtract.d.ts.map +1 -1
- package/dist/render/plugins/rawExtract.js.map +1 -1
- package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -1
- package/dist/render/plugins/rowSourceLocation.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +48 -15
- package/dist/serve.js.map +1 -1
- package/dist/server/compatibility.d.ts.map +1 -1
- package/dist/server/compatibility.js +48 -0
- package/dist/server/compatibility.js.map +1 -1
- package/dist/server/email.js.map +1 -1
- package/dist/server/linter.js +6 -0
- package/dist/server/linter.js.map +1 -1
- package/dist/server/sfc-utils.d.ts.map +1 -1
- package/dist/server/sfc-utils.js.map +1 -1
- package/dist/server/ui/App.vue +17 -16
- package/dist/server/ui/components/Markdown.vue +17 -0
- package/dist/server/ui/components/SidebarClose.vue +1 -1
- package/dist/server/ui/components/ui/checkbox/Checkbox.vue +1 -1
- package/dist/server/ui/components/ui/command/CommandInput.vue +2 -2
- package/dist/server/ui/components/ui/dialog/DialogContent.vue +1 -1
- package/dist/server/ui/components/ui/dialog/DialogScrollContent.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
- package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
- package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +1 -1
- package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +1 -1
- package/dist/server/ui/lib/emulated-dark-mode.ts +25 -10
- package/dist/server/ui/pages/Home.vue +1 -1
- package/dist/server/ui/pages/Preview.vue +32 -18
- package/dist/tests/render/_helpers.js.map +1 -1
- package/dist/transformers/addAttributes.d.ts +18 -8
- package/dist/transformers/addAttributes.d.ts.map +1 -1
- package/dist/transformers/addAttributes.js +22 -8
- package/dist/transformers/addAttributes.js.map +1 -1
- package/dist/transformers/attributeToStyle.d.ts.map +1 -1
- package/dist/transformers/attributeToStyle.js.map +1 -1
- package/dist/transformers/base.d.ts.map +1 -1
- package/dist/transformers/base.js +4 -0
- package/dist/transformers/base.js.map +1 -1
- package/dist/transformers/columnWidth.d.ts.map +1 -1
- package/dist/transformers/columnWidth.js +136 -150
- package/dist/transformers/columnWidth.js.map +1 -1
- package/dist/transformers/entities.d.ts.map +1 -1
- package/dist/transformers/entities.js +1 -0
- package/dist/transformers/entities.js.map +1 -1
- package/dist/transformers/filters/defaults.d.ts.map +1 -1
- package/dist/transformers/filters/defaults.js.map +1 -1
- package/dist/transformers/filters/index.d.ts.map +1 -1
- package/dist/transformers/filters/index.js.map +1 -1
- package/dist/transformers/format.d.ts.map +1 -1
- package/dist/transformers/format.js.map +1 -1
- package/dist/transformers/index.d.ts.map +1 -1
- package/dist/transformers/index.js +33 -5
- package/dist/transformers/index.js.map +1 -1
- package/dist/transformers/inlineCss.d.ts.map +1 -1
- package/dist/transformers/inlineCss.js +27 -9
- package/dist/transformers/inlineCss.js.map +1 -1
- package/dist/transformers/inlineLink.d.ts.map +1 -1
- package/dist/transformers/inlineLink.js.map +1 -1
- package/dist/transformers/minify.d.ts.map +1 -1
- package/dist/transformers/minify.js.map +1 -1
- package/dist/transformers/minifyCodeInline.d.ts +29 -0
- package/dist/transformers/minifyCodeInline.d.ts.map +1 -0
- package/dist/transformers/minifyCodeInline.js +36 -0
- package/dist/transformers/minifyCodeInline.js.map +1 -0
- package/dist/transformers/msoPlaceholders.d.ts +10 -5
- package/dist/transformers/msoPlaceholders.d.ts.map +1 -1
- package/dist/transformers/msoPlaceholders.js +38 -7
- package/dist/transformers/msoPlaceholders.js.map +1 -1
- package/dist/transformers/purgeCss.d.ts.map +1 -1
- package/dist/transformers/purgeCss.js +29 -3
- package/dist/transformers/purgeCss.js.map +1 -1
- package/dist/transformers/removeAttributes.d.ts.map +1 -1
- package/dist/transformers/removeAttributes.js.map +1 -1
- package/dist/transformers/replaceStrings.d.ts.map +1 -1
- package/dist/transformers/replaceStrings.js.map +1 -1
- package/dist/transformers/safeSelectors.d.ts +37 -0
- package/dist/transformers/safeSelectors.d.ts.map +1 -0
- package/dist/transformers/{safeClassNames.js → safeSelectors.js} +37 -6
- package/dist/transformers/safeSelectors.js.map +1 -0
- package/dist/transformers/shorthandCss.d.ts.map +1 -1
- package/dist/transformers/shorthandCss.js +38 -7
- package/dist/transformers/shorthandCss.js.map +1 -1
- package/dist/transformers/sixHex.d.ts.map +1 -1
- package/dist/transformers/sixHex.js.map +1 -1
- package/dist/transformers/tailwindComponent.js +9 -0
- package/dist/transformers/tailwindComponent.js.map +1 -1
- package/dist/transformers/tailwindcss.d.ts.map +1 -1
- package/dist/transformers/tailwindcss.js +22 -0
- package/dist/transformers/tailwindcss.js.map +1 -1
- package/dist/transformers/urlQuery.d.ts.map +1 -1
- package/dist/transformers/urlQuery.js.map +1 -1
- package/dist/types/config.d.ts +6 -10
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/ast/parser.d.ts.map +1 -1
- package/dist/utils/ast/parser.js.map +1 -1
- package/dist/utils/ast/serializer.d.ts.map +1 -1
- package/dist/utils/ast/serializer.js +27 -17
- package/dist/utils/ast/serializer.js.map +1 -1
- package/dist/utils/ast/walker.d.ts.map +1 -1
- package/dist/utils/ast/walker.js.map +1 -1
- package/dist/utils/compileTailwindCss.d.ts.map +1 -1
- package/dist/utils/compileTailwindCss.js.map +1 -1
- package/dist/utils/componentSources.d.ts.map +1 -1
- package/dist/utils/componentSources.js.map +1 -1
- package/dist/utils/cssBox.d.ts +42 -0
- package/dist/utils/cssBox.d.ts.map +1 -0
- package/dist/utils/cssBox.js +156 -0
- package/dist/utils/cssBox.js.map +1 -0
- package/dist/utils/decodeStyleEntities.d.ts.map +1 -1
- package/dist/utils/decodeStyleEntities.js.map +1 -1
- package/dist/utils/detect.d.ts.map +1 -1
- package/dist/utils/detect.js.map +1 -1
- package/dist/utils/output-markers.d.ts.map +1 -1
- package/dist/utils/output-markers.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/watchPaths.js.map +1 -1
- package/node_modules/@clack/core/CHANGELOG.md +6 -0
- package/node_modules/@clack/core/dist/index.d.mts +1 -1
- package/node_modules/@clack/core/dist/index.mjs +8 -8
- package/node_modules/@clack/core/dist/index.mjs.map +1 -1
- package/node_modules/@clack/core/package.json +1 -1
- package/node_modules/@clack/prompts/CHANGELOG.md +13 -0
- package/node_modules/@clack/prompts/README.md +2 -2
- package/node_modules/@clack/prompts/dist/index.d.mts +98 -0
- package/node_modules/@clack/prompts/dist/index.mjs +122 -121
- package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
- package/node_modules/@clack/prompts/package.json +2 -2
- package/node_modules/fast-wrap-ansi/lib/main.js +0 -1
- package/node_modules/fast-wrap-ansi/package.json +10 -10
- package/node_modules/maizzle/dist/commands/make/config.mjs +7 -6
- package/node_modules/maizzle/dist/commands/new.mjs +15 -84
- package/node_modules/maizzle/package.json +2 -2
- package/node_modules/tinyexec/README.md +8 -0
- package/node_modules/tinyexec/dist/main.d.mts +16 -1
- package/node_modules/tinyexec/dist/main.mjs +163 -457
- package/node_modules/tinyexec/package.json +12 -14
- package/package.json +3 -4
- package/dist/transformers/safeClassNames.d.ts +0 -22
- package/dist/transformers/safeClassNames.d.ts.map +0 -1
- package/dist/transformers/safeClassNames.js.map +0 -1
- package/node_modules/fast-wrap-ansi/lib/main.js.map +0 -1
- package/node_modules/tinyexec/dist/LICENSES.txt +0 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlQuery.js","names":[],"sources":["../../src/transformers/urlQuery.ts"],"sourcesContent":["import queryString from 'query-string'\nimport { selectAll } from 'css-select'\nimport type { ChildNode, Element } from 'domhandler'\nimport { parse, serialize } from '../utils/ast/index.ts'\nimport { isAbsoluteUrl } from '../utils/url.ts'\nimport type { UrlQueryOptions } from '../types/config.ts'\n\nconst DEFAULT_ATTRIBUTES = ['src', 'href', 'poster', 'srcset', 'background']\nconst DEFAULT_TAGS = ['a']\n\n/**\n * Append query parameters to a URL string using query-string.\n */\nfunction appendParams(\n url: string,\n params: Record<string, unknown>,\n qsOptions: queryString.StringifyOptions,\n strict: boolean,\n): string {\n if (strict && !isAbsoluteUrl(url)) return url\n\n return queryString.stringifyUrl(\n { url, query: params as queryString.StringifiableRecord },\n qsOptions,\n )\n}\n\n/**\n * Append query parameters to URLs found in matching attributes/elements.\n *\n * @param html HTML string to transform.\n * @param params Query parameters to append (e.g. `{ utm_source: 'newsletter' }`).\n * @param options Behaviour overrides — `tags` (CSS selectors, default `['a']`),\n * `attributes` (default `['src', 'href', 'poster', 'srcset', 'background']`),\n * `strict` (default `true`, only rewrites absolute URLs),\n * `qs` (forwarded to `query-string`, default `{ encode: false }`).\n * @returns The transformed HTML string.\n *\n * @example\n * import { urlQuery } from '@maizzle/framework'\n *\n * const out = urlQuery(\n * '<a href=\"https://example.com\">x</a>',\n * { utm_source: 'newsletter' },\n * )\n *\n * // Restrict to specific tags / attributes:\n * urlQuery(html, { ref: 'email' }, { tags: ['a', 'img'], attributes: ['href', 'src'] })\n */\nexport function urlQuery(\n html: string,\n params: Record<string, unknown> = {},\n options: UrlQueryOptions = {},\n): string {\n return serialize(urlQueryDom(parse(html), params, options))\n}\n\n/**\n * DOM-form of {@link urlQuery} used by the internal transformer pipeline.\n * Takes a parsed DOM, returns a parsed DOM — avoids redundant\n * serialize/parse round-trips when chained with other transformers.\n */\nexport function urlQueryDom(\n dom: ChildNode[],\n params: Record<string, unknown> = {},\n options: UrlQueryOptions = {},\n): ChildNode[] {\n if (!params || Object.keys(params).length === 0) return dom\n\n const tags = options.tags ?? DEFAULT_TAGS\n const attributes = options.attributes ?? DEFAULT_ATTRIBUTES\n const strict = options.strict ?? true\n const qsOptions: queryString.StringifyOptions = { encode: false, ...((options.qs ?? {}) as queryString.StringifyOptions) }\n\n // Use css-select to find all elements matching any of the tag selectors\n const selector = tags.join(', ')\n const elements = selectAll(selector, dom) as Element[]\n\n for (const el of elements) {\n for (const attr of attributes) {\n const value = el.attribs[attr]\n if (!value) continue\n\n const updated = appendParams(value, params, qsOptions, strict)\n if (updated !== value) {\n el.attribs[attr] = updated\n }\n }\n }\n\n return dom\n}\n"],"mappings":";;;;;;;AAOA,MAAM,qBAAqB;CAAC;CAAO;CAAQ;CAAU;CAAU;
|
|
1
|
+
{"version":3,"file":"urlQuery.js","names":[],"sources":["../../src/transformers/urlQuery.ts"],"sourcesContent":["import queryString from 'query-string'\nimport { selectAll } from 'css-select'\nimport type { ChildNode, Element } from 'domhandler'\nimport { parse, serialize } from '../utils/ast/index.ts'\nimport { isAbsoluteUrl } from '../utils/url.ts'\nimport type { UrlQueryOptions } from '../types/config.ts'\n\nconst DEFAULT_ATTRIBUTES = ['src', 'href', 'poster', 'srcset', 'background']\nconst DEFAULT_TAGS = ['a']\n\n/**\n * Append query parameters to a URL string using query-string.\n */\nfunction appendParams(\n url: string,\n params: Record<string, unknown>,\n qsOptions: queryString.StringifyOptions,\n strict: boolean,\n): string {\n if (strict && !isAbsoluteUrl(url)) return url\n\n return queryString.stringifyUrl(\n { url, query: params as queryString.StringifiableRecord },\n qsOptions,\n )\n}\n\n/**\n * Append query parameters to URLs found in matching attributes/elements.\n *\n * @param html HTML string to transform.\n * @param params Query parameters to append (e.g. `{ utm_source: 'newsletter' }`).\n * @param options Behaviour overrides — `tags` (CSS selectors, default `['a']`),\n * `attributes` (default `['src', 'href', 'poster', 'srcset', 'background']`),\n * `strict` (default `true`, only rewrites absolute URLs),\n * `qs` (forwarded to `query-string`, default `{ encode: false }`).\n * @returns The transformed HTML string.\n *\n * @example\n * import { urlQuery } from '@maizzle/framework'\n *\n * const out = urlQuery(\n * '<a href=\"https://example.com\">x</a>',\n * { utm_source: 'newsletter' },\n * )\n *\n * // Restrict to specific tags / attributes:\n * urlQuery(html, { ref: 'email' }, { tags: ['a', 'img'], attributes: ['href', 'src'] })\n */\nexport function urlQuery(\n html: string,\n params: Record<string, unknown> = {},\n options: UrlQueryOptions = {},\n): string {\n return serialize(urlQueryDom(parse(html), params, options))\n}\n\n/**\n * DOM-form of {@link urlQuery} used by the internal transformer pipeline.\n * Takes a parsed DOM, returns a parsed DOM — avoids redundant\n * serialize/parse round-trips when chained with other transformers.\n */\nexport function urlQueryDom(\n dom: ChildNode[],\n params: Record<string, unknown> = {},\n options: UrlQueryOptions = {},\n): ChildNode[] {\n if (!params || Object.keys(params).length === 0) return dom\n\n const tags = options.tags ?? DEFAULT_TAGS\n const attributes = options.attributes ?? DEFAULT_ATTRIBUTES\n const strict = options.strict ?? true\n const qsOptions: queryString.StringifyOptions = { encode: false, ...((options.qs ?? {}) as queryString.StringifyOptions) }\n\n // Use css-select to find all elements matching any of the tag selectors\n const selector = tags.join(', ')\n const elements = selectAll(selector, dom) as Element[]\n\n for (const el of elements) {\n for (const attr of attributes) {\n const value = el.attribs[attr]\n if (!value) continue\n\n const updated = appendParams(value, params, qsOptions, strict)\n if (updated !== value) {\n el.attribs[attr] = updated\n }\n }\n }\n\n return dom\n}\n"],"mappings":";;;;;;;AAOA,MAAM,qBAAqB;CAAC;CAAO;CAAQ;CAAU;CAAU;AAAY;AAC3E,MAAM,eAAe,CAAC,GAAG;;;;AAKzB,SAAS,aACP,KACA,QACA,WACA,QACQ;CACR,IAAI,UAAU,CAAC,cAAc,GAAG,GAAG,OAAO;CAE1C,OAAO,YAAY,aACjB;EAAE;EAAK,OAAO;CAA0C,GACxD,SACF;AACF;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,SACd,MACA,SAAkC,CAAC,GACnC,UAA2B,CAAC,GACpB;CACR,OAAO,UAAU,YAAY,MAAM,IAAI,GAAG,QAAQ,OAAO,CAAC;AAC5D;;;;;;AAOA,SAAgB,YACd,KACA,SAAkC,CAAC,GACnC,UAA2B,CAAC,GACf;CACb,IAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG,OAAO;CAExD,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,YAA0C;EAAE,QAAQ;EAAO,GAAK,QAAQ,MAAM,CAAC;CAAoC;CAIzH,MAAM,WAAW,UADA,KAAK,KAAK,IACO,GAAG,GAAG;CAExC,KAAK,MAAM,MAAM,UACf,KAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,QAAQ,GAAG,QAAQ;EACzB,IAAI,CAAC,OAAO;EAEZ,MAAM,UAAU,aAAa,OAAO,QAAQ,WAAW,MAAM;EAC7D,IAAI,YAAY,OACd,GAAG,QAAQ,QAAQ;CAEvB;CAGF,OAAO;AACT"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -2,11 +2,7 @@ import { RemoveValue } from "../plugins/postcss/removeDeclarations.js";
|
|
|
2
2
|
import { TemplateInfo } from "../events/index.js";
|
|
3
3
|
import { Directive, Plugin } from "vue";
|
|
4
4
|
import { Options } from "juice";
|
|
5
|
-
import * as _$oxfmt from "oxfmt";
|
|
6
|
-
import * as _$html_crush0 from "html-crush";
|
|
7
5
|
import { InlineConfig } from "vite";
|
|
8
|
-
import * as _$string_strip_html0 from "string-strip-html";
|
|
9
|
-
import * as _$shiki from "shiki";
|
|
10
6
|
import { Options as Options$1 } from "unplugin-vue-markdown/types";
|
|
11
7
|
|
|
12
8
|
//#region src/types/config.d.ts
|
|
@@ -353,7 +349,7 @@ interface HtmlConfig {
|
|
|
353
349
|
*
|
|
354
350
|
* Set to `true` to enable with defaults, or pass options.
|
|
355
351
|
*/
|
|
356
|
-
format?: boolean |
|
|
352
|
+
format?: boolean | import('oxfmt').FormatOptions;
|
|
357
353
|
/**
|
|
358
354
|
* Minify the HTML output.
|
|
359
355
|
*
|
|
@@ -362,7 +358,7 @@ interface HtmlConfig {
|
|
|
362
358
|
*
|
|
363
359
|
* @see https://codsen.com/os/html-crush
|
|
364
360
|
*/
|
|
365
|
-
minify?: boolean | Partial<
|
|
361
|
+
minify?: boolean | Partial<import('html-crush').Opts>;
|
|
366
362
|
}
|
|
367
363
|
type FilterFunction = (str: string, value: string) => string;
|
|
368
364
|
type FiltersConfig = false | Record<string, FilterFunction>;
|
|
@@ -372,7 +368,7 @@ interface MarkdownConfig extends Options$1 {
|
|
|
372
368
|
*
|
|
373
369
|
* @default 'github-light'
|
|
374
370
|
*/
|
|
375
|
-
shikiTheme?:
|
|
371
|
+
shikiTheme?: import('shiki').BundledTheme;
|
|
376
372
|
}
|
|
377
373
|
interface VueConfig {
|
|
378
374
|
/**
|
|
@@ -395,7 +391,7 @@ interface VueConfig {
|
|
|
395
391
|
* - `false` skips the listed transformer.
|
|
396
392
|
* - `true` force-enables it for this run (only meaningful for boolean-driven
|
|
397
393
|
* transformers: inlineCss, purgeCss, prettify, minify, shorthandCss,
|
|
398
|
-
* sixHex,
|
|
394
|
+
* sixHex, safeSelectors, entities). Layers on the matching
|
|
399
395
|
* `css.*` / `html.*` config slice.
|
|
400
396
|
* - missing keys keep their default behavior.
|
|
401
397
|
*
|
|
@@ -408,7 +404,7 @@ interface VueConfig {
|
|
|
408
404
|
* or framework state, not user opt-in.
|
|
409
405
|
*/
|
|
410
406
|
interface TransformerToggles {
|
|
411
|
-
|
|
407
|
+
safeSelectors?: boolean;
|
|
412
408
|
attributeToStyle?: boolean;
|
|
413
409
|
inlineCss?: boolean;
|
|
414
410
|
removeAttributes?: boolean;
|
|
@@ -447,7 +443,7 @@ interface PlaintextConfig {
|
|
|
447
443
|
*
|
|
448
444
|
* @see https://codsen.com/os/string-strip-html
|
|
449
445
|
*/
|
|
450
|
-
options?: Partial<
|
|
446
|
+
options?: Partial<import('string-strip-html').Opts>;
|
|
451
447
|
}
|
|
452
448
|
/**
|
|
453
449
|
* Source directory entry for component auto-import.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/types/config.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/types/config.ts"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { AttributesConfig, CaniemailClient, ChecksConfig, ComponentSource, CssConfig, EntitiesConfig, FilterFunction, FiltersConfig, HtmlConfig, MaizzleConfig, MarkdownConfig, PlaintextConfig, PostcssConfig, TransformerToggles, UrlConfig, UrlQuery, UrlQueryOptions } from "./config.js";
|
|
2
|
-
export {
|
|
2
|
+
export type { AttributesConfig, CaniemailClient, ChecksConfig, ComponentSource, CssConfig, EntitiesConfig, FilterFunction, FiltersConfig, HtmlConfig, MaizzleConfig, MarkdownConfig, PlaintextConfig, PostcssConfig, TransformerToggles, UrlConfig, UrlQuery, UrlQueryOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","names":[],"sources":["../../../src/utils/ast/parser.ts"],"mappings":";;;iBAIgB,KAAA,CAAM,IAAA,UAAc,OAAA,GAAS,iBAAA,GAAyB,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","names":[],"sources":["../../../src/utils/ast/parser.ts"],"mappings":";;;iBAIgB,KAAA,CAAM,IAAA,UAAc,OAAA,GAAS,iBAAA,GAAyB,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","names":[],"sources":["../../../src/utils/ast/parser.ts"],"sourcesContent":["import { Parser } from 'htmlparser2'\nimport { DomHandler } from 'domhandler'\nimport type { ChildNode, DomHandlerOptions } from 'domhandler'\n\nexport function parse(html: string, options: DomHandlerOptions = {}): ChildNode[] {\n const handler = new DomHandler()\n const parser = new Parser(handler, options)\n parser.write(html)\n parser.end()\n return handler.dom\n}\n"],"mappings":";;;AAIA,SAAgB,MAAM,MAAc,UAA6B,
|
|
1
|
+
{"version":3,"file":"parser.js","names":[],"sources":["../../../src/utils/ast/parser.ts"],"sourcesContent":["import { Parser } from 'htmlparser2'\nimport { DomHandler } from 'domhandler'\nimport type { ChildNode, DomHandlerOptions } from 'domhandler'\n\nexport function parse(html: string, options: DomHandlerOptions = {}): ChildNode[] {\n const handler = new DomHandler()\n const parser = new Parser(handler, options)\n parser.write(html)\n parser.end()\n return handler.dom\n}\n"],"mappings":";;;AAIA,SAAgB,MAAM,MAAc,UAA6B,CAAC,GAAgB;CAChF,MAAM,UAAU,IAAI,WAAW;CAC/B,MAAM,SAAS,IAAI,OAAO,SAAS,OAAO;CAC1C,OAAO,MAAM,IAAI;CACjB,OAAO,IAAI;CACX,OAAO,QAAQ;AACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","names":[],"sources":["../../../src/utils/ast/serializer.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","names":[],"sources":["../../../src/utils/ast/serializer.ts"],"mappings":";;;;iBA0CgB,SAAA,CAAU,GAAA,EAAK,SAAA,IAAa,OAAA,GAAU,oBAAoB"}
|
|
@@ -1,30 +1,40 @@
|
|
|
1
|
-
import { walk } from "./walker.js";
|
|
2
1
|
import render from "dom-serializer";
|
|
3
2
|
//#region src/utils/ast/serializer.ts
|
|
3
|
+
const RAW_TEXT_ELEMENTS = new Set(["script", "style"]);
|
|
4
4
|
/**
|
|
5
|
-
* Re-encode
|
|
5
|
+
* Re-encode `<` and `>` in text nodes before serialization.
|
|
6
6
|
*
|
|
7
|
-
* The
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* The parser decodes entities like `<` into raw `<` in text nodes. With
|
|
8
|
+
* `encodeEntities: false` (needed so other transformers can emit entity
|
|
9
|
+
* strings such as ` ` verbatim), the serializer would write those raw
|
|
10
|
+
* `<` characters as-is, turning escaped text (e.g. a Vue `{{ html }}`
|
|
11
|
+
* interpolation containing `<p>...</p>`) into real DOM downstream.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
+
* `&` is intentionally not re-encoded: the `entities` transformer writes
|
|
14
|
+
* literal entity strings (` `, `—`) directly into text-node data
|
|
15
|
+
* and relies on the serializer leaving them alone.
|
|
16
|
+
*
|
|
17
|
+
* Skip `<script>` / `<style>` — their children are raw-text containers, and
|
|
18
|
+
* CSS/JS legitimately contains `<` and `>`.
|
|
13
19
|
*/
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (child.type === "text") {
|
|
20
|
-
const text = child;
|
|
20
|
+
function encodeTextNodes(dom, inRawText = false) {
|
|
21
|
+
for (const node of dom) {
|
|
22
|
+
if (node.type === "text") {
|
|
23
|
+
if (!inRawText) {
|
|
24
|
+
const text = node;
|
|
21
25
|
text.data = text.data.replace(/</g, "<").replace(/>/g, ">");
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if ("children" in node && node.children?.length) {
|
|
30
|
+
const el = node;
|
|
31
|
+
const nextRaw = inRawText || RAW_TEXT_ELEMENTS.has(el.name);
|
|
32
|
+
encodeTextNodes(el.children, nextRaw);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
25
35
|
}
|
|
26
36
|
function serialize(dom, options) {
|
|
27
|
-
|
|
37
|
+
encodeTextNodes(dom);
|
|
28
38
|
return render(dom, {
|
|
29
39
|
encodeEntities: false,
|
|
30
40
|
...options
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.js","names":[],"sources":["../../../src/utils/ast/serializer.ts"],"sourcesContent":["import render from 'dom-serializer'\nimport type { ChildNode } from 'domhandler'\nimport type { DomSerializerOptions } from 'dom-serializer'\
|
|
1
|
+
{"version":3,"file":"serializer.js","names":[],"sources":["../../../src/utils/ast/serializer.ts"],"sourcesContent":["import render from 'dom-serializer'\nimport type { ChildNode, Element, Text } from 'domhandler'\nimport type { DomSerializerOptions } from 'dom-serializer'\n\nconst RAW_TEXT_ELEMENTS = new Set(['script', 'style'])\n\n/**\n * Re-encode `<` and `>` in text nodes before serialization.\n *\n * The parser decodes entities like `<` into raw `<` in text nodes. With\n * `encodeEntities: false` (needed so other transformers can emit entity\n * strings such as ` ` verbatim), the serializer would write those raw\n * `<` characters as-is, turning escaped text (e.g. a Vue `{{ html }}`\n * interpolation containing `<p>...</p>`) into real DOM downstream.\n *\n * `&` is intentionally not re-encoded: the `entities` transformer writes\n * literal entity strings (` `, `—`) directly into text-node data\n * and relies on the serializer leaving them alone.\n *\n * Skip `<script>` / `<style>` — their children are raw-text containers, and\n * CSS/JS legitimately contains `<` and `>`.\n */\nfunction encodeTextNodes(dom: ChildNode[], inRawText = false): void {\n for (const node of dom) {\n if (node.type === 'text') {\n if (!inRawText) {\n const text = node as Text\n text.data = text.data\n .replace(/</g, '<')\n .replace(/>/g, '>')\n }\n continue\n }\n\n if ('children' in node && (node as Element).children?.length) {\n const el = node as Element\n const nextRaw = inRawText || RAW_TEXT_ELEMENTS.has(el.name)\n encodeTextNodes(el.children as ChildNode[], nextRaw)\n }\n }\n}\n\nexport function serialize(dom: ChildNode[], options?: DomSerializerOptions): string {\n encodeTextNodes(dom)\n return render(dom, { encodeEntities: false, ...options })\n}\n"],"mappings":";;AAIA,MAAM,oBAAoB,IAAI,IAAI,CAAC,UAAU,OAAO,CAAC;;;;;;;;;;;;;;;;;AAkBrD,SAAS,gBAAgB,KAAkB,YAAY,OAAa;CAClE,KAAK,MAAM,QAAQ,KAAK;EACtB,IAAI,KAAK,SAAS,QAAQ;GACxB,IAAI,CAAC,WAAW;IACd,MAAM,OAAO;IACb,KAAK,OAAO,KAAK,KACd,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;GACzB;GACA;EACF;EAEA,IAAI,cAAc,QAAS,KAAiB,UAAU,QAAQ;GAC5D,MAAM,KAAK;GACX,MAAM,UAAU,aAAa,kBAAkB,IAAI,GAAG,IAAI;GAC1D,gBAAgB,GAAG,UAAyB,OAAO;EACrD;CACF;AACF;AAEA,SAAgB,UAAU,KAAkB,SAAwC;CAClF,gBAAgB,GAAG;CACnB,OAAO,OAAO,KAAK;EAAE,gBAAgB;EAAO,GAAG;CAAQ,CAAC;AAC1D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.d.ts","names":[],"sources":["../../../src/utils/ast/walker.ts"],"mappings":";;;iBAEgB,IAAA,CAAK,GAAA,EAAK,SAAA,IAAa,QAAA,GAAW,IAAA,EAAM,
|
|
1
|
+
{"version":3,"file":"walker.d.ts","names":[],"sources":["../../../src/utils/ast/walker.ts"],"mappings":";;;iBAEgB,IAAA,CAAK,GAAA,EAAK,SAAA,IAAa,QAAA,GAAW,IAAA,EAAM,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.js","names":[],"sources":["../../../src/utils/ast/walker.ts"],"sourcesContent":["import type { ChildNode } from 'domhandler'\n\nexport function walk(ast: ChildNode[], callback: (node: ChildNode) => void): void {\n function traverse(node: ChildNode) {\n callback(node)\n\n if ('children' in node && node.children && node.children.length > 0) {\n for (const child of node.children) {\n traverse(child)\n }\n }\n }\n\n for (const node of ast) {\n traverse(node)\n }\n}\n"],"mappings":";AAEA,SAAgB,KAAK,KAAkB,UAA2C;CAChF,SAAS,SAAS,MAAiB;EACjC,SAAS,
|
|
1
|
+
{"version":3,"file":"walker.js","names":[],"sources":["../../../src/utils/ast/walker.ts"],"sourcesContent":["import type { ChildNode } from 'domhandler'\n\nexport function walk(ast: ChildNode[], callback: (node: ChildNode) => void): void {\n function traverse(node: ChildNode) {\n callback(node)\n\n if ('children' in node && node.children && node.children.length > 0) {\n for (const child of node.children) {\n traverse(child)\n }\n }\n }\n\n for (const node of ast) {\n traverse(node)\n }\n}\n"],"mappings":";AAEA,SAAgB,KAAK,KAAkB,UAA2C;CAChF,SAAS,SAAS,MAAiB;EACjC,SAAS,IAAI;EAEb,IAAI,cAAc,QAAQ,KAAK,YAAY,KAAK,SAAS,SAAS,GAChE,KAAK,MAAM,SAAS,KAAK,UACvB,SAAS,KAAK;CAGpB;CAEA,KAAK,MAAM,QAAQ,KACjB,SAAS,IAAI;AAEjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileTailwindCss.d.ts","names":[],"sources":["../../src/utils/compileTailwindCss.ts"],"mappings":";;;;iBAagB,uBAAA,CAAwB,MAAA,EAAQ,aAAA,GAAa,OAAA,CAAA,SAAA;AAAA,iBAe7C,cAAA,CAAe,
|
|
1
|
+
{"version":3,"file":"compileTailwindCss.d.ts","names":[],"sources":["../../src/utils/compileTailwindCss.ts"],"mappings":";;;;iBAagB,uBAAA,CAAwB,MAAA,EAAQ,aAAA,GAAa,OAAA,CAAA,SAAA;AAAA,iBAe7C,cAAA,CAAe,GAAW;AAAA,iBAWpB,mBAAA,CAAoB,GAAA,UAAa,MAAA,EAAQ,aAAA,GAAgB,OAAO;;;;;;iBAgBhE,kBAAA,CACpB,QAAA,UACA,MAAA,EAAQ,aAAA,EACR,IAAA,WACC,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileTailwindCss.js","names":["resolveProps","pruneVars"],"sources":["../../src/utils/compileTailwindCss.ts"],"sourcesContent":["import postcss from 'postcss'\nimport tailwindcssPostcss from '@tailwindcss/postcss'\nimport postcssCalc from 'postcss-calc'\nimport safeParser from 'postcss-safe-parser'\nimport { transform } from 'lightningcss'\nimport resolveProps from '../plugins/postcss/resolveProps.ts'\nimport pruneVars from '../plugins/postcss/pruneVars.ts'\nimport { tailwindCleanup } from '../plugins/postcss/tailwindCleanup.ts'\nimport { mergeMediaQueries } from '../plugins/postcss/mergeMediaQueries.ts'\nimport { quoteFontFamilies } from '../plugins/postcss/quoteFontFamilies.ts'\nimport { resolveMaizzleImports } from '../plugins/postcss/resolveMaizzleImports.ts'\nimport type { MaizzleConfig } from '../types/config.ts'\n\nexport function createTailwindProcessor(config: MaizzleConfig) {\n return postcss([\n // Must run before @tailwindcss/postcss so it sees absolute import paths\n resolveMaizzleImports(),\n tailwindcssPostcss({\n base: config.css?.base,\n transformAssetUrls: false,\n optimize: false,\n }),\n resolveProps(),\n postcssCalc({}),\n pruneVars(),\n ])\n}\n\nexport function lowerCssSyntax(css: string): string {\n const result = transform({\n filename: 'email.css',\n code: Buffer.from(css),\n minify: false,\n targets: { ie: 4 << 5 },\n })\n\n return result.code.toString()\n}\n\nexport async function optimizeTailwindCss(css: string, config: MaizzleConfig): Promise<string> {\n const plugins: postcss.Plugin[] = [...tailwindCleanup(config), quoteFontFamilies()]\n\n const mediaPlugin = mergeMediaQueries(config)\n if (mediaPlugin) plugins.push(mediaPlugin)\n\n const result = await postcss(plugins).process(css, { from: undefined })\n\n return result.css\n}\n\n/**\n * Compile a Tailwind CSS source string into final email-safe CSS:\n * runs @tailwindcss/postcss, lowers modern syntax via lightningcss,\n * then applies cleanup + media-query merging.\n */\nexport async function compileTailwindCss(\n cssInput: string,\n config: MaizzleConfig,\n from: string,\n): Promise<string> {\n const processor = createTailwindProcessor(config)\n const result = await processor.process(cssInput, { from, parser: safeParser })\n const lowered = lowerCssSyntax(result.css)\n return optimizeTailwindCss(lowered, config)\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,wBAAwB,QAAuB;CAC7D,OAAO,QAAQ;EAEb,
|
|
1
|
+
{"version":3,"file":"compileTailwindCss.js","names":["resolveProps","pruneVars"],"sources":["../../src/utils/compileTailwindCss.ts"],"sourcesContent":["import postcss from 'postcss'\nimport tailwindcssPostcss from '@tailwindcss/postcss'\nimport postcssCalc from 'postcss-calc'\nimport safeParser from 'postcss-safe-parser'\nimport { transform } from 'lightningcss'\nimport resolveProps from '../plugins/postcss/resolveProps.ts'\nimport pruneVars from '../plugins/postcss/pruneVars.ts'\nimport { tailwindCleanup } from '../plugins/postcss/tailwindCleanup.ts'\nimport { mergeMediaQueries } from '../plugins/postcss/mergeMediaQueries.ts'\nimport { quoteFontFamilies } from '../plugins/postcss/quoteFontFamilies.ts'\nimport { resolveMaizzleImports } from '../plugins/postcss/resolveMaizzleImports.ts'\nimport type { MaizzleConfig } from '../types/config.ts'\n\nexport function createTailwindProcessor(config: MaizzleConfig) {\n return postcss([\n // Must run before @tailwindcss/postcss so it sees absolute import paths\n resolveMaizzleImports(),\n tailwindcssPostcss({\n base: config.css?.base,\n transformAssetUrls: false,\n optimize: false,\n }),\n resolveProps(),\n postcssCalc({}),\n pruneVars(),\n ])\n}\n\nexport function lowerCssSyntax(css: string): string {\n const result = transform({\n filename: 'email.css',\n code: Buffer.from(css),\n minify: false,\n targets: { ie: 4 << 5 },\n })\n\n return result.code.toString()\n}\n\nexport async function optimizeTailwindCss(css: string, config: MaizzleConfig): Promise<string> {\n const plugins: postcss.Plugin[] = [...tailwindCleanup(config), quoteFontFamilies()]\n\n const mediaPlugin = mergeMediaQueries(config)\n if (mediaPlugin) plugins.push(mediaPlugin)\n\n const result = await postcss(plugins).process(css, { from: undefined })\n\n return result.css\n}\n\n/**\n * Compile a Tailwind CSS source string into final email-safe CSS:\n * runs @tailwindcss/postcss, lowers modern syntax via lightningcss,\n * then applies cleanup + media-query merging.\n */\nexport async function compileTailwindCss(\n cssInput: string,\n config: MaizzleConfig,\n from: string,\n): Promise<string> {\n const processor = createTailwindProcessor(config)\n const result = await processor.process(cssInput, { from, parser: safeParser })\n const lowered = lowerCssSyntax(result.css)\n return optimizeTailwindCss(lowered, config)\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,wBAAwB,QAAuB;CAC7D,OAAO,QAAQ;EAEb,sBAAsB;EACtB,mBAAmB;GACjB,MAAM,OAAO,KAAK;GAClB,oBAAoB;GACpB,UAAU;EACZ,CAAC;EACDA,qBAAa;EACb,YAAY,CAAC,CAAC;EACdC,kBAAU;CACZ,CAAC;AACH;AAEA,SAAgB,eAAe,KAAqB;CAQlD,OAPe,UAAU;EACvB,UAAU;EACV,MAAM,OAAO,KAAK,GAAG;EACrB,QAAQ;EACR,SAAS,EAAE,IAAI,IAAO;CACxB,CAEY,EAAE,KAAK,SAAS;AAC9B;AAEA,eAAsB,oBAAoB,KAAa,QAAwC;CAC7F,MAAM,UAA4B,CAAC,GAAG,gBAAgB,MAAM,GAAG,kBAAkB,CAAC;CAElF,MAAM,cAAc,kBAAkB,MAAM;CAC5C,IAAI,aAAa,QAAQ,KAAK,WAAW;CAIzC,QAAO,MAFc,QAAQ,OAAO,EAAE,QAAQ,KAAK,EAAE,MAAM,KAAA,EAAU,CAAC,GAExD;AAChB;;;;;;AAOA,eAAsB,mBACpB,UACA,QACA,MACiB;CAIjB,OAAO,oBADS,gBAAe,MAFb,wBAAwB,MACb,EAAE,QAAQ,UAAU;EAAE;EAAM,QAAQ;CAAW,CAAC,GACvC,GACL,GAAG,MAAM;AAC5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentSources.d.ts","names":[],"sources":["../../src/utils/componentSources.ts"],"mappings":";;;;;AAQA;;;UAAiB,yBAAA;EAEf;EAAA,IAAA;EAUA
|
|
1
|
+
{"version":3,"file":"componentSources.d.ts","names":[],"sources":["../../src/utils/componentSources.ts"],"mappings":";;;;;AAQA;;;UAAiB,yBAAA;EAEf;EAAA,IAAA;EAUA;;AAAU;AAOZ;;;;EATE,MAAA;EAYC;EAVD,UAAA;AAAA;;;;;iBAOc,yBAAA,CACd,OAAA,EAAS,eAAA,GAAkB,eAAA,gBAC3B,GAAA,WACC,yBAAA;AAAA,UAqBc,oBAAA;EArBW;EAuB1B,QAAA;EAFmC;EAInC,OAAA;EAJmC;EAMnC,MAAA;EAFA;EAIA,UAAA;AAAA;;AAAU;AAYZ;;;;AAAgE;;;iBAAhD,qBAAA,CAAsB,IAA0B,EAApB,oBAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentSources.js","names":[],"sources":["../../src/utils/componentSources.ts"],"sourcesContent":["import { resolve, relative } from 'node:path'\nimport type { ComponentSource } from '../types/config.ts'\n\n/**\n * Internal representation of a component source after defaults are\n * resolved and `path` is made absolute. Always carries the same shape\n * regardless of which user-facing form produced it.\n */\nexport interface NormalizedComponentSource {\n /** Absolute directory path. */\n path: string\n /**\n * Custom prefix prepended to resolved component names.\n * - `undefined` → use folder-name namespace (the `directoryAsNamespace`\n * behavior of unplugin-vue-components).\n * - `''` (empty string) → no prefix at all; use the bare filename.\n * - any other string → exact prefix.\n */\n prefix?: string\n /** Include intermediate subfolder names in the resolved name. */\n pathPrefix: boolean\n}\n\n/**\n * Normalize a user-supplied `components.source` value into an array\n * of absolute, fully-defaulted entries.\n */\nexport function normalizeComponentSources(\n sources: ComponentSource | ComponentSource[] | undefined,\n cwd: string,\n): NormalizedComponentSource[] {\n if (!sources) return []\n const list = Array.isArray(sources) ? sources : [sources]\n return list.map((s) => {\n if (typeof s === 'string') {\n return { path: resolve(cwd, s), prefix: undefined, pathPrefix: true }\n }\n return {\n path: resolve(cwd, s.path),\n prefix: s.prefix,\n pathPrefix: s.pathPrefix ?? true,\n }\n })\n}\n\nfunction pascalCase(s: string): string {\n return s\n .replace(/[-_\\s]+(.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, c => c.toUpperCase())\n}\n\nexport interface ComponentNameOptions {\n /** Absolute path to the component file. */\n filePath: string\n /** Absolute path to the dir root the component was discovered under. */\n dirRoot: string\n /** See {@link NormalizedComponentSource.prefix}. */\n prefix?: string\n /** See {@link NormalizedComponentSource.pathPrefix}. */\n pathPrefix: boolean\n}\n\n/**\n * Compute the component name unplugin-vue-components would assign for a\n * given file under a given dir, mirroring the plugin's\n * `directoryAsNamespace: true` + `collapseSamePrefixes: true` behavior\n * and layering custom-prefix sources on top.\n *\n * Used both at render time (to register a custom resolver) and at lint\n * time (so the linter can follow component graph correctly).\n */\nexport function componentNameFromPath(opts: ComponentNameOptions): string {\n const { filePath, dirRoot, prefix, pathPrefix } = opts\n\n const rel = relative(dirRoot, filePath).replace(/\\\\/g, '/')\n const noExt = rel.replace(/\\.(vue|md)$/, '')\n const segments = noExt.split('/').map(pascalCase)\n const fileName = segments.pop() ?? ''\n\n if (prefix !== undefined) {\n const folderPart = pathPrefix ? segments.join('') : ''\n const stripped = prefix && fileName.startsWith(prefix)\n ? fileName.slice(prefix.length)\n : fileName\n return prefix + folderPart + stripped\n }\n\n const folderPart = segments.join('')\n if (folderPart && fileName.startsWith(folderPart)) {\n return fileName\n }\n return folderPart + fileName\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,0BACd,SACA,KAC6B;CAC7B,IAAI,CAAC,SAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"componentSources.js","names":[],"sources":["../../src/utils/componentSources.ts"],"sourcesContent":["import { resolve, relative } from 'node:path'\nimport type { ComponentSource } from '../types/config.ts'\n\n/**\n * Internal representation of a component source after defaults are\n * resolved and `path` is made absolute. Always carries the same shape\n * regardless of which user-facing form produced it.\n */\nexport interface NormalizedComponentSource {\n /** Absolute directory path. */\n path: string\n /**\n * Custom prefix prepended to resolved component names.\n * - `undefined` → use folder-name namespace (the `directoryAsNamespace`\n * behavior of unplugin-vue-components).\n * - `''` (empty string) → no prefix at all; use the bare filename.\n * - any other string → exact prefix.\n */\n prefix?: string\n /** Include intermediate subfolder names in the resolved name. */\n pathPrefix: boolean\n}\n\n/**\n * Normalize a user-supplied `components.source` value into an array\n * of absolute, fully-defaulted entries.\n */\nexport function normalizeComponentSources(\n sources: ComponentSource | ComponentSource[] | undefined,\n cwd: string,\n): NormalizedComponentSource[] {\n if (!sources) return []\n const list = Array.isArray(sources) ? sources : [sources]\n return list.map((s) => {\n if (typeof s === 'string') {\n return { path: resolve(cwd, s), prefix: undefined, pathPrefix: true }\n }\n return {\n path: resolve(cwd, s.path),\n prefix: s.prefix,\n pathPrefix: s.pathPrefix ?? true,\n }\n })\n}\n\nfunction pascalCase(s: string): string {\n return s\n .replace(/[-_\\s]+(.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, c => c.toUpperCase())\n}\n\nexport interface ComponentNameOptions {\n /** Absolute path to the component file. */\n filePath: string\n /** Absolute path to the dir root the component was discovered under. */\n dirRoot: string\n /** See {@link NormalizedComponentSource.prefix}. */\n prefix?: string\n /** See {@link NormalizedComponentSource.pathPrefix}. */\n pathPrefix: boolean\n}\n\n/**\n * Compute the component name unplugin-vue-components would assign for a\n * given file under a given dir, mirroring the plugin's\n * `directoryAsNamespace: true` + `collapseSamePrefixes: true` behavior\n * and layering custom-prefix sources on top.\n *\n * Used both at render time (to register a custom resolver) and at lint\n * time (so the linter can follow component graph correctly).\n */\nexport function componentNameFromPath(opts: ComponentNameOptions): string {\n const { filePath, dirRoot, prefix, pathPrefix } = opts\n\n const rel = relative(dirRoot, filePath).replace(/\\\\/g, '/')\n const noExt = rel.replace(/\\.(vue|md)$/, '')\n const segments = noExt.split('/').map(pascalCase)\n const fileName = segments.pop() ?? ''\n\n if (prefix !== undefined) {\n const folderPart = pathPrefix ? segments.join('') : ''\n const stripped = prefix && fileName.startsWith(prefix)\n ? fileName.slice(prefix.length)\n : fileName\n return prefix + folderPart + stripped\n }\n\n const folderPart = segments.join('')\n if (folderPart && fileName.startsWith(folderPart)) {\n return fileName\n }\n return folderPart + fileName\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,0BACd,SACA,KAC6B;CAC7B,IAAI,CAAC,SAAS,OAAO,CAAC;CAEtB,QADa,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAC5C,KAAK,MAAM;EACrB,IAAI,OAAO,MAAM,UACf,OAAO;GAAE,MAAM,QAAQ,KAAK,CAAC;GAAG,QAAQ,KAAA;GAAW,YAAY;EAAK;EAEtE,OAAO;GACL,MAAM,QAAQ,KAAK,EAAE,IAAI;GACzB,QAAQ,EAAE;GACV,YAAY,EAAE,cAAc;EAC9B;CACF,CAAC;AACH;AAEA,SAAS,WAAW,GAAmB;CACrC,OAAO,EACJ,QAAQ,gBAAgB,GAAG,MAAM,EAAE,YAAY,CAAC,EAChD,QAAQ,SAAQ,MAAK,EAAE,YAAY,CAAC;AACzC;;;;;;;;;;AAsBA,SAAgB,sBAAsB,MAAoC;CACxE,MAAM,EAAE,UAAU,SAAS,QAAQ,eAAe;CAIlD,MAAM,WAFM,SAAS,SAAS,QAAQ,EAAE,QAAQ,OAAO,GACvC,EAAE,QAAQ,eAAe,EACpB,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU;CAChD,MAAM,WAAW,SAAS,IAAI,KAAK;CAEnC,IAAI,WAAW,KAAA,GAAW;EACxB,MAAM,aAAa,aAAa,SAAS,KAAK,EAAE,IAAI;EACpD,MAAM,WAAW,UAAU,SAAS,WAAW,MAAM,IACjD,SAAS,MAAM,OAAO,MAAM,IAC5B;EACJ,OAAO,SAAS,aAAa;CAC/B;CAEA,MAAM,aAAa,SAAS,KAAK,EAAE;CACnC,IAAI,cAAc,SAAS,WAAW,UAAU,GAC9C,OAAO;CAET,OAAO,aAAa;AACtB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Root } from "postcss";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/cssBox.d.ts
|
|
4
|
+
declare const NO_BORDER_STYLES: Set<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Parse a length token into px. Handles `Npx`, `Nrem`, `Nem`, `Npt`, and
|
|
7
|
+
* unitless N (treated as px). Returns null for percentages, calc(),
|
|
8
|
+
* keywords, or anything that doesn't reduce to a concrete length.
|
|
9
|
+
*/
|
|
10
|
+
declare function lengthToPx(value: string): number | null;
|
|
11
|
+
/**
|
|
12
|
+
* Expand a 1-4 token CSS shorthand (T R B L) into a left/right pair:
|
|
13
|
+
* 1: all sides
|
|
14
|
+
* 2: TB RL
|
|
15
|
+
* 3: T RL B
|
|
16
|
+
* 4: T R B L
|
|
17
|
+
*/
|
|
18
|
+
declare function shorthandSides(value: string): {
|
|
19
|
+
left?: string;
|
|
20
|
+
right?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Read horizontal padding (left + right) px from a parsed style root.
|
|
24
|
+
* Percentages are skipped since they'd need a known container width.
|
|
25
|
+
*/
|
|
26
|
+
declare function horizontalPaddingPx(root: Root): number;
|
|
27
|
+
/**
|
|
28
|
+
* Extract a px length from a CSS border shorthand (e.g. `1px solid red` → 1).
|
|
29
|
+
* Returns null when the value indicates no border (`none` or `hidden`).
|
|
30
|
+
* Defaults to 3px (CSS `medium`) when a visible style is set but no
|
|
31
|
+
* explicit width token is present in the shorthand value.
|
|
32
|
+
*/
|
|
33
|
+
declare function shorthandBorderWidthPx(value: string): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Read horizontal border widths (left + right) px from a parsed style root.
|
|
36
|
+
* Per-side `border-style: none|hidden` overrides count as zero
|
|
37
|
+
* contribution. Returns total px or 0 when nothing resolves.
|
|
38
|
+
*/
|
|
39
|
+
declare function horizontalBorderPx(root: Root): number;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { NO_BORDER_STYLES, horizontalBorderPx, horizontalPaddingPx, lengthToPx, shorthandBorderWidthPx, shorthandSides };
|
|
42
|
+
//# sourceMappingURL=cssBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cssBox.d.ts","names":[],"sources":["../../src/utils/cssBox.ts"],"mappings":";;;cAEa,gBAAA,EAAgB,GAAA;;AAA7B;;;;iBAOgB,UAAA,CAAW,KAAa;AAAxC;;;;AAAwC;AAoBxC;;AApBA,iBAoBgB,cAAA,CAAe,KAAA;EAAkB,IAAA;EAAe,KAAA;AAAA;;;AAAK;AAerE;iBAAgB,mBAAA,CAAoB,IAAU,EAAJ,IAAI;;;AAAA;AA8B9C;;;iBAAgB,sBAAA,CAAuB,KAAa;AAAA;AAepD;;;;AAfoD,iBAepC,kBAAA,CAAmB,IAAU,EAAJ,IAAI"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
//#region src/utils/cssBox.ts
|
|
2
|
+
const NO_BORDER_STYLES = new Set(["none", "hidden"]);
|
|
3
|
+
/**
|
|
4
|
+
* Parse a length token into px. Handles `Npx`, `Nrem`, `Nem`, `Npt`, and
|
|
5
|
+
* unitless N (treated as px). Returns null for percentages, calc(),
|
|
6
|
+
* keywords, or anything that doesn't reduce to a concrete length.
|
|
7
|
+
*/
|
|
8
|
+
function lengthToPx(value) {
|
|
9
|
+
const m = value.trim().match(/^([\d.]+)(px|rem|em|pt)?$/i);
|
|
10
|
+
if (!m) return null;
|
|
11
|
+
const n = parseFloat(m[1]);
|
|
12
|
+
switch ((m[2] || "px").toLowerCase()) {
|
|
13
|
+
case "px": return n;
|
|
14
|
+
case "rem":
|
|
15
|
+
case "em": return n * 16;
|
|
16
|
+
case "pt": return n * 1.333;
|
|
17
|
+
default: return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Expand a 1-4 token CSS shorthand (T R B L) into a left/right pair:
|
|
22
|
+
* 1: all sides
|
|
23
|
+
* 2: TB RL
|
|
24
|
+
* 3: T RL B
|
|
25
|
+
* 4: T R B L
|
|
26
|
+
*/
|
|
27
|
+
function shorthandSides(value) {
|
|
28
|
+
const parts = value.trim().split(/\s+/);
|
|
29
|
+
switch (parts.length) {
|
|
30
|
+
case 1: return {
|
|
31
|
+
left: parts[0],
|
|
32
|
+
right: parts[0]
|
|
33
|
+
};
|
|
34
|
+
case 2:
|
|
35
|
+
case 3: return {
|
|
36
|
+
left: parts[1],
|
|
37
|
+
right: parts[1]
|
|
38
|
+
};
|
|
39
|
+
case 4: return {
|
|
40
|
+
left: parts[3],
|
|
41
|
+
right: parts[1]
|
|
42
|
+
};
|
|
43
|
+
default: return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Read horizontal padding (left + right) px from a parsed style root.
|
|
48
|
+
* Percentages are skipped since they'd need a known container width.
|
|
49
|
+
*/
|
|
50
|
+
function horizontalPaddingPx(root) {
|
|
51
|
+
let left = null;
|
|
52
|
+
let right = null;
|
|
53
|
+
root.walkDecls((d) => {
|
|
54
|
+
switch (d.prop) {
|
|
55
|
+
case "padding": {
|
|
56
|
+
const { left: l, right: r } = shorthandSides(d.value);
|
|
57
|
+
if (l) left = lengthToPx(l);
|
|
58
|
+
if (r) right = lengthToPx(r);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case "padding-left":
|
|
62
|
+
left = lengthToPx(d.value);
|
|
63
|
+
break;
|
|
64
|
+
case "padding-right":
|
|
65
|
+
right = lengthToPx(d.value);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return (left ?? 0) + (right ?? 0);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract a px length from a CSS border shorthand (e.g. `1px solid red` → 1).
|
|
73
|
+
* Returns null when the value indicates no border (`none` or `hidden`).
|
|
74
|
+
* Defaults to 3px (CSS `medium`) when a visible style is set but no
|
|
75
|
+
* explicit width token is present in the shorthand value.
|
|
76
|
+
*/
|
|
77
|
+
function shorthandBorderWidthPx(value) {
|
|
78
|
+
const tokens = value.trim().split(/\s+/);
|
|
79
|
+
if (tokens.some((t) => NO_BORDER_STYLES.has(t.toLowerCase()))) return null;
|
|
80
|
+
for (const t of tokens) {
|
|
81
|
+
const px = lengthToPx(t);
|
|
82
|
+
if (px != null) return px;
|
|
83
|
+
}
|
|
84
|
+
return 3;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read horizontal border widths (left + right) px from a parsed style root.
|
|
88
|
+
* Per-side `border-style: none|hidden` overrides count as zero
|
|
89
|
+
* contribution. Returns total px or 0 when nothing resolves.
|
|
90
|
+
*/
|
|
91
|
+
function horizontalBorderPx(root) {
|
|
92
|
+
let left = null;
|
|
93
|
+
let right = null;
|
|
94
|
+
let leftNone = false;
|
|
95
|
+
let rightNone = false;
|
|
96
|
+
root.walkDecls((d) => {
|
|
97
|
+
switch (d.prop) {
|
|
98
|
+
case "border": {
|
|
99
|
+
const w = shorthandBorderWidthPx(d.value);
|
|
100
|
+
if (w == null) leftNone = rightNone = true;
|
|
101
|
+
else {
|
|
102
|
+
left = right = w;
|
|
103
|
+
leftNone = rightNone = false;
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case "border-width": {
|
|
108
|
+
const { left: l, right: r } = shorthandSides(d.value);
|
|
109
|
+
if (l) left = lengthToPx(l) ?? left;
|
|
110
|
+
if (r) right = lengthToPx(r) ?? right;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "border-style": {
|
|
114
|
+
const { left: l, right: r } = shorthandSides(d.value);
|
|
115
|
+
if (l && NO_BORDER_STYLES.has(l.toLowerCase())) leftNone = true;
|
|
116
|
+
if (r && NO_BORDER_STYLES.has(r.toLowerCase())) rightNone = true;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "border-left": {
|
|
120
|
+
const w = shorthandBorderWidthPx(d.value);
|
|
121
|
+
if (w == null) leftNone = true;
|
|
122
|
+
else {
|
|
123
|
+
left = w;
|
|
124
|
+
leftNone = false;
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "border-right": {
|
|
129
|
+
const w = shorthandBorderWidthPx(d.value);
|
|
130
|
+
if (w == null) rightNone = true;
|
|
131
|
+
else {
|
|
132
|
+
right = w;
|
|
133
|
+
rightNone = false;
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case "border-left-width":
|
|
138
|
+
left = lengthToPx(d.value) ?? left;
|
|
139
|
+
break;
|
|
140
|
+
case "border-right-width":
|
|
141
|
+
right = lengthToPx(d.value) ?? right;
|
|
142
|
+
break;
|
|
143
|
+
case "border-left-style":
|
|
144
|
+
if (NO_BORDER_STYLES.has(d.value.trim().toLowerCase())) leftNone = true;
|
|
145
|
+
break;
|
|
146
|
+
case "border-right-style":
|
|
147
|
+
if (NO_BORDER_STYLES.has(d.value.trim().toLowerCase())) rightNone = true;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
return (leftNone ? 0 : left ?? 0) + (rightNone ? 0 : right ?? 0);
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { NO_BORDER_STYLES, horizontalBorderPx, horizontalPaddingPx, lengthToPx, shorthandBorderWidthPx, shorthandSides };
|
|
155
|
+
|
|
156
|
+
//# sourceMappingURL=cssBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cssBox.js","names":[],"sources":["../../src/utils/cssBox.ts"],"sourcesContent":["import type { Root } from 'postcss'\n\nexport const NO_BORDER_STYLES = new Set(['none', 'hidden'])\n\n/**\n * Parse a length token into px. Handles `Npx`, `Nrem`, `Nem`, `Npt`, and\n * unitless N (treated as px). Returns null for percentages, calc(),\n * keywords, or anything that doesn't reduce to a concrete length.\n */\nexport function lengthToPx(value: string): number | null {\n const m = value.trim().match(/^([\\d.]+)(px|rem|em|pt)?$/i)\n if (!m) return null\n const n = parseFloat(m[1])\n switch ((m[2] || 'px').toLowerCase()) {\n case 'px': return n\n case 'rem':\n case 'em': return n * 16\n case 'pt': return n * 1.333\n default: return null\n }\n}\n\n/**\n * Expand a 1-4 token CSS shorthand (T R B L) into a left/right pair:\n * 1: all sides\n * 2: TB RL\n * 3: T RL B\n * 4: T R B L\n */\nexport function shorthandSides(value: string): { left?: string; right?: string } {\n const parts = value.trim().split(/\\s+/)\n switch (parts.length) {\n case 1: return { left: parts[0], right: parts[0] }\n case 2:\n case 3: return { left: parts[1], right: parts[1] }\n case 4: return { left: parts[3], right: parts[1] }\n default: return {}\n }\n}\n\n/**\n * Read horizontal padding (left + right) px from a parsed style root.\n * Percentages are skipped since they'd need a known container width.\n */\nexport function horizontalPaddingPx(root: Root): number {\n let left: number | null = null\n let right: number | null = null\n\n root.walkDecls((d) => {\n switch (d.prop) {\n case 'padding': {\n const { left: l, right: r } = shorthandSides(d.value)\n if (l) left = lengthToPx(l)\n if (r) right = lengthToPx(r)\n break\n }\n case 'padding-left':\n left = lengthToPx(d.value)\n break\n case 'padding-right':\n right = lengthToPx(d.value)\n break\n }\n })\n\n return (left ?? 0) + (right ?? 0)\n}\n\n/**\n * Extract a px length from a CSS border shorthand (e.g. `1px solid red` → 1).\n * Returns null when the value indicates no border (`none` or `hidden`).\n * Defaults to 3px (CSS `medium`) when a visible style is set but no\n * explicit width token is present in the shorthand value.\n */\nexport function shorthandBorderWidthPx(value: string): number | null {\n const tokens = value.trim().split(/\\s+/)\n if (tokens.some((t) => NO_BORDER_STYLES.has(t.toLowerCase()))) return null\n for (const t of tokens) {\n const px = lengthToPx(t)\n if (px != null) return px\n }\n return 3\n}\n\n/**\n * Read horizontal border widths (left + right) px from a parsed style root.\n * Per-side `border-style: none|hidden` overrides count as zero\n * contribution. Returns total px or 0 when nothing resolves.\n */\nexport function horizontalBorderPx(root: Root): number {\n let left: number | null = null\n let right: number | null = null\n let leftNone = false\n let rightNone = false\n\n root.walkDecls((d) => {\n switch (d.prop) {\n case 'border': {\n const w = shorthandBorderWidthPx(d.value)\n if (w == null) {\n leftNone = rightNone = true\n }\n else {\n left = right = w\n leftNone = rightNone = false\n }\n break\n }\n case 'border-width': {\n const { left: l, right: r } = shorthandSides(d.value)\n if (l) left = lengthToPx(l) ?? left\n if (r) right = lengthToPx(r) ?? right\n break\n }\n case 'border-style': {\n const { left: l, right: r } = shorthandSides(d.value)\n if (l && NO_BORDER_STYLES.has(l.toLowerCase())) leftNone = true\n if (r && NO_BORDER_STYLES.has(r.toLowerCase())) rightNone = true\n break\n }\n case 'border-left': {\n const w = shorthandBorderWidthPx(d.value)\n if (w == null) leftNone = true\n else { left = w; leftNone = false }\n break\n }\n case 'border-right': {\n const w = shorthandBorderWidthPx(d.value)\n if (w == null) rightNone = true\n else { right = w; rightNone = false }\n break\n }\n case 'border-left-width':\n left = lengthToPx(d.value) ?? left\n break\n case 'border-right-width':\n right = lengthToPx(d.value) ?? right\n break\n case 'border-left-style':\n if (NO_BORDER_STYLES.has(d.value.trim().toLowerCase())) leftNone = true\n break\n case 'border-right-style':\n if (NO_BORDER_STYLES.has(d.value.trim().toLowerCase())) rightNone = true\n break\n }\n })\n\n return (leftNone ? 0 : (left ?? 0)) + (rightNone ? 0 : (right ?? 0))\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decodeStyleEntities.d.ts","names":[],"sources":["../../src/utils/decodeStyleEntities.ts"],"mappings":";;AAUA
|
|
1
|
+
{"version":3,"file":"decodeStyleEntities.d.ts","names":[],"sources":["../../src/utils/decodeStyleEntities.ts"],"mappings":";;AAUA;;;;AAA6C;;;;;iBAA7B,mBAAA,CAAoB,CAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decodeStyleEntities.js","names":[],"sources":["../../src/utils/decodeStyleEntities.ts"],"sourcesContent":["/**\n * Decode HTML entities that Vue SSR encodes inside `<style>` tags.\n *\n * Vue's `renderToString` HTML-encodes quotes and angle brackets within\n * style elements in templates, breaking CSS like\n * `@import \"tailwindcss\"` → `@import "tailwindcss"`.\n *\n * `&` is decoded last so previously-decoded entities are not\n * re-processed.\n */\nexport function decodeStyleEntities(s: string): string {\n return s\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,oBAAoB,GAAmB;CACrD,OAAO,EACJ,QAAQ,WAAW,
|
|
1
|
+
{"version":3,"file":"decodeStyleEntities.js","names":[],"sources":["../../src/utils/decodeStyleEntities.ts"],"sourcesContent":["/**\n * Decode HTML entities that Vue SSR encodes inside `<style>` tags.\n *\n * Vue's `renderToString` HTML-encodes quotes and angle brackets within\n * style elements in templates, breaking CSS like\n * `@import \"tailwindcss\"` → `@import "tailwindcss"`.\n *\n * `&` is decoded last so previously-decoded entities are not\n * re-processed.\n */\nexport function decodeStyleEntities(s: string): string {\n return s\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,oBAAoB,GAAmB;CACrD,OAAO,EACJ,QAAQ,WAAW,IAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,WAAW,GAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","names":[],"sources":["../../src/utils/detect.ts"],"mappings":";iBAGgB,SAAA,CAAU,
|
|
1
|
+
{"version":3,"file":"detect.d.ts","names":[],"sources":["../../src/utils/detect.ts"],"mappings":";iBAGgB,SAAA,CAAU,GAA2B"}
|
package/dist/utils/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","names":[],"sources":["../../src/utils/detect.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport function isLaravel(cwd: string = process.cwd()): boolean {\n return existsSync(resolve(cwd, 'artisan'))\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,MAAc,QAAQ,
|
|
1
|
+
{"version":3,"file":"detect.js","names":[],"sources":["../../src/utils/detect.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport function isLaravel(cwd: string = process.cwd()): boolean {\n return existsSync(resolve(cwd, 'artisan'))\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,MAAc,QAAQ,IAAI,GAAY;CAC9D,OAAO,WAAW,QAAQ,KAAK,SAAS,CAAC;AAC3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-markers.d.ts","names":[],"sources":["../../src/utils/output-markers.ts"],"mappings":";;AASA
|
|
1
|
+
{"version":3,"file":"output-markers.d.ts","names":[],"sources":["../../src/utils/output-markers.ts"],"mappings":";;AASA;;;;AAAgC;cAAnB,mBAAA;AAAA,cACA,cAAA;;;AAAc;AA+C3B;;;;AAAyC;iBAAzB,YAAA,CAAa,IAAY;;;;AAgBK;;;;iBAA9B,iBAAA,CAAkB,IAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-markers.js","names":[],"sources":["../../src/utils/output-markers.ts"],"sourcesContent":["import { parse, serialize } from './ast/index.ts'\nimport type { ChildNode, Element } from 'domhandler'\n\n/**\n * Sentinel attributes the `<Plaintext>` and `<NotPlaintext>`\n * components stamp on their wrapper `<div>` so the build step\n * can route their slot content to one output and remove it\n * entirely from the other.\n */\nexport const PLAINTEXT_ONLY_ATTR = 'data-maizzle-plaintext-only'\nexport const HTML_ONLY_ATTR = 'data-maizzle-html-only'\n\ntype Op = 'drop' | 'unwrap'\ntype Rule = readonly [attr: string, op: Op]\n\nconst isElement = (n: ChildNode): n is Element => n.type === 'tag'\n\n/**\n * Apply marker rules to a forest of nodes.\n *\n * - `drop` removes the matched element and its descendants.\n * - `unwrap` removes the wrapper element but keeps its children,\n * splicing them into the parent's child list in place.\n *\n * Non-matching elements recurse so nested markers are handled.\n */\nfunction applyRules(nodes: ChildNode[], rules: readonly Rule[]): ChildNode[] {\n const out: ChildNode[] = []\n for (const n of nodes) {\n if (isElement(n)) {\n const match = rules.find(([attr]) => n.attribs?.[attr] !== undefined)\n if (match) {\n const [, op] = match\n if (op === 'drop') continue\n out.push(...applyRules((n.children ?? []) as ChildNode[], rules))\n continue\n }\n if (n.children?.length) {\n n.children = applyRules(n.children as ChildNode[], rules) as Element['children']\n }\n }\n out.push(n)\n }\n return out\n}\n\nconst hasMarkers = (html: string): boolean =>\n html.includes(PLAINTEXT_ONLY_ATTR) || html.includes(HTML_ONLY_ATTR)\n\n/**\n * Strip output markers for the HTML output: drop plaintext-only\n * subtrees entirely, unwrap html-only wrappers (keep children).\n *\n * When no markers are present, the input is returned unchanged so\n * the post-transformer formatting (prettify, XHTML self-closing\n * slashes, etc.) survives intact for the typical case.\n */\nexport function stripForHtml(html: string): string {\n if (!hasMarkers(html)) return html\n const isXhtml = /<!DOCTYPE\\s+[^>]*xhtml/i.test(html)\n return serialize(applyRules(parse(html), [\n [PLAINTEXT_ONLY_ATTR, 'drop'],\n [HTML_ONLY_ATTR, 'unwrap'],\n ]), { selfClosingTags: isXhtml })\n}\n\n/**\n * Strip output markers for the plaintext source: drop html-only\n * subtrees entirely, unwrap plaintext-only wrappers (keep children).\n *\n * The result is fed to `createPlaintext`, which then strips all\n * remaining tags via `string-strip-html`.\n */\nexport function stripForPlaintext(html: string): string {\n if (!hasMarkers(html)) return html\n return serialize(applyRules(parse(html), [\n [HTML_ONLY_ATTR, 'drop'],\n [PLAINTEXT_ONLY_ATTR, 'unwrap'],\n ]))\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAK9B,MAAM,aAAa,MAA+B,EAAE,SAAS;;;;;;;;;;AAW7D,SAAS,WAAW,OAAoB,OAAqC;CAC3E,MAAM,MAAmB,
|
|
1
|
+
{"version":3,"file":"output-markers.js","names":[],"sources":["../../src/utils/output-markers.ts"],"sourcesContent":["import { parse, serialize } from './ast/index.ts'\nimport type { ChildNode, Element } from 'domhandler'\n\n/**\n * Sentinel attributes the `<Plaintext>` and `<NotPlaintext>`\n * components stamp on their wrapper `<div>` so the build step\n * can route their slot content to one output and remove it\n * entirely from the other.\n */\nexport const PLAINTEXT_ONLY_ATTR = 'data-maizzle-plaintext-only'\nexport const HTML_ONLY_ATTR = 'data-maizzle-html-only'\n\ntype Op = 'drop' | 'unwrap'\ntype Rule = readonly [attr: string, op: Op]\n\nconst isElement = (n: ChildNode): n is Element => n.type === 'tag'\n\n/**\n * Apply marker rules to a forest of nodes.\n *\n * - `drop` removes the matched element and its descendants.\n * - `unwrap` removes the wrapper element but keeps its children,\n * splicing them into the parent's child list in place.\n *\n * Non-matching elements recurse so nested markers are handled.\n */\nfunction applyRules(nodes: ChildNode[], rules: readonly Rule[]): ChildNode[] {\n const out: ChildNode[] = []\n for (const n of nodes) {\n if (isElement(n)) {\n const match = rules.find(([attr]) => n.attribs?.[attr] !== undefined)\n if (match) {\n const [, op] = match\n if (op === 'drop') continue\n out.push(...applyRules((n.children ?? []) as ChildNode[], rules))\n continue\n }\n if (n.children?.length) {\n n.children = applyRules(n.children as ChildNode[], rules) as Element['children']\n }\n }\n out.push(n)\n }\n return out\n}\n\nconst hasMarkers = (html: string): boolean =>\n html.includes(PLAINTEXT_ONLY_ATTR) || html.includes(HTML_ONLY_ATTR)\n\n/**\n * Strip output markers for the HTML output: drop plaintext-only\n * subtrees entirely, unwrap html-only wrappers (keep children).\n *\n * When no markers are present, the input is returned unchanged so\n * the post-transformer formatting (prettify, XHTML self-closing\n * slashes, etc.) survives intact for the typical case.\n */\nexport function stripForHtml(html: string): string {\n if (!hasMarkers(html)) return html\n const isXhtml = /<!DOCTYPE\\s+[^>]*xhtml/i.test(html)\n return serialize(applyRules(parse(html), [\n [PLAINTEXT_ONLY_ATTR, 'drop'],\n [HTML_ONLY_ATTR, 'unwrap'],\n ]), { selfClosingTags: isXhtml })\n}\n\n/**\n * Strip output markers for the plaintext source: drop html-only\n * subtrees entirely, unwrap plaintext-only wrappers (keep children).\n *\n * The result is fed to `createPlaintext`, which then strips all\n * remaining tags via `string-strip-html`.\n */\nexport function stripForPlaintext(html: string): string {\n if (!hasMarkers(html)) return html\n return serialize(applyRules(parse(html), [\n [HTML_ONLY_ATTR, 'drop'],\n [PLAINTEXT_ONLY_ATTR, 'unwrap'],\n ]))\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,sBAAsB;AACnC,MAAa,iBAAiB;AAK9B,MAAM,aAAa,MAA+B,EAAE,SAAS;;;;;;;;;;AAW7D,SAAS,WAAW,OAAoB,OAAqC;CAC3E,MAAM,MAAmB,CAAC;CAC1B,KAAK,MAAM,KAAK,OAAO;EACrB,IAAI,UAAU,CAAC,GAAG;GAChB,MAAM,QAAQ,MAAM,MAAM,CAAC,UAAU,EAAE,UAAU,UAAU,KAAA,CAAS;GACpE,IAAI,OAAO;IACT,MAAM,GAAG,MAAM;IACf,IAAI,OAAO,QAAQ;IACnB,IAAI,KAAK,GAAG,WAAY,EAAE,YAAY,CAAC,GAAmB,KAAK,CAAC;IAChE;GACF;GACA,IAAI,EAAE,UAAU,QACd,EAAE,WAAW,WAAW,EAAE,UAAyB,KAAK;EAE5D;EACA,IAAI,KAAK,CAAC;CACZ;CACA,OAAO;AACT;AAEA,MAAM,cAAc,SAClB,KAAK,SAAA,6BAA4B,KAAK,KAAK,SAAA,wBAAuB;;;;;;;;;AAUpE,SAAgB,aAAa,MAAsB;CACjD,IAAI,CAAC,WAAW,IAAI,GAAG,OAAO;CAC9B,MAAM,UAAU,0BAA0B,KAAK,IAAI;CACnD,OAAO,UAAU,WAAW,MAAM,IAAI,GAAG,CACvC,CAAC,qBAAqB,MAAM,GAC5B,CAAC,gBAAgB,QAAQ,CAC3B,CAAC,GAAG,EAAE,iBAAiB,QAAQ,CAAC;AAClC;;;;;;;;AASA,SAAgB,kBAAkB,MAAsB;CACtD,IAAI,CAAC,WAAW,IAAI,GAAG,OAAO;CAC9B,OAAO,UAAU,WAAW,MAAM,IAAI,GAAG,CACvC,CAAC,gBAAgB,MAAM,GACvB,CAAC,qBAAqB,QAAQ,CAChC,CAAC,CAAC;AACJ"}
|
package/dist/utils/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","names":[],"sources":["../../src/utils/url.ts"],"mappings":";cAEa,WAAA,EAAa,
|
|
1
|
+
{"version":3,"file":"url.d.ts","names":[],"sources":["../../src/utils/url.ts"],"mappings":";cAEa,WAAA,EAAa,MAAM;AAAA,cAcnB,aAAA;AAAA,iBAEG,aAAA,CAAc,GAAW;AAAA,iBAMzB,aAAA,CAAc,MAAA,UAAgB,OAAe"}
|
package/dist/utils/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isUrl from 'is-url-superb'\n\nexport const defaultTags: Record<string, string[]> = {\n a: ['href'],\n img: ['src', 'srcset'],\n video: ['src', 'poster'],\n source: ['src', 'srcset'],\n link: ['href'],\n script: ['src'],\n object: ['data'],\n embed: ['src'],\n iframe: ['src'],\n 'v:image': ['src'],\n 'v:fill': ['src'],\n}\n\nexport const urlAttributes = [...new Set(Object.values(defaultTags).flat())]\n\nexport function isAbsoluteUrl(url: string): boolean {\n if (!url) return true\n\n return url.startsWith('//') || url.startsWith('#') || url.startsWith('?') || isUrl(url)\n}\n\nexport function processSrcset(srcset: string, baseUrl: string): string {\n return srcset.split(',').map(entry => {\n const parts = entry.trim().split(/\\s+/)\n\n if (parts[0] && !isAbsoluteUrl(parts[0])) {\n parts[0] = baseUrl + parts[0]\n }\n\n return parts.join(' ')\n }).join(', ')\n}\n"],"mappings":";;AAEA,MAAa,cAAwC;CACnD,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isUrl from 'is-url-superb'\n\nexport const defaultTags: Record<string, string[]> = {\n a: ['href'],\n img: ['src', 'srcset'],\n video: ['src', 'poster'],\n source: ['src', 'srcset'],\n link: ['href'],\n script: ['src'],\n object: ['data'],\n embed: ['src'],\n iframe: ['src'],\n 'v:image': ['src'],\n 'v:fill': ['src'],\n}\n\nexport const urlAttributes = [...new Set(Object.values(defaultTags).flat())]\n\nexport function isAbsoluteUrl(url: string): boolean {\n if (!url) return true\n\n return url.startsWith('//') || url.startsWith('#') || url.startsWith('?') || isUrl(url)\n}\n\nexport function processSrcset(srcset: string, baseUrl: string): string {\n return srcset.split(',').map(entry => {\n const parts = entry.trim().split(/\\s+/)\n\n if (parts[0] && !isAbsoluteUrl(parts[0])) {\n parts[0] = baseUrl + parts[0]\n }\n\n return parts.join(' ')\n }).join(', ')\n}\n"],"mappings":";;AAEA,MAAa,cAAwC;CACnD,GAAG,CAAC,MAAM;CACV,KAAK,CAAC,OAAO,QAAQ;CACrB,OAAO,CAAC,OAAO,QAAQ;CACvB,QAAQ,CAAC,OAAO,QAAQ;CACxB,MAAM,CAAC,MAAM;CACb,QAAQ,CAAC,KAAK;CACd,QAAQ,CAAC,MAAM;CACf,OAAO,CAAC,KAAK;CACb,QAAQ,CAAC,KAAK;CACd,WAAW,CAAC,KAAK;CACjB,UAAU,CAAC,KAAK;AAClB;AAEA,MAAa,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,WAAW,EAAE,KAAK,CAAC,CAAC;AAE3E,SAAgB,cAAc,KAAsB;CAClD,IAAI,CAAC,KAAK,OAAO;CAEjB,OAAO,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG,KAAK,MAAM,GAAG;AACxF;AAEA,SAAgB,cAAc,QAAgB,SAAyB;CACrE,OAAO,OAAO,MAAM,GAAG,EAAE,KAAI,UAAS;EACpC,MAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK;EAEtC,IAAI,MAAM,MAAM,CAAC,cAAc,MAAM,EAAE,GACrC,MAAM,KAAK,UAAU,MAAM;EAG7B,OAAO,MAAM,KAAK,GAAG;CACvB,CAAC,EAAE,KAAK,IAAI;AACd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchPaths.js","names":[],"sources":["../../src/utils/watchPaths.ts"],"sourcesContent":["import { matchesGlob, relative } from 'node:path'\n\n/**\n * Build a predicate that tells whether an absolute file path emitted by\n * chokidar matches any of the given globs. Patterns are interpreted as\n * project-relative; a leading `./` is stripped so user-supplied globs like\n * `./locales/**` behave identically to `locales/**`.\n */\nexport function createWatchedFileMatcher(patterns: string[], cwd: string) {\n const normalized = patterns.map(p => p.replace(/^\\.\\//, ''))\n return (file: string) => {\n const rel = relative(cwd, file).replace(/\\\\/g, '/')\n return normalized.some(p => matchesGlob(rel, p))\n }\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,yBAAyB,UAAoB,KAAa;CACxE,MAAM,aAAa,SAAS,KAAI,MAAK,EAAE,QAAQ,SAAS,
|
|
1
|
+
{"version":3,"file":"watchPaths.js","names":[],"sources":["../../src/utils/watchPaths.ts"],"sourcesContent":["import { matchesGlob, relative } from 'node:path'\n\n/**\n * Build a predicate that tells whether an absolute file path emitted by\n * chokidar matches any of the given globs. Patterns are interpreted as\n * project-relative; a leading `./` is stripped so user-supplied globs like\n * `./locales/**` behave identically to `locales/**`.\n */\nexport function createWatchedFileMatcher(patterns: string[], cwd: string) {\n const normalized = patterns.map(p => p.replace(/^\\.\\//, ''))\n return (file: string) => {\n const rel = relative(cwd, file).replace(/\\\\/g, '/')\n return normalized.some(p => matchesGlob(rel, p))\n }\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,yBAAyB,UAAoB,KAAa;CACxE,MAAM,aAAa,SAAS,KAAI,MAAK,EAAE,QAAQ,SAAS,EAAE,CAAC;CAC3D,QAAQ,SAAiB;EACvB,MAAM,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,OAAO,GAAG;EAClD,OAAO,WAAW,MAAK,MAAK,YAAY,KAAK,CAAC,CAAC;CACjD;AACF"}
|
|
@@ -357,7 +357,7 @@ interface BlockOptions {
|
|
|
357
357
|
declare function block({ input, output, overwrite, hideCursor, }?: BlockOptions): () => void;
|
|
358
358
|
declare const getColumns: (output: Writable) => number;
|
|
359
359
|
declare const getRows: (output: Writable) => number;
|
|
360
|
-
declare function wrapTextWithPrefix(output: Writable | undefined, text: string, prefix: string, startPrefix?: string, lineFormatter?: (line: string, index: number) => string): string;
|
|
360
|
+
declare function wrapTextWithPrefix(output: Writable | undefined, text: string, prefix: string, startPrefix?: string, endPrefix?: string, lineFormatter?: (line: string, index: number) => string): string;
|
|
361
361
|
|
|
362
362
|
export { AutocompletePrompt, ConfirmPrompt, DatePrompt, GroupMultiSelectPrompt, MultiLinePrompt, MultiSelectPrompt, PasswordPrompt, Prompt, SelectKeyPrompt, SelectPrompt, TextPrompt, block, getColumns, getRows, isCancel, settings, updateSettings, wrapTextWithPrefix };
|
|
363
363
|
export type { AutocompleteOptions, ClackSettings, ConfirmOptions, DateFormat, DateOptions, DateParts, GroupMultiSelectOptions, MultiLineOptions, MultiSelectOptions, PasswordOptions, PromptOptions, SelectKeyOptions, SelectOptions, ClackState as State, TextOptions };
|