vite-plugin-multi-pages
Version:
Multi Page for vite
198 lines (194 loc) • 5.47 kB
JavaScript
// ../../vite-plugin/vite-plugin-multi-pages/src/index.ts
import history from "connect-history-api-fallback";
// ../../vite-plugin/vite-plugin-multi-pages/package.json
var name = "vite-plugin-multi-pages";
// ../../vite-plugin/vite-plugin-multi-pages/src/utils/index.ts
import fg from "fast-glob";
import path from "path";
import yargs from "yargs";
var argv = yargs.argv;
function getFirstPage(pages) {
const firstPageName = Object.keys(pages)[0];
return `/${firstPageName}/index.html`;
}
function genFileName(pageName, path2) {
const xPath = path2 === "" ? "" : `${path2}/`;
return `${xPath}${pageName}.html`.replace(/^pages\//, "");
}
function parseEntryFile(file, filters = []) {
const fileSplit = file.split("/");
const pageName = fileSplit.slice(2, -1).join("/");
const outputPath = fileSplit.slice(1, fileSplit.length - 2).join("/");
return {
file,
pageName,
outputPath,
include: filters.includes(pageName) || filters.length === 0
};
}
function parseFiles(files, defaultEntries) {
const args = argv?.entry || argv?.file || argv?.page || "";
if (args === "") {
defaultEntries = "";
}
const filters = args.split(",").concat(defaultEntries.split(",")).filter((_) => _);
const ret = files.map((file) => parseEntryFile(file, filters));
return {
allEntries: ret,
entries: ret.filter((e) => e.include),
args
};
}
function scanFile2Html(current, scanFile, filename) {
const reStr = `${scanFile.split(".")[0]}[.](.*)`;
const entryRe = new RegExp(reStr);
return current.replace(entryRe, filename);
}
function getSpecialPageNames(specialPageNames) {
let _specialPageNames;
if (specialPageNames) {
if (specialPageNames.includes(",")) {
_specialPageNames = `{${specialPageNames}}`;
} else {
_specialPageNames = specialPageNames;
}
} else {
_specialPageNames = "**";
}
return _specialPageNames;
}
function getIgnorePageNames(ignorePageNames) {
let _ignorePageNames;
if (ignorePageNames) {
if (ignorePageNames.includes(",")) {
_ignorePageNames = `{${ignorePageNames}}`;
} else {
_ignorePageNames = ignorePageNames;
}
} else {
_ignorePageNames = "";
}
return _ignorePageNames;
}
function getPagesInfo({
defaultEntries,
scanDir,
scanFile,
specialPageNames,
ignorePageNames
}) {
const allFiles = fg.sync(
`${scanDir}/${getSpecialPageNames(specialPageNames)}/${scanFile}`.replace(
"//",
"/"
),
{
ignore: [
`${scanDir}/${getIgnorePageNames(ignorePageNames)}/${scanFile}`.replace(
"//",
"/"
)
]
}
);
const pages = {};
const result = parseFiles(allFiles, defaultEntries);
const { entries } = result;
entries.forEach((entry) => {
const { file, pageName, outputPath } = entry;
pages[pageName] = {
entry: file,
filename: genFileName(pageName, outputPath)
};
});
return pages;
}
function getMPAIO(root, options) {
const { scanFile, filename } = options;
const pages = getPagesInfo(options);
const input = {};
Object.keys(pages).map((key) => {
input[key] = path.resolve(
root,
scanFile2Html(pages[key].entry, scanFile, filename)
);
});
return input;
}
function getHistoryReWriteRuleList(options) {
const { scanDir, scanFile, filename, rewrites } = options;
const list = rewrites;
list.push({
from: /^\/$/,
to: `./${scanDir}/index/${filename}`
});
const pages = getPagesInfo(options);
Object.keys(pages).map((pageName) => {
const to = `./${scanFile2Html(pages[pageName].entry, scanFile, filename)}`;
list.push({
from: new RegExp(`^/${pageName}/index.html/*`),
to
});
list.push({
from: new RegExp(`^/${pageName}/index.html$`),
to
});
list.push({
from: new RegExp(`^/${pageName}.html$`),
to
});
list.push({
from: new RegExp(`^/${pageName}$`),
to
});
});
return list;
}
// ../../vite-plugin/vite-plugin-multi-pages/src/index.ts
function mpa(userOptions = {}) {
const options = {
defaultOpenPage: "/",
scanDir: "src/views",
scanFile: "main.{js,ts,jsx,tsx}",
defaultEntries: "",
filename: "index.html",
rewrites: [],
specialPageNames: "",
ignorePageNames: "",
...userOptions
};
if (!options.scanFile?.includes(".")) {
console.error(
`[${name}]: scanFile should be something like main.ts/main.{js,ts}/index.js/index{ts,tsx}`
);
process.exit(1);
}
return {
name,
enforce: "pre",
config(config) {
const openBool = typeof options.defaultOpenPage === "boolean";
config.build = config.build || {};
config.build.rollupOptions = config.build.rollupOptions || {};
config.build.rollupOptions.input = getMPAIO(
config.root || process.cwd(),
options
);
config.server = config.server || {};
config.server.open = options.defaultOpenPage ? openBool ? getFirstPage(config.build.rollupOptions.input) : options.defaultOpenPage === "/" ? "/" : "/" + options.defaultOpenPage : false;
},
configureServer({ middlewares: app }) {
app.use(
history({
verbose: Boolean(process.env.DEBUG) && process.env.DEBUG !== "false",
disableDotRule: void 0,
htmlAcceptHeaders: ["text/html", "application/xhtml+xml"],
rewrites: getHistoryReWriteRuleList(options)
})
);
}
};
}
export {
mpa as default
};