|
const { existsSync } = require('node:fs'); |
|
const { join } = 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: null }, |
|
arm64: { base: 'linux-arm64-gnu', musl: 'linux-arm64-musl' }, |
|
riscv64: { base: 'linux-riscv64-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(); |
|
|
|
if (!packageBase) { |
|
throw new Error( |
|
`Your current platform "${platform}" 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.` |
|
); |
|
} |
|
|
|
function getPackageBase() { |
|
const imported = bindingsByPlatformAndArch[platform]?.[arch]; |
|
if (!imported) { |
|
return null; |
|
} |
|
if ('musl' in imported && isMusl()) { |
|
return imported.musl; |
|
} |
|
return imported.base; |
|
} |
|
|
|
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(join(__dirname, localName)) ? localName : `@rollup/rollup-${packageBase}` |
|
); |
|
|
|
module.exports.parse = parse; |
|
module.exports.parseAsync = parseAsync; |
|
module.exports.xxhashBase64Url = xxhashBase64Url; |
|
module.exports.xxhashBase36 = xxhashBase36; |
|
module.exports.xxhashBase16 = xxhashBase16; |
|
|