| const { existsSync } = require('node:fs'); |
| const path = require('node:path'); |
| const { platform, arch, report } = require('node:process'); |
| |
| const isMusl = () => !report.getReport().header.glibcVersionRuntime; |
| |
| const bindingsByPlatformAndArch = { |
| android: { |
| arm: { base: 'android-arm-eabi' }, |
| arm64: { base: 'android-arm64' } |
| }, |
| darwin: { |
| arm64: { base: 'darwin-arm64' }, |
| x64: { base: 'darwin-x64' } |
| }, |
| linux: { |
| arm: { base: 'linux-arm-gnueabihf', musl: 'linux-arm-musleabihf' }, |
| arm64: { base: 'linux-arm64-gnu', musl: 'linux-arm64-musl' }, |
| ppc64: { base: 'linux-powerpc64le-gnu', musl: null }, |
| riscv64: { base: 'linux-riscv64-gnu', musl: null }, |
| s390x: { base: 'linux-s390x-gnu', musl: null }, |
| x64: { base: 'linux-x64-gnu', musl: 'linux-x64-musl' } |
| }, |
| win32: { |
| arm64: { base: 'win32-arm64-msvc' }, |
| ia32: { base: 'win32-ia32-msvc' }, |
| x64: { base: 'win32-x64-msvc' } |
| } |
| }; |
| |
| const msvcLinkFilenameByArch = { |
| arm64: 'vc_redist.arm64.exe', |
| ia32: 'vc_redist.x86.exe', |
| x64: 'vc_redist.x64.exe' |
| }; |
| |
| const packageBase = getPackageBase(); |
| const localName = `./rollup.${packageBase}.node`; |
| const requireWithFriendlyError = id => { |
| try { |
| return require(id); |
| } catch (error) { |
| if ( |
| platform === 'win32' && |
| error instanceof Error && |
| error.code === 'ERR_DLOPEN_FAILED' && |
| error.message.includes('The specified module could not be found') |
| ) { |
| const msvcDownloadLink = `https://aka.ms/vs/17/release/${msvcLinkFilenameByArch[arch]}`; |
| throw new Error( |
| `Failed to load module ${id}. ` + |
| 'Required DLL was not found. ' + |
| 'This error usually happens when Microsoft Visual C++ Redistributable is not installed. ' + |
| `You can download it from ${msvcDownloadLink}`, |
| { cause: error } |
| ); |
| } |
| |
| throw new Error( |
| `Cannot find module ${id}. ` + |
| `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + |
| 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', |
| { cause: error } |
| ); |
| } |
| }; |
| |
| const { parse, parseAsync, xxhashBase64Url, xxhashBase36, xxhashBase16 } = requireWithFriendlyError( |
| existsSync(path.join(__dirname, localName)) ? localName : `@rollup/rollup-${packageBase}` |
| ); |
| |
| function getPackageBase() { |
| const imported = bindingsByPlatformAndArch[platform]?.[arch]; |
| if (!imported) { |
| throwUnsupportedError(false); |
| } |
| if ('musl' in imported && isMusl()) { |
| return imported.musl || throwUnsupportedError(true); |
| } |
| return imported.base; |
| } |
| |
| function throwUnsupportedError(isMusl) { |
| throw new Error( |
| `Your current platform "${platform}${isMusl ? ' (musl)' : ''}" and architecture "${arch}" combination is not yet supported by the native Rollup build. Please use the WASM build "@rollup/wasm-node" instead. |
| |
| The following platform-architecture combinations are supported: |
| ${Object.entries(bindingsByPlatformAndArch) |
| .flatMap(([platformName, architectures]) => |
| Object.entries(architectures).flatMap(([architectureName, { musl }]) => { |
| const name = `${platformName}-${architectureName}`; |
| return musl ? [name, `${name} (musl)`] : [name]; |
| }) |
| ) |
| .join('\n')} |
| |
| If this is important to you, please consider supporting Rollup to make a native build for your platform and architecture available.` |
| ); |
| } |
| |
| module.exports.parse = parse; |
| module.exports.parseAsync = parseAsync; |
| module.exports.xxhashBase64Url = xxhashBase64Url; |
| module.exports.xxhashBase36 = xxhashBase36; |
| module.exports.xxhashBase16 = xxhashBase16; |