@alwing/vite-plugin-uni-generate-pages
Version:
用于uniapp cli项目生成pages.json配置文件
108 lines (95 loc) • 3.92 kB
JavaScript
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const { generatePages, generateRouters, watchUniInputDir, watchUniPagesInputDir, walkUnregisteredRouterPath } = require('./utils')
const { parse, compileScript, compileTemplate, walk } = require('@vue/compiler-sfc');
const fs = require('fs-extra');
const { build } = require('vite');
const TS_NODE_TYPES = [
"TSAsExpression",
"TSTypeAssertion",
"TSNonNullExpression",
"TSInstantiationExpression",
"TSSatisfiesExpression"
];
const compiledScript = {};
function uniGeneratePages() {
let uniInputWatcher = null;
let uniPagesInputWatcher = null;
return {
name: "vite-plugin-uni-generate-pages",
enforce: 'pre',
config(config, env) {
generatePages();
generateRouters();
},
onLog(level, log) {
if(level == "warn" && log.plugin == "vite-plugin-uni-generate-pages") {
const frame = "\n " + log.frame.split("\n").join("\n ");
const message = log.message;
log.message = `${message}${frame}`;
log.frame = "";
this.warn(log);
return false;
}
},
async buildEnd(error) {
if(uniInputWatcher) {
await uniInputWatcher.close();
uniInputWatcher = null;
}
if(uniPagesInputWatcher) {
await uniPagesInputWatcher.close();
uniPagesInputWatcher = null;
}
uniInputWatcher = watchUniInputDir();
uniPagesInputWatcher = watchUniPagesInputDir();
},
transform(code, id) {
if(id.endsWith(".vue") && fs.existsSync(id)) {
const parsedVueContent = parse(code);
let scriptNode = null;
if(parsedVueContent.descriptor.script) {
scriptNode = parsedVueContent.descriptor.script;
} else {
scriptNode = parsedVueContent.descriptor.scriptSetup;
}
let scriptStartOffset = 0;
if(scriptNode) {
scriptStartOffset = scriptNode.loc.start.offset;
}
const compileVueScriptResult = compileScript(parsedVueContent.descriptor, {id: id});
compiledScript[id] = {
code,
startOffset: scriptStartOffset,
compileResult: compileVueScriptResult
};
const pluginContext = this;
walkUnregisteredRouterPath(compileVueScriptResult, (node, routerPath) => {
pluginContext.error(`页面路由:${routerPath} 未注册`, scriptStartOffset + node.start);
}, (node, routerKey) => {
pluginContext.error(`路由:Routers.${routerKey} 不存在`, scriptStartOffset + node.start);
})
}
},
shouldTransformCachedModule(options) {
const { id } = options;
const compiled = compiledScript[id];
if(compiled) {
const { code, startOffset, compileResult } = compiled;
if(code && startOffset && compileResult) {
const exceptionNodes = [];
walkUnregisteredRouterPath(compileResult, (node, routerPath) => {
exceptionNodes.push(node);
}, (node, routerKey) => {
exceptionNodes.push(node);
})
if(exceptionNodes.length > 0) {
return true;
}
}
}
return false;
}
};
}
exports.default = uniGeneratePages;
;