@rspack/core 1.4.0-beta.1 → 1.4.0-rc.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 (125) hide show
  1. package/README.md +1 -1
  2. package/dist/Module.d.ts +0 -1
  3. package/dist/builtin-loader/swc/pluginImport.d.ts +4 -26
  4. package/dist/builtin-loader/swc/types.d.ts +147 -2009
  5. package/dist/builtin-plugin/SwcJsMinimizerPlugin.d.ts +2 -1
  6. package/dist/config/normalization.d.ts +2 -1
  7. package/dist/config/types.d.ts +14 -3
  8. package/dist/config/utils.d.ts +3 -17
  9. package/dist/config/zod.d.ts +682 -4538
  10. package/dist/exports.d.ts +2 -1
  11. package/dist/index.js +3707 -1144
  12. package/dist/util/validate.d.ts +1 -1
  13. package/package.json +4 -4
  14. package/compiled/enhanced-resolve/CachedInputFileSystem.d.ts +0 -0
  15. package/compiled/enhanced-resolve/CachedInputFileSystem.js +0 -664
  16. package/compiled/enhanced-resolve/index.d.ts +0 -1124
  17. package/compiled/enhanced-resolve/license +0 -20
  18. package/compiled/enhanced-resolve/package.json +0 -1
  19. package/compiled/zod/dist/types/index.d.ts +0 -3
  20. package/compiled/zod/dist/types/v3/ZodError.d.ts +0 -164
  21. package/compiled/zod/dist/types/v3/benchmarks/datetime.d.ts +0 -5
  22. package/compiled/zod/dist/types/v3/benchmarks/discriminatedUnion.d.ts +0 -5
  23. package/compiled/zod/dist/types/v3/benchmarks/index.d.ts +0 -1
  24. package/compiled/zod/dist/types/v3/benchmarks/ipv4.d.ts +0 -5
  25. package/compiled/zod/dist/types/v3/benchmarks/object.d.ts +0 -5
  26. package/compiled/zod/dist/types/v3/benchmarks/primitives.d.ts +0 -5
  27. package/compiled/zod/dist/types/v3/benchmarks/realworld.d.ts +0 -5
  28. package/compiled/zod/dist/types/v3/benchmarks/string.d.ts +0 -5
  29. package/compiled/zod/dist/types/v3/benchmarks/union.d.ts +0 -5
  30. package/compiled/zod/dist/types/v3/errors.d.ts +0 -5
  31. package/compiled/zod/dist/types/v3/external.d.ts +0 -6
  32. package/compiled/zod/dist/types/v3/helpers/enumUtil.d.ts +0 -8
  33. package/compiled/zod/dist/types/v3/helpers/errorUtil.d.ts +0 -9
  34. package/compiled/zod/dist/types/v3/helpers/parseUtil.d.ts +0 -78
  35. package/compiled/zod/dist/types/v3/helpers/partialUtil.d.ts +0 -8
  36. package/compiled/zod/dist/types/v3/helpers/typeAliases.d.ts +0 -2
  37. package/compiled/zod/dist/types/v3/helpers/util.d.ts +0 -85
  38. package/compiled/zod/dist/types/v3/index.d.ts +0 -4
  39. package/compiled/zod/dist/types/v3/locales/en.d.ts +0 -3
  40. package/compiled/zod/dist/types/v3/standard-schema.d.ts +0 -102
  41. package/compiled/zod/dist/types/v3/tests/Mocker.d.ts +0 -17
  42. package/compiled/zod/dist/types/v3/types.d.ts +0 -1031
  43. package/compiled/zod/dist/types/v4/classic/checks.d.ts +0 -1
  44. package/compiled/zod/dist/types/v4/classic/coerce.d.ts +0 -17
  45. package/compiled/zod/dist/types/v4/classic/compat.d.ts +0 -48
  46. package/compiled/zod/dist/types/v4/classic/errors.d.ts +0 -30
  47. package/compiled/zod/dist/types/v4/classic/external.d.ts +0 -13
  48. package/compiled/zod/dist/types/v4/classic/index.d.ts +0 -4
  49. package/compiled/zod/dist/types/v4/classic/iso.d.ts +0 -22
  50. package/compiled/zod/dist/types/v4/classic/parse.d.ts +0 -23
  51. package/compiled/zod/dist/types/v4/classic/schemas.d.ts +0 -624
  52. package/compiled/zod/dist/types/v4/core/api.d.ts +0 -274
  53. package/compiled/zod/dist/types/v4/core/checks.d.ts +0 -277
  54. package/compiled/zod/dist/types/v4/core/config.d.ts +0 -9
  55. package/compiled/zod/dist/types/v4/core/core.d.ts +0 -47
  56. package/compiled/zod/dist/types/v4/core/doc.d.ts +0 -14
  57. package/compiled/zod/dist/types/v4/core/errors.d.ts +0 -204
  58. package/compiled/zod/dist/types/v4/core/function.d.ts +0 -52
  59. package/compiled/zod/dist/types/v4/core/index.d.ts +0 -15
  60. package/compiled/zod/dist/types/v4/core/json-schema.d.ts +0 -100
  61. package/compiled/zod/dist/types/v4/core/parse.d.ts +0 -25
  62. package/compiled/zod/dist/types/v4/core/regexes.d.ts +0 -62
  63. package/compiled/zod/dist/types/v4/core/registries.d.ts +0 -39
  64. package/compiled/zod/dist/types/v4/core/schemas.d.ts +0 -1005
  65. package/compiled/zod/dist/types/v4/core/standard-schema.d.ts +0 -55
  66. package/compiled/zod/dist/types/v4/core/to-json-schema.d.ts +0 -84
  67. package/compiled/zod/dist/types/v4/core/util.d.ts +0 -182
  68. package/compiled/zod/dist/types/v4/core/versions.d.ts +0 -5
  69. package/compiled/zod/dist/types/v4/core/zsf.d.ts +0 -91
  70. package/compiled/zod/dist/types/v4/index.d.ts +0 -3
  71. package/compiled/zod/dist/types/v4/locales/ar.d.ts +0 -4
  72. package/compiled/zod/dist/types/v4/locales/az.d.ts +0 -4
  73. package/compiled/zod/dist/types/v4/locales/be.d.ts +0 -4
  74. package/compiled/zod/dist/types/v4/locales/ca.d.ts +0 -4
  75. package/compiled/zod/dist/types/v4/locales/cs.d.ts +0 -4
  76. package/compiled/zod/dist/types/v4/locales/de.d.ts +0 -4
  77. package/compiled/zod/dist/types/v4/locales/en.d.ts +0 -5
  78. package/compiled/zod/dist/types/v4/locales/es.d.ts +0 -4
  79. package/compiled/zod/dist/types/v4/locales/fa.d.ts +0 -4
  80. package/compiled/zod/dist/types/v4/locales/fi.d.ts +0 -4
  81. package/compiled/zod/dist/types/v4/locales/fr-CA.d.ts +0 -4
  82. package/compiled/zod/dist/types/v4/locales/fr.d.ts +0 -4
  83. package/compiled/zod/dist/types/v4/locales/he.d.ts +0 -4
  84. package/compiled/zod/dist/types/v4/locales/hu.d.ts +0 -4
  85. package/compiled/zod/dist/types/v4/locales/id.d.ts +0 -4
  86. package/compiled/zod/dist/types/v4/locales/index.d.ts +0 -38
  87. package/compiled/zod/dist/types/v4/locales/it.d.ts +0 -4
  88. package/compiled/zod/dist/types/v4/locales/ja.d.ts +0 -4
  89. package/compiled/zod/dist/types/v4/locales/kh.d.ts +0 -4
  90. package/compiled/zod/dist/types/v4/locales/ko.d.ts +0 -4
  91. package/compiled/zod/dist/types/v4/locales/mk.d.ts +0 -4
  92. package/compiled/zod/dist/types/v4/locales/ms.d.ts +0 -4
  93. package/compiled/zod/dist/types/v4/locales/nl.d.ts +0 -4
  94. package/compiled/zod/dist/types/v4/locales/no.d.ts +0 -4
  95. package/compiled/zod/dist/types/v4/locales/ota.d.ts +0 -4
  96. package/compiled/zod/dist/types/v4/locales/pl.d.ts +0 -4
  97. package/compiled/zod/dist/types/v4/locales/ps.d.ts +0 -4
  98. package/compiled/zod/dist/types/v4/locales/pt.d.ts +0 -4
  99. package/compiled/zod/dist/types/v4/locales/ru.d.ts +0 -4
  100. package/compiled/zod/dist/types/v4/locales/sl.d.ts +0 -4
  101. package/compiled/zod/dist/types/v4/locales/sv.d.ts +0 -4
  102. package/compiled/zod/dist/types/v4/locales/ta.d.ts +0 -4
  103. package/compiled/zod/dist/types/v4/locales/th.d.ts +0 -4
  104. package/compiled/zod/dist/types/v4/locales/tr.d.ts +0 -5
  105. package/compiled/zod/dist/types/v4/locales/ua.d.ts +0 -4
  106. package/compiled/zod/dist/types/v4/locales/ur.d.ts +0 -4
  107. package/compiled/zod/dist/types/v4/locales/vi.d.ts +0 -4
  108. package/compiled/zod/dist/types/v4/locales/zh-CN.d.ts +0 -4
  109. package/compiled/zod/dist/types/v4/locales/zh-TW.d.ts +0 -4
  110. package/compiled/zod/dist/types/v4/mini/checks.d.ts +0 -1
  111. package/compiled/zod/dist/types/v4/mini/coerce.d.ts +0 -7
  112. package/compiled/zod/dist/types/v4/mini/external.d.ts +0 -11
  113. package/compiled/zod/dist/types/v4/mini/index.d.ts +0 -3
  114. package/compiled/zod/dist/types/v4/mini/iso.d.ts +0 -22
  115. package/compiled/zod/dist/types/v4/mini/parse.d.ts +0 -1
  116. package/compiled/zod/dist/types/v4/mini/schemas.d.ts +0 -350
  117. package/compiled/zod/index.js +0 -4513
  118. package/compiled/zod/license +0 -21
  119. package/compiled/zod/package.json +0 -1
  120. package/compiled/zod/v3/index.d.ts +0 -3
  121. package/compiled/zod/v4/core/index.d.ts +0 -1
  122. package/compiled/zod/v4/index.d.ts +0 -3
  123. package/compiled/zod/v4/locales/en.d.ts +0 -2
  124. package/compiled/zod/v4/locales/index.d.ts +0 -1
  125. package/compiled/zod/v4-mini/index.d.ts +0 -1
