UNPKG

@zakijs/plugin-compiler-alipay

Version:

mor complier plugin for alipay mini program

207 lines (194 loc) 7.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("@morjs/utils"); const constants_1 = require("../constants"); /** * 支付宝 template 文件转译 */ class AlipayCompilerTemplateParserPlugin { constructor() { this.name = 'AlipayCompilerTemplateParserPlugin'; } apply(runner) { let entryHelper; runner.hooks.entryBuilder.tap(this.name, function (e) { entryHelper = e; }); runner.hooks.beforeRun.tap(this.name, () => { var _a, _b, _c, _d, _e, _f; const { sourceType, target, globalNameSuffix } = runner.userConfig; // 仅当 模版文件 是 支付宝 源码 且 编译目标不是 支付宝小程序 时执行该插件 if (sourceType !== utils_1.SourceTypes.alipay) return; if (sourceType === target) return; if ((0, constants_1.isSimilarTarget)(target)) return; const compilerPlugins = runner.methods.invoke('getComposedCompilerPlugins'); const isSupportSjsContent = (_a = compilerPlugins === null || compilerPlugins === void 0 ? void 0 : compilerPlugins.isSupportSjsContent) === null || _a === void 0 ? void 0 : _a[target]; const sjsTagName = (_b = compilerPlugins === null || compilerPlugins === void 0 ? void 0 : compilerPlugins.sjsTagName) === null || _b === void 0 ? void 0 : _b[target]; const sjsSrcAttrName = (_c = compilerPlugins === null || compilerPlugins === void 0 ? void 0 : compilerPlugins.sjsSrcAttrName) === null || _c === void 0 ? void 0 : _c[target]; const sjsModuleAttrName = (_d = compilerPlugins === null || compilerPlugins === void 0 ? void 0 : compilerPlugins.sjsModuleAttrName) === null || _d === void 0 ? void 0 : _d[target]; const sjsFileType = (_f = (_e = compilerPlugins === null || compilerPlugins === void 0 ? void 0 : compilerPlugins.fileType) === null || _e === void 0 ? void 0 : _e[target]) === null || _f === void 0 ? void 0 : _f.sjs; if (!isSupportSjsContent) return; if (!sjsTagName) return; if (!sjsModuleAttrName) return; if (!sjsSrcAttrName) return; const sjsFileName = `${(0, utils_1.MOR_HELPER_FILE)(globalNameSuffix)}${sjsFileType}`; const sjsHelperName = 'morSjs'; // 判断是否存在 morSjs.xxx( 方法调用 const sjsHelperFnRegExp = new RegExp(`${sjsHelperName}\\.[a-zA-Z]+\\(`); const sjsHelperVariableStr = `${sjsModuleAttrName}='${sjsHelperName}'`; const sjsHelperVariableRegExp = new RegExp(sjsHelperVariableStr.replace(/\./g, '\\.').replace(/'/g, '(\'|")')); runner.hooks.postprocessorParser.tap(this.name, (content, options) => { if (options.fileInfo.entryFileType === utils_1.EntryFileType.template && content && sjsHelperFnRegExp.test(content) && // 确保不重复引入辅助 sjs 文件,否则会导致 morSjs 多次声明 !sjsHelperVariableRegExp.test(content)) { // 追加 sjs 文件 this.addSjsHelperSupport(entryHelper, sjsFileName); // 计算相对引用路径 const importPath = entryHelper.getRelativePathFor(entryHelper.getEntryByFilePath(options.fileInfo.path), { fullEntryName: sjsFileName, entryName: sjsFileName }, true); // 在文件头部注入 sjs 引用 return `<${sjsTagName} ${sjsHelperVariableStr} ${sjsSrcAttrName}='${importPath}'></${sjsTagName}>\n${content}`; } return content; }); }); } addSjsHelperSupport(entryHelper, fileName) { if (entryHelper.additionalEntrySources.has(fileName)) return; entryHelper.setEntrySource(fileName, ` // 驼峰转中划线 // 支付宝不支持正则 function hump2dash(humpStr) { var result = []; var len = humpStr.length; for (var i = 0; i < len; i++) { var cur = humpStr[i]; var unicode = humpStr.charCodeAt(i); // unicode 大于 65 小于 90 为大写字符 if (unicode >= 65 && unicode <= 90) { result.push(("-" + cur).toLowerCase()); } else { result.push(cur); } } return result.join(''); } // 微信无法使用 Object.keys for of for in 遍历对象 // 序列化后自行实现 function objectKeys(obj) { var jsonString = JSON.stringify(obj); var step = 0; var nested = 0; var keys = []; // 获取当前的 key,从 " 的下一个字符 到 " 的前一个字符 function getCurrentKey(str, begin) { var len = str.length; var currentKeyChar = []; for (var i = begin; i < len; i++) { if (str[i] !== '"') currentKeyChar.push(str[i]); if (str[i] === '"') return currentKeyChar.join(''); } return ''; } function walk() { var targetChar = jsonString[step]; if (!targetChar) return; // 从 {" 的下一个字符开始 if (targetChar === '{' && nested === 0) { nested += 1; // 层级 + 1 var currentKey = getCurrentKey(jsonString, step + 2); if (currentKey) keys.push(currentKey); step += currentKey.length + 2; walk(); return; } // 从 ," 的下一个字符开始 if (targetChar === ',' && jsonString[step + 1] === '"') { var currentKey = getCurrentKey(jsonString, step + 2); if (currentKey) keys.push(currentKey); step += currentKey.length + 2; walk(); return; } // 匹配到当前层级的结束 if (targetChar === '}') nested -= 1; step += 1; walk(); } walk(step); return keys; } // sjs 脚本支持度有限,手动实现 assign function assign(target, from) { objectKeys(from).forEach(function (key) { target[key] = from[key]; }); return target; } // 对象样式支持 function s(obj) { if (!obj) return obj; if (obj.constructor === 'Object') { return objectKeys(obj).map(function (key) { return hump2dash(key) + ": " + obj[key] + ";"; }).join(''); } return obj; } // 判断类型 function toType(obj) { return typeof obj; } // 小写转换 function toLowerCase(str) { return typeof str === 'string' ? str.toLowerCase() : ''; } // 大写转换 function toUpperCase(str) { return typeof str === 'string' ? str.toUpperCase() : ''; } // 字符串或数组的 slice 方法支持 function slice(arrOrStr, start, end) { return arrOrStr.slice(start, end); } // 字符串或数组的 includes 方法支持 function includes(arrOrStr, part) { return arrOrStr.indexOf(part) !== -1; } // 字符串或数组的 indexOf 方法支持 function indexOf(arrOrStr, part) { return arrOrStr.indexOf(part); } // 字符串或数组的 includes 方法支持 function toString(str) { return str.toString(); } module.exports = { s: s, toType: toType, toLowerCase: toLowerCase, toUpperCase: toUpperCase, slice: slice, includes: includes, indexOf: indexOf, toString: toString }; `, 'additional'); } } exports.default = AlipayCompilerTemplateParserPlugin; //# sourceMappingURL=TemplateParserPlugin.js.map