rspack-dev-middleware 0.1.32 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +38 -29
  2. package/cjs/client/HotUpdate.cjs +78 -0
  3. package/cjs/client/HotUpdate.d.cts +26 -0
  4. package/cjs/client/client.cjs +15 -17
  5. package/cjs/client/events.cjs +1 -1
  6. package/cjs/client/index.cjs +1 -1
  7. package/cjs/client/main.cjs +1 -1
  8. package/cjs/client/ui/Overlay.cjs +1 -1
  9. package/cjs/client/ui/Progress.cjs +1 -1
  10. package/cjs/client/ui/images/rspack-logo.svg.cjs +1 -1
  11. package/cjs/client/ui/utils.cjs +1 -1
  12. package/cjs/server/compose.cjs +1 -1
  13. package/cjs/server/dev/ReadStream.cjs +1 -1
  14. package/cjs/server/dev/Service.cjs +1 -1
  15. package/cjs/server/dev/index.cjs +3 -10
  16. package/cjs/server/dev/index.d.cts +1 -1
  17. package/cjs/server/dev/interface.d.cts +0 -3
  18. package/cjs/server/dev/middleware.cjs +8 -15
  19. package/cjs/server/dev/middleware.d.cts +1 -1
  20. package/cjs/server/dev/utils/fs.cjs +1 -1
  21. package/cjs/server/dev/utils/hash.cjs +1 -1
  22. package/cjs/server/dev/utils/http.cjs +1 -1
  23. package/cjs/server/dev/utils/path.cjs +1 -1
  24. package/cjs/server/dev/utils/paths.cjs +1 -1
  25. package/cjs/server/dev/utils/ready.cjs +1 -1
  26. package/cjs/server/dev/utils/setupHooks.cjs +9 -6
  27. package/cjs/server/dev/utils/setupOutputFileSystem.cjs +1 -1
  28. package/cjs/server/dev/utils/setupWatching.cjs +1 -1
  29. package/cjs/server/dev/utils/setupWriteToDisk.cjs +1 -1
  30. package/cjs/server/hot/Socket.cjs +8 -1
  31. package/cjs/server/hot/index.cjs +3 -3
  32. package/cjs/server/hot/utils.cjs +1 -1
  33. package/cjs/server/index.cjs +4 -5
  34. package/cjs/server/index.d.cts +1 -1
  35. package/cjs/server/schema.cjs +1 -1
  36. package/cjs/server/utils.cjs +1 -1
  37. package/esm/client/HotUpdate.d.ts +26 -0
  38. package/esm/client/HotUpdate.js +76 -0
  39. package/esm/client/client.js +16 -18
  40. package/esm/client/events.js +1 -1
  41. package/esm/client/index.js +1 -1
  42. package/esm/client/main.js +1 -1
  43. package/esm/client/ui/Overlay.js +1 -1
  44. package/esm/client/ui/Progress.js +1 -1
  45. package/esm/client/ui/images/rspack-logo.svg.js +1 -1
  46. package/esm/client/ui/utils.js +1 -1
  47. package/esm/server/compose.js +1 -1
  48. package/esm/server/dev/ReadStream.js +1 -1
  49. package/esm/server/dev/Service.js +1 -1
  50. package/esm/server/dev/index.d.ts +1 -1
  51. package/esm/server/dev/index.js +3 -10
  52. package/esm/server/dev/interface.d.ts +0 -3
  53. package/esm/server/dev/middleware.d.ts +1 -1
  54. package/esm/server/dev/middleware.js +8 -15
  55. package/esm/server/dev/utils/fs.js +1 -1
  56. package/esm/server/dev/utils/hash.js +1 -1
  57. package/esm/server/dev/utils/http.js +1 -1
  58. package/esm/server/dev/utils/path.js +1 -1
  59. package/esm/server/dev/utils/paths.js +1 -1
  60. package/esm/server/dev/utils/ready.js +1 -1
  61. package/esm/server/dev/utils/setupHooks.js +9 -6
  62. package/esm/server/dev/utils/setupOutputFileSystem.js +1 -1
  63. package/esm/server/dev/utils/setupWatching.js +1 -1
  64. package/esm/server/dev/utils/setupWriteToDisk.js +1 -1
  65. package/esm/server/hot/Socket.js +8 -1
  66. package/esm/server/hot/index.js +3 -3
  67. package/esm/server/hot/utils.js +1 -1
  68. package/esm/server/index.d.ts +1 -1
  69. package/esm/server/index.js +4 -5
  70. package/esm/server/schema.js +1 -1
  71. package/esm/server/utils.js +1 -1
  72. package/global.d.ts +0 -2
  73. package/package.json +6 -6
  74. package/cjs/client/hot.cjs +0 -111
  75. package/cjs/client/hot.d.cts +0 -16
  76. package/esm/client/hot.d.ts +0 -16
  77. package/esm/client/hot.js +0 -108
