UNPKG

@zakijs/plugin-compiler-alipay

Version:

mor complier plugin for alipay mini program

101 lines 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("@morjs/utils"); const constants_1 = require("../constants"); /** * 支付宝 sjs 文件转译 */ class AlipayCompilerSjsParserPlugin { constructor() { this.name = 'AlipayCompilerSjsParserPlugin'; } apply(runner) { runner.hooks.beforeRun.tap(this.name, () => { const { sourceType, target } = runner.userConfig; // 仅当 sjs 是 支付宝 源码 且 编译目标不是 支付宝小程序 时执行该插件 if (sourceType !== utils_1.SourceTypes.alipay) return; if (sourceType === target) return; if ((0, constants_1.isSimilarTarget)(target)) return; runner.hooks.beforeBuildEntries.tap(this.name, (entryBuilder) => { this.entryBuilder = entryBuilder; }); runner.hooks.sjsParser.tap(this.name, (transformers, options) => { this.removeEsModuleMarkAndFixVoidZeroExpression(transformers); if (options.fileInfo.content.includes('import') || options.fileInfo.content.includes('export')) { this.transformESModuleToCommonjs(transformers); } return transformers; }); }); } transformESModuleToCommonjs(transformers) { transformers.before.push((0, utils_1.tsTransformerFactory)((node, ctx) => { var _a; const factory = ctx.factory; /** * export {} 替换为 module.exports */ if (utils_1.typescript.isExportAssignment(node)) { const expression = node.expression; return factory.createExpressionStatement(factory.createBinaryExpression(factory.createPropertyAccessExpression(factory.createIdentifier('module'), factory.createIdentifier('exports')), factory.createToken(utils_1.typescript.SyntaxKind.EqualsToken), expression)); } /** * 处理 export default function name() {} 的情况 * 原因: 微信不支持 exports.default = name 这种语法,会报错 * 这里转换为 module.exports = function name() {} */ if (utils_1.typescript.isFunctionDeclaration(node) && ((_a = node.modifiers) === null || _a === void 0 ? void 0 : _a.length)) { const exportKeyword = node.modifiers[0]; const exportDefaultKeyword = node.modifiers[1]; if (utils_1.typescript.isToken(exportKeyword) && exportKeyword.kind === utils_1.typescript.SyntaxKind.ExportKeyword && utils_1.typescript.isToken(exportDefaultKeyword) && exportDefaultKeyword.kind === utils_1.typescript.SyntaxKind.DefaultKeyword) { return factory.createExpressionStatement(factory.createBinaryExpression(factory.createPropertyAccessExpression(factory.createIdentifier('module'), factory.createIdentifier('exports')), factory.createToken(utils_1.typescript.SyntaxKind.EqualsToken), factory.createFunctionExpression(undefined, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body))); } } return node; })); } /** * 支付宝小程序的 sjs 是 esmodule * 这里主要是用于处理 esmodule 转换为 commonjs 之后的兼容性问题 */ removeEsModuleMarkAndFixVoidZeroExpression(transformers) { transformers.after.push((0, utils_1.tsTransformerFactory)((node, ctx) => { /** * 移除表达式: * Object.defineProperty(exports, "__esModule", { value: true }) */ if (utils_1.typescript.isExpressionStatement(node) && utils_1.typescript.isCallExpression(node.expression) && utils_1.typescript.isPropertyAccessExpression(node.expression.expression) && utils_1.typescript.isIdentifier(node.expression.expression.expression) && node.expression.expression.expression.escapedText === 'Object' && utils_1.typescript.isIdentifier(node.expression.expression.name) && node.expression.expression.name.escapedText === 'defineProperty' && node.expression.arguments.length && utils_1.typescript.isIdentifier(node.expression.arguments[0]) && node.expression.arguments[0].escapedText === 'exports') { return undefined; } /* * 在微信的 wxs 中, 存在如下 BUG * x = a === void 0 ? [] : a 这样的三目运算符会返回 true 而不是表达式中的值 * 经过测试是 void 0 引起的,为了兼容这个问题,统一改为 undefined */ if (utils_1.typescript.isVoidExpression(node) && utils_1.typescript.isNumericLiteral(node.expression) && node.expression.text === '0') { return ctx.factory.createIdentifier('undefined'); } return node; })); } } exports.default = AlipayCompilerSjsParserPlugin; //# sourceMappingURL=SjsParserPlugin.js.map