jest.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = nextJest;
  6. var _env = require("@next/env");
  7. var _path = require("path");
  8. var _config = _interopRequireDefault(require("../../server/config"));
  9. var _constants = require("../../shared/lib/constants");
  10. var _loadJsconfig = _interopRequireDefault(require("../load-jsconfig"));
  11. var Log = _interopRequireWildcard(require("../output/log"));
  12. var _findPagesDir = require("../../lib/find-pages-dir");
  13. var _swc = require("../swc");
  14. function nextJest(options = {}) {
  15. // createJestConfig
  16. return (customJestConfig)=>{
  17. // Function that is provided as the module.exports of jest.config.js
  18. // Will be called and awaited by Jest
  19. return async ()=>{
  20. let nextConfig;
  21. let jsConfig;
  22. let resolvedBaseUrl;
  23. let isEsmProject = false;
  24. let pagesDir;
  25. if (options.dir) {
  26. const resolvedDir = (0, _path).resolve(options.dir);
  27. pagesDir = (0, _findPagesDir).findPagesDir(resolvedDir).pages;
  28. const packageConfig = loadClosestPackageJson(resolvedDir);
  29. isEsmProject = packageConfig.type === "module";
  30. nextConfig = await getConfig(resolvedDir);
  31. (0, _env).loadEnvConfig(resolvedDir, false, Log);
  32. // TODO: revisit when bug in SWC is fixed that strips `.css`
  33. const result = await (0, _loadJsconfig).default(resolvedDir, nextConfig);
  34. jsConfig = result.jsConfig;
  35. resolvedBaseUrl = result.resolvedBaseUrl;
  36. }
  37. var ref;
  38. // Ensure provided async config is supported
  39. const resolvedJestConfig = (ref = typeof customJestConfig === "function" ? await customJestConfig() : customJestConfig) != null ? ref : {};
  40. // eagerly load swc bindings instead of waiting for transform calls
  41. await (0, _swc).loadBindings();
  42. if (_swc.lockfilePatchPromise.cur) {
  43. await _swc.lockfilePatchPromise.cur;
  44. }
  45. return {
  46. ...resolvedJestConfig,
  47. moduleNameMapper: {
  48. // Handle CSS imports (with CSS modules)
  49. // https://jestjs.io/docs/webpack#mocking-css-modules
  50. "^.+\\.module\\.(css|sass|scss)$": require.resolve("./object-proxy.js"),
  51. // Handle CSS imports (without CSS modules)
  52. "^.+\\.(css|sass|scss)$": require.resolve("./__mocks__/styleMock.js"),
  53. // Handle image imports
  54. "^.+\\.(png|jpg|jpeg|gif|webp|avif|ico|bmp)$": require.resolve(`./__mocks__/fileMock.js`),
  55. // Keep .svg to it's own rule to make overriding easy
  56. "^.+\\.(svg)$": require.resolve(`./__mocks__/fileMock.js`),
  57. // custom config comes last to ensure the above rules are matched,
  58. // fixes the case where @pages/(.*) -> src/pages/$! doesn't break
  59. // CSS/image mocks
  60. ...resolvedJestConfig.moduleNameMapper || {}
  61. },
  62. testPathIgnorePatterns: [
  63. // Don't look for tests in node_modules
  64. "/node_modules/",
  65. // Don't look for tests in the Next.js build output
  66. "/.next/",
  67. // Custom config can append to testPathIgnorePatterns but not modify it
  68. // This is to ensure `.next` and `node_modules` are always excluded
  69. ...resolvedJestConfig.testPathIgnorePatterns || [],
  70. ],
  71. transform: {
  72. // Use SWC to compile tests
  73. "^.+\\.(js|jsx|ts|tsx|mjs)$": [
  74. require.resolve("../swc/jest-transformer"),
  75. {
  76. nextConfig,
  77. jsConfig,
  78. resolvedBaseUrl,
  79. isEsmProject,
  80. pagesDir
  81. },
  82. ],
  83. // Allow for appending/overriding the default transforms
  84. ...resolvedJestConfig.transform || {}
  85. },
  86. transformIgnorePatterns: [
  87. // To match Next.js behavior node_modules is not transformed
  88. "/node_modules/",
  89. // CSS modules are mocked so they don't need to be transformed
  90. "^.+\\.module\\.(css|sass|scss)$",
  91. // Custom config can append to transformIgnorePatterns but not modify it
  92. // This is to ensure `node_modules` and .module.css/sass/scss are always excluded
  93. ...resolvedJestConfig.transformIgnorePatterns || [],
  94. ],
  95. watchPathIgnorePatterns: [
  96. // Don't re-run tests when the Next.js build output changes
  97. "/.next/",
  98. ...resolvedJestConfig.watchPathIgnorePatterns || [],
  99. ]
  100. };
  101. };
  102. };
  103. }
  104. function _interopRequireDefault(obj) {
  105. return obj && obj.__esModule ? obj : {
  106. default: obj
  107. };
  108. }
  109. function _getRequireWildcardCache() {
  110. if (typeof WeakMap !== "function") return null;
  111. var cache = new WeakMap();
  112. _getRequireWildcardCache = function() {
  113. return cache;
  114. };
  115. return cache;
  116. }
  117. function _interopRequireWildcard(obj) {
  118. if (obj && obj.__esModule) {
  119. return obj;
  120. }
  121. if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
  122. return {
  123. default: obj
  124. };
  125. }
  126. var cache = _getRequireWildcardCache();
  127. if (cache && cache.has(obj)) {
  128. return cache.get(obj);
  129. }
  130. var newObj = {};
  131. var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
  132. for(var key in obj){
  133. if (Object.prototype.hasOwnProperty.call(obj, key)) {
  134. var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
  135. if (desc && (desc.get || desc.set)) {
  136. Object.defineProperty(newObj, key, desc);
  137. } else {
  138. newObj[key] = obj[key];
  139. }
  140. }
  141. }
  142. newObj.default = obj;
  143. if (cache) {
  144. cache.set(obj, newObj);
  145. }
  146. return newObj;
  147. }
  148. async function getConfig(dir) {
  149. const conf = await (0, _config).default(_constants.PHASE_TEST, dir);
  150. return conf;
  151. }
  152. /**
  153. * Loads closest package.json in the directory hierarchy
  154. */ function loadClosestPackageJson(dir, attempts = 1) {
  155. if (attempts > 5) {
  156. throw new Error("Can't resolve main package.json file");
  157. }
  158. var mainPath = attempts === 1 ? "./" : Array(attempts).join("../");
  159. try {
  160. return require((0, _path).join(dir, mainPath + "package.json"));
  161. } catch (e) {
  162. return loadClosestPackageJson(dir, attempts + 1);
  163. }
  164. }
  165. if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
  166. Object.defineProperty(exports.default, '__esModule', { value: true });
  167. Object.assign(exports.default, exports);
  168. module.exports = exports.default;
  169. }
  170. //# sourceMappingURL=jest.js.map