@modern-js/plugin-testing 1.5.7 → 1.7.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/dist/js/modern/base/config/index.js +18 -0
- package/dist/js/modern/base/config/patches/assetsModule.js +11 -0
- package/dist/js/modern/base/config/patches/filemock.js +1 -0
- package/dist/js/modern/base/config/patches/index.js +13 -0
- package/dist/js/modern/base/config/patches/transformer.js +49 -0
- package/dist/js/modern/base/config/resolver.js +15 -0
- package/dist/js/modern/base/config/testConfigOperator.js +86 -0
- package/dist/js/modern/base/config/transformer/babelTransformer.js +12 -0
- package/dist/js/modern/base/hook.js +7 -0
- package/dist/js/modern/base/index.js +6 -0
- package/dist/js/modern/base/runJest.js +94 -0
- package/dist/js/modern/base/types/index.js +0 -0
- package/dist/js/modern/base/utils.js +59 -0
- package/dist/js/modern/cli/bff/app.js +43 -0
- package/dist/js/modern/cli/bff/constant.js +1 -0
- package/dist/js/modern/cli/bff/env.js +28 -0
- package/dist/js/modern/cli/bff/index.js +113 -0
- package/dist/js/modern/cli/bff/mockAPI.js +111 -0
- package/dist/js/modern/cli/bff/setup.js +44 -0
- package/dist/js/modern/cli/bff/utils/index.js +25 -0
- package/dist/js/modern/cli/index.js +2 -2
- package/dist/js/modern/cli/test.js +1 -1
- package/dist/js/modern/runtime-testing/app.js +1 -1
- package/dist/js/modern/runtime-testing/base.js +1 -1
- package/dist/js/modern/runtime-testing/request.js +17 -0
- package/dist/js/node/base/config/index.js +31 -0
- package/dist/js/node/base/config/patches/assetsModule.js +20 -0
- package/dist/js/node/base/config/patches/filemock.js +8 -0
- package/dist/js/node/base/config/patches/index.js +24 -0
- package/dist/js/node/base/config/patches/transformer.js +58 -0
- package/dist/js/node/base/config/resolver.js +20 -0
- package/dist/js/node/base/config/testConfigOperator.js +93 -0
- package/dist/js/node/base/config/transformer/babelTransformer.js +23 -0
- package/dist/js/node/base/hook.js +18 -0
- package/dist/js/node/base/index.js +73 -0
- package/dist/js/node/base/runJest.js +109 -0
- package/dist/js/node/base/types/index.js +0 -0
- package/dist/js/node/base/utils.js +79 -0
- package/dist/js/node/cli/bff/app.js +59 -0
- package/dist/js/node/cli/bff/constant.js +8 -0
- package/dist/js/node/cli/bff/env.js +42 -0
- package/dist/js/node/cli/bff/index.js +132 -0
- package/dist/js/node/cli/bff/mockAPI.js +126 -0
- package/dist/js/node/cli/bff/setup.js +53 -0
- package/dist/js/node/cli/bff/utils/index.js +38 -0
- package/dist/js/node/cli/index.js +7 -7
- package/dist/js/node/cli/test.js +2 -2
- package/dist/js/node/runtime-testing/app.js +2 -2
- package/dist/js/node/runtime-testing/base.js +2 -2
- package/dist/js/node/runtime-testing/request.js +24 -0
- package/dist/js/treeshaking/base/config/index.js +40 -0
- package/dist/js/treeshaking/base/config/patches/assetsModule.js +11 -0
- package/dist/js/treeshaking/base/config/patches/filemock.js +1 -0
- package/dist/js/treeshaking/base/config/patches/index.js +85 -0
- package/dist/js/treeshaking/base/config/patches/transformer.js +45 -0
- package/dist/js/treeshaking/base/config/resolver.js +17 -0
- package/dist/js/treeshaking/base/config/testConfigOperator.js +91 -0
- package/dist/js/treeshaking/base/config/transformer/babelTransformer.js +12 -0
- package/dist/js/treeshaking/base/hook.js +7 -0
- package/dist/js/treeshaking/base/index.js +6 -0
- package/dist/js/treeshaking/base/runJest.js +194 -0
- package/dist/js/treeshaking/base/types/index.js +0 -0
- package/dist/js/treeshaking/base/utils.js +60 -0
- package/dist/js/treeshaking/cli/bff/app.js +92 -0
- package/dist/js/treeshaking/cli/bff/constant.js +1 -0
- package/dist/js/treeshaking/cli/bff/env.js +98 -0
- package/dist/js/treeshaking/cli/bff/index.js +149 -0
- package/dist/js/treeshaking/cli/bff/mockAPI.js +115 -0
- package/dist/js/treeshaking/cli/bff/setup.js +76 -0
- package/dist/js/treeshaking/cli/bff/utils/index.js +22 -0
- package/dist/js/treeshaking/cli/index.js +2 -2
- package/dist/js/treeshaking/cli/test.js +1 -1
- package/dist/js/treeshaking/runtime-testing/app.js +1 -1
- package/dist/js/treeshaking/runtime-testing/base.js +1 -1
- package/dist/js/treeshaking/runtime-testing/request.js +24 -0
- package/dist/types/base/config/index.d.ts +124 -0
- package/dist/types/base/config/patches/assetsModule.d.ts +6 -0
- package/dist/types/base/config/patches/filemock.d.ts +3 -0
- package/dist/types/base/config/patches/index.d.ts +2 -0
- package/dist/types/base/config/patches/transformer.d.ts +6 -0
- package/dist/types/base/config/resolver.d.ts +1 -0
- package/dist/types/base/config/testConfigOperator.d.ts +248 -0
- package/dist/types/base/config/transformer/babelTransformer.d.ts +2 -0
- package/dist/types/base/hook.d.ts +13 -0
- package/dist/types/base/index.d.ts +6 -0
- package/dist/types/base/runJest.d.ts +22 -0
- package/dist/types/base/types/index.d.ts +1 -0
- package/dist/types/base/utils.d.ts +12 -0
- package/dist/types/cli/bff/app.d.ts +8 -0
- package/dist/types/cli/bff/constant.d.ts +1 -0
- package/dist/types/cli/bff/env.d.ts +6 -0
- package/dist/types/cli/bff/index.d.ts +19 -0
- package/dist/types/cli/bff/mockAPI.d.ts +3 -0
- package/dist/types/cli/bff/setup.d.ts +1 -0
- package/dist/types/cli/bff/utils/index.d.ts +1 -0
- package/dist/types/cli/index.d.ts +1 -1
- package/dist/types/runtime-testing/base.d.ts +1 -1
- package/dist/types/runtime-testing/request.d.ts +4 -0
- package/package.json +47 -11
@@ -0,0 +1,60 @@
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
2
|
+
import fs from 'fs';
|
3
|
+
import path from 'path';
|
4
|
+
import { createDebugger } from '@modern-js/utils';
|
5
|
+
export var debug = createDebugger('test');
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Read `compilerOptions` in the current pwd's tsconfig.json file
|
9
|
+
*/
|
10
|
+
export var readCompilerOptions = function readCompilerOptions() {
|
11
|
+
var pwd = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : process.cwd();
|
12
|
+
var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'tsconfig.json';
|
13
|
+
var tsConfig = {};
|
14
|
+
var extendedCompilerOptions = {};
|
15
|
+
var tsconfigFile = '';
|
16
|
+
|
17
|
+
try {
|
18
|
+
var maybeTsconfigFile = path.join(pwd, filename);
|
19
|
+
|
20
|
+
if (fs.existsSync(maybeTsconfigFile)) {
|
21
|
+
tsconfigFile = maybeTsconfigFile;
|
22
|
+
} else {
|
23
|
+
tsconfigFile = require.resolve(filename);
|
24
|
+
}
|
25
|
+
|
26
|
+
var _require$parseConfigF = require('typescript').parseConfigFileTextToJson(tsconfigFile, fs.readFileSync(tsconfigFile, 'utf8'));
|
27
|
+
|
28
|
+
tsConfig = _require$parseConfigF.config;
|
29
|
+
} catch (e) {
|
30
|
+
return {};
|
31
|
+
}
|
32
|
+
|
33
|
+
if (tsConfig["extends"]) {
|
34
|
+
extendedCompilerOptions = readCompilerOptions(path.dirname(tsconfigFile), tsConfig["extends"]);
|
35
|
+
}
|
36
|
+
|
37
|
+
return _objectSpread(_objectSpread({}, extendedCompilerOptions), tsConfig.compilerOptions);
|
38
|
+
};
|
39
|
+
export var getModuleNameMapper = function getModuleNameMapper(alias) {
|
40
|
+
return Object.keys(alias).reduce(function (memo, cur) {
|
41
|
+
var aliasValue = Array.isArray(alias[cur]) ? alias[cur] : [alias[cur]];
|
42
|
+
var isFile = aliasValue.some(function (s) {
|
43
|
+
return s.endsWith('.js');
|
44
|
+
}); // It's special for if using @modern-js/runtime alias other module @modern-js/runtime/model would not work.
|
45
|
+
|
46
|
+
if (cur === '@modern-js/runtime$') {
|
47
|
+
memo[".+".concat(cur)] = aliasValue[0];
|
48
|
+
return memo;
|
49
|
+
}
|
50
|
+
|
51
|
+
if (isFile) {
|
52
|
+
memo[cur] = aliasValue[0];
|
53
|
+
}
|
54
|
+
|
55
|
+
var key = "^".concat(cur, "/(.*)$");
|
56
|
+
var value = path.normalize("".concat(aliasValue, "/$1"));
|
57
|
+
memo[key] = value;
|
58
|
+
return memo;
|
59
|
+
}, {});
|
60
|
+
};
|
@@ -0,0 +1,92 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
3
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
4
|
+
import { Server } from '@modern-js/server';
|
5
|
+
var store = new AsyncLocalStorage();
|
6
|
+
export var isInHandler = function isInHandler() {
|
7
|
+
return Boolean(store.getStore());
|
8
|
+
};
|
9
|
+
var server = null;
|
10
|
+
|
11
|
+
var createApp = /*#__PURE__*/function () {
|
12
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(pwd, config, plugins, routes) {
|
13
|
+
var app;
|
14
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
15
|
+
while (1) {
|
16
|
+
switch (_context.prev = _context.next) {
|
17
|
+
case 0:
|
18
|
+
if (server) {
|
19
|
+
_context.next = 5;
|
20
|
+
break;
|
21
|
+
}
|
22
|
+
|
23
|
+
config.output.path = './';
|
24
|
+
server = new Server({
|
25
|
+
apiOnly: true,
|
26
|
+
dev: {
|
27
|
+
watch: false
|
28
|
+
},
|
29
|
+
pwd: pwd,
|
30
|
+
config: config,
|
31
|
+
plugins: plugins,
|
32
|
+
routes: routes
|
33
|
+
});
|
34
|
+
_context.next = 5;
|
35
|
+
return server.init();
|
36
|
+
|
37
|
+
case 5:
|
38
|
+
app = server.getRequestHandler();
|
39
|
+
return _context.abrupt("return", app);
|
40
|
+
|
41
|
+
case 7:
|
42
|
+
case "end":
|
43
|
+
return _context.stop();
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}, _callee);
|
47
|
+
}));
|
48
|
+
|
49
|
+
return function createApp(_x, _x2, _x3, _x4) {
|
50
|
+
return _ref.apply(this, arguments);
|
51
|
+
};
|
52
|
+
}();
|
53
|
+
|
54
|
+
var getApp = function getApp() {
|
55
|
+
if (!server) {
|
56
|
+
throw new Error('please createApp first');
|
57
|
+
}
|
58
|
+
|
59
|
+
return server.getRequestHandler();
|
60
|
+
};
|
61
|
+
|
62
|
+
var closeServer = /*#__PURE__*/function () {
|
63
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
64
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
65
|
+
while (1) {
|
66
|
+
switch (_context2.prev = _context2.next) {
|
67
|
+
case 0:
|
68
|
+
if (server) {
|
69
|
+
_context2.next = 2;
|
70
|
+
break;
|
71
|
+
}
|
72
|
+
|
73
|
+
throw new Error('please createApp first');
|
74
|
+
|
75
|
+
case 2:
|
76
|
+
_context2.next = 4;
|
77
|
+
return server.close();
|
78
|
+
|
79
|
+
case 4:
|
80
|
+
case "end":
|
81
|
+
return _context2.stop();
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}, _callee2);
|
85
|
+
}));
|
86
|
+
|
87
|
+
return function closeServer() {
|
88
|
+
return _ref2.apply(this, arguments);
|
89
|
+
};
|
90
|
+
}();
|
91
|
+
|
92
|
+
export { createApp, getApp, closeServer };
|
@@ -0,0 +1 @@
|
|
1
|
+
export var bff_info_key = 'modern_bff_info';
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
3
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
4
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
5
|
+
import _assertThisInitialized from "@babel/runtime/helpers/esm/assertThisInitialized";
|
6
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
7
|
+
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
8
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
9
|
+
import NodeEnvironment from 'jest-environment-node';
|
10
|
+
import { createApp } from "./app";
|
11
|
+
import { bff_info_key } from "./constant";
|
12
|
+
|
13
|
+
var _default = /*#__PURE__*/function (_NodeEnvironment) {
|
14
|
+
_inherits(_default, _NodeEnvironment);
|
15
|
+
|
16
|
+
var _super = _createSuper(_default);
|
17
|
+
|
18
|
+
function _default() {
|
19
|
+
var _this;
|
20
|
+
|
21
|
+
_classCallCheck(this, _default);
|
22
|
+
|
23
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
24
|
+
args[_key] = arguments[_key];
|
25
|
+
}
|
26
|
+
|
27
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
28
|
+
|
29
|
+
_defineProperty(_assertThisInitialized(_this), "app", void 0);
|
30
|
+
|
31
|
+
return _this;
|
32
|
+
}
|
33
|
+
|
34
|
+
_createClass(_default, [{
|
35
|
+
key: "setup",
|
36
|
+
value: function () {
|
37
|
+
var _setup = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
38
|
+
var bff_info, plugins;
|
39
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
40
|
+
while (1) {
|
41
|
+
switch (_context.prev = _context.next) {
|
42
|
+
case 0:
|
43
|
+
bff_info = this.global[bff_info_key];
|
44
|
+
plugins = bff_info.plugins; // eslint-disable-next-line no-multi-assign
|
45
|
+
|
46
|
+
_context.next = 4;
|
47
|
+
return createApp(bff_info.appDir, bff_info.modernUserConfig, plugins, bff_info.routes);
|
48
|
+
|
49
|
+
case 4:
|
50
|
+
this.global.app = this.app = _context.sent;
|
51
|
+
|
52
|
+
case 5:
|
53
|
+
case "end":
|
54
|
+
return _context.stop();
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}, _callee, this);
|
58
|
+
}));
|
59
|
+
|
60
|
+
function setup() {
|
61
|
+
return _setup.apply(this, arguments);
|
62
|
+
}
|
63
|
+
|
64
|
+
return setup;
|
65
|
+
}()
|
66
|
+
}, {
|
67
|
+
key: "teardown",
|
68
|
+
value: function () {
|
69
|
+
var _teardown = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
70
|
+
var _this$app, _this$app$server;
|
71
|
+
|
72
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
73
|
+
while (1) {
|
74
|
+
switch (_context2.prev = _context2.next) {
|
75
|
+
case 0:
|
76
|
+
_context2.next = 2;
|
77
|
+
return (_this$app = this.app) === null || _this$app === void 0 ? void 0 : (_this$app$server = _this$app.server) === null || _this$app$server === void 0 ? void 0 : _this$app$server.close();
|
78
|
+
|
79
|
+
case 2:
|
80
|
+
case "end":
|
81
|
+
return _context2.stop();
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}, _callee2, this);
|
85
|
+
}));
|
86
|
+
|
87
|
+
function teardown() {
|
88
|
+
return _teardown.apply(this, arguments);
|
89
|
+
}
|
90
|
+
|
91
|
+
return teardown;
|
92
|
+
}()
|
93
|
+
}]);
|
94
|
+
|
95
|
+
return _default;
|
96
|
+
}(NodeEnvironment);
|
97
|
+
|
98
|
+
export { _default as default };
|
@@ -0,0 +1,149 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
4
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
5
|
+
import path from 'path';
|
6
|
+
import { isApiOnly } from '@modern-js/utils';
|
7
|
+
import { getModuleNameMapper, DEFAULT_RESOLVER_PATH } from "../../base";
|
8
|
+
import { bff_info_key } from "./constant";
|
9
|
+
import { isBFFProject } from "./utils";
|
10
|
+
export var setJestConfigForBFF = /*#__PURE__*/function () {
|
11
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
12
|
+
var _userConfig$source;
|
13
|
+
|
14
|
+
var pwd, userConfig, plugins, routes, utils, bffConfig, jestConfig, alias, aliasMapper, moduleNameMapper, transform, apiOnly, mergedModuleNameMapper, resolver, configFields, commonConfig;
|
15
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
16
|
+
while (1) {
|
17
|
+
switch (_context.prev = _context.next) {
|
18
|
+
case 0:
|
19
|
+
pwd = _ref.pwd, userConfig = _ref.userConfig, plugins = _ref.plugins, routes = _ref.routes, utils = _ref.utils;
|
20
|
+
bffConfig = {
|
21
|
+
rootDir: path.join(pwd, './api'),
|
22
|
+
setupFilesAfterEnv: [require.resolve("./setup")],
|
23
|
+
testEnvironment: 'node',
|
24
|
+
testMatch: ["**/api/**/*.test.[jt]s"],
|
25
|
+
globals: _defineProperty({}, bff_info_key, {
|
26
|
+
appDir: pwd,
|
27
|
+
modernUserConfig: userConfig,
|
28
|
+
plugins: plugins,
|
29
|
+
routes: routes
|
30
|
+
})
|
31
|
+
};
|
32
|
+
jestConfig = utils.jestConfig;
|
33
|
+
alias = (userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$source = userConfig.source) === null || _userConfig$source === void 0 ? void 0 : _userConfig$source.alias) || {};
|
34
|
+
aliasMapper = getModuleNameMapper(alias);
|
35
|
+
moduleNameMapper = jestConfig.moduleNameMapper; // 服务端统一使用 ts-jest
|
36
|
+
|
37
|
+
transform = {
|
38
|
+
'\\.[jt]sx?$': require.resolve('ts-jest')
|
39
|
+
};
|
40
|
+
_context.next = 9;
|
41
|
+
return isApiOnly(pwd);
|
42
|
+
|
43
|
+
case 9:
|
44
|
+
apiOnly = _context.sent;
|
45
|
+
mergedModuleNameMapper = _objectSpread(_objectSpread({}, moduleNameMapper), aliasMapper);
|
46
|
+
resolver = jestConfig.resolver || DEFAULT_RESOLVER_PATH; // 这三个配置不能设置在 projects 中,需要设置在外层(https://github.com/facebook/jest/issues/9696)
|
47
|
+
|
48
|
+
configFields = ['coverage', 'collectCoverage', 'testTimeout'];
|
49
|
+
commonConfig = configFields.reduce(function (obj, field) {
|
50
|
+
if (jestConfig.hasOwnProperty(field)) {
|
51
|
+
obj[field] = jestConfig[field];
|
52
|
+
}
|
53
|
+
|
54
|
+
return obj;
|
55
|
+
}, {});
|
56
|
+
|
57
|
+
if (!apiOnly) {
|
58
|
+
utils.setJestConfig({
|
59
|
+
projects: [_objectSpread({}, jestConfig), _objectSpread({
|
60
|
+
transform: transform,
|
61
|
+
moduleNameMapper: mergedModuleNameMapper,
|
62
|
+
resolver: resolver
|
63
|
+
}, bffConfig)]
|
64
|
+
}, {
|
65
|
+
force: true
|
66
|
+
});
|
67
|
+
} else {
|
68
|
+
utils.setJestConfig({
|
69
|
+
projects: [_objectSpread({
|
70
|
+
transform: transform,
|
71
|
+
moduleNameMapper: mergedModuleNameMapper,
|
72
|
+
resolver: resolver
|
73
|
+
}, bffConfig)]
|
74
|
+
}, {
|
75
|
+
force: true
|
76
|
+
});
|
77
|
+
}
|
78
|
+
|
79
|
+
utils.setJestConfig(commonConfig);
|
80
|
+
|
81
|
+
case 16:
|
82
|
+
case "end":
|
83
|
+
return _context.stop();
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}, _callee);
|
87
|
+
}));
|
88
|
+
|
89
|
+
return function setJestConfigForBFF(_x) {
|
90
|
+
return _ref2.apply(this, arguments);
|
91
|
+
};
|
92
|
+
}();
|
93
|
+
export default (function () {
|
94
|
+
return {
|
95
|
+
name: '@modern-js/testing-plugin-bff',
|
96
|
+
setup: function setup(api) {
|
97
|
+
return {
|
98
|
+
jestConfig: function () {
|
99
|
+
var _jestConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(utils, next) {
|
100
|
+
var appContext, pwd, userConfig, plugins;
|
101
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
102
|
+
while (1) {
|
103
|
+
switch (_context2.prev = _context2.next) {
|
104
|
+
case 0:
|
105
|
+
appContext = api.useAppContext();
|
106
|
+
pwd = appContext.appDirectory;
|
107
|
+
|
108
|
+
if (isBFFProject(pwd)) {
|
109
|
+
_context2.next = 4;
|
110
|
+
break;
|
111
|
+
}
|
112
|
+
|
113
|
+
return _context2.abrupt("return", next(utils));
|
114
|
+
|
115
|
+
case 4:
|
116
|
+
userConfig = api.useResolvedConfigContext();
|
117
|
+
plugins = appContext.plugins.map(function (p) {
|
118
|
+
return p.server;
|
119
|
+
}).filter(Boolean);
|
120
|
+
_context2.next = 8;
|
121
|
+
return setJestConfigForBFF({
|
122
|
+
pwd: pwd,
|
123
|
+
userConfig: userConfig,
|
124
|
+
plugins: plugins,
|
125
|
+
routes: appContext.serverRoutes,
|
126
|
+
utils: utils
|
127
|
+
});
|
128
|
+
|
129
|
+
case 8:
|
130
|
+
return _context2.abrupt("return", next(utils));
|
131
|
+
|
132
|
+
case 9:
|
133
|
+
case "end":
|
134
|
+
return _context2.stop();
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}, _callee2);
|
138
|
+
}));
|
139
|
+
|
140
|
+
function jestConfig(_x2, _x3) {
|
141
|
+
return _jestConfig.apply(this, arguments);
|
142
|
+
}
|
143
|
+
|
144
|
+
return jestConfig;
|
145
|
+
}()
|
146
|
+
};
|
147
|
+
}
|
148
|
+
};
|
149
|
+
});
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
3
|
+
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
4
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
5
|
+
import * as ptr from 'path-to-regexp';
|
6
|
+
import * as mockAppModule from "./app"; // eslint-disable-next-line @typescript-eslint/naming-convention
|
7
|
+
|
8
|
+
var mock_replaceUrlWithParams = function mock_replaceUrlWithParams(url, paramValues, payload) {
|
9
|
+
var keys = [];
|
10
|
+
ptr.pathToRegexp(url, keys);
|
11
|
+
var params = keys.reduce(function (cur, key, index) {
|
12
|
+
if (paramValues[index]) {
|
13
|
+
cur[key.name] = paramValues[index];
|
14
|
+
}
|
15
|
+
|
16
|
+
return cur;
|
17
|
+
}, {});
|
18
|
+
var getFinalPath = ptr.compile(url, {
|
19
|
+
encode: encodeURIComponent
|
20
|
+
});
|
21
|
+
return getFinalPath(_objectSpread(_objectSpread({}, params), payload));
|
22
|
+
}; // eslint-disable-next-line @typescript-eslint/naming-convention
|
23
|
+
|
24
|
+
|
25
|
+
var mock_getParamsAndPayload = function mock_getParamsAndPayload(args) {
|
26
|
+
if (args.length === 0) {
|
27
|
+
return [[], {}];
|
28
|
+
}
|
29
|
+
|
30
|
+
var head = args[0];
|
31
|
+
|
32
|
+
if (_typeof(head) === 'object') {
|
33
|
+
return [[], head];
|
34
|
+
} else {
|
35
|
+
var latest = args[args.length - 1];
|
36
|
+
|
37
|
+
if (_typeof(latest) === 'object') {
|
38
|
+
return [args.slice(0, args.length - 1), latest];
|
39
|
+
} else {
|
40
|
+
return [args, {}];
|
41
|
+
}
|
42
|
+
}
|
43
|
+
};
|
44
|
+
|
45
|
+
export default (function (mockApiInfosByFile) {
|
46
|
+
var files = Object.keys(mockApiInfosByFile);
|
47
|
+
files.forEach(function (mockedFile) {
|
48
|
+
jest.mock(mockedFile, function () {
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
50
|
+
var supertest = require('supertest');
|
51
|
+
|
52
|
+
return mockApiInfosByFile[mockedFile].reduce(function (res, info) {
|
53
|
+
var module = _defineProperty({}, info.name, function () {
|
54
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
55
|
+
args[_key] = arguments[_key];
|
56
|
+
}
|
57
|
+
|
58
|
+
if (mockAppModule.isInHandler()) {
|
59
|
+
return info.handler.apply(info, args);
|
60
|
+
}
|
61
|
+
|
62
|
+
var _mock_getParamsAndPay = mock_getParamsAndPayload(args),
|
63
|
+
_mock_getParamsAndPay2 = _slicedToArray(_mock_getParamsAndPay, 2),
|
64
|
+
params = _mock_getParamsAndPay2[0],
|
65
|
+
payload = _mock_getParamsAndPay2[1];
|
66
|
+
|
67
|
+
var _ref = module[info.name],
|
68
|
+
returnHttp = _ref.returnHttp;
|
69
|
+
var url = mock_replaceUrlWithParams(info.routePath, params, payload.params);
|
70
|
+
var app = mockAppModule.getApp();
|
71
|
+
var test = supertest(app)[info.httpMethod.toLowerCase()](url);
|
72
|
+
|
73
|
+
if (payload.query) {
|
74
|
+
test = test.query(payload.query);
|
75
|
+
}
|
76
|
+
|
77
|
+
if (payload.body) {
|
78
|
+
test = test.send(payload.body);
|
79
|
+
}
|
80
|
+
|
81
|
+
if (payload.data) {
|
82
|
+
test = test.send(payload.data);
|
83
|
+
}
|
84
|
+
|
85
|
+
if (payload.headers) {
|
86
|
+
for (var name in payload.headers) {
|
87
|
+
test = test.set(name, payload.headers[name]);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
if (payload.cookies) {
|
92
|
+
test = test.set('Cookie', [payload.cookies]);
|
93
|
+
}
|
94
|
+
|
95
|
+
if (returnHttp) {
|
96
|
+
return test;
|
97
|
+
}
|
98
|
+
|
99
|
+
return test.then(function (value) {
|
100
|
+
try {
|
101
|
+
return JSON.parse(value.text);
|
102
|
+
} catch (_unused) {
|
103
|
+
return value.text;
|
104
|
+
}
|
105
|
+
});
|
106
|
+
});
|
107
|
+
|
108
|
+
res[info.name] = module[info.name];
|
109
|
+
Object.assign(res[info.name], info.handler);
|
110
|
+
res.__esModule = true;
|
111
|
+
return res;
|
112
|
+
}, {});
|
113
|
+
});
|
114
|
+
});
|
115
|
+
});
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
3
|
+
import path from 'path';
|
4
|
+
import { ApiRouter } from '@modern-js/bff-core';
|
5
|
+
import { bff_info_key } from "./constant";
|
6
|
+
import mockAPI from "./mockAPI";
|
7
|
+
import { createApp, closeServer } from "./app";
|
8
|
+
var uped = false;
|
9
|
+
var BEFORE_ALL_TIMEOUT = 30000;
|
10
|
+
|
11
|
+
var setup = function setup() {
|
12
|
+
var _bff_info$modernUserC, _bff_info$modernUserC2;
|
13
|
+
|
14
|
+
if (uped) {
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
|
18
|
+
uped = true;
|
19
|
+
var bff_info = global[bff_info_key];
|
20
|
+
var prefix = bff_info === null || bff_info === void 0 ? void 0 : (_bff_info$modernUserC = bff_info.modernUserConfig) === null || _bff_info$modernUserC === void 0 ? void 0 : (_bff_info$modernUserC2 = _bff_info$modernUserC.bff) === null || _bff_info$modernUserC2 === void 0 ? void 0 : _bff_info$modernUserC2.prefix;
|
21
|
+
var apiRouter = new ApiRouter({
|
22
|
+
apiDir: path.join(bff_info.appDir, './api'),
|
23
|
+
prefix: prefix
|
24
|
+
});
|
25
|
+
var apiInfos = apiRouter.getApiHandlers();
|
26
|
+
var apiInfosByFile = apiInfos.reduce(function (res, apiInfo) {
|
27
|
+
if (!res[apiInfo.filename]) {
|
28
|
+
res[apiInfo.filename] = [];
|
29
|
+
}
|
30
|
+
|
31
|
+
res[apiInfo.filename].push(apiInfo);
|
32
|
+
return res;
|
33
|
+
}, {});
|
34
|
+
var app = null;
|
35
|
+
beforeAll( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
36
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
37
|
+
while (1) {
|
38
|
+
switch (_context.prev = _context.next) {
|
39
|
+
case 0:
|
40
|
+
if (app) {
|
41
|
+
_context.next = 4;
|
42
|
+
break;
|
43
|
+
}
|
44
|
+
|
45
|
+
_context.next = 3;
|
46
|
+
return createApp(bff_info.appDir, bff_info.modernUserConfig, bff_info.plugins, bff_info.routes);
|
47
|
+
|
48
|
+
case 3:
|
49
|
+
app = _context.sent;
|
50
|
+
|
51
|
+
case 4:
|
52
|
+
case "end":
|
53
|
+
return _context.stop();
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}, _callee);
|
57
|
+
})), BEFORE_ALL_TIMEOUT);
|
58
|
+
afterAll( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
59
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
60
|
+
while (1) {
|
61
|
+
switch (_context2.prev = _context2.next) {
|
62
|
+
case 0:
|
63
|
+
_context2.next = 2;
|
64
|
+
return closeServer();
|
65
|
+
|
66
|
+
case 2:
|
67
|
+
case "end":
|
68
|
+
return _context2.stop();
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}, _callee2);
|
72
|
+
})));
|
73
|
+
mockAPI(apiInfosByFile);
|
74
|
+
};
|
75
|
+
|
76
|
+
setup();
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
2
|
+
import path from 'path';
|
3
|
+
import { chalk } from '@modern-js/utils';
|
4
|
+
export var isBFFProject = function isBFFProject(pwd) {
|
5
|
+
try {
|
6
|
+
var packageJson = require(path.join(pwd, './package.json'));
|
7
|
+
|
8
|
+
var dependencies = packageJson.dependencies,
|
9
|
+
devDependencies = packageJson.devDependencies;
|
10
|
+
var isBFF = Object.keys(_objectSpread(_objectSpread({}, dependencies), devDependencies)).some(function (dependency) {
|
11
|
+
return dependency.includes('plugin-bff');
|
12
|
+
});
|
13
|
+
var isMWA = Object.keys(devDependencies).some(function (devDependency) {
|
14
|
+
return devDependency.includes('app-tools');
|
15
|
+
});
|
16
|
+
return isMWA && isBFF;
|
17
|
+
} catch (error) {
|
18
|
+
// eslint-disable-next-line no-console
|
19
|
+
console.log(chalk.red(error));
|
20
|
+
return false;
|
21
|
+
}
|
22
|
+
};
|
@@ -3,10 +3,10 @@ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
3
3
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
4
4
|
import path from 'path';
|
5
5
|
import { PLUGIN_SCHEMAS, createRuntimeExportsUtils, isApiOnly } from '@modern-js/utils';
|
6
|
-
import { testingHooks, getModuleNameMapper, DEFAULT_RESOLVER_PATH } from '@modern-js/testing';
|
7
6
|
import { getWebpackConfig, WebpackConfigTarget } from '@modern-js/webpack';
|
8
|
-
import
|
7
|
+
import { testingHooks, getModuleNameMapper, DEFAULT_RESOLVER_PATH } from "../base";
|
9
8
|
import { MODERNJS_CONFIG_KEY } from "../constant";
|
9
|
+
import TestingBffPlugin from "./bff";
|
10
10
|
import test from "./test";
|
11
11
|
export var mergeUserJestConfig = function mergeUserJestConfig(testUtils) {
|
12
12
|
var resolveJestConfig = testUtils.testConfig.jest; // resolveJestConfig 如果是函数类型,在所有测试插件 jestConfig 都执行后,再执行生成最终配置
|
@@ -2,7 +2,7 @@ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
3
3
|
import path from 'path';
|
4
4
|
import { compiler } from '@modern-js/babel-compiler';
|
5
|
-
import { runTest } from
|
5
|
+
import { runTest } from "../base";
|
6
6
|
|
7
7
|
var test = /*#__PURE__*/function () {
|
8
8
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(api) {
|
@@ -2,7 +2,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
2
|
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
3
3
|
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
4
4
|
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
5
|
-
import { createApp as _createApp } from '@modern-js/runtime
|
5
|
+
import { createApp as _createApp } from '@modern-js/runtime';
|
6
6
|
import { MODERNJS_CONFIG_KEY } from "../constant";
|
7
7
|
import resolvePlugins from "./resolvePlugins";
|
8
8
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
2
|
+
|
3
|
+
/* eslint-disable eslint-comments/disable-enable-pair */
|
4
|
+
import supertest from 'supertest';
|
5
|
+
|
6
|
+
function request() {
|
7
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
8
|
+
args[_key] = arguments[_key];
|
9
|
+
}
|
10
|
+
|
11
|
+
var fn = args[0],
|
12
|
+
extraArgs = args.slice(1);
|
13
|
+
|
14
|
+
if (!fn) {
|
15
|
+
return supertest(global.app);
|
16
|
+
}
|
17
|
+
|
18
|
+
fn.returnHttp = true;
|
19
|
+
var res = fn.apply(void 0, _toConsumableArray(extraArgs));
|
20
|
+
fn.returnHttp = false;
|
21
|
+
return res;
|
22
|
+
}
|
23
|
+
|
24
|
+
export { request };
|