@rspack-debug/test-tools 1.4.11 → 1.6.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.
Files changed (257) hide show
  1. package/README.md +1 -1
  2. package/dist/case/builtin.d.ts +3 -0
  3. package/dist/case/builtin.js +152 -14
  4. package/dist/case/cache.d.ts +2 -2
  5. package/dist/case/cache.js +214 -12
  6. package/dist/case/common.d.ts +11 -0
  7. package/dist/case/common.js +249 -0
  8. package/dist/case/compiler.d.ts +17 -4
  9. package/dist/case/compiler.js +149 -12
  10. package/dist/case/config.d.ts +7 -2
  11. package/dist/case/config.js +106 -18
  12. package/dist/case/defaults.d.ts +13 -4
  13. package/dist/case/defaults.js +73 -18
  14. package/dist/case/diagnostic.d.ts +6 -0
  15. package/dist/case/diagnostic.js +121 -14
  16. package/dist/case/error.d.ts +15 -4
  17. package/dist/case/error.js +137 -12
  18. package/dist/case/esm-output.d.ts +1 -0
  19. package/dist/case/esm-output.js +117 -0
  20. package/dist/case/example.d.ts +1 -0
  21. package/dist/case/example.js +57 -0
  22. package/dist/case/hash.d.ts +2 -2
  23. package/dist/case/hash.js +72 -9
  24. package/dist/case/hook.d.ts +36 -4
  25. package/dist/case/hook.js +209 -20
  26. package/dist/case/hot-step.d.ts +2 -2
  27. package/dist/case/hot-step.js +309 -13
  28. package/dist/case/hot.d.ts +11 -2
  29. package/dist/case/hot.js +217 -12
  30. package/dist/case/incremental.d.ts +2 -2
  31. package/dist/case/incremental.js +24 -45
  32. package/dist/case/index.d.ts +31 -20
  33. package/dist/case/index.js +50 -34
  34. package/dist/case/multi-compiler.d.ts +19 -0
  35. package/dist/case/multi-compiler.js +97 -0
  36. package/dist/case/{nativeWatcher.js → native-watcher.js} +11 -23
  37. package/dist/case/normal.d.ts +3 -0
  38. package/dist/case/normal.js +202 -18
  39. package/dist/case/runner.d.ts +19 -0
  40. package/dist/case/runner.js +113 -0
  41. package/dist/case/serial.d.ts +2 -2
  42. package/dist/case/serial.js +10 -14
  43. package/dist/case/stats-api.d.ts +8 -3
  44. package/dist/case/stats-api.js +69 -10
  45. package/dist/case/stats-output.d.ts +11 -0
  46. package/dist/case/stats-output.js +199 -8
  47. package/dist/case/treeshaking.js +34 -7
  48. package/dist/case/watch.d.ts +27 -0
  49. package/dist/case/watch.js +318 -22
  50. package/dist/compiler.d.ts +16 -16
  51. package/dist/compiler.js +120 -15
  52. package/dist/helper/directory.d.ts +1 -1
  53. package/dist/helper/directory.js +2 -2
  54. package/dist/helper/expect/error.js +1 -1
  55. package/dist/helper/expect/placeholder.js +7 -7
  56. package/dist/helper/expect/to-match-file-snapshot.d.ts +1 -2
  57. package/dist/helper/expect/to-match-file-snapshot.js +3 -3
  58. package/dist/helper/hot-update/loader.d.ts +2 -1
  59. package/dist/helper/hot-update/loader.js +5 -30
  60. package/dist/helper/hot-update/plugin.d.ts +1 -1
  61. package/dist/helper/hot-update/plugin.js +14 -13
  62. package/dist/helper/index.d.ts +2 -1
  63. package/dist/helper/index.js +2 -1
  64. package/dist/helper/is.d.ts +2 -0
  65. package/dist/helper/is.js +15 -0
  66. package/dist/helper/legacy/LogTestPlugin.d.ts +6 -0
  67. package/dist/helper/legacy/LogTestPlugin.js +35 -0
  68. package/dist/helper/legacy/asModule.js +0 -2
  69. package/dist/helper/legacy/checkArrayExpectation.d.ts +1 -1
  70. package/dist/helper/legacy/checkArrayExpectation.js +8 -8
  71. package/dist/helper/legacy/createFakeWorker.d.ts +2 -2
  72. package/dist/helper/legacy/createFakeWorker.js +44 -20
  73. package/dist/helper/legacy/createLazyTestEnv.d.ts +3 -2
  74. package/dist/helper/legacy/createLazyTestEnv.js +3 -3
  75. package/dist/helper/legacy/deprecationTracking.d.ts +1 -0
  76. package/dist/helper/legacy/deprecationTracking.js +41 -0
  77. package/dist/helper/legacy/expectSource.d.ts +10 -0
  78. package/dist/helper/legacy/expectSource.js +23 -0
  79. package/dist/helper/legacy/findOutputFiles.d.ts +6 -0
  80. package/dist/helper/legacy/findOutputFiles.js +14 -0
  81. package/dist/helper/legacy/regexEscape.d.ts +2 -0
  82. package/dist/helper/legacy/regexEscape.js +5 -0
  83. package/dist/helper/legacy/supportDefaultAssignment.js +13 -0
  84. package/dist/helper/legacy/supportsTextDecoder.d.ts +2 -0
  85. package/dist/helper/legacy/supportsTextDecoder.js +9 -0
  86. package/dist/helper/legacy/supportsUsing.d.ts +2 -0
  87. package/dist/helper/legacy/supportsUsing.js +26 -0
  88. package/dist/helper/legacy/urlToRelativePath.js +5 -2
  89. package/dist/helper/read-config-file.d.ts +3 -2
  90. package/dist/helper/read-config-file.js +12 -2
  91. package/dist/helper/setup-env.js +15 -2
  92. package/dist/helper/setup-expect.js +2 -2
  93. package/dist/helper/setup-wasm.js +2 -2
  94. package/dist/helper/stringify-config.d.ts +2 -0
  95. package/dist/helper/stringify-config.js +43 -0
  96. package/dist/helper/util/checkStats.d.ts +0 -1
  97. package/dist/helper/util/checkStats.js +0 -18
  98. package/dist/helper/util/expectWarningFactory.js +2 -4
  99. package/dist/index.d.ts +0 -4
  100. package/dist/index.js +0 -4
  101. package/dist/plugin/index.d.ts +0 -3
  102. package/dist/plugin/index.js +0 -3
  103. package/dist/plugin/lazy-compilation-test-plugin.js +4 -4
  104. package/dist/runner/index.d.ts +2 -9
  105. package/dist/runner/index.js +2 -9
  106. package/dist/runner/node/index.d.ts +41 -0
  107. package/dist/runner/node/index.js +450 -0
  108. package/dist/runner/web/index.d.ts +30 -0
  109. package/dist/runner/web/index.js +343 -0
  110. package/dist/test/context.d.ts +15 -18
  111. package/dist/test/context.js +52 -57
  112. package/dist/test/creator.d.ts +20 -19
  113. package/dist/test/creator.js +69 -57
  114. package/dist/test/debug.d.ts +15 -0
  115. package/dist/test/debug.js +205 -0
  116. package/dist/test/tester.d.ts +1 -0
  117. package/dist/test/tester.js +44 -6
  118. package/dist/type.d.ts +94 -64
  119. package/dist/type.js +8 -12
  120. package/package.json +22 -61
  121. package/rstest.d.ts +24 -0
  122. package/dist/case/diff.d.ts +0 -3
  123. package/dist/case/diff.js +0 -126
  124. package/dist/compare/comparator.d.ts +0 -17
  125. package/dist/compare/comparator.js +0 -52
  126. package/dist/compare/compare.d.ts +0 -17
  127. package/dist/compare/compare.js +0 -175
  128. package/dist/compare/format-code.d.ts +0 -16
  129. package/dist/compare/format-code.js +0 -239
  130. package/dist/compare/index.d.ts +0 -5
  131. package/dist/compare/index.js +0 -21
  132. package/dist/compare/replace-module-argument.d.ts +0 -1
  133. package/dist/compare/replace-module-argument.js +0 -8
  134. package/dist/compare/replace-runtime-module-name.d.ts +0 -1
  135. package/dist/compare/replace-runtime-module-name.js +0 -71
  136. package/dist/helper/legacy/FakeDocument.d.ts +0 -54
  137. package/dist/helper/legacy/FakeDocument.js +0 -278
  138. package/dist/helper/legacy/createLogger.d.ts +0 -23
  139. package/dist/helper/legacy/createLogger.js +0 -20
  140. package/dist/helper/legacy/supportsImportFn.d.ts +0 -1
  141. package/dist/helper/legacy/supportsImportFn.js +0 -15
  142. package/dist/helper/legacy/supportsWorker.js +0 -17
  143. package/dist/helper/legacy/walkCssTokens.d.ts +0 -40
  144. package/dist/helper/legacy/walkCssTokens.js +0 -761
  145. package/dist/helper/legacy/warmup-webpack.d.ts +0 -1
  146. package/dist/helper/legacy/warmup-webpack.js +0 -26
  147. package/dist/helper/loaders/hot-update.d.ts +0 -1
  148. package/dist/helper/loaders/hot-update.js +0 -40
  149. package/dist/helper/plugins/hot-update.d.ts +0 -7
  150. package/dist/helper/plugins/hot-update.js +0 -40
  151. package/dist/helper/plugins/index.d.ts +0 -1
  152. package/dist/helper/plugins/index.js +0 -17
  153. package/dist/helper/util/currentWatchStep.d.ts +0 -1
  154. package/dist/helper/util/currentWatchStep.js +0 -2
  155. package/dist/helper/util/identifier.d.ts +0 -76
  156. package/dist/helper/util/identifier.js +0 -339
  157. package/dist/helper/util/replaceMitteDiagnostic.d.ts +0 -2
  158. package/dist/helper/util/replaceMitteDiagnostic.js +0 -17
  159. package/dist/plugin/rspack-diff-config-plugin.d.ts +0 -7
  160. package/dist/plugin/rspack-diff-config-plugin.js +0 -42
  161. package/dist/plugin/webpack-diff-config-plugin.d.ts +0 -7
  162. package/dist/plugin/webpack-diff-config-plugin.js +0 -41
  163. package/dist/plugin/webpack-module-placeholder-plugin.d.ts +0 -3
  164. package/dist/plugin/webpack-module-placeholder-plugin.js +0 -106
  165. package/dist/processor/basic.d.ts +0 -24
  166. package/dist/processor/basic.js +0 -146
  167. package/dist/processor/builtin.d.ts +0 -9
  168. package/dist/processor/builtin.js +0 -171
  169. package/dist/processor/cache.d.ts +0 -20
  170. package/dist/processor/cache.js +0 -128
  171. package/dist/processor/config.d.ts +0 -11
  172. package/dist/processor/config.js +0 -81
  173. package/dist/processor/defaults.d.ts +0 -30
  174. package/dist/processor/defaults.js +0 -72
  175. package/dist/processor/diagnostic.d.ts +0 -15
  176. package/dist/processor/diagnostic.js +0 -102
  177. package/dist/processor/diff.d.ts +0 -30
  178. package/dist/processor/diff.js +0 -140
  179. package/dist/processor/error.d.ts +0 -23
  180. package/dist/processor/error.js +0 -95
  181. package/dist/processor/hash.d.ts +0 -10
  182. package/dist/processor/hash.js +0 -63
  183. package/dist/processor/hook.d.ts +0 -44
  184. package/dist/processor/hook.js +0 -204
  185. package/dist/processor/hot-incremental.d.ts +0 -14
  186. package/dist/processor/hot-incremental.js +0 -43
  187. package/dist/processor/hot-step.d.ts +0 -18
  188. package/dist/processor/hot-step.js +0 -304
  189. package/dist/processor/hot.d.ts +0 -17
  190. package/dist/processor/hot.js +0 -140
  191. package/dist/processor/index.d.ts +0 -20
  192. package/dist/processor/index.js +0 -36
  193. package/dist/processor/multi.d.ts +0 -17
  194. package/dist/processor/multi.js +0 -73
  195. package/dist/processor/normal.d.ts +0 -12
  196. package/dist/processor/normal.js +0 -150
  197. package/dist/processor/simple.d.ts +0 -23
  198. package/dist/processor/simple.js +0 -49
  199. package/dist/processor/snapshot.d.ts +0 -12
  200. package/dist/processor/snapshot.js +0 -66
  201. package/dist/processor/stats-api.d.ts +0 -18
  202. package/dist/processor/stats-api.js +0 -48
  203. package/dist/processor/stats.d.ts +0 -18
  204. package/dist/processor/stats.js +0 -206
  205. package/dist/processor/treeshaking.d.ts +0 -10
  206. package/dist/processor/treeshaking.js +0 -33
  207. package/dist/processor/watch.d.ts +0 -30
  208. package/dist/processor/watch.js +0 -241
  209. package/dist/reporter/diff-html.d.ts +0 -15
  210. package/dist/reporter/diff-html.js +0 -69
  211. package/dist/reporter/diff-stats.d.ts +0 -24
  212. package/dist/reporter/diff-stats.js +0 -131
  213. package/dist/reporter/index.d.ts +0 -2
  214. package/dist/reporter/index.js +0 -18
  215. package/dist/runner/basic.d.ts +0 -10
  216. package/dist/runner/basic.js +0 -63
  217. package/dist/runner/cache.d.ts +0 -5
  218. package/dist/runner/cache.js +0 -90
  219. package/dist/runner/hot-step.d.ts +0 -5
  220. package/dist/runner/hot-step.js +0 -87
  221. package/dist/runner/hot.d.ts +0 -5
  222. package/dist/runner/hot.js +0 -83
  223. package/dist/runner/multiple.d.ts +0 -11
  224. package/dist/runner/multiple.js +0 -38
  225. package/dist/runner/normal.d.ts +0 -5
  226. package/dist/runner/normal.js +0 -20
  227. package/dist/runner/runner/basic.d.ts +0 -30
  228. package/dist/runner/runner/basic.js +0 -107
  229. package/dist/runner/runner/cjs.d.ts +0 -14
  230. package/dist/runner/runner/cjs.js +0 -151
  231. package/dist/runner/runner/esm.d.ts +0 -7
  232. package/dist/runner/runner/esm.js +0 -125
  233. package/dist/runner/runner/index.d.ts +0 -8
  234. package/dist/runner/runner/index.js +0 -24
  235. package/dist/runner/runner/normal.d.ts +0 -9
  236. package/dist/runner/runner/normal.js +0 -23
  237. package/dist/runner/runner/watch.d.ts +0 -16
  238. package/dist/runner/runner/watch.js +0 -27
  239. package/dist/runner/runner/web/fake.d.ts +0 -18
  240. package/dist/runner/runner/web/fake.js +0 -143
  241. package/dist/runner/runner/web/jsdom.d.ts +0 -26
  242. package/dist/runner/runner/web/jsdom.js +0 -219
  243. package/dist/runner/runner/web.d.ts +0 -15
  244. package/dist/runner/runner/web.js +0 -32
  245. package/dist/runner/type.d.ts +0 -42
  246. package/dist/runner/type.js +0 -9
  247. package/dist/runner/watch.d.ts +0 -7
  248. package/dist/runner/watch.js +0 -60
  249. package/dist/test/simple.d.ts +0 -5
  250. package/dist/test/simple.js +0 -43
  251. package/jest.d.ts +0 -25
  252. package/template/diff.bundle.css +0 -1
  253. package/template/diff.bundle.js +0 -144
  254. package/template/diff.html +0 -14
  255. package/template/editor.worker.js +0 -1
  256. /package/dist/case/{nativeWatcher.d.ts → native-watcher.d.ts} +0 -0
  257. /package/dist/helper/legacy/{supportsWorker.d.ts → supportDefaultAssignment.d.ts} +0 -0
