@modern-js/app-tools 2.58.0 → 2.58.1-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,15 +38,26 @@ var import_pkg_types = require("pkg-types");
38
38
  var import_mlly = require("mlly");
39
39
  var import_utils2 = require("./utils");
40
40
  var import_nft = require("@vercel/nft");
41
- const handleDependencies = async ({ appDir, serverRootDir, includeEntries, traceFiles = import_utils2.traceFiles, entryFilter, modifyPackageJson, copyWholePackage, traceOptions }) => {
41
+ const handleDependencies = async ({ appDir, serverRootDir, includeEntries, traceFiles = import_utils2.traceFiles, entryFilter, modifyPackageJson, copyWholePackage, cacheOptions = {
42
+ cacheDir: ".modern-js/deploy",
43
+ fileCache: true,
44
+ analysisCache: true
45
+ }, traceOptions }) => {
42
46
  const base = "/";
47
+ const startTime = Date.now();
43
48
  const entryFiles = await (0, import_utils2.findEntryFiles)(serverRootDir, entryFilter);
49
+ console.time("traceFiles");
44
50
  const fileTrace = await traceFiles({
45
51
  entryFiles: entryFiles.concat(includeEntries),
46
52
  serverRootDir,
53
+ cacheOptions: {
54
+ ...cacheOptions,
55
+ cacheDir: import_node_path.default.resolve(appDir, cacheOptions.cacheDir)
56
+ },
47
57
  base,
48
58
  traceOptions
49
59
  });
60
+ console.timeEnd("traceFiles");
50
61
  const currentProjectModules = import_node_path.default.join(appDir, "node_modules");
51
62
  const dependencySearchRoot = import_node_path.default.resolve(appDir, "../../../../../../");
52
63
  const tracedFiles = Object.fromEntries(await Promise.all([
@@ -228,6 +239,8 @@ const handleDependencies = async ({ appDir, serverRootDir, includeEntries, trace
228
239
  };
229
240
  const finalPkgJson = (modifyPackageJson === null || modifyPackageJson === void 0 ? void 0 : modifyPackageJson(newPkgJson)) || newPkgJson;
230
241
  await import_utils.fs.writeJSON(outputPkgPath, finalPkgJson);
242
+ const endTime = Date.now();
243
+ console.log("handleDependencies cost:", `${endTime - startTime}ms`);
231
244
  };
232
245
  // Annotate the CommonJS export names for ESM import in node:
233
246
  0 && (module.exports = {
@@ -139,12 +139,108 @@ const findPackageParents = (pkg, version, tracedFiles) => {
139
139
  ];
140
140
  return parentPkgs.filter((parentPkg) => parentPkg);
141
141
  };
142
- const traceFiles = async ({ entryFiles, serverRootDir, base = "/", traceOptions }) => {
143
- return await (0, import_nft.nodeFileTrace)(entryFiles, {
142
+ async function serializeMap(map) {
143
+ const resolvedMap = /* @__PURE__ */ new Map();
144
+ await Promise.all(Array.from(map.entries()).map(async ([key, value]) => {
145
+ resolvedMap.set(key, value instanceof Promise ? await Promise.resolve(value) : value);
146
+ }));
147
+ return JSON.stringify(resolvedMap, (key, value) => {
148
+ if (value instanceof Map) {
149
+ return {
150
+ dataType: "Map",
151
+ value: Array.from(value.entries())
152
+ };
153
+ }
154
+ if (value instanceof Set) {
155
+ return {
156
+ dataType: "Set",
157
+ value: Array.from(value)
158
+ };
159
+ }
160
+ if (value === null) {
161
+ return void 0;
162
+ }
163
+ return value;
164
+ });
165
+ }
166
+ function deserializeMap(serializedData) {
167
+ return JSON.parse(serializedData, (key, value) => {
168
+ if (value && value.dataType === "Map") {
169
+ return new Map(value.value);
170
+ }
171
+ if (value && value.dataType === "Set") {
172
+ return new Set(value.value);
173
+ }
174
+ return value;
175
+ });
176
+ }
177
+ const traceFiles = async ({ entryFiles, serverRootDir, base = "/", cacheOptions, traceOptions }) => {
178
+ const { cacheDir, fileCache: enableFileCache, analysisCache: enableAnalysisCache } = cacheOptions;
179
+ const analysisCacheFile = import_path.default.join(cacheDir, "analysis-cache.json");
180
+ const fileCacheFile = import_path.default.join(cacheDir, "file-cache.json");
181
+ const statCacheFile = import_path.default.join(cacheDir, "stat-cache.json");
182
+ const symlinkCacheFile = import_path.default.join(cacheDir, "symlink-cache.json");
183
+ const cache = /* @__PURE__ */ Object.create(null);
184
+ if (enableAnalysisCache && await import_utils.fs.pathExists(analysisCacheFile)) {
185
+ const analysisCache2 = (await import_utils.fs.readFile(analysisCacheFile)).toString();
186
+ cache.analysisCache = deserializeMap(analysisCache2);
187
+ }
188
+ if (enableFileCache && await import_utils.fs.pathExists(fileCacheFile)) {
189
+ const fileCache2 = (await import_utils.fs.readFile(fileCacheFile)).toString();
190
+ cache.fileCache = deserializeMap(fileCache2);
191
+ }
192
+ if (await import_utils.fs.pathExists(symlinkCacheFile)) {
193
+ const symlinkCache2 = (await import_utils.fs.readFile(symlinkCacheFile)).toString();
194
+ cache.symlinkCache = deserializeMap(symlinkCache2);
195
+ }
196
+ const res = await (0, import_nft.nodeFileTrace)(entryFiles, {
144
197
  base,
145
198
  processCwd: serverRootDir,
199
+ cache,
146
200
  ...traceOptions
147
201
  });
202
+ const { analysisCache, fileCache, statCache, symlinkCache } = cache;
203
+ if (analysisCache || fileCache || statCache || symlinkCache) {
204
+ await import_utils.fs.ensureDir(cacheDir);
205
+ if (analysisCache) {
206
+ const newAnalysisCache = new Map(analysisCache);
207
+ for (const key of newAnalysisCache.keys()) {
208
+ if (!key.includes("node_modules/")) {
209
+ newAnalysisCache.delete(key);
210
+ }
211
+ }
212
+ (async () => {
213
+ await import_utils.fs.writeFile(analysisCacheFile, await serializeMap(newAnalysisCache));
214
+ console.log("write analysis cache finish");
215
+ })();
216
+ }
217
+ if (fileCache) {
218
+ const newFileCache = new Map(fileCache);
219
+ for (const key of newFileCache.keys()) {
220
+ if (!key.includes("node_modules/")) {
221
+ newFileCache.delete(key);
222
+ }
223
+ }
224
+ (async () => {
225
+ await import_utils.fs.writeFile(fileCacheFile, await serializeMap(newFileCache));
226
+ console.log("write file cache finish");
227
+ })();
228
+ }
229
+ if (symlinkCache) {
230
+ const newSymlinkCache = new Map(symlinkCache);
231
+ for (const key of newSymlinkCache.keys()) {
232
+ if (!key.includes("node_modules/")) {
233
+ newSymlinkCache.delete(key);
234
+ }
235
+ }
236
+ (async () => {
237
+ await import_utils.fs.writeFile(symlinkCacheFile, await serializeMap(newSymlinkCache));
238
+ console.log("write symlink cache finish");
239
+ })();
240
+ }
241
+ }
242
+ console.log("ffffffff", __filename);
243
+ return res;
148
244
  };
149
245
  const resolveTracedPath = async (base, p) => import_utils.fs.realpath(import_path.default.resolve(base, p));
150
246
  const isSubPath = (parentPath, childPath) => {
@@ -30,13 +30,13 @@ var config_exports = {};
30
30
  __export(config_exports, {
31
31
  buildServerConfig: () => buildServerConfig,
32
32
  defineServerConfig: () => defineServerConfig,
33
- emitResolvedConfig: () => emitResolvedConfig,
34
- safeReplacer: () => safeReplacer
33
+ emitResolvedConfig: () => emitResolvedConfig
35
34
  });
36
35
  module.exports = __toCommonJS(config_exports);
37
36
  var path = __toESM(require("path"));
38
37
  var import_node_bundle_require = require("@modern-js/node-bundle-require");
39
38
  var import_utils = require("@modern-js/utils");
39
+ var import_flatted = require("flatted");
40
40
  const defineServerConfig = (config) => config;
41
41
  const buildServerConfig = async ({ appDirectory, distDirectory, configFile, options, watch }) => {
42
42
  const configFilePath = await (0, import_utils.getServerConfig)(appDirectory, configFile);
@@ -69,33 +69,17 @@ const buildServerConfig = async ({ appDirectory, distDirectory, configFile, opti
69
69
  });
70
70
  }
71
71
  };
72
- const safeReplacer = () => {
73
- const cache = [];
74
- const keyCache = [];
75
- return function(key, value) {
76
- if (typeof value === "object" && value !== null) {
77
- const index = cache.indexOf(value);
78
- if (index !== -1) {
79
- return `[Circular ${keyCache[index]}]`;
80
- }
81
- cache.push(value);
82
- keyCache.push(key || "root");
83
- }
84
- return value;
85
- };
86
- };
87
72
  const emitResolvedConfig = async (appDirectory, resolvedConfig) => {
88
73
  var _resolvedConfig_output_distPath;
89
74
  const outputPath = (0, import_utils.ensureAbsolutePath)(appDirectory, path.join(((_resolvedConfig_output_distPath = resolvedConfig.output.distPath) === null || _resolvedConfig_output_distPath === void 0 ? void 0 : _resolvedConfig_output_distPath.root) || "./dist", import_utils.OUTPUT_CONFIG_FILE));
90
- await import_utils.fs.writeJSON(outputPath, resolvedConfig, {
91
- spaces: 2,
92
- replacer: safeReplacer()
75
+ const output = (0, import_flatted.stringify)(resolvedConfig);
76
+ await import_utils.fs.writeFile(outputPath, output, {
77
+ encoding: "utf-8"
93
78
  });
94
79
  };
95
80
  // Annotate the CommonJS export names for ESM import in node:
96
81
  0 && (module.exports = {
97
82
  buildServerConfig,
98
83
  defineServerConfig,
99
- emitResolvedConfig,
100
- safeReplacer
84
+ emitResolvedConfig
101
85
  });
@@ -1,4 +1,6 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
3
+ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
2
4
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
5
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
4
6
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
@@ -11,29 +13,39 @@ import { linkPackage, writePackage, isFile, findEntryFiles, traceFiles as defaul
11
13
  import { nodeFileTrace } from "@vercel/nft";
12
14
  var handleDependencies = function() {
13
15
  var _ref = _async_to_generator(function(param) {
14
- var appDir, serverRootDir, includeEntries, _param_traceFiles, traceFiles, entryFilter, modifyPackageJson, copyWholePackage, traceOptions, base, entryFiles, fileTrace, currentProjectModules, dependencySearchRoot, tracedFiles, _, tracedPackages, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, tracedFile, pkgName, tracedPackage, pkgJSON, tracedPackageVersion, shouldCopyWholePackage, _tracedPackageVersion_files, allFiles, err, multiVersionPkgs, singleVersionPackages, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, tracedPackage1, versions, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, version, projectPkgJson, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop, _iterator3, _step3, err, outputPkgPath, newPkgJson, finalPkgJson;
16
+ var appDir, serverRootDir, includeEntries, _param_traceFiles, traceFiles, entryFilter, modifyPackageJson, copyWholePackage, _param_cacheOptions, cacheOptions, traceOptions, base, startTime, entryFiles, fileTrace, currentProjectModules, dependencySearchRoot, tracedFiles, _, tracedPackages, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, tracedFile, pkgName, tracedPackage, pkgJSON, tracedPackageVersion, shouldCopyWholePackage, _tracedPackageVersion_files, allFiles, err, multiVersionPkgs, singleVersionPackages, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, tracedPackage1, versions, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, version, projectPkgJson, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop, _iterator3, _step3, err, outputPkgPath, newPkgJson, finalPkgJson, endTime;
15
17
  return _ts_generator(this, function(_state) {
16
18
  switch (_state.label) {
17
19
  case 0:
18
- appDir = param.appDir, serverRootDir = param.serverRootDir, includeEntries = param.includeEntries, _param_traceFiles = param.traceFiles, traceFiles = _param_traceFiles === void 0 ? defaultTraceFiles : _param_traceFiles, entryFilter = param.entryFilter, modifyPackageJson = param.modifyPackageJson, copyWholePackage = param.copyWholePackage, traceOptions = param.traceOptions;
20
+ appDir = param.appDir, serverRootDir = param.serverRootDir, includeEntries = param.includeEntries, _param_traceFiles = param.traceFiles, traceFiles = _param_traceFiles === void 0 ? defaultTraceFiles : _param_traceFiles, entryFilter = param.entryFilter, modifyPackageJson = param.modifyPackageJson, copyWholePackage = param.copyWholePackage, _param_cacheOptions = param.cacheOptions, cacheOptions = _param_cacheOptions === void 0 ? {
21
+ cacheDir: ".modern-js/deploy",
22
+ fileCache: true,
23
+ analysisCache: true
24
+ } : _param_cacheOptions, traceOptions = param.traceOptions;
19
25
  base = "/";
26
+ startTime = Date.now();
20
27
  return [
21
28
  4,
22
29
  findEntryFiles(serverRootDir, entryFilter)
23
30
  ];
24
31
  case 1:
25
32
  entryFiles = _state.sent();
33
+ console.time("traceFiles");
26
34
  return [
27
35
  4,
28
36
  traceFiles({
29
37
  entryFiles: entryFiles.concat(includeEntries),
30
38
  serverRootDir,
39
+ cacheOptions: _object_spread_props(_object_spread({}, cacheOptions), {
40
+ cacheDir: path.resolve(appDir, cacheOptions.cacheDir)
41
+ }),
31
42
  base,
32
43
  traceOptions
33
44
  })
34
45
  ];
35
46
  case 2:
36
47
  fileTrace = _state.sent();
48
+ console.timeEnd("traceFiles");
37
49
  currentProjectModules = path.join(appDir, "node_modules");
38
50
  dependencySearchRoot = path.resolve(appDir, "../../../../../../");
39
51
  _ = Object.fromEntries;
@@ -598,6 +610,8 @@ var handleDependencies = function() {
598
610
  ];
599
611
  case 24:
600
612
  _state.sent();
613
+ endTime = Date.now();
614
+ console.log("handleDependencies cost:", "".concat(endTime - startTime, "ms"));
601
615
  return [
602
616
  2
603
617
  ];
@@ -1,5 +1,7 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
2
3
  import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
4
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
5
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
4
6
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
5
7
  import path from "path";
@@ -335,24 +337,396 @@ var findPackageParents = function(pkg, version, tracedFiles) {
335
337
  return parentPkg;
336
338
  });
337
339
  };
340
+ function serializeMap(map) {
341
+ return _serializeMap.apply(this, arguments);
342
+ }
343
+ function _serializeMap() {
344
+ _serializeMap = // function serializeMap(map: Map<string, any>) {
345
+ // return JSON.stringify(map, (key, value) => {
346
+ // if (value instanceof Map) {
347
+ // return {
348
+ // dataType: 'Map',
349
+ // value: [...value.entries()],
350
+ // };
351
+ // }
352
+ // if (value instanceof Set) {
353
+ // return {
354
+ // dataType: 'Set',
355
+ // value: [...value],
356
+ // };
357
+ // }
358
+ // return value;
359
+ // });
360
+ // }
361
+ _async_to_generator(function(map) {
362
+ var resolvedMap;
363
+ return _ts_generator(this, function(_state) {
364
+ switch (_state.label) {
365
+ case 0:
366
+ resolvedMap = /* @__PURE__ */ new Map();
367
+ return [
368
+ 4,
369
+ Promise.all(Array.from(map.entries()).map(function() {
370
+ var _ref = _async_to_generator(function(param) {
371
+ var _param, key, value, _, _tmp, _tmp1;
372
+ return _ts_generator(this, function(_state2) {
373
+ switch (_state2.label) {
374
+ case 0:
375
+ _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
376
+ _ = resolvedMap.set;
377
+ _tmp = [
378
+ key
379
+ ];
380
+ if (!_instanceof(value, Promise))
381
+ return [
382
+ 3,
383
+ 2
384
+ ];
385
+ return [
386
+ 4,
387
+ Promise.resolve(value)
388
+ ];
389
+ case 1:
390
+ _tmp1 = _state2.sent();
391
+ return [
392
+ 3,
393
+ 3
394
+ ];
395
+ case 2:
396
+ _tmp1 = value;
397
+ _state2.label = 3;
398
+ case 3:
399
+ _.apply(resolvedMap, _tmp.concat([
400
+ _tmp1
401
+ ]));
402
+ return [
403
+ 2
404
+ ];
405
+ }
406
+ });
407
+ });
408
+ return function(_) {
409
+ return _ref.apply(this, arguments);
410
+ };
411
+ }()))
412
+ ];
413
+ case 1:
414
+ _state.sent();
415
+ return [
416
+ 2,
417
+ JSON.stringify(resolvedMap, function(key, value) {
418
+ if (_instanceof(value, Map)) {
419
+ return {
420
+ dataType: "Map",
421
+ value: Array.from(value.entries())
422
+ };
423
+ }
424
+ if (_instanceof(value, Set)) {
425
+ return {
426
+ dataType: "Set",
427
+ value: Array.from(value)
428
+ };
429
+ }
430
+ if (value === null) {
431
+ return void 0;
432
+ }
433
+ return value;
434
+ })
435
+ ];
436
+ }
437
+ });
438
+ });
439
+ return _serializeMap.apply(this, arguments);
440
+ }
441
+ function deserializeMap(serializedData) {
442
+ return JSON.parse(serializedData, function(key, value) {
443
+ if (value && value.dataType === "Map") {
444
+ return new Map(value.value);
445
+ }
446
+ if (value && value.dataType === "Set") {
447
+ return new Set(value.value);
448
+ }
449
+ return value;
450
+ });
451
+ }
338
452
  var traceFiles = function() {
339
453
  var _ref = _async_to_generator(function(param) {
340
- var entryFiles, serverRootDir, _param_base, base, traceOptions;
454
+ var entryFiles, serverRootDir, _param_base, base, cacheOptions, traceOptions, cacheDir, enableFileCache, enableAnalysisCache, analysisCacheFile, fileCacheFile, statCacheFile, symlinkCacheFile, cache, _tmp, analysisCache, _tmp1, fileCache, symlinkCache, res, analysisCache1, fileCache1, statCache, symlinkCache1, newAnalysisCache, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, key, newFileCache, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, key1, newSymlinkCache, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, key2;
341
455
  return _ts_generator(this, function(_state) {
342
456
  switch (_state.label) {
343
457
  case 0:
344
- entryFiles = param.entryFiles, serverRootDir = param.serverRootDir, _param_base = param.base, base = _param_base === void 0 ? "/" : _param_base, traceOptions = param.traceOptions;
458
+ entryFiles = param.entryFiles, serverRootDir = param.serverRootDir, _param_base = param.base, base = _param_base === void 0 ? "/" : _param_base, cacheOptions = param.cacheOptions, traceOptions = param.traceOptions;
459
+ cacheDir = cacheOptions.cacheDir, enableFileCache = cacheOptions.fileCache, enableAnalysisCache = cacheOptions.analysisCache;
460
+ analysisCacheFile = path.join(cacheDir, "analysis-cache.json");
461
+ fileCacheFile = path.join(cacheDir, "file-cache.json");
462
+ statCacheFile = path.join(cacheDir, "stat-cache.json");
463
+ symlinkCacheFile = path.join(cacheDir, "symlink-cache.json");
464
+ cache = /* @__PURE__ */ Object.create(null);
465
+ _tmp = enableAnalysisCache;
466
+ if (!_tmp)
467
+ return [
468
+ 3,
469
+ 2
470
+ ];
471
+ return [
472
+ 4,
473
+ fse.pathExists(analysisCacheFile)
474
+ ];
475
+ case 1:
476
+ _tmp = _state.sent();
477
+ _state.label = 2;
478
+ case 2:
479
+ if (!_tmp)
480
+ return [
481
+ 3,
482
+ 4
483
+ ];
484
+ return [
485
+ 4,
486
+ fse.readFile(analysisCacheFile)
487
+ ];
488
+ case 3:
489
+ analysisCache = _state.sent().toString();
490
+ cache.analysisCache = deserializeMap(analysisCache);
491
+ _state.label = 4;
492
+ case 4:
493
+ _tmp1 = enableFileCache;
494
+ if (!_tmp1)
495
+ return [
496
+ 3,
497
+ 6
498
+ ];
499
+ return [
500
+ 4,
501
+ fse.pathExists(fileCacheFile)
502
+ ];
503
+ case 5:
504
+ _tmp1 = _state.sent();
505
+ _state.label = 6;
506
+ case 6:
507
+ if (!_tmp1)
508
+ return [
509
+ 3,
510
+ 8
511
+ ];
512
+ return [
513
+ 4,
514
+ fse.readFile(fileCacheFile)
515
+ ];
516
+ case 7:
517
+ fileCache = _state.sent().toString();
518
+ cache.fileCache = deserializeMap(fileCache);
519
+ _state.label = 8;
520
+ case 8:
521
+ return [
522
+ 4,
523
+ fse.pathExists(symlinkCacheFile)
524
+ ];
525
+ case 9:
526
+ if (!_state.sent())
527
+ return [
528
+ 3,
529
+ 11
530
+ ];
531
+ return [
532
+ 4,
533
+ fse.readFile(symlinkCacheFile)
534
+ ];
535
+ case 10:
536
+ symlinkCache = _state.sent().toString();
537
+ cache.symlinkCache = deserializeMap(symlinkCache);
538
+ _state.label = 11;
539
+ case 11:
345
540
  return [
346
541
  4,
347
542
  nodeFileTrace(entryFiles, _object_spread({
348
543
  base,
349
- processCwd: serverRootDir
544
+ processCwd: serverRootDir,
545
+ cache
350
546
  }, traceOptions))
351
547
  ];
352
- case 1:
548
+ case 12:
549
+ res = _state.sent();
550
+ analysisCache1 = cache.analysisCache, fileCache1 = cache.fileCache, statCache = cache.statCache, symlinkCache1 = cache.symlinkCache;
551
+ if (!(analysisCache1 || fileCache1 || statCache || symlinkCache1))
552
+ return [
553
+ 3,
554
+ 14
555
+ ];
556
+ return [
557
+ 4,
558
+ fse.ensureDir(cacheDir)
559
+ ];
560
+ case 13:
561
+ _state.sent();
562
+ if (analysisCache1) {
563
+ newAnalysisCache = new Map(analysisCache1);
564
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
565
+ try {
566
+ for (_iterator = newAnalysisCache.keys()[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
567
+ key = _step.value;
568
+ if (!key.includes("node_modules/")) {
569
+ newAnalysisCache.delete(key);
570
+ }
571
+ }
572
+ } catch (err) {
573
+ _didIteratorError = true;
574
+ _iteratorError = err;
575
+ } finally {
576
+ try {
577
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
578
+ _iterator.return();
579
+ }
580
+ } finally {
581
+ if (_didIteratorError) {
582
+ throw _iteratorError;
583
+ }
584
+ }
585
+ }
586
+ _async_to_generator(function() {
587
+ var _, _tmp2;
588
+ return _ts_generator(this, function(_state2) {
589
+ switch (_state2.label) {
590
+ case 0:
591
+ _ = fse.writeFile;
592
+ _tmp2 = [
593
+ analysisCacheFile
594
+ ];
595
+ return [
596
+ 4,
597
+ serializeMap(newAnalysisCache)
598
+ ];
599
+ case 1:
600
+ return [
601
+ 4,
602
+ _.apply(fse, _tmp2.concat([
603
+ _state2.sent()
604
+ ]))
605
+ ];
606
+ case 2:
607
+ _state2.sent();
608
+ console.log("write analysis cache finish");
609
+ return [
610
+ 2
611
+ ];
612
+ }
613
+ });
614
+ })();
615
+ }
616
+ if (fileCache1) {
617
+ newFileCache = new Map(fileCache1);
618
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
619
+ try {
620
+ for (_iterator1 = newFileCache.keys()[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
621
+ key1 = _step1.value;
622
+ if (!key1.includes("node_modules/")) {
623
+ newFileCache.delete(key1);
624
+ }
625
+ }
626
+ } catch (err) {
627
+ _didIteratorError1 = true;
628
+ _iteratorError1 = err;
629
+ } finally {
630
+ try {
631
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
632
+ _iterator1.return();
633
+ }
634
+ } finally {
635
+ if (_didIteratorError1) {
636
+ throw _iteratorError1;
637
+ }
638
+ }
639
+ }
640
+ _async_to_generator(function() {
641
+ var _, _tmp2;
642
+ return _ts_generator(this, function(_state2) {
643
+ switch (_state2.label) {
644
+ case 0:
645
+ _ = fse.writeFile;
646
+ _tmp2 = [
647
+ fileCacheFile
648
+ ];
649
+ return [
650
+ 4,
651
+ serializeMap(newFileCache)
652
+ ];
653
+ case 1:
654
+ return [
655
+ 4,
656
+ _.apply(fse, _tmp2.concat([
657
+ _state2.sent()
658
+ ]))
659
+ ];
660
+ case 2:
661
+ _state2.sent();
662
+ console.log("write file cache finish");
663
+ return [
664
+ 2
665
+ ];
666
+ }
667
+ });
668
+ })();
669
+ }
670
+ if (symlinkCache1) {
671
+ newSymlinkCache = new Map(symlinkCache1);
672
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
673
+ try {
674
+ for (_iterator2 = newSymlinkCache.keys()[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
675
+ key2 = _step2.value;
676
+ if (!key2.includes("node_modules/")) {
677
+ newSymlinkCache.delete(key2);
678
+ }
679
+ }
680
+ } catch (err) {
681
+ _didIteratorError2 = true;
682
+ _iteratorError2 = err;
683
+ } finally {
684
+ try {
685
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
686
+ _iterator2.return();
687
+ }
688
+ } finally {
689
+ if (_didIteratorError2) {
690
+ throw _iteratorError2;
691
+ }
692
+ }
693
+ }
694
+ _async_to_generator(function() {
695
+ var _, _tmp2;
696
+ return _ts_generator(this, function(_state2) {
697
+ switch (_state2.label) {
698
+ case 0:
699
+ _ = fse.writeFile;
700
+ _tmp2 = [
701
+ symlinkCacheFile
702
+ ];
703
+ return [
704
+ 4,
705
+ serializeMap(newSymlinkCache)
706
+ ];
707
+ case 1:
708
+ return [
709
+ 4,
710
+ _.apply(fse, _tmp2.concat([
711
+ _state2.sent()
712
+ ]))
713
+ ];
714
+ case 2:
715
+ _state2.sent();
716
+ console.log("write symlink cache finish");
717
+ return [
718
+ 2
719
+ ];
720
+ }
721
+ });
722
+ })();
723
+ }
724
+ _state.label = 14;
725
+ case 14:
726
+ console.log("ffffffff", __filename);
353
727
  return [
354
728
  2,
355
- _state.sent()
729
+ res
356
730
  ];
357
731
  }
358
732
  });
@@ -5,6 +5,7 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
5
5
  import * as path from "path";
6
6
  import { bundle } from "@modern-js/node-bundle-require";
7
7
  import { fs, getServerConfig, ensureAbsolutePath, OUTPUT_CONFIG_FILE, CONFIG_FILE_EXTENSIONS } from "@modern-js/utils";
8
+ import { stringify } from "flatted";
8
9
  var defineServerConfig = function(config) {
9
10
  return config;
10
11
  };
@@ -88,33 +89,18 @@ var buildServerConfig = function() {
88
89
  return _ref.apply(this, arguments);
89
90
  };
90
91
  }();
91
- var safeReplacer = function() {
92
- var cache = [];
93
- var keyCache = [];
94
- return function safeReplacer2(key, value) {
95
- if (typeof value === "object" && value !== null) {
96
- var index = cache.indexOf(value);
97
- if (index !== -1) {
98
- return "[Circular ".concat(keyCache[index], "]");
99
- }
100
- cache.push(value);
101
- keyCache.push(key || "root");
102
- }
103
- return value;
104
- };
105
- };
106
92
  var emitResolvedConfig = function() {
107
93
  var _ref = _async_to_generator(function(appDirectory, resolvedConfig) {
108
- var _resolvedConfig_output_distPath, outputPath;
94
+ var _resolvedConfig_output_distPath, outputPath, output;
109
95
  return _ts_generator(this, function(_state) {
110
96
  switch (_state.label) {
111
97
  case 0:
112
98
  outputPath = ensureAbsolutePath(appDirectory, path.join(((_resolvedConfig_output_distPath = resolvedConfig.output.distPath) === null || _resolvedConfig_output_distPath === void 0 ? void 0 : _resolvedConfig_output_distPath.root) || "./dist", OUTPUT_CONFIG_FILE));
99
+ output = stringify(resolvedConfig);
113
100
  return [
114
101
  4,
115
- fs.writeJSON(outputPath, resolvedConfig, {
116
- spaces: 2,
117
- replacer: safeReplacer()
102
+ fs.writeFile(outputPath, output, {
103
+ encoding: "utf-8"
118
104
  })
119
105
  ];
120
106
  case 1:
@@ -132,6 +118,5 @@ var emitResolvedConfig = function() {
132
118
  export {
133
119
  buildServerConfig,
134
120
  defineServerConfig,
135
- emitResolvedConfig,
136
- safeReplacer
121
+ emitResolvedConfig
137
122
  };
@@ -4,15 +4,26 @@ import { readPackageJSON } from "pkg-types";
4
4
  import { parseNodeModulePath } from "mlly";
5
5
  import { linkPackage, writePackage, isFile, findEntryFiles, traceFiles as defaultTraceFiles, findPackageParents, resolveTracedPath, readDirRecursive, isSubPath } from "./utils";
6
6
  import { nodeFileTrace } from "@vercel/nft";
7
- const handleDependencies = async ({ appDir, serverRootDir, includeEntries, traceFiles = defaultTraceFiles, entryFilter, modifyPackageJson, copyWholePackage, traceOptions }) => {
7
+ const handleDependencies = async ({ appDir, serverRootDir, includeEntries, traceFiles = defaultTraceFiles, entryFilter, modifyPackageJson, copyWholePackage, cacheOptions = {
8
+ cacheDir: ".modern-js/deploy",
9
+ fileCache: true,
10
+ analysisCache: true
11
+ }, traceOptions }) => {
8
12
  const base = "/";
13
+ const startTime = Date.now();
9
14
  const entryFiles = await findEntryFiles(serverRootDir, entryFilter);
15
+ console.time("traceFiles");
10
16
  const fileTrace = await traceFiles({
11
17
  entryFiles: entryFiles.concat(includeEntries),
12
18
  serverRootDir,
19
+ cacheOptions: {
20
+ ...cacheOptions,
21
+ cacheDir: path.resolve(appDir, cacheOptions.cacheDir)
22
+ },
13
23
  base,
14
24
  traceOptions
15
25
  });
26
+ console.timeEnd("traceFiles");
16
27
  const currentProjectModules = path.join(appDir, "node_modules");
17
28
  const dependencySearchRoot = path.resolve(appDir, "../../../../../../");
18
29
  const tracedFiles = Object.fromEntries(await Promise.all([
@@ -194,6 +205,8 @@ const handleDependencies = async ({ appDir, serverRootDir, includeEntries, trace
194
205
  };
195
206
  const finalPkgJson = (modifyPackageJson === null || modifyPackageJson === void 0 ? void 0 : modifyPackageJson(newPkgJson)) || newPkgJson;
196
207
  await fse.writeJSON(outputPkgPath, finalPkgJson);
208
+ const endTime = Date.now();
209
+ console.log("handleDependencies cost:", `${endTime - startTime}ms`);
197
210
  };
198
211
  export {
199
212
  handleDependencies,
@@ -98,12 +98,108 @@ const findPackageParents = (pkg, version, tracedFiles) => {
98
98
  ];
99
99
  return parentPkgs.filter((parentPkg) => parentPkg);
100
100
  };
101
- const traceFiles = async ({ entryFiles, serverRootDir, base = "/", traceOptions }) => {
102
- return await nodeFileTrace(entryFiles, {
101
+ async function serializeMap(map) {
102
+ const resolvedMap = /* @__PURE__ */ new Map();
103
+ await Promise.all(Array.from(map.entries()).map(async ([key, value]) => {
104
+ resolvedMap.set(key, value instanceof Promise ? await Promise.resolve(value) : value);
105
+ }));
106
+ return JSON.stringify(resolvedMap, (key, value) => {
107
+ if (value instanceof Map) {
108
+ return {
109
+ dataType: "Map",
110
+ value: Array.from(value.entries())
111
+ };
112
+ }
113
+ if (value instanceof Set) {
114
+ return {
115
+ dataType: "Set",
116
+ value: Array.from(value)
117
+ };
118
+ }
119
+ if (value === null) {
120
+ return void 0;
121
+ }
122
+ return value;
123
+ });
124
+ }
125
+ function deserializeMap(serializedData) {
126
+ return JSON.parse(serializedData, (key, value) => {
127
+ if (value && value.dataType === "Map") {
128
+ return new Map(value.value);
129
+ }
130
+ if (value && value.dataType === "Set") {
131
+ return new Set(value.value);
132
+ }
133
+ return value;
134
+ });
135
+ }
136
+ const traceFiles = async ({ entryFiles, serverRootDir, base = "/", cacheOptions, traceOptions }) => {
137
+ const { cacheDir, fileCache: enableFileCache, analysisCache: enableAnalysisCache } = cacheOptions;
138
+ const analysisCacheFile = path.join(cacheDir, "analysis-cache.json");
139
+ const fileCacheFile = path.join(cacheDir, "file-cache.json");
140
+ const statCacheFile = path.join(cacheDir, "stat-cache.json");
141
+ const symlinkCacheFile = path.join(cacheDir, "symlink-cache.json");
142
+ const cache = /* @__PURE__ */ Object.create(null);
143
+ if (enableAnalysisCache && await fse.pathExists(analysisCacheFile)) {
144
+ const analysisCache2 = (await fse.readFile(analysisCacheFile)).toString();
145
+ cache.analysisCache = deserializeMap(analysisCache2);
146
+ }
147
+ if (enableFileCache && await fse.pathExists(fileCacheFile)) {
148
+ const fileCache2 = (await fse.readFile(fileCacheFile)).toString();
149
+ cache.fileCache = deserializeMap(fileCache2);
150
+ }
151
+ if (await fse.pathExists(symlinkCacheFile)) {
152
+ const symlinkCache2 = (await fse.readFile(symlinkCacheFile)).toString();
153
+ cache.symlinkCache = deserializeMap(symlinkCache2);
154
+ }
155
+ const res = await nodeFileTrace(entryFiles, {
103
156
  base,
104
157
  processCwd: serverRootDir,
158
+ cache,
105
159
  ...traceOptions
106
160
  });
161
+ const { analysisCache, fileCache, statCache, symlinkCache } = cache;
162
+ if (analysisCache || fileCache || statCache || symlinkCache) {
163
+ await fse.ensureDir(cacheDir);
164
+ if (analysisCache) {
165
+ const newAnalysisCache = new Map(analysisCache);
166
+ for (const key of newAnalysisCache.keys()) {
167
+ if (!key.includes("node_modules/")) {
168
+ newAnalysisCache.delete(key);
169
+ }
170
+ }
171
+ (async () => {
172
+ await fse.writeFile(analysisCacheFile, await serializeMap(newAnalysisCache));
173
+ console.log("write analysis cache finish");
174
+ })();
175
+ }
176
+ if (fileCache) {
177
+ const newFileCache = new Map(fileCache);
178
+ for (const key of newFileCache.keys()) {
179
+ if (!key.includes("node_modules/")) {
180
+ newFileCache.delete(key);
181
+ }
182
+ }
183
+ (async () => {
184
+ await fse.writeFile(fileCacheFile, await serializeMap(newFileCache));
185
+ console.log("write file cache finish");
186
+ })();
187
+ }
188
+ if (symlinkCache) {
189
+ const newSymlinkCache = new Map(symlinkCache);
190
+ for (const key of newSymlinkCache.keys()) {
191
+ if (!key.includes("node_modules/")) {
192
+ newSymlinkCache.delete(key);
193
+ }
194
+ }
195
+ (async () => {
196
+ await fse.writeFile(symlinkCacheFile, await serializeMap(newSymlinkCache));
197
+ console.log("write symlink cache finish");
198
+ })();
199
+ }
200
+ }
201
+ console.log("ffffffff", __filename);
202
+ return res;
107
203
  };
108
204
  const resolveTracedPath = async (base, p) => fse.realpath(path.resolve(base, p));
109
205
  const isSubPath = (parentPath, childPath) => {
@@ -1,6 +1,7 @@
1
1
  import * as path from "path";
2
2
  import { bundle } from "@modern-js/node-bundle-require";
3
3
  import { fs, getServerConfig, ensureAbsolutePath, OUTPUT_CONFIG_FILE, CONFIG_FILE_EXTENSIONS } from "@modern-js/utils";
4
+ import { stringify } from "flatted";
4
5
  const defineServerConfig = (config) => config;
5
6
  const buildServerConfig = async ({ appDirectory, distDirectory, configFile, options, watch }) => {
6
7
  const configFilePath = await getServerConfig(appDirectory, configFile);
@@ -33,32 +34,16 @@ const buildServerConfig = async ({ appDirectory, distDirectory, configFile, opti
33
34
  });
34
35
  }
35
36
  };
36
- const safeReplacer = () => {
37
- const cache = [];
38
- const keyCache = [];
39
- return function(key, value) {
40
- if (typeof value === "object" && value !== null) {
41
- const index = cache.indexOf(value);
42
- if (index !== -1) {
43
- return `[Circular ${keyCache[index]}]`;
44
- }
45
- cache.push(value);
46
- keyCache.push(key || "root");
47
- }
48
- return value;
49
- };
50
- };
51
37
  const emitResolvedConfig = async (appDirectory, resolvedConfig) => {
52
38
  var _resolvedConfig_output_distPath;
53
39
  const outputPath = ensureAbsolutePath(appDirectory, path.join(((_resolvedConfig_output_distPath = resolvedConfig.output.distPath) === null || _resolvedConfig_output_distPath === void 0 ? void 0 : _resolvedConfig_output_distPath.root) || "./dist", OUTPUT_CONFIG_FILE));
54
- await fs.writeJSON(outputPath, resolvedConfig, {
55
- spaces: 2,
56
- replacer: safeReplacer()
40
+ const output = stringify(resolvedConfig);
41
+ await fs.writeFile(outputPath, output, {
42
+ encoding: "utf-8"
57
43
  });
58
44
  };
59
45
  export {
60
46
  buildServerConfig,
61
47
  defineServerConfig,
62
- emitResolvedConfig,
63
- safeReplacer
48
+ emitResolvedConfig
64
49
  };
@@ -1,20 +1,22 @@
1
1
  import type { PackageJson } from 'pkg-types';
2
2
  import type { NodeFileTraceOptions } from '@vercel/nft';
3
- import { traceFiles as defaultTraceFiles } from './utils';
3
+ import { traceFiles as defaultTraceFiles, CacheOptions } from './utils';
4
4
  export type { NodeFileTraceOptions } from '@vercel/nft';
5
5
  export { nodeFileTrace } from '@vercel/nft';
6
- export declare const handleDependencies: ({ appDir, serverRootDir, includeEntries, traceFiles, entryFilter, modifyPackageJson, copyWholePackage, traceOptions, }: {
6
+ export declare const handleDependencies: ({ appDir, serverRootDir, includeEntries, traceFiles, entryFilter, modifyPackageJson, copyWholePackage, cacheOptions, traceOptions, }: {
7
7
  appDir: string;
8
8
  serverRootDir: string;
9
9
  includeEntries: string[];
10
- traceFiles?: (({ entryFiles, serverRootDir, base, traceOptions, }: {
10
+ traceFiles?: (({ entryFiles, serverRootDir, base, cacheOptions, traceOptions, }: {
11
11
  entryFiles: string[];
12
12
  serverRootDir: string;
13
13
  base?: string | undefined;
14
+ cacheOptions: CacheOptions;
14
15
  traceOptions?: NodeFileTraceOptions | undefined;
15
16
  }) => Promise<import("@vercel/nft").NodeFileTraceResult>) | undefined;
16
17
  entryFilter?: ((filePath: string) => boolean) | undefined;
17
18
  modifyPackageJson?: ((pkgJson: PackageJson) => PackageJson) | undefined;
18
19
  copyWholePackage?: ((pkgName: string) => boolean) | undefined;
20
+ cacheOptions?: CacheOptions | undefined;
19
21
  traceOptions?: NodeFileTraceOptions | undefined;
20
22
  }) => Promise<void>;
@@ -33,10 +33,16 @@ export declare const readDirRecursive: (dir: string, options?: ReadDirOptions) =
33
33
  export declare const isFile: (file: string) => Promise<boolean>;
34
34
  export declare const findEntryFiles: (rootDir: string, entryFilter?: ((filePath: string) => boolean) | undefined) => Promise<string[]>;
35
35
  export declare const findPackageParents: (pkg: TracedPackage, version: string, tracedFiles: Record<string, TracedFile>) => string[];
36
- export declare const traceFiles: ({ entryFiles, serverRootDir, base, traceOptions, }: {
36
+ export interface CacheOptions {
37
+ fileCache: boolean;
38
+ analysisCache: boolean;
39
+ cacheDir: string;
40
+ }
41
+ export declare const traceFiles: ({ entryFiles, serverRootDir, base, cacheOptions, traceOptions, }: {
37
42
  entryFiles: string[];
38
43
  serverRootDir: string;
39
44
  base?: string | undefined;
45
+ cacheOptions: CacheOptions;
40
46
  traceOptions?: NodeFileTraceOptions | undefined;
41
47
  }) => Promise<import("@vercel/nft").NodeFileTraceResult>;
42
48
  export declare const resolveTracedPath: (base: string, p: string) => Promise<string>;
@@ -9,9 +9,4 @@ export declare const buildServerConfig: ({ appDirectory, distDirectory, configFi
9
9
  options?: Parameters<typeof bundle>[1];
10
10
  watch?: boolean | undefined;
11
11
  }) => Promise<void>;
12
- /**
13
- *
14
- * 处理循环引用的 replacer
15
- */
16
- export declare const safeReplacer: () => (key: string, value: unknown) => unknown;
17
12
  export declare const emitResolvedConfig: (appDirectory: string, resolvedConfig: AppNormalizedConfig<'shared'>) => Promise<void>;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.58.0",
18
+ "version": "2.58.1-alpha.1",
19
19
  "jsnext:source": "./src/index.ts",
20
20
  "types": "./dist/types/index.d.ts",
21
21
  "main": "./dist/cjs/index.js",
@@ -77,33 +77,35 @@
77
77
  "@babel/parser": "^7.22.15",
78
78
  "@babel/traverse": "^7.23.2",
79
79
  "@babel/types": "^7.24.7",
80
- "@rsbuild/plugin-node-polyfill": "1.0.3",
81
- "@rsbuild/core": "1.0.1-beta.9",
80
+ "@rsbuild/core": "1.0.1-beta.10",
81
+ "@rsbuild/plugin-node-polyfill": "1.0.4",
82
82
  "@swc/helpers": "0.5.3",
83
+ "@ungap/structured-clone": "^1.2.0",
83
84
  "@vercel/nft": "^0.26.4",
84
85
  "es-module-lexer": "^1.1.0",
85
86
  "esbuild": "0.17.19",
86
87
  "esbuild-register": "^3.5.0",
88
+ "flatted": "^3.2.9",
87
89
  "mlly": "^1.6.1",
88
90
  "pkg-types": "^1.1.0",
89
91
  "std-env": "^3.7.0",
90
- "@modern-js/core": "2.58.0",
91
- "@modern-js/plugin-data-loader": "2.58.0",
92
92
  "@modern-js/node-bundle-require": "2.58.0",
93
- "@modern-js/plugin-lint": "2.58.0",
94
- "@modern-js/rsbuild-plugin-esbuild": "2.58.0",
95
93
  "@modern-js/plugin": "2.58.0",
94
+ "@modern-js/core": "2.58.0",
96
95
  "@modern-js/plugin-i18n": "2.58.0",
97
- "@modern-js/prod-server": "2.58.0",
98
96
  "@modern-js/server": "2.58.0",
99
- "@modern-js/server-utils": "2.58.0",
97
+ "@modern-js/prod-server": "2.58.0",
98
+ "@modern-js/server-core": "2.58.0",
99
+ "@modern-js/plugin-lint": "2.58.0",
100
100
  "@modern-js/types": "2.58.0",
101
+ "@modern-js/utils": "2.58.0",
101
102
  "@modern-js/uni-builder": "2.58.0",
102
- "@modern-js/server-core": "2.58.0",
103
- "@modern-js/utils": "2.58.0"
103
+ "@modern-js/rsbuild-plugin-esbuild": "2.58.0",
104
+ "@modern-js/plugin-data-loader": "2.58.0",
105
+ "@modern-js/server-utils": "2.58.0"
104
106
  },
105
107
  "devDependencies": {
106
- "@rsbuild/plugin-swc": "1.0.1-beta.9",
108
+ "@rsbuild/plugin-swc": "1.0.1-beta.10",
107
109
  "@types/babel__traverse": "7.18.5",
108
110
  "@types/jest": "^29",
109
111
  "@types/node": "^14",
@@ -112,8 +114,8 @@
112
114
  "tsconfig-paths": "^4.2.0",
113
115
  "typescript": "^5",
114
116
  "webpack": "^5.93.0",
115
- "@scripts/jest-config": "2.58.0",
116
- "@scripts/build": "2.58.0"
117
+ "@scripts/build": "2.58.0",
118
+ "@scripts/jest-config": "2.58.0"
117
119
  },
118
120
  "sideEffects": false,
119
121
  "publishConfig": {