@modern-js/plugin-testing 1.0.0-rc.2
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/LICENSE +21 -0
- package/README.md +32 -0
- package/dist/js/modern/cli/index.js +43 -0
- package/dist/js/modern/cli/plugins/modern.js +44 -0
- package/dist/js/modern/cli/resolver.js +15 -0
- package/dist/js/modern/cli/test.js +43 -0
- package/dist/js/modern/constant.js +1 -0
- package/dist/js/modern/index.js +2 -0
- package/dist/js/modern/runtime-testing/app.js +51 -0
- package/dist/js/modern/runtime-testing/customRender.js +17 -0
- package/dist/js/modern/runtime-testing/index.js +2 -0
- package/dist/js/modern/runtime-testing/resolvePlugins.js +23 -0
- package/dist/js/node/cli/index.js +59 -0
- package/dist/js/node/cli/plugins/modern.js +59 -0
- package/dist/js/node/cli/resolver.js +20 -0
- package/dist/js/node/cli/test.js +60 -0
- package/dist/js/node/constant.js +8 -0
- package/dist/js/node/index.js +20 -0
- package/dist/js/node/runtime-testing/app.js +64 -0
- package/dist/js/node/runtime-testing/customRender.js +29 -0
- package/dist/js/node/runtime-testing/index.js +32 -0
- package/dist/js/node/runtime-testing/resolvePlugins.js +31 -0
- package/dist/js/treeshaking/cli/index.js +54 -0
- package/dist/js/treeshaking/cli/plugins/modern.js +47 -0
- package/dist/js/treeshaking/cli/resolver.js +17 -0
- package/dist/js/treeshaking/cli/test.js +78 -0
- package/dist/js/treeshaking/constant.js +1 -0
- package/dist/js/treeshaking/index.js +2 -0
- package/dist/js/treeshaking/runtime-testing/app.js +64 -0
- package/dist/js/treeshaking/runtime-testing/customRender.js +21 -0
- package/dist/js/treeshaking/runtime-testing/index.js +2 -0
- package/dist/js/treeshaking/runtime-testing/resolvePlugins.js +23 -0
- package/dist/types/cli/index.d.ts +3 -0
- package/dist/types/cli/plugins/modern.d.ts +3 -0
- package/dist/types/cli/resolver.d.ts +1 -0
- package/dist/types/cli/test.d.ts +8 -0
- package/dist/types/constant.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/runtime-testing/app.d.ts +17 -0
- package/dist/types/runtime-testing/customRender.d.ts +5 -0
- package/dist/types/runtime-testing/index.d.ts +2 -0
- package/dist/types/runtime-testing/resolvePlugins.d.ts +2 -0
- package/modern.config.js +2 -0
- package/package.json +44 -0
- package/src/.eslintrc.json +3 -0
- package/src/cli/index.ts +48 -0
- package/src/cli/plugins/modern.ts +50 -0
- package/src/cli/resolver.ts +16 -0
- package/src/cli/test.ts +66 -0
- package/src/constant.ts +1 -0
- package/src/index.ts +3 -0
- package/src/runtime-testing/app.ts +48 -0
- package/src/runtime-testing/customRender.ts +11 -0
- package/src/runtime-testing/index.ts +3 -0
- package/src/runtime-testing/resolvePlugins.ts +23 -0
- package/tsconfig.json +12 -0
- package/type.d.ts +4 -0
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Object.defineProperty(exports, "__esModule", {
         | 
| 4 | 
            +
              value: true
         | 
| 5 | 
            +
            });
         | 
| 6 | 
            +
            exports.default = resolvePlugins;
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            const allowedFeatures = ['router', 'state'];
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            function resolvePlugins(features) {
         | 
| 17 | 
            +
              const plugins = [];
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              if (!features) {
         | 
| 20 | 
            +
                return plugins;
         | 
| 21 | 
            +
              }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              Object.keys(features).forEach(feature => {
         | 
| 24 | 
            +
                if (allowedFeatures.includes(feature)) {
         | 
| 25 | 
            +
                  const curPluginRes = require(`@modern-js/runtime/plugins`)[feature](_objectSpread({}, features[feature]));
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  plugins.push(curPluginRes);
         | 
| 28 | 
            +
                }
         | 
| 29 | 
            +
              });
         | 
| 30 | 
            +
              return plugins;
         | 
| 31 | 
            +
            }
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            import path from 'path';
         | 