@@ -1,4 +1,4 @@
1
- import type { z } from "../../compiled/zod";
1
+ import type { z } from "zod/v4";
2
2
  export declare class ValidationError extends Error {
3
3
  constructor(message: string);
4
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rspack/core",
3
- "version": "1.4.0-beta.1",
3
+ "version": "1.4.0-rc.0",
4
4
  "webpackVersion": "5.75.0",
5
5
  "license": "MIT",
6
6
  "description": "The fast Rust-based web bundler with webpack-compatible API",
@@ -37,7 +37,7 @@
37
37
  "directory": "packages/rspack"
38
38
  },
39
39
  "devDependencies": {
40
- "@rslib/core": "0.9.2",
40
+ "@rslib/core": "0.10.0",
41
41
  "@swc/core": "1.12.0",
42
42
  "@swc/types": "0.1.22",
43
43
  "@types/graceful-fs": "4.1.9",
@@ -52,12 +52,12 @@
52
52
  "watchpack": "^2.4.4",
53
53
  "webpack-sources": "3.3.2",
54
54
  "zod": "^3.25.58",
55
- "zod-validation-error": "3.5.0"
55
+ "zod-validation-error": "3.5.2"
56
56
  },
57
57
  "dependencies": {
58
58
  "@module-federation/runtime-tools": "0.15.0",
59
59
  "@rspack/lite-tapable": "1.0.1",
60
- "@rspack/binding": "1.4.0-beta.1"
60
+ "@rspack/binding": "1.4.0-rc.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "@swc/helpers": ">=0.5.1"
@@ -1,664 +0,0 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
-
6
- "use strict";
7
-
8
- const nextTick = require("process").nextTick;
9
-
10
- /** @typedef {import("./Resolver").FileSystem} FileSystem */
11
- /** @typedef {import("./Resolver").PathLike} PathLike */
12
- /** @typedef {import("./Resolver").PathOrFileDescriptor} PathOrFileDescriptor */
13
- /** @typedef {import("./Resolver").SyncFileSystem} SyncFileSystem */
14
- /** @typedef {FileSystem & SyncFileSystem} BaseFileSystem */
15
-
16
- /**
17
- * @template T
18
- * @typedef {import("./Resolver").FileSystemCallback<T>} FileSystemCallback<T>
19
- */
20
-
21
- /**
22
- * @param {string} path path
23
- * @returns {string} dirname
24
- */
25
- const dirname = path => {
26
- let idx = path.length - 1;
27
- while (idx >= 0) {
28
- const c = path.charCodeAt(idx);
29
- // slash or backslash
30
- if (c === 47 || c === 92) break;
31
- idx--;
32
- }
33
- if (idx < 0) return "";
34
- return path.slice(0, idx);
35
- };
36
-
37
- /**
38
- * @template T
39
- * @param {FileSystemCallback<T>[]} callbacks callbacks
40
- * @param {Error | null} err error
41
- * @param {T} result result
42
- */
43
- const runCallbacks = (callbacks, err, result) => {
44
- if (callbacks.length === 1) {
45
- callbacks[0](err, result);
46
- callbacks.length = 0;
47
- return;
48
- }
49
- let error;
50
- for (const callback of callbacks) {
51
- try {
52
- callback(err, result);
53
- } catch (e) {
54
- if (!error) error = e;
55
- }
56
- }
57
- callbacks.length = 0;
58
- if (error) throw error;
59
- };
60
-
61
- class OperationMergerBackend {
62
- /**
63
- * @param {Function | undefined} provider async method in filesystem
64
- * @param {Function | undefined} syncProvider sync method in filesystem
65
- * @param {BaseFileSystem} providerContext call context for the provider methods
66
- */
67
- constructor(provider, syncProvider, providerContext) {
68
- this._provider = provider;
69
- this._syncProvider = syncProvider;
70
- this._providerContext = providerContext;
71
- this._activeAsyncOperations = new Map();
72
-
73
- this.provide = this._provider
74
- ? /**
75
- * @param {PathLike | PathOrFileDescriptor} path path
76
- * @param {object | FileSystemCallback<any> | undefined} options options
77
- * @param {FileSystemCallback<any>=} callback callback
78
- * @returns {any} result
79
- */
80
- (path, options, callback) => {
81
- if (typeof options === "function") {
82
- callback = /** @type {FileSystemCallback<any>} */ (options);
83
- options = undefined;
84
- }
85
- if (
86
- typeof path !== "string" &&
87
- !Buffer.isBuffer(path) &&
88
- !(path instanceof URL) &&
89
- typeof path !== "number"
90
- ) {
91
- /** @type {Function} */
92
- (callback)(
93
- new TypeError("path must be a string, Buffer, URL or number")
94
- );
95
- return;
96
- }
97
- if (options) {
98
- return /** @type {Function} */ (this._provider).call(
99
- this._providerContext,
100
- path,
101
- options,
102
- callback
103
- );
104
- }
105
- let callbacks = this._activeAsyncOperations.get(path);
106
- if (callbacks) {
107
- callbacks.push(callback);
108
- return;
109
- }
110
- this._activeAsyncOperations.set(path, (callbacks = [callback]));
111
- /** @type {Function} */
112
- (provider)(
113
- path,
114
- /**
115
- * @param {Error} err error
116
- * @param {any} result result
117
- */
118
- (err, result) => {
119
- this._activeAsyncOperations.delete(path);
120
- runCallbacks(callbacks, err, result);
121
- }
122
- );
123
- }
124
- : null;
125
- this.provideSync = this._syncProvider
126
- ? /**
127
- * @param {PathLike | PathOrFileDescriptor} path path
128
- * @param {object=} options options
129
- * @returns {any} result
130
- */
131
- (path, options) => {
132
- return /** @type {Function} */ (this._syncProvider).call(
133
- this._providerContext,
134
- path,
135
- options
136
- );
137
- }
138
- : null;
139
- }
140
-
141
- purge() {}
142
- purgeParent() {}
143
- }
144
-
145
- /*
146
-
147
- IDLE:
148
- insert data: goto SYNC
149
-
150
- SYNC:
151
- before provide: run ticks
152
- event loop tick: goto ASYNC_ACTIVE
153
-
154
- ASYNC:
155
- timeout: run tick, goto ASYNC_PASSIVE
156
-
157
- ASYNC_PASSIVE:
158
- before provide: run ticks
159
-
160
- IDLE --[insert data]--> SYNC --[event loop tick]--> ASYNC_ACTIVE --[interval tick]-> ASYNC_PASSIVE
161
- ^ |
162
- +---------[insert data]-------+
163
- */
164
-
165
- const STORAGE_MODE_IDLE = 0;
166
- const STORAGE_MODE_SYNC = 1;
167
- const STORAGE_MODE_ASYNC = 2;
168
-
169
- /**
170
- * @callback Provide
171
- * @param {PathLike | PathOrFileDescriptor} path path
172
- * @param {any} options options
173
- * @param {FileSystemCallback<any>} callback callback
174
- * @returns {void}
175
- */
176
-
177
- class CacheBackend {
178
- /**
179
- * @param {number} duration max cache duration of items
180
- * @param {function | undefined} provider async method
181
- * @param {function | undefined} syncProvider sync method
182
- * @param {BaseFileSystem} providerContext call context for the provider methods
183
- */
184
- constructor(duration, provider, syncProvider, providerContext) {
185
- this._duration = duration;
186
- this._provider = provider;
187
- this._syncProvider = syncProvider;
188
- this._providerContext = providerContext;
189
- /** @type {Map<string, FileSystemCallback<any>[]>} */
190
- this._activeAsyncOperations = new Map();
191
- /** @type {Map<string, { err: Error | null, result?: any, level: Set<string> }>} */
192
- this._data = new Map();
193
- /** @type {Set<string>[]} */
194
- this._levels = [];
195
- for (let i = 0; i < 10; i++) this._levels.push(new Set());
196
- for (let i = 5000; i < duration; i += 500) this._levels.push(new Set());
197
- this._currentLevel = 0;
198
- this._tickInterval = Math.floor(duration / this._levels.length);
199
- /** @type {STORAGE_MODE_IDLE | STORAGE_MODE_SYNC | STORAGE_MODE_ASYNC} */
200
- this._mode = STORAGE_MODE_IDLE;
201
-
202
- /** @type {NodeJS.Timeout | undefined} */
203
- this._timeout = undefined;
204
- /** @type {number | undefined} */
205
- this._nextDecay = undefined;
206
-
207
- // @ts-ignore
208
- this.provide = provider ? this.provide.bind(this) : null;
209
- // @ts-ignore
210
- this.provideSync = syncProvider ? this.provideSync.bind(this) : null;
211
- }
212
-
213
- /**
214
- * @param {PathLike | PathOrFileDescriptor} path path
215
- * @param {any} options options
216
- * @param {FileSystemCallback<any>} callback callback
217
- * @returns {void}
218
- */
219
- provide(path, options, callback) {
220
- if (typeof options === "function") {
221
- callback = options;
222
- options = undefined;
223
- }
224
- if (
225
- typeof path !== "string" &&
226
- !Buffer.isBuffer(path) &&
227
- !(path instanceof URL) &&
228
- typeof path !== "number"
229
- ) {
230
- callback(new TypeError("path must be a string, Buffer, URL or number"));
231
- return;
232
- }
233
- const strPath = typeof path !== "string" ? path.toString() : path;
234
- if (options) {
235
- return /** @type {Function} */ (this._provider).call(
236
- this._providerContext,
237
- path,
238
- options,
239
- callback
240
- );
241
- }
242
-
243
- // When in sync mode we can move to async mode
244
- if (this._mode === STORAGE_MODE_SYNC) {
245
- this._enterAsyncMode();
246
- }
247
-
248
- // Check in cache
249
- let cacheEntry = this._data.get(strPath);
250
- if (cacheEntry !== undefined) {
251
- if (cacheEntry.err) return nextTick(callback, cacheEntry.err);
252
- return nextTick(callback, null, cacheEntry.result);
253
- }
254
-
255
- // Check if there is already the same operation running
256
- let callbacks = this._activeAsyncOperations.get(strPath);
257
- if (callbacks !== undefined) {
258
- callbacks.push(callback);
259
- return;
260
- }
261
- this._activeAsyncOperations.set(strPath, (callbacks = [callback]));
262
-
263
- // Run the operation
264
- /** @type {Function} */
265
- (this._provider).call(
266
- this._providerContext,
267
- path,
268
- /**
269
- * @param {Error | null} err error
270
- * @param {any} [result] result
271
- */
272
- (err, result) => {
273
- this._activeAsyncOperations.delete(strPath);
274
- this._storeResult(strPath, err, result);
275
-
276
- // Enter async mode if not yet done
277
- this._enterAsyncMode();
278
-
279
- runCallbacks(
280
- /** @type {FileSystemCallback<any>[]} */ (callbacks),
281
- err,
282
- result
283
- );
284
- }
285
- );
286
- }
287
-
288
- /**
289
- * @param {PathLike | PathOrFileDescriptor} path path
290
- * @param {any} options options
291
- * @returns {any} result
292
- */
293
- provideSync(path, options) {
294
- if (
295
- typeof path !== "string" &&
296
- !Buffer.isBuffer(path) &&
297
- !(path instanceof URL) &&
298
- typeof path !== "number"
299
- ) {
300
- throw new TypeError("path must be a string");
301
- }
302
- const strPath = typeof path !== "string" ? path.toString() : path;
303
- if (options) {
304
- return /** @type {Function} */ (this._syncProvider).call(
305
- this._providerContext,
306
- path,
307
- options
308
- );
309
- }
310
-
311
- // In sync mode we may have to decay some cache items
312
- if (this._mode === STORAGE_MODE_SYNC) {
313
- this._runDecays();
314
- }
315
-
316
- // Check in cache
317
- let cacheEntry = this._data.get(strPath);
318
- if (cacheEntry !== undefined) {
319
- if (cacheEntry.err) throw cacheEntry.err;
320
- return cacheEntry.result;
321
- }
322
-
323
- // Get all active async operations
324
- // This sync operation will also complete them
325
- const callbacks = this._activeAsyncOperations.get(strPath);
326
- this._activeAsyncOperations.delete(strPath);
327
-
328
- // Run the operation
329
- // When in idle mode, we will enter sync mode
330
- let result;
331
- try {
332
- result = /** @type {Function} */ (this._syncProvider).call(
333
- this._providerContext,
334
- path
335
- );
336
- } catch (err) {
337
- this._storeResult(strPath, /** @type {Error} */ (err), undefined);
338
- this._enterSyncModeWhenIdle();
339
- if (callbacks) {
340
- runCallbacks(callbacks, /** @type {Error} */ (err), undefined);
341
- }
342
- throw err;
343
- }
344
- this._storeResult(strPath, null, result);
345
- this._enterSyncModeWhenIdle();
346
- if (callbacks) {
347
- runCallbacks(callbacks, null, result);
348
- }
349
- return result;
350
- }
351
-
352
- /**
353
- * @param {string | Buffer | URL | number | (string | URL | Buffer | number)[] | Set<string | URL | Buffer | number>} [what] what to purge
354
- */
355
- purge(what) {
356
- if (!what) {
357
- if (this._mode !== STORAGE_MODE_IDLE) {
358
- this._data.clear();
359
- for (const level of this._levels) {
360
- level.clear();
361
- }
362
- this._enterIdleMode();
363
- }
364
- } else if (
365
- typeof what === "string" ||
366
- Buffer.isBuffer(what) ||
367
- what instanceof URL ||
368
- typeof what === "number"
369
- ) {
370
- const strWhat = typeof what !== "string" ? what.toString() : what;
371
- for (let [key, data] of this._data) {
372
- if (key.startsWith(strWhat)) {
373
- this._data.delete(key);
374
- data.level.delete(key);
375
- }
376
- }
377
- if (this._data.size === 0) {
378
- this._enterIdleMode();
379
- }
380
- } else {
381
- for (let [key, data] of this._data) {
382
- for (const item of what) {
383
- const strItem = typeof item !== "string" ? item.toString() : item;
384
- if (key.startsWith(strItem)) {
385
- this._data.delete(key);
386
- data.level.delete(key);
387
- break;
388
- }
389
- }
390
- }
391
- if (this._data.size === 0) {
392
- this._enterIdleMode();
393
- }
394
- }
395
- }
396
-
397
- /**
398
- * @param {string | Buffer | URL | number | (string | URL | Buffer | number)[] | Set<string | URL | Buffer | number>} [what] what to purge
399
- */
400
- purgeParent(what) {
401
- if (!what) {
402
- this.purge();
403
- } else if (
404
- typeof what === "string" ||
405
- Buffer.isBuffer(what) ||
406
- what instanceof URL ||
407
- typeof what === "number"
408
- ) {
409
- const strWhat = typeof what !== "string" ? what.toString() : what;
410
- this.purge(dirname(strWhat));
411
- } else {
412
- const set = new Set();
413
- for (const item of what) {
414
- const strItem = typeof item !== "string" ? item.toString() : item;
415
- set.add(dirname(strItem));
416
- }
417
- this.purge(set);
418
- }
419
- }
420
-
421
- /**
422
- * @param {string} path path
423
- * @param {Error | null} err error
424
- * @param {any} result result
425
- */
426
- _storeResult(path, err, result) {
427
- if (this._data.has(path)) return;
428
- const level = this._levels[this._currentLevel];
429
- this._data.set(path, { err, result, level });
430
- level.add(path);
431
- }
432
-
433
- _decayLevel() {
434
- const nextLevel = (this._currentLevel + 1) % this._levels.length;
435
- const decay = this._levels[nextLevel];
436
- this._currentLevel = nextLevel;
437
- for (let item of decay) {
438
- this._data.delete(item);
439
- }
440
- decay.clear();
441
- if (this._data.size === 0) {
442
- this._enterIdleMode();
443
- } else {
444
- /** @type {number} */
445
- (this._nextDecay) += this._tickInterval;
446
- }
447
- }
448
-
449
- _runDecays() {
450
- while (
451
- /** @type {number} */ (this._nextDecay) <= Date.now() &&
452
- this._mode !== STORAGE_MODE_IDLE
453
- ) {
454
- this._decayLevel();
455
- }
456
- }
457
-
458
- _enterAsyncMode() {
459
- let timeout = 0;
460
- switch (this._mode) {
461
- case STORAGE_MODE_ASYNC:
462
- return;
463
- case STORAGE_MODE_IDLE:
464
- this._nextDecay = Date.now() + this._tickInterval;
465
- timeout = this._tickInterval;
466
- break;
467
- case STORAGE_MODE_SYNC:
468
- this._runDecays();
469
- // _runDecays may change the mode
470
- if (
471
- /** @type {STORAGE_MODE_IDLE | STORAGE_MODE_SYNC | STORAGE_MODE_ASYNC}*/
472
- (this._mode) === STORAGE_MODE_IDLE
473
- )
474
- return;
475
- timeout = Math.max(
476
- 0,
477
- /** @type {number} */ (this._nextDecay) - Date.now()
478
- );
479
- break;
480
- }
481
- this._mode = STORAGE_MODE_ASYNC;
482
- const ref = setTimeout(() => {
483
- this._mode = STORAGE_MODE_SYNC;
484
- this._runDecays();
485
- }, timeout);
486
- if (ref.unref) ref.unref();
487
- this._timeout = ref;
488
- }
489
-
490
- _enterSyncModeWhenIdle() {
491
- if (this._mode === STORAGE_MODE_IDLE) {
492
- this._mode = STORAGE_MODE_SYNC;
493
- this._nextDecay = Date.now() + this._tickInterval;
494
- }
495
- }
496
-
497
- _enterIdleMode() {
498
- this._mode = STORAGE_MODE_IDLE;
499
- this._nextDecay = undefined;
500
- if (this._timeout) clearTimeout(this._timeout);
501
- }
502
- }
503
-
504
- /**
505
- * @template {function} Provider
506
- * @template {function} AsyncProvider
507
- * @template FileSystem
508
- * @param {number} duration duration in ms files are cached
509
- * @param {Provider | undefined} provider provider
510
- * @param {AsyncProvider | undefined} syncProvider sync provider
511
- * @param {BaseFileSystem} providerContext provider context
512
- * @returns {OperationMergerBackend | CacheBackend} backend
513
- */
514
- const createBackend = (duration, provider, syncProvider, providerContext) => {
515
- if (duration > 0) {
516
- return new CacheBackend(duration, provider, syncProvider, providerContext);
517
- }
518
- return new OperationMergerBackend(provider, syncProvider, providerContext);
519
- };
520
-
521
- module.exports = class CachedInputFileSystem {
522
- /**
523
- * @param {BaseFileSystem} fileSystem file system
524
- * @param {number} duration duration in ms files are cached
525
- */
526
- constructor(fileSystem, duration) {
527
- this.fileSystem = fileSystem;
528
-
529
- this._lstatBackend = createBackend(
530
- duration,
531
- this.fileSystem.lstat,
532
- this.fileSystem.lstatSync,
533
- this.fileSystem
534
- );
535
- const lstat = this._lstatBackend.provide;
536
- this.lstat = /** @type {FileSystem["lstat"]} */ (lstat);
537
- const lstatSync = this._lstatBackend.provideSync;
538
- this.lstatSync = /** @type {SyncFileSystem["lstatSync"]} */ (lstatSync);
539
-
540
- this._statBackend = createBackend(
541
- duration,
542
- this.fileSystem.stat,
543
- this.fileSystem.statSync,
544
- this.fileSystem
545
- );
546
- const stat = this._statBackend.provide;
547
- this.stat = /** @type {FileSystem["stat"]} */ (stat);
548
- const statSync = this._statBackend.provideSync;
549
- this.statSync = /** @type {SyncFileSystem["statSync"]} */ (statSync);
550
-
551
- this._readdirBackend = createBackend(
552
- duration,
553
- this.fileSystem.readdir,
554
- this.fileSystem.readdirSync,
555
- this.fileSystem
556
- );
557
- const readdir = this._readdirBackend.provide;
558
- this.readdir = /** @type {FileSystem["readdir"]} */ (readdir);
559
- const readdirSync = this._readdirBackend.provideSync;
560
- this.readdirSync = /** @type {SyncFileSystem["readdirSync"]} */ (
561
- readdirSync
562
- );
563
-
564
- this._readFileBackend = createBackend(
565
- duration,
566
- this.fileSystem.readFile,
567
- this.fileSystem.readFileSync,
568
- this.fileSystem
569
- );
570
- const readFile = this._readFileBackend.provide;
571
- this.readFile = /** @type {FileSystem["readFile"]} */ (readFile);
572
- const readFileSync = this._readFileBackend.provideSync;
573
- this.readFileSync = /** @type {SyncFileSystem["readFileSync"]} */ (
574
- readFileSync
575
- );
576
-
577
- this._readJsonBackend = createBackend(
578
- duration,
579
- // prettier-ignore
580
- this.fileSystem.readJson ||
581
- (this.readFile &&
582
- (
583
- /**
584
- * @param {string} path path
585
- * @param {FileSystemCallback<any>} callback
586
- */
587
- (path, callback) => {
588
- this.readFile(path, (err, buffer) => {
589
- if (err) return callback(err);
590
- if (!buffer || buffer.length === 0)
591
- return callback(new Error("No file content"));
592
- let data;
593
- try {
594
- data = JSON.parse(buffer.toString("utf-8"));
595
- } catch (e) {
596
- return callback(/** @type {Error} */ (e));
597
- }
598
- callback(null, data);
599
- });
600
- })
601
- ),
602
- // prettier-ignore
603
- this.fileSystem.readJsonSync ||
604
- (this.readFileSync &&
605
- (
606
- /**
607
- * @param {string} path path
608
- * @returns {any} result
609
- */
610
- (path) => {
611
- const buffer = this.readFileSync(path);
612
- const data = JSON.parse(buffer.toString("utf-8"));
613
- return data;
614
- }
615
- )),
616
- this.fileSystem
617
- );
618
- const readJson = this._readJsonBackend.provide;
619
- this.readJson = /** @type {FileSystem["readJson"]} */ (readJson);
620
- const readJsonSync = this._readJsonBackend.provideSync;
621
- this.readJsonSync = /** @type {SyncFileSystem["readJsonSync"]} */ (
622
- readJsonSync
623
- );
624
-
625
- this._readlinkBackend = createBackend(
626
- duration,
627
- this.fileSystem.readlink,
628
- this.fileSystem.readlinkSync,
629
- this.fileSystem
630
- );
631
- const readlink = this._readlinkBackend.provide;
632
- this.readlink = /** @type {FileSystem["readlink"]} */ (readlink);
633
- const readlinkSync = this._readlinkBackend.provideSync;
634
- this.readlinkSync = /** @type {SyncFileSystem["readlinkSync"]} */ (
635
- readlinkSync
636
- );
637
-
638
- this._realpathBackend = createBackend(
639
- duration,
640
- this.fileSystem.realpath,
641
- this.fileSystem.realpathSync,
642
- this.fileSystem
643
- );
644
- const realpath = this._realpathBackend.provide;
645
- this.realpath = /** @type {FileSystem["realpath"]} */ (realpath);
646
- const realpathSync = this._realpathBackend.provideSync;
647
- this.realpathSync = /** @type {SyncFileSystem["realpathSync"]} */ (
648
- realpathSync
649
- );
650
- }
651
-
652
- /**
653
- * @param {string | Buffer | URL | number | (string | URL | Buffer | number)[] | Set<string | URL | Buffer | number>} [what] what to purge
654
- */
655
- purge(what) {
656
- this._statBackend.purge(what);
657
- this._lstatBackend.purge(what);
658
- this._readdirBackend.purgeParent(what);
659
- this._readFileBackend.purge(what);
660
- this._readlinkBackend.purge(what);
661
- this._readJsonBackend.purge(what);
662
- this._realpathBackend.purge(what);
663
- }
664
- };