@rstest/core 0.5.0 → 0.5.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/dist/0~816.js CHANGED
@@ -18,6 +18,7 @@ export const __webpack_modules__ = {
18
18
  var core_ = __webpack_require__("@rsbuild/core");
19
19
  var dist = __webpack_require__("../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.mjs");
20
20
  var utils = __webpack_require__("./src/utils/index.ts");
21
+ var memory = __webpack_require__("./src/utils/memory.ts");
21
22
  const RUNTIME_CHUNK_NAME = 'runtime';
22
23
  const pluginBasic = (context)=>({
23
24
  name: 'rstest:basic',
@@ -106,7 +107,7 @@ export const __webpack_modules__ = {
106
107
  });
107
108
  }
108
109
  });
109
- var external_node_path_ = __webpack_require__("path");
110
+ var external_node_path_ = __webpack_require__("node:path");
110
111
  var external_node_url_ = __webpack_require__("node:url");
111
112
  const PLUGIN_CSS_FILTER = 'rstest:css-filter';
112
113
  const css_filter_dirname = external_node_path_["default"].dirname((0, external_node_url_.fileURLToPath)(import.meta.url));
@@ -183,6 +184,7 @@ export const __webpack_modules__ = {
183
184
  });
184
185
  }
185
186
  });
187
+ var external_node_module_ = __webpack_require__("node:module");
186
188
  const autoExternalNodeModules = ({ context, request, dependencyType, getResolve }, callback)=>{
187
189
  if (!request) return callback();
188
190
  if (request.startsWith('@swc/helpers/')) return callback();
@@ -199,7 +201,7 @@ export const __webpack_modules__ = {
199
201
  };
200
202
  function autoExternalNodeBuiltin({ request, dependencyType }, callback) {
201
203
  if (!request) return void callback();
202
- const isNodeBuiltin = utils.Kv.some((builtin)=>{
204
+ const isNodeBuiltin = (0, external_node_module_.isBuiltin)(request) || utils.Uq.some((builtin)=>{
203
205
  if ('string' == typeof builtin) return builtin === request;
204
206
  return builtin.test(request);
205
207
  });
@@ -441,15 +443,14 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
441
443
  });
442
444
  }
443
445
  });
444
- function parseInlineSourceMap(code) {
446
+ function parseInlineSourceMapStr(code) {
445
447
  const inlineSourceMapRegex = /\/\/# sourceMappingURL=data:application\/json(?:;charset=utf-8)?;base64,(.+)\s*$/m;
446
448
  const match = code.match(inlineSourceMapRegex);
447
449
  if (!match || !match[1]) return null;
448
450
  try {
449
451
  const base64Data = match[1];
450
452
  const decodedStr = Buffer.from(base64Data, 'base64').toString('utf-8');
451
- const sourceMap = JSON.parse(decodedStr);
452
- return sourceMap;
453
+ return decodedStr;
453
454
  } catch (_error) {
454
455
  return null;
455
456
  }
@@ -561,6 +562,13 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
561
562
  deletedEntries
562
563
  };
563
564
  };