| 6 | 
            +
            import { createPlugin, useAppContext } from '@modern-js/core';
         | 
| 7 | 
            +
            import { createRuntimeExportsUtils, PLUGIN_SCHEMAS } from '@modern-js/utils';
         | 
| 8 | 
            +
            import test from "./test";
         | 
| 9 | 
            +
            export default createPlugin(function () {
         | 
| 10 | 
            +
              var testingExportsUtils;
         | 
| 11 | 
            +
              return {
         | 
| 12 | 
            +
                commands: function commands(_ref) {
         | 
| 13 | 
            +
                  var program = _ref.program;
         | 
| 14 | 
            +
                  program.command('test').allowUnknownOption().usage('[options]').action( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
         | 
| 15 | 
            +
                    return regeneratorRuntime.wrap(function _callee$(_context) {
         | 
| 16 | 
            +
                      while (1) {
         | 
| 17 | 
            +
                        switch (_context.prev = _context.next) {
         | 
| 18 | 
            +
                          case 0:
         | 
| 19 | 
            +
                            _context.next = 2;
         | 
| 20 | 
            +
                            return test();
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                          case 2:
         | 
| 23 | 
            +
                          case "end":
         | 
| 24 | 
            +
                            return _context.stop();
         | 
| 25 | 
            +
                        }
         | 
| 26 | 
            +
                      }
         | 
| 27 | 
            +
                    }, _callee);
         | 
| 28 | 
            +
                  })));
         | 
| 29 | 
            +
                },
         | 
| 30 | 
            +
                validateSchema: function validateSchema() {
         | 
| 31 | 
            +
                  return PLUGIN_SCHEMAS['@modern-js/plugin-testing'];
         | 
| 32 | 
            +
                },
         | 
| 33 | 
            +
                config: function config() {
         | 
| 34 | 
            +
                  // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 35 | 
            +
                  var _useAppContext = useAppContext(),
         | 
| 36 | 
            +
                      appContext = _useAppContext.value;
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  testingExportsUtils = createRuntimeExportsUtils(appContext.internalDirectory, 'testing');
         | 
| 39 | 
            +
                  return {
         | 
| 40 | 
            +
                    source: {
         | 
| 41 | 
            +
                      alias: {
         | 
| 42 | 
            +
                        '@modern-js/runtime/testing': testingExportsUtils.getPath()
         | 
| 43 | 
            +
                      }
         | 
| 44 | 
            +
                    }
         | 
| 45 | 
            +
                  };
         | 
| 46 | 
            +
                },
         | 
| 47 | 
            +
                addRuntimeExports: function addRuntimeExports() {
         | 
| 48 | 
            +
                  var testingPath = path.resolve(__dirname, '../');
         | 
| 49 | 
            +
                  testingExportsUtils.addExport("export * from '".concat(testingPath, "'"));
         | 
| 50 | 
            +
                }
         | 
| 51 | 
            +
              };
         | 
| 52 | 
            +
            }, {
         | 
| 53 | 
            +
              name: '@modern-js/plugin-testing'
         | 
| 54 | 
            +
            });
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import path from 'path';
         | 
| 4 | 
            +
            import { createPlugin } from '@modern-js/testing';
         | 
