UNPKG

@tarojs/plugin-generator

Version:
182 lines 7.77 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateConfig = void 0; /* eslint-disable no-console */ const generator_1 = __importDefault(require("@babel/generator")); const parser = __importStar(require("@babel/parser")); const traverse_1 = __importDefault(require("@babel/traverse")); const t = __importStar(require("@babel/types")); const dedent_1 = __importDefault(require("dedent")); const ast_1 = require("../../utils/ast"); const error_1 = require("../../utils/error"); const createModifiedConfigError = (compilerType) => new error_1.GeneratorError({ type: error_1.GeneratorErrorType.modifyConfig, message: compilerType === 'vite' ? (0, dedent_1.default)(` { h5: { legacy: true, } } `) : (0, dedent_1.default)(` { mini: { compile: { include: [ filename => /node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)/.test(filename) ] } }, h5: { compile: { include: [ filename => /node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)/.test(filename) ] } } } `), }); /** * 更新配置文件 */ async function updateConfig(options) { const { ctx, compilerType } = options; const { fs } = ctx.helper; const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }); const ast = parser.parse(sourceCode, { sourceType: 'module', plugins: ['typescript'] }); insertBrowserlistEnv(ast); let miniUpdated = false; let h5Updated = false; (0, traverse_1.default)(ast, { ObjectProperty: (o) => { const { node } = o; if (t.isIdentifier(node.key) && node.key.name === 'mini' && t.isObjectExpression(node.value)) { if (compilerType === 'webpack5') { modifyWebpackCompileConfig(node.value); } else { // vite-runner 小程序看着不支持 legacy 字段 } miniUpdated = true; } if (t.isIdentifier(node.key) && node.key.name === 'h5' && t.isObjectExpression(node.value)) { if (compilerType === 'webpack5') { modifyWebpackCompileConfig(node.value); } else { modifyViteCompileConfig(node.value); } h5Updated = true; } }, }); if (!miniUpdated || !h5Updated) { throw createModifiedConfigError(compilerType); } const { code } = (0, generator_1.default)(ast); await fs.outputFile(ctx.paths.configPath, code, { encoding: 'utf-8' }); console.log('✅ 更新配置文件成功\n'); } exports.updateConfig = updateConfig; function modifyViteCompileConfig(config) { const legacyProp = config.properties.find((p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'legacy'); if (!legacyProp) { config.properties.push(t.objectProperty(t.identifier('legacy'), t.booleanLiteral(true))); } else if (t.isObjectProperty(legacyProp)) { legacyProp.value = t.booleanLiteral(true); } else { throw createModifiedConfigError('vite'); } } function modifyWebpackCompileConfig(config) { (0, ast_1.ensureNestedObjectProperty)(config, ['compile']); const compileProp = config.properties.find((p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'compile'); if (compileProp && t.isObjectExpression(compileProp.value)) { const includeProp = compileProp.value.properties.find((p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'include'); const include = t.arrowFunctionExpression([t.identifier('filename')], t.callExpression(t.memberExpression(t.regExpLiteral(String.raw `node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`, ''), t.identifier('test')), [t.identifier('filename')])); include.params[0].typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword()); if (!includeProp) { compileProp.value.properties.push(t.objectProperty(t.identifier('include'), t.arrayExpression([include]))); } else if (t.isObjectProperty(includeProp) && t.isArrayExpression(includeProp.value)) { includeProp.value.elements.push(include); } else { throw createModifiedConfigError('webpack5'); } } } /** * 往配置文件中插入: * process.env.BROWSERSLIST_ENV = process.env.NODE_ENV */ function insertBrowserlistEnv(ast) { let hasEnv = false; (0, traverse_1.default)(ast, { AssignmentExpression(path) { const { node } = path; // 判断左侧是 process.env.BROWSERSLIST_ENV const isLeftMatch = node.left.type === 'MemberExpression' && node.left.object.type === 'MemberExpression' && node.left.object.object.type === 'Identifier' && node.left.object.object.name === 'process' && node.left.object.property.type === 'Identifier' && node.left.object.property.name === 'env' && node.left.property.type === 'Identifier' && node.left.property.name === 'BROWSERSLIST_ENV'; // 判断右侧是 process.env.NODE_ENV const isRightMatch = node.right.type === 'MemberExpression' && node.right.object.type === 'MemberExpression' && node.right.object.object.type === 'Identifier' && node.right.object.object.name === 'process' && node.right.object.property.type === 'Identifier' && node.right.object.property.name === 'env' && node.right.property.type === 'Identifier' && node.right.property.name === 'NODE_ENV'; if (isLeftMatch && isRightMatch) { hasEnv = true; path.stop(); } }, Program: { exit(program) { if (!hasEnv) { const env = parser.parseExpression('process.env.BROWSERSLIST_ENV = process.env.NODE_ENV'); const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)); program.node.body.splice(injectIndex, 0, env); } }, }, }); } //# sourceMappingURL=config.js.map