@module-federation/dts-plugin 2.7.0 → 2.8.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.
@@ -12,8 +12,6 @@ os = require_Action.__toESM(os);
12
12
  let isomorphic_ws = require("isomorphic-ws");
13
13
  isomorphic_ws = require_Action.__toESM(isomorphic_ws);
14
14
  let http = require("http");
15
- let node_schedule = require("node-schedule");
16
- node_schedule = require_Action.__toESM(node_schedule);
17
15
 
18
16
  //#region src/server/message/API/API.ts
19
17
  let APIKind = /* @__PURE__ */ function(APIKind) {
@@ -256,6 +254,46 @@ let UpdateKind = /* @__PURE__ */ function(UpdateKind) {
256
254
 
257
255
  //#endregion
258
256
  //#region src/server/broker/Broker.ts
257
+ const CLEANUP_HOURS = [
258
+ 0,
259
+ 3,
260
+ 6,
261
+ 9,
262
+ 12,
263
+ 15,
264
+ 18
265
+ ];
266
+ function getNextCleanupDelay(now = /* @__PURE__ */ new Date()) {
267
+ for (const hour of CLEANUP_HOURS) {
268
+ const candidate = new Date(now);
269
+ candidate.setHours(hour, 0, 0, 0);
270
+ if (candidate.getTime() > now.getTime()) return candidate.getTime() - now.getTime();
271
+ }
272
+ const nextDay = new Date(now);
273
+ nextDay.setDate(nextDay.getDate() + 1);
274
+ nextDay.setHours(CLEANUP_HOURS[0], 0, 0, 0);
275
+ return nextDay.getTime() - now.getTime();
276
+ }
277
+ function scheduleCleanup(callback, testIntervalMs = 0) {
278
+ let timeout;
279
+ let cancelled = false;
280
+ const scheduleNext = () => {
281
+ const delay = testIntervalMs > 0 ? testIntervalMs : getNextCleanupDelay();
282
+ timeout = setTimeout(() => {
283
+ if (cancelled) return;
284
+ callback();
285
+ scheduleNext();
286
+ }, delay);
287
+ };
288
+ scheduleNext();
289
+ return { cancel() {
290
+ cancelled = true;
291
+ if (timeout) {
292
+ clearTimeout(timeout);
293
+ timeout = void 0;
294
+ }
295
+ } };
296
+ }
259
297
  var Broker = class Broker {
260
298
  static {
261
299
  this.WEB_SOCKET_CONNECT_MAGIC_ID = require_Action.WEB_SOCKET_CONNECT_MAGIC_ID;
@@ -646,32 +684,13 @@ var Broker = class Broker {
646
684
  });
647
685
  }
648
686
  _setSchedule() {
649
- const rule = new node_schedule.default.RecurrenceRule();
650
- if (Number(process.env["FEDERATION_SERVER_TEST"])) {
651
- const interval = Number(process.env["FEDERATION_SERVER_TEST"]) / 1e3;
652
- const second = [];
653
- for (let i = 0; i < 60; i = i + interval) second.push(i);
654
- rule.second = second;
655
- } else {
656
- rule.second = 0;
657
- rule.hour = [
658
- 0,
659
- 3,
660
- 6,
661
- 9,
662
- 12,
663
- 15,
664
- 18
665
- ];
666
- rule.minute = 0;
667
- }
668
687
  const serverTest = Number(process.env["FEDERATION_SERVER_TEST"]);
669
- this._scheduleJob = node_schedule.default.scheduleJob(rule, () => {
688
+ this._scheduleJob = scheduleCleanup(() => {
670
689
  this._tmpSubscriberShelter.forEach((tmpSubscriber, identifier) => {
671
690
  fileLog(` _clearTmpSubScriberRelation ${identifier}, ${Date.now() - tmpSubscriber.timestamp >= (process.env["GARFISH_MODULE_SERVER_TEST"] ? serverTest : Broker.DEFAULT_WAITING_TIME)}`, "Broker", "info");
672
691
  if (Date.now() - tmpSubscriber.timestamp >= (process.env["FEDERATION_SERVER_TEST"] ? serverTest : Broker.DEFAULT_WAITING_TIME)) this._clearTmpSubScriberRelation(identifier);
673
692
  });
674
- });
693
+ }, serverTest);
675
694
  }
676
695
  _clearSchedule() {
677
696
  if (!this._scheduleJob) return;
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @module-federation/dts-plugin
2
2
 
3
+ ## 2.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 681e5d2: feat(dts-plugin): support ts 7 for federated type generation while keeping existing ts versions supported
8
+
9
+ ### Patch Changes
10
+
11
+ - 6ee67dc: Reduce installed and bundled size by replacing general-purpose cache, path, version, package lookup, scheduling, fetch, and error fallback dependencies with focused built-in utilities.
12
+ - Updated dependencies [ea490ae]
13
+ - Updated dependencies [6ee67dc]
14
+ - @module-federation/sdk@2.8.0
15
+ - @module-federation/managers@2.8.0
16
+ - @module-federation/third-party-dts-extractor@2.8.0
17
+ - @module-federation/error-codes@2.8.0
18
+
3
19
  ## 2.7.0
4
20
 
5
21
  ### Patch Changes
@@ -1,5 +1,4 @@
1
1
  import { moduleFederationPlugin } from "@module-federation/sdk";
2
- import ts from "typescript";
3
2
  import { ChildProcess } from "child_process";
4
3
 
5
4
  //#region \0rolldown/runtime.js
@@ -14,18 +13,31 @@ interface RemoteOptions extends moduleFederationPlugin.DtsRemoteOptions {
14
13
  }
15
14
  //#endregion
16
15
  //#region src/core/interfaces/TsConfigJson.d.ts
16
+ type TsConfigCompilerOptions = Record<string, any> & {
17
+ rootDir?: string;
18
+ outDir?: string;
19
+ declarationDir?: string;
20
+ tsBuildInfoFile?: string;
21
+ incremental?: boolean;
22
+ paths?: Record<string, string[]>;
23
+ baseUrl?: string;
24
+ };
17
25
  interface TsConfigJson {
18
26
  extends?: string;
19
- compilerOptions?: ts.CompilerOptions;
27
+ compilerOptions?: TsConfigCompilerOptions;
20
28
  exclude?: string[];
21
29
  include?: string[];
22
30
  files?: string[];
31
+ references?: Array<{
32
+ path: string;
33
+ }>;
34
+ [key: string]: any;
23
35
  }
24
36
  //#endregion
25
37
  //#region src/core/configurations/remotePlugin.d.ts
26
38
  declare const retrieveRemoteConfig: (options: RemoteOptions) => {
27
39
  tsConfig: TsConfigJson;
28
- mapComponentsToExpose: Record<string, string>;
40
+ mapComponentsToExpose: any;
29
41
  remoteOptions: Required<RemoteOptions>;
30
42
  };
31
43
  //#endregion
@@ -1,4 +1,4 @@
1
- import { a as DTSManagerOptions, i as DTSManager, l as TsConfigJson, o as HostOptions, s as RemoteInfo, u as RemoteOptions } from "./DtsWorker-Bt7-_SGH.js";
1
+ import { a as DTSManagerOptions, i as DTSManager, l as TsConfigJson, o as HostOptions, s as RemoteInfo, u as RemoteOptions } from "./DtsWorker-SBLpkK-D.js";
2
2
  import { moduleFederationPlugin } from "@module-federation/sdk";
3
3
 
4
4
  //#region src/core/configurations/hostPlugin.d.ts
@@ -1,5 +1,5 @@
1
1
  const require_Action = require('./Action-CzhPMw2i.js');
2
- const require_expose_rpc = require('./expose-rpc-BpRiu3VK.js');
2
+ const require_expose_rpc = require('./expose-rpc-jaGpsAVL.js');
3
3
  let url = require("url");
4
4
  let path = require("path");
5
5
  path = require_Action.__toESM(path);
package/dist/core.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { a as DTSManagerOptions, c as retrieveRemoteConfig, i as DTSManager, o as HostOptions, r as index_d_exports, t as DtsWorker, u as RemoteOptions } from "./DtsWorker-Bt7-_SGH.js";
2
- import { a as generateTypesInChildProcess, c as retrieveMfTypesPath, d as isTSProject, f as retrieveTypesAssetsInfo, i as consumeTypes, l as retrieveOriginalOutDir, m as retrieveHostConfig, n as REMOTE_ALIAS_IDENTIFIER, o as generateTypes, p as validateOptions, r as REMOTE_API_TYPES_FILE_NAME, s as retrieveTypesZipPath, t as HOST_API_TYPES_FILE_NAME, u as getDTSManagerConstructor } from "./constant-YOdZl7sj.js";
1
+ import { a as DTSManagerOptions, c as retrieveRemoteConfig, i as DTSManager, o as HostOptions, r as index_d_exports, t as DtsWorker, u as RemoteOptions } from "./DtsWorker-SBLpkK-D.js";
2
+ import { a as generateTypesInChildProcess, c as retrieveMfTypesPath, d as isTSProject, f as retrieveTypesAssetsInfo, i as consumeTypes, l as retrieveOriginalOutDir, m as retrieveHostConfig, n as REMOTE_ALIAS_IDENTIFIER, o as generateTypes, p as validateOptions, r as REMOTE_API_TYPES_FILE_NAME, s as retrieveTypesZipPath, t as HOST_API_TYPES_FILE_NAME, u as getDTSManagerConstructor } from "./constant-C0QI9ddQ.js";
3
3
  export { DTSManager, type DTSManagerOptions, DtsWorker, HOST_API_TYPES_FILE_NAME, type HostOptions, REMOTE_ALIAS_IDENTIFIER, REMOTE_API_TYPES_FILE_NAME, type RemoteOptions, consumeTypes, generateTypes, generateTypesInChildProcess, getDTSManagerConstructor, isTSProject, retrieveHostConfig, retrieveMfTypesPath, retrieveOriginalOutDir, retrieveRemoteConfig, retrieveTypesAssetsInfo, retrieveTypesZipPath, index_d_exports as rpc, validateOptions };
package/dist/core.js CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- require('./Broker-CaenCqdn.js');
3
- const require_expose_rpc = require('./expose-rpc-BpRiu3VK.js');
4
- const require_consumeTypes = require('./consumeTypes-Dle9g2SZ.js');
2
+ require('./Broker-C-uWF8l5.js');
3
+ const require_expose_rpc = require('./expose-rpc-jaGpsAVL.js');
4
+ const require_consumeTypes = require('./consumeTypes-DhrUgkUW.js');
5
5
 
6
6
  exports.DTSManager = require_expose_rpc.DTSManager;
7
7
  exports.DtsWorker = require_consumeTypes.DtsWorker;
@@ -338,6 +338,7 @@ declare class RemoteHandler {
338
338
  registerRemotes(remotes: Remote[], options?: {
339
339
  force?: boolean;
340
340
  }): void;
341
+ initRawContainer(name: string, url: string, container: RemoteEntryExports): Module$1;
341
342
  getRemoteModuleAndOptions(options: {
342
343
  id: string;
343
344
  }): Promise<{
@@ -7,7 +7,6 @@ import net from "net";
7
7
  import os from "os";
8
8
  import WebSocket from "isomorphic-ws";
9
9
  import { createServer } from "http";
10
- import schedule from "node-schedule";
11
10
 
12
11
  //#region src/server/message/API/API.ts
13
12
  let APIKind = /* @__PURE__ */ function(APIKind) {
@@ -250,6 +249,46 @@ let UpdateKind = /* @__PURE__ */ function(UpdateKind) {
250
249
 
251
250
  //#endregion
252
251
  //#region src/server/broker/Broker.ts
252
+ const CLEANUP_HOURS = [
253
+ 0,
254
+ 3,
255
+ 6,
256
+ 9,
257
+ 12,
258
+ 15,
259
+ 18
260
+ ];
261
+ function getNextCleanupDelay(now = /* @__PURE__ */ new Date()) {
262
+ for (const hour of CLEANUP_HOURS) {
263
+ const candidate = new Date(now);
264
+ candidate.setHours(hour, 0, 0, 0);
265
+ if (candidate.getTime() > now.getTime()) return candidate.getTime() - now.getTime();
266
+ }
267
+ const nextDay = new Date(now);
268
+ nextDay.setDate(nextDay.getDate() + 1);
269
+ nextDay.setHours(CLEANUP_HOURS[0], 0, 0, 0);
270
+ return nextDay.getTime() - now.getTime();
271
+ }
272
+ function scheduleCleanup(callback, testIntervalMs = 0) {
273
+ let timeout;
274
+ let cancelled = false;
275
+ const scheduleNext = () => {
276
+ const delay = testIntervalMs > 0 ? testIntervalMs : getNextCleanupDelay();
277
+ timeout = setTimeout(() => {
278
+ if (cancelled) return;
279
+ callback();
280
+ scheduleNext();
281
+ }, delay);
282
+ };
283
+ scheduleNext();
284
+ return { cancel() {
285
+ cancelled = true;
286
+ if (timeout) {
287
+ clearTimeout(timeout);
288
+ timeout = void 0;
289
+ }
290
+ } };
291
+ }
253
292
  var Broker = class Broker {
254
293
  static {
255
294
  this.WEB_SOCKET_CONNECT_MAGIC_ID = WEB_SOCKET_CONNECT_MAGIC_ID;
@@ -640,32 +679,13 @@ var Broker = class Broker {
640
679
  });
641
680
  }
642
681
  _setSchedule() {
643
- const rule = new schedule.RecurrenceRule();
644
- if (Number(process.env["FEDERATION_SERVER_TEST"])) {
645
- const interval = Number(process.env["FEDERATION_SERVER_TEST"]) / 1e3;
646
- const second = [];
647
- for (let i = 0; i < 60; i = i + interval) second.push(i);
648
- rule.second = second;
649
- } else {
650
- rule.second = 0;
651
- rule.hour = [
652
- 0,
653
- 3,
654
- 6,
655
- 9,
656
- 12,
657
- 15,
658
- 18
659
- ];
660
- rule.minute = 0;
661
- }
662
682
  const serverTest = Number(process.env["FEDERATION_SERVER_TEST"]);
663
- this._scheduleJob = schedule.scheduleJob(rule, () => {
683
+ this._scheduleJob = scheduleCleanup(() => {
664
684
  this._tmpSubscriberShelter.forEach((tmpSubscriber, identifier) => {
665
685
  fileLog(` _clearTmpSubScriberRelation ${identifier}, ${Date.now() - tmpSubscriber.timestamp >= (process.env["GARFISH_MODULE_SERVER_TEST"] ? serverTest : Broker.DEFAULT_WAITING_TIME)}`, "Broker", "info");
666
686
  if (Date.now() - tmpSubscriber.timestamp >= (process.env["FEDERATION_SERVER_TEST"] ? serverTest : Broker.DEFAULT_WAITING_TIME)) this._clearTmpSubScriberRelation(identifier);
667
687
  });
668
- });
688
+ }, serverTest);
669
689
  }
670
690
  _clearSchedule() {
671
691
  if (!this._scheduleJob) return;
@@ -1,4 +1,4 @@
1
- import { a as cloneDeepOptions, n as RpcGMCallTypes, o as getDTSManagerConstructor, s as isDebugMode, t as exposeRpc, x as __exportAll } from "./expose-rpc-CDdqA9PX.mjs";
1
+ import { a as cloneDeepOptions, n as RpcGMCallTypes, o as getDTSManagerConstructor, s as isDebugMode, t as exposeRpc, x as __exportAll } from "./expose-rpc-B0rqtOKP.mjs";
2
2
  import { fileURLToPath } from "url";
3
3
  import path from "path";
4
4
  import { randomUUID } from "crypto";
package/dist/esm/core.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as retrieveMfTypesPath, c as isTSProject, d as DTSManager, f as HOST_API_TYPES_FILE_NAME, g as retrieveTypesZipPath, h as retrieveHostConfig, i as retrieveRemoteConfig, l as retrieveTypesAssetsInfo, m as REMOTE_API_TYPES_FILE_NAME, o as getDTSManagerConstructor, p as REMOTE_ALIAS_IDENTIFIER, r as generateTypes, u as validateOptions, v as retrieveOriginalOutDir } from "./expose-rpc-CDdqA9PX.mjs";
2
- import "./Broker-Cmbh_XVO.mjs";
3
- import { i as rpc_exports, n as generateTypesInChildProcess, r as DtsWorker, t as consumeTypes } from "./consumeTypes-3S4eCiRK.mjs";
1
+ import { _ as retrieveMfTypesPath, c as isTSProject, d as DTSManager, f as HOST_API_TYPES_FILE_NAME, g as retrieveTypesZipPath, h as retrieveHostConfig, i as retrieveRemoteConfig, l as retrieveTypesAssetsInfo, m as REMOTE_API_TYPES_FILE_NAME, o as getDTSManagerConstructor, p as REMOTE_ALIAS_IDENTIFIER, r as generateTypes, u as validateOptions, v as retrieveOriginalOutDir } from "./expose-rpc-B0rqtOKP.mjs";
2
+ import "./Broker-BfFUcTHm.mjs";
3
+ import { i as rpc_exports, n as generateTypesInChildProcess, r as DtsWorker, t as consumeTypes } from "./consumeTypes-WKYNaS9i.mjs";
4
4
 
5
5
  export { DTSManager, DtsWorker, HOST_API_TYPES_FILE_NAME, REMOTE_ALIAS_IDENTIFIER, REMOTE_API_TYPES_FILE_NAME, consumeTypes, generateTypes, generateTypesInChildProcess, getDTSManagerConstructor, isTSProject, retrieveHostConfig, retrieveMfTypesPath, retrieveOriginalOutDir, retrieveRemoteConfig, retrieveTypesAssetsInfo, retrieveTypesZipPath, rpc_exports as rpc, validateOptions };
@@ -1,24 +1,24 @@
1
1
  import { a as MF_SERVER_IDENTIFIER, n as ActionKind, o as UpdateMode, r as DEFAULT_TAR_NAME, t as Action } from "./Action-DNNg2YDh.mjs";
2
- import { a as getIdentifier, c as logger$1, i as getFreePort, l as LogKind, n as UpdateKind, o as getIPV4, r as fib, s as fileLog, t as Broker, u as APIKind } from "./Broker-Cmbh_XVO.mjs";
2
+ import { a as getIdentifier, c as logger$1, i as getFreePort, l as LogKind, n as UpdateKind, o as getIPV4, r as fib, s as fileLog, t as Broker, u as APIKind } from "./Broker-BfFUcTHm.mjs";
3
3
  import { createRequire } from "node:module";
4
- import fs, { existsSync, mkdirSync, writeFileSync } from "fs";
4
+ import fs, { existsSync, mkdirSync, realpathSync, rmSync, writeFileSync } from "fs";
5
5
  import { fileURLToPath } from "url";
6
6
  import path, { dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "path";
7
7
  import { cp, mkdir, readFile, readdir, rm, stat, writeFile } from "fs/promises";
8
+ import crypto from "crypto";
9
+ import { execFile, execFileSync, fork } from "child_process";
8
10
  import { utils } from "@module-federation/managers";
9
- import typescript from "typescript";
10
- import { styleText } from "node:util";
11
11
  import { ENCODE_NAME_PREFIX, MANIFEST_EXT, TEMP_DIR, decodeName, getProcessEnv, inferAutoPublicPath, parseEntry } from "@module-federation/sdk";
12
+ import { styleText } from "node:util";
12
13
  import { Agent } from "undici";
13
14
  import { ThirdPartyExtractor } from "@module-federation/third-party-dts-extractor";
14
15
  import AdmZip from "adm-zip";
15
- import crypto from "crypto";
16
16
  import { TYPE_001, typeDescMap } from "@module-federation/error-codes";
17
17
  import { logAndReport } from "@module-federation/error-codes/node";
18
- import { execFile, fork } from "child_process";
19
18
  import util from "util";
20
19
  import WebSocket from "isomorphic-ws";
21
20
  import http from "http";
21
+ import { createRequire as createRequire$1 } from "module";
22
22
  import process$1 from "process";
23
23
 
24
24
  //#region \0rolldown/runtime.js
@@ -438,6 +438,49 @@ async function createHttpServer(options) {
438
438
  };
439
439
  }
440
440
 
441
+ //#endregion
442
+ //#region src/core/lib/typeScriptResolver.ts
443
+ const parseMajorVersion = (version) => {
444
+ const major = Number.parseInt(version.split(".")[0], 10);
445
+ return Number.isNaN(major) ? 0 : major;
446
+ };
447
+ const isMissingTypeScriptPackage = (error) => typeof error === "object" && error !== null && "code" in error && error.code === "MODULE_NOT_FOUND" && "message" in error && typeof error.message === "string" && error.message.includes("typescript/package.json");
448
+ const resolveTypeScriptPackage = (context = process.cwd()) => {
449
+ const candidateContexts = [...new Set([context, process.cwd()])];
450
+ let missingTypeScriptError;
451
+ for (const candidateContext of candidateContexts) {
452
+ const requireFromContext = createRequire$1(resolve(candidateContext, "package.json"));
453
+ try {
454
+ return {
455
+ packageJsonPath: requireFromContext.resolve("typescript/package.json"),
456
+ packageJson: requireFromContext("typescript/package.json"),
457
+ requireFromContext
458
+ };
459
+ } catch (error) {
460
+ if (!isMissingTypeScriptPackage(error)) throw error;
461
+ missingTypeScriptError = error;
462
+ }
463
+ }
464
+ throw missingTypeScriptError;
465
+ };
466
+ const getTypeScriptPackageInfo = (context = process.cwd()) => {
467
+ const { packageJsonPath, packageJson } = resolveTypeScriptPackage(context);
468
+ const version = packageJson.version || "0.0.0";
469
+ const packageRoot = dirname(packageJsonPath);
470
+ const bin = typeof packageJson.bin === "string" ? packageJson.bin : packageJson.bin?.["tsc"] ?? "./bin/tsc";
471
+ return {
472
+ packageJsonPath,
473
+ packageRoot,
474
+ version,
475
+ majorVersion: parseMajorVersion(version),
476
+ tscBinPath: resolve(packageRoot, bin)
477
+ };
478
+ };
479
+ const requireTypeScript = (context = process.cwd()) => {
480
+ const { requireFromContext } = resolveTypeScriptPackage(context);
481
+ return requireFromContext("typescript");
482
+ };
483
+
441
484
  //#endregion
442
485
  //#region src/core/lib/typeScriptCompiler.ts
443
486
  const STARTS_WITH_SLASH = /^\//;
@@ -546,6 +589,40 @@ const formatCommandForDisplay = (executable, args) => {
546
589
  };
547
590
  return [executable, ...args].map(formatArg).join(" ");
548
591
  };
592
+ const getTypeScriptContext$1 = (remoteOptions) => {
593
+ const dtsOptions = remoteOptions.moduleFederationConfig.dts;
594
+ return typeof dtsOptions !== "boolean" && dtsOptions?.cwd ? dtsOptions.cwd : remoteOptions.context;
595
+ };
596
+ const resolveCompilerCommand = (remoteOptions, tempTsConfigJsonPath) => {
597
+ const compilerArgs = splitCommandArgs(remoteOptions.compilerInstance);
598
+ const resolvedCompilerArgs = compilerArgs.length > 0 ? compilerArgs : [remoteOptions.compilerInstance];
599
+ if (resolvedCompilerArgs[0] === "tsc") {
600
+ const args = [
601
+ getTypeScriptPackageInfo(getTypeScriptContext$1(remoteOptions)).tscBinPath,
602
+ ...resolvedCompilerArgs.slice(1),
603
+ "--project",
604
+ tempTsConfigJsonPath
605
+ ];
606
+ return {
607
+ executable: process.execPath,
608
+ args,
609
+ displayCommand: formatCommandForDisplay(process.execPath, args),
610
+ shell: false
611
+ };
612
+ }
613
+ const executable = resolvePackageManagerExecutable();
614
+ const args = [
615
+ ...resolvedCompilerArgs,
616
+ "--project",
617
+ tempTsConfigJsonPath
618
+ ];
619
+ return {
620
+ executable,
621
+ args,
622
+ displayCommand: formatCommandForDisplay(executable, args),
623
+ shell: process.platform === "win32"
624
+ };
625
+ };
549
626
  const compileTs = async (mapComponentsToExpose, tsConfig, remoteOptions) => {
550
627
  if (!Object.keys(mapComponentsToExpose).length) return;
551
628
  const { compilerOptions } = tsConfig;
@@ -559,24 +636,17 @@ const compileTs = async (mapComponentsToExpose, tsConfig, remoteOptions) => {
559
636
  exclude: typeof remoteOptions.extractThirdParty === "object" ? remoteOptions.extractThirdParty.exclude : void 0
560
637
  });
561
638
  const execPromise = util.promisify(execFile);
562
- const pmExecutable = resolvePackageManagerExecutable();
563
- const compilerArgs = splitCommandArgs(remoteOptions.compilerInstance);
564
- const cmdArgs = [
565
- ...compilerArgs.length > 0 ? compilerArgs : [remoteOptions.compilerInstance],
566
- "--project",
567
- tempTsConfigJsonPath
568
- ];
569
- const cmd = formatCommandForDisplay(pmExecutable, cmdArgs);
639
+ const compilerCommand = resolveCompilerCommand(remoteOptions, tempTsConfigJsonPath);
570
640
  try {
571
- await execPromise(pmExecutable, cmdArgs, {
572
- cwd: typeof remoteOptions.moduleFederationConfig.dts !== "boolean" ? remoteOptions.moduleFederationConfig.dts?.cwd ?? void 0 : void 0,
573
- shell: process.platform === "win32"
641
+ await execPromise(compilerCommand.executable, compilerCommand.args, {
642
+ cwd: getTypeScriptContext$1(remoteOptions),
643
+ shell: compilerCommand.shell
574
644
  });
575
645
  } catch (err) {
576
646
  if (compilerOptions.tsBuildInfoFile) try {
577
647
  await rm(compilerOptions.tsBuildInfoFile);
578
648
  } catch (e) {}
579
- logAndReport(TYPE_001, typeDescMap, { cmd }, (msg) => {
649
+ logAndReport(TYPE_001, typeDescMap, { cmd: compilerCommand.displayCommand }, (msg) => {
580
650
  throw new Error(msg);
581
651
  }, void 0);
582
652
  }
@@ -1234,16 +1304,158 @@ function getEffectiveRootDir(parsedCommandLine) {
1234
1304
  }
1235
1305
  throw new Error("Can not get effective rootDir, please set compilerOptions.rootDir !");
1236
1306
  }
1237
- const getDependentFiles = (rootFiles, configContent, rootDir) => {
1238
- const dependentFiles = typescript.createProgram(rootFiles, configContent.options).getSourceFiles().map((file) => file.fileName).filter((file) => !file.endsWith(".d.ts") && file.startsWith(rootDir + "/"));
1307
+ const getDependentFiles = (rootFiles, configContent, rootDir, typescript) => {
1308
+ const dependentFiles = typescript.createProgram(rootFiles, configContent.options).getSourceFiles().map((file) => file.fileName).filter((file) => !file.endsWith(".d.ts") && isFileWithinRootDir(file, rootDir)).map((file) => normalizeFileToRootDir(file, rootDir));
1239
1309
  return dependentFiles.length ? dependentFiles : rootFiles;
1240
1310
  };
1241
- const readTsConfig = ({ tsConfigPath, typesFolder, compiledTypesFolder, context, additionalFilesToCompile, outputDir }, mapComponentsToExpose) => {
1311
+ const normalizeForComparison = (value) => {
1312
+ try {
1313
+ return normalize(realpathSync.native(value));
1314
+ } catch {
1315
+ return normalize(value);
1316
+ }
1317
+ };
1318
+ const isFileWithinRootDir = (file, rootDir) => {
1319
+ const normalizedFile = normalizeForComparison(file);
1320
+ const normalizedRootDir = normalizeForComparison(rootDir);
1321
+ return normalizedFile === normalizedRootDir || normalizedFile.startsWith(normalizedRootDir.endsWith(sep) ? normalizedRootDir : `${normalizedRootDir}${sep}`);
1322
+ };
1323
+ const normalizeFileToRootDir = (file, rootDir) => {
1324
+ const normalizedFile = normalizeForComparison(file);
1325
+ const normalizedRootDir = normalizeForComparison(rootDir);
1326
+ if (normalizedFile === normalizedRootDir || normalizedFile.startsWith(normalizedRootDir.endsWith(sep) ? normalizedRootDir : `${normalizedRootDir}${sep}`)) return normalize(join(rootDir, relative(normalizedRootDir, normalizedFile)));
1327
+ return normalize(file);
1328
+ };
1329
+ const getTypeScriptContext = ({ context, moduleFederationConfig }) => {
1330
+ const dtsOptions = moduleFederationConfig.dts;
1331
+ return typeof dtsOptions !== "boolean" && dtsOptions?.cwd ? dtsOptions.cwd : context;
1332
+ };
1333
+ const resolveFromConfigDir = (value, configDir) => {
1334
+ if (typeof value !== "string") return value;
1335
+ return isAbsolute(value) ? normalize(value) : resolve(configDir, value);
1336
+ };
1337
+ const normalizeCompilerOptions = (compilerOptions = {}, configDir) => {
1338
+ const normalizedOptions = { ...compilerOptions };
1339
+ for (const pathOption of [
1340
+ "rootDir",
1341
+ "outDir",
1342
+ "declarationDir",
1343
+ "tsBuildInfoFile"
1344
+ ]) if (typeof normalizedOptions[pathOption] === "string") normalizedOptions[pathOption] = resolveFromConfigDir(normalizedOptions[pathOption], configDir);
1345
+ if (normalizedOptions["moduleResolution"] === "node" || normalizedOptions["moduleResolution"] === "node10") normalizedOptions["moduleResolution"] = "bundler";
1346
+ return normalizedOptions;
1347
+ };
1348
+ const parseShowConfigOutput = (stdout, resolvedTsConfigPath) => {
1349
+ const configDir = dirname(resolvedTsConfigPath);
1350
+ const shownConfig = JSON.parse(stdout);
1351
+ const compilerOptions = normalizeCompilerOptions(shownConfig.compilerOptions, configDir);
1352
+ const fileNames = (shownConfig.files || []).map((file) => resolveFromConfigDir(file, configDir));
1353
+ const projectReferences = (shownConfig.references || []).map((reference) => ({
1354
+ ...reference,
1355
+ path: resolveFromConfigDir(reference.path, configDir),
1356
+ originalPath: reference.path
1357
+ }));
1358
+ return {
1359
+ rawTsConfigJson: {
1360
+ ...shownConfig,
1361
+ compilerOptions
1362
+ },
1363
+ configContent: {
1364
+ options: compilerOptions,
1365
+ fileNames,
1366
+ projectReferences
1367
+ }
1368
+ };
1369
+ };
1370
+ const readTsConfigWithTsc = (resolvedTsConfigPath, typeScriptContext) => {
1371
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1372
+ return parseShowConfigOutput(execFileSync(process.execPath, [
1373
+ typeScriptPackageInfo.tscBinPath,
1374
+ "--showConfig",
1375
+ "--project",
1376
+ resolvedTsConfigPath
1377
+ ], {
1378
+ cwd: typeScriptContext,
1379
+ encoding: "utf8",
1380
+ stdio: [
1381
+ "ignore",
1382
+ "pipe",
1383
+ "pipe"
1384
+ ]
1385
+ }), resolvedTsConfigPath);
1386
+ };
1387
+ const writeListFilesTsConfig = (rootFiles, resolvedTsConfigPath, context, compilerOptions) => {
1388
+ const tempTsConfigJsonPath = resolve(context, "node_modules", TEMP_DIR, `tsconfig.list-files.${crypto.createHash("md5").update(`${JSON.stringify(rootFiles)}${resolvedTsConfigPath}${Date.now()}`).digest("hex")}.json`);
1389
+ mkdirSync(dirname(tempTsConfigJsonPath), { recursive: true });
1390
+ const listFilesConfig = compilerOptions ? {
1391
+ compilerOptions,
1392
+ files: rootFiles.map((file) => isAbsolute(file) ? file : resolve(context, file))
1393
+ } : {
1394
+ extends: resolvedTsConfigPath,
1395
+ files: rootFiles.map((file) => isAbsolute(file) ? file : resolve(context, file))
1396
+ };
1397
+ writeFileSync(tempTsConfigJsonPath, JSON.stringify(listFilesConfig, null, 2));
1398
+ return tempTsConfigJsonPath;
1399
+ };
1400
+ const formatCompilerError = (error) => {
1401
+ const readOutput = (value) => {
1402
+ if (Buffer.isBuffer(value)) return value.toString("utf8");
1403
+ return typeof value === "string" ? value : "";
1404
+ };
1405
+ if (typeof error === "object" && error !== null) {
1406
+ const processError = error;
1407
+ const stderr = readOutput(processError.stderr).trim();
1408
+ if (stderr) return stderr.split(/\r?\n/)[0];
1409
+ const stdout = readOutput(processError.stdout).trim();
1410
+ if (stdout) return stdout.split(/\r?\n/)[0];
1411
+ if (typeof processError.message === "string") return processError.message;
1412
+ }
1413
+ return String(error);
1414
+ };
1415
+ const getDependentFilesWithTsc = (rootFiles, rootDir, resolvedTsConfigPath, compilerOptions, context, typeScriptContext) => {
1416
+ if (!rootFiles.length) return [];
1417
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1418
+ const listFilesTsConfigPath = writeListFilesTsConfig(rootFiles, resolvedTsConfigPath, context, compilerOptions);
1419
+ try {
1420
+ const dependentFiles = execFileSync(process.execPath, [
1421
+ typeScriptPackageInfo.tscBinPath,
1422
+ "--listFilesOnly",
1423
+ "--project",
1424
+ listFilesTsConfigPath
1425
+ ], {
1426
+ cwd: typeScriptContext,
1427
+ encoding: "utf8",
1428
+ stdio: [
1429
+ "ignore",
1430
+ "pipe",
1431
+ "pipe"
1432
+ ]
1433
+ }).split(/\r?\n/).map((file) => file.trim()).filter(Boolean).map((file) => isAbsolute(file) ? file : resolve(context, file)).filter((file) => !file.endsWith(".d.ts") && isFileWithinRootDir(file, rootDir)).map((file) => normalizeFileToRootDir(file, rootDir));
1434
+ return dependentFiles.length ? dependentFiles : rootFiles;
1435
+ } catch (error) {
1436
+ logger$1.warn(`Failed to collect TypeScript dependency files with "tsc --listFilesOnly"; falling back to exposed files only. ${formatCompilerError(error)}`);
1437
+ return rootFiles;
1438
+ } finally {
1439
+ rmSync(listFilesTsConfigPath, { force: true });
1440
+ }
1441
+ };
1442
+ const readTsConfig = (remoteOptions, mapComponentsToExpose) => {
1443
+ const { tsConfigPath, typesFolder, compiledTypesFolder, context, additionalFilesToCompile, outputDir } = remoteOptions;
1242
1444
  const resolvedTsConfigPath = resolve(context, tsConfigPath);
1243
- const readResult = typescript.readConfigFile(resolvedTsConfigPath, typescript.sys.readFile);
1244
- if (readResult.error) throw new Error(readResult.error.messageText.toString());
1245
- const rawTsConfigJson = readResult.config;
1246
- const configContent = typescript.parseJsonConfigFileContent(rawTsConfigJson, typescript.sys, dirname(resolvedTsConfigPath));
1445
+ const typeScriptContext = getTypeScriptContext(remoteOptions);
1446
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1447
+ let rawTsConfigJson;
1448
+ let configContent;
1449
+ let typescript;
1450
+ if (typeScriptPackageInfo.majorVersion === 7) ({rawTsConfigJson, configContent} = readTsConfigWithTsc(resolvedTsConfigPath, typeScriptContext));
1451
+ else {
1452
+ typescript = requireTypeScript(typeScriptContext);
1453
+ const readResult = typescript.readConfigFile(resolvedTsConfigPath, typescript.sys.readFile);
1454
+ if (readResult.error) throw new Error(readResult.error.messageText.toString());
1455
+ rawTsConfigJson = readResult.config || {};
1456
+ configContent = typescript.parseJsonConfigFileContent(rawTsConfigJson, typescript.sys, dirname(resolvedTsConfigPath));
1457
+ configContent.projectReferences = configContent.projectReferences || [];
1458
+ }
1247
1459
  const rootDir = getEffectiveRootDir(configContent);
1248
1460
  const outDir = resolve(context, outputDir || configContent.options.outDir || "dist", typesFolder, compiledTypesFolder);
1249
1461
  const defaultCompilerOptions = {
@@ -1264,7 +1476,8 @@ const readTsConfig = ({ tsConfigPath, typesFolder, compiledTypesFolder, context,
1264
1476
  rawTsConfigJson.compilerOptions = restCompilerOptions;
1265
1477
  const outDirWithoutTypesFolder = resolve(context, outputDir || configContent.options.outDir || "dist");
1266
1478
  const excludeExtensions = [".mdx", ".md"];
1267
- const filesToCompile = [...getDependentFiles([...Object.values(mapComponentsToExpose), ...additionalFilesToCompile].filter((filename) => !excludeExtensions.some((ext) => filename.endsWith(ext))), configContent, rootDir), ...configContent.fileNames.filter((filename) => filename.endsWith(".d.ts") && !filename.startsWith(outDirWithoutTypesFolder))];
1479
+ const rootFiles = [...Object.values(mapComponentsToExpose), ...additionalFilesToCompile].filter((filename) => !excludeExtensions.some((ext) => filename.endsWith(ext)));
1480
+ const filesToCompile = [...typescript ? getDependentFiles(rootFiles, configContent, rootDir, typescript) : getDependentFilesWithTsc(rootFiles, rootDir, resolvedTsConfigPath, configContent.options, context, typeScriptContext), ...configContent.fileNames.filter((filename) => filename.endsWith(".d.ts") && !filename.startsWith(outDirWithoutTypesFolder))];
1268
1481
  rawTsConfigJson.include = [];
1269
1482
  rawTsConfigJson.files = [...new Set(filesToCompile)];
1270
1483
  rawTsConfigJson.exclude = [];
@@ -1,7 +1,7 @@
1
- import { _ as retrieveMfTypesPath, b as ModuleFederationDevServer, g as retrieveTypesZipPath, h as retrieveHostConfig, i as retrieveRemoteConfig, n as RpcGMCallTypes, o as getDTSManagerConstructor, t as exposeRpc, y as createHttpServer } from "./expose-rpc-CDdqA9PX.mjs";
1
+ import { _ as retrieveMfTypesPath, b as ModuleFederationDevServer, g as retrieveTypesZipPath, h as retrieveHostConfig, i as retrieveRemoteConfig, n as RpcGMCallTypes, o as getDTSManagerConstructor, t as exposeRpc, y as createHttpServer } from "./expose-rpc-B0rqtOKP.mjs";
2
2
  import { o as UpdateMode, r as DEFAULT_TAR_NAME } from "./Action-DNNg2YDh.mjs";
3
- import { n as UpdateKind, o as getIPV4, s as fileLog } from "./Broker-Cmbh_XVO.mjs";
4
- import "./consumeTypes-3S4eCiRK.mjs";
3
+ import { n as UpdateKind, o as getIPV4, s as fileLog } from "./Broker-BfFUcTHm.mjs";
4
+ import "./consumeTypes-WKYNaS9i.mjs";
5
5
  import "./core.mjs";
6
6
  import { t as getIpFromEntry } from "./utils-CkPvDGOy.mjs";
7
7
  import { decodeName } from "@module-federation/sdk";
@@ -1,5 +1,5 @@
1
- import { n as RpcGMCallTypes, r as generateTypes, t as exposeRpc } from "./expose-rpc-CDdqA9PX.mjs";
2
- import "./Broker-Cmbh_XVO.mjs";
1
+ import { n as RpcGMCallTypes, r as generateTypes, t as exposeRpc } from "./expose-rpc-B0rqtOKP.mjs";
2
+ import "./Broker-BfFUcTHm.mjs";
3
3
 
4
4
  //#region src/core/lib/forkGenerateDts.ts
5
5
  async function forkGenerateDts(options) {
@@ -1,7 +1,7 @@
1
- import { a as cloneDeepOptions, c as isTSProject, l as retrieveTypesAssetsInfo, n as RpcGMCallTypes, r as generateTypes, u as validateOptions } from "./expose-rpc-CDdqA9PX.mjs";
1
+ import { a as cloneDeepOptions, c as isTSProject, l as retrieveTypesAssetsInfo, n as RpcGMCallTypes, r as generateTypes, u as validateOptions } from "./expose-rpc-B0rqtOKP.mjs";
2
2
  import { s as WEB_CLIENT_OPTIONS_IDENTIFIER } from "./Action-DNNg2YDh.mjs";
3
- import { c as logger$1, o as getIPV4 } from "./Broker-Cmbh_XVO.mjs";
4
- import { a as createRpcWorker, n as generateTypesInChildProcess, t as consumeTypes } from "./consumeTypes-3S4eCiRK.mjs";
3
+ import { c as logger$1, o as getIPV4 } from "./Broker-BfFUcTHm.mjs";
4
+ import { a as createRpcWorker, n as generateTypesInChildProcess, t as consumeTypes } from "./consumeTypes-WKYNaS9i.mjs";
5
5
  import "./core.mjs";
6
6
  import fs from "fs";
7
7
  import { fileURLToPath } from "url";
@@ -1,4 +1,4 @@
1
- import { s as fileLog, t as Broker } from "./Broker-Cmbh_XVO.mjs";
1
+ import { s as fileLog, t as Broker } from "./Broker-BfFUcTHm.mjs";
2
2
 
3
3
  //#region src/server/broker/startBroker.ts
4
4
  let broker;
@@ -1,31 +1,30 @@
1
1
  const require_Action = require('./Action-CzhPMw2i.js');
2
- const require_Broker = require('./Broker-CaenCqdn.js');
2
+ const require_Broker = require('./Broker-C-uWF8l5.js');
3
3
  let fs = require("fs");
4
4
  fs = require_Action.__toESM(fs);
5
5
  let url = require("url");
6
6
  let path = require("path");
7
7
  path = require_Action.__toESM(path);
8
8
  let fs_promises = require("fs/promises");
9
+ let crypto = require("crypto");
10
+ crypto = require_Action.__toESM(crypto);
11
+ let child_process = require("child_process");
9
12
  let _module_federation_managers = require("@module-federation/managers");
10
- let typescript = require("typescript");
11
- typescript = require_Action.__toESM(typescript);
12
- let node_util = require("node:util");
13
13
  let _module_federation_sdk = require("@module-federation/sdk");
14
+ let node_util = require("node:util");
14
15
  let undici = require("undici");
15
16
  let _module_federation_third_party_dts_extractor = require("@module-federation/third-party-dts-extractor");
16
17
  let adm_zip = require("adm-zip");
17
18
  adm_zip = require_Action.__toESM(adm_zip);
18
- let crypto = require("crypto");
19
- crypto = require_Action.__toESM(crypto);
20
19
  let _module_federation_error_codes = require("@module-federation/error-codes");
21
20
  let _module_federation_error_codes_node = require("@module-federation/error-codes/node");
22
- let child_process = require("child_process");
23
21
  let util = require("util");
24
22
  util = require_Action.__toESM(util);
25
23
  let isomorphic_ws = require("isomorphic-ws");
26
24
  isomorphic_ws = require_Action.__toESM(isomorphic_ws);
27
25
  let http = require("http");
28
26
  http = require_Action.__toESM(http);
27
+ let module$1 = require("module");
29
28
  let process$1 = require("process");
30
29
  process$1 = require_Action.__toESM(process$1);
31
30
 
@@ -428,6 +427,49 @@ async function createHttpServer(options) {
428
427
  };
429
428
  }
430
429
 
430
+ //#endregion
431
+ //#region src/core/lib/typeScriptResolver.ts
432
+ const parseMajorVersion = (version) => {
433
+ const major = Number.parseInt(version.split(".")[0], 10);
434
+ return Number.isNaN(major) ? 0 : major;
435
+ };
436
+ const isMissingTypeScriptPackage = (error) => typeof error === "object" && error !== null && "code" in error && error.code === "MODULE_NOT_FOUND" && "message" in error && typeof error.message === "string" && error.message.includes("typescript/package.json");
437
+ const resolveTypeScriptPackage = (context = process.cwd()) => {
438
+ const candidateContexts = [...new Set([context, process.cwd()])];
439
+ let missingTypeScriptError;
440
+ for (const candidateContext of candidateContexts) {
441
+ const requireFromContext = (0, module$1.createRequire)((0, path.resolve)(candidateContext, "package.json"));
442
+ try {
443
+ return {
444
+ packageJsonPath: requireFromContext.resolve("typescript/package.json"),
445
+ packageJson: requireFromContext("typescript/package.json"),
446
+ requireFromContext
447
+ };
448
+ } catch (error) {
449
+ if (!isMissingTypeScriptPackage(error)) throw error;
450
+ missingTypeScriptError = error;
451
+ }
452
+ }
453
+ throw missingTypeScriptError;
454
+ };
455
+ const getTypeScriptPackageInfo = (context = process.cwd()) => {
456
+ const { packageJsonPath, packageJson } = resolveTypeScriptPackage(context);
457
+ const version = packageJson.version || "0.0.0";
458
+ const packageRoot = (0, path.dirname)(packageJsonPath);
459
+ const bin = typeof packageJson.bin === "string" ? packageJson.bin : packageJson.bin?.["tsc"] ?? "./bin/tsc";
460
+ return {
461
+ packageJsonPath,
462
+ packageRoot,
463
+ version,
464
+ majorVersion: parseMajorVersion(version),
465
+ tscBinPath: (0, path.resolve)(packageRoot, bin)
466
+ };
467
+ };
468
+ const requireTypeScript = (context = process.cwd()) => {
469
+ const { requireFromContext } = resolveTypeScriptPackage(context);
470
+ return requireFromContext("typescript");
471
+ };
472
+
431
473
  //#endregion
432
474
  //#region src/core/lib/typeScriptCompiler.ts
433
475
  const STARTS_WITH_SLASH = /^\//;
@@ -536,6 +578,40 @@ const formatCommandForDisplay = (executable, args) => {
536
578
  };
537
579
  return [executable, ...args].map(formatArg).join(" ");
538
580
  };
581
+ const getTypeScriptContext$1 = (remoteOptions) => {
582
+ const dtsOptions = remoteOptions.moduleFederationConfig.dts;
583
+ return typeof dtsOptions !== "boolean" && dtsOptions?.cwd ? dtsOptions.cwd : remoteOptions.context;
584
+ };
585
+ const resolveCompilerCommand = (remoteOptions, tempTsConfigJsonPath) => {
586
+ const compilerArgs = splitCommandArgs(remoteOptions.compilerInstance);
587
+ const resolvedCompilerArgs = compilerArgs.length > 0 ? compilerArgs : [remoteOptions.compilerInstance];
588
+ if (resolvedCompilerArgs[0] === "tsc") {
589
+ const args = [
590
+ getTypeScriptPackageInfo(getTypeScriptContext$1(remoteOptions)).tscBinPath,
591
+ ...resolvedCompilerArgs.slice(1),
592
+ "--project",
593
+ tempTsConfigJsonPath
594
+ ];
595
+ return {
596
+ executable: process.execPath,
597
+ args,
598
+ displayCommand: formatCommandForDisplay(process.execPath, args),
599
+ shell: false
600
+ };
601
+ }
602
+ const executable = resolvePackageManagerExecutable();
603
+ const args = [
604
+ ...resolvedCompilerArgs,
605
+ "--project",
606
+ tempTsConfigJsonPath
607
+ ];
608
+ return {
609
+ executable,
610
+ args,
611
+ displayCommand: formatCommandForDisplay(executable, args),
612
+ shell: process.platform === "win32"
613
+ };
614
+ };
539
615
  const compileTs = async (mapComponentsToExpose, tsConfig, remoteOptions) => {
540
616
  if (!Object.keys(mapComponentsToExpose).length) return;
541
617
  const { compilerOptions } = tsConfig;
@@ -549,24 +625,17 @@ const compileTs = async (mapComponentsToExpose, tsConfig, remoteOptions) => {
549
625
  exclude: typeof remoteOptions.extractThirdParty === "object" ? remoteOptions.extractThirdParty.exclude : void 0
550
626
  });
551
627
  const execPromise = util.default.promisify(child_process.execFile);
552
- const pmExecutable = resolvePackageManagerExecutable();
553
- const compilerArgs = splitCommandArgs(remoteOptions.compilerInstance);
554
- const cmdArgs = [
555
- ...compilerArgs.length > 0 ? compilerArgs : [remoteOptions.compilerInstance],
556
- "--project",
557
- tempTsConfigJsonPath
558
- ];
559
- const cmd = formatCommandForDisplay(pmExecutable, cmdArgs);
628
+ const compilerCommand = resolveCompilerCommand(remoteOptions, tempTsConfigJsonPath);
560
629
  try {
561
- await execPromise(pmExecutable, cmdArgs, {
562
- cwd: typeof remoteOptions.moduleFederationConfig.dts !== "boolean" ? remoteOptions.moduleFederationConfig.dts?.cwd ?? void 0 : void 0,
563
- shell: process.platform === "win32"
630
+ await execPromise(compilerCommand.executable, compilerCommand.args, {
631
+ cwd: getTypeScriptContext$1(remoteOptions),
632
+ shell: compilerCommand.shell
564
633
  });
565
634
  } catch (err) {
566
635
  if (compilerOptions.tsBuildInfoFile) try {
567
636
  await (0, fs_promises.rm)(compilerOptions.tsBuildInfoFile);
568
637
  } catch (e) {}
569
- (0, _module_federation_error_codes_node.logAndReport)(_module_federation_error_codes.TYPE_001, _module_federation_error_codes.typeDescMap, { cmd }, (msg) => {
638
+ (0, _module_federation_error_codes_node.logAndReport)(_module_federation_error_codes.TYPE_001, _module_federation_error_codes.typeDescMap, { cmd: compilerCommand.displayCommand }, (msg) => {
570
639
  throw new Error(msg);
571
640
  }, void 0);
572
641
  }
@@ -1224,16 +1293,158 @@ function getEffectiveRootDir(parsedCommandLine) {
1224
1293
  }
1225
1294
  throw new Error("Can not get effective rootDir, please set compilerOptions.rootDir !");
1226
1295
  }
1227
- const getDependentFiles = (rootFiles, configContent, rootDir) => {
1228
- const dependentFiles = typescript.default.createProgram(rootFiles, configContent.options).getSourceFiles().map((file) => file.fileName).filter((file) => !file.endsWith(".d.ts") && file.startsWith(rootDir + "/"));
1296
+ const getDependentFiles = (rootFiles, configContent, rootDir, typescript) => {
1297
+ const dependentFiles = typescript.createProgram(rootFiles, configContent.options).getSourceFiles().map((file) => file.fileName).filter((file) => !file.endsWith(".d.ts") && isFileWithinRootDir(file, rootDir)).map((file) => normalizeFileToRootDir(file, rootDir));
1229
1298
  return dependentFiles.length ? dependentFiles : rootFiles;
1230
1299
  };
1231
- const readTsConfig = ({ tsConfigPath, typesFolder, compiledTypesFolder, context, additionalFilesToCompile, outputDir }, mapComponentsToExpose) => {
1300
+ const normalizeForComparison = (value) => {
1301
+ try {
1302
+ return (0, path.normalize)(fs.realpathSync.native(value));
1303
+ } catch {
1304
+ return (0, path.normalize)(value);
1305
+ }
1306
+ };
1307
+ const isFileWithinRootDir = (file, rootDir) => {
1308
+ const normalizedFile = normalizeForComparison(file);
1309
+ const normalizedRootDir = normalizeForComparison(rootDir);
1310
+ return normalizedFile === normalizedRootDir || normalizedFile.startsWith(normalizedRootDir.endsWith(path.sep) ? normalizedRootDir : `${normalizedRootDir}${path.sep}`);
1311
+ };
1312
+ const normalizeFileToRootDir = (file, rootDir) => {
1313
+ const normalizedFile = normalizeForComparison(file);
1314
+ const normalizedRootDir = normalizeForComparison(rootDir);
1315
+ if (normalizedFile === normalizedRootDir || normalizedFile.startsWith(normalizedRootDir.endsWith(path.sep) ? normalizedRootDir : `${normalizedRootDir}${path.sep}`)) return (0, path.normalize)((0, path.join)(rootDir, (0, path.relative)(normalizedRootDir, normalizedFile)));
1316
+ return (0, path.normalize)(file);
1317
+ };
1318
+ const getTypeScriptContext = ({ context, moduleFederationConfig }) => {
1319
+ const dtsOptions = moduleFederationConfig.dts;
1320
+ return typeof dtsOptions !== "boolean" && dtsOptions?.cwd ? dtsOptions.cwd : context;
1321
+ };
1322
+ const resolveFromConfigDir = (value, configDir) => {
1323
+ if (typeof value !== "string") return value;
1324
+ return (0, path.isAbsolute)(value) ? (0, path.normalize)(value) : (0, path.resolve)(configDir, value);
1325
+ };
1326
+ const normalizeCompilerOptions = (compilerOptions = {}, configDir) => {
1327
+ const normalizedOptions = { ...compilerOptions };
1328
+ for (const pathOption of [
1329
+ "rootDir",
1330
+ "outDir",
1331
+ "declarationDir",
1332
+ "tsBuildInfoFile"
1333
+ ]) if (typeof normalizedOptions[pathOption] === "string") normalizedOptions[pathOption] = resolveFromConfigDir(normalizedOptions[pathOption], configDir);
1334
+ if (normalizedOptions["moduleResolution"] === "node" || normalizedOptions["moduleResolution"] === "node10") normalizedOptions["moduleResolution"] = "bundler";
1335
+ return normalizedOptions;
1336
+ };
1337
+ const parseShowConfigOutput = (stdout, resolvedTsConfigPath) => {
1338
+ const configDir = (0, path.dirname)(resolvedTsConfigPath);
1339
+ const shownConfig = JSON.parse(stdout);
1340
+ const compilerOptions = normalizeCompilerOptions(shownConfig.compilerOptions, configDir);
1341
+ const fileNames = (shownConfig.files || []).map((file) => resolveFromConfigDir(file, configDir));
1342
+ const projectReferences = (shownConfig.references || []).map((reference) => ({
1343
+ ...reference,
1344
+ path: resolveFromConfigDir(reference.path, configDir),
1345
+ originalPath: reference.path
1346
+ }));
1347
+ return {
1348
+ rawTsConfigJson: {
1349
+ ...shownConfig,
1350
+ compilerOptions
1351
+ },
1352
+ configContent: {
1353
+ options: compilerOptions,
1354
+ fileNames,
1355
+ projectReferences
1356
+ }
1357
+ };
1358
+ };
1359
+ const readTsConfigWithTsc = (resolvedTsConfigPath, typeScriptContext) => {
1360
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1361
+ return parseShowConfigOutput((0, child_process.execFileSync)(process.execPath, [
1362
+ typeScriptPackageInfo.tscBinPath,
1363
+ "--showConfig",
1364
+ "--project",
1365
+ resolvedTsConfigPath
1366
+ ], {
1367
+ cwd: typeScriptContext,
1368
+ encoding: "utf8",
1369
+ stdio: [
1370
+ "ignore",
1371
+ "pipe",
1372
+ "pipe"
1373
+ ]
1374
+ }), resolvedTsConfigPath);
1375
+ };
1376
+ const writeListFilesTsConfig = (rootFiles, resolvedTsConfigPath, context, compilerOptions) => {
1377
+ const tempTsConfigJsonPath = (0, path.resolve)(context, "node_modules", _module_federation_sdk.TEMP_DIR, `tsconfig.list-files.${crypto.default.createHash("md5").update(`${JSON.stringify(rootFiles)}${resolvedTsConfigPath}${Date.now()}`).digest("hex")}.json`);
1378
+ (0, fs.mkdirSync)((0, path.dirname)(tempTsConfigJsonPath), { recursive: true });
1379
+ const listFilesConfig = compilerOptions ? {
1380
+ compilerOptions,
1381
+ files: rootFiles.map((file) => (0, path.isAbsolute)(file) ? file : (0, path.resolve)(context, file))
1382
+ } : {
1383
+ extends: resolvedTsConfigPath,
1384
+ files: rootFiles.map((file) => (0, path.isAbsolute)(file) ? file : (0, path.resolve)(context, file))
1385
+ };
1386
+ (0, fs.writeFileSync)(tempTsConfigJsonPath, JSON.stringify(listFilesConfig, null, 2));
1387
+ return tempTsConfigJsonPath;
1388
+ };
1389
+ const formatCompilerError = (error) => {
1390
+ const readOutput = (value) => {
1391
+ if (Buffer.isBuffer(value)) return value.toString("utf8");
1392
+ return typeof value === "string" ? value : "";
1393
+ };
1394
+ if (typeof error === "object" && error !== null) {
1395
+ const processError = error;
1396
+ const stderr = readOutput(processError.stderr).trim();
1397
+ if (stderr) return stderr.split(/\r?\n/)[0];
1398
+ const stdout = readOutput(processError.stdout).trim();
1399
+ if (stdout) return stdout.split(/\r?\n/)[0];
1400
+ if (typeof processError.message === "string") return processError.message;
1401
+ }
1402
+ return String(error);
1403
+ };
1404
+ const getDependentFilesWithTsc = (rootFiles, rootDir, resolvedTsConfigPath, compilerOptions, context, typeScriptContext) => {
1405
+ if (!rootFiles.length) return [];
1406
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1407
+ const listFilesTsConfigPath = writeListFilesTsConfig(rootFiles, resolvedTsConfigPath, context, compilerOptions);
1408
+ try {
1409
+ const dependentFiles = (0, child_process.execFileSync)(process.execPath, [
1410
+ typeScriptPackageInfo.tscBinPath,
1411
+ "--listFilesOnly",
1412
+ "--project",
1413
+ listFilesTsConfigPath
1414
+ ], {
1415
+ cwd: typeScriptContext,
1416
+ encoding: "utf8",
1417
+ stdio: [
1418
+ "ignore",
1419
+ "pipe",
1420
+ "pipe"
1421
+ ]
1422
+ }).split(/\r?\n/).map((file) => file.trim()).filter(Boolean).map((file) => (0, path.isAbsolute)(file) ? file : (0, path.resolve)(context, file)).filter((file) => !file.endsWith(".d.ts") && isFileWithinRootDir(file, rootDir)).map((file) => normalizeFileToRootDir(file, rootDir));
1423
+ return dependentFiles.length ? dependentFiles : rootFiles;
1424
+ } catch (error) {
1425
+ require_Broker.logger.warn(`Failed to collect TypeScript dependency files with "tsc --listFilesOnly"; falling back to exposed files only. ${formatCompilerError(error)}`);
1426
+ return rootFiles;
1427
+ } finally {
1428
+ (0, fs.rmSync)(listFilesTsConfigPath, { force: true });
1429
+ }
1430
+ };
1431
+ const readTsConfig = (remoteOptions, mapComponentsToExpose) => {
1432
+ const { tsConfigPath, typesFolder, compiledTypesFolder, context, additionalFilesToCompile, outputDir } = remoteOptions;
1232
1433
  const resolvedTsConfigPath = (0, path.resolve)(context, tsConfigPath);
1233
- const readResult = typescript.default.readConfigFile(resolvedTsConfigPath, typescript.default.sys.readFile);
1234
- if (readResult.error) throw new Error(readResult.error.messageText.toString());
1235
- const rawTsConfigJson = readResult.config;
1236
- const configContent = typescript.default.parseJsonConfigFileContent(rawTsConfigJson, typescript.default.sys, (0, path.dirname)(resolvedTsConfigPath));
1434
+ const typeScriptContext = getTypeScriptContext(remoteOptions);
1435
+ const typeScriptPackageInfo = getTypeScriptPackageInfo(typeScriptContext);
1436
+ let rawTsConfigJson;
1437
+ let configContent;
1438
+ let typescript;
1439
+ if (typeScriptPackageInfo.majorVersion === 7) ({rawTsConfigJson, configContent} = readTsConfigWithTsc(resolvedTsConfigPath, typeScriptContext));
1440
+ else {
1441
+ typescript = requireTypeScript(typeScriptContext);
1442
+ const readResult = typescript.readConfigFile(resolvedTsConfigPath, typescript.sys.readFile);
1443
+ if (readResult.error) throw new Error(readResult.error.messageText.toString());
1444
+ rawTsConfigJson = readResult.config || {};
1445
+ configContent = typescript.parseJsonConfigFileContent(rawTsConfigJson, typescript.sys, (0, path.dirname)(resolvedTsConfigPath));
1446
+ configContent.projectReferences = configContent.projectReferences || [];
1447
+ }
1237
1448
  const rootDir = getEffectiveRootDir(configContent);
1238
1449
  const outDir = (0, path.resolve)(context, outputDir || configContent.options.outDir || "dist", typesFolder, compiledTypesFolder);
1239
1450
  const defaultCompilerOptions = {
@@ -1254,7 +1465,8 @@ const readTsConfig = ({ tsConfigPath, typesFolder, compiledTypesFolder, context,
1254
1465
  rawTsConfigJson.compilerOptions = restCompilerOptions;
1255
1466
  const outDirWithoutTypesFolder = (0, path.resolve)(context, outputDir || configContent.options.outDir || "dist");
1256
1467
  const excludeExtensions = [".mdx", ".md"];
1257
- const filesToCompile = [...getDependentFiles([...Object.values(mapComponentsToExpose), ...additionalFilesToCompile].filter((filename) => !excludeExtensions.some((ext) => filename.endsWith(ext))), configContent, rootDir), ...configContent.fileNames.filter((filename) => filename.endsWith(".d.ts") && !filename.startsWith(outDirWithoutTypesFolder))];
1468
+ const rootFiles = [...Object.values(mapComponentsToExpose), ...additionalFilesToCompile].filter((filename) => !excludeExtensions.some((ext) => filename.endsWith(ext)));
1469
+ const filesToCompile = [...typescript ? getDependentFiles(rootFiles, configContent, rootDir, typescript) : getDependentFilesWithTsc(rootFiles, rootDir, resolvedTsConfigPath, configContent.options, context, typeScriptContext), ...configContent.fileNames.filter((filename) => filename.endsWith(".d.ts") && !filename.startsWith(outDirWithoutTypesFolder))];
1258
1470
  rawTsConfigJson.include = [];
1259
1471
  rawTsConfigJson.files = [...new Set(filesToCompile)];
1260
1472
  rawTsConfigJson.exclude = [];
@@ -1,4 +1,4 @@
1
- import { a as DTSManagerOptions } from "./DtsWorker-Bt7-_SGH.js";
1
+ import { a as DTSManagerOptions } from "./DtsWorker-SBLpkK-D.js";
2
2
 
3
3
  //#region src/dev-worker/DevWorker.d.ts
4
4
  interface DevWorkerOptions extends DTSManagerOptions {
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_Action = require('./Action-CzhPMw2i.js');
3
- const require_Broker = require('./Broker-CaenCqdn.js');
4
- const require_expose_rpc = require('./expose-rpc-BpRiu3VK.js');
5
- require('./consumeTypes-Dle9g2SZ.js');
3
+ const require_Broker = require('./Broker-C-uWF8l5.js');
4
+ const require_expose_rpc = require('./expose-rpc-jaGpsAVL.js');
5
+ require('./consumeTypes-DhrUgkUW.js');
6
6
  require('./core.js');
7
7
  const require_utils = require('./utils-7KqCZHbb.js');
8
8
  let _module_federation_sdk = require("@module-federation/sdk");
@@ -1,4 +1,4 @@
1
- import { n as DtsWorkerOptions } from "./DtsWorker-Bt7-_SGH.js";
1
+ import { n as DtsWorkerOptions } from "./DtsWorker-SBLpkK-D.js";
2
2
 
3
3
  //#region src/core/lib/forkGenerateDts.d.ts
4
4
  declare function forkGenerateDts(options: DtsWorkerOptions): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- require('./Broker-CaenCqdn.js');
3
- const require_expose_rpc = require('./expose-rpc-BpRiu3VK.js');
2
+ require('./Broker-C-uWF8l5.js');
3
+ const require_expose_rpc = require('./expose-rpc-jaGpsAVL.js');
4
4
 
5
5
  //#region src/core/lib/forkGenerateDts.ts
6
6
  async function forkGenerateDts(options) {
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { a as DTSManagerOptions } from "./DtsWorker-Bt7-_SGH.js";
2
- import { d as isTSProject } from "./constant-YOdZl7sj.js";
1
+ import { a as DTSManagerOptions } from "./DtsWorker-SBLpkK-D.js";
2
+ import { d as isTSProject } from "./constant-C0QI9ddQ.js";
3
3
  import { moduleFederationPlugin } from "@module-federation/sdk";
4
4
 
5
5
  //#region src/plugins/DtsPlugin.d.ts
6
6
  declare const normalizeDtsOptions: (options: moduleFederationPlugin.ModuleFederationPluginOptions, context: string, defaultOptions?: {
7
7
  defaultGenerateOptions?: moduleFederationPlugin.DtsRemoteOptions;
8
8
  defaultConsumeOptions?: moduleFederationPlugin.DtsHostOptions;
9
- }) => false | moduleFederationPlugin.PluginDtsOptions;
9
+ }) => any;
10
10
  declare class DtsPlugin implements WebpackPluginInstance {
11
11
  options: moduleFederationPlugin.ModuleFederationPluginOptions;
12
12
  clonedOptions: moduleFederationPlugin.ModuleFederationPluginOptions;
@@ -25,26 +25,11 @@ declare const normalizeConsumeTypesOptions: ({
25
25
  dtsOptions: moduleFederationPlugin.PluginDtsOptions;
26
26
  pluginOptions: moduleFederationPlugin.ModuleFederationPluginOptions;
27
27
  }) => {
28
- host: {
29
- typesFolder?: string;
30
- abortOnError?: boolean;
31
- remoteTypesFolder?: string;
32
- deleteTypesFolder?: boolean;
33
- maxRetries?: number;
34
- consumeAPITypes?: boolean;
35
- runtimePkgs?: string[];
36
- remoteTypeUrls?: (() => Promise<moduleFederationPlugin.RemoteTypeUrls>) | moduleFederationPlugin.RemoteTypeUrls;
37
- timeout?: number;
38
- family?: 0 | 4 | 6;
39
- typesOnBuild?: boolean;
40
- implementation: string | undefined;
41
- context: string | undefined;
42
- moduleFederationConfig: moduleFederationPlugin.ModuleFederationPluginOptions;
43
- };
44
- extraOptions: Record<string, any>;
45
- displayErrorInTerminal: boolean | undefined;
28
+ host: any;
29
+ extraOptions: any;
30
+ displayErrorInTerminal: any;
46
31
  } | undefined;
47
- declare const consumeTypesAPI: (dtsManagerOptions: DTSManagerOptions, cb?: (options: moduleFederationPlugin.RemoteTypeUrls) => void) => Promise<void>;
32
+ declare const consumeTypesAPI: (dtsManagerOptions: DTSManagerOptions, cb?: (options: moduleFederationPlugin.RemoteTypeUrls) => void) => Promise<any>;
48
33
  //#endregion
49
34
  //#region src/plugins/GenerateTypesPlugin.d.ts
50
35
  declare const normalizeGenerateTypesOptions: ({
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_Action = require('./Action-CzhPMw2i.js');
3
- const require_Broker = require('./Broker-CaenCqdn.js');
4
- const require_expose_rpc = require('./expose-rpc-BpRiu3VK.js');
5
- const require_consumeTypes = require('./consumeTypes-Dle9g2SZ.js');
3
+ const require_Broker = require('./Broker-C-uWF8l5.js');
4
+ const require_expose_rpc = require('./expose-rpc-jaGpsAVL.js');
5
+ const require_consumeTypes = require('./consumeTypes-DhrUgkUW.js');
6
6
  require('./core.js');
7
7
  let fs = require("fs");
8
8
  fs = require_Action.__toESM(fs);
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_Broker = require('./Broker-CaenCqdn.js');
2
+ const require_Broker = require('./Broker-C-uWF8l5.js');
3
3
 
4
4
  //#region src/server/broker/startBroker.ts
5
5
  let broker;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/dts-plugin",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "author": "hanric <hanric.zhang@gmail.com>",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.mjs",
@@ -68,28 +68,27 @@
68
68
  "adm-zip": "0.5.10",
69
69
  "isomorphic-ws": "5.0.0",
70
70
  "undici": "7.28.0",
71
- "node-schedule": "2.1.1",
72
71
  "ws": "8.21.0",
73
- "@module-federation/error-codes": "2.7.0",
74
- "@module-federation/sdk": "2.7.0",
75
- "@module-federation/third-party-dts-extractor": "2.7.0",
76
- "@module-federation/managers": "2.7.0"
72
+ "@module-federation/error-codes": "2.8.0",
73
+ "@module-federation/managers": "2.8.0",
74
+ "@module-federation/third-party-dts-extractor": "2.8.0",
75
+ "@module-federation/sdk": "2.8.0"
77
76
  },
78
77
  "devDependencies": {
79
78
  "@rstest/core": "^0.10.6",
80
- "@types/node-schedule": "2.1.7",
81
79
  "@types/ws": "8.5.12",
82
80
  "@vue/tsconfig": "^0.7.0",
83
81
  "directory-tree": "3.5.2",
84
82
  "rimraf": "~6.0.1",
85
83
  "typescript": "6.0.3",
84
+ "typescript-7": "npm:typescript@7.0.2",
86
85
  "vue": "^3.5.13",
87
86
  "vue-tsc": "^2.2.10",
88
87
  "webpack": "^5.104.1",
89
- "@module-federation/runtime": "2.7.0"
88
+ "@module-federation/runtime": "2.8.0"
90
89
  },
91
90
  "peerDependencies": {
92
- "typescript": "^4.9.0 || ^5.0.0 || ^6.0.0",
91
+ "typescript": "^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
93
92
  "vue-tsc": ">=1.0.24"
94
93
  },
95
94
  "peerDependenciesMeta": {