| 5 | 
            +
            import { modernjs_config_key } from "../../constant";
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            var getModuleNameMapper = function getModuleNameMapper(config) {
         | 
| 8 | 
            +
              var _config$resolve$alias = config.resolve.alias,
         | 
| 9 | 
            +
                  alias = _config$resolve$alias === void 0 ? {} : _config$resolve$alias;
         | 
| 10 | 
            +
              return Object.keys(alias).reduce(function (memo, cur) {
         | 
| 11 | 
            +
                var aliasValue = Array.isArray(alias[cur]) ? alias[cur] : [alias[cur]];
         | 
| 12 | 
            +
                var isFile = aliasValue.some(function (s) {
         | 
| 13 | 
            +
                  return s.endsWith('.js');
         | 
| 14 | 
            +
                });
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                if (isFile) {
         | 
| 17 | 
            +
                  memo[cur] = aliasValue[0];
         | 
| 18 | 
            +
                }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                var key = "^".concat(cur, "/(.*)$");
         | 
| 21 | 
            +
                var value = path.normalize("".concat(aliasValue, "/$1"));
         | 
| 22 | 
            +
                memo[key] = value;
         | 
| 23 | 
            +
                return memo;
         | 
| 24 | 
            +
              }, {});
         | 
| 25 | 
            +
            };
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            export default (function (webpackConfig, userConfig, pwd) {
         | 
| 28 | 
            +
              return createPlugin(function () {
         | 
| 29 | 
            +
                return {
         | 
| 30 | 
            +
                  jestConfig: function jestConfig(utils, next) {
         | 
| 31 | 
            +
                    utils.mergeJestConfig({
         | 
| 32 | 
            +
                      globals: _defineProperty({}, modernjs_config_key, userConfig),
         | 
| 33 | 
            +
                      moduleNameMapper: getModuleNameMapper(webpackConfig),
         | 
| 34 | 
            +
                      testEnvironment: 'jsdom',
         | 
| 35 | 
            +
                      resolver: require.resolve("../resolver")
         | 
| 36 | 
            +
                    });
         | 
| 37 | 
            +
                    utils.setJestConfig({
         | 
| 38 | 
            +
                      // todo: diffrent test root for diffrent solutions
         | 
| 39 | 
            +
                      testMatch: ["".concat(pwd || process.cwd(), "/(src|tests|api)/**/*.test.[jt]s?(x)")]
         | 
| 40 | 
            +
                    });
         | 
| 41 | 
            +
                    return next(utils);
         | 
| 42 | 
            +
                  }
         | 
| 43 | 
            +
                };
         | 
| 44 | 
            +
              }, {
         | 
| 45 | 
            +
                name: '@modern-js/testing-plugin-modern'
         | 
| 46 | 
            +
              });
         | 
| 47 | 
            +
            });
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            import enhanceResolve from 'enhanced-resolve';
         | 
| 2 | 
            +
            var resolver = enhanceResolve.create.sync({
         | 
| 3 | 
            +
              conditionNames: ['require', 'node', 'default'],
         | 
| 4 | 
            +
              extensions: ['.js', '.json', '.node', '.ts', '.tsx']
         | 
| 5 | 
            +
            });
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            var shouldResolveByEnhance = function shouldResolveByEnhance(url) {
         | 
| 8 | 
            +
              return /^@[^/]+\/[^/]+\/.*/.test(url);
         | 
| 9 | 
            +
            };
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            module.exports = function (request, options) {
         | 
| 12 | 
            +
              if (shouldResolveByEnhance(request)) {
         | 
| 13 | 
            +
                return resolver(options.basedir, request);
         | 
| 14 | 
            +
              }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              return options.defaultResolver(request, options);
         | 
| 17 | 
            +
            };
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            import path from 'path';
         | 
| 18 | 
            +
            import { compiler } from '@modern-js/babel-compiler';
         | 
| 19 | 
            +
            import { useAppContext, useResolvedConfigContext } from '@modern-js/core';
         | 
| 20 | 
            +
            import { runTest } from '@modern-js/testing';
         | 
