vite-plugin-vue-layouts
Version:
Router based layout plugin for Vite and Vue
134 lines (122 loc) • 4.2 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/index.ts
var _path = require('path');
// src/files.ts
var _fastglob = require('fast-glob'); var _fastglob2 = _interopRequireDefault(_fastglob);
// src/utils.ts
var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
function extensionsToGlob(extensions) {
return extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0] || "";
}
function normalizePath(str) {
return str.replace(/\\/g, "/");
}
var debug = _debug2.default.call(void 0, "vite-plugin-layouts");
// src/files.ts
async function getFilesFromPath(path, options) {
const {
exclude,
extensions
} = options;
const ext = extensionsToGlob(extensions);
debug(extensions);
const files = await _fastglob2.default.call(void 0, `**/*.${ext}`, {
ignore: ["node_modules", ".git", "**/__*__/*", ...exclude],
onlyFiles: true,
cwd: path
});
return files;
}
// src/RouteLayout.ts
function getClientCode(importCode, options) {
const code = `
${importCode}
export function setupLayouts(routes) {
return routes.map(route => {
return {
path: route.path,
component: layouts[route.meta?.layout || '${options.defaultLayout}'],
children: [ {...route, path: ''} ],
}
})
}
`;
return code;
}
var RouteLayout_default = getClientCode;
// src/importCode.ts
function getImportCode(files, options) {
const layoutDirs = Array.isArray(options.layoutsDirs) ? options.layoutsDirs : [options.layoutsDirs];
const imports = [];
const head = [];
let id = 0;
for (const __ of files) {
for (const file of __.files) {
const path = __.path.substr(0, 1) === "/" ? `${__.path}/${file}` : `/${__.path}/${file}`;
const parsed = _path.parse.call(void 0, file);
const name = _path.join.call(void 0, parsed.dir, parsed.name).replace(/\\/g, "/");
if (options.importMode(name) === "sync") {
const variable = `__layout_${id}`;
head.push(`import ${variable} from '${path}'`);
imports.push(`'${name}': ${variable},`);
id += 1;
} else {
imports.push(`'${name}': () => import('${path}'),`);
}
}
}
const importsCode = `
${head.join("\n")}
export const layouts = {
${imports.join("\n")}
}`;
return importsCode;
}
// src/index.ts
var MODULE_IDS = ["layouts-generated", "virtual:generated-layouts"];
var MODULE_ID_VIRTUAL = "/@vite-plugin-vue-layouts/generated-layouts";
function defaultImportMode(name) {
if (process.env.VITE_SSG)
return "sync";
return name === "default" ? "sync" : "async";
}
function resolveOptions(userOptions) {
return Object.assign({
defaultLayout: "default",
layoutsDirs: "src/layouts",
extensions: ["vue"],
exclude: [],
importMode: defaultImportMode
}, userOptions);
}
function layoutPlugin(userOptions = {}) {
let config;
const options = resolveOptions(userOptions);
return {
name: "vite-plugin-vue-layouts",
enforce: "pre",
configResolved(_config) {
config = _config;
},
resolveId(id) {
return MODULE_IDS.includes(id) || MODULE_IDS.some((i) => id.startsWith(i)) ? MODULE_ID_VIRTUAL : null;
},
async load(id) {
if (id === MODULE_ID_VIRTUAL) {
const layoutDirs = Array.isArray(options.layoutsDirs) ? options.layoutsDirs : [options.layoutsDirs];
const container = [];
for (const dir of layoutDirs) {
const layoutsDirPath = dir.substr(0, 1) === "/" ? normalizePath(dir) : normalizePath(_path.resolve.call(void 0, config.root, dir));
debug("Loading Layout Dir: %O", layoutsDirPath);
const _f = await getFilesFromPath(layoutsDirPath, options);
container.push({ path: layoutsDirPath, files: _f });
}
const importCode = getImportCode(container, options);
const clientCode = RouteLayout_default(importCode, options);
debug("Client code: %O", clientCode);
return clientCode;
}
}
};
}
var src_default = layoutPlugin;
exports.default = src_default; exports.defaultImportMode = defaultImportMode;