diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
| commit | 76cb9c2a39d477a64824a985ade40507e3bbade1 (patch) | |
| tree | 41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/rollup/dist/native.js | |
| parent | 819a39a21ac992b1393244a4c283bbb125208c69 (diff) | |
| download | neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2 neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip | |
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/rollup/dist/native.js')
| -rw-r--r-- | vanilla/node_modules/rollup/dist/native.js | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/vanilla/node_modules/rollup/dist/native.js b/vanilla/node_modules/rollup/dist/native.js new file mode 100644 index 0000000..962a101 --- /dev/null +++ b/vanilla/node_modules/rollup/dist/native.js @@ -0,0 +1,161 @@ +const { existsSync } = require('node:fs'); +const path = require('node:path'); +const { platform, arch, report } = require('node:process'); +const { spawnSync } = require('node:child_process'); + +const getReportHeader = () => { + try { + if (platform !== 'win32') { + return report.getReport().header; + } + + // This is needed because report.getReport() crashes the process on Windows sometimes. + const script = + "console.log(JSON.stringify(require('node:process').report.getReport().header));"; + const child = spawnSync(process.execPath, ['-p', script], { + encoding: 'utf8', + timeout: 3000, + windowsHide: true + }); + + if (child.status !== 0) { + return null; + } + + // The output from node -p might include a trailing 'undefined' and newline + const stdout = child.stdout?.replace(/undefined\r?\n?$/, '').trim(); + if (!stdout) { + return null; + } + + return JSON.parse(stdout); + } catch { + return null; + } +}; + +let reportHeader; +const isMingw32 = () => { + reportHeader ??= getReportHeader(); + + return reportHeader?.osName?.startsWith('MINGW32_NT') ?? false; +}; + +const isMusl = () => { + reportHeader ??= getReportHeader(); + + return reportHeader ? !reportHeader.glibcVersionRuntime : false; +}; + +const bindingsByPlatformAndArch = { + android: { + arm: { base: 'android-arm-eabi' }, + arm64: { base: 'android-arm64' } + }, + darwin: { + arm64: { base: 'darwin-arm64' }, + x64: { base: 'darwin-x64' } + }, + freebsd: { + arm64: { base: 'freebsd-arm64' }, + x64: { base: 'freebsd-x64' } + }, + linux: { + arm: { base: 'linux-arm-gnueabihf', musl: 'linux-arm-musleabihf' }, + arm64: { base: 'linux-arm64-gnu', musl: 'linux-arm64-musl' }, + loong64: { base: 'linux-loong64-gnu', musl: 'linux-loong64-musl' }, + ppc64: { base: 'linux-ppc64-gnu', musl: 'linux-ppc64-musl' }, + riscv64: { base: 'linux-riscv64-gnu', musl: 'linux-riscv64-musl' }, + s390x: { base: 'linux-s390x-gnu', musl: null }, + x64: { base: 'linux-x64-gnu', musl: 'linux-x64-musl' } + }, + openbsd: { + x64: { base: 'openbsd-x64' } + }, + openharmony: { + arm64: { base: 'openharmony-arm64' } + }, + win32: { + arm64: { base: 'win32-arm64-msvc' }, + ia32: { base: 'win32-ia32-msvc' }, + x64: { + base: isMingw32() ? 'win32-x64-gnu' : '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; |
