diff --git a/cli/src/api/templates/js-binding.ts b/cli/src/api/templates/js-binding.ts index efbe5d15..e5750748 100644 --- a/cli/src/api/templates/js-binding.ts +++ b/cli/src/api/templates/js-binding.ts @@ -1,135 +1,257 @@ -/* eslint-disable @typescript-eslint/switch-exhaustiveness-check */ +export function createJsBinding(localName: string, pkgName: string): string { + return `// prettier-ignore +/* tslint:disable */ +/* eslint-disable */ -function loadNapiModule(binaryName: string, packageName: string) { - const { existsSync, readFileSync } = require('fs') - const { join } = require('path') - const { platform, arch } = process +/* auto-generated by NAPI-RS */ - const candidates: string[] = [] +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') - function isMusl() { - // For Node 10 - if (!process.report || typeof process.report.getReport !== 'function') { - try { - const lddPath = require('child_process') - .execSync('which ldd') - .toString() - .trim() - return readFileSync(lddPath, 'utf8').includes('musl') - } catch (e) { - return true - } - } else { - // @ts-expect-error - const { glibcVersionRuntime } = process.report.getReport().header - return !glibcVersionRuntime - } - } +const { platform, arch } = process - switch (platform) { - case 'android': - switch (arch) { - case 'arm64': - candidates.push('android-arm64') - break - case 'arm': - candidates.push('android-arm-eabi') - break - } - break - case 'win32': - switch (arch) { - case 'x64': - candidates.push('win32-x64-msvc') - break - case 'ia32': - candidates.push('win32-ia32-msvc') - break - case 'arm64': - candidates.push('win32-arm64-msvc') - break - } - break - case 'darwin': - candidates.push('darwin-universal') - switch (arch) { - case 'x64': - candidates.push('darwin-x64') - break - case 'arm64': - candidates.push('darwin-arm64') - break - } - break - case 'freebsd': - if (arch === 'x64') { - candidates.push('freebsd-x64') - } - break - case 'linux': - switch (arch) { - case 'x64': - if (isMusl()) { - candidates.push('linux-x64-musl') - } else { - candidates.push('linux-x64-gnu') - } - break - case 'arm64': - if (isMusl()) { - candidates.push('linux-arm64-musl') - } else { - candidates.push('linux-arm64-gnu') - } - break - case 'arm': - candidates.push('linux-arm-gnueabihf') - break - // type Architecture doesn't contain riscv64 yet - // @ts-expect-error - case 'riscv64': - candidates.push('linux-riscv64-gnu') - break - } - break - } - - let nativeBinding: any - let loadError: any - - for (const suffix of candidates) { - const localPath = join(__dirname, `${binaryName}.${suffix}.node`) - const pkgPath = `${packageName}-${suffix}` +let nativeBinding = null +let localFileExisted = false +let loadError = null +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { try { - if (existsSync(localPath)) { - nativeBinding = require(localPath) + const lddPath = require('child_process').execSync('which ldd').toString().trim() + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, '${localName}.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.android-arm64.node') + } else { + nativeBinding = require('${pkgName}-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, '${localName}.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.android-arm-eabi.node') + } else { + nativeBinding = require('${pkgName}-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(\`Unsupported architecture on Android \${arch}\`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, '${localName}.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.win32-x64-msvc.node') + } else { + nativeBinding = require('${pkgName}-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, '${localName}.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.win32-ia32-msvc.node') + } else { + nativeBinding = require('${pkgName}-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, '${localName}.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.win32-arm64-msvc.node') + } else { + nativeBinding = require('${pkgName}-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(\`Unsupported architecture on Windows: \${arch}\`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, '${localName}.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.darwin-universal.node') } else { - nativeBinding = require(pkgPath) + nativeBinding = require('${pkgName}-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, '${localName}.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.darwin-x64.node') + } else { + nativeBinding = require('${pkgName}-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, '${localName}.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.darwin-arm64.node') + } else { + nativeBinding = require('${pkgName}-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(\`Unsupported architecture on macOS: \${arch}\`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`) + } + localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.freebsd-x64.node') + } else { + nativeBinding = require('${pkgName}-freebsd-x64') } } catch (e) { loadError = e - continue } - - loadError = null break - } - - if (!nativeBinding) { - if (loadError) { - throw loadError + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, '${localName}.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.linux-x64-musl.node') + } else { + nativeBinding = require('${pkgName}-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, '${localName}.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.linux-x64-gnu.node') + } else { + nativeBinding = require('${pkgName}-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, '${localName}.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.linux-arm64-musl.node') + } else { + nativeBinding = require('${pkgName}-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, '${localName}.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.linux-arm64-gnu.node') + } else { + nativeBinding = require('${pkgName}-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + localFileExisted = existsSync( + join(__dirname, '${localName}.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./${localName}.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('${pkgName}-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(\`Unsupported architecture on Linux: \${arch}\`) } - - throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) - } - - return nativeBinding + break + default: + throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`) } -export function createJsBinding(localName: string, pkgName: string): string { - return `${loadNapiModule.toString()} +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(\`Failed to load native binding\`) +} -module.exports = loadNapiModule('${localName}', '${pkgName}') ` }