565
+ class AssetsMemorySafeMap extends Map {
566
+ set(key, value) {
567
+ if (this.has(key)) return this;
568
+ if (!(0, memory.i)()) this.clear();
569
+ return super.set(key, value);
570
+ }
571
+ }
564
572
  const createRsbuildServer = async ({ globTestSourceEntries, setupFiles, rsbuildInstance, inspectedConfig })=>{
565
573
  let rspackCompiler;
566
574
  const rstestCompilerPlugin = {
@@ -604,8 +612,9 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
604
612
  };
605
613
  const getRsbuildStats = async ({ environmentName, fileFilters })=>{
606
614
  const stats = await devServer.environments[environmentName].getStats();
615
+ const enableAssetsCache = (0, memory.i)();
607
616
  const manifest = devServer.environments[environmentName].context.manifest;
608
- const { entrypoints, outputPath, assets, hash, time: buildTime, chunks } = stats.toJson({
617
+ const { entrypoints, outputPath, assets, hash, chunks } = stats.toJson({
609
618
  all: false,
610
619
  hash: true,
611
620
  entrypoints: true,
@@ -640,47 +649,72 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
640
649
  }
641
650
  }
642
651
  const inlineSourceMap = 'inline-source-map' === stats.compilation.options.devtool;
643
- const sourceMaps = Object.fromEntries((await Promise.all(assets.map(async (asset)=>{
652
+ const sourceMapPaths = Object.fromEntries(assets.map((asset)=>{
644
653
  const assetFilePath = dist.Ay.join(outputPath, asset.name);
645
- if (inlineSourceMap) {
646
- const content = await readFile(assetFilePath);
647
- return [
648
- assetFilePath,
649
- parseInlineSourceMap(content)
650
- ];
651
- }
654
+ if (inlineSourceMap) return [
655
+ assetFilePath,
656
+ assetFilePath
657
+ ];
652
658
  const sourceMapPath = asset?.info.related?.sourceMap?.[0];
653
659
  if (sourceMapPath) {
654
660
  const filePath = dist.Ay.join(outputPath, sourceMapPath);
655
- const sourceMap = await readFile(filePath);
656
661
  return [
657
662
  assetFilePath,
658
- JSON.parse(sourceMap)
663
+ filePath
659
664
  ];
660
665
  }
661
666
  return [
662
667
  assetFilePath,
663
668
  null
664
669
  ];
665
- }))).filter((asset)=>null !== asset[1]));
670
+ }));
666
671
  buildData[environmentName] ??= {};
667
672
  const { affectedEntries, deletedEntries } = calcEntriesToRerun(entries, chunks, buildData[environmentName], `${environmentName}-${RUNTIME_CHUNK_NAME}`);
673
+ const cachedAssetFiles = new AssetsMemorySafeMap();
674
+ const cachedSourceMaps = new AssetsMemorySafeMap();
675
+ const readFileWithCache = async (name)=>{
676
+ if (enableAssetsCache && cachedAssetFiles.has(name)) return cachedAssetFiles.get(name);
677
+ const content = await readFile(name);
678
+ enableAssetsCache && cachedAssetFiles.set(name, content);
679
+ return content;
680
+ };
681
+ const getSourceMap = async (name)=>{
682
+ const sourceMapPath = sourceMapPaths[name];
683
+ if (!sourceMapPath) return null;
684
+ if (enableAssetsCache && cachedSourceMaps.has(name)) return cachedSourceMaps.get(name);
685
+ let content = null;
686
+ if (inlineSourceMap) {
687
+ const file = await readFile(sourceMapPath);
688
+ content = parseInlineSourceMapStr(file);
689
+ } else {
690
+ const sourceMap = await readFile(sourceMapPath);
691
+ content = sourceMap;
692
+ }
693
+ enableAssetsCache && content && cachedSourceMaps.set(name, content);
694
+ return content;
695
+ };
696
+ const assetNames = assets.map((asset)=>dist.Ay.join(outputPath, asset.name));
668
697
  return {
669
698
  affectedEntries,
670
699
  deletedEntries,
671
700
  hash,
672
701
  entries,
673
702
  setupEntries,
674
- buildTime: buildTime,
675
- assetFiles: Object.fromEntries(await Promise.all(assets.map(async (a)=>{
676
- const filePath = dist.Ay.join(outputPath, a.name);
677
- return [
678
- filePath,
679
- await readFile(filePath)
680
- ];
681
- }))),
682
- sourceMaps,
683
- getSourcemap: (sourcePath)=>sourceMaps[sourcePath] || null
703
+ assetNames,
704
+ getAssetFiles: async (names)=>Object.fromEntries(await Promise.all(names.map(async (name)=>{
705
+ const content = await readFileWithCache(name);
706
+ return [
707
+ name,
708
+ content
709
+ ];
710
+ }))),
711
+ getSourceMaps: async (names)=>Object.fromEntries(await Promise.all(names.map(async (name)=>{
712
+ const content = await getSourceMap(name);
713
+ return [
714
+ name,
715
+ content
716
+ ];
717
+ })))
684
718
  };
685
719
  };
686
720
  return {
@@ -695,6 +729,7 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
695
729
  });
696
730
  var external_node_os_ = __webpack_require__("node:os");
697
731
  var utils = __webpack_require__("./src/utils/index.ts");
732
+ var memory = __webpack_require__("./src/utils/memory.ts");
698
733
  var external_node_url_ = __webpack_require__("node:url");
699
734
  const TYPE_REQUEST = "q";
700
735
  const TYPE_RESPONSE = "s";
@@ -940,8 +975,9 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
940
975
  return parsed > 0 ? parsed : 1;
941
976
  };
942
977
  const getRuntimeConfig = (context)=>{
943
- const { testNamePattern, testTimeout, passWithNoTests, retry, globals, clearMocks, resetMocks, restoreMocks, unstubEnvs, unstubGlobals, maxConcurrency, printConsoleTrace, disableConsoleIntercept, testEnvironment, hookTimeout, isolate, coverage } = context.normalizedConfig;
978
+ const { testNamePattern, testTimeout, passWithNoTests, retry, globals, clearMocks, resetMocks, restoreMocks, unstubEnvs, unstubGlobals, maxConcurrency, printConsoleTrace, disableConsoleIntercept, testEnvironment, hookTimeout, isolate, coverage, snapshotFormat, env } = context.normalizedConfig;
944
979
  return {
980
+ env,
945
981
  testNamePattern,
946
982
  testTimeout,
947
983
  hookTimeout,
@@ -958,12 +994,17 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
958
994
  disableConsoleIntercept,
959
995
  testEnvironment,
960
996
  isolate,
961
- coverage
997
+ coverage,
998
+ snapshotFormat
962
999
  };
963
1000
  };
964
- const filterAssetsByEntry = (entryInfo, assetFiles, setupAssets, sourceMaps, entryLength)=>{
965
- const neededFiles = entryLength > 1 && entryInfo.files ? Object.fromEntries(Object.entries(assetFiles).filter(([key])=>entryInfo.files.includes(key) || setupAssets.includes(key))) : assetFiles;
966
- const neededSourceMaps = entryLength > 1 ? Object.fromEntries(Object.entries(sourceMaps).filter(([key])=>neededFiles[key])) : sourceMaps;
1001
+ const filterAssetsByEntry = async (entryInfo, getAssetFiles, getSourceMaps, setupAssets)=>{
1002
+ const assetNames = Array.from(new Set([
1003
+ ...entryInfo.files,
1004
+ ...setupAssets
1005
+ ]));
1006
+ const neededFiles = await getAssetFiles(assetNames);
1007
+ const neededSourceMaps = await getSourceMaps(assetNames);
967
1008
  return {
968
1009
  assetFiles: neededFiles,
969
1010
  sourceMaps: neededSourceMaps
@@ -1006,23 +1047,17 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1006
1047
  },
1007
1048
  onTestFileStart: async (test)=>{
1008
1049
  await Promise.all(reporters.map((reporter)=>reporter.onTestFileStart?.(test)));
1009
- },
1010
- onTestFileResult: async (test)=>{
1011
- await Promise.all(reporters.map((reporter)=>reporter.onTestFileResult?.(test)));
1012
1050
  }
1013
1051
  };
1014
1052
  return {
1015
- runTests: async ({ entries, assetFiles, setupEntries, sourceMaps, project, updateSnapshot })=>{
1053
+ runTests: async ({ entries, getAssetFiles, getSourceMaps, setupEntries, project, updateSnapshot })=>{
1016
1054
  const projectName = context.normalizedConfig.name;
1017
1055
  const runtimeConfig = getRuntimeConfig(project);
1018
1056
  const setupAssets = setupEntries.flatMap((entry)=>entry.files || []);
1019
- const entryLength = Object.keys(entries).length;
1020
- const results = await Promise.all(entries.map((entryInfo)=>{
1021
- const { assetFiles: neededFiles, sourceMaps: neededSourceMaps } = filterAssetsByEntry(entryInfo, assetFiles, setupAssets, sourceMaps, entryLength);
1022
- return pool.runTest({
1057
+ const results = await Promise.all(entries.map(async (entryInfo)=>{
1058
+ const result = await pool.runTest({
1023
1059
  options: {
1024
1060
  entryInfo,
1025
- assetFiles: neededFiles,
1026
1061
  context: {
1027
1062
  project: projectName,
1028
1063
  rootPath: context.rootPath,
@@ -1030,11 +1065,14 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1030
1065
  runtimeConfig: (0, utils.Ok)(runtimeConfig)
1031
1066
  },
1032
1067
  type: 'run',
1033
- sourceMaps: neededSourceMaps,
1034
1068
  setupEntries,
1035
- updateSnapshot
1069
+ updateSnapshot,
1070
+ assets: (0, memory.i)() ? await filterAssetsByEntry(entryInfo, getAssetFiles, getSourceMaps, setupAssets) : void 0
1036
1071
  },
1037
- rpcMethods
1072
+ rpcMethods: {
1073
+ ...rpcMethods,
1074
+ getAssetsByEntry: async ()=>filterAssetsByEntry(entryInfo, getAssetFiles, getSourceMaps, setupAssets)
1075
+ }
1038
1076
  }).catch((err)=>{
1039
1077
  err.fullStack = true;
1040
1078
  return {
@@ -1048,6 +1086,8 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1048
1086
  ]
1049
1087
  };
1050
1088
  });
1089
+ reporters.map((reporter)=>reporter.onTestFileResult?.(result));
1090
+ return result;
1051
1091
  }));
1052
1092
  for (const result of results)if (result.snapshotResult) context.snapshotManager.add(result.snapshotResult);
1053
1093
  const testResults = results.flatMap((r)=>r.results);
@@ -1057,17 +1097,13 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1057
1097
  project
1058
1098
  };
1059
1099
  },
1060
- collectTests: async ({ entries, assetFiles, setupEntries, sourceMaps, project, updateSnapshot })=>{
1100
+ collectTests: async ({ entries, getAssetFiles, getSourceMaps, setupEntries, project, updateSnapshot })=>{
1061
1101
  const runtimeConfig = getRuntimeConfig(project);
1062
1102
  const projectName = project.normalizedConfig.name;
1063
1103
  const setupAssets = setupEntries.flatMap((entry)=>entry.files || []);
1064
- const entryLength = Object.keys(entries).length;
1065
- return Promise.all(entries.map((entryInfo)=>{
1066
- const { assetFiles: neededFiles, sourceMaps: neededSourceMaps } = filterAssetsByEntry(entryInfo, assetFiles, setupAssets, sourceMaps, entryLength);
1067
- return pool.collectTests({
1104
+ return Promise.all(entries.map(async (entryInfo)=>pool.collectTests({
1068
1105
  options: {
1069
1106
  entryInfo,
1070
- assetFiles: neededFiles,
1071
1107
  context: {
1072
1108
  project: projectName,
1073
1109
  rootPath: context.rootPath,
@@ -1075,11 +1111,14 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1075
1111
  runtimeConfig: (0, utils.Ok)(runtimeConfig)
1076
1112
  },
1077
1113
  type: 'collect',
1078
- sourceMaps: neededSourceMaps,
1079
1114
  setupEntries,
1080
- updateSnapshot
1115
+ updateSnapshot,
1116
+ assets: (0, memory.i)() ? await filterAssetsByEntry(entryInfo, getAssetFiles, getSourceMaps, setupAssets) : void 0
1081
1117
  },
1082
- rpcMethods
1118
+ rpcMethods: {
1119
+ ...rpcMethods,
1120
+ getAssetsByEntry: async ()=>filterAssetsByEntry(entryInfo, getAssetFiles, getSourceMaps, setupAssets)
1121
+ }
1083
1122
  }).catch((err)=>{
1084
1123
  err.fullStack = true;
1085
1124
  return {
@@ -1090,13 +1129,29 @@ global.__rstest_clean_core_cache__ = __rstest_clean_core_cache__;
1090
1129
  err
1091
1130
  ]
1092
1131
  };
1093
- });
1094
- }));
1132
+ })));
1095
1133
  },
1096
1134
  close: ()=>pool.close()
1097
1135
  };
1098
1136
  };
1099
1137
  },
1138
+ "./src/utils/memory.ts": function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1139
+ __webpack_require__.d(__webpack_exports__, {
1140
+ i: ()=>isMemorySufficient
1141
+ });
1142
+ var node_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("node:process");
1143
+ const DefaultMaxHeapSize = 1073741824;
1144
+ function isMemorySufficient(options) {
1145
+ const { memoryThreshold = 0.7, maxHeapSize = DefaultMaxHeapSize } = options || {};
1146
+ if (!node_process__WEBPACK_IMPORTED_MODULE_0__["default"]?.memoryUsage) return true;
1147
+ const memoryUsage = node_process__WEBPACK_IMPORTED_MODULE_0__["default"].memoryUsage();
1148
+ const heapUsed = memoryUsage.heapUsed;
1149
+ const heapTotal = memoryUsage.heapTotal;
1150
+ const memoryUsageRatio = heapUsed / heapTotal;
1151
+ const isMemorySufficient = memoryUsageRatio < memoryThreshold && heapUsed < maxHeapSize;
1152
+ return isMemorySufficient;
1153
+ }
1154
+ },
1100
1155
  "node:url": function(module) {
1101
1156
  module.exports = __WEBPACK_EXTERNAL_MODULE_node_url_e96de089__;
1102
1157
  }
package/dist/0~85.js CHANGED
@@ -1395,7 +1395,6 @@ export const __webpack_modules__ = {
1395
1395
  hooks,
1396
1396
  api
1397
1397
  });
1398
- hooks.onTestFileResult?.(results);
1399
1398
  return results;
1400
1399
  },
1401
1400
  collectTests: async ()=>{
package/dist/0~928.js CHANGED
@@ -13,7 +13,7 @@ export const __webpack_modules__ = {
13
13
  var external_node_fs_ = __webpack_require__("node:fs");
14
14
  var promises_ = __webpack_require__("fs/promises");
15
15
  var external_events_ = __webpack_require__("events");
16
- var external_node_path_ = __webpack_require__("path");
16
+ var external_node_path_ = __webpack_require__("node:path");
17
17
  var external_node_fs_promises_ = __webpack_require__("node:fs/promises");
18
18
  var external_node_stream_ = __webpack_require__("node:stream");
19
19
  const EntryTypes = {
package/dist/0~967.js CHANGED
@@ -10,7 +10,7 @@ export const __webpack_modules__ = {
10
10
  onBeforeRestart: ()=>onBeforeRestart,
11
11
  watchFilesForRestart: ()=>watchFilesForRestart
12
12
  });
13
- var external_node_path_ = __webpack_require__("path");
13
+ var external_node_path_ = __webpack_require__("node:path");
14
14
  var commands = __webpack_require__("./src/cli/commands.ts");
15
15
  var utils = __webpack_require__("./src/utils/index.ts");
16
16
  const GLOB_REGEX = /[*?{}[\]()!@+|]/;
package/dist/0~971.js CHANGED
@@ -10,7 +10,7 @@ export const __webpack_modules__ = {
10
10
  listTests: ()=>listTests
11
11
  });
12
12
  var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("node:fs");
13
- var node_path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("path");
13
+ var node_path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("node:path");
14
14
  var _pool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./src/pool/index.ts");
15
15
  var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./src/utils/index.ts");
16
16
  var _rsbuild__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./src/core/rsbuild.ts");
@@ -54,24 +54,24 @@ export const __webpack_modules__ = {
54
54
  });
55
55
  const updateSnapshot = context.snapshotManager.options.updateSnapshot;
56
56
  const returns = await Promise.all(context.projects.map(async (project)=>{
57
- const { entries, setupEntries, assetFiles, sourceMaps } = await getRsbuildStats({
57
+ const { entries, setupEntries, getSourceMaps, getAssetFiles, assetNames } = await getRsbuildStats({
58
58
  environmentName: project.environmentName
59
59
  });
60
60
  const list = await pool.collectTests({
61
61
  entries,
62
- sourceMaps,
63
62
  setupEntries,
64
- assetFiles,
63
+ getAssetFiles,
64
+ getSourceMaps,
65
65
  project,
66
66
  updateSnapshot
67
67
  });
68
68
  return {
69
69
  list,
70
- sourceMaps
70
+ getSourceMaps,
71
+ assetNames
71
72
  };
72
73
  }));
73
74
  const list = returns.flatMap((r)=>r.list);
74
- const sourceMaps = Object.assign({}, ...returns.map((r)=>r.sourceMaps));
75
75
  const tests = [];
76
76
  const traverseTests = (test)=>{
77
77
  if ([
@@ -98,7 +98,13 @@ export const __webpack_modules__ = {
98
98
  const relativePath = (0, node_path__WEBPACK_IMPORTED_MODULE_1__.relative)(rootPath, file.testPath);
99
99
  if (file.errors?.length) {
100
100
  _utils__WEBPACK_IMPORTED_MODULE_3__.vF.log(`${_utils__WEBPACK_IMPORTED_MODULE_3__.yW.bgRed(' FAIL ')} ${relativePath}`);
101
- for (const error of file.errors)await printError(error, (name)=>sourceMaps[name] || null, rootPath);
101
+ for (const error of file.errors)await printError(error, async (name)=>{
102
+ const resource = returns.find((r)=>r.assetNames.includes(name));
103
+ const sourceMap = (await resource?.getSourceMaps([
104
+ name
105
+ ]))?.[name];
106
+ return sourceMap ? JSON.parse(sourceMap) : null;
107
+ }, rootPath);
102
108
  }
103
109
  }
104
110
  await closeServer();