| 21 | 
            +
            import { getWebpackConfig, WebpackConfigTarget } from '@modern-js/webpack'; // import testingBffPlugin from '@modern-js/testing-plugin-bff';
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            import modernTestPlugin from "./plugins/modern";
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            var test = /*#__PURE__*/function () {
         | 
| 26 | 
            +
              var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
         | 
| 27 | 
            +
                var _useResolvedConfigCon, userConfig, _useAppContext, config, webpackConfigs, runtimeExportsPath;
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                return regeneratorRuntime.wrap(function _callee$(_context) {
         | 
| 30 | 
            +
                  while (1) {
         | 
| 31 | 
            +
                    switch (_context.prev = _context.next) {
         | 
| 32 | 
            +
                      case 0:
         | 
| 33 | 
            +
                        // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 34 | 
            +
                        _useResolvedConfigCon = useResolvedConfigContext(), userConfig = _useResolvedConfigCon.value; // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                        _useAppContext = useAppContext(), config = _useAppContext.value; // todo: consider lib-tools ...
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                        webpackConfigs = getWebpackConfig(WebpackConfigTarget.CLIENT);
         | 
| 39 | 
            +
                        userConfig.testing = userConfig.testing || {};
         | 
| 40 | 
            +
                        userConfig.testing.jest = userConfig.testing.jest || userConfig.tools.jest;
         | 
| 41 | 
            +
                        userConfig.testing.plugins = [].concat(_toConsumableArray(userConfig.testing.plugins || []), [modernTestPlugin(webpackConfigs, userConfig, config.appDirectory) // testingBffPlugin({
         | 
| 42 | 
            +
                        //   pwd: config.appDirectory,
         | 
| 43 | 
            +
                        //   userConfig: userConfig,
         | 
| 44 | 
            +
                        //   plugins: config.plugins.map(p => p.server).filter(Boolean),
         | 
| 45 | 
            +
                        //   routes: (config as any).serverRoutes
         | 
| 46 | 
            +
                        // }),
         | 
| 47 | 
            +
                        ]);
         | 
| 48 | 
            +
                        runtimeExportsPath = path.join(config.internalDirectory, '.runtime-exports');
         | 
| 49 | 
            +
                        _context.next = 9;
         | 
| 50 | 
            +
                        return compiler({
         | 
| 51 | 
            +
                          sourceDir: runtimeExportsPath,
         | 
| 52 | 
            +
                          rootDir: runtimeExportsPath,
         | 
| 53 | 
            +
                          distDir: runtimeExportsPath,
         | 
| 54 | 
            +
                          quiet: true
         | 
| 55 | 
            +
                        }, {
         | 
| 56 | 
            +
                          presets: [[require.resolve('@babel/preset-env'), {
         | 
| 57 | 
            +
                            modules: 'cjs'
         | 
| 58 | 
            +
                          }]]
         | 
| 59 | 
            +
                        });
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                      case 9:
         | 
| 62 | 
            +
                        _context.next = 11;
         | 
| 63 | 
            +
                        return runTest(userConfig.testing);
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                      case 11:
         | 
| 66 | 
            +
                      case "end":
         | 
| 67 | 
            +
                        return _context.stop();
         | 
| 68 | 
            +
                    }
         | 
| 69 | 
            +
                  }
         | 
| 70 | 
            +
                }, _callee);
         | 
| 71 | 
            +
              }));
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              return function test() {
         | 
| 74 | 
            +
                return _ref.apply(this, arguments);
         | 
| 75 | 
            +
              };
         | 
| 76 | 
            +
            }();
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            export default test;
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            export var modernjs_config_key = '__modernjs_config__';
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            import { createApp as _createApp } from '@modern-js/runtime-core';
         | 
| 14 | 
            +
            import resolvePlugins from "./resolvePlugins";
         | 
