blogger-plugin 0.0.11 → 0.0.12
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/vite.cjs +1 -1
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.mjs +1 -1
- package/dist/vite.mjs.map +1 -1
- package/package.json +1 -1
package/dist/vite.cjs
CHANGED
|
@@ -227,7 +227,7 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
227
227
|
});
|
|
228
228
|
server.middlewares.use(async (req, res, next) => {
|
|
229
229
|
const url = require_utils.getRequestUrl(req);
|
|
230
|
-
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/"))) {
|
|
230
|
+
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/")) || url.pathname.startsWith("/@")) {
|
|
231
231
|
next();
|
|
232
232
|
return;
|
|
233
233
|
}
|
package/dist/vite.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.cjs","names":["VITE_BUNDLER_KEY","replaceBloggerPluginHeadComment","fs","isTailwindPlugin","unescapeHTML","path","DEFAULT_MODULES","DEFAULT_TEMPLATES","getRequestUrl","toWebHeaders","updateTailwindCache","replaceHost","getBloggerPluginHeadComment","errorHtml"],"sources":["../src/vite.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { type MinifyOptions, minify } from 'minify-xml';\nimport type { MinimalPluginContextWithoutEnvironment, Plugin, PreviewServer, ResolvedConfig, UserConfig, ViteDevServer } from 'vite';\nimport { DEFAULT_MODULES, DEFAULT_TEMPLATES, VITE_BUNDLER_KEY } from './constants';\nimport { clearTailwindCache, removeTailwindCache, updateTailwindCache } from './tailwind';\nimport {\n errorHtml,\n getBloggerPluginHeadComment,\n getRequestUrl,\n isTailwindPlugin,\n replaceBloggerPluginHeadComment,\n replaceHost,\n toWebHeaders,\n unescapeHTML,\n} from './utils';\n\nexport interface XMLOptions {\n tags?: boolean;\n minify?: boolean;\n}\n\nexport interface BloggerPluginOptions {\n modules?: string[];\n styles?: string[];\n template?: string;\n proxyBlog: string;\n xml?: XMLOptions;\n}\n\nexport default function blogger(userOptions: BloggerPluginOptions): Plugin {\n const ctx = new BloggerPluginContext(userOptions);\n\n return {\n name: '@blogger-plugin/vite',\n config(config) {\n // resolve plugin context\n ctx.resolve(config);\n\n // modify vite config\n config.build ||= {};\n config.build[VITE_BUNDLER_KEY] ||= {};\n const bundlerOptions = config.build[VITE_BUNDLER_KEY];\n if (Array.isArray(bundlerOptions.input)) {\n bundlerOptions.input = [...bundlerOptions.input, ctx.input];\n } else if (typeof bundlerOptions.input === 'object' && bundlerOptions.input !== null) {\n bundlerOptions.input[ctx.input] = ctx.input;\n } else {\n bundlerOptions.input = ctx.input;\n }\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n // remove contents between comments from template\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(originalTemplateXmlContent, ''), '', true);\n\n fs.writeFileSync(ctx.template, modifiedTemplateXmlContent, 'utf-8');\n },\n configResolved(config) {\n ctx.viteConfig = config;\n ctx.tailwind = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));\n\n if (ctx.tailwind) {\n clearTailwindCache(ctx.root);\n\n if (config.command === 'build') {\n updateTailwindCache(ctx.root, unescapeHTML(fs.readFileSync(ctx.template, 'utf-8'), true), 'xml');\n }\n } else {\n removeTailwindCache(ctx.root);\n }\n },\n resolveId(source) {\n if (source === ctx.input) {\n return ctx.input;\n }\n },\n load(id) {\n if (id === ctx.input) {\n return ctx.html;\n }\n },\n buildStart() {\n if (ctx.viteConfig.command === 'build' && !/^https?:\\/\\//.test(ctx.viteConfig.base)) {\n this.warn(`\"base\" should be a CDN URL in production\n----------------------\nBlogger cannot serve static assets (JS, CSS, etc.), so you must use\nan absolute URL (http:// or https://).\n\nCurrent value:\n base: \"${ctx.viteConfig.base}\"\n\nQuick fix:\n VITE_BASE=https://cdn.jsdelivr.net/gh/<username>/<repository>@latest/dist/ npm run build\n\nVite config (recommended):\n export default defineConfig({\n base: process.env.VITE_BASE ?? \"/\"\n });\n\nWithout this, your assets may fail to load in Blogger.\n----------------------`);\n }\n },\n writeBundle(_, bundle) {\n if (!(ctx.input in bundle)) {\n return;\n }\n const asset = bundle[ctx.input];\n delete bundle[ctx.input];\n\n if (asset.type !== 'asset' || typeof asset.source !== 'string') {\n return;\n }\n const regex =\n /<!DOCTYPE html>\\s*<html[^>]*>\\s*<head>([\\s\\S]*?)<!--head-->([\\s\\S]*?)<\\/head>\\s*<body>([\\s\\S]*?)<!--body-->([\\s\\S]*?)<\\/body>\\s*<\\/html>/i;\n const match = asset.source.match(regex);\n if (!match) {\n return;\n }\n\n const afterHeadBegin = match[1];\n const beforeHeadEnd = match[2];\n const afterBodyBegin = match[3];\n const beforeBodyEnd = match[4];\n\n const headContent = (afterHeadBegin + beforeHeadEnd)\n .replace(/<[^>]+>/g, (openingTag: string) => {\n return (\n openingTag\n // boolean attributes to empty string\n .replace(/\\b(crossorigin|defer|async|disabled|checked)\\b(?!\\s*=)/g, (_, $1: string) =>\n $1 === 'crossorigin' ? 'crossorigin=\"anonymous\"' : `${$1}=\"\"`,\n )\n // convert attributes to single quotes safely\n .replace(/(\\w+)=(\".*?\"|'.*?')/g, (_, $1: string, $2: string) => {\n const v = $2\n // remove quotes\n .slice(1, -1)\n // escape special XML chars\n .replace(/&/g, '&')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n return `${$1}='${v}'`;\n })\n );\n })\n // self-close void tags\n .replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1: string, $2: string) => `<${$1}${$2}/>`)\n // remove whitespace between tags\n .replace(/>\\s+</g, '><')\n // trim overall\n .trim();\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(originalTemplateXmlContent, headContent, true);\n\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), modifiedTemplateXmlContent);\n\n if (ctx.xml.tags) {\n const templateTagsXmlContent = `<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE html>\n<html>\n<head>\n <!--head:afterbegin:begin-->\n\n <!--head:afterbegin:end-->\n\n <!--head:beforeend:begin-->\n ${headContent}\n <!--head:beforeend:end-->\n</head>\n<body>\n <!--body:afterbegin:begin-->\n ${afterBodyBegin.trim()}\n <!--body:afterbegin:end-->\n\n <!--body:beforeend:begin-->\n ${beforeBodyEnd.trim()}\n <!--body:beforeend:end-->\n</body>\n</html>`;\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.tags.xml'), templateTagsXmlContent);\n }\n\n if (ctx.xml.minify) {\n const minifiedTemplateXmlContent = minify(modifiedTemplateXmlContent, {\n removeComments: false,\n shortenNamespaces: false,\n removeUnusedNamespaces: false,\n removeUnusedDefaultNamespace: false,\n ignoreCData: true,\n } as MinifyOptions);\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.min.xml'), minifiedTemplateXmlContent);\n }\n },\n closeBundle() {\n const htmlDir = path.resolve(ctx.viteConfig.build.outDir, 'virtual:blogger-plugin');\n if (fs.existsSync(htmlDir)) {\n fs.rmSync(htmlDir, { recursive: true });\n }\n },\n configureServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n configurePreviewServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n };\n}\n\nclass BloggerPluginContext {\n private options: BloggerPluginOptions;\n root: string;\n modules: string[];\n styles: string[];\n template: string;\n name: string;\n proxyBlog: URL;\n xml: Required<XMLOptions>;\n viteConfig: ResolvedConfig;\n tailwind: boolean;\n input: string;\n html: string;\n headTags: string[];\n\n constructor(options: BloggerPluginOptions) {\n if (typeof options.template !== 'undefined' && typeof options.template !== 'string') {\n throw new Error(\"Option 'template' must be a string\");\n }\n if (typeof options.modules !== 'undefined' && !Array.isArray(options.modules)) {\n throw new Error(\"Option 'modules' must be an array\");\n }\n if (typeof options.styles !== 'undefined' && !Array.isArray(options.styles)) {\n throw new Error(\"Option 'styles' must be an array\");\n }\n if (typeof options.proxyBlog !== 'string') {\n throw new Error(\"Option 'proxyBlog' must be a string\");\n }\n let proxyBlog: URL;\n try {\n proxyBlog = new URL(options.proxyBlog);\n } catch {\n throw new Error(\"Option 'proxyBlog' must be a valid url\");\n }\n\n this.options = options;\n this.root = process.cwd();\n this.modules = [];\n this.styles = [];\n this.template = undefined as unknown as string;\n this.name = undefined as unknown as string;\n this.proxyBlog = proxyBlog;\n this.xml = {\n tags: options.xml?.tags ?? false,\n minify: options.xml?.minify ?? false,\n };\n this.viteConfig = undefined as unknown as ResolvedConfig;\n this.tailwind = false;\n this.input = undefined as unknown as string;\n this.headTags = [];\n this.html = undefined as unknown as string;\n }\n\n resolve(config: UserConfig) {\n this.root = config.root ? path.resolve(config.root) : this.root;\n\n if (this.options.modules) {\n for (let i = 0; i < this.options.modules.length; i++) {\n const module = this.options.modules[i];\n const modulePath = path.resolve(this.root, module);\n if (this.modules.includes(modulePath)) {\n continue;\n }\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n } else {\n throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);\n }\n }\n } else {\n for (const module of DEFAULT_MODULES) {\n const modulePath = path.resolve(this.root, module);\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n break;\n }\n }\n }\n\n if (this.options.styles) {\n for (let i = 0; i < this.options.styles.length; i++) {\n const style = this.options.styles[i];\n const stylePath = path.resolve(this.root, style);\n if (this.styles.includes(stylePath)) {\n continue;\n }\n if (fs.existsSync(stylePath)) {\n this.styles.push(stylePath);\n } else {\n throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);\n }\n }\n }\n\n if (this.options.template) {\n const templatePath = path.resolve(this.root, this.options.template);\n if (fs.existsSync(templatePath)) {\n this.template = templatePath;\n } else {\n throw new Error(`Provided template file does not exist: ${templatePath}`);\n }\n } else {\n for (const file of DEFAULT_TEMPLATES) {\n const fullPath = path.resolve(this.root, file);\n if (fs.existsSync(fullPath)) {\n this.template = fullPath;\n break;\n }\n }\n\n if (!this.template) {\n throw new Error(\n 'No template file found.\\n' +\n `Tried: ${DEFAULT_TEMPLATES.join(', ')}\\n` +\n '👉 Tip: You can pass a custom template as shown:\\n' +\n ' blogger({ template: \"src/my-template.xml\" })',\n );\n }\n }\n\n this.name = path.basename(this.template, path.extname(this.template));\n\n for (const modulePath of this.modules) {\n this.headTags.push(`<script type=\"module\" src=\"/${path.relative(this.root, modulePath).replaceAll('\\\\', '/')}\"></script>`);\n }\n for (const stylePath of this.styles) {\n this.headTags.push(`<link rel=\"stylesheet\" href=\"/${path.relative(this.root, stylePath).replaceAll('\\\\', '/')}\">`);\n }\n\n this.input = `virtual:blogger-plugin/${this.name}.html`;\n this.html = `<!DOCTYPE html>\n<html>\n<head>\n <!--head-->${this.headTags.length > 0 ? `\\n ${this.headTags.join('\\n ')}` : ''}\n</head>\n<body>\n <!--body-->\n</body>\n</html>`;\n }\n}\n\nfunction useServerMiddleware(server: ViteDevServer | PreviewServer, ctx: BloggerPluginContext, _this: MinimalPluginContextWithoutEnvironment) {\n const input = ctx.viteConfig.build[VITE_BUNDLER_KEY].input;\n const htmlPathnames: string[] = [];\n for (const entry of Array.isArray(input) ? input : typeof input === 'object' ? Object.values(input) : typeof input === 'string' ? [input] : []) {\n if (entry === ctx.input) {\n continue;\n }\n const entryPath = path.resolve(ctx.root, entry);\n if (!entryPath.endsWith('.html')) {\n continue;\n }\n const relativePath = path.relative(ctx.root, entry).replaceAll('\\\\', '/');\n htmlPathnames.push(`/${relativePath}`);\n if (relativePath.endsWith('index.html')) {\n htmlPathnames.push(`/${relativePath.replace(/index\\.html$/, '')}`);\n }\n }\n\n return () => {\n server.httpServer?.once('listening', () => {\n setTimeout(() => {\n _this.info(`Unhandled requests will be proxied to ${ctx.proxyBlog.origin}`);\n }, 0);\n });\n\n server.middlewares.use(async (req, res, next) => {\n const url = getRequestUrl(req);\n\n if (\n !req.url ||\n !req.originalUrl ||\n !url ||\n !req.method ||\n !['GET', 'HEAD'].includes(req.method.toUpperCase()) ||\n htmlPathnames.includes(url.pathname.replace(/\\/+/g, '/'))\n ) {\n next();\n return;\n }\n\n const start = Date.now();\n\n const proxyUrl = new URL(`${ctx.proxyBlog.origin}${req.originalUrl}`);\n\n const viewParam = proxyUrl.searchParams.get('view');\n proxyUrl.searchParams.set('view', `${isViteDevServer(server) ? '-DevServer' : '-PreviewServer'}${viewParam?.startsWith('-') ? viewParam : ''}`);\n\n const proxyRequest = new Request(proxyUrl, {\n method: req.method,\n headers: toWebHeaders(req.headers),\n redirect: 'manual',\n });\n\n const proxyResponse = await fetch(proxyRequest).catch((error) => {\n if (error instanceof Error) {\n _this.warn({\n message: `${error.name}: ${error.message}`,\n cause: error.cause,\n stack: error.stack,\n });\n } else {\n _this.warn('Fetch failed');\n }\n return null;\n });\n\n if (proxyResponse) {\n res.statusCode = proxyResponse.status;\n res.statusMessage = proxyResponse.statusText;\n\n proxyResponse.headers.forEach((value, key) => {\n if (key === 'location') {\n const redirectUrl = new URL(value, proxyUrl);\n if (redirectUrl.host === url.host || redirectUrl.host === proxyUrl.host) {\n redirectUrl.host = url.host;\n redirectUrl.protocol = url.protocol;\n const viewParam = redirectUrl.searchParams.get('view')?.replaceAll('-DevServer', '').replaceAll('-PreviewServer', '');\n if (viewParam) {\n redirectUrl.searchParams.set('view', viewParam);\n } else {\n redirectUrl.searchParams.delete('view');\n }\n res.setHeader('location', redirectUrl.pathname + redirectUrl.search + redirectUrl.hash);\n } else {\n res.setHeader('location', redirectUrl.href);\n }\n } else if (['content-type', 'x-robots-tag', 'date', 'location'].includes(key)) {\n res.setHeader(key, value);\n }\n });\n\n const contentType = proxyResponse.headers.get('content-type');\n\n if (contentType?.startsWith('text/html')) {\n let htmlTemplateContent = await proxyResponse.text();\n\n const secFetchDestHeader = req.headers['sec-fetch-dest'];\n const secFetchModeHeader = req.headers['sec-fetch-mode'];\n if (ctx.tailwind && isViteDevServer(server) && secFetchDestHeader === 'document' && secFetchModeHeader === 'navigate') {\n await updateTailwindCache(ctx.root, htmlTemplateContent, 'html');\n }\n\n htmlTemplateContent = replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);\n\n if (isViteDevServer(server)) {\n const template = await server.transformIndexHtml(\n req.url,\n replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join('')),\n req.originalUrl,\n );\n\n res.end(template);\n } else {\n const xmlTemplateContent = fs.readFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), 'utf8');\n\n const htmlTagsStr = getBloggerPluginHeadComment(xmlTemplateContent, true);\n\n const template = replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr ?? '');\n\n res.end(template);\n }\n } else if (contentType && /^(text\\/)|(application\\/(.*\\+)?(xml|json))/.test(contentType)) {\n const content = await proxyResponse.text();\n\n res.end(replaceHost(content, proxyUrl.host, url.host, url.protocol));\n } else {\n res.end(new Uint8Array(await proxyResponse.arrayBuffer()));\n }\n } else {\n res.statusCode = 500;\n res.statusMessage = 'Internal Server Error';\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(errorHtml(proxyUrl.href));\n }\n\n const duration = Date.now() - start;\n\n _this.info(`${req.method} ${req.originalUrl} -> ${res.statusCode} ${res.statusMessage} (${duration}ms)`);\n });\n };\n}\n\nfunction isViteDevServer(server: ViteDevServer | PreviewServer): server is ViteDevServer {\n return 'hot' in server && 'transformRequest' in server && 'transformIndexHtml' in server;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vite.cjs","names":["VITE_BUNDLER_KEY","replaceBloggerPluginHeadComment","fs","isTailwindPlugin","unescapeHTML","path","DEFAULT_MODULES","DEFAULT_TEMPLATES","getRequestUrl","toWebHeaders","updateTailwindCache","replaceHost","getBloggerPluginHeadComment","errorHtml"],"sources":["../src/vite.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { type MinifyOptions, minify } from 'minify-xml';\nimport type { MinimalPluginContextWithoutEnvironment, Plugin, PreviewServer, ResolvedConfig, UserConfig, ViteDevServer } from 'vite';\nimport { DEFAULT_MODULES, DEFAULT_TEMPLATES, VITE_BUNDLER_KEY } from './constants';\nimport { clearTailwindCache, removeTailwindCache, updateTailwindCache } from './tailwind';\nimport {\n errorHtml,\n getBloggerPluginHeadComment,\n getRequestUrl,\n isTailwindPlugin,\n replaceBloggerPluginHeadComment,\n replaceHost,\n toWebHeaders,\n unescapeHTML,\n} from './utils';\n\nexport interface XMLOptions {\n tags?: boolean;\n minify?: boolean;\n}\n\nexport interface BloggerPluginOptions {\n modules?: string[];\n styles?: string[];\n template?: string;\n proxyBlog: string;\n xml?: XMLOptions;\n}\n\nexport default function blogger(userOptions: BloggerPluginOptions): Plugin {\n const ctx = new BloggerPluginContext(userOptions);\n\n return {\n name: '@blogger-plugin/vite',\n config(config) {\n // resolve plugin context\n ctx.resolve(config);\n\n // modify vite config\n config.build ||= {};\n config.build[VITE_BUNDLER_KEY] ||= {};\n const bundlerOptions = config.build[VITE_BUNDLER_KEY];\n if (Array.isArray(bundlerOptions.input)) {\n bundlerOptions.input = [...bundlerOptions.input, ctx.input];\n } else if (typeof bundlerOptions.input === 'object' && bundlerOptions.input !== null) {\n bundlerOptions.input[ctx.input] = ctx.input;\n } else {\n bundlerOptions.input = ctx.input;\n }\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n // remove contents between comments from template\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(originalTemplateXmlContent, ''), '', true);\n\n fs.writeFileSync(ctx.template, modifiedTemplateXmlContent, 'utf-8');\n },\n configResolved(config) {\n ctx.viteConfig = config;\n ctx.tailwind = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));\n\n if (ctx.tailwind) {\n clearTailwindCache(ctx.root);\n\n if (config.command === 'build') {\n updateTailwindCache(ctx.root, unescapeHTML(fs.readFileSync(ctx.template, 'utf-8'), true), 'xml');\n }\n } else {\n removeTailwindCache(ctx.root);\n }\n },\n resolveId(source) {\n if (source === ctx.input) {\n return ctx.input;\n }\n },\n load(id) {\n if (id === ctx.input) {\n return ctx.html;\n }\n },\n buildStart() {\n if (ctx.viteConfig.command === 'build' && !/^https?:\\/\\//.test(ctx.viteConfig.base)) {\n this.warn(`\"base\" should be a CDN URL in production\n----------------------\nBlogger cannot serve static assets (JS, CSS, etc.), so you must use\nan absolute URL (http:// or https://).\n\nCurrent value:\n base: \"${ctx.viteConfig.base}\"\n\nQuick fix:\n VITE_BASE=https://cdn.jsdelivr.net/gh/<username>/<repository>@latest/dist/ npm run build\n\nVite config (recommended):\n export default defineConfig({\n base: process.env.VITE_BASE ?? \"/\"\n });\n\nWithout this, your assets may fail to load in Blogger.\n----------------------`);\n }\n },\n writeBundle(_, bundle) {\n if (!(ctx.input in bundle)) {\n return;\n }\n const asset = bundle[ctx.input];\n delete bundle[ctx.input];\n\n if (asset.type !== 'asset' || typeof asset.source !== 'string') {\n return;\n }\n const regex =\n /<!DOCTYPE html>\\s*<html[^>]*>\\s*<head>([\\s\\S]*?)<!--head-->([\\s\\S]*?)<\\/head>\\s*<body>([\\s\\S]*?)<!--body-->([\\s\\S]*?)<\\/body>\\s*<\\/html>/i;\n const match = asset.source.match(regex);\n if (!match) {\n return;\n }\n\n const afterHeadBegin = match[1];\n const beforeHeadEnd = match[2];\n const afterBodyBegin = match[3];\n const beforeBodyEnd = match[4];\n\n const headContent = (afterHeadBegin + beforeHeadEnd)\n .replace(/<[^>]+>/g, (openingTag: string) => {\n return (\n openingTag\n // boolean attributes to empty string\n .replace(/\\b(crossorigin|defer|async|disabled|checked)\\b(?!\\s*=)/g, (_, $1: string) =>\n $1 === 'crossorigin' ? 'crossorigin=\"anonymous\"' : `${$1}=\"\"`,\n )\n // convert attributes to single quotes safely\n .replace(/(\\w+)=(\".*?\"|'.*?')/g, (_, $1: string, $2: string) => {\n const v = $2\n // remove quotes\n .slice(1, -1)\n // escape special XML chars\n .replace(/&/g, '&')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n return `${$1}='${v}'`;\n })\n );\n })\n // self-close void tags\n .replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1: string, $2: string) => `<${$1}${$2}/>`)\n // remove whitespace between tags\n .replace(/>\\s+</g, '><')\n // trim overall\n .trim();\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(originalTemplateXmlContent, headContent, true);\n\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), modifiedTemplateXmlContent);\n\n if (ctx.xml.tags) {\n const templateTagsXmlContent = `<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE html>\n<html>\n<head>\n <!--head:afterbegin:begin-->\n\n <!--head:afterbegin:end-->\n\n <!--head:beforeend:begin-->\n ${headContent}\n <!--head:beforeend:end-->\n</head>\n<body>\n <!--body:afterbegin:begin-->\n ${afterBodyBegin.trim()}\n <!--body:afterbegin:end-->\n\n <!--body:beforeend:begin-->\n ${beforeBodyEnd.trim()}\n <!--body:beforeend:end-->\n</body>\n</html>`;\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.tags.xml'), templateTagsXmlContent);\n }\n\n if (ctx.xml.minify) {\n const minifiedTemplateXmlContent = minify(modifiedTemplateXmlContent, {\n removeComments: false,\n shortenNamespaces: false,\n removeUnusedNamespaces: false,\n removeUnusedDefaultNamespace: false,\n ignoreCData: true,\n } as MinifyOptions);\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.min.xml'), minifiedTemplateXmlContent);\n }\n },\n closeBundle() {\n const htmlDir = path.resolve(ctx.viteConfig.build.outDir, 'virtual:blogger-plugin');\n if (fs.existsSync(htmlDir)) {\n fs.rmSync(htmlDir, { recursive: true });\n }\n },\n configureServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n configurePreviewServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n };\n}\n\nclass BloggerPluginContext {\n private options: BloggerPluginOptions;\n root: string;\n modules: string[];\n styles: string[];\n template: string;\n name: string;\n proxyBlog: URL;\n xml: Required<XMLOptions>;\n viteConfig: ResolvedConfig;\n tailwind: boolean;\n input: string;\n html: string;\n headTags: string[];\n\n constructor(options: BloggerPluginOptions) {\n if (typeof options.template !== 'undefined' && typeof options.template !== 'string') {\n throw new Error(\"Option 'template' must be a string\");\n }\n if (typeof options.modules !== 'undefined' && !Array.isArray(options.modules)) {\n throw new Error(\"Option 'modules' must be an array\");\n }\n if (typeof options.styles !== 'undefined' && !Array.isArray(options.styles)) {\n throw new Error(\"Option 'styles' must be an array\");\n }\n if (typeof options.proxyBlog !== 'string') {\n throw new Error(\"Option 'proxyBlog' must be a string\");\n }\n let proxyBlog: URL;\n try {\n proxyBlog = new URL(options.proxyBlog);\n } catch {\n throw new Error(\"Option 'proxyBlog' must be a valid url\");\n }\n\n this.options = options;\n this.root = process.cwd();\n this.modules = [];\n this.styles = [];\n this.template = undefined as unknown as string;\n this.name = undefined as unknown as string;\n this.proxyBlog = proxyBlog;\n this.xml = {\n tags: options.xml?.tags ?? false,\n minify: options.xml?.minify ?? false,\n };\n this.viteConfig = undefined as unknown as ResolvedConfig;\n this.tailwind = false;\n this.input = undefined as unknown as string;\n this.headTags = [];\n this.html = undefined as unknown as string;\n }\n\n resolve(config: UserConfig) {\n this.root = config.root ? path.resolve(config.root) : this.root;\n\n if (this.options.modules) {\n for (let i = 0; i < this.options.modules.length; i++) {\n const module = this.options.modules[i];\n const modulePath = path.resolve(this.root, module);\n if (this.modules.includes(modulePath)) {\n continue;\n }\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n } else {\n throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);\n }\n }\n } else {\n for (const module of DEFAULT_MODULES) {\n const modulePath = path.resolve(this.root, module);\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n break;\n }\n }\n }\n\n if (this.options.styles) {\n for (let i = 0; i < this.options.styles.length; i++) {\n const style = this.options.styles[i];\n const stylePath = path.resolve(this.root, style);\n if (this.styles.includes(stylePath)) {\n continue;\n }\n if (fs.existsSync(stylePath)) {\n this.styles.push(stylePath);\n } else {\n throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);\n }\n }\n }\n\n if (this.options.template) {\n const templatePath = path.resolve(this.root, this.options.template);\n if (fs.existsSync(templatePath)) {\n this.template = templatePath;\n } else {\n throw new Error(`Provided template file does not exist: ${templatePath}`);\n }\n } else {\n for (const file of DEFAULT_TEMPLATES) {\n const fullPath = path.resolve(this.root, file);\n if (fs.existsSync(fullPath)) {\n this.template = fullPath;\n break;\n }\n }\n\n if (!this.template) {\n throw new Error(\n 'No template file found.\\n' +\n `Tried: ${DEFAULT_TEMPLATES.join(', ')}\\n` +\n '👉 Tip: You can pass a custom template as shown:\\n' +\n ' blogger({ template: \"src/my-template.xml\" })',\n );\n }\n }\n\n this.name = path.basename(this.template, path.extname(this.template));\n\n for (const modulePath of this.modules) {\n this.headTags.push(`<script type=\"module\" src=\"/${path.relative(this.root, modulePath).replaceAll('\\\\', '/')}\"></script>`);\n }\n for (const stylePath of this.styles) {\n this.headTags.push(`<link rel=\"stylesheet\" href=\"/${path.relative(this.root, stylePath).replaceAll('\\\\', '/')}\">`);\n }\n\n this.input = `virtual:blogger-plugin/${this.name}.html`;\n this.html = `<!DOCTYPE html>\n<html>\n<head>\n <!--head-->${this.headTags.length > 0 ? `\\n ${this.headTags.join('\\n ')}` : ''}\n</head>\n<body>\n <!--body-->\n</body>\n</html>`;\n }\n}\n\nfunction useServerMiddleware(server: ViteDevServer | PreviewServer, ctx: BloggerPluginContext, _this: MinimalPluginContextWithoutEnvironment) {\n const input = ctx.viteConfig.build[VITE_BUNDLER_KEY].input;\n const htmlPathnames: string[] = [];\n for (const entry of Array.isArray(input) ? input : typeof input === 'object' ? Object.values(input) : typeof input === 'string' ? [input] : []) {\n if (entry === ctx.input) {\n continue;\n }\n const entryPath = path.resolve(ctx.root, entry);\n if (!entryPath.endsWith('.html')) {\n continue;\n }\n const relativePath = path.relative(ctx.root, entry).replaceAll('\\\\', '/');\n htmlPathnames.push(`/${relativePath}`);\n if (relativePath.endsWith('index.html')) {\n htmlPathnames.push(`/${relativePath.replace(/index\\.html$/, '')}`);\n }\n }\n\n return () => {\n server.httpServer?.once('listening', () => {\n setTimeout(() => {\n _this.info(`Unhandled requests will be proxied to ${ctx.proxyBlog.origin}`);\n }, 0);\n });\n\n server.middlewares.use(async (req, res, next) => {\n const url = getRequestUrl(req);\n\n if (\n !req.url ||\n !req.originalUrl ||\n !url ||\n !req.method ||\n !['GET', 'HEAD'].includes(req.method.toUpperCase()) ||\n htmlPathnames.includes(url.pathname.replace(/\\/+/g, '/')) ||\n url.pathname.startsWith('/@')\n ) {\n next();\n return;\n }\n\n const start = Date.now();\n\n const proxyUrl = new URL(`${ctx.proxyBlog.origin}${req.originalUrl}`);\n\n const viewParam = proxyUrl.searchParams.get('view');\n proxyUrl.searchParams.set('view', `${isViteDevServer(server) ? '-DevServer' : '-PreviewServer'}${viewParam?.startsWith('-') ? viewParam : ''}`);\n\n const proxyRequest = new Request(proxyUrl, {\n method: req.method,\n headers: toWebHeaders(req.headers),\n redirect: 'manual',\n });\n\n const proxyResponse = await fetch(proxyRequest).catch((error) => {\n if (error instanceof Error) {\n _this.warn({\n message: `${error.name}: ${error.message}`,\n cause: error.cause,\n stack: error.stack,\n });\n } else {\n _this.warn('Fetch failed');\n }\n return null;\n });\n\n if (proxyResponse) {\n res.statusCode = proxyResponse.status;\n res.statusMessage = proxyResponse.statusText;\n\n proxyResponse.headers.forEach((value, key) => {\n if (key === 'location') {\n const redirectUrl = new URL(value, proxyUrl);\n if (redirectUrl.host === url.host || redirectUrl.host === proxyUrl.host) {\n redirectUrl.host = url.host;\n redirectUrl.protocol = url.protocol;\n const viewParam = redirectUrl.searchParams.get('view')?.replaceAll('-DevServer', '').replaceAll('-PreviewServer', '');\n if (viewParam) {\n redirectUrl.searchParams.set('view', viewParam);\n } else {\n redirectUrl.searchParams.delete('view');\n }\n res.setHeader('location', redirectUrl.pathname + redirectUrl.search + redirectUrl.hash);\n } else {\n res.setHeader('location', redirectUrl.href);\n }\n } else if (['content-type', 'x-robots-tag', 'date', 'location'].includes(key)) {\n res.setHeader(key, value);\n }\n });\n\n const contentType = proxyResponse.headers.get('content-type');\n\n if (contentType?.startsWith('text/html')) {\n let htmlTemplateContent = await proxyResponse.text();\n\n const secFetchDestHeader = req.headers['sec-fetch-dest'];\n const secFetchModeHeader = req.headers['sec-fetch-mode'];\n if (ctx.tailwind && isViteDevServer(server) && secFetchDestHeader === 'document' && secFetchModeHeader === 'navigate') {\n await updateTailwindCache(ctx.root, htmlTemplateContent, 'html');\n }\n\n htmlTemplateContent = replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);\n\n if (isViteDevServer(server)) {\n const template = await server.transformIndexHtml(\n req.url,\n replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join('')),\n req.originalUrl,\n );\n\n res.end(template);\n } else {\n const xmlTemplateContent = fs.readFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), 'utf8');\n\n const htmlTagsStr = getBloggerPluginHeadComment(xmlTemplateContent, true);\n\n const template = replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr ?? '');\n\n res.end(template);\n }\n } else if (contentType && /^(text\\/)|(application\\/(.*\\+)?(xml|json))/.test(contentType)) {\n const content = await proxyResponse.text();\n\n res.end(replaceHost(content, proxyUrl.host, url.host, url.protocol));\n } else {\n res.end(new Uint8Array(await proxyResponse.arrayBuffer()));\n }\n } else {\n res.statusCode = 500;\n res.statusMessage = 'Internal Server Error';\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(errorHtml(proxyUrl.href));\n }\n\n const duration = Date.now() - start;\n\n _this.info(`${req.method} ${req.originalUrl} -> ${res.statusCode} ${res.statusMessage} (${duration}ms)`);\n });\n };\n}\n\nfunction isViteDevServer(server: ViteDevServer | PreviewServer): server is ViteDevServer {\n return 'hot' in server && 'transformRequest' in server && 'transformIndexHtml' in server;\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAwB,QAAQ,aAA2C;CACzE,MAAM,MAAM,IAAI,qBAAqB,YAAY;CAEjD,OAAO;EACL,MAAM;EACN,OAAO,QAAQ;;GAEb,IAAI,QAAQ,OAAO;GAGnB,OAAO,UAAP,OAAO,QAAU,EAAE;GACnB,CAAA,gBAAA,OAAO,OAAMA,kBAAAA,sBAAAA,cAAAA,kBAAAA,oBAAsB,EAAE;GACrC,MAAM,iBAAiB,OAAO,MAAMA,kBAAAA;GACpC,IAAI,MAAM,QAAQ,eAAe,MAAM,EACrC,eAAe,QAAQ,CAAC,GAAG,eAAe,OAAO,IAAI,MAAM;QACtD,IAAI,OAAO,eAAe,UAAU,YAAY,eAAe,UAAU,MAC9E,eAAe,MAAM,IAAI,SAAS,IAAI;QAEtC,eAAe,QAAQ,IAAI;GAK7B,MAAM,6BAA6BC,cAAAA,gCAAgCA,cAAAA,gCAFhCC,QAAG,aAAa,IAAI,UAAU,OAE4D,EAAE,GAAG,EAAE,IAAI,KAAK;GAE7I,QAAG,cAAc,IAAI,UAAU,4BAA4B,QAAQ;;EAErE,eAAe,QAAQ;GACrB,IAAI,aAAa;GACjB,IAAI,WAAW,OAAO,QAAQ,KAAK,OAAO,kBAAkB,CAAC,MAAM,WAAWC,cAAAA,iBAAiB,OAAO,CAAC;GAEvG,IAAI,IAAI,UAAU;IAChB,iBAAA,mBAAmB,IAAI,KAAK;IAE5B,IAAI,OAAO,YAAY,SACrB,iBAAA,oBAAoB,IAAI,MAAMC,cAAAA,aAAaF,QAAG,aAAa,IAAI,UAAU,QAAQ,EAAE,KAAK,EAAE,MAAM;UAGlG,iBAAA,oBAAoB,IAAI,KAAK;;EAGjC,UAAU,QAAQ;GAChB,IAAI,WAAW,IAAI,OACjB,OAAO,IAAI;;EAGf,KAAK,IAAI;GACP,IAAI,OAAO,IAAI,OACb,OAAO,IAAI;;EAGf,aAAa;GACX,IAAI,IAAI,WAAW,YAAY,WAAW,CAAC,eAAe,KAAK,IAAI,WAAW,KAAK,EACjF,KAAK,KAAK;;;;;;WAMP,IAAI,WAAW,KAAK;;;;;;;;;;;wBAWP;;EAGpB,YAAY,GAAG,QAAQ;GACrB,IAAI,EAAE,IAAI,SAAS,SACjB;GAEF,MAAM,QAAQ,OAAO,IAAI;GACzB,OAAO,OAAO,IAAI;GAElB,IAAI,MAAM,SAAS,WAAW,OAAO,MAAM,WAAW,UACpD;GAIF,MAAM,QAAQ,MAAM,OAAO,MAAM,4IAAM;GACvC,IAAI,CAAC,OACH;GAGF,MAAM,iBAAiB,MAAM;GAC7B,MAAM,gBAAgB,MAAM;GAC5B,MAAM,iBAAiB,MAAM;GAC7B,MAAM,gBAAgB,MAAM;GAE5B,MAAM,eAAe,iBAAiB,eACnC,QAAQ,aAAa,eAAuB;IAC3C,OACE,WAEG,QAAQ,4DAA4D,GAAG,OACtE,OAAO,gBAAgB,8BAA4B,GAAG,GAAG,KAC1D,CAEA,QAAQ,yBAAyB,GAAG,IAAY,OAAe;KAU9D,OAAO,GAAG,GAAG,IATH,GAEP,MAAM,GAAG,GAAG,CAEZ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OACC,CAAC;MACnB;KAEN,CAED,QAAQ,4CAA4C,GAAG,IAAY,OAAe,IAAI,KAAK,GAAG,IAAI,CAElG,QAAQ,UAAU,KAAK,CAEvB,MAAM;GAGT,MAAM,6BAA6BD,cAAAA,gCADAC,QAAG,aAAa,IAAI,UAAU,OAC4B,EAAE,aAAa,KAAK;GAEjH,QAAG,cAAcG,UAAK,QAAQ,IAAI,WAAW,MAAM,QAAQ,eAAe,EAAE,2BAA2B;GAEvG,IAAI,IAAI,IAAI,MAAM;IAChB,MAAM,yBAAyB;;;;;;;;;IASnC,YAAY;;;;;IAKZ,eAAe,MAAM,CAAC;;;;IAItB,cAAc,MAAM,CAAC;;;;IAIjB,QAAG,cAAcA,UAAK,QAAQ,IAAI,WAAW,MAAM,QAAQ,oBAAoB,EAAE,uBAAuB;;GAG1G,IAAI,IAAI,IAAI,QAAQ;IAClB,MAAM,8BAAA,GAAA,WAAA,QAAoC,4BAA4B;KACpE,gBAAgB;KAChB,mBAAmB;KACnB,wBAAwB;KACxB,8BAA8B;KAC9B,aAAa;KACd,CAAkB;IACnB,QAAG,cAAcA,UAAK,QAAQ,IAAI,WAAW,MAAM,QAAQ,mBAAmB,EAAE,2BAA2B;;;EAG/G,cAAc;GACZ,MAAM,UAAUA,UAAK,QAAQ,IAAI,WAAW,MAAM,QAAQ,yBAAyB;GACnF,IAAIH,QAAG,WAAW,QAAQ,EACxB,QAAG,OAAO,SAAS,EAAE,WAAW,MAAM,CAAC;;EAG3C,gBAAgB,QAAQ;GACtB,OAAO,oBAAoB,QAAQ,KAAK,KAAK;;EAE/C,uBAAuB,QAAQ;GAC7B,OAAO,oBAAoB,QAAQ,KAAK,KAAK;;EAEhD;;AAGH,IAAM,uBAAN,MAA2B;CAezB,YAAY,SAA+B;;EACzC,IAAI,OAAO,QAAQ,aAAa,eAAe,OAAO,QAAQ,aAAa,UACzE,MAAM,IAAI,MAAM,qCAAqC;EAEvD,IAAI,OAAO,QAAQ,YAAY,eAAe,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EAC3E,MAAM,IAAI,MAAM,oCAAoC;EAEtD,IAAI,OAAO,QAAQ,WAAW,eAAe,CAAC,MAAM,QAAQ,QAAQ,OAAO,EACzE,MAAM,IAAI,MAAM,mCAAmC;EAErD,IAAI,OAAO,QAAQ,cAAc,UAC/B,MAAM,IAAI,MAAM,sCAAsC;EAExD,IAAI;EACJ,IAAI;GACF,YAAY,IAAI,IAAI,QAAQ,UAAU;oBAChC;GACN,MAAM,IAAI,MAAM,yCAAyC;;EAG3D,KAAK,UAAU;EACf,KAAK,OAAO,QAAQ,KAAK;EACzB,KAAK,UAAU,EAAE;EACjB,KAAK,SAAS,EAAE;EAChB,KAAK,WAAW,KAAA;EAChB,KAAK,OAAO,KAAA;EACZ,KAAK,YAAY;EACjB,KAAK,MAAM;GACT,OAAA,qBAAA,eAAM,QAAQ,SAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAK,UAAA,QAAA,sBAAA,KAAA,IAAA,oBAAQ;GAC3B,SAAA,uBAAA,gBAAQ,QAAQ,SAAA,QAAA,kBAAA,KAAA,IAAA,KAAA,IAAA,cAAK,YAAA,QAAA,wBAAA,KAAA,IAAA,sBAAU;GAChC;EACD,KAAK,aAAa,KAAA;EAClB,KAAK,WAAW;EAChB,KAAK,QAAQ,KAAA;EACb,KAAK,WAAW,EAAE;EAClB,KAAK,OAAO,KAAA;;CAGd,QAAQ,QAAoB;EAC1B,KAAK,OAAO,OAAO,OAAOG,UAAK,QAAQ,OAAO,KAAK,GAAG,KAAK;EAE3D,IAAI,KAAK,QAAQ,SACf,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,QAAQ,KAAK;GACpD,MAAM,SAAS,KAAK,QAAQ,QAAQ;GACpC,MAAM,aAAaA,UAAK,QAAQ,KAAK,MAAM,OAAO;GAClD,IAAI,KAAK,QAAQ,SAAS,WAAW,EACnC;GAEF,IAAIH,QAAG,WAAW,WAAW,EAC3B,KAAK,QAAQ,KAAK,WAAW;QAE7B,MAAM,IAAI,MAAM,gCAAgC,EAAE,oBAAoB,aAAa;;OAIvF,KAAK,MAAM,UAAUI,kBAAAA,iBAAiB;GACpC,MAAM,aAAaD,UAAK,QAAQ,KAAK,MAAM,OAAO;GAClD,IAAIH,QAAG,WAAW,WAAW,EAAE;IAC7B,KAAK,QAAQ,KAAK,WAAW;IAC7B;;;EAKN,IAAI,KAAK,QAAQ,QACf,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;GACnD,MAAM,QAAQ,KAAK,QAAQ,OAAO;GAClC,MAAM,YAAYG,UAAK,QAAQ,KAAK,MAAM,MAAM;GAChD,IAAI,KAAK,OAAO,SAAS,UAAU,EACjC;GAEF,IAAIH,QAAG,WAAW,UAAU,EAC1B,KAAK,OAAO,KAAK,UAAU;QAE3B,MAAM,IAAI,MAAM,+BAA+B,EAAE,oBAAoB,YAAY;;EAKvF,IAAI,KAAK,QAAQ,UAAU;GACzB,MAAM,eAAeG,UAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ,SAAS;GACnE,IAAIH,QAAG,WAAW,aAAa,EAC7B,KAAK,WAAW;QAEhB,MAAM,IAAI,MAAM,0CAA0C,eAAe;SAEtE;GACL,KAAK,MAAM,QAAQK,kBAAAA,mBAAmB;IACpC,MAAM,WAAWF,UAAK,QAAQ,KAAK,MAAM,KAAK;IAC9C,IAAIH,QAAG,WAAW,SAAS,EAAE;KAC3B,KAAK,WAAW;KAChB;;;GAIJ,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MACR;SACYK,kBAAAA,kBAAkB,KAAK,KAAK,CAAC;iDAG1C;;EAIL,KAAK,OAAOF,UAAK,SAAS,KAAK,UAAUA,UAAK,QAAQ,KAAK,SAAS,CAAC;EAErE,KAAK,MAAM,cAAc,KAAK,SAC5B,KAAK,SAAS,KAAK,+BAA+BA,UAAK,SAAS,KAAK,MAAM,WAAW,CAAC,WAAW,MAAM,IAAI,CAAC,cAAa;EAE5H,KAAK,MAAM,aAAa,KAAK,QAC3B,KAAK,SAAS,KAAK,iCAAiCA,UAAK,SAAS,KAAK,MAAM,UAAU,CAAC,WAAW,MAAM,IAAI,CAAC,IAAI;EAGpH,KAAK,QAAQ,0BAA0B,KAAK,KAAK;EACjD,KAAK,OAAO;;;eAGD,KAAK,SAAS,SAAS,IAAI,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,GAAG;;;;;;;;AASnF,SAAS,oBAAoB,QAAuC,KAA2B,OAA+C;CAC5I,MAAM,QAAQ,IAAI,WAAW,MAAML,kBAAAA,kBAAkB;CACrD,MAAM,gBAA0B,EAAE;CAClC,KAAK,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,QAAQ,OAAO,UAAU,WAAW,OAAO,OAAO,MAAM,GAAG,OAAO,UAAU,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;EAC9I,IAAI,UAAU,IAAI,OAChB;EAGF,IAAI,CADcK,UAAK,QAAQ,IAAI,MAAM,MAC3B,CAAC,SAAS,QAAQ,EAC9B;EAEF,MAAM,eAAeA,UAAK,SAAS,IAAI,MAAM,MAAM,CAAC,WAAW,MAAM,IAAI;EACzE,cAAc,KAAK,IAAI,eAAe;EACtC,IAAI,aAAa,SAAS,aAAa,EACrC,cAAc,KAAK,IAAI,aAAa,QAAQ,gBAAgB,GAAG,GAAG;;CAItE,aAAa;;EACX,CAAA,qBAAA,OAAO,gBAAA,QAAA,uBAAA,KAAA,KAAA,mBAAY,KAAK,mBAAmB;GACzC,iBAAiB;IACf,MAAM,KAAK,yCAAyC,IAAI,UAAU,SAAS;MAC1E,EAAE;IACL;EAEF,OAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;GAC/C,MAAM,MAAMG,cAAAA,cAAc,IAAI;GAE9B,IACE,CAAC,IAAI,OACL,CAAC,IAAI,eACL,CAAC,OACD,CAAC,IAAI,UACL,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,IAAI,OAAO,aAAa,CAAC,IACnD,cAAc,SAAS,IAAI,SAAS,QAAQ,QAAQ,IAAI,CAAC,IACzD,IAAI,SAAS,WAAW,KAAK,EAC7B;IACA,MAAM;IACN;;GAGF,MAAM,QAAQ,KAAK,KAAK;GAExB,MAAM,WAAW,IAAI,IAAI,GAAG,IAAI,UAAU,SAAS,IAAI,cAAc;GAErE,MAAM,YAAY,SAAS,aAAa,IAAI,OAAO;GACnD,SAAS,aAAa,IAAI,QAAQ,GAAG,gBAAgB,OAAO,GAAG,eAAe,oBAAA,cAAA,QAAA,cAAA,KAAA,IAAA,KAAA,IAAmB,UAAW,WAAW,IAAI,IAAG,YAAY,KAAK;GAE/I,MAAM,eAAe,IAAI,QAAQ,UAAU;IACzC,QAAQ,IAAI;IACZ,SAASC,cAAAA,aAAa,IAAI,QAAQ;IAClC,UAAU;IACX,CAAC;GAEF,MAAM,gBAAgB,MAAM,MAAM,aAAa,CAAC,OAAO,UAAU;IAC/D,IAAI,iBAAiB,OACnB,MAAM,KAAK;KACT,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM;KACjC,OAAO,MAAM;KACb,OAAO,MAAM;KACd,CAAC;SAEF,MAAM,KAAK,eAAe;IAE5B,OAAO;KACP;GAEF,IAAI,eAAe;IACjB,IAAI,aAAa,cAAc;IAC/B,IAAI,gBAAgB,cAAc;IAElC,cAAc,QAAQ,SAAS,OAAO,QAAQ;KAC5C,IAAI,QAAQ,YAAY;MACtB,MAAM,cAAc,IAAI,IAAI,OAAO,SAAS;MAC5C,IAAI,YAAY,SAAS,IAAI,QAAQ,YAAY,SAAS,SAAS,MAAM;;OACvE,YAAY,OAAO,IAAI;OACvB,YAAY,WAAW,IAAI;OAC3B,MAAM,aAAA,wBAAY,YAAY,aAAa,IAAI,OAAO,MAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAE,WAAW,cAAc,GAAG,CAAC,WAAW,kBAAkB,GAAG;OACrH,IAAI,WACF,YAAY,aAAa,IAAI,QAAQ,UAAU;YAE/C,YAAY,aAAa,OAAO,OAAO;OAEzC,IAAI,UAAU,YAAY,YAAY,WAAW,YAAY,SAAS,YAAY,KAAK;aAEvF,IAAI,UAAU,YAAY,YAAY,KAAK;YAExC,IAAI;MAAC;MAAgB;MAAgB;MAAQ;MAAW,CAAC,SAAS,IAAI,EAC3E,IAAI,UAAU,KAAK,MAAM;MAE3B;IAEF,MAAM,cAAc,cAAc,QAAQ,IAAI,eAAe;IAE7D,IAAA,gBAAA,QAAA,gBAAA,KAAA,IAAA,KAAA,IAAI,YAAa,WAAW,YAAY,EAAE;KACxC,IAAI,sBAAsB,MAAM,cAAc,MAAM;KAEpD,MAAM,qBAAqB,IAAI,QAAQ;KACvC,MAAM,qBAAqB,IAAI,QAAQ;KACvC,IAAI,IAAI,YAAY,gBAAgB,OAAO,IAAI,uBAAuB,cAAc,uBAAuB,YACzG,MAAMC,iBAAAA,oBAAoB,IAAI,MAAM,qBAAqB,OAAO;KAGlE,sBAAsBC,cAAAA,YAAY,qBAAqB,SAAS,MAAM,IAAI,MAAM,IAAI,SAAS;KAE7F,IAAI,gBAAgB,OAAO,EAAE;MAC3B,MAAM,WAAW,MAAM,OAAO,mBAC5B,IAAI,KACJV,cAAAA,gCAAgC,qBAAqB,IAAI,SAAS,KAAK,GAAG,CAAC,EAC3E,IAAI,YACL;MAED,IAAI,IAAI,SAAS;YACZ;MAGL,MAAM,cAAcW,cAAAA,4BAFOV,QAAG,aAAaG,UAAK,QAAQ,IAAI,WAAW,MAAM,QAAQ,eAAe,EAAE,OAEpC,EAAE,KAAK;MAEzE,MAAM,WAAWJ,cAAAA,gCAAgC,qBAAqB,gBAAA,QAAA,gBAAA,KAAA,IAAA,cAAe,GAAG;MAExF,IAAI,IAAI,SAAS;;WAEd,IAAI,eAAe,6CAA6C,KAAK,YAAY,EAAE;KACxF,MAAM,UAAU,MAAM,cAAc,MAAM;KAE1C,IAAI,IAAIU,cAAAA,YAAY,SAAS,SAAS,MAAM,IAAI,MAAM,IAAI,SAAS,CAAC;WAEpE,IAAI,IAAI,IAAI,WAAW,MAAM,cAAc,aAAa,CAAC,CAAC;UAEvD;IACL,IAAI,aAAa;IACjB,IAAI,gBAAgB;IAEpB,IAAI,UAAU,gBAAgB,YAAY;IAE1C,IAAI,IAAIE,cAAAA,UAAU,SAAS,KAAK,CAAC;;GAGnC,MAAM,WAAW,KAAK,KAAK,GAAG;GAE9B,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,IAAI,YAAY,MAAM,IAAI,WAAW,GAAG,IAAI,cAAc,IAAI,SAAS,KAAK;IACxG;;;AAIN,SAAS,gBAAgB,QAAgE;CACvF,OAAO,SAAS,UAAU,sBAAsB,UAAU,wBAAwB"}
|
package/dist/vite.mjs
CHANGED
|
@@ -224,7 +224,7 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
224
224
|
});
|
|
225
225
|
server.middlewares.use(async (req, res, next) => {
|
|
226
226
|
const url = getRequestUrl(req);
|
|
227
|
-
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/"))) {
|
|
227
|
+
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/")) || url.pathname.startsWith("/@")) {
|
|
228
228
|
next();
|
|
229
229
|
return;
|
|
230
230
|
}
|
package/dist/vite.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.mjs","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { type MinifyOptions, minify } from 'minify-xml';\nimport type { MinimalPluginContextWithoutEnvironment, Plugin, PreviewServer, ResolvedConfig, UserConfig, ViteDevServer } from 'vite';\nimport { DEFAULT_MODULES, DEFAULT_TEMPLATES, VITE_BUNDLER_KEY } from './constants';\nimport { clearTailwindCache, removeTailwindCache, updateTailwindCache } from './tailwind';\nimport {\n errorHtml,\n getBloggerPluginHeadComment,\n getRequestUrl,\n isTailwindPlugin,\n replaceBloggerPluginHeadComment,\n replaceHost,\n toWebHeaders,\n unescapeHTML,\n} from './utils';\n\nexport interface XMLOptions {\n tags?: boolean;\n minify?: boolean;\n}\n\nexport interface BloggerPluginOptions {\n modules?: string[];\n styles?: string[];\n template?: string;\n proxyBlog: string;\n xml?: XMLOptions;\n}\n\nexport default function blogger(userOptions: BloggerPluginOptions): Plugin {\n const ctx = new BloggerPluginContext(userOptions);\n\n return {\n name: '@blogger-plugin/vite',\n config(config) {\n // resolve plugin context\n ctx.resolve(config);\n\n // modify vite config\n config.build ||= {};\n config.build[VITE_BUNDLER_KEY] ||= {};\n const bundlerOptions = config.build[VITE_BUNDLER_KEY];\n if (Array.isArray(bundlerOptions.input)) {\n bundlerOptions.input = [...bundlerOptions.input, ctx.input];\n } else if (typeof bundlerOptions.input === 'object' && bundlerOptions.input !== null) {\n bundlerOptions.input[ctx.input] = ctx.input;\n } else {\n bundlerOptions.input = ctx.input;\n }\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n // remove contents between comments from template\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(originalTemplateXmlContent, ''), '', true);\n\n fs.writeFileSync(ctx.template, modifiedTemplateXmlContent, 'utf-8');\n },\n configResolved(config) {\n ctx.viteConfig = config;\n ctx.tailwind = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));\n\n if (ctx.tailwind) {\n clearTailwindCache(ctx.root);\n\n if (config.command === 'build') {\n updateTailwindCache(ctx.root, unescapeHTML(fs.readFileSync(ctx.template, 'utf-8'), true), 'xml');\n }\n } else {\n removeTailwindCache(ctx.root);\n }\n },\n resolveId(source) {\n if (source === ctx.input) {\n return ctx.input;\n }\n },\n load(id) {\n if (id === ctx.input) {\n return ctx.html;\n }\n },\n buildStart() {\n if (ctx.viteConfig.command === 'build' && !/^https?:\\/\\//.test(ctx.viteConfig.base)) {\n this.warn(`\"base\" should be a CDN URL in production\n----------------------\nBlogger cannot serve static assets (JS, CSS, etc.), so you must use\nan absolute URL (http:// or https://).\n\nCurrent value:\n base: \"${ctx.viteConfig.base}\"\n\nQuick fix:\n VITE_BASE=https://cdn.jsdelivr.net/gh/<username>/<repository>@latest/dist/ npm run build\n\nVite config (recommended):\n export default defineConfig({\n base: process.env.VITE_BASE ?? \"/\"\n });\n\nWithout this, your assets may fail to load in Blogger.\n----------------------`);\n }\n },\n writeBundle(_, bundle) {\n if (!(ctx.input in bundle)) {\n return;\n }\n const asset = bundle[ctx.input];\n delete bundle[ctx.input];\n\n if (asset.type !== 'asset' || typeof asset.source !== 'string') {\n return;\n }\n const regex =\n /<!DOCTYPE html>\\s*<html[^>]*>\\s*<head>([\\s\\S]*?)<!--head-->([\\s\\S]*?)<\\/head>\\s*<body>([\\s\\S]*?)<!--body-->([\\s\\S]*?)<\\/body>\\s*<\\/html>/i;\n const match = asset.source.match(regex);\n if (!match) {\n return;\n }\n\n const afterHeadBegin = match[1];\n const beforeHeadEnd = match[2];\n const afterBodyBegin = match[3];\n const beforeBodyEnd = match[4];\n\n const headContent = (afterHeadBegin + beforeHeadEnd)\n .replace(/<[^>]+>/g, (openingTag: string) => {\n return (\n openingTag\n // boolean attributes to empty string\n .replace(/\\b(crossorigin|defer|async|disabled|checked)\\b(?!\\s*=)/g, (_, $1: string) =>\n $1 === 'crossorigin' ? 'crossorigin=\"anonymous\"' : `${$1}=\"\"`,\n )\n // convert attributes to single quotes safely\n .replace(/(\\w+)=(\".*?\"|'.*?')/g, (_, $1: string, $2: string) => {\n const v = $2\n // remove quotes\n .slice(1, -1)\n // escape special XML chars\n .replace(/&/g, '&')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n return `${$1}='${v}'`;\n })\n );\n })\n // self-close void tags\n .replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1: string, $2: string) => `<${$1}${$2}/>`)\n // remove whitespace between tags\n .replace(/>\\s+</g, '><')\n // trim overall\n .trim();\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(originalTemplateXmlContent, headContent, true);\n\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), modifiedTemplateXmlContent);\n\n if (ctx.xml.tags) {\n const templateTagsXmlContent = `<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE html>\n<html>\n<head>\n <!--head:afterbegin:begin-->\n\n <!--head:afterbegin:end-->\n\n <!--head:beforeend:begin-->\n ${headContent}\n <!--head:beforeend:end-->\n</head>\n<body>\n <!--body:afterbegin:begin-->\n ${afterBodyBegin.trim()}\n <!--body:afterbegin:end-->\n\n <!--body:beforeend:begin-->\n ${beforeBodyEnd.trim()}\n <!--body:beforeend:end-->\n</body>\n</html>`;\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.tags.xml'), templateTagsXmlContent);\n }\n\n if (ctx.xml.minify) {\n const minifiedTemplateXmlContent = minify(modifiedTemplateXmlContent, {\n removeComments: false,\n shortenNamespaces: false,\n removeUnusedNamespaces: false,\n removeUnusedDefaultNamespace: false,\n ignoreCData: true,\n } as MinifyOptions);\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.min.xml'), minifiedTemplateXmlContent);\n }\n },\n closeBundle() {\n const htmlDir = path.resolve(ctx.viteConfig.build.outDir, 'virtual:blogger-plugin');\n if (fs.existsSync(htmlDir)) {\n fs.rmSync(htmlDir, { recursive: true });\n }\n },\n configureServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n configurePreviewServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n };\n}\n\nclass BloggerPluginContext {\n private options: BloggerPluginOptions;\n root: string;\n modules: string[];\n styles: string[];\n template: string;\n name: string;\n proxyBlog: URL;\n xml: Required<XMLOptions>;\n viteConfig: ResolvedConfig;\n tailwind: boolean;\n input: string;\n html: string;\n headTags: string[];\n\n constructor(options: BloggerPluginOptions) {\n if (typeof options.template !== 'undefined' && typeof options.template !== 'string') {\n throw new Error(\"Option 'template' must be a string\");\n }\n if (typeof options.modules !== 'undefined' && !Array.isArray(options.modules)) {\n throw new Error(\"Option 'modules' must be an array\");\n }\n if (typeof options.styles !== 'undefined' && !Array.isArray(options.styles)) {\n throw new Error(\"Option 'styles' must be an array\");\n }\n if (typeof options.proxyBlog !== 'string') {\n throw new Error(\"Option 'proxyBlog' must be a string\");\n }\n let proxyBlog: URL;\n try {\n proxyBlog = new URL(options.proxyBlog);\n } catch {\n throw new Error(\"Option 'proxyBlog' must be a valid url\");\n }\n\n this.options = options;\n this.root = process.cwd();\n this.modules = [];\n this.styles = [];\n this.template = undefined as unknown as string;\n this.name = undefined as unknown as string;\n this.proxyBlog = proxyBlog;\n this.xml = {\n tags: options.xml?.tags ?? false,\n minify: options.xml?.minify ?? false,\n };\n this.viteConfig = undefined as unknown as ResolvedConfig;\n this.tailwind = false;\n this.input = undefined as unknown as string;\n this.headTags = [];\n this.html = undefined as unknown as string;\n }\n\n resolve(config: UserConfig) {\n this.root = config.root ? path.resolve(config.root) : this.root;\n\n if (this.options.modules) {\n for (let i = 0; i < this.options.modules.length; i++) {\n const module = this.options.modules[i];\n const modulePath = path.resolve(this.root, module);\n if (this.modules.includes(modulePath)) {\n continue;\n }\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n } else {\n throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);\n }\n }\n } else {\n for (const module of DEFAULT_MODULES) {\n const modulePath = path.resolve(this.root, module);\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n break;\n }\n }\n }\n\n if (this.options.styles) {\n for (let i = 0; i < this.options.styles.length; i++) {\n const style = this.options.styles[i];\n const stylePath = path.resolve(this.root, style);\n if (this.styles.includes(stylePath)) {\n continue;\n }\n if (fs.existsSync(stylePath)) {\n this.styles.push(stylePath);\n } else {\n throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);\n }\n }\n }\n\n if (this.options.template) {\n const templatePath = path.resolve(this.root, this.options.template);\n if (fs.existsSync(templatePath)) {\n this.template = templatePath;\n } else {\n throw new Error(`Provided template file does not exist: ${templatePath}`);\n }\n } else {\n for (const file of DEFAULT_TEMPLATES) {\n const fullPath = path.resolve(this.root, file);\n if (fs.existsSync(fullPath)) {\n this.template = fullPath;\n break;\n }\n }\n\n if (!this.template) {\n throw new Error(\n 'No template file found.\\n' +\n `Tried: ${DEFAULT_TEMPLATES.join(', ')}\\n` +\n '👉 Tip: You can pass a custom template as shown:\\n' +\n ' blogger({ template: \"src/my-template.xml\" })',\n );\n }\n }\n\n this.name = path.basename(this.template, path.extname(this.template));\n\n for (const modulePath of this.modules) {\n this.headTags.push(`<script type=\"module\" src=\"/${path.relative(this.root, modulePath).replaceAll('\\\\', '/')}\"></script>`);\n }\n for (const stylePath of this.styles) {\n this.headTags.push(`<link rel=\"stylesheet\" href=\"/${path.relative(this.root, stylePath).replaceAll('\\\\', '/')}\">`);\n }\n\n this.input = `virtual:blogger-plugin/${this.name}.html`;\n this.html = `<!DOCTYPE html>\n<html>\n<head>\n <!--head-->${this.headTags.length > 0 ? `\\n ${this.headTags.join('\\n ')}` : ''}\n</head>\n<body>\n <!--body-->\n</body>\n</html>`;\n }\n}\n\nfunction useServerMiddleware(server: ViteDevServer | PreviewServer, ctx: BloggerPluginContext, _this: MinimalPluginContextWithoutEnvironment) {\n const input = ctx.viteConfig.build[VITE_BUNDLER_KEY].input;\n const htmlPathnames: string[] = [];\n for (const entry of Array.isArray(input) ? input : typeof input === 'object' ? Object.values(input) : typeof input === 'string' ? [input] : []) {\n if (entry === ctx.input) {\n continue;\n }\n const entryPath = path.resolve(ctx.root, entry);\n if (!entryPath.endsWith('.html')) {\n continue;\n }\n const relativePath = path.relative(ctx.root, entry).replaceAll('\\\\', '/');\n htmlPathnames.push(`/${relativePath}`);\n if (relativePath.endsWith('index.html')) {\n htmlPathnames.push(`/${relativePath.replace(/index\\.html$/, '')}`);\n }\n }\n\n return () => {\n server.httpServer?.once('listening', () => {\n setTimeout(() => {\n _this.info(`Unhandled requests will be proxied to ${ctx.proxyBlog.origin}`);\n }, 0);\n });\n\n server.middlewares.use(async (req, res, next) => {\n const url = getRequestUrl(req);\n\n if (\n !req.url ||\n !req.originalUrl ||\n !url ||\n !req.method ||\n !['GET', 'HEAD'].includes(req.method.toUpperCase()) ||\n htmlPathnames.includes(url.pathname.replace(/\\/+/g, '/'))\n ) {\n next();\n return;\n }\n\n const start = Date.now();\n\n const proxyUrl = new URL(`${ctx.proxyBlog.origin}${req.originalUrl}`);\n\n const viewParam = proxyUrl.searchParams.get('view');\n proxyUrl.searchParams.set('view', `${isViteDevServer(server) ? '-DevServer' : '-PreviewServer'}${viewParam?.startsWith('-') ? viewParam : ''}`);\n\n const proxyRequest = new Request(proxyUrl, {\n method: req.method,\n headers: toWebHeaders(req.headers),\n redirect: 'manual',\n });\n\n const proxyResponse = await fetch(proxyRequest).catch((error) => {\n if (error instanceof Error) {\n _this.warn({\n message: `${error.name}: ${error.message}`,\n cause: error.cause,\n stack: error.stack,\n });\n } else {\n _this.warn('Fetch failed');\n }\n return null;\n });\n\n if (proxyResponse) {\n res.statusCode = proxyResponse.status;\n res.statusMessage = proxyResponse.statusText;\n\n proxyResponse.headers.forEach((value, key) => {\n if (key === 'location') {\n const redirectUrl = new URL(value, proxyUrl);\n if (redirectUrl.host === url.host || redirectUrl.host === proxyUrl.host) {\n redirectUrl.host = url.host;\n redirectUrl.protocol = url.protocol;\n const viewParam = redirectUrl.searchParams.get('view')?.replaceAll('-DevServer', '').replaceAll('-PreviewServer', '');\n if (viewParam) {\n redirectUrl.searchParams.set('view', viewParam);\n } else {\n redirectUrl.searchParams.delete('view');\n }\n res.setHeader('location', redirectUrl.pathname + redirectUrl.search + redirectUrl.hash);\n } else {\n res.setHeader('location', redirectUrl.href);\n }\n } else if (['content-type', 'x-robots-tag', 'date', 'location'].includes(key)) {\n res.setHeader(key, value);\n }\n });\n\n const contentType = proxyResponse.headers.get('content-type');\n\n if (contentType?.startsWith('text/html')) {\n let htmlTemplateContent = await proxyResponse.text();\n\n const secFetchDestHeader = req.headers['sec-fetch-dest'];\n const secFetchModeHeader = req.headers['sec-fetch-mode'];\n if (ctx.tailwind && isViteDevServer(server) && secFetchDestHeader === 'document' && secFetchModeHeader === 'navigate') {\n await updateTailwindCache(ctx.root, htmlTemplateContent, 'html');\n }\n\n htmlTemplateContent = replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);\n\n if (isViteDevServer(server)) {\n const template = await server.transformIndexHtml(\n req.url,\n replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join('')),\n req.originalUrl,\n );\n\n res.end(template);\n } else {\n const xmlTemplateContent = fs.readFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), 'utf8');\n\n const htmlTagsStr = getBloggerPluginHeadComment(xmlTemplateContent, true);\n\n const template = replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr ?? '');\n\n res.end(template);\n }\n } else if (contentType && /^(text\\/)|(application\\/(.*\\+)?(xml|json))/.test(contentType)) {\n const content = await proxyResponse.text();\n\n res.end(replaceHost(content, proxyUrl.host, url.host, url.protocol));\n } else {\n res.end(new Uint8Array(await proxyResponse.arrayBuffer()));\n }\n } else {\n res.statusCode = 500;\n res.statusMessage = 'Internal Server Error';\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(errorHtml(proxyUrl.href));\n }\n\n const duration = Date.now() - start;\n\n _this.info(`${req.method} ${req.originalUrl} -> ${res.statusCode} ${res.statusMessage} (${duration}ms)`);\n });\n };\n}\n\nfunction isViteDevServer(server: ViteDevServer | PreviewServer): server is ViteDevServer {\n return 'hot' in server && 'transformRequest' in server && 'transformIndexHtml' in server;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vite.mjs","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { type MinifyOptions, minify } from 'minify-xml';\nimport type { MinimalPluginContextWithoutEnvironment, Plugin, PreviewServer, ResolvedConfig, UserConfig, ViteDevServer } from 'vite';\nimport { DEFAULT_MODULES, DEFAULT_TEMPLATES, VITE_BUNDLER_KEY } from './constants';\nimport { clearTailwindCache, removeTailwindCache, updateTailwindCache } from './tailwind';\nimport {\n errorHtml,\n getBloggerPluginHeadComment,\n getRequestUrl,\n isTailwindPlugin,\n replaceBloggerPluginHeadComment,\n replaceHost,\n toWebHeaders,\n unescapeHTML,\n} from './utils';\n\nexport interface XMLOptions {\n tags?: boolean;\n minify?: boolean;\n}\n\nexport interface BloggerPluginOptions {\n modules?: string[];\n styles?: string[];\n template?: string;\n proxyBlog: string;\n xml?: XMLOptions;\n}\n\nexport default function blogger(userOptions: BloggerPluginOptions): Plugin {\n const ctx = new BloggerPluginContext(userOptions);\n\n return {\n name: '@blogger-plugin/vite',\n config(config) {\n // resolve plugin context\n ctx.resolve(config);\n\n // modify vite config\n config.build ||= {};\n config.build[VITE_BUNDLER_KEY] ||= {};\n const bundlerOptions = config.build[VITE_BUNDLER_KEY];\n if (Array.isArray(bundlerOptions.input)) {\n bundlerOptions.input = [...bundlerOptions.input, ctx.input];\n } else if (typeof bundlerOptions.input === 'object' && bundlerOptions.input !== null) {\n bundlerOptions.input[ctx.input] = ctx.input;\n } else {\n bundlerOptions.input = ctx.input;\n }\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n // remove contents between comments from template\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(originalTemplateXmlContent, ''), '', true);\n\n fs.writeFileSync(ctx.template, modifiedTemplateXmlContent, 'utf-8');\n },\n configResolved(config) {\n ctx.viteConfig = config;\n ctx.tailwind = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));\n\n if (ctx.tailwind) {\n clearTailwindCache(ctx.root);\n\n if (config.command === 'build') {\n updateTailwindCache(ctx.root, unescapeHTML(fs.readFileSync(ctx.template, 'utf-8'), true), 'xml');\n }\n } else {\n removeTailwindCache(ctx.root);\n }\n },\n resolveId(source) {\n if (source === ctx.input) {\n return ctx.input;\n }\n },\n load(id) {\n if (id === ctx.input) {\n return ctx.html;\n }\n },\n buildStart() {\n if (ctx.viteConfig.command === 'build' && !/^https?:\\/\\//.test(ctx.viteConfig.base)) {\n this.warn(`\"base\" should be a CDN URL in production\n----------------------\nBlogger cannot serve static assets (JS, CSS, etc.), so you must use\nan absolute URL (http:// or https://).\n\nCurrent value:\n base: \"${ctx.viteConfig.base}\"\n\nQuick fix:\n VITE_BASE=https://cdn.jsdelivr.net/gh/<username>/<repository>@latest/dist/ npm run build\n\nVite config (recommended):\n export default defineConfig({\n base: process.env.VITE_BASE ?? \"/\"\n });\n\nWithout this, your assets may fail to load in Blogger.\n----------------------`);\n }\n },\n writeBundle(_, bundle) {\n if (!(ctx.input in bundle)) {\n return;\n }\n const asset = bundle[ctx.input];\n delete bundle[ctx.input];\n\n if (asset.type !== 'asset' || typeof asset.source !== 'string') {\n return;\n }\n const regex =\n /<!DOCTYPE html>\\s*<html[^>]*>\\s*<head>([\\s\\S]*?)<!--head-->([\\s\\S]*?)<\\/head>\\s*<body>([\\s\\S]*?)<!--body-->([\\s\\S]*?)<\\/body>\\s*<\\/html>/i;\n const match = asset.source.match(regex);\n if (!match) {\n return;\n }\n\n const afterHeadBegin = match[1];\n const beforeHeadEnd = match[2];\n const afterBodyBegin = match[3];\n const beforeBodyEnd = match[4];\n\n const headContent = (afterHeadBegin + beforeHeadEnd)\n .replace(/<[^>]+>/g, (openingTag: string) => {\n return (\n openingTag\n // boolean attributes to empty string\n .replace(/\\b(crossorigin|defer|async|disabled|checked)\\b(?!\\s*=)/g, (_, $1: string) =>\n $1 === 'crossorigin' ? 'crossorigin=\"anonymous\"' : `${$1}=\"\"`,\n )\n // convert attributes to single quotes safely\n .replace(/(\\w+)=(\".*?\"|'.*?')/g, (_, $1: string, $2: string) => {\n const v = $2\n // remove quotes\n .slice(1, -1)\n // escape special XML chars\n .replace(/&/g, '&')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n return `${$1}='${v}'`;\n })\n );\n })\n // self-close void tags\n .replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1: string, $2: string) => `<${$1}${$2}/>`)\n // remove whitespace between tags\n .replace(/>\\s+</g, '><')\n // trim overall\n .trim();\n\n const originalTemplateXmlContent = fs.readFileSync(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(originalTemplateXmlContent, headContent, true);\n\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), modifiedTemplateXmlContent);\n\n if (ctx.xml.tags) {\n const templateTagsXmlContent = `<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE html>\n<html>\n<head>\n <!--head:afterbegin:begin-->\n\n <!--head:afterbegin:end-->\n\n <!--head:beforeend:begin-->\n ${headContent}\n <!--head:beforeend:end-->\n</head>\n<body>\n <!--body:afterbegin:begin-->\n ${afterBodyBegin.trim()}\n <!--body:afterbegin:end-->\n\n <!--body:beforeend:begin-->\n ${beforeBodyEnd.trim()}\n <!--body:beforeend:end-->\n</body>\n</html>`;\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.tags.xml'), templateTagsXmlContent);\n }\n\n if (ctx.xml.minify) {\n const minifiedTemplateXmlContent = minify(modifiedTemplateXmlContent, {\n removeComments: false,\n shortenNamespaces: false,\n removeUnusedNamespaces: false,\n removeUnusedDefaultNamespace: false,\n ignoreCData: true,\n } as MinifyOptions);\n fs.writeFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.min.xml'), minifiedTemplateXmlContent);\n }\n },\n closeBundle() {\n const htmlDir = path.resolve(ctx.viteConfig.build.outDir, 'virtual:blogger-plugin');\n if (fs.existsSync(htmlDir)) {\n fs.rmSync(htmlDir, { recursive: true });\n }\n },\n configureServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n configurePreviewServer(server) {\n return useServerMiddleware(server, ctx, this);\n },\n };\n}\n\nclass BloggerPluginContext {\n private options: BloggerPluginOptions;\n root: string;\n modules: string[];\n styles: string[];\n template: string;\n name: string;\n proxyBlog: URL;\n xml: Required<XMLOptions>;\n viteConfig: ResolvedConfig;\n tailwind: boolean;\n input: string;\n html: string;\n headTags: string[];\n\n constructor(options: BloggerPluginOptions) {\n if (typeof options.template !== 'undefined' && typeof options.template !== 'string') {\n throw new Error(\"Option 'template' must be a string\");\n }\n if (typeof options.modules !== 'undefined' && !Array.isArray(options.modules)) {\n throw new Error(\"Option 'modules' must be an array\");\n }\n if (typeof options.styles !== 'undefined' && !Array.isArray(options.styles)) {\n throw new Error(\"Option 'styles' must be an array\");\n }\n if (typeof options.proxyBlog !== 'string') {\n throw new Error(\"Option 'proxyBlog' must be a string\");\n }\n let proxyBlog: URL;\n try {\n proxyBlog = new URL(options.proxyBlog);\n } catch {\n throw new Error(\"Option 'proxyBlog' must be a valid url\");\n }\n\n this.options = options;\n this.root = process.cwd();\n this.modules = [];\n this.styles = [];\n this.template = undefined as unknown as string;\n this.name = undefined as unknown as string;\n this.proxyBlog = proxyBlog;\n this.xml = {\n tags: options.xml?.tags ?? false,\n minify: options.xml?.minify ?? false,\n };\n this.viteConfig = undefined as unknown as ResolvedConfig;\n this.tailwind = false;\n this.input = undefined as unknown as string;\n this.headTags = [];\n this.html = undefined as unknown as string;\n }\n\n resolve(config: UserConfig) {\n this.root = config.root ? path.resolve(config.root) : this.root;\n\n if (this.options.modules) {\n for (let i = 0; i < this.options.modules.length; i++) {\n const module = this.options.modules[i];\n const modulePath = path.resolve(this.root, module);\n if (this.modules.includes(modulePath)) {\n continue;\n }\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n } else {\n throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);\n }\n }\n } else {\n for (const module of DEFAULT_MODULES) {\n const modulePath = path.resolve(this.root, module);\n if (fs.existsSync(modulePath)) {\n this.modules.push(modulePath);\n break;\n }\n }\n }\n\n if (this.options.styles) {\n for (let i = 0; i < this.options.styles.length; i++) {\n const style = this.options.styles[i];\n const stylePath = path.resolve(this.root, style);\n if (this.styles.includes(stylePath)) {\n continue;\n }\n if (fs.existsSync(stylePath)) {\n this.styles.push(stylePath);\n } else {\n throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);\n }\n }\n }\n\n if (this.options.template) {\n const templatePath = path.resolve(this.root, this.options.template);\n if (fs.existsSync(templatePath)) {\n this.template = templatePath;\n } else {\n throw new Error(`Provided template file does not exist: ${templatePath}`);\n }\n } else {\n for (const file of DEFAULT_TEMPLATES) {\n const fullPath = path.resolve(this.root, file);\n if (fs.existsSync(fullPath)) {\n this.template = fullPath;\n break;\n }\n }\n\n if (!this.template) {\n throw new Error(\n 'No template file found.\\n' +\n `Tried: ${DEFAULT_TEMPLATES.join(', ')}\\n` +\n '👉 Tip: You can pass a custom template as shown:\\n' +\n ' blogger({ template: \"src/my-template.xml\" })',\n );\n }\n }\n\n this.name = path.basename(this.template, path.extname(this.template));\n\n for (const modulePath of this.modules) {\n this.headTags.push(`<script type=\"module\" src=\"/${path.relative(this.root, modulePath).replaceAll('\\\\', '/')}\"></script>`);\n }\n for (const stylePath of this.styles) {\n this.headTags.push(`<link rel=\"stylesheet\" href=\"/${path.relative(this.root, stylePath).replaceAll('\\\\', '/')}\">`);\n }\n\n this.input = `virtual:blogger-plugin/${this.name}.html`;\n this.html = `<!DOCTYPE html>\n<html>\n<head>\n <!--head-->${this.headTags.length > 0 ? `\\n ${this.headTags.join('\\n ')}` : ''}\n</head>\n<body>\n <!--body-->\n</body>\n</html>`;\n }\n}\n\nfunction useServerMiddleware(server: ViteDevServer | PreviewServer, ctx: BloggerPluginContext, _this: MinimalPluginContextWithoutEnvironment) {\n const input = ctx.viteConfig.build[VITE_BUNDLER_KEY].input;\n const htmlPathnames: string[] = [];\n for (const entry of Array.isArray(input) ? input : typeof input === 'object' ? Object.values(input) : typeof input === 'string' ? [input] : []) {\n if (entry === ctx.input) {\n continue;\n }\n const entryPath = path.resolve(ctx.root, entry);\n if (!entryPath.endsWith('.html')) {\n continue;\n }\n const relativePath = path.relative(ctx.root, entry).replaceAll('\\\\', '/');\n htmlPathnames.push(`/${relativePath}`);\n if (relativePath.endsWith('index.html')) {\n htmlPathnames.push(`/${relativePath.replace(/index\\.html$/, '')}`);\n }\n }\n\n return () => {\n server.httpServer?.once('listening', () => {\n setTimeout(() => {\n _this.info(`Unhandled requests will be proxied to ${ctx.proxyBlog.origin}`);\n }, 0);\n });\n\n server.middlewares.use(async (req, res, next) => {\n const url = getRequestUrl(req);\n\n if (\n !req.url ||\n !req.originalUrl ||\n !url ||\n !req.method ||\n !['GET', 'HEAD'].includes(req.method.toUpperCase()) ||\n htmlPathnames.includes(url.pathname.replace(/\\/+/g, '/')) ||\n url.pathname.startsWith('/@')\n ) {\n next();\n return;\n }\n\n const start = Date.now();\n\n const proxyUrl = new URL(`${ctx.proxyBlog.origin}${req.originalUrl}`);\n\n const viewParam = proxyUrl.searchParams.get('view');\n proxyUrl.searchParams.set('view', `${isViteDevServer(server) ? '-DevServer' : '-PreviewServer'}${viewParam?.startsWith('-') ? viewParam : ''}`);\n\n const proxyRequest = new Request(proxyUrl, {\n method: req.method,\n headers: toWebHeaders(req.headers),\n redirect: 'manual',\n });\n\n const proxyResponse = await fetch(proxyRequest).catch((error) => {\n if (error instanceof Error) {\n _this.warn({\n message: `${error.name}: ${error.message}`,\n cause: error.cause,\n stack: error.stack,\n });\n } else {\n _this.warn('Fetch failed');\n }\n return null;\n });\n\n if (proxyResponse) {\n res.statusCode = proxyResponse.status;\n res.statusMessage = proxyResponse.statusText;\n\n proxyResponse.headers.forEach((value, key) => {\n if (key === 'location') {\n const redirectUrl = new URL(value, proxyUrl);\n if (redirectUrl.host === url.host || redirectUrl.host === proxyUrl.host) {\n redirectUrl.host = url.host;\n redirectUrl.protocol = url.protocol;\n const viewParam = redirectUrl.searchParams.get('view')?.replaceAll('-DevServer', '').replaceAll('-PreviewServer', '');\n if (viewParam) {\n redirectUrl.searchParams.set('view', viewParam);\n } else {\n redirectUrl.searchParams.delete('view');\n }\n res.setHeader('location', redirectUrl.pathname + redirectUrl.search + redirectUrl.hash);\n } else {\n res.setHeader('location', redirectUrl.href);\n }\n } else if (['content-type', 'x-robots-tag', 'date', 'location'].includes(key)) {\n res.setHeader(key, value);\n }\n });\n\n const contentType = proxyResponse.headers.get('content-type');\n\n if (contentType?.startsWith('text/html')) {\n let htmlTemplateContent = await proxyResponse.text();\n\n const secFetchDestHeader = req.headers['sec-fetch-dest'];\n const secFetchModeHeader = req.headers['sec-fetch-mode'];\n if (ctx.tailwind && isViteDevServer(server) && secFetchDestHeader === 'document' && secFetchModeHeader === 'navigate') {\n await updateTailwindCache(ctx.root, htmlTemplateContent, 'html');\n }\n\n htmlTemplateContent = replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);\n\n if (isViteDevServer(server)) {\n const template = await server.transformIndexHtml(\n req.url,\n replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join('')),\n req.originalUrl,\n );\n\n res.end(template);\n } else {\n const xmlTemplateContent = fs.readFileSync(path.resolve(ctx.viteConfig.build.outDir, 'template.xml'), 'utf8');\n\n const htmlTagsStr = getBloggerPluginHeadComment(xmlTemplateContent, true);\n\n const template = replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr ?? '');\n\n res.end(template);\n }\n } else if (contentType && /^(text\\/)|(application\\/(.*\\+)?(xml|json))/.test(contentType)) {\n const content = await proxyResponse.text();\n\n res.end(replaceHost(content, proxyUrl.host, url.host, url.protocol));\n } else {\n res.end(new Uint8Array(await proxyResponse.arrayBuffer()));\n }\n } else {\n res.statusCode = 500;\n res.statusMessage = 'Internal Server Error';\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(errorHtml(proxyUrl.href));\n }\n\n const duration = Date.now() - start;\n\n _this.info(`${req.method} ${req.originalUrl} -> ${res.statusCode} ${res.statusMessage} (${duration}ms)`);\n });\n };\n}\n\nfunction isViteDevServer(server: ViteDevServer | PreviewServer): server is ViteDevServer {\n return 'hot' in server && 'transformRequest' in server && 'transformIndexHtml' in server;\n}\n"],"mappings":"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"}
|