@@ -3,16 +3,201 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createWatchInitialProcessor = createWatchInitialProcessor;
7
+ exports.createWatchStepProcessor = createWatchStepProcessor;
6
8
  exports.createWatchCase = createWatchCase;
9
+ exports.getWatchRunnerKey = getWatchRunnerKey;
10
+ exports.createWatchRunner = createWatchRunner;
7
11
  const node_fs_1 = __importDefault(require("node:fs"));
8
12
  const node_path_1 = __importDefault(require("node:path"));
9
- const watch_1 = require("../processor/watch");
13
+ const webpack_merge_1 = __importDefault(require("webpack-merge"));
14
+ const compiler_1 = require("../compiler");
15
+ const helper_1 = require("../helper");
16
+ const checkArrayExpectation_1 = __importDefault(require("../helper/legacy/checkArrayExpectation"));
17
+ const copyDiff_1 = __importDefault(require("../helper/legacy/copyDiff"));
10
18
  const runner_1 = require("../runner");
11
19
  const creator_1 = require("../test/creator");
12
- const type_1 = require("../type");
20
+ const common_1 = require("./common");
21
+ function createWatchInitialProcessor(name, tempDir, step, watchState, { incremental = false, nativeWatcher = false } = {}) {
22
+ const watchContext = {
23
+ currentTriggerFilename: null,
24
+ lastHash: null,
25
+ step,
26
+ tempDir,
27
+ nativeWatcher,
28
+ watchState
29
+ };
30
+ return {
31
+ before: async (context) => {
32
+ context.setValue("watchContext", watchContext);
33
+ },
34
+ config: async (context) => {
35
+ const testConfig = context.getTestConfig();
36
+ const multiCompilerOptions = [];
37
+ const caseOptions = (0, helper_1.readConfigFile)(["rspack.config.js", "webpack.config.js"].map(i => context.getSource(i)), context, {});
38
+ for (const [index, options] of caseOptions.entries()) {
39
+ const compilerOptions = (0, webpack_merge_1.default)(defaultOptions({
40
+ incremental,
41
+ ignoreNotFriendlyForIncrementalWarnings: testConfig.ignoreNotFriendlyForIncrementalWarnings
42
+ }), options);
43
+ overrideOptions(index, context, compilerOptions, tempDir, nativeWatcher);
44
+ multiCompilerOptions.push(compilerOptions);
45
+ }
46
+ const compilerOptions = multiCompilerOptions.length === 1
47
+ ? multiCompilerOptions[0]
48
+ : multiCompilerOptions;
49
+ const compiler = context.getCompiler();
50
+ compiler.setOptions(compilerOptions);
51
+ context.setValue("multiCompilerOptions", multiCompilerOptions);
52
+ },
53
+ compiler: async (context) => {
54
+ const c = await (0, common_1.compiler)(context, name);
55
+ c.hooks.invalid.tap("WatchTestCasesTest", (filename, mtime) => {
56
+ watchContext.currentTriggerFilename = filename;
57
+ });
58
+ },
59
+ build: async (context) => {
60
+ const compiler = context.getCompiler();
61
+ node_fs_1.default.mkdirSync(watchContext.tempDir, { recursive: true });
62
+ (0, copyDiff_1.default)(node_path_1.default.join(context.getSource(), watchContext.step), watchContext.tempDir, true);
63
+ const task = new Promise((resolve, reject) => {
64
+ compiler.getEmitter().once(compiler_1.ECompilerEvent.Build, (e, stats) => {
65
+ if (e)
66
+ return reject(e);
67
+ resolve(stats);
68
+ });
69
+ });
70
+ compiler.watch();
71
+ await task;
72
+ },
73
+ run: async (env, context) => {
74
+ await (0, common_1.run)(env, context, name, (context) => (0, common_1.findMultiCompilerBundle)(context, name, (index, context, options) => findBundle(index, context, options, step)));
75
+ },
76
+ check: async (env, context) => {
77
+ const testConfig = context.getTestConfig();
78
+ if (testConfig.noTests)
79
+ return;
80
+ const errors = (context.getError() || []).map(e => ({
81
+ message: e.message,
82
+ stack: e.stack
83
+ }));
84
+ const warnings = [];
85
+ const compiler = context.getCompiler();
86
+ const stats = compiler.getStats();
87
+ const options = compiler.getOptions();
88
+ const checkStats = testConfig.checkStats || (() => true);
89
+ if (stats) {
90
+ if (testConfig.writeStatsOuptut) {
91
+ node_fs_1.default.writeFileSync(node_path_1.default.join(context.getDist(), "stats.txt"), stats.toString({
92
+ preset: "verbose",
93
+ colors: false
94
+ }), "utf-8");
95
+ }
96
+ const getJsonStats = (() => {
97
+ let cached = null;
98
+ return () => {
99
+ if (!cached) {
100
+ cached = stats.toJson({
101
+ errorDetails: true
102
+ });
103
+ }
104
+ return cached;
105
+ };
106
+ })();
107
+ const getStringStats = (() => {
108
+ let cached = null;
109
+ return () => {
110
+ if (!cached) {
111
+ cached = stats.toString({
112
+ logging: "verbose"
113
+ });
114
+ }
115
+ return cached;
116
+ };
117
+ })();
118
+ if (checkStats.length > 1) {
119
+ if (!checkStats(watchContext.step, getJsonStats(), getStringStats())) {
120
+ throw new Error("stats check failed");
121
+ }
122
+ }
123
+ else {
124
+ // @ts-expect-error only one param
125
+ if (!checkStats(watchContext.step)) {
126
+ throw new Error("stats check failed");
127
+ }
128
+ }
129
+ if (testConfig.writeStatsJson) {
130
+ node_fs_1.default.writeFileSync(node_path_1.default.join(context.getDist(), "stats.json"), JSON.stringify(getJsonStats(), null, 2), "utf-8");
131
+ }
132
+ if (node_fs_1.default.existsSync(context.getSource(`${watchContext.step}/errors.js`)) ||
133
+ node_fs_1.default.existsSync(context.getSource(`${watchContext.step}/warnings.js`)) ||
134
+ stats.hasErrors() ||
135
+ stats.hasWarnings()) {
136
+ const statsJson = stats.toJson({
137
+ errorDetails: true
138
+ });
139
+ if (statsJson.errors) {
140
+ errors.push(...statsJson.errors);
141
+ }
142
+ if (statsJson.warnings) {
143
+ warnings.push(...statsJson.warnings);
144
+ }
145
+ }
146
+ }
147
+ await (0, checkArrayExpectation_1.default)(node_path_1.default.join(context.getSource(), watchContext.step), { errors }, "error", "errors", "Error", options);
148
+ await (0, checkArrayExpectation_1.default)(node_path_1.default.join(context.getSource(), watchContext.step), { warnings }, "warning", "warnings", "Warning", options);
149
+ // clear error if checked
150
+ if (node_fs_1.default.existsSync(context.getSource("errors.js"))) {
151
+ context.clearError();
152
+ }
153
+ // check hash
154
+ if (testConfig.writeStatsOuptut) {
155
+ node_fs_1.default.renameSync(node_path_1.default.join(context.getDist(), "stats.txt"), node_path_1.default.join(context.getDist(), `stats.${watchContext.step}.txt`));
156
+ }
157
+ if (testConfig.writeStatsJson) {
158
+ node_fs_1.default.renameSync(node_path_1.default.join(context.getDist(), "stats.json"), node_path_1.default.join(context.getDist(), `stats.${watchContext.step}.json`));
159
+ }
160
+ },
161
+ after: async (context) => {
162
+ await (0, common_1.afterExecute)(context, name);
163
+ }
164
+ };
165
+ }
166
+ function createWatchStepProcessor(name, tempDir, step, watchState, { incremental = false, nativeWatcher = false } = {}) {
167
+ const processor = createWatchInitialProcessor(name, tempDir, step, watchState, { incremental });
168
+ processor.compiler = async (context) => {
169
+ // do nothing
170
+ };
171
+ processor.build = async (context) => {
172
+ const compiler = context.getCompiler();
173
+ const task = new Promise((resolve, reject) => {
174
+ compiler.getEmitter().once(compiler_1.ECompilerEvent.Build, (e, stats) => {
175
+ if (e)
176
+ return reject(e);
177
+ resolve(stats);
178
+ });
179
+ });
180
+ // wait compiler to ready watch the files and diretories
181
+ // Native Watcher using [notify](https://github.com/notify-rs/notify) to watch files.
182
+ // After tests, notify will cost many milliseconds to watch in windows OS when jest run concurrently.
183
+ // So we need to wait a while to ensure the watcher is ready.
184
+ // If we don't wait, copyDiff will happen before the watcher is ready,
185
+ // which will cause the compiler not rebuild when the files change.
186
+ // The timeout is set to 400ms for windows OS and 100ms for other OS.
187
+ // TODO: This is a workaround, we can remove it when notify support windows better.
188
+ const timeout = nativeWatcher && process.platform === "win32" ? 400 : 100;
189
+ await new Promise(resolve => setTimeout(resolve, timeout));
190
+ (0, copyDiff_1.default)(node_path_1.default.join(context.getSource(), step), tempDir, false);
191
+ await task;
192
+ };
193
+ return processor;
194
+ }
13
195
  const creator = new creator_1.BasicCaseCreator({
14
196
  clean: true,
15
- runner: runner_1.WatchRunnerFactory,
197
+ runner: {
198
+ key: getWatchRunnerKey,
199
+ runner: createWatchRunner
200
+ },
16
201
  description: (name, index) => {
17
202
  return index === 0
18
203
  ? `${name} should compile`
@@ -24,30 +209,141 @@ const creator = new creator_1.BasicCaseCreator({
24
209
  const runs = node_fs_1.default
25
210
  .readdirSync(src)
26
211
  .sort()
27
- .filter(name => {
28
- return node_fs_1.default.statSync(node_path_1.default.join(src, name)).isDirectory();
29
- })
212
+ .filter(name => node_fs_1.default.statSync(node_path_1.default.join(src, name)).isDirectory())
30
213
  .map(name => ({ name }));
31
214
  return runs.map((run, index) => index === 0
32
- ? new watch_1.WatchProcessor({
33
- name,
34
- stepName: run.name,
35
- tempDir: temp,
36
- runable: true,
37
- compilerType: type_1.ECompilerType.Rspack,
38
- configFiles: ["rspack.config.js", "webpack.config.js"]
39
- }, watchState)
40
- : new watch_1.WatchStepProcessor({
41
- name,
42
- stepName: run.name,
43
- tempDir: temp,
44
- runable: true,
45
- compilerType: type_1.ECompilerType.Rspack,
46
- configFiles: ["rspack.config.js", "webpack.config.js"]
47
- }, watchState));
215
+ ? createWatchInitialProcessor(name, temp, run.name, watchState)
216
+ : createWatchStepProcessor(name, temp, run.name, watchState));
48
217
  },
49
218
  concurrent: true
50
219
  });
51
220
  function createWatchCase(name, src, dist, temp) {
52
221
  creator.create(name, src, dist, temp);
53
222
  }
223
+ function overrideOptions(index, context, options, tempDir, nativeWatcher) {
224
+ if (!options.mode)
225
+ options.mode = "development";
226
+ if (!options.context)
227
+ options.context = tempDir;
228
+ if (!options.entry)
229
+ options.entry = "./index.js";
230
+ if (!options.target)
231
+ options.target = "async-node";
232
+ if (!options.devtool)
233
+ options.devtool = false;
234
+ if (!options.output)
235
+ options.output = {};
236
+ if (!options.output.path)
237
+ options.output.path = context.getDist();
238
+ if (typeof options.output.pathinfo === "undefined")
239
+ options.output.pathinfo = false;
240
+ if (!options.output.filename)
241
+ options.output.filename = "bundle.js";
242
+ if (options.cache && options.cache.type === "filesystem") {
243
+ const cacheDirectory = node_path_1.default.join(tempDir, ".cache");
244
+ options.cache.cacheDirectory = cacheDirectory;
245
+ options.cache.name = `config-${index}`;
246
+ }
247
+ options.optimization ??= {};
248
+ options.experiments ??= {};
249
+ options.experiments.css ??= true;
250
+ if (nativeWatcher) {
251
+ options.experiments.nativeWatcher ??= true;
252
+ }
253
+ options.experiments.rspackFuture ??= {};
254
+ options.experiments.rspackFuture.bundlerInfo ??= {};
255
+ options.experiments.rspackFuture.bundlerInfo.force ??=
256
+ false;
257
+ // test incremental: "safe" here, we test default incremental in Incremental-*.test.js
258
+ options.experiments.incremental ??= "safe";
259
+ if (!global.printLogger) {
260
+ options.infrastructureLogging = {
261
+ level: "error"
262
+ };
263
+ }
264
+ }
265
+ function findBundle(index, context, options, stepName) {
266
+ const testConfig = context.getTestConfig();
267
+ if (typeof testConfig.findBundle === "function") {
268
+ return testConfig.findBundle(index, options, stepName);
269
+ }
270
+ return "./bundle.js";
271
+ }
272
+ function defaultOptions({ incremental = false, ignoreNotFriendlyForIncrementalWarnings = false } = {}) {
273
+ if (incremental) {
274
+ return {
275
+ experiments: {
276
+ incremental: "advance"
277
+ },
278
+ ignoreWarnings: ignoreNotFriendlyForIncrementalWarnings
279
+ ? [/is not friendly for incremental/]
280
+ : undefined
281
+ };
282
+ }
283
+ return {};
284
+ }
285
+ function getWatchRunnerKey(context, name, file) {
286
+ const watchContext = context.getValue("watchContext");
287
+ const stepName = watchContext?.step;
288
+ return `${name}-${stepName}`;
289
+ }
290
+ function cachedWatchStats(context, name) {
291
+ const compiler = context.getCompiler();
292
+ const watchContext = context.getValue("watchContext");
293
+ const stepName = watchContext?.step;
294
+ const statsGetter = (() => {
295
+ const cached = {};
296
+ return () => {
297
+ if (cached[stepName]) {
298
+ return cached[stepName];
299
+ }
300
+ cached[stepName] = compiler.getStats().toJson({
301
+ errorDetails: true
302
+ });
303
+ return cached[stepName];
304
+ };
305
+ })();
306
+ return statsGetter;
307
+ }
308
+ function createWatchRunner(context, name, file, env) {
309
+ const compiler = context.getCompiler();
310
+ const compilerOptions = compiler.getOptions();
311
+ const watchContext = context.getValue("watchContext");
312
+ const stepName = watchContext?.step;
313
+ if (!stepName) {
314
+ throw new Error("Can not get watch step name from context");
315
+ }
316
+ const state = watchContext?.watchState;
317
+ if (!state) {
318
+ throw new Error("Can not get watch state from context");
319
+ }
320
+ const isWeb = Array.isArray(compilerOptions)
321
+ ? compilerOptions.some(option => {
322
+ return option.target === "web" || option.target === "webworker";
323
+ })
324
+ : compilerOptions.target === "web" ||
325
+ compilerOptions.target === "webworker";
326
+ const testConfig = context.getTestConfig();
327
+ return new runner_1.WebRunner({
328
+ env,
329
+ stats: cachedWatchStats(context, name),
330
+ name: name,
331
+ runInNewContext: isWeb,
332
+ cachable: false,
333
+ testConfig: {
334
+ ...(testConfig || {}),
335
+ moduleScope: (ms, stats, options) => {
336
+ ms.STATE = state;
337
+ ms.WATCH_STEP = stepName;
338
+ if (typeof testConfig.moduleScope === "function") {
339
+ return testConfig.moduleScope(ms, stats, options);
340
+ }
341
+ return ms;
342
+ }
343
+ },
344
+ source: context.getSource(),
345
+ dist: context.getDist(),
346
+ compilerOptions,
347
+ location: testConfig.location || "https://test.cases/path/index.html"
348
+ });
349
+ }
@@ -1,28 +1,28 @@
1
1
  import EventEmitter from "node:events";
2
- import { ECompilerType, type ITestCompilerManager, type TCompiler, type TCompilerFactories, type TCompilerOptions, type TCompilerStats } from "./type";
2
+ import { Compiler, type RspackOptions, type Stats } from "@rspack/core";
3
+ import type { ITestCompilerManager, ITestContext } from "./type";
3
4
  export declare enum ECompilerEvent {
4
5
  Build = "build",
5
6
  Option = "option",
6
7
  Create = "create",
7
8
  Close = "close"
8
9
  }
9
- export declare const COMPILER_FACTORIES: TCompilerFactories;
10
- export declare class TestCompilerManager<T extends ECompilerType> implements ITestCompilerManager<T> {
11
- protected type: T;
12
- protected factories: TCompilerFactories;
13
- protected compilerOptions: TCompilerOptions<T>;
14
- protected compilerInstance: TCompiler<T> | null;
15
- protected compilerStats: TCompilerStats<T> | null;
10
+ export declare class TestCompilerManager implements ITestCompilerManager {
11
+ protected context: ITestContext;
12
+ protected compilerOptions: RspackOptions;
13
+ protected compilerInstance: Compiler | null;
14
+ protected compilerStats: Stats | null;
16
15
  protected emitter: EventEmitter;
17
- constructor(type: T, factories?: TCompilerFactories);
18
- getOptions(): TCompilerOptions<T>;
19
- setOptions(newOptions: TCompilerOptions<T>): TCompilerOptions<T>;
20
- mergeOptions(newOptions: TCompilerOptions<T>): TCompilerOptions<T>;
21
- getCompiler(): TCompiler<T> | null;
22
- createCompiler(): TCompiler<T>;
23
- build(): Promise<TCompilerStats<T>>;
16
+ constructor(context: ITestContext);
17
+ getOptions(): RspackOptions;
18
+ setOptions(newOptions: RspackOptions): RspackOptions;
19
+ mergeOptions(newOptions: RspackOptions): RspackOptions;
20
+ getCompiler(): Compiler | null;
21
+ createCompiler(): Compiler;
22
+ createCompilerWithCallback(callback: (error: Error | null, stats: Stats | null) => void): Compiler;
23
+ build(): Promise<Stats>;
24
24
  watch(timeout?: number): void;
25
- getStats(): TCompilerStats<T> | null;
25
+ getStats(): Stats | null;
26
26
  getEmitter(): EventEmitter<[never]>;
27
27
  close(): Promise<void>;
28
28
  }
package/dist/compiler.js CHANGED
@@ -3,10 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TestCompilerManager = exports.COMPILER_FACTORIES = exports.ECompilerEvent = void 0;
6
+ exports.TestCompilerManager = exports.ECompilerEvent = void 0;
7
7
  const node_events_1 = __importDefault(require("node:events"));
8
+ const core_1 = require("@rspack/core");
8
9
  const webpack_merge_1 = __importDefault(require("webpack-merge"));
9
- const type_1 = require("./type");
10
+ const debug_1 = require("./test/debug");
10
11
  var ECompilerEvent;
11
12
  (function (ECompilerEvent) {
12
13
  ECompilerEvent["Build"] = "build";
@@ -14,14 +15,9 @@ var ECompilerEvent;
14
15
  ECompilerEvent["Create"] = "create";
15
16
  ECompilerEvent["Close"] = "close";
16
17
  })(ECompilerEvent || (exports.ECompilerEvent = ECompilerEvent = {}));
17
- exports.COMPILER_FACTORIES = {
18
- [type_1.ECompilerType.Rspack]: ((options) => require("@rspack/core")(options)),
19
- [type_1.ECompilerType.Webpack]: ((options) => require("webpack")(options))
20
- };
21
18
  class TestCompilerManager {
22
- constructor(type, factories = exports.COMPILER_FACTORIES) {
23
- this.type = type;
24
- this.factories = factories;
19
+ constructor(context) {
20
+ this.context = context;
25
21
  this.compilerOptions = {};
26
22
  this.compilerInstance = null;
27
23
  this.compilerStats = null;
@@ -44,7 +40,58 @@ class TestCompilerManager {
44
40
  return this.compilerInstance;
45
41
  }
46
42
  createCompiler() {
47
- this.compilerInstance = this.factories[this.type](this.compilerOptions);
43
+ this.compilerInstance = require("@rspack/core")(this.compilerOptions);
44
+ if (__DEBUG__) {
45
+ const context = this.context;
46
+ this.compilerInstance = new Proxy(this.compilerInstance, {
47
+ get(target, p, receiver) {
48
+ const value = Reflect.get(target, p, receiver);
49
+ if (typeof value === "function" &&
50
+ core_1.Compiler.prototype.hasOwnProperty(p)) {
51
+ return value.bind(target);
52
+ }
53
+ return value;
54
+ },
55
+ set(target, p, value, receiver) {
56
+ const debugSetProperties = context.getValue(debug_1.DEBUG_SCOPES.CreateCompilerSetProperties) || [];
57
+ debugSetProperties.push(`${p} ${new Error().stack?.split("\n")[2]?.trim()}`);
58
+ context.setValue(debug_1.DEBUG_SCOPES.CreateCompilerSetProperties, debugSetProperties);
59
+ return Reflect.set(target, p, value, receiver);
60
+ }
61
+ });
62
+ this.context.setValue(debug_1.DEBUG_SCOPES.CreateCompilerInstance, {
63
+ path: require.resolve("@rspack/core"),
64
+ mode: "no-callback"
65
+ });
66
+ }
67
+ this.emitter.emit(ECompilerEvent.Create, this.compilerInstance);
68
+ return this.compilerInstance;
69
+ }
70
+ createCompilerWithCallback(callback) {
71
+ this.compilerInstance = require("@rspack/core")(this.compilerOptions, callback);
72
+ if (__DEBUG__) {
73
+ const context = this.context;
74
+ this.compilerInstance = new Proxy(this.compilerInstance, {
75
+ get(target, p, receiver) {
76
+ const value = Reflect.get(target, p, receiver);
77
+ if (typeof value === "function" &&
78
+ core_1.Compiler.prototype.hasOwnProperty(p)) {
79
+ return value.bind(target);
80
+ }
81
+ return value;
82
+ },
83
+ set(target, p, value, receiver) {
84
+ const debugSetProperties = context.getValue(debug_1.DEBUG_SCOPES.CreateCompilerSetProperties) || [];
85
+ debugSetProperties.push(`${p} ${new Error().stack?.split("\n")[2]?.trim()}`);
86
+ context.setValue(debug_1.DEBUG_SCOPES.CreateCompilerSetProperties, debugSetProperties);
87
+ return Reflect.set(target, p, value, receiver);
88
+ }
89
+ });
90
+ this.context.setValue(debug_1.DEBUG_SCOPES.CreateCompilerInstance, {
91
+ path: require.resolve("@rspack/core"),
92
+ mode: "callback"
93
+ });
94
+ }
48
95
  this.emitter.emit(ECompilerEvent.Create, this.compilerInstance);
49
96
  return this.compilerInstance;
50
97
  }
@@ -53,11 +100,39 @@ class TestCompilerManager {
53
100
  throw new Error("Compiler should be created before build");
54
101
  return new Promise((resolve, reject) => {
55
102
  try {
103
+ const context = this.context;
104
+ if (__DEBUG__) {
105
+ context.setValue(debug_1.DEBUG_SCOPES.BuildMethod, {
106
+ method: "run"
107
+ });
108
+ }
56
109
  this.compilerInstance.run((error, newStats) => {
57
110
  this.emitter.emit(ECompilerEvent.Build, error, newStats);
58
- if (error)
111
+ if (error) {
112
+ if (__DEBUG__) {
113
+ context.setValue(debug_1.DEBUG_SCOPES.BuildError, {
114
+ type: "fatal",
115
+ errors: [error]
116
+ });
117
+ }
59
118
  return reject(error);
119
+ }
60
120
  this.compilerStats = newStats;
121
+ if (__DEBUG__) {
122
+ if (newStats?.hasErrors()) {
123
+ context.setValue(debug_1.DEBUG_SCOPES.BuildError, {
124
+ type: "stats",
125
+ errors: newStats.toJson({
126
+ errors: true
127
+ }).errors || []
128
+ });
129
+ }
130
+ if (newStats?.hasWarnings()) {
131
+ context.setValue(debug_1.DEBUG_SCOPES.BuildWarning, newStats.toJson({
132
+ warnings: true
133
+ }).warnings || []);
134
+ }
135
+ }
61
136
  resolve(newStats);
62
137
  });
63
138
  }
@@ -69,7 +144,8 @@ class TestCompilerManager {
69
144
  watch(timeout = 1000) {
70
145
  if (!this.compilerInstance)
71
146
  throw new Error("Compiler should be created before watch");
72
- this.compilerInstance.watch({
147
+ const context = this.context;
148
+ const watchOptions = {
73
149
  // IMPORTANT:
74
150
  // This is a workaround for the issue that watchpack cannot detect the file change in time
75
151
  // so we set the poll to 300ms to make it more sensitive to the file change
@@ -78,11 +154,40 @@ class TestCompilerManager {
78
154
  // want to watch all files, which aligns with webpack's default behavior
79
155
  ignored: [],
80
156
  aggregateTimeout: timeout
81
- }, (error, newStats) => {
157
+ };
158
+ if (__DEBUG__) {
159
+ context.setValue(debug_1.DEBUG_SCOPES.BuildMethod, {
160
+ method: "watch",
161
+ options: watchOptions
162
+ });
163
+ }
164
+ this.compilerInstance.watch(watchOptions, (error, newStats) => {
82
165
  this.emitter.emit(ECompilerEvent.Build, error, newStats);
83
- if (error)
84
- return error;
166
+ if (__DEBUG__) {
167
+ if (error) {
168
+ context.setValue(debug_1.DEBUG_SCOPES.BuildError, {
169
+ type: "fatal",
170
+ errors: [error]
171
+ });
172
+ return error;
173
+ }
174
+ }
85
175
  if (newStats) {
176
+ if (__DEBUG__) {
177
+ if (newStats.hasErrors()) {
178
+ context.setValue(debug_1.DEBUG_SCOPES.BuildError, {
179
+ type: "stats",
180
+ errors: newStats.toJson({
181
+ errors: true
182
+ }).errors || []
183
+ });
184
+ }
185
+ if (newStats.hasWarnings()) {
186
+ context.setValue(debug_1.DEBUG_SCOPES.BuildWarning, newStats.toJson({
187
+ warnings: true
188
+ }).warnings || []);
189
+ }
190
+ }
86
191
  this.compilerStats = newStats;
87
192
  }
88
193
  return newStats;
@@ -7,6 +7,6 @@ export declare function describeByWalk(testFile: string, createCase: (name: stri
7
7
  source?: string;
8
8
  dist?: string;
9
9
  absoluteDist?: boolean;
10
- describe?: jest.Describe;
10
+ describe?: Describe;
11
11
  exclude?: RegExp[];
12
12
  }): void;
@@ -31,7 +31,7 @@ function describeByWalk(testFile, createCase, options = {}) {
31
31
  .filter(folder => {
32
32
  if (options.exclude) {
33
33
  if (options.exclude.some(exclude => {
34
- return exclude.test(folder);
34
+ return exclude.test(node_path_1.default.join(dirname, folder).replace(/\\/g, "/"));
35
35
  })) {
36
36
  return false;
37
37
  }
@@ -54,7 +54,7 @@ function describeByWalk(testFile, createCase, options = {}) {
54
54
  describeDirectory(caseName, currentLevel - 1);
55
55
  }
56
56
  else {
57
- const name = (0, _1.escapeSep)(node_path_1.default.join(testId, caseName).split(".").shift());
57
+ const name = (0, _1.escapeSep)(node_path_1.default.join(`${testId}Cases`, caseName).split(".").shift());
58
58
  describeFn(name, () => {
59
59
  const source = node_path_1.default.join(sourceBase, caseName);
60
60
  let dist = "";
@@ -19,7 +19,7 @@ const prettyFormatOptions = {
19
19
  return `"${val
20
20
  .replace(/\\/gm, "/")
21
21
  .replace(/"/gm, '\\"')
22
- .replace(/\r?\n/gm, "\\n")}"`;
22
+ .replace(/\r?\n/gm, "")}"`;
23
23
  }
24
24
  }
25
25
  ]
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.normalizePlaceholder = void 0;
7
- const node_path_1 = __importDefault(require("node:path"));
8
4
  const path_serializer_1 = require("path-serializer");
9
5
  // 1. escapeEOL \r\n -> \n
10
6
  // 2. replace <RSPACK_ROOT> etc
@@ -13,14 +9,18 @@ const placeholderSerializer = (0, path_serializer_1.createSnapshotSerializer)({
13
9
  root: __dirname.includes("node_modules")
14
10
  ? // Use `process.cwd()` when using outside Rspack
15
11
  process.cwd()
16
- : node_path_1.default.resolve(__dirname, "../../../../../"),
12
+ : __ROOT_PATH__,
17
13
  replace: [
18
14
  {
19
- match: node_path_1.default.resolve(__dirname, "../../../"),
15
+ match: __RSPACK_TEST_TOOLS_PATH__,
20
16
  mark: "test_tools_root"
21
17
  },
22
18
  {
23
- match: node_path_1.default.resolve(__dirname, "../../../../rspack"),
19
+ match: __TEST_PATH__,
20
+ mark: "test_root"
21
+ },
22
+ {
23
+ match: __RSPACK_PATH__,
24
24
  mark: "rspack_root"
25
25
  },
26
26
  {