UNPKG

@alwing/vite-plugin-uni-generate-pages

Version:

用于uniapp cli项目生成pages.json配置文件

108 lines (95 loc) 3.92 kB
"use strict"; 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;