package/README.md CHANGED
@@ -19,20 +19,19 @@
19
19
  */
20
20
 
21
21
  import Koa from 'koa';
22
- import memfs from 'memfs';
23
22
  import path from 'node:path';
24
23
  import rspack from '@rspack/core';
25
24
  import compress from 'koa-compress';
25
+ import { Volume, createFsFromVolume } from 'memfs';
26
26
  import { server as dev } from 'rspack-dev-middleware';
27
27
  import ReactRefreshPlugin from '@rspack/plugin-react-refresh';
28
28
 
29
29
  const entryHTML = path.resolve('wwwroot/index.html');
30
30
 
31
31
  function createMemfs() {
32
- const volume = new memfs.Volume();
33
- const fs = memfs.createFsFromVolume(volume);
32
+ const volume = new Volume();
34
33
 
35
- return fs;
34
+ return createFsFromVolume(volume);
36
35
  }
37
36
 
38
37
  function httpError(error) {
@@ -50,6 +49,7 @@ const html = {
50
49
  };
51
50
 
52
51
  const compiler = rspack({
52
+ cache: true,
53
53
  name: 'React',
54
54
  mode: 'development',
55
55
  context: path.resolve('src'),
@@ -61,25 +61,6 @@ const compiler = rspack({
61
61
  path: path.resolve('wwwroot/public'),
62
62
  assetModuleFilename: `[path][name][ext]`
63
63
  },
64
- experiments: {
65
- css: true
66
- },
67
- watchOptions: {
68
- aggregateTimeout: 256
69
- },
70
- stats: {
71
- colors: true,
72
- chunks: false,
73
- children: false,
74
- entrypoints: false,
75
- runtimeModules: false,
76
- dependentModules: false
77
- },
78
- devtool: 'eval-cheap-module-source-map',
79
- resolve: {
80
- fallback: { url: false },
81
- extensions: ['.ts', '.tsx', '.js', '.jsx']
82
- },
83
64
  module: {
84
65
  parser: {
85
66
  'css/auto': {
@@ -129,20 +110,50 @@ const compiler = rspack({
129
110
  }
130
111
  ]
131
112
  },
113
+ resolve: {
114
+ extensions: ['.ts', '.tsx', '.js', '.jsx']
115
+ },
132
116
  plugins: [
133
117
  new ReactRefreshPlugin(),
134
118
  new rspack.ProgressPlugin({
135
119
  prefix: '[Rspack]',
136
120
  progressChars: '█▒'
137
121
  }),
138
- new rspack.HtmlRspackPlugin(html)
139
- ]
122
+ new rspack.HtmlRspackPlugin(html),
123
+ new rspack.WarnCaseSensitiveModulesPlugin()
124
+ ],
125
+ watchOptions: {
126
+ aggregateTimeout: 256
127
+ },
128
+ stats: {
129
+ all: false,
130
+ assets: true,
131
+ colors: true,
132
+ errors: true,
133
+ timings: true,
134
+ version: true,
135
+ warnings: true,
136
+ errorsCount: true,
137
+ warningsCount: true,
138
+ groupAssetsByPath: true
139
+ },
140
+ devtool: 'eval-cheap-module-source-map',
141
+ experiments: {
142
+ css: true,
143
+ cache: {
144
+ type: 'persistent',
145
+ storage: {
146
+ type: 'filesystem',
147
+ directory: path.resolve('../node_modules/.cache/rspack')
148
+ }
149
+ }
150
+ }
140
151
  });
141
152
 
142
153
  const port = 8000;
143
154
  const app = new Koa();
144
155
  const fs = createMemfs();
145
- const server = dev(compiler, {
156
+ const server = await dev(compiler, {
146
157
  fs,
147
158
  headers: {
148
159
  'Cache-Control': 'no-cache',
@@ -168,9 +179,7 @@ app.on('error', error => {
168
179
  });
169
180
 
170
181
  app.listen(port, () => {
171
- server.ready(() => {
172
- server.logger.info(`server run at: \u001B[36mhttp://127.0.0.1:${port}\u001B[0m`);
173
- });
182
+ server.logger.info(`server run at: \x1b[36mhttp://127.0.0.1:${port}\x1b[0m`);
174
183
  });
175
184
  ```
176
185
 
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @package rspack-dev-middleware
3
+ * @license MIT
4
+ * @version 0.2.0
5
+ * @author nuintun <nuintun@qq.com>
6
+ * @description A koa 2 middleware for rspack development and hot reloading.
7
+ * @see https://github.com/nuintun/rspack-dev-middleware#readme
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ /**
13
+ * @module HotUpdate
14
+ */
15
+ class HotUpdate {
16
+ #hmr;
17
+ #fallback;
18
+ #pending = false;
19
+ #hash = __webpack_hash__;
20
+ #hot = module.hot;
21
+ /**
22
+ * @constructor
23
+ * @param hmr Whether to enable HMR hot update.
24
+ * @param fallback Fallback handler for update failures.
25
+ */
26
+ constructor(hmr = true, fallback) {
27
+ this.#hmr = hmr;
28
+ this.#fallback = fallback;
29
+ // Listen to status changes
30
+ this.#hot?.addStatusHandler(async status => {
31
+ if (this.#pending && status === 'idle') {
32
+ this.#pending = false;
33
+ await this.performUpdate();
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * @method updateHash
39
+ * @description Update hash value.
40
+ * @param hash New hash value.
41
+ */
42
+ updateHash(hash) {
43
+ this.#hash = hash;
44
+ }
45
+ /**
46
+ * @method #isUpdateAvailable
47
+ * @description Check if new updates are available.
48
+ */
49
+ #isUpdateAvailable() {
50
+ return this.#hash !== __webpack_hash__;
51
+ }
52
+ /**
53
+ * @method performUpdate
54
+ * @description Execute update strategy.
55
+ */
56
+ async performUpdate() {
57
+ if (this.#isUpdateAvailable()) {
58
+ if (!this.#hmr || !this.#hot) {
59
+ await this.#fallback();
60
+ } else if (this.#hot.status() === 'idle') {
61
+ try {
62
+ const outdated = await this.#hot.check(true);
63
+ if (outdated == null || outdated.length <= 0) {
64
+ if (this.#isUpdateAvailable()) {
65
+ await this.#fallback();
66
+ }
67
+ }
68
+ } catch (error) {
69
+ await this.#fallback(error);
70
+ }
71
+ } else {
72
+ this.#pending = true;
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ exports.HotUpdate = HotUpdate;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @module HotUpdate
3
+ */
4
+ export interface Fallback {
5
+ (error?: Error): Promise<void> | void;
6
+ }
7
+ export declare class HotUpdate {
8
+ #private;
9
+ /**
10
+ * @constructor
11
+ * @param hmr Whether to enable HMR hot update.
12
+ * @param fallback Fallback handler for update failures.
13
+ */
14
+ constructor(hmr: boolean | undefined, fallback: Fallback);
15
+ /**
16
+ * @method updateHash
17
+ * @description Update hash value.
18
+ * @param hash New hash value.
19
+ */
20
+ updateHash(hash: string): void;
21
+ /**
22
+ * @method performUpdate
23
+ * @description Execute update strategy.
24
+ */
25
+ performUpdate(): Promise<void>;
26
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -12,31 +12,29 @@
12
12
  const events = require('./events.cjs');
13
13
  const Overlay = require('./ui/Overlay.cjs');
14
14
  const Progress = require('./ui/Progress.cjs');
15
- const hot = require('./hot.cjs');
15
+ const HotUpdate = require('./HotUpdate.cjs');
16
16
 
17
17
  /**
18
18
  * @module client
19
19
  */
20
20
  function createClient(options) {
21
- let updateTimer;
22
- const UPDATE_DELAY = 128;
23
21
  const RETRY_INTERVAL = 3000;
24
22
  const progress = new Progress.Progress();
25
23
  const overlay = new Overlay.Overlay(options.name);
26
24
  const fallback = () => {
27
- if (options.reload) {
28
- self.location.reload();
29
- } else {
30
- console.warn('Use fallback update but you turn off live reload, please reload by yourself.');
31
- }
32
- };
33
- const applyUpdateAsync = () => {
34
- updateTimer = self.setTimeout(() => {
35
- hot.applyUpdate(options.hmr, fallback);
36
- }, UPDATE_DELAY);
25
+ return new Promise(resolve => {
26
+ queueMicrotask(() => {
27
+ if (options.reload) {
28
+ self.location.reload();
29
+ } else {
30
+ console.warn('[HMR] Hot update failed. Please reload the page manually.');
31
+ }
32
+ resolve();
33
+ });
34
+ });
37
35
  };
36
+ const hot = new HotUpdate.HotUpdate(options.hmr, fallback);
38
37
  const onInvalid = () => {
39
- clearTimeout(updateTimer);
40
38
  if (options.progress) {
41
39
  progress.update(0);
42
40
  progress.show();
@@ -74,14 +72,14 @@ function createClient(options) {
74
72
  overlay.show();
75
73
  }
76
74
  if (errors.length <= 0) {
77
- applyUpdateAsync();
75
+ hot.performUpdate();
78
76
  }
79
77
  };
80
78
  const onOk = () => {
81
79
  progress.update(1);
82
80
  progress.hide();
83
81
  overlay.hide();
84
- applyUpdateAsync();
82
+ hot.performUpdate();
85
83
  };
86
84
  const parseMessage = message => {
87
85
  try {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -9,7 +9,6 @@
9
9
 
10
10
  'use strict';
11
11
 
12
- const ready = require('./utils/ready.cjs');
13
12
  const fs = require('./utils/fs.cjs');
14
13
  const middleware = require('./middleware.cjs');
15
14
  const setupHooks = require('./utils/setupHooks.cjs');
@@ -38,18 +37,12 @@ function setup(compiler, options) {
38
37
  setupWatching.setupWatching(context);
39
38
  return context;
40
39
  }
41
- function dev(compiler, options) {
40
+ async function dev(compiler, options) {
42
41
  const context = setup(compiler, options);
43
- return Object.assign(middleware.middleware(context), {
44
- get state() {
45
- return !!context.stats;
46
- },
42
+ return Object.assign(await middleware.middleware(context), {
47
43
  get logger() {
48
44
  return context.logger;
49
45
  },
50
- ready(callback) {
51
- ready.ready(context, callback);
52
- },
53
46
  close(callback) {
54
47
  context.watching.close(callback);
55
48
  },
@@ -5,4 +5,4 @@ import { Middleware } from 'koa';
5
5
  import { UnionCompiler } from '../interface.cjs';
6
6
  import { Expose, Options } from './interface.cjs';
7
7
  export { Expose, Options };
8
- export declare function dev(compiler: UnionCompiler, options: Options): Middleware & Expose;
8
+ export declare function dev(compiler: UnionCompiler, options: Options): Promise<Middleware & Expose>;
@@ -13,8 +13,6 @@ export interface ErrorCallback {
13
13
  }
14
14
  export interface Expose {
15
15
  readonly logger: Logger;
16
- readonly state: boolean;
17
- readonly ready: (callback: Callback) => void;
18
16
  readonly close: (callback: ErrorCallback) => void;
19
17
  readonly invalidate: (callback: ErrorCallback) => void;
20
18
  }
@@ -29,7 +27,6 @@ export interface Context {
29
27
  callbacks: Callback[];
30
28
  compiler: UnionCompiler;
31
29
  watching: UnionWatching;
32
- services?: FileService[];
33
30
  stats: UnionStats | null;
34
31
  options: Options & {
35
32
  fs: FileSystem;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -18,11 +18,6 @@ const paths = require('./utils/paths.cjs');
18
18
  * @module middleware
19
19
  */
20
20
  function getFileServices(context, stats) {
21
- const cached = context.services;
22
- // Cache hit.
23
- if (cached) {
24
- return cached;
25
- }
26
21
  const { options } = context;
27
22
  const paths$1 = paths.getPaths(stats);
28
23
  const services = [];
@@ -30,8 +25,6 @@ function getFileServices(context, stats) {
30
25
  for (const [outputPath, publicPath] of paths$1) {
31
26
  services.push([publicPath, new Service.Service(outputPath, options)]);
32
27
  }
33
- // Cache services.
34
- context.services = services;
35
28
  // Return services.
36
29
  return services;
37
30
  }
@@ -49,24 +42,24 @@ function getFileServicesAsync(context) {
49
42
  }
50
43
  });
51
44
  }
52
- function middleware(context) {
45
+ async function middleware(context) {
46
+ // Get the file services.
47
+ const services = await getFileServicesAsync(context);
53
48
  // Middleware.
54
- return async (ctx, next) => {
55
- const { request } = ctx;
49
+ return async (context, next) => {
50
+ const { request } = context;
56
51
  const pathname = http.decodeURI(request.path);
57
52
  // Pathname decode failed or includes null byte(s).
58
53
  if (pathname === -1 || pathname.includes('\0')) {
59
- return ctx.throw(400);
54
+ return context.throw(400);
60
55
  }
61
56
  // Get request method.
62
57
  const { method } = request;
63
58
  // Only support GET and HEAD (405).
64
59
  if (method === 'GET' || method === 'HEAD') {
65
- // Get the file services.
66
- const services = await getFileServicesAsync(context);
67
60
  // Try to respond.
68
61
  for (const [publicPath, service] of services) {
69
- if (await service.respond(pathname, ctx, publicPath)) {
62
+ if (await service.respond(pathname, context, publicPath)) {
70
63
  return;
71
64
  }
72
65
  }
@@ -3,4 +3,4 @@
3
3
  */
4
4
  import { Middleware } from 'koa';
5
5
  import { Context } from './interface.cjs';
6
- export declare function middleware(context: Context): Middleware;
6
+ export declare function middleware(context: Context): Promise<Middleware>;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -87,11 +87,14 @@ function setupHooks(context) {
87
87
  onCompilationDone(stats, statsOptions);
88
88
  // Callbacks.
89
89
  const { callbacks } = context;
90
- // Clear callbacks.
91
- context.callbacks = [];
92
- // Call callbacks.
93
- for (const callback of callbacks) {
94
- callback(stats);
90
+ // Call callbacks if there are any.
91
+ if (callbacks.length > 0) {
92
+ // Clear callbacks.
93
+ context.callbacks = [];
94
+ // Call callbacks.
95
+ for (const callback of callbacks) {
96
+ callback(stats);
97
+ }
95
98
  }
96
99
  // Log compilation finished.
97
100
  context.logger.log('compilation finished');
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @package rspack-dev-middleware
3
3
  * @license MIT
4
- * @version 0.1.32
4
+ * @version 0.2.0
5
5
  * @author nuintun <nuintun@qq.com>
6
6
  * @description A koa 2 middleware for rspack development and hot reloading.
7
7
  * @see https://github.com/nuintun/rspack-dev-middleware#readme