@aiot-toolkit/packager
Version:
@aiot-toolkit/packager
3 lines (2 loc) • 5.64 kB
JavaScript
"use strict";const fs=require("fs"),parser=require("@babel/parser"),generate=require("@babel/generator").default,traverse=require("@babel/traverse").default,types=require("@babel/types"),loaderUtils=require("loader-utils"),{colorconsole:colorconsole}=require("@aiot-toolkit/shared-utils"),{parseFragmentsWithCache:parseFragmentsWithCache}=require("@aiot-toolkit/compiler"),{compileOptionsObject:compileOptionsObject}=require("@aiot-toolkit/shared-utils/compilation-config"),useNewGenerate=!0;function generateVelaFn(e=!1){return parser.parseExpression('function(){\n this.$options = this._options || this.$options;\n if (this.$options._descriptor) {\n this.$options._descriptor["back"] = {\n access: "public",\n };\n }\n global.CASE_TEST_START = global.CASE_TEST_START || 1000;\n global.qat = new VelaQuickappTest();\n setTimeout(() => {\n typeof fnTestCase === \'function\' && fnTestCase(this)\n qat.run(() => {\n if (this.back !== "false") {\n console.info("拥有关联测试用例,测试完毕,返回到之前的页面");\n function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n var _system = _interopRequireDefault($app_require$(\'@app-module/system.router\'));\n _system.default.back();\n }\n });\n }, global.CASE_TEST_START);\n }').body}function generateFn(e=!1){let t=`function () {\n this.$options = this._options || this.$options\n if (this.$options._descriptor) {\n this.$options._descriptor['back'] = { access: 'public' }\n }\n\n // 测试执行:开始时间,结束事件\n global.CASE_TEST_START = global.CASE_TEST_START || 1000\n global.CASE_TEST_TIMEOUT = global.CASE_TEST_TIMEOUT || 2000\n\n global.mocha = new Mocha({ reporter: 'json', timeout: global.CASE_TEST_TIMEOUT })\n mocha.ui('bdd')\n mocha.suite.emit('pre-require', global, null, mocha)\n setTimeout(() => {\n // 记录测试用例\n typeof fnTestCase === 'function' && fnTestCase(this)\n const mochaRunner = mocha.run(() => {\n if (mochaRunner) {\n // 标题\n mochaRunner.testResults.stats.title = mocha.suite.suites && mocha.suite.suites[0] && mocha.suite.suites[0].title\n console.info('testResults: ', JSON.stringify(mochaRunner.testResults))\n pushData('pageTestList', mochaRunner.testResults)\n\n // 显示结果\n const stats = mochaRunner.testResults.stats\n ${compileOptionsObject.enableMirtos?"":"this.$page.setTitleBar({ text: '通过/全部: ' + stats.passes + '/' + stats.tests })"}\n }\n\n // 是否返回\n if (this.back !== 'false') {\n console.info('拥有关联测试用例,测试完毕,返回到之前的页面')\n ${compileOptionsObject.enableMirtos?"function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \n var _system = _interopRequireDefault($app_require$('@app-module/system.router'));\n _system.default.back();":"history.back()"}\n }\n })\n }, global.CASE_TEST_START)\n }`;return e||(t=`function () {\n this.$options = this._options || this.$options\n // 允许back被外部覆盖\n if (this.$options._descriptor) {\n this.$options._descriptor['back'] = { access: 'public' }\n }\n\n // 测试执行:开始时间,结束事件\n global.CASE_TEST_START = global.CASE_TEST_START || 1000\n global.CASE_TEST_TIMEOUT = global.CASE_TEST_TIMEOUT || 2000\n\n setTimeout(() => {\n // 是否返回\n if (this.back !== 'false') {\n console.info('没有关联测试用例,直接返回到之前的页面')\n ${compileOptionsObject.enableMirtos?"":"history.back()"}\n }\n }, global.CASE_TEST_START)\n }`),parser.parseExpression(t).body}module.exports=function(e){const t=loaderUtils.parseQuery(this.resourceQuery||"?"),s=loaderUtils.getOptions(this),n=s&&s.hookName||"onCreate",o=parseFragmentsWithCache(e).script[0]||{content:""},i=this.resourcePath.replace(/([\\/])(src)([\\/])/,((...e)=>e[1]+"test"+e[3])).replace(/\.\w{2,5}$/,".js"),r=parser.parse(o.content,{sourceType:"module",plugins:["jsx","dynamicImport"]});if("app"===t.uxType){const e="@aiot-toolkit/packager/lib/runtime/velaApp.js",t=types.importDeclaration([],types.stringLiteral(e));r.program.body.unshift(t)}else{if("page"!==t.uxType)return e;{const e=fs.existsSync(i),s=i.match(/[\\/]test[\\/](.*)/)[1];if(e){const o=types.importDeclaration([types.importDefaultSpecifier(types.identifier("fnTestCase"))],types.stringLiteral(i));r.program.body.unshift(o),"script"===t.type&&colorconsole.info(`[INFO] Script injection test case:${s}`),traverse(r,{ExportDefaultDeclaration(s){if("page"!==t.uxType)return;const o=generateVelaFn(e);let i;const r=s.node.declaration;if("ObjectExpression"!==r.type){const e=s.scope.generateUidIdentifier("replace");s.node.declaration=e;const t=types.variableDeclaration("const",[types.variableDeclarator(e,r)]),i=types.assignmentExpression("=",types.memberExpression(e,types.identifier(n)),types.functionExpression(types.identifier(n),[],o));return s.insertBefore(t),void s.insertBefore(i)}i=r.properties;let a,p=!1;if(i.forEach(((e,t)=>{e.key.name===n&&!0===e.method&&(a=t,p=!0)})),p)return void(i[a].body.body=i[a].body.body.concat(o.body));const c=types.identifier(n),l=o,u=types.objectMethod("method",c,[],l);s.node.declaration.properties.push(u)}})}}}return e=e.replace(/<script.*?>([\s\S]+)<\/script>/,(function(){return`<script>\n${generate(r).code}\n<\/script>`}))};
//# sourceMappingURL=inject-suite-loader.js.map