{"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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"}