vite-plugin-use-modules
Version:
92 lines (82 loc) • 2.17 kB
JavaScript
import { posix } from 'path';
import { getPackageInfo } from 'local-pkg';
function normalizePath(path) {
path = path.startsWith("/") ? path : "/" + path;
return posix.normalize(path);
}
async function isVite2() {
const info = await getPackageInfo("vite");
if (info) {
return /^.?2/.test(info.version);
}
return false;
}
function defaultNormalize(target) {
return `'${target}/*.[tj]s'`;
}
async function createVirtualGlob(glob) {
return await isVite2() ? `import.meta.globEager(${glob})` : `import.meta.glob(${glob}, { eager: true })`;
}
async function createVirtualModule(glob) {
return `
export const modules = ${await createVirtualGlob(glob)}
export const useModules = app => {
Object.values(modules).forEach(module => {
if (!module.default) {
return
}
if (typeof module.default === 'function') {
module.default(app)
return
}
if (Array.isArray(module.default)) {
app.use(...module.default)
return
}
app.use(module.default)
})
return app
}`;
}
function insertAutoCode(code) {
return code.replace(
/^/,
`import { useModules } from 'virtual:modules'
`
).replace(/(createApp\(.*?\))/, "useModules($1)");
}
function defaultTransform(code, id) {
if (/src\/main\.(js|ts)$/.test(id)) {
return insertAutoCode(code);
}
return code;
}
function index(options) {
let {
auto = false,
target = "src/modules",
normalize = defaultNormalize
} = options || {};
const virtualModuleId = "virtual:modules";
const resolvedVirtualModuleId = "\0" + virtualModuleId;
target = normalizePath(target);
if (auto === true) {
auto = defaultTransform;
}
return {
name: "vite-plugin-use-modules",
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
const glob = normalize(target);
return createVirtualModule(glob);
}
},
transform: auto === false ? void 0 : auto
};
}
export { index as default, defaultTransform, insertAutoCode };