@module-federation/sdk 2.0.0 → 2.1.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.
- package/dist/_virtual/_rolldown/runtime.cjs +19 -0
- package/dist/_virtual/_rolldown/runtime.js +18 -0
- package/dist/constant.cjs +70 -0
- package/dist/constant.cjs.map +1 -0
- package/dist/constant.d.ts +53 -0
- package/dist/constant.js +55 -0
- package/dist/constant.js.map +1 -0
- package/dist/createModuleFederationConfig.cjs +9 -0
- package/dist/createModuleFederationConfig.cjs.map +1 -0
- package/dist/createModuleFederationConfig.d.ts +8 -0
- package/dist/createModuleFederationConfig.js +8 -0
- package/dist/createModuleFederationConfig.js.map +1 -0
- package/dist/dom.cjs +166 -0
- package/dist/dom.cjs.map +1 -0
- package/dist/dom.d.ts +35 -0
- package/dist/dom.js +162 -0
- package/dist/dom.js.map +1 -0
- package/dist/env.cjs +32 -0
- package/dist/env.cjs.map +1 -0
- package/dist/{src/env.d.ts → env.d.ts} +5 -2
- package/dist/env.js +29 -0
- package/dist/env.js.map +1 -0
- package/dist/generateSnapshotFromManifest.cjs +138 -0
- package/dist/generateSnapshotFromManifest.cjs.map +1 -0
- package/dist/generateSnapshotFromManifest.d.ts +22 -0
- package/dist/generateSnapshotFromManifest.js +134 -0
- package/dist/generateSnapshotFromManifest.js.map +1 -0
- package/dist/index.cjs +89 -0
- package/dist/index.d.ts +20 -1
- package/dist/index.js +15 -0
- package/dist/logger.cjs +129 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/logger.d.ts +34 -0
- package/dist/logger.js +125 -0
- package/dist/logger.js.map +1 -0
- package/dist/node.cjs +122 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.ts +17 -0
- package/dist/node.js +120 -0
- package/dist/node.js.map +1 -0
- package/dist/normalize-webpack-path.cjs +28 -0
- package/dist/normalize-webpack-path.cjs.map +1 -0
- package/dist/normalize-webpack-path.d.ts +10 -1
- package/dist/normalize-webpack-path.js +26 -0
- package/dist/normalize-webpack-path.js.map +1 -0
- package/dist/normalizeOptions.cjs +19 -0
- package/dist/normalizeOptions.cjs.map +1 -0
- package/dist/normalizeOptions.d.ts +5 -0
- package/dist/normalizeOptions.js +18 -0
- package/dist/normalizeOptions.js.map +1 -0
- package/dist/types/common.d.ts +14 -0
- package/dist/types/hooks.d.ts +16 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/manifest.d.ts +34 -0
- package/dist/types/plugins/ContainerPlugin.cjs +13 -0
- package/dist/types/plugins/ContainerPlugin.cjs.map +1 -0
- package/dist/types/plugins/ContainerPlugin.d.ts +40 -0
- package/dist/types/plugins/ContainerPlugin.js +8 -0
- package/dist/types/plugins/ContainerPlugin.js.map +1 -0
- package/dist/types/plugins/ContainerReferencePlugin.cjs +13 -0
- package/dist/types/plugins/ContainerReferencePlugin.cjs.map +1 -0
- package/dist/types/plugins/ContainerReferencePlugin.d.ts +23 -0
- package/dist/types/plugins/ContainerReferencePlugin.js +8 -0
- package/dist/types/plugins/ContainerReferencePlugin.js.map +1 -0
- package/dist/types/plugins/ModuleFederationPlugin.cjs +13 -0
- package/dist/types/plugins/ModuleFederationPlugin.cjs.map +1 -0
- package/dist/types/plugins/ModuleFederationPlugin.d.ts +432 -0
- package/dist/types/plugins/ModuleFederationPlugin.js +8 -0
- package/dist/types/plugins/ModuleFederationPlugin.js.map +1 -0
- package/dist/types/plugins/SharePlugin.cjs +13 -0
- package/dist/types/plugins/SharePlugin.cjs.map +1 -0
- package/dist/types/plugins/SharePlugin.d.ts +29 -0
- package/dist/types/plugins/SharePlugin.js +8 -0
- package/dist/types/plugins/SharePlugin.js.map +1 -0
- package/dist/types/plugins/index.d.ts +4 -0
- package/dist/types/snapshot.d.ts +81 -0
- package/dist/types/stats.d.ts +101 -0
- package/dist/utils.cjs +127 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/{src/utils.d.ts → utils.d.ts} +9 -3
- package/dist/utils.js +116 -0
- package/dist/utils.js.map +1 -0
- package/package.json +10 -7
- package/dist/index.cjs.cjs +0 -1032
- package/dist/index.cjs.cjs.map +0 -1
- package/dist/index.cjs.d.ts +0 -1
- package/dist/index.esm.js +0 -978
- package/dist/index.esm.js.map +0 -1
- package/dist/normalize-webpack-path.cjs.cjs +0 -42
- package/dist/normalize-webpack-path.cjs.cjs.map +0 -1
- package/dist/normalize-webpack-path.cjs.d.ts +0 -1
- package/dist/normalize-webpack-path.esm.js +0 -39
- package/dist/normalize-webpack-path.esm.js.map +0 -1
- package/dist/src/constant.d.ts +0 -49
- package/dist/src/createModuleFederationConfig.d.ts +0 -2
- package/dist/src/dom.d.ts +0 -29
- package/dist/src/generateSnapshotFromManifest.d.ts +0 -15
- package/dist/src/index.d.ts +0 -11
- package/dist/src/logger.d.ts +0 -32
- package/dist/src/node.d.ts +0 -11
- package/dist/src/normalize-webpack-path.d.ts +0 -5
- package/dist/src/normalizeOptions.d.ts +0 -1
- package/dist/src/types/common.d.ts +0 -10
- package/dist/src/types/hooks.d.ts +0 -12
- package/dist/src/types/index.d.ts +0 -6
- package/dist/src/types/manifest.d.ts +0 -29
- package/dist/src/types/plugins/ContainerPlugin.d.ts +0 -32
- package/dist/src/types/plugins/ContainerReferencePlugin.d.ts +0 -15
- package/dist/src/types/plugins/ModuleFederationPlugin.d.ts +0 -425
- package/dist/src/types/plugins/SharePlugin.d.ts +0 -21
- package/dist/src/types/plugins/index.d.ts +0 -4
- package/dist/src/types/snapshot.d.ts +0 -77
- package/dist/src/types/stats.d.ts +0 -97
package/dist/logger.cjs
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
const require_env = require('./env.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/logger.ts
|
|
4
|
+
const PREFIX = "[ Module Federation ]";
|
|
5
|
+
const DEFAULT_DELEGATE = console;
|
|
6
|
+
const LOGGER_STACK_SKIP_TOKENS = [
|
|
7
|
+
"logger.ts",
|
|
8
|
+
"logger.js",
|
|
9
|
+
"captureStackTrace",
|
|
10
|
+
"Logger.emit",
|
|
11
|
+
"Logger.log",
|
|
12
|
+
"Logger.info",
|
|
13
|
+
"Logger.warn",
|
|
14
|
+
"Logger.error",
|
|
15
|
+
"Logger.debug"
|
|
16
|
+
];
|
|
17
|
+
function captureStackTrace() {
|
|
18
|
+
try {
|
|
19
|
+
const stack = (/* @__PURE__ */ new Error()).stack;
|
|
20
|
+
if (!stack) return;
|
|
21
|
+
const [, ...rawLines] = stack.split("\n");
|
|
22
|
+
const filtered = rawLines.filter((line) => !LOGGER_STACK_SKIP_TOKENS.some((token) => line.includes(token)));
|
|
23
|
+
if (!filtered.length) return;
|
|
24
|
+
return `Stack trace:\n${filtered.slice(0, 5).join("\n")}`;
|
|
25
|
+
} catch {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
var Logger = class {
|
|
30
|
+
constructor(prefix, delegate = DEFAULT_DELEGATE) {
|
|
31
|
+
this.prefix = prefix;
|
|
32
|
+
this.delegate = delegate ?? DEFAULT_DELEGATE;
|
|
33
|
+
}
|
|
34
|
+
setPrefix(prefix) {
|
|
35
|
+
this.prefix = prefix;
|
|
36
|
+
}
|
|
37
|
+
setDelegate(delegate) {
|
|
38
|
+
this.delegate = delegate ?? DEFAULT_DELEGATE;
|
|
39
|
+
}
|
|
40
|
+
emit(method, args) {
|
|
41
|
+
const delegate = this.delegate;
|
|
42
|
+
const stackTrace = require_env.isDebugMode() ? captureStackTrace() : void 0;
|
|
43
|
+
const enrichedArgs = stackTrace ? [...args, stackTrace] : args;
|
|
44
|
+
const order = (() => {
|
|
45
|
+
switch (method) {
|
|
46
|
+
case "log": return ["log", "info"];
|
|
47
|
+
case "info": return ["info", "log"];
|
|
48
|
+
case "warn": return [
|
|
49
|
+
"warn",
|
|
50
|
+
"info",
|
|
51
|
+
"log"
|
|
52
|
+
];
|
|
53
|
+
case "error": return [
|
|
54
|
+
"error",
|
|
55
|
+
"warn",
|
|
56
|
+
"log"
|
|
57
|
+
];
|
|
58
|
+
default: return ["debug", "log"];
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
for (const candidate of order) {
|
|
62
|
+
const handler = delegate[candidate];
|
|
63
|
+
if (typeof handler === "function") {
|
|
64
|
+
handler.call(delegate, this.prefix, ...enrichedArgs);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const candidate of order) {
|
|
69
|
+
const handler = DEFAULT_DELEGATE[candidate];
|
|
70
|
+
if (typeof handler === "function") {
|
|
71
|
+
handler.call(DEFAULT_DELEGATE, this.prefix, ...enrichedArgs);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
log(...args) {
|
|
77
|
+
this.emit("log", args);
|
|
78
|
+
}
|
|
79
|
+
warn(...args) {
|
|
80
|
+
this.emit("warn", args);
|
|
81
|
+
}
|
|
82
|
+
error(...args) {
|
|
83
|
+
this.emit("error", args);
|
|
84
|
+
}
|
|
85
|
+
success(...args) {
|
|
86
|
+
this.emit("info", args);
|
|
87
|
+
}
|
|
88
|
+
info(...args) {
|
|
89
|
+
this.emit("info", args);
|
|
90
|
+
}
|
|
91
|
+
ready(...args) {
|
|
92
|
+
this.emit("info", args);
|
|
93
|
+
}
|
|
94
|
+
debug(...args) {
|
|
95
|
+
if (require_env.isDebugMode()) this.emit("debug", args);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
function createLogger(prefix) {
|
|
99
|
+
return new Logger(prefix);
|
|
100
|
+
}
|
|
101
|
+
function createInfrastructureLogger(prefix) {
|
|
102
|
+
const infrastructureLogger = new Logger(prefix);
|
|
103
|
+
Object.defineProperty(infrastructureLogger, "__mf_infrastructure_logger__", {
|
|
104
|
+
value: true,
|
|
105
|
+
enumerable: false,
|
|
106
|
+
configurable: false
|
|
107
|
+
});
|
|
108
|
+
return infrastructureLogger;
|
|
109
|
+
}
|
|
110
|
+
function bindLoggerToCompiler(loggerInstance, compiler, name) {
|
|
111
|
+
if (!loggerInstance.__mf_infrastructure_logger__) return;
|
|
112
|
+
if (!compiler?.getInfrastructureLogger) return;
|
|
113
|
+
try {
|
|
114
|
+
const infrastructureLogger = compiler.getInfrastructureLogger(name);
|
|
115
|
+
if (infrastructureLogger && typeof infrastructureLogger === "object" && (typeof infrastructureLogger.log === "function" || typeof infrastructureLogger.info === "function" || typeof infrastructureLogger.warn === "function" || typeof infrastructureLogger.error === "function")) loggerInstance.setDelegate(infrastructureLogger);
|
|
116
|
+
} catch {
|
|
117
|
+
loggerInstance.setDelegate(void 0);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const logger = createLogger(PREFIX);
|
|
121
|
+
const infrastructureLogger = createInfrastructureLogger(PREFIX);
|
|
122
|
+
|
|
123
|
+
//#endregion
|
|
124
|
+
exports.bindLoggerToCompiler = bindLoggerToCompiler;
|
|
125
|
+
exports.createInfrastructureLogger = createInfrastructureLogger;
|
|
126
|
+
exports.createLogger = createLogger;
|
|
127
|
+
exports.infrastructureLogger = infrastructureLogger;
|
|
128
|
+
exports.logger = logger;
|
|
129
|
+
//# sourceMappingURL=logger.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.cjs","names":["isDebugMode"],"sources":["../src/logger.ts"],"sourcesContent":["import { isDebugMode } from './env';\n\nconst PREFIX = '[ Module Federation ]';\n\ntype LogMethod = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\ntype LoggerDelegate = Partial<Record<LogMethod, (...args: any[]) => void>> & {\n [key: string]: ((...args: any[]) => void) | undefined;\n};\n\nconst DEFAULT_DELEGATE: LoggerDelegate = console as unknown as LoggerDelegate;\nconst LOGGER_STACK_SKIP_TOKENS = [\n 'logger.ts',\n 'logger.js',\n 'captureStackTrace',\n 'Logger.emit',\n 'Logger.log',\n 'Logger.info',\n 'Logger.warn',\n 'Logger.error',\n 'Logger.debug',\n];\n\nfunction captureStackTrace(): string | undefined {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return undefined;\n }\n\n const [, ...rawLines] = stack.split('\\n');\n const filtered = rawLines.filter(\n (line) => !LOGGER_STACK_SKIP_TOKENS.some((token) => line.includes(token)),\n );\n\n if (!filtered.length) {\n return undefined;\n }\n\n const stackPreview = filtered.slice(0, 5).join('\\n');\n return `Stack trace:\\n${stackPreview}`;\n } catch {\n return undefined;\n }\n}\n\nclass Logger {\n prefix: string;\n private delegate: LoggerDelegate;\n\n constructor(prefix: string, delegate: LoggerDelegate = DEFAULT_DELEGATE) {\n this.prefix = prefix;\n this.delegate = delegate ?? DEFAULT_DELEGATE;\n }\n\n setPrefix(prefix: string) {\n this.prefix = prefix;\n }\n\n setDelegate(delegate?: LoggerDelegate) {\n this.delegate = delegate ?? DEFAULT_DELEGATE;\n }\n\n private emit(method: LogMethod, args: any[]) {\n const delegate = this.delegate;\n const debugMode = isDebugMode();\n const stackTrace = debugMode ? captureStackTrace() : undefined;\n const enrichedArgs = stackTrace ? [...args, stackTrace] : args;\n\n const order: LogMethod[] = (() => {\n switch (method) {\n case 'log':\n return ['log', 'info'];\n case 'info':\n return ['info', 'log'];\n case 'warn':\n return ['warn', 'info', 'log'];\n case 'error':\n return ['error', 'warn', 'log'];\n case 'debug':\n default:\n return ['debug', 'log'];\n }\n })();\n\n for (const candidate of order) {\n const handler = delegate[candidate];\n if (typeof handler === 'function') {\n handler.call(delegate, this.prefix, ...enrichedArgs);\n return;\n }\n }\n\n for (const candidate of order) {\n const handler = DEFAULT_DELEGATE[candidate];\n if (typeof handler === 'function') {\n handler.call(DEFAULT_DELEGATE, this.prefix, ...enrichedArgs);\n return;\n }\n }\n }\n\n log(...args: any[]) {\n this.emit('log', args);\n }\n warn(...args: any[]) {\n this.emit('warn', args);\n }\n error(...args: any[]) {\n this.emit('error', args);\n }\n\n success(...args: any[]) {\n this.emit('info', args);\n }\n info(...args: any[]) {\n this.emit('info', args);\n }\n ready(...args: any[]) {\n this.emit('info', args);\n }\n\n debug(...args: any[]) {\n if (isDebugMode()) {\n this.emit('debug', args);\n }\n }\n}\n\nfunction createLogger(prefix: string) {\n return new Logger(prefix);\n}\n\ntype InfrastructureLogger = Logger & {\n __mf_infrastructure_logger__: true;\n};\n\nfunction createInfrastructureLogger(prefix: string): InfrastructureLogger {\n const infrastructureLogger = new Logger(prefix) as InfrastructureLogger;\n Object.defineProperty(infrastructureLogger, '__mf_infrastructure_logger__', {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return infrastructureLogger;\n}\n\ntype InfrastructureLoggerCapableCompiler = {\n getInfrastructureLogger?: (name: string) => unknown;\n};\n\nfunction bindLoggerToCompiler(\n loggerInstance: Logger,\n compiler: InfrastructureLoggerCapableCompiler,\n name: string,\n) {\n if (\n !(loggerInstance as Partial<InfrastructureLogger>)\n .__mf_infrastructure_logger__\n ) {\n return;\n }\n if (!compiler?.getInfrastructureLogger) {\n return;\n }\n try {\n const infrastructureLogger = compiler.getInfrastructureLogger(name);\n if (\n infrastructureLogger &&\n typeof infrastructureLogger === 'object' &&\n (typeof (infrastructureLogger as LoggerDelegate).log === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).info === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).warn === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).error === 'function')\n ) {\n loggerInstance.setDelegate(\n infrastructureLogger as unknown as LoggerDelegate,\n );\n }\n } catch {\n // If the bundler throws (older versions), fall back to default console logger.\n loggerInstance.setDelegate(undefined);\n }\n}\n\nconst logger = createLogger(PREFIX);\nconst infrastructureLogger = createInfrastructureLogger(PREFIX);\n\nexport {\n logger,\n infrastructureLogger,\n createLogger,\n createInfrastructureLogger,\n bindLoggerToCompiler,\n};\nexport type { Logger, InfrastructureLogger };\n"],"mappings":";;;AAEA,MAAM,SAAS;AAQf,MAAM,mBAAmC;AACzC,MAAM,2BAA2B;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAwC;AAC/C,KAAI;EACF,MAAM,yBAAQ,IAAI,OAAO,EAAC;AAC1B,MAAI,CAAC,MACH;EAGF,MAAM,GAAG,GAAG,YAAY,MAAM,MAAM,KAAK;EACzC,MAAM,WAAW,SAAS,QACvB,SAAS,CAAC,yBAAyB,MAAM,UAAU,KAAK,SAAS,MAAM,CAAC,CAC1E;AAED,MAAI,CAAC,SAAS,OACZ;AAIF,SAAO,iBADc,SAAS,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK;SAE9C;AACN;;;AAIJ,IAAM,SAAN,MAAa;CAIX,YAAY,QAAgB,WAA2B,kBAAkB;AACvE,OAAK,SAAS;AACd,OAAK,WAAW,YAAY;;CAG9B,UAAU,QAAgB;AACxB,OAAK,SAAS;;CAGhB,YAAY,UAA2B;AACrC,OAAK,WAAW,YAAY;;CAG9B,AAAQ,KAAK,QAAmB,MAAa;EAC3C,MAAM,WAAW,KAAK;EAEtB,MAAM,aADYA,yBAAa,GACA,mBAAmB,GAAG;EACrD,MAAM,eAAe,aAAa,CAAC,GAAG,MAAM,WAAW,GAAG;EAE1D,MAAM,eAA4B;AAChC,WAAQ,QAAR;IACE,KAAK,MACH,QAAO,CAAC,OAAO,OAAO;IACxB,KAAK,OACH,QAAO,CAAC,QAAQ,MAAM;IACxB,KAAK,OACH,QAAO;KAAC;KAAQ;KAAQ;KAAM;IAChC,KAAK,QACH,QAAO;KAAC;KAAS;KAAQ;KAAM;IAEjC,QACE,QAAO,CAAC,SAAS,MAAM;;MAEzB;AAEJ,OAAK,MAAM,aAAa,OAAO;GAC7B,MAAM,UAAU,SAAS;AACzB,OAAI,OAAO,YAAY,YAAY;AACjC,YAAQ,KAAK,UAAU,KAAK,QAAQ,GAAG,aAAa;AACpD;;;AAIJ,OAAK,MAAM,aAAa,OAAO;GAC7B,MAAM,UAAU,iBAAiB;AACjC,OAAI,OAAO,YAAY,YAAY;AACjC,YAAQ,KAAK,kBAAkB,KAAK,QAAQ,GAAG,aAAa;AAC5D;;;;CAKN,IAAI,GAAG,MAAa;AAClB,OAAK,KAAK,OAAO,KAAK;;CAExB,KAAK,GAAG,MAAa;AACnB,OAAK,KAAK,QAAQ,KAAK;;CAEzB,MAAM,GAAG,MAAa;AACpB,OAAK,KAAK,SAAS,KAAK;;CAG1B,QAAQ,GAAG,MAAa;AACtB,OAAK,KAAK,QAAQ,KAAK;;CAEzB,KAAK,GAAG,MAAa;AACnB,OAAK,KAAK,QAAQ,KAAK;;CAEzB,MAAM,GAAG,MAAa;AACpB,OAAK,KAAK,QAAQ,KAAK;;CAGzB,MAAM,GAAG,MAAa;AACpB,MAAIA,yBAAa,CACf,MAAK,KAAK,SAAS,KAAK;;;AAK9B,SAAS,aAAa,QAAgB;AACpC,QAAO,IAAI,OAAO,OAAO;;AAO3B,SAAS,2BAA2B,QAAsC;CACxE,MAAM,uBAAuB,IAAI,OAAO,OAAO;AAC/C,QAAO,eAAe,sBAAsB,gCAAgC;EAC1E,OAAO;EACP,YAAY;EACZ,cAAc;EACf,CAAC;AACF,QAAO;;AAOT,SAAS,qBACP,gBACA,UACA,MACA;AACA,KACE,CAAE,eACC,6BAEH;AAEF,KAAI,CAAC,UAAU,wBACb;AAEF,KAAI;EACF,MAAM,uBAAuB,SAAS,wBAAwB,KAAK;AACnE,MACE,wBACA,OAAO,yBAAyB,aAC/B,OAAQ,qBAAwC,QAAQ,cACvD,OAAQ,qBAAwC,SAAS,cACzD,OAAQ,qBAAwC,SAAS,cACzD,OAAQ,qBAAwC,UAAU,YAE5D,gBAAe,YACb,qBACD;SAEG;AAEN,iBAAe,YAAY,OAAU;;;AAIzC,MAAM,SAAS,aAAa,OAAO;AACnC,MAAM,uBAAuB,2BAA2B,OAAO"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/logger.d.ts
|
|
2
|
+
type LogMethod = 'log' | 'info' | 'warn' | 'error' | 'debug';
|
|
3
|
+
type LoggerDelegate = Partial<Record<LogMethod, (...args: any[]) => void>> & {
|
|
4
|
+
[key: string]: ((...args: any[]) => void) | undefined;
|
|
5
|
+
};
|
|
6
|
+
declare class Logger {
|
|
7
|
+
prefix: string;
|
|
8
|
+
private delegate;
|
|
9
|
+
constructor(prefix: string, delegate?: LoggerDelegate);
|
|
10
|
+
setPrefix(prefix: string): void;
|
|
11
|
+
setDelegate(delegate?: LoggerDelegate): void;
|
|
12
|
+
private emit;
|
|
13
|
+
log(...args: any[]): void;
|
|
14
|
+
warn(...args: any[]): void;
|
|
15
|
+
error(...args: any[]): void;
|
|
16
|
+
success(...args: any[]): void;
|
|
17
|
+
info(...args: any[]): void;
|
|
18
|
+
ready(...args: any[]): void;
|
|
19
|
+
debug(...args: any[]): void;
|
|
20
|
+
}
|
|
21
|
+
declare function createLogger(prefix: string): Logger;
|
|
22
|
+
type InfrastructureLogger = Logger & {
|
|
23
|
+
__mf_infrastructure_logger__: true;
|
|
24
|
+
};
|
|
25
|
+
declare function createInfrastructureLogger(prefix: string): InfrastructureLogger;
|
|
26
|
+
type InfrastructureLoggerCapableCompiler = {
|
|
27
|
+
getInfrastructureLogger?: (name: string) => unknown;
|
|
28
|
+
};
|
|
29
|
+
declare function bindLoggerToCompiler(loggerInstance: Logger, compiler: InfrastructureLoggerCapableCompiler, name: string): void;
|
|
30
|
+
declare const logger: Logger;
|
|
31
|
+
declare const infrastructureLogger: InfrastructureLogger;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { type InfrastructureLogger, type Logger, bindLoggerToCompiler, createInfrastructureLogger, createLogger, infrastructureLogger, logger };
|
|
34
|
+
//# sourceMappingURL=logger.d.ts.map
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { isDebugMode } from "./env.js";
|
|
2
|
+
|
|
3
|
+
//#region src/logger.ts
|
|
4
|
+
const PREFIX = "[ Module Federation ]";
|
|
5
|
+
const DEFAULT_DELEGATE = console;
|
|
6
|
+
const LOGGER_STACK_SKIP_TOKENS = [
|
|
7
|
+
"logger.ts",
|
|
8
|
+
"logger.js",
|
|
9
|
+
"captureStackTrace",
|
|
10
|
+
"Logger.emit",
|
|
11
|
+
"Logger.log",
|
|
12
|
+
"Logger.info",
|
|
13
|
+
"Logger.warn",
|
|
14
|
+
"Logger.error",
|
|
15
|
+
"Logger.debug"
|
|
16
|
+
];
|
|
17
|
+
function captureStackTrace() {
|
|
18
|
+
try {
|
|
19
|
+
const stack = (/* @__PURE__ */ new Error()).stack;
|
|
20
|
+
if (!stack) return;
|
|
21
|
+
const [, ...rawLines] = stack.split("\n");
|
|
22
|
+
const filtered = rawLines.filter((line) => !LOGGER_STACK_SKIP_TOKENS.some((token) => line.includes(token)));
|
|
23
|
+
if (!filtered.length) return;
|
|
24
|
+
return `Stack trace:\n${filtered.slice(0, 5).join("\n")}`;
|
|
25
|
+
} catch {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
var Logger = class {
|
|
30
|
+
constructor(prefix, delegate = DEFAULT_DELEGATE) {
|
|
31
|
+
this.prefix = prefix;
|
|
32
|
+
this.delegate = delegate ?? DEFAULT_DELEGATE;
|
|
33
|
+
}
|
|
34
|
+
setPrefix(prefix) {
|
|
35
|
+
this.prefix = prefix;
|
|
36
|
+
}
|
|
37
|
+
setDelegate(delegate) {
|
|
38
|
+
this.delegate = delegate ?? DEFAULT_DELEGATE;
|
|
39
|
+
}
|
|
40
|
+
emit(method, args) {
|
|
41
|
+
const delegate = this.delegate;
|
|
42
|
+
const stackTrace = isDebugMode() ? captureStackTrace() : void 0;
|
|
43
|
+
const enrichedArgs = stackTrace ? [...args, stackTrace] : args;
|
|
44
|
+
const order = (() => {
|
|
45
|
+
switch (method) {
|
|
46
|
+
case "log": return ["log", "info"];
|
|
47
|
+
case "info": return ["info", "log"];
|
|
48
|
+
case "warn": return [
|
|
49
|
+
"warn",
|
|
50
|
+
"info",
|
|
51
|
+
"log"
|
|
52
|
+
];
|
|
53
|
+
case "error": return [
|
|
54
|
+
"error",
|
|
55
|
+
"warn",
|
|
56
|
+
"log"
|
|
57
|
+
];
|
|
58
|
+
default: return ["debug", "log"];
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
for (const candidate of order) {
|
|
62
|
+
const handler = delegate[candidate];
|
|
63
|
+
if (typeof handler === "function") {
|
|
64
|
+
handler.call(delegate, this.prefix, ...enrichedArgs);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const candidate of order) {
|
|
69
|
+
const handler = DEFAULT_DELEGATE[candidate];
|
|
70
|
+
if (typeof handler === "function") {
|
|
71
|
+
handler.call(DEFAULT_DELEGATE, this.prefix, ...enrichedArgs);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
log(...args) {
|
|
77
|
+
this.emit("log", args);
|
|
78
|
+
}
|
|
79
|
+
warn(...args) {
|
|
80
|
+
this.emit("warn", args);
|
|
81
|
+
}
|
|
82
|
+
error(...args) {
|
|
83
|
+
this.emit("error", args);
|
|
84
|
+
}
|
|
85
|
+
success(...args) {
|
|
86
|
+
this.emit("info", args);
|
|
87
|
+
}
|
|
88
|
+
info(...args) {
|
|
89
|
+
this.emit("info", args);
|
|
90
|
+
}
|
|
91
|
+
ready(...args) {
|
|
92
|
+
this.emit("info", args);
|
|
93
|
+
}
|
|
94
|
+
debug(...args) {
|
|
95
|
+
if (isDebugMode()) this.emit("debug", args);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
function createLogger(prefix) {
|
|
99
|
+
return new Logger(prefix);
|
|
100
|
+
}
|
|
101
|
+
function createInfrastructureLogger(prefix) {
|
|
102
|
+
const infrastructureLogger = new Logger(prefix);
|
|
103
|
+
Object.defineProperty(infrastructureLogger, "__mf_infrastructure_logger__", {
|
|
104
|
+
value: true,
|
|
105
|
+
enumerable: false,
|
|
106
|
+
configurable: false
|
|
107
|
+
});
|
|
108
|
+
return infrastructureLogger;
|
|
109
|
+
}
|
|
110
|
+
function bindLoggerToCompiler(loggerInstance, compiler, name) {
|
|
111
|
+
if (!loggerInstance.__mf_infrastructure_logger__) return;
|
|
112
|
+
if (!compiler?.getInfrastructureLogger) return;
|
|
113
|
+
try {
|
|
114
|
+
const infrastructureLogger = compiler.getInfrastructureLogger(name);
|
|
115
|
+
if (infrastructureLogger && typeof infrastructureLogger === "object" && (typeof infrastructureLogger.log === "function" || typeof infrastructureLogger.info === "function" || typeof infrastructureLogger.warn === "function" || typeof infrastructureLogger.error === "function")) loggerInstance.setDelegate(infrastructureLogger);
|
|
116
|
+
} catch {
|
|
117
|
+
loggerInstance.setDelegate(void 0);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const logger = createLogger(PREFIX);
|
|
121
|
+
const infrastructureLogger = createInfrastructureLogger(PREFIX);
|
|
122
|
+
|
|
123
|
+
//#endregion
|
|
124
|
+
export { bindLoggerToCompiler, createInfrastructureLogger, createLogger, infrastructureLogger, logger };
|
|
125
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import { isDebugMode } from './env';\n\nconst PREFIX = '[ Module Federation ]';\n\ntype LogMethod = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\ntype LoggerDelegate = Partial<Record<LogMethod, (...args: any[]) => void>> & {\n [key: string]: ((...args: any[]) => void) | undefined;\n};\n\nconst DEFAULT_DELEGATE: LoggerDelegate = console as unknown as LoggerDelegate;\nconst LOGGER_STACK_SKIP_TOKENS = [\n 'logger.ts',\n 'logger.js',\n 'captureStackTrace',\n 'Logger.emit',\n 'Logger.log',\n 'Logger.info',\n 'Logger.warn',\n 'Logger.error',\n 'Logger.debug',\n];\n\nfunction captureStackTrace(): string | undefined {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return undefined;\n }\n\n const [, ...rawLines] = stack.split('\\n');\n const filtered = rawLines.filter(\n (line) => !LOGGER_STACK_SKIP_TOKENS.some((token) => line.includes(token)),\n );\n\n if (!filtered.length) {\n return undefined;\n }\n\n const stackPreview = filtered.slice(0, 5).join('\\n');\n return `Stack trace:\\n${stackPreview}`;\n } catch {\n return undefined;\n }\n}\n\nclass Logger {\n prefix: string;\n private delegate: LoggerDelegate;\n\n constructor(prefix: string, delegate: LoggerDelegate = DEFAULT_DELEGATE) {\n this.prefix = prefix;\n this.delegate = delegate ?? DEFAULT_DELEGATE;\n }\n\n setPrefix(prefix: string) {\n this.prefix = prefix;\n }\n\n setDelegate(delegate?: LoggerDelegate) {\n this.delegate = delegate ?? DEFAULT_DELEGATE;\n }\n\n private emit(method: LogMethod, args: any[]) {\n const delegate = this.delegate;\n const debugMode = isDebugMode();\n const stackTrace = debugMode ? captureStackTrace() : undefined;\n const enrichedArgs = stackTrace ? [...args, stackTrace] : args;\n\n const order: LogMethod[] = (() => {\n switch (method) {\n case 'log':\n return ['log', 'info'];\n case 'info':\n return ['info', 'log'];\n case 'warn':\n return ['warn', 'info', 'log'];\n case 'error':\n return ['error', 'warn', 'log'];\n case 'debug':\n default:\n return ['debug', 'log'];\n }\n })();\n\n for (const candidate of order) {\n const handler = delegate[candidate];\n if (typeof handler === 'function') {\n handler.call(delegate, this.prefix, ...enrichedArgs);\n return;\n }\n }\n\n for (const candidate of order) {\n const handler = DEFAULT_DELEGATE[candidate];\n if (typeof handler === 'function') {\n handler.call(DEFAULT_DELEGATE, this.prefix, ...enrichedArgs);\n return;\n }\n }\n }\n\n log(...args: any[]) {\n this.emit('log', args);\n }\n warn(...args: any[]) {\n this.emit('warn', args);\n }\n error(...args: any[]) {\n this.emit('error', args);\n }\n\n success(...args: any[]) {\n this.emit('info', args);\n }\n info(...args: any[]) {\n this.emit('info', args);\n }\n ready(...args: any[]) {\n this.emit('info', args);\n }\n\n debug(...args: any[]) {\n if (isDebugMode()) {\n this.emit('debug', args);\n }\n }\n}\n\nfunction createLogger(prefix: string) {\n return new Logger(prefix);\n}\n\ntype InfrastructureLogger = Logger & {\n __mf_infrastructure_logger__: true;\n};\n\nfunction createInfrastructureLogger(prefix: string): InfrastructureLogger {\n const infrastructureLogger = new Logger(prefix) as InfrastructureLogger;\n Object.defineProperty(infrastructureLogger, '__mf_infrastructure_logger__', {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return infrastructureLogger;\n}\n\ntype InfrastructureLoggerCapableCompiler = {\n getInfrastructureLogger?: (name: string) => unknown;\n};\n\nfunction bindLoggerToCompiler(\n loggerInstance: Logger,\n compiler: InfrastructureLoggerCapableCompiler,\n name: string,\n) {\n if (\n !(loggerInstance as Partial<InfrastructureLogger>)\n .__mf_infrastructure_logger__\n ) {\n return;\n }\n if (!compiler?.getInfrastructureLogger) {\n return;\n }\n try {\n const infrastructureLogger = compiler.getInfrastructureLogger(name);\n if (\n infrastructureLogger &&\n typeof infrastructureLogger === 'object' &&\n (typeof (infrastructureLogger as LoggerDelegate).log === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).info === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).warn === 'function' ||\n typeof (infrastructureLogger as LoggerDelegate).error === 'function')\n ) {\n loggerInstance.setDelegate(\n infrastructureLogger as unknown as LoggerDelegate,\n );\n }\n } catch {\n // If the bundler throws (older versions), fall back to default console logger.\n loggerInstance.setDelegate(undefined);\n }\n}\n\nconst logger = createLogger(PREFIX);\nconst infrastructureLogger = createInfrastructureLogger(PREFIX);\n\nexport {\n logger,\n infrastructureLogger,\n createLogger,\n createInfrastructureLogger,\n bindLoggerToCompiler,\n};\nexport type { Logger, InfrastructureLogger };\n"],"mappings":"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"}
|
package/dist/node.cjs
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/node.ts
|
|
3
|
+
const sdkImportCache = /* @__PURE__ */ new Map();
|
|
4
|
+
function importNodeModule(name) {
|
|
5
|
+
if (!name) throw new Error("import specifier is required");
|
|
6
|
+
if (sdkImportCache.has(name)) return sdkImportCache.get(name);
|
|
7
|
+
const promise = new Function("name", `return import(name)`)(name).then((res) => res).catch((error) => {
|
|
8
|
+
console.error(`Error importing module ${name}:`, error);
|
|
9
|
+
sdkImportCache.delete(name);
|
|
10
|
+
throw error;
|
|
11
|
+
});
|
|
12
|
+
sdkImportCache.set(name, promise);
|
|
13
|
+
return promise;
|
|
14
|
+
}
|
|
15
|
+
const loadNodeFetch = async () => {
|
|
16
|
+
const fetchModule = await importNodeModule("node-fetch");
|
|
17
|
+
return fetchModule.default || fetchModule;
|
|
18
|
+
};
|
|
19
|
+
const lazyLoaderHookFetch = async (input, init, loaderHook) => {
|
|
20
|
+
const hook = (url, init) => {
|
|
21
|
+
return loaderHook.lifecycle.fetch.emit(url, init);
|
|
22
|
+
};
|
|
23
|
+
const res = await hook(input, init || {});
|
|
24
|
+
if (!res || !(res instanceof Response)) return (typeof fetch === "undefined" ? await loadNodeFetch() : fetch)(input, init || {});
|
|
25
|
+
return res;
|
|
26
|
+
};
|
|
27
|
+
const createScriptNode = typeof ENV_TARGET === "undefined" || ENV_TARGET !== "web" ? (url, cb, attrs, loaderHook) => {
|
|
28
|
+
if (loaderHook?.createScriptHook) {
|
|
29
|
+
const hookResult = loaderHook.createScriptHook(url);
|
|
30
|
+
if (hookResult && typeof hookResult === "object" && "url" in hookResult) url = hookResult.url;
|
|
31
|
+
}
|
|
32
|
+
let urlObj;
|
|
33
|
+
try {
|
|
34
|
+
urlObj = new URL(url);
|
|
35
|
+
} catch (e) {
|
|
36
|
+
console.error("Error constructing URL:", e);
|
|
37
|
+
cb(/* @__PURE__ */ new Error(`Invalid URL: ${e}`));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const getFetch = async () => {
|
|
41
|
+
if (loaderHook?.fetch) return (input, init) => lazyLoaderHookFetch(input, init, loaderHook);
|
|
42
|
+
return typeof fetch === "undefined" ? loadNodeFetch() : fetch;
|
|
43
|
+
};
|
|
44
|
+
const handleScriptFetch = async (f, urlObj) => {
|
|
45
|
+
try {
|
|
46
|
+
const res = await f(urlObj.href);
|
|
47
|
+
const data = await res.text();
|
|
48
|
+
const [path, vm] = await Promise.all([importNodeModule("path"), importNodeModule("vm")]);
|
|
49
|
+
const scriptContext = {
|
|
50
|
+
exports: {},
|
|
51
|
+
module: { exports: {} }
|
|
52
|
+
};
|
|
53
|
+
const urlDirname = urlObj.pathname.split("/").slice(0, -1).join("/");
|
|
54
|
+
const filename = path.basename(urlObj.pathname);
|
|
55
|
+
const script = new vm.Script(`(function(exports, module, require, __dirname, __filename) {${data}\n})`, {
|
|
56
|
+
filename,
|
|
57
|
+
importModuleDynamically: vm.constants?.USE_MAIN_CONTEXT_DEFAULT_LOADER ?? importNodeModule
|
|
58
|
+
});
|
|
59
|
+
let requireFn;
|
|
60
|
+
requireFn = eval("require");
|
|
61
|
+
script.runInThisContext()(scriptContext.exports, scriptContext.module, requireFn, urlDirname, filename);
|
|
62
|
+
const exportedInterface = scriptContext.module.exports || scriptContext.exports;
|
|
63
|
+
if (attrs && exportedInterface && attrs["globalName"]) {
|
|
64
|
+
cb(void 0, exportedInterface[attrs["globalName"]] || exportedInterface);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
cb(void 0, exportedInterface);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
cb(e instanceof Error ? e : /* @__PURE__ */ new Error(`Script execution error: ${e}`));
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
getFetch().then(async (f) => {
|
|
73
|
+
if (attrs?.["type"] === "esm" || attrs?.["type"] === "module") return loadModule(urlObj.href, {
|
|
74
|
+
fetch: f,
|
|
75
|
+
vm: await importNodeModule("vm")
|
|
76
|
+
}).then(async (module) => {
|
|
77
|
+
await module.evaluate();
|
|
78
|
+
cb(void 0, module.namespace);
|
|
79
|
+
}).catch((e) => {
|
|
80
|
+
cb(e instanceof Error ? e : /* @__PURE__ */ new Error(`Script execution error: ${e}`));
|
|
81
|
+
});
|
|
82
|
+
handleScriptFetch(f, urlObj);
|
|
83
|
+
}).catch((err) => {
|
|
84
|
+
cb(err);
|
|
85
|
+
});
|
|
86
|
+
} : (url, cb, attrs, loaderHook) => {
|
|
87
|
+
cb(/* @__PURE__ */ new Error("createScriptNode is disabled in non-Node.js environment"));
|
|
88
|
+
};
|
|
89
|
+
const loadScriptNode = typeof ENV_TARGET === "undefined" || ENV_TARGET !== "web" ? (url, info) => {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
createScriptNode(url, (error, scriptContext) => {
|
|
92
|
+
if (error) reject(error);
|
|
93
|
+
else {
|
|
94
|
+
const remoteEntryKey = info?.attrs?.["globalName"] || `__FEDERATION_${info?.attrs?.["name"]}:custom__`;
|
|
95
|
+
resolve(globalThis[remoteEntryKey] = scriptContext);
|
|
96
|
+
}
|
|
97
|
+
}, info.attrs, info.loaderHook);
|
|
98
|
+
});
|
|
99
|
+
} : (url, info) => {
|
|
100
|
+
throw new Error("loadScriptNode is disabled in non-Node.js environment");
|
|
101
|
+
};
|
|
102
|
+
const esmModuleCache = /* @__PURE__ */ new Map();
|
|
103
|
+
async function loadModule(url, options) {
|
|
104
|
+
if (esmModuleCache.has(url)) return esmModuleCache.get(url);
|
|
105
|
+
const { fetch, vm } = options;
|
|
106
|
+
const code = await (await fetch(url)).text();
|
|
107
|
+
const module = new vm.SourceTextModule(code, { importModuleDynamically: async (specifier, script) => {
|
|
108
|
+
const resolvedUrl = new URL(specifier, url).href;
|
|
109
|
+
return loadModule(resolvedUrl, options);
|
|
110
|
+
} });
|
|
111
|
+
esmModuleCache.set(url, module);
|
|
112
|
+
await module.link(async (specifier) => {
|
|
113
|
+
const resolvedUrl = new URL(specifier, url).href;
|
|
114
|
+
return await loadModule(resolvedUrl, options);
|
|
115
|
+
});
|
|
116
|
+
return module;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
exports.createScriptNode = createScriptNode;
|
|
121
|
+
exports.loadScriptNode = loadScriptNode;
|
|
122
|
+
//# sourceMappingURL=node.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.cjs","names":[],"sources":["../src/node.ts"],"sourcesContent":["import { CreateScriptHookNode, FetchHook } from './types';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\n\nconst sdkImportCache = new Map<string, Promise<any>>();\n\nfunction importNodeModule<T>(name: string): Promise<T> {\n if (!name) {\n throw new Error('import specifier is required');\n }\n\n // Check cache to prevent infinite recursion\n if (sdkImportCache.has(name)) {\n return sdkImportCache.get(name)!;\n }\n\n const importModule = new Function('name', `return import(name)`);\n const promise = importModule(name)\n .then((res: any) => res as T)\n .catch((error: any) => {\n console.error(`Error importing module ${name}:`, error);\n // Remove from cache on error so it can be retried\n sdkImportCache.delete(name);\n throw error;\n });\n\n // Cache the promise to prevent recursive calls\n sdkImportCache.set(name, promise);\n return promise;\n}\n\nconst loadNodeFetch = async (): Promise<typeof fetch> => {\n const fetchModule =\n await importNodeModule<typeof import('node-fetch')>('node-fetch');\n return (fetchModule.default || fetchModule) as unknown as typeof fetch;\n};\n\nconst lazyLoaderHookFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n loaderHook?: any,\n): Promise<Response> => {\n const hook = (url: RequestInfo | URL, init: RequestInit) => {\n return loaderHook.lifecycle.fetch.emit(url, init);\n };\n\n const res = await hook(input, init || {});\n if (!res || !(res instanceof Response)) {\n const fetchFunction =\n typeof fetch === 'undefined' ? await loadNodeFetch() : fetch;\n return fetchFunction(input, init || {});\n }\n\n return res;\n};\n\nexport const createScriptNode =\n typeof ENV_TARGET === 'undefined' || ENV_TARGET !== 'web'\n ? (\n url: string,\n cb: (error?: Error, scriptContext?: any) => void,\n attrs?: Record<string, any>,\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n fetch?: FetchHook;\n },\n ) => {\n if (loaderHook?.createScriptHook) {\n const hookResult = loaderHook.createScriptHook(url);\n if (\n hookResult &&\n typeof hookResult === 'object' &&\n 'url' in hookResult\n ) {\n url = hookResult.url;\n }\n }\n\n let urlObj: URL;\n try {\n urlObj = new URL(url);\n } catch (e) {\n console.error('Error constructing URL:', e);\n cb(new Error(`Invalid URL: ${e}`));\n return;\n }\n\n const getFetch = async (): Promise<typeof fetch> => {\n if (loaderHook?.fetch) {\n return (input: RequestInfo | URL, init?: RequestInit) =>\n lazyLoaderHookFetch(input, init, loaderHook);\n }\n\n return typeof fetch === 'undefined' ? loadNodeFetch() : fetch;\n };\n\n const handleScriptFetch = async (f: typeof fetch, urlObj: URL) => {\n try {\n const res = await f(urlObj.href);\n const data = await res.text();\n const [path, vm] = await Promise.all([\n importNodeModule<typeof import('path')>('path'),\n importNodeModule<typeof import('vm')>('vm'),\n ]);\n\n const scriptContext = { exports: {}, module: { exports: {} } };\n const urlDirname = urlObj.pathname\n .split('/')\n .slice(0, -1)\n .join('/');\n const filename = path.basename(urlObj.pathname);\n\n const script = new vm.Script(\n `(function(exports, module, require, __dirname, __filename) {${data}\\n})`,\n {\n filename,\n importModuleDynamically:\n //@ts-ignore\n vm.constants?.USE_MAIN_CONTEXT_DEFAULT_LOADER ??\n importNodeModule,\n },\n );\n\n let requireFn: NodeRequire;\n if (process.env['IS_ESM_BUILD'] === 'true') {\n const nodeModule =\n await importNodeModule<typeof import('node:module')>(\n 'node:module',\n );\n requireFn = nodeModule.createRequire(\n urlObj.protocol === 'file:' || urlObj.protocol === 'node:'\n ? urlObj.href\n : path.join(process.cwd(), '__mf_require_base__.js'),\n );\n } else {\n requireFn = eval('require') as NodeRequire;\n }\n\n script.runInThisContext()(\n scriptContext.exports,\n scriptContext.module,\n requireFn,\n urlDirname,\n filename,\n );\n const exportedInterface: Record<string, any> =\n scriptContext.module.exports || scriptContext.exports;\n\n if (attrs && exportedInterface && attrs['globalName']) {\n const container =\n exportedInterface[attrs['globalName']] || exportedInterface;\n cb(\n undefined,\n container as keyof typeof scriptContext.module.exports,\n );\n return;\n }\n\n cb(\n undefined,\n exportedInterface as keyof typeof scriptContext.module.exports,\n );\n } catch (e) {\n cb(\n e instanceof Error\n ? e\n : new Error(`Script execution error: ${e}`),\n );\n }\n };\n\n getFetch()\n .then(async (f) => {\n if (attrs?.['type'] === 'esm' || attrs?.['type'] === 'module') {\n return loadModule(urlObj.href, {\n fetch: f,\n vm: await importNodeModule<typeof import('vm')>('vm'),\n })\n .then(async (module) => {\n await module.evaluate();\n cb(undefined, module.namespace);\n })\n .catch((e) => {\n cb(\n e instanceof Error\n ? e\n : new Error(`Script execution error: ${e}`),\n );\n });\n }\n handleScriptFetch(f, urlObj);\n })\n .catch((err) => {\n cb(err);\n });\n }\n : (\n url: string,\n cb: (error?: Error, scriptContext?: any) => void,\n attrs?: Record<string, any>,\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n fetch?: FetchHook;\n },\n ) => {\n cb(\n new Error('createScriptNode is disabled in non-Node.js environment'),\n );\n };\n\nexport const loadScriptNode =\n typeof ENV_TARGET === 'undefined' || ENV_TARGET !== 'web'\n ? (\n url: string,\n info: {\n attrs?: Record<string, any>;\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n };\n },\n ) => {\n return new Promise<void>((resolve, reject) => {\n createScriptNode(\n url,\n (error, scriptContext) => {\n if (error) {\n reject(error);\n } else {\n const remoteEntryKey =\n info?.attrs?.['globalName'] ||\n `__FEDERATION_${info?.attrs?.['name']}:custom__`;\n const entryExports = ((globalThis as any)[remoteEntryKey] =\n scriptContext);\n resolve(entryExports);\n }\n },\n info.attrs,\n info.loaderHook,\n );\n });\n }\n : (\n url: string,\n info: {\n attrs?: Record<string, any>;\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n };\n },\n ) => {\n throw new Error(\n 'loadScriptNode is disabled in non-Node.js environment',\n );\n };\n\nconst esmModuleCache = new Map<string, any>();\n\nasync function loadModule(\n url: string,\n options: {\n vm: any;\n fetch: any;\n },\n) {\n // Check cache to prevent infinite recursion in ESM loading\n if (esmModuleCache.has(url)) {\n return esmModuleCache.get(url)!;\n }\n\n const { fetch, vm } = options;\n const response = await fetch(url);\n const code = await response.text();\n\n const module: any = new vm.SourceTextModule(code, {\n // @ts-ignore\n importModuleDynamically: async (specifier, script) => {\n const resolvedUrl = new URL(specifier, url).href;\n return loadModule(resolvedUrl, options);\n },\n });\n\n // Cache the module before linking to prevent cycles\n esmModuleCache.set(url, module);\n\n await module.link(async (specifier: string) => {\n const resolvedUrl = new URL(specifier, url).href;\n const module = await loadModule(resolvedUrl, options);\n return module;\n });\n\n return module;\n}\n"],"mappings":"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"}
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CreateScriptHookNode, FetchHook } from "./types/hooks.js";
|
|
2
|
+
import "./types/index.js";
|
|
3
|
+
|
|
4
|
+
//#region src/node.d.ts
|
|
5
|
+
declare const createScriptNode: (url: string, cb: (error?: Error, scriptContext?: any) => void, attrs?: Record<string, any>, loaderHook?: {
|
|
6
|
+
createScriptHook?: CreateScriptHookNode;
|
|
7
|
+
fetch?: FetchHook;
|
|
8
|
+
}) => void;
|
|
9
|
+
declare const loadScriptNode: (url: string, info: {
|
|
10
|
+
attrs?: Record<string, any>;
|
|
11
|
+
loaderHook?: {
|
|
12
|
+
createScriptHook?: CreateScriptHookNode;
|
|
13
|
+
};
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { createScriptNode, loadScriptNode };
|
|
17
|
+
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
//#region src/node.ts
|
|
2
|
+
const sdkImportCache = /* @__PURE__ */ new Map();
|
|
3
|
+
function importNodeModule(name) {
|
|
4
|
+
if (!name) throw new Error("import specifier is required");
|
|
5
|
+
if (sdkImportCache.has(name)) return sdkImportCache.get(name);
|
|
6
|
+
const promise = new Function("name", `return import(name)`)(name).then((res) => res).catch((error) => {
|
|
7
|
+
console.error(`Error importing module ${name}:`, error);
|
|
8
|
+
sdkImportCache.delete(name);
|
|
9
|
+
throw error;
|
|
10
|
+
});
|
|
11
|
+
sdkImportCache.set(name, promise);
|
|
12
|
+
return promise;
|
|
13
|
+
}
|
|
14
|
+
const loadNodeFetch = async () => {
|
|
15
|
+
const fetchModule = await importNodeModule("node-fetch");
|
|
16
|
+
return fetchModule.default || fetchModule;
|
|
17
|
+
};
|
|
18
|
+
const lazyLoaderHookFetch = async (input, init, loaderHook) => {
|
|
19
|
+
const hook = (url, init) => {
|
|
20
|
+
return loaderHook.lifecycle.fetch.emit(url, init);
|
|
21
|
+
};
|
|
22
|
+
const res = await hook(input, init || {});
|
|
23
|
+
if (!res || !(res instanceof Response)) return (typeof fetch === "undefined" ? await loadNodeFetch() : fetch)(input, init || {});
|
|
24
|
+
return res;
|
|
25
|
+
};
|
|
26
|
+
const createScriptNode = typeof ENV_TARGET === "undefined" || ENV_TARGET !== "web" ? (url, cb, attrs, loaderHook) => {
|
|
27
|
+
if (loaderHook?.createScriptHook) {
|
|
28
|
+
const hookResult = loaderHook.createScriptHook(url);
|
|
29
|
+
if (hookResult && typeof hookResult === "object" && "url" in hookResult) url = hookResult.url;
|
|
30
|
+
}
|
|
31
|
+
let urlObj;
|
|
32
|
+
try {
|
|
33
|
+
urlObj = new URL(url);
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.error("Error constructing URL:", e);
|
|
36
|
+
cb(/* @__PURE__ */ new Error(`Invalid URL: ${e}`));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const getFetch = async () => {
|
|
40
|
+
if (loaderHook?.fetch) return (input, init) => lazyLoaderHookFetch(input, init, loaderHook);
|
|
41
|
+
return typeof fetch === "undefined" ? loadNodeFetch() : fetch;
|
|
42
|
+
};
|
|
43
|
+
const handleScriptFetch = async (f, urlObj) => {
|
|
44
|
+
try {
|
|
45
|
+
const res = await f(urlObj.href);
|
|
46
|
+
const data = await res.text();
|
|
47
|
+
const [path, vm] = await Promise.all([importNodeModule("path"), importNodeModule("vm")]);
|
|
48
|
+
const scriptContext = {
|
|
49
|
+
exports: {},
|
|
50
|
+
module: { exports: {} }
|
|
51
|
+
};
|
|
52
|
+
const urlDirname = urlObj.pathname.split("/").slice(0, -1).join("/");
|
|
53
|
+
const filename = path.basename(urlObj.pathname);
|
|
54
|
+
const script = new vm.Script(`(function(exports, module, require, __dirname, __filename) {${data}\n})`, {
|
|
55
|
+
filename,
|
|
56
|
+
importModuleDynamically: vm.constants?.USE_MAIN_CONTEXT_DEFAULT_LOADER ?? importNodeModule
|
|
57
|
+
});
|
|
58
|
+
let requireFn;
|
|
59
|
+
requireFn = (await importNodeModule("node:module")).createRequire(urlObj.protocol === "file:" || urlObj.protocol === "node:" ? urlObj.href : path.join(process.cwd(), "__mf_require_base__.js"));
|
|
60
|
+
script.runInThisContext()(scriptContext.exports, scriptContext.module, requireFn, urlDirname, filename);
|
|
61
|
+
const exportedInterface = scriptContext.module.exports || scriptContext.exports;
|
|
62
|
+
if (attrs && exportedInterface && attrs["globalName"]) {
|
|
63
|
+
cb(void 0, exportedInterface[attrs["globalName"]] || exportedInterface);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
cb(void 0, exportedInterface);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
cb(e instanceof Error ? e : /* @__PURE__ */ new Error(`Script execution error: ${e}`));
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
getFetch().then(async (f) => {
|
|
72
|
+
if (attrs?.["type"] === "esm" || attrs?.["type"] === "module") return loadModule(urlObj.href, {
|
|
73
|
+
fetch: f,
|
|
74
|
+
vm: await importNodeModule("vm")
|
|
75
|
+
}).then(async (module) => {
|
|
76
|
+
await module.evaluate();
|
|
77
|
+
cb(void 0, module.namespace);
|
|
78
|
+
}).catch((e) => {
|
|
79
|
+
cb(e instanceof Error ? e : /* @__PURE__ */ new Error(`Script execution error: ${e}`));
|
|
80
|
+
});
|
|
81
|
+
handleScriptFetch(f, urlObj);
|
|
82
|
+
}).catch((err) => {
|
|
83
|
+
cb(err);
|
|
84
|
+
});
|
|
85
|
+
} : (url, cb, attrs, loaderHook) => {
|
|
86
|
+
cb(/* @__PURE__ */ new Error("createScriptNode is disabled in non-Node.js environment"));
|
|
87
|
+
};
|
|
88
|
+
const loadScriptNode = typeof ENV_TARGET === "undefined" || ENV_TARGET !== "web" ? (url, info) => {
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
createScriptNode(url, (error, scriptContext) => {
|
|
91
|
+
if (error) reject(error);
|
|
92
|
+
else {
|
|
93
|
+
const remoteEntryKey = info?.attrs?.["globalName"] || `__FEDERATION_${info?.attrs?.["name"]}:custom__`;
|
|
94
|
+
resolve(globalThis[remoteEntryKey] = scriptContext);
|
|
95
|
+
}
|
|
96
|
+
}, info.attrs, info.loaderHook);
|
|
97
|
+
});
|
|
98
|
+
} : (url, info) => {
|
|
99
|
+
throw new Error("loadScriptNode is disabled in non-Node.js environment");
|
|
100
|
+
};
|
|
101
|
+
const esmModuleCache = /* @__PURE__ */ new Map();
|
|
102
|
+
async function loadModule(url, options) {
|
|
103
|
+
if (esmModuleCache.has(url)) return esmModuleCache.get(url);
|
|
104
|
+
const { fetch, vm } = options;
|
|
105
|
+
const code = await (await fetch(url)).text();
|
|
106
|
+
const module = new vm.SourceTextModule(code, { importModuleDynamically: async (specifier, script) => {
|
|
107
|
+
const resolvedUrl = new URL(specifier, url).href;
|
|
108
|
+
return loadModule(resolvedUrl, options);
|
|
109
|
+
} });
|
|
110
|
+
esmModuleCache.set(url, module);
|
|
111
|
+
await module.link(async (specifier) => {
|
|
112
|
+
const resolvedUrl = new URL(specifier, url).href;
|
|
113
|
+
return await loadModule(resolvedUrl, options);
|
|
114
|
+
});
|
|
115
|
+
return module;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { createScriptNode, loadScriptNode };
|
|
120
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../src/node.ts"],"sourcesContent":["import { CreateScriptHookNode, FetchHook } from './types';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\n\nconst sdkImportCache = new Map<string, Promise<any>>();\n\nfunction importNodeModule<T>(name: string): Promise<T> {\n if (!name) {\n throw new Error('import specifier is required');\n }\n\n // Check cache to prevent infinite recursion\n if (sdkImportCache.has(name)) {\n return sdkImportCache.get(name)!;\n }\n\n const importModule = new Function('name', `return import(name)`);\n const promise = importModule(name)\n .then((res: any) => res as T)\n .catch((error: any) => {\n console.error(`Error importing module ${name}:`, error);\n // Remove from cache on error so it can be retried\n sdkImportCache.delete(name);\n throw error;\n });\n\n // Cache the promise to prevent recursive calls\n sdkImportCache.set(name, promise);\n return promise;\n}\n\nconst loadNodeFetch = async (): Promise<typeof fetch> => {\n const fetchModule =\n await importNodeModule<typeof import('node-fetch')>('node-fetch');\n return (fetchModule.default || fetchModule) as unknown as typeof fetch;\n};\n\nconst lazyLoaderHookFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n loaderHook?: any,\n): Promise<Response> => {\n const hook = (url: RequestInfo | URL, init: RequestInit) => {\n return loaderHook.lifecycle.fetch.emit(url, init);\n };\n\n const res = await hook(input, init || {});\n if (!res || !(res instanceof Response)) {\n const fetchFunction =\n typeof fetch === 'undefined' ? await loadNodeFetch() : fetch;\n return fetchFunction(input, init || {});\n }\n\n return res;\n};\n\nexport const createScriptNode =\n typeof ENV_TARGET === 'undefined' || ENV_TARGET !== 'web'\n ? (\n url: string,\n cb: (error?: Error, scriptContext?: any) => void,\n attrs?: Record<string, any>,\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n fetch?: FetchHook;\n },\n ) => {\n if (loaderHook?.createScriptHook) {\n const hookResult = loaderHook.createScriptHook(url);\n if (\n hookResult &&\n typeof hookResult === 'object' &&\n 'url' in hookResult\n ) {\n url = hookResult.url;\n }\n }\n\n let urlObj: URL;\n try {\n urlObj = new URL(url);\n } catch (e) {\n console.error('Error constructing URL:', e);\n cb(new Error(`Invalid URL: ${e}`));\n return;\n }\n\n const getFetch = async (): Promise<typeof fetch> => {\n if (loaderHook?.fetch) {\n return (input: RequestInfo | URL, init?: RequestInit) =>\n lazyLoaderHookFetch(input, init, loaderHook);\n }\n\n return typeof fetch === 'undefined' ? loadNodeFetch() : fetch;\n };\n\n const handleScriptFetch = async (f: typeof fetch, urlObj: URL) => {\n try {\n const res = await f(urlObj.href);\n const data = await res.text();\n const [path, vm] = await Promise.all([\n importNodeModule<typeof import('path')>('path'),\n importNodeModule<typeof import('vm')>('vm'),\n ]);\n\n const scriptContext = { exports: {}, module: { exports: {} } };\n const urlDirname = urlObj.pathname\n .split('/')\n .slice(0, -1)\n .join('/');\n const filename = path.basename(urlObj.pathname);\n\n const script = new vm.Script(\n `(function(exports, module, require, __dirname, __filename) {${data}\\n})`,\n {\n filename,\n importModuleDynamically:\n //@ts-ignore\n vm.constants?.USE_MAIN_CONTEXT_DEFAULT_LOADER ??\n importNodeModule,\n },\n );\n\n let requireFn: NodeRequire;\n if (process.env['IS_ESM_BUILD'] === 'true') {\n const nodeModule =\n await importNodeModule<typeof import('node:module')>(\n 'node:module',\n );\n requireFn = nodeModule.createRequire(\n urlObj.protocol === 'file:' || urlObj.protocol === 'node:'\n ? urlObj.href\n : path.join(process.cwd(), '__mf_require_base__.js'),\n );\n } else {\n requireFn = eval('require') as NodeRequire;\n }\n\n script.runInThisContext()(\n scriptContext.exports,\n scriptContext.module,\n requireFn,\n urlDirname,\n filename,\n );\n const exportedInterface: Record<string, any> =\n scriptContext.module.exports || scriptContext.exports;\n\n if (attrs && exportedInterface && attrs['globalName']) {\n const container =\n exportedInterface[attrs['globalName']] || exportedInterface;\n cb(\n undefined,\n container as keyof typeof scriptContext.module.exports,\n );\n return;\n }\n\n cb(\n undefined,\n exportedInterface as keyof typeof scriptContext.module.exports,\n );\n } catch (e) {\n cb(\n e instanceof Error\n ? e\n : new Error(`Script execution error: ${e}`),\n );\n }\n };\n\n getFetch()\n .then(async (f) => {\n if (attrs?.['type'] === 'esm' || attrs?.['type'] === 'module') {\n return loadModule(urlObj.href, {\n fetch: f,\n vm: await importNodeModule<typeof import('vm')>('vm'),\n })\n .then(async (module) => {\n await module.evaluate();\n cb(undefined, module.namespace);\n })\n .catch((e) => {\n cb(\n e instanceof Error\n ? e\n : new Error(`Script execution error: ${e}`),\n );\n });\n }\n handleScriptFetch(f, urlObj);\n })\n .catch((err) => {\n cb(err);\n });\n }\n : (\n url: string,\n cb: (error?: Error, scriptContext?: any) => void,\n attrs?: Record<string, any>,\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n fetch?: FetchHook;\n },\n ) => {\n cb(\n new Error('createScriptNode is disabled in non-Node.js environment'),\n );\n };\n\nexport const loadScriptNode =\n typeof ENV_TARGET === 'undefined' || ENV_TARGET !== 'web'\n ? (\n url: string,\n info: {\n attrs?: Record<string, any>;\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n };\n },\n ) => {\n return new Promise<void>((resolve, reject) => {\n createScriptNode(\n url,\n (error, scriptContext) => {\n if (error) {\n reject(error);\n } else {\n const remoteEntryKey =\n info?.attrs?.['globalName'] ||\n `__FEDERATION_${info?.attrs?.['name']}:custom__`;\n const entryExports = ((globalThis as any)[remoteEntryKey] =\n scriptContext);\n resolve(entryExports);\n }\n },\n info.attrs,\n info.loaderHook,\n );\n });\n }\n : (\n url: string,\n info: {\n attrs?: Record<string, any>;\n loaderHook?: {\n createScriptHook?: CreateScriptHookNode;\n };\n },\n ) => {\n throw new Error(\n 'loadScriptNode is disabled in non-Node.js environment',\n );\n };\n\nconst esmModuleCache = new Map<string, any>();\n\nasync function loadModule(\n url: string,\n options: {\n vm: any;\n fetch: any;\n },\n) {\n // Check cache to prevent infinite recursion in ESM loading\n if (esmModuleCache.has(url)) {\n return esmModuleCache.get(url)!;\n }\n\n const { fetch, vm } = options;\n const response = await fetch(url);\n const code = await response.text();\n\n const module: any = new vm.SourceTextModule(code, {\n // @ts-ignore\n importModuleDynamically: async (specifier, script) => {\n const resolvedUrl = new URL(specifier, url).href;\n return loadModule(resolvedUrl, options);\n },\n });\n\n // Cache the module before linking to prevent cycles\n esmModuleCache.set(url, module);\n\n await module.link(async (specifier: string) => {\n const resolvedUrl = new URL(specifier, url).href;\n const module = await loadModule(resolvedUrl, options);\n return module;\n });\n\n return module;\n}\n"],"mappings":"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"}
|