blogger-plugin 0.0.11 ā 0.0.13
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/constants.cjs +14 -7
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.mjs +9 -5
- package/dist/constants.mjs.map +1 -1
- package/dist/tailwind.cjs +55 -56
- package/dist/tailwind.cjs.map +1 -1
- package/dist/tailwind.mjs +55 -54
- package/dist/tailwind.mjs.map +1 -1
- package/dist/utils.cjs +8 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.mjs +6 -2
- package/dist/utils.mjs.map +1 -1
- package/dist/vite.cjs +38 -33
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.mjs +39 -34
- package/dist/vite.mjs.map +1 -1
- package/package.json +7 -7
package/dist/vite.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_constants = require("./constants.cjs");
|
|
3
|
-
const require_tailwind = require("./tailwind.cjs");
|
|
4
3
|
const require_utils = require("./utils.cjs");
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const require_tailwind = require("./tailwind.cjs");
|
|
5
|
+
let node_fs_promises = require("node:fs/promises");
|
|
6
|
+
node_fs_promises = require_runtime.__toESM(node_fs_promises, 1);
|
|
7
7
|
let node_path = require("node:path");
|
|
8
8
|
node_path = require_runtime.__toESM(node_path, 1);
|
|
9
9
|
let minify_xml = require("minify-xml");
|
|
@@ -12,25 +12,30 @@ function blogger(userOptions) {
|
|
|
12
12
|
const ctx = new BloggerPluginContext(userOptions);
|
|
13
13
|
return {
|
|
14
14
|
name: "@blogger-plugin/vite",
|
|
15
|
-
config(config) {
|
|
15
|
+
async config(config) {
|
|
16
16
|
var _config$build;
|
|
17
|
-
ctx.resolve(config);
|
|
17
|
+
await ctx.resolve(config);
|
|
18
18
|
config.build || (config.build = {});
|
|
19
19
|
(_config$build = config.build)[require_constants.VITE_BUNDLER_KEY] || (_config$build[require_constants.VITE_BUNDLER_KEY] = {});
|
|
20
20
|
const bundlerOptions = config.build[require_constants.VITE_BUNDLER_KEY];
|
|
21
21
|
if (Array.isArray(bundlerOptions.input)) bundlerOptions.input = [...bundlerOptions.input, ctx.input];
|
|
22
22
|
else if (typeof bundlerOptions.input === "object" && bundlerOptions.input !== null) bundlerOptions.input[ctx.input] = ctx.input;
|
|
23
23
|
else bundlerOptions.input = ctx.input;
|
|
24
|
-
const modifiedTemplateXmlContent = require_utils.replaceBloggerPluginHeadComment(require_utils.replaceBloggerPluginHeadComment(
|
|
25
|
-
|
|
24
|
+
const modifiedTemplateXmlContent = require_utils.replaceBloggerPluginHeadComment(require_utils.replaceBloggerPluginHeadComment(await node_fs_promises.readFile(ctx.template, "utf8"), ""), "", true);
|
|
25
|
+
await node_fs_promises.writeFile(ctx.template, modifiedTemplateXmlContent, "utf-8");
|
|
26
26
|
},
|
|
27
|
-
configResolved(config) {
|
|
27
|
+
async configResolved(config) {
|
|
28
28
|
ctx.viteConfig = config;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
const hasTailwindPlugin = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => require_utils.isTailwindPlugin(plugin));
|
|
30
|
+
const tailwindCache = new require_tailwind.TailwindCache(node_path.resolve(ctx.root, require_constants.TAILWIND_CACHE_FILE));
|
|
31
|
+
if (hasTailwindPlugin) ctx.tailwindCache = tailwindCache;
|
|
32
|
+
if (hasTailwindPlugin) {
|
|
33
|
+
await tailwindCache.clear();
|
|
34
|
+
if (config.command === "build") {
|
|
35
|
+
const unescapedXmlContent = require_utils.unescapeHTML(await node_fs_promises.readFile(ctx.template, "utf-8"), true);
|
|
36
|
+
await tailwindCache.update(unescapedXmlContent, "xml");
|
|
37
|
+
}
|
|
38
|
+
} else await tailwindCache.remove();
|
|
34
39
|
},
|
|
35
40
|
resolveId(source) {
|
|
36
41
|
if (source === ctx.input) return ctx.input;
|
|
@@ -58,7 +63,7 @@ Vite config (recommended):
|
|
|
58
63
|
Without this, your assets may fail to load in Blogger.
|
|
59
64
|
----------------------`);
|
|
60
65
|
},
|
|
61
|
-
writeBundle(_, bundle) {
|
|
66
|
+
async writeBundle(_, bundle) {
|
|
62
67
|
if (!(ctx.input in bundle)) return;
|
|
63
68
|
const asset = bundle[ctx.input];
|
|
64
69
|
delete bundle[ctx.input];
|
|
@@ -74,8 +79,8 @@ Without this, your assets may fail to load in Blogger.
|
|
|
74
79
|
return `${$1}='${$2.slice(1, -1).replace(/&/g, "&").replace(/'/g, "'").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">")}'`;
|
|
75
80
|
});
|
|
76
81
|
}).replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1, $2) => `<${$1}${$2}/>`).replace(/>\s+</g, "><").trim();
|
|
77
|
-
const modifiedTemplateXmlContent = require_utils.replaceBloggerPluginHeadComment(
|
|
78
|
-
|
|
82
|
+
const modifiedTemplateXmlContent = require_utils.replaceBloggerPluginHeadComment(await node_fs_promises.readFile(ctx.template, "utf8"), headContent, true);
|
|
83
|
+
await node_fs_promises.writeFile(node_path.resolve(ctx.viteConfig.build.outDir, require_constants.TEMPLATE_OUT_FILE), modifiedTemplateXmlContent);
|
|
79
84
|
if (ctx.xml.tags) {
|
|
80
85
|
const templateTagsXmlContent = `<?xml version="1.0" encoding="UTF-8" ?>
|
|
81
86
|
<!DOCTYPE html>
|
|
@@ -99,7 +104,7 @@ Without this, your assets may fail to load in Blogger.
|
|
|
99
104
|
<!--body:beforeend:end-->
|
|
100
105
|
</body>
|
|
101
106
|
</html>`;
|
|
102
|
-
|
|
107
|
+
await node_fs_promises.writeFile(node_path.resolve(ctx.viteConfig.build.outDir, require_constants.TEMPLATE_TAGS_OUT_FILE), templateTagsXmlContent);
|
|
103
108
|
}
|
|
104
109
|
if (ctx.xml.minify) {
|
|
105
110
|
const minifiedTemplateXmlContent = (0, minify_xml.minify)(modifiedTemplateXmlContent, {
|
|
@@ -109,12 +114,12 @@ Without this, your assets may fail to load in Blogger.
|
|
|
109
114
|
removeUnusedDefaultNamespace: false,
|
|
110
115
|
ignoreCData: true
|
|
111
116
|
});
|
|
112
|
-
|
|
117
|
+
await node_fs_promises.writeFile(node_path.resolve(ctx.viteConfig.build.outDir, require_constants.TEMPLATE_MINIFIED_OUT_FILE), minifiedTemplateXmlContent);
|
|
113
118
|
}
|
|
114
119
|
},
|
|
115
|
-
closeBundle() {
|
|
120
|
+
async closeBundle() {
|
|
116
121
|
const htmlDir = node_path.resolve(ctx.viteConfig.build.outDir, "virtual:blogger-plugin");
|
|
117
|
-
if (
|
|
122
|
+
if (await require_utils.fsExists(htmlDir)) await node_fs_promises.rm(htmlDir, { recursive: true });
|
|
118
123
|
},
|
|
119
124
|
configureServer(server) {
|
|
120
125
|
return useServerMiddleware(server, ctx, this);
|
|
@@ -149,23 +154,23 @@ var BloggerPluginContext = class {
|
|
|
149
154
|
minify: (_options$xml$minify = (_options$xml2 = options.xml) === null || _options$xml2 === void 0 ? void 0 : _options$xml2.minify) !== null && _options$xml$minify !== void 0 ? _options$xml$minify : false
|
|
150
155
|
};
|
|
151
156
|
this.viteConfig = void 0;
|
|
152
|
-
this.
|
|
157
|
+
this.tailwindCache = null;
|
|
153
158
|
this.input = void 0;
|
|
154
159
|
this.headTags = [];
|
|
155
160
|
this.html = void 0;
|
|
156
161
|
}
|
|
157
|
-
resolve(config) {
|
|
162
|
+
async resolve(config) {
|
|
158
163
|
this.root = config.root ? node_path.resolve(config.root) : this.root;
|
|
159
164
|
if (this.options.modules) for (let i = 0; i < this.options.modules.length; i++) {
|
|
160
165
|
const module = this.options.modules[i];
|
|
161
166
|
const modulePath = node_path.resolve(this.root, module);
|
|
162
167
|
if (this.modules.includes(modulePath)) continue;
|
|
163
|
-
if (
|
|
168
|
+
if (await require_utils.fsExists(modulePath)) this.modules.push(modulePath);
|
|
164
169
|
else throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);
|
|
165
170
|
}
|
|
166
|
-
else for (const module of require_constants.
|
|
171
|
+
else for (const module of require_constants.DEFAULT_MODULE_FILES) {
|
|
167
172
|
const modulePath = node_path.resolve(this.root, module);
|
|
168
|
-
if (
|
|
173
|
+
if (await require_utils.fsExists(modulePath)) {
|
|
169
174
|
this.modules.push(modulePath);
|
|
170
175
|
break;
|
|
171
176
|
}
|
|
@@ -174,23 +179,23 @@ var BloggerPluginContext = class {
|
|
|
174
179
|
const style = this.options.styles[i];
|
|
175
180
|
const stylePath = node_path.resolve(this.root, style);
|
|
176
181
|
if (this.styles.includes(stylePath)) continue;
|
|
177
|
-
if (
|
|
182
|
+
if (await require_utils.fsExists(stylePath)) this.styles.push(stylePath);
|
|
178
183
|
else throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);
|
|
179
184
|
}
|
|
180
185
|
if (this.options.template) {
|
|
181
186
|
const templatePath = node_path.resolve(this.root, this.options.template);
|
|
182
|
-
if (
|
|
187
|
+
if (await require_utils.fsExists(templatePath)) this.template = templatePath;
|
|
183
188
|
else throw new Error(`Provided template file does not exist: ${templatePath}`);
|
|
184
189
|
} else {
|
|
185
|
-
for (const file of require_constants.
|
|
190
|
+
for (const file of require_constants.DEFAULT_TEMPLATE_FILES) {
|
|
186
191
|
const fullPath = node_path.resolve(this.root, file);
|
|
187
|
-
if (
|
|
192
|
+
if (await require_utils.fsExists(fullPath)) {
|
|
188
193
|
this.template = fullPath;
|
|
189
194
|
break;
|
|
190
195
|
}
|
|
191
196
|
}
|
|
192
197
|
if (!this.template) throw new Error(`No template file found.
|
|
193
|
-
Tried: ${require_constants.
|
|
198
|
+
Tried: ${[...require_constants.DEFAULT_TEMPLATE_FILES].join(", ")}\nš Tip: You can pass a custom template as shown:
|
|
194
199
|
blogger({ template: "src/my-template.xml" })`);
|
|
195
200
|
}
|
|
196
201
|
this.name = node_path.basename(this.template, node_path.extname(this.template));
|
|
@@ -227,7 +232,7 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
227
232
|
});
|
|
228
233
|
server.middlewares.use(async (req, res, next) => {
|
|
229
234
|
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, "/"))) {
|
|
235
|
+
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/")) || url.pathname.startsWith("/@")) {
|
|
231
236
|
next();
|
|
232
237
|
return;
|
|
233
238
|
}
|
|
@@ -276,13 +281,13 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
276
281
|
let htmlTemplateContent = await proxyResponse.text();
|
|
277
282
|
const secFetchDestHeader = req.headers["sec-fetch-dest"];
|
|
278
283
|
const secFetchModeHeader = req.headers["sec-fetch-mode"];
|
|
279
|
-
if (ctx.
|
|
284
|
+
if (ctx.tailwindCache && isViteDevServer(server) && secFetchDestHeader === "document" && secFetchModeHeader === "navigate") await ctx.tailwindCache.update(htmlTemplateContent, "html");
|
|
280
285
|
htmlTemplateContent = require_utils.replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);
|
|
281
286
|
if (isViteDevServer(server)) {
|
|
282
287
|
const template = await server.transformIndexHtml(req.url, require_utils.replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join("")), req.originalUrl);
|
|
283
288
|
res.end(template);
|
|
284
289
|
} else {
|
|
285
|
-
const htmlTagsStr = require_utils.getBloggerPluginHeadComment(
|
|
290
|
+
const htmlTagsStr = require_utils.getBloggerPluginHeadComment(await node_fs_promises.readFile(node_path.resolve(ctx.viteConfig.build.outDir, require_constants.TEMPLATE_OUT_FILE), "utf8"), true);
|
|
286
291
|
const template = require_utils.replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr !== null && htmlTagsStr !== void 0 ? htmlTagsStr : "");
|
|
287
292
|
res.end(template);
|
|
288
293
|
}
|
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","TailwindCache","path","TAILWIND_CACHE_FILE","unescapeHTML","TEMPLATE_OUT_FILE","TEMPLATE_TAGS_OUT_FILE","TEMPLATE_MINIFIED_OUT_FILE","fsExists","DEFAULT_MODULE_FILES","DEFAULT_TEMPLATE_FILES","getRequestUrl","toWebHeaders","replaceHost","getBloggerPluginHeadComment","errorHtml"],"sources":["../src/vite.ts"],"sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { type MinifyOptions, minify } from 'minify-xml';\nimport type { MinimalPluginContextWithoutEnvironment, Plugin, PreviewServer, ResolvedConfig, UserConfig, ViteDevServer } from 'vite';\nimport {\n DEFAULT_MODULE_FILES,\n DEFAULT_TEMPLATE_FILES,\n TAILWIND_CACHE_FILE,\n TEMPLATE_MINIFIED_OUT_FILE,\n TEMPLATE_OUT_FILE,\n TEMPLATE_TAGS_OUT_FILE,\n VITE_BUNDLER_KEY,\n} from './constants';\nimport { TailwindCache } from './tailwind';\nimport {\n errorHtml,\n fsExists,\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 async config(config) {\n // resolve plugin context\n await 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 // remove contents between comments from template\n const originalTemplateXmlContent = await fs.readFile(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(originalTemplateXmlContent, ''), '', true);\n\n await fs.writeFile(ctx.template, modifiedTemplateXmlContent, 'utf-8');\n },\n async configResolved(config) {\n ctx.viteConfig = config;\n\n const hasTailwindPlugin = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));\n const tailwindCache = new TailwindCache(path.resolve(ctx.root, TAILWIND_CACHE_FILE));\n\n if (hasTailwindPlugin) {\n ctx.tailwindCache = tailwindCache;\n }\n\n if (hasTailwindPlugin) {\n await tailwindCache.clear();\n\n if (config.command === 'build') {\n const xmlContent = await fs.readFile(ctx.template, 'utf-8');\n const unescapedXmlContent = unescapeHTML(xmlContent, true);\n await tailwindCache.update(unescapedXmlContent, 'xml');\n }\n } else {\n await tailwindCache.remove();\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 async 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 = await fs.readFile(ctx.template, 'utf8');\n const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(originalTemplateXmlContent, headContent, true);\n\n await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_OUT_FILE), 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 await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_TAGS_OUT_FILE), 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 await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_MINIFIED_OUT_FILE), minifiedTemplateXmlContent);\n }\n },\n async closeBundle() {\n const htmlDir = path.resolve(ctx.viteConfig.build.outDir, 'virtual:blogger-plugin');\n\n const exists = await fsExists(htmlDir);\n\n if (exists) {\n await fs.rm(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 tailwindCache: TailwindCache | null;\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.tailwindCache = null;\n this.input = undefined as unknown as string;\n this.headTags = [];\n this.html = undefined as unknown as string;\n }\n\n async resolve(config: UserConfig): Promise<void> {\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 (await fsExists(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_MODULE_FILES) {\n const modulePath = path.resolve(this.root, module);\n if (await fsExists(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 (await fsExists(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 (await fsExists(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_TEMPLATE_FILES) {\n const fullPath = path.resolve(this.root, file);\n if (await fsExists(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_TEMPLATE_FILES].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(\n server: ViteDevServer | PreviewServer,\n ctx: BloggerPluginContext,\n _this: MinimalPluginContextWithoutEnvironment,\n): () => void {\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.tailwindCache && isViteDevServer(server) && secFetchDestHeader === 'document' && secFetchModeHeader === 'navigate') {\n await ctx.tailwindCache.update(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 = await fs.readFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_OUT_FILE), '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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"}
|
package/dist/vite.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import * as fs from "node:fs";
|
|
1
|
+
import { DEFAULT_MODULE_FILES, DEFAULT_TEMPLATE_FILES, TAILWIND_CACHE_FILE, TEMPLATE_MINIFIED_OUT_FILE, TEMPLATE_OUT_FILE, TEMPLATE_TAGS_OUT_FILE, VITE_BUNDLER_KEY } from "./constants.mjs";
|
|
2
|
+
import { errorHtml, fsExists, getBloggerPluginHeadComment, getRequestUrl, isTailwindPlugin, replaceBloggerPluginHeadComment, replaceHost, toWebHeaders, unescapeHTML } from "./utils.mjs";
|
|
3
|
+
import { TailwindCache } from "./tailwind.mjs";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
5
|
import * as path from "node:path";
|
|
6
6
|
import { minify } from "minify-xml";
|
|
7
7
|
//#region src/vite.ts
|
|
@@ -9,25 +9,30 @@ function blogger(userOptions) {
|
|
|
9
9
|
const ctx = new BloggerPluginContext(userOptions);
|
|
10
10
|
return {
|
|
11
11
|
name: "@blogger-plugin/vite",
|
|
12
|
-
config(config) {
|
|
12
|
+
async config(config) {
|
|
13
13
|
var _config$build;
|
|
14
|
-
ctx.resolve(config);
|
|
14
|
+
await ctx.resolve(config);
|
|
15
15
|
config.build || (config.build = {});
|
|
16
16
|
(_config$build = config.build)[VITE_BUNDLER_KEY] || (_config$build[VITE_BUNDLER_KEY] = {});
|
|
17
17
|
const bundlerOptions = config.build[VITE_BUNDLER_KEY];
|
|
18
18
|
if (Array.isArray(bundlerOptions.input)) bundlerOptions.input = [...bundlerOptions.input, ctx.input];
|
|
19
19
|
else if (typeof bundlerOptions.input === "object" && bundlerOptions.input !== null) bundlerOptions.input[ctx.input] = ctx.input;
|
|
20
20
|
else bundlerOptions.input = ctx.input;
|
|
21
|
-
const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(fs.
|
|
22
|
-
fs.
|
|
21
|
+
const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(replaceBloggerPluginHeadComment(await fs.readFile(ctx.template, "utf8"), ""), "", true);
|
|
22
|
+
await fs.writeFile(ctx.template, modifiedTemplateXmlContent, "utf-8");
|
|
23
23
|
},
|
|
24
|
-
configResolved(config) {
|
|
24
|
+
async configResolved(config) {
|
|
25
25
|
ctx.viteConfig = config;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
const hasTailwindPlugin = config.plugins.flat(Number.POSITIVE_INFINITY).some((plugin) => isTailwindPlugin(plugin));
|
|
27
|
+
const tailwindCache = new TailwindCache(path.resolve(ctx.root, TAILWIND_CACHE_FILE));
|
|
28
|
+
if (hasTailwindPlugin) ctx.tailwindCache = tailwindCache;
|
|
29
|
+
if (hasTailwindPlugin) {
|
|
30
|
+
await tailwindCache.clear();
|
|
31
|
+
if (config.command === "build") {
|
|
32
|
+
const unescapedXmlContent = unescapeHTML(await fs.readFile(ctx.template, "utf-8"), true);
|
|
33
|
+
await tailwindCache.update(unescapedXmlContent, "xml");
|
|
34
|
+
}
|
|
35
|
+
} else await tailwindCache.remove();
|
|
31
36
|
},
|
|
32
37
|
resolveId(source) {
|
|
33
38
|
if (source === ctx.input) return ctx.input;
|
|
@@ -55,7 +60,7 @@ Vite config (recommended):
|
|
|
55
60
|
Without this, your assets may fail to load in Blogger.
|
|
56
61
|
----------------------`);
|
|
57
62
|
},
|
|
58
|
-
writeBundle(_, bundle) {
|
|
63
|
+
async writeBundle(_, bundle) {
|
|
59
64
|
if (!(ctx.input in bundle)) return;
|
|
60
65
|
const asset = bundle[ctx.input];
|
|
61
66
|
delete bundle[ctx.input];
|
|
@@ -71,8 +76,8 @@ Without this, your assets may fail to load in Blogger.
|
|
|
71
76
|
return `${$1}='${$2.slice(1, -1).replace(/&/g, "&").replace(/'/g, "'").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">")}'`;
|
|
72
77
|
});
|
|
73
78
|
}).replace(/<(link|meta|img|br|hr|input)([^>]*?)>/gi, (_, $1, $2) => `<${$1}${$2}/>`).replace(/>\s+</g, "><").trim();
|
|
74
|
-
const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(fs.
|
|
75
|
-
fs.
|
|
79
|
+
const modifiedTemplateXmlContent = replaceBloggerPluginHeadComment(await fs.readFile(ctx.template, "utf8"), headContent, true);
|
|
80
|
+
await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_OUT_FILE), modifiedTemplateXmlContent);
|
|
76
81
|
if (ctx.xml.tags) {
|
|
77
82
|
const templateTagsXmlContent = `<?xml version="1.0" encoding="UTF-8" ?>
|
|
78
83
|
<!DOCTYPE html>
|
|
@@ -96,7 +101,7 @@ Without this, your assets may fail to load in Blogger.
|
|
|
96
101
|
<!--body:beforeend:end-->
|
|
97
102
|
</body>
|
|
98
103
|
</html>`;
|
|
99
|
-
fs.
|
|
104
|
+
await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_TAGS_OUT_FILE), templateTagsXmlContent);
|
|
100
105
|
}
|
|
101
106
|
if (ctx.xml.minify) {
|
|
102
107
|
const minifiedTemplateXmlContent = minify(modifiedTemplateXmlContent, {
|
|
@@ -106,12 +111,12 @@ Without this, your assets may fail to load in Blogger.
|
|
|
106
111
|
removeUnusedDefaultNamespace: false,
|
|
107
112
|
ignoreCData: true
|
|
108
113
|
});
|
|
109
|
-
fs.
|
|
114
|
+
await fs.writeFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_MINIFIED_OUT_FILE), minifiedTemplateXmlContent);
|
|
110
115
|
}
|
|
111
116
|
},
|
|
112
|
-
closeBundle() {
|
|
117
|
+
async closeBundle() {
|
|
113
118
|
const htmlDir = path.resolve(ctx.viteConfig.build.outDir, "virtual:blogger-plugin");
|
|
114
|
-
if (
|
|
119
|
+
if (await fsExists(htmlDir)) await fs.rm(htmlDir, { recursive: true });
|
|
115
120
|
},
|
|
116
121
|
configureServer(server) {
|
|
117
122
|
return useServerMiddleware(server, ctx, this);
|
|
@@ -146,23 +151,23 @@ var BloggerPluginContext = class {
|
|
|
146
151
|
minify: (_options$xml$minify = (_options$xml2 = options.xml) === null || _options$xml2 === void 0 ? void 0 : _options$xml2.minify) !== null && _options$xml$minify !== void 0 ? _options$xml$minify : false
|
|
147
152
|
};
|
|
148
153
|
this.viteConfig = void 0;
|
|
149
|
-
this.
|
|
154
|
+
this.tailwindCache = null;
|
|
150
155
|
this.input = void 0;
|
|
151
156
|
this.headTags = [];
|
|
152
157
|
this.html = void 0;
|
|
153
158
|
}
|
|
154
|
-
resolve(config) {
|
|
159
|
+
async resolve(config) {
|
|
155
160
|
this.root = config.root ? path.resolve(config.root) : this.root;
|
|
156
161
|
if (this.options.modules) for (let i = 0; i < this.options.modules.length; i++) {
|
|
157
162
|
const module = this.options.modules[i];
|
|
158
163
|
const modulePath = path.resolve(this.root, module);
|
|
159
164
|
if (this.modules.includes(modulePath)) continue;
|
|
160
|
-
if (
|
|
165
|
+
if (await fsExists(modulePath)) this.modules.push(modulePath);
|
|
161
166
|
else throw new Error(`The path provided at modules[${i}] does not exist: ${modulePath}`);
|
|
162
167
|
}
|
|
163
|
-
else for (const module of
|
|
168
|
+
else for (const module of DEFAULT_MODULE_FILES) {
|
|
164
169
|
const modulePath = path.resolve(this.root, module);
|
|
165
|
-
if (
|
|
170
|
+
if (await fsExists(modulePath)) {
|
|
166
171
|
this.modules.push(modulePath);
|
|
167
172
|
break;
|
|
168
173
|
}
|
|
@@ -171,23 +176,23 @@ var BloggerPluginContext = class {
|
|
|
171
176
|
const style = this.options.styles[i];
|
|
172
177
|
const stylePath = path.resolve(this.root, style);
|
|
173
178
|
if (this.styles.includes(stylePath)) continue;
|
|
174
|
-
if (
|
|
179
|
+
if (await fsExists(stylePath)) this.styles.push(stylePath);
|
|
175
180
|
else throw new Error(`The path provided at styles[${i}] does not exist: ${stylePath}`);
|
|
176
181
|
}
|
|
177
182
|
if (this.options.template) {
|
|
178
183
|
const templatePath = path.resolve(this.root, this.options.template);
|
|
179
|
-
if (
|
|
184
|
+
if (await fsExists(templatePath)) this.template = templatePath;
|
|
180
185
|
else throw new Error(`Provided template file does not exist: ${templatePath}`);
|
|
181
186
|
} else {
|
|
182
|
-
for (const file of
|
|
187
|
+
for (const file of DEFAULT_TEMPLATE_FILES) {
|
|
183
188
|
const fullPath = path.resolve(this.root, file);
|
|
184
|
-
if (
|
|
189
|
+
if (await fsExists(fullPath)) {
|
|
185
190
|
this.template = fullPath;
|
|
186
191
|
break;
|
|
187
192
|
}
|
|
188
193
|
}
|
|
189
194
|
if (!this.template) throw new Error(`No template file found.
|
|
190
|
-
Tried: ${
|
|
195
|
+
Tried: ${[...DEFAULT_TEMPLATE_FILES].join(", ")}\nš Tip: You can pass a custom template as shown:
|
|
191
196
|
blogger({ template: "src/my-template.xml" })`);
|
|
192
197
|
}
|
|
193
198
|
this.name = path.basename(this.template, path.extname(this.template));
|
|
@@ -224,7 +229,7 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
224
229
|
});
|
|
225
230
|
server.middlewares.use(async (req, res, next) => {
|
|
226
231
|
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, "/"))) {
|
|
232
|
+
if (!req.url || !req.originalUrl || !url || !req.method || !["GET", "HEAD"].includes(req.method.toUpperCase()) || htmlPathnames.includes(url.pathname.replace(/\/+/g, "/")) || url.pathname.startsWith("/@")) {
|
|
228
233
|
next();
|
|
229
234
|
return;
|
|
230
235
|
}
|
|
@@ -273,13 +278,13 @@ function useServerMiddleware(server, ctx, _this) {
|
|
|
273
278
|
let htmlTemplateContent = await proxyResponse.text();
|
|
274
279
|
const secFetchDestHeader = req.headers["sec-fetch-dest"];
|
|
275
280
|
const secFetchModeHeader = req.headers["sec-fetch-mode"];
|
|
276
|
-
if (ctx.
|
|
281
|
+
if (ctx.tailwindCache && isViteDevServer(server) && secFetchDestHeader === "document" && secFetchModeHeader === "navigate") await ctx.tailwindCache.update(htmlTemplateContent, "html");
|
|
277
282
|
htmlTemplateContent = replaceHost(htmlTemplateContent, proxyUrl.host, url.host, url.protocol);
|
|
278
283
|
if (isViteDevServer(server)) {
|
|
279
284
|
const template = await server.transformIndexHtml(req.url, replaceBloggerPluginHeadComment(htmlTemplateContent, ctx.headTags.join("")), req.originalUrl);
|
|
280
285
|
res.end(template);
|
|
281
286
|
} else {
|
|
282
|
-
const htmlTagsStr = getBloggerPluginHeadComment(fs.
|
|
287
|
+
const htmlTagsStr = getBloggerPluginHeadComment(await fs.readFile(path.resolve(ctx.viteConfig.build.outDir, TEMPLATE_OUT_FILE), "utf8"), true);
|
|
283
288
|
const template = replaceBloggerPluginHeadComment(htmlTemplateContent, htmlTagsStr !== null && htmlTagsStr !== void 0 ? htmlTagsStr : "");
|
|
284
289
|
res.end(template);
|
|
285
290
|
}
|