105 lines
3.4 KiB
JavaScript
105 lines
3.4 KiB
JavaScript
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;
|