vuepress-plugin-dehydrate
Version:
VuePress plugin to dehydrate generated HTML files
89 lines • 3.74 kB
JavaScript
/* eslint-disable @typescript-eslint/no-var-requires */
const { readFileSync, writeFileSync } = require('fs');
const { resolve } = require('path');
const { globby } = require('@vuepress/shared-utils');
const contentOriginal = '<!--vue-ssr-outlet-->';
const contentBefore = '<!--before-vue-ssr-outlet-->';
const contentAfter = '<!--after-vue-ssr-outlet-->';
const contentWrapper = contentBefore + contentOriginal + contentAfter;
const contentReplacer = [
new RegExp(`${contentBefore}[\\s\\S]*${contentAfter}`),
'<div id="app"></div>',
];
const resourceOriginal = '{{{ renderResourceHints() }}}';
const resourceBefore = '<!--before-resource-hints-->';
const resourceAfter = '<!--after-resource-hints-->';
const resourceWrapper = resourceBefore + resourceOriginal + resourceAfter;
const resourceReplacer = [
new RegExp(`${resourceBefore}[\\s\\S]*${resourceAfter}`),
];
const scriptsOriginal = '{{{ renderScripts() }}}';
const scriptsBefore = '<!--before-scripts-->';
const scriptsAfter = '<!--after-scripts-->';
const scriptsWrapper = scriptsBefore + scriptsOriginal + scriptsAfter;
const scriptsReplacer = [
new RegExp(`${scriptsBefore}[\\s\\S]*${scriptsAfter}`),
];
const serverRenderedReplacer = [' data-server-rendered="true"'];
const emptyLineReplacer = [/^ *\r?\n/gm];
const wrapperReplacer = [
new RegExp([
contentBefore,
contentAfter,
resourceBefore,
resourceAfter,
scriptsBefore,
scriptsAfter,
].join('|'), 'g'),
];
function replaceFileContent(file, ...replacers) {
writeFileSync(file, replacers.reduce((prev, [search, replace = '']) => {
return prev.replace(search, replace);
}, readFileSync(file, 'utf8')));
}
const DehydratePlugin = ({ noSSR = '404.html', noScript = [], noEmptyLine = true, globOptions = {} }, context) => ({
name: 'vuepress-plugin-dehydrate',
ready() {
// hack into current ssr template
let template = readFileSync(context.ssrTemplate, 'utf8');
if (template.indexOf(contentWrapper) < 0) {
template = template.replace(contentOriginal, contentWrapper);
}
if (template.indexOf(resourceWrapper) < 0) {
template = template.replace(resourceOriginal, resourceWrapper);
}
if (template.indexOf(scriptsWrapper) < 0) {
template = template.replace(scriptsOriginal, scriptsWrapper);
}
writeFileSync(context.ssrTemplate, template);
},
generated(pages) {
// restore ssr template
replaceFileContent(context.ssrTemplate, wrapperReplacer);
const globbyOptions = Object.assign({ cwd: context.outDir, transform: (file) => resolve(context.outDir, file) }, globOptions);
const defaultReplacers = noEmptyLine
? [wrapperReplacer, emptyLineReplacer]
: [wrapperReplacer];
pages = pages.slice();
// fully disable ssr
globby.sync(noSSR, globbyOptions).forEach((file) => {
const index = pages.indexOf(file);
if (index < 0)
return;
pages.splice(index, 1);
replaceFileContent(file, contentReplacer, ...defaultReplacers);
});
// fully disable script
globby.sync(noScript, globbyOptions).forEach((file) => {
const index = pages.indexOf(file);
if (index < 0)
return;
pages.splice(index, 1);
replaceFileContent(file, resourceReplacer, scriptsReplacer, serverRenderedReplacer, ...defaultReplacers);
});
// clean up unhandled files
pages.forEach((file) => replaceFileContent(file, ...defaultReplacers));
},
});
module.exports = DehydratePlugin;
//# sourceMappingURL=index.js.map