index.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. const { existsSync, readFileSync } = require('fs')
  2. const { join } = require('path')
  3. const { platform, arch } = process
  4. let nativeBinding = null
  5. let localFileExisted = false
  6. let loadError = null
  7. function isMusl() {
  8. // For Node 10
  9. if (!process.report || typeof process.report.getReport !== 'function') {
  10. try {
  11. const lddPath = require('child_process').execSync('which ldd').toString().trim()
  12. return readFileSync(lddPath, 'utf8').includes('musl')
  13. } catch (e) {
  14. return true
  15. }
  16. } else {
  17. const { glibcVersionRuntime } = process.report.getReport().header
  18. return !glibcVersionRuntime
  19. }
  20. }
  21. switch (platform) {
  22. case 'android':
  23. switch (arch) {
  24. case 'arm64':
  25. localFileExisted = existsSync(join(__dirname, 'package-template.android-arm64.node'))
  26. try {
  27. if (localFileExisted) {
  28. nativeBinding = require('./package-template.android-arm64.node')
  29. } else {
  30. nativeBinding = require('@napi-rs/package-template-android-arm64')
  31. }
  32. } catch (e) {
  33. loadError = e
  34. }
  35. break
  36. case 'arm':
  37. localFileExisted = existsSync(join(__dirname, 'package-template.android-arm-eabi.node'))
  38. try {
  39. if (localFileExisted) {
  40. nativeBinding = require('./package-template.android-arm-eabi.node')
  41. } else {
  42. nativeBinding = require('@napi-rs/package-template-android-arm-eabi')
  43. }
  44. } catch (e) {
  45. loadError = e
  46. }
  47. break
  48. default:
  49. throw new Error(`Unsupported architecture on Android ${arch}`)
  50. }
  51. break
  52. case 'win32':
  53. switch (arch) {
  54. case 'x64':
  55. localFileExisted = existsSync(join(__dirname, 'package-template.win32-x64-msvc.node'))
  56. try {
  57. if (localFileExisted) {
  58. nativeBinding = require('./package-template.win32-x64-msvc.node')
  59. } else {
  60. nativeBinding = require('@napi-rs/package-template-win32-x64-msvc')
  61. }
  62. } catch (e) {
  63. loadError = e
  64. }
  65. break
  66. case 'ia32':
  67. localFileExisted = existsSync(join(__dirname, 'package-template.win32-ia32-msvc.node'))
  68. try {
  69. if (localFileExisted) {
  70. nativeBinding = require('./package-template.win32-ia32-msvc.node')
  71. } else {
  72. nativeBinding = require('@napi-rs/package-template-win32-ia32-msvc')
  73. }
  74. } catch (e) {
  75. loadError = e
  76. }
  77. break
  78. case 'arm64':
  79. localFileExisted = existsSync(join(__dirname, 'package-template.win32-arm64-msvc.node'))
  80. try {
  81. if (localFileExisted) {
  82. nativeBinding = require('./package-template.win32-arm64-msvc.node')
  83. } else {
  84. nativeBinding = require('@napi-rs/package-template-win32-arm64-msvc')
  85. }
  86. } catch (e) {
  87. loadError = e
  88. }
  89. break
  90. default:
  91. throw new Error(`Unsupported architecture on Windows: ${arch}`)
  92. }
  93. break
  94. case 'darwin':
  95. switch (arch) {
  96. case 'x64':
  97. localFileExisted = existsSync(join(__dirname, 'package-template.darwin-x64.node'))
  98. try {
  99. if (localFileExisted) {
  100. nativeBinding = require('./package-template.darwin-x64.node')
  101. } else {
  102. nativeBinding = require('@napi-rs/package-template-darwin-x64')
  103. }
  104. } catch (e) {
  105. loadError = e
  106. }
  107. break
  108. case 'arm64':
  109. localFileExisted = existsSync(join(__dirname, 'package-template.darwin-arm64.node'))
  110. try {
  111. if (localFileExisted) {
  112. nativeBinding = require('./package-template.darwin-arm64.node')
  113. } else {
  114. nativeBinding = require('@napi-rs/package-template-darwin-arm64')
  115. }
  116. } catch (e) {
  117. loadError = e
  118. }
  119. break
  120. default:
  121. throw new Error(`Unsupported architecture on macOS: ${arch}`)
  122. }
  123. break
  124. case 'freebsd':
  125. if (arch !== 'x64') {
  126. throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
  127. }
  128. localFileExisted = existsSync(join(__dirname, 'package-template.freebsd-x64.node'))
  129. try {
  130. if (localFileExisted) {
  131. nativeBinding = require('./package-template.freebsd-x64.node')
  132. } else {
  133. nativeBinding = require('@napi-rs/package-template-freebsd-x64')
  134. }
  135. } catch (e) {
  136. loadError = e
  137. }
  138. break
  139. case 'linux':
  140. switch (arch) {
  141. case 'x64':
  142. if (isMusl()) {
  143. localFileExisted = existsSync(join(__dirname, 'package-template.linux-x64-musl.node'))
  144. try {
  145. if (localFileExisted) {
  146. nativeBinding = require('./package-template.linux-x64-musl.node')
  147. } else {
  148. nativeBinding = require('@napi-rs/package-template-linux-x64-musl')
  149. }
  150. } catch (e) {
  151. loadError = e
  152. }
  153. } else {
  154. localFileExisted = existsSync(join(__dirname, 'package-template.linux-x64-gnu.node'))
  155. try {
  156. if (localFileExisted) {
  157. nativeBinding = require('./package-template.linux-x64-gnu.node')
  158. } else {
  159. nativeBinding = require('@napi-rs/package-template-linux-x64-gnu')
  160. }
  161. } catch (e) {
  162. loadError = e
  163. }
  164. }
  165. break
  166. case 'arm64':
  167. if (isMusl()) {
  168. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm64-musl.node'))
  169. try {
  170. if (localFileExisted) {
  171. nativeBinding = require('./package-template.linux-arm64-musl.node')
  172. } else {
  173. nativeBinding = require('@napi-rs/package-template-linux-arm64-musl')
  174. }
  175. } catch (e) {
  176. loadError = e
  177. }
  178. } else {
  179. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm64-gnu.node'))
  180. try {
  181. if (localFileExisted) {
  182. nativeBinding = require('./package-template.linux-arm64-gnu.node')
  183. } else {
  184. nativeBinding = require('@napi-rs/package-template-linux-arm64-gnu')
  185. }
  186. } catch (e) {
  187. loadError = e
  188. }
  189. }
  190. break
  191. case 'arm':
  192. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm-gnueabihf.node'))
  193. try {
  194. if (localFileExisted) {
  195. nativeBinding = require('./package-template.linux-arm-gnueabihf.node')
  196. } else {
  197. nativeBinding = require('@napi-rs/package-template-linux-arm-gnueabihf')
  198. }
  199. } catch (e) {
  200. loadError = e
  201. }
  202. break
  203. default:
  204. throw new Error(`Unsupported architecture on Linux: ${arch}`)
  205. }
  206. break
  207. default:
  208. throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
  209. }
  210. if (!nativeBinding) {
  211. if (loadError) {
  212. throw loadError
  213. }
  214. throw new Error(`Failed to load native binding`)
  215. }
  216. const { plus100 } = nativeBinding
  217. module.exports.plus100 = plus100