@tarojs/plugin-generator
Version:
Taro 生成器插件
182 lines • 7.77 kB
JavaScript
;
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