| 15 | 
            +
            import { modernjs_config_key } from "../constant";
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            var ModernRuntime = /*#__PURE__*/function () {
         | 
| 18 | 
            +
              function ModernRuntime(options) {
         | 
| 19 | 
            +
                _classCallCheck(this, ModernRuntime);
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                this.options = void 0;
         | 
| 22 | 
            +
                this.options = options;
         | 
| 23 | 
            +
              }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              _createClass(ModernRuntime, [{
         | 
| 26 | 
            +
                key: "init",
         | 
| 27 | 
            +
                value: function init(options) {
         | 
| 28 | 
            +
                  this.options = options;
         | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
              }, {
         | 
| 31 | 
            +
                key: "createApp",
         | 
| 32 | 
            +
                value: function createApp(props) {
         | 
| 33 | 
            +
                  var _this$options;
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  var _ref = props || {},
         | 
| 36 | 
            +
                      entry = _ref.entry,
         | 
| 37 | 
            +
                      children = _ref.children;
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  var runtimeFeatures = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.runtime;
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  if (entry) {
         | 
| 42 | 
            +
                    var _this$options$runtime;
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    runtimeFeatures = _objectSpread(_objectSpread({}, runtimeFeatures || {}), (_this$options$runtime = this.options.runtimeByEntries) === null || _this$options$runtime === void 0 ? void 0 : _this$options$runtime[entry]);
         | 
| 45 | 
            +
                  }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  var Component = function Component() {
         | 
| 48 | 
            +
                    if (!children) {
         | 
| 49 | 
            +
                      return null;
         | 
| 50 | 
            +
                    }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    return children;
         | 
| 53 | 
            +
                  };
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  return _createApp({
         | 
| 56 | 
            +
                    plugins: resolvePlugins(runtimeFeatures || {})
         | 
| 57 | 
            +
                  })(Component);
         | 
| 58 | 
            +
                }
         | 
| 59 | 
            +
              }]);
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              return ModernRuntime;
         | 
| 62 | 
            +
            }();
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            export default new ModernRuntime(global[modernjs_config_key] || {});
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            import React from 'react';
         | 
| 8 | 
            +
            import { render } from '@testing-library/react';
         | 
| 9 | 
            +
            import app from "./app";
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            var WrapModernProviders = function WrapModernProviders(props) {
         | 
| 12 | 
            +
              return /*#__PURE__*/React.createElement(app.createApp(props));
         | 
| 13 | 
            +
            };
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            var customRender = function customRender(ui, options) {
         | 
| 16 | 
            +
              return render(ui, _objectSpread({
         | 
| 17 | 
            +
                wrapper: WrapModernProviders
         | 
| 18 | 
            +
              }, options));
         | 
| 19 | 
            +
            };
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            export default customRender;
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            var allowedFeatures = ['router', 'state'];
         | 
| 8 | 
            +
            export default function resolvePlugins(features) {
         | 
| 9 | 
            +
              var plugins = [];
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              if (!features) {
         | 
| 12 | 
            +
                return plugins;
         | 
| 13 | 
            +
              }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              Object.keys(features).forEach(function (feature) {
         | 
| 16 | 
            +
                if (allowedFeatures.includes(feature)) {
         | 
| 17 | 
            +
                  var curPluginRes = require("@modern-js/runtime/plugins")[feature](_objectSpread({}, features[feature]));
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  plugins.push(curPluginRes);
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
              });
         | 
| 22 | 
            +
              return plugins;
         | 
| 23 | 
            +
            }
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            export {};
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            export declare const modernjs_config_key = "__modernjs_config__";
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            import React from 'react';
         | 
| 2 | 
            +
            import { UserConfig } from '@modern-js/core';
         | 
| 3 | 
            +
            interface CreateAppProps {
         | 
| 4 | 
            +
              entry?: string;
         | 
| 5 | 
            +
              children?: React.ReactElement;
         | 
| 6 | 
            +
            }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            declare class ModernRuntime {
         | 
| 9 | 
            +
              private options;
         | 
| 10 | 
            +
              constructor(options: UserConfig);
         | 
| 11 | 
            +
              init(options: UserConfig): void;
         | 
| 12 | 
            +
              createApp(props?: CreateAppProps): React.ComponentType<any>;
         | 
| 13 | 
            +
            }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            declare const _default: ModernRuntime;
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            export default _default;
         | 
    
        package/modern.config.js
    ADDED
    
    
    
        package/package.json
    ADDED
    
    | @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "name": "@modern-js/plugin-testing",
         | 
| 3 | 
            +
              "version": "1.0.0-rc.2",
         | 
| 4 | 
            +
              "jsnext:source": "./src/index.ts",
         | 
| 5 | 
            +
              "types": "./dist/types/index.d.ts",
         | 
| 6 | 
            +
              "main": "./dist/js/node/index.js",
         | 
| 7 | 
            +
              "module": "./dist/js/treeshaking/index.js",
         | 
| 8 | 
            +
              "jsnext:modern": "./dist/js/modern/index.js",
         | 
| 9 | 
            +
              "exports": {
         | 
| 10 | 
            +
                "./cli": "./dist/js/node/cli/index.js"
         | 
| 11 | 
            +
              },
         | 
| 12 | 
            +
              "dependencies": {
         | 
| 13 | 
            +
                "@babel/preset-env": "^7.15.6",
         | 
| 14 | 
            +
                "@babel/runtime": "^7",
         | 
| 15 | 
            +
                "@modern-js/babel-compiler": "^1.0.0-rc.2",
         | 
| 16 | 
            +
                "@modern-js/core": "^1.0.0-rc.2",
         | 
| 17 | 
            +
                "@modern-js/testing": "^1.0.0-rc.2",
         | 
| 18 | 
            +
                "@modern-js/utils": "^1.0.0-rc.2",
         | 
| 19 | 
            +
                "@modern-js/webpack": "^1.0.0-rc.2",
         | 
| 20 | 
            +
                "@testing-library/jest-dom": "^5.14.1",
         | 
| 21 | 
            +
                "@testing-library/react": "^12.0.0",
         | 
| 22 | 
            +
                "enhanced-resolve": "^5.8.2"
         | 
| 23 | 
            +
              },
         | 
| 24 | 
            +
              "peerDependencies": {
         | 
| 25 | 
            +
                "@modern-js/runtime-core": "^1.0.0-rc.2"
         | 
| 26 | 
            +
              },
         | 
| 27 | 
            +
              "devDependencies": {
         | 
| 28 | 
            +
                "@modern-js/runtime-core": "^1.0.0-rc.2",
         | 
| 29 | 
            +
                "@types/jest": "^26",
         | 
| 30 | 
            +
                "@types/node": "^14",
         | 
| 31 | 
            +
                "@types/react": "^17",
         | 
| 32 | 
            +
                "@types/react-dom": "^17",
         | 
| 33 | 
            +
                "typescript": "^4",
         | 
| 34 | 
            +
                "@modern-js/plugin-testing": "^1.0.0-rc.2",
         | 
| 35 | 
            +
                "@modern-js/module-tools": "^1.0.0-rc.2"
         | 
| 36 | 
            +
              },
         | 
| 37 | 
            +
              "sideEffects": false,
         | 
| 38 | 
            +
              "modernConfig": {},
         | 
| 39 | 
            +
              "scripts": {
         | 
| 40 | 
            +
                "new": "modern new",
         | 
| 41 | 
            +
                "build": "modern build",
         | 
| 42 | 
            +
                "test": "modern test --passWithNoTests"
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
            }
         | 
    
        package/src/cli/index.ts
    ADDED
    
    | @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            import path from 'path';
         | 
| 2 | 
            +
            import { createPlugin, useAppContext } from '@modern-js/core';
         | 
| 3 | 
            +
            import { createRuntimeExportsUtils, PLUGIN_SCHEMAS } from '@modern-js/utils';
         | 
| 4 | 
            +
            import test from './test';
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            export default createPlugin(
         | 
| 7 | 
            +
              () => {
         | 
| 8 | 
            +
                let testingExportsUtils: ReturnType<typeof createRuntimeExportsUtils>;
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                return {
         | 
| 11 | 
            +
                  commands: ({ program }: any) => {
         | 
| 12 | 
            +
                    program
         | 
| 13 | 
            +
                      .command('test')
         | 
| 14 | 
            +
                      .allowUnknownOption()
         | 
| 15 | 
            +
                      .usage('[options]')
         | 
| 16 | 
            +
                      .action(async () => {
         | 
| 17 | 
            +
                        await test();
         | 
| 18 | 
            +
                      });
         | 
| 19 | 
            +
                  },
         | 
| 20 | 
            +
                  validateSchema() {
         | 
| 21 | 
            +
                    return PLUGIN_SCHEMAS['@modern-js/plugin-testing'];
         | 
| 22 | 
            +
                  },
         | 
| 23 | 
            +
                  config() {
         | 
| 24 | 
            +
                    // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 25 | 
            +
                    const { value: appContext } = useAppContext();
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    testingExportsUtils = createRuntimeExportsUtils(
         | 
| 28 | 
            +
                      appContext.internalDirectory,
         | 
| 29 | 
            +
                      'testing',
         | 
| 30 | 
            +
                    );
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    return {
         | 
| 33 | 
            +
                      source: {
         | 
| 34 | 
            +
                        alias: {
         | 
| 35 | 
            +
                          '@modern-js/runtime/testing': testingExportsUtils.getPath(),
         | 
| 36 | 
            +
                        },
         | 
| 37 | 
            +
                      },
         | 
| 38 | 
            +
                    };
         | 
| 39 | 
            +
                  },
         | 
| 40 | 
            +
                  addRuntimeExports() {
         | 
| 41 | 
            +
                    const testingPath = path.resolve(__dirname, '../');
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    testingExportsUtils.addExport(`export * from '${testingPath}'`);
         | 
| 44 | 
            +
                  },
         | 
| 45 | 
            +
                };
         | 
| 46 | 
            +
              },
         | 
| 47 | 
            +
              { name: '@modern-js/plugin-testing' },
         | 
| 48 | 
            +
            ) as any;
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            import path from 'path';
         | 
| 2 | 
            +
            import { createPlugin } from '@modern-js/testing';
         | 
| 3 | 
            +
            import { modernjs_config_key } from '@/constant';
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            const getModuleNameMapper = (config: any) => {
         | 
| 6 | 
            +
              const {
         | 
| 7 | 
            +
                resolve: { alias = {} },
         | 
| 8 | 
            +
              } = config;
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              return Object.keys(alias).reduce((memo, cur) => {
         | 
| 11 | 
            +
                const aliasValue = Array.isArray(alias[cur]) ? alias[cur] : [alias[cur]];
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                const isFile = aliasValue.some((s: string) => s.endsWith('.js'));
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (isFile) {
         | 
| 16 | 
            +
                  memo[cur] = aliasValue[0];
         | 
| 17 | 
            +
                }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                const key = `^${cur}/(.*)$`;
         | 
| 20 | 
            +
                const value = path.normalize(`${aliasValue}/$1`);
         | 
| 21 | 
            +
                memo[key] = value;
         | 
| 22 | 
            +
                return memo;
         | 
| 23 | 
            +
              }, {} as any);
         | 
| 24 | 
            +
            };
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            export default (webpackConfig: any, userConfig: any, pwd: string) =>
         | 
| 27 | 
            +
              createPlugin(
         | 
| 28 | 
            +
                () => ({
         | 
| 29 | 
            +
                  jestConfig: (utils: any, next: any) => {
         | 
| 30 | 
            +
                    utils.mergeJestConfig({
         | 
| 31 | 
            +
                      globals: {
         | 
| 32 | 
            +
                        [modernjs_config_key]: userConfig,
         | 
| 33 | 
            +
                      },
         | 
| 34 | 
            +
                      moduleNameMapper: getModuleNameMapper(webpackConfig),
         | 
| 35 | 
            +
                      testEnvironment: 'jsdom',
         | 
| 36 | 
            +
                      resolver: require.resolve('../resolver'),
         | 
| 37 | 
            +
                    });
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    utils.setJestConfig({
         | 
| 40 | 
            +
                      // todo: diffrent test root for diffrent solutions
         | 
| 41 | 
            +
                      testMatch: [`${pwd || process.cwd()}/(src|tests|api)/**/*.test.[jt]s?(x)`],
         | 
| 42 | 
            +
                    });
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    return next(utils);
         | 
| 45 | 
            +
                  },
         | 
| 46 | 
            +
                }),
         | 
| 47 | 
            +
                {
         | 
| 48 | 
            +
                  name: '@modern-js/testing-plugin-modern',
         | 
| 49 | 
            +
                },
         | 
| 50 | 
            +
              ) as any;
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            import enhanceResolve from 'enhanced-resolve';
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            const resolver = enhanceResolve.create.sync({
         | 
| 4 | 
            +
              conditionNames: ['require', 'node', 'default'],
         | 
| 5 | 
            +
              extensions: ['.js', '.json', '.node', '.ts', '.tsx'],
         | 
| 6 | 
            +
            });
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            const shouldResolveByEnhance = (url: string) => /^@[^/]+\/[^/]+\/.*/.test(url);
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            module.exports = function (request: string, options: any) {
         | 
| 11 | 
            +
              if (shouldResolveByEnhance(request)) {
         | 
| 12 | 
            +
                return resolver(options.basedir, request);
         | 
| 13 | 
            +
              }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              return options.defaultResolver(request, options);
         | 
| 16 | 
            +
            };
         | 
    
        package/src/cli/test.ts
    ADDED
    
    | @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            import path from 'path';
         | 
| 2 | 
            +
            import { compiler } from '@modern-js/babel-compiler';
         | 
| 3 | 
            +
            import { useAppContext, useResolvedConfigContext } from '@modern-js/core';
         | 
| 4 | 
            +
            import { TestConfig, runTest } from '@modern-js/testing';
         | 
| 5 | 
            +
            import { getWebpackConfig, WebpackConfigTarget } from '@modern-js/webpack';
         | 
| 6 | 
            +
            // import testingBffPlugin from '@modern-js/testing-plugin-bff';
         | 
| 7 | 
            +
            import modernTestPlugin from './plugins/modern';
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            declare module '@modern-js/core' {
         | 
| 10 | 
            +
              interface UserConfig {
         | 
| 11 | 
            +
                testing: TestConfig;
         | 
| 12 | 
            +
              }
         | 
| 13 | 
            +
            }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            const test = async () => {
         | 
| 16 | 
            +
              // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 17 | 
            +
              const { value: userConfig } = useResolvedConfigContext();
         | 
| 18 | 
            +
              // eslint-disable-next-line react-hooks/rules-of-hooks
         | 
| 19 | 
            +
              const { value: config } = useAppContext();
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              // todo: consider lib-tools ...
         | 
| 22 | 
            +
              const webpackConfigs = getWebpackConfig(WebpackConfigTarget.CLIENT);
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              userConfig.testing = userConfig.testing || {};
         | 
| 25 | 
            +
              userConfig.testing.jest =
         | 
| 26 | 
            +
                userConfig.testing.jest || (userConfig.tools as any).jest;
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              userConfig.testing.plugins = [
         | 
| 29 | 
            +
                ...(userConfig.testing.plugins || []),
         | 
| 30 | 
            +
                modernTestPlugin(webpackConfigs, userConfig, config.appDirectory),
         | 
| 31 | 
            +
                // testingBffPlugin({
         | 
| 32 | 
            +
                //   pwd: config.appDirectory,
         | 
| 33 | 
            +
                //   userConfig: userConfig,
         | 
| 34 | 
            +
                //   plugins: config.plugins.map(p => p.server).filter(Boolean),
         | 
| 35 | 
            +
                //   routes: (config as any).serverRoutes
         | 
| 36 | 
            +
                // }),
         | 
| 37 | 
            +
              ];
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              const runtimeExportsPath = path.join(
         | 
| 40 | 
            +
                config.internalDirectory,
         | 
| 41 | 
            +
                '.runtime-exports',
         | 
| 42 | 
            +
              );
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              await compiler(
         | 
| 45 | 
            +
                {
         | 
| 46 | 
            +
                  sourceDir: runtimeExportsPath,
         | 
| 47 | 
            +
                  rootDir: runtimeExportsPath,
         | 
| 48 | 
            +
                  distDir: runtimeExportsPath,
         | 
| 49 | 
            +
                  quiet: true,
         | 
| 50 | 
            +
                },
         | 
| 51 | 
            +
                {
         | 
| 52 | 
            +
                  presets: [
         | 
| 53 | 
            +
                    [
         | 
| 54 | 
            +
                      require.resolve('@babel/preset-env'),
         | 
| 55 | 
            +
                      {
         | 
| 56 | 
            +
                        modules: 'cjs',
         | 
| 57 | 
            +
                      },
         | 
| 58 | 
            +
                    ],
         | 
| 59 | 
            +
                  ],
         | 
| 60 | 
            +
                },
         | 
| 61 | 
            +
              );
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              await runTest(userConfig.testing);
         | 
| 64 | 
            +
            };
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            export default test;
         | 
    
        package/src/constant.ts
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            export const modernjs_config_key = '__modernjs_config__';
         |