@napi-rs/cli 3.0.0-alpha.3 → 3.0.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/api/artifacts.js +23 -7
  2. package/dist/api/artifacts.js.map +1 -0
  3. package/dist/api/build.d.ts +1 -1
  4. package/dist/api/build.js +184 -32
  5. package/dist/api/build.js.map +1 -0
  6. package/dist/api/create-npm-dirs.js +43 -7
  7. package/dist/api/create-npm-dirs.js.map +1 -0
  8. package/dist/api/new.js +47 -20
  9. package/dist/api/new.js.map +1 -0
  10. package/dist/api/pre-publish.js +10 -7
  11. package/dist/api/pre-publish.js.map +1 -0
  12. package/dist/api/rename.js +10 -1
  13. package/dist/api/rename.js.map +1 -0
  14. package/dist/api/templates/.gitignore.d.ts +1 -1
  15. package/dist/api/templates/.gitignore.js +2 -0
  16. package/dist/api/templates/.gitignore.js.map +1 -0
  17. package/dist/api/templates/.npmignore.js +1 -0
  18. package/dist/api/templates/.npmignore.js.map +1 -0
  19. package/dist/api/templates/build.rs.js +1 -0
  20. package/dist/api/templates/build.rs.js.map +1 -0
  21. package/dist/api/templates/cargo.toml.js +1 -0
  22. package/dist/api/templates/cargo.toml.js.map +1 -0
  23. package/dist/api/templates/ci-template.d.ts +2 -1
  24. package/dist/api/templates/ci-template.js +156 -157
  25. package/dist/api/templates/ci-template.js.map +1 -0
  26. package/dist/api/templates/ci.yml.d.ts +2 -1
  27. package/dist/api/templates/ci.yml.js +19 -4
  28. package/dist/api/templates/ci.yml.js.map +1 -0
  29. package/dist/api/templates/index.js +1 -0
  30. package/dist/api/templates/index.js.map +1 -0
  31. package/dist/api/templates/js-binding.d.ts +1 -1
  32. package/dist/api/templates/js-binding.js +320 -107
  33. package/dist/api/templates/js-binding.js.map +1 -0
  34. package/dist/api/templates/lib.rs.js +2 -4
  35. package/dist/api/templates/lib.rs.js.map +1 -0
  36. package/dist/api/templates/load-wasi-template.d.ts +1 -0
  37. package/dist/api/templates/load-wasi-template.js +78 -0
  38. package/dist/api/templates/load-wasi-template.js.map +1 -0
  39. package/dist/api/templates/package.json.d.ts +9 -2
  40. package/dist/api/templates/package.json.js +55 -28
  41. package/dist/api/templates/package.json.js.map +1 -0
  42. package/dist/api/templates/wasi-worker-template.d.ts +1 -0
  43. package/dist/api/templates/wasi-worker-template.js +53 -0
  44. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  45. package/dist/api/universalize.js +4 -3
  46. package/dist/api/universalize.js.map +1 -0
  47. package/dist/api/version.js +3 -2
  48. package/dist/api/version.js.map +1 -0
  49. package/dist/cli.js +1 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/commands/artifacts.js +3 -2
  52. package/dist/commands/artifacts.js.map +1 -0
  53. package/dist/commands/build.js +2 -1
  54. package/dist/commands/build.js.map +1 -0
  55. package/dist/commands/create-npm-dirs.js +1 -0
  56. package/dist/commands/create-npm-dirs.js.map +1 -0
  57. package/dist/commands/help.js +1 -0
  58. package/dist/commands/help.js.map +1 -0
  59. package/dist/commands/new.js +15 -7
  60. package/dist/commands/new.js.map +1 -0
  61. package/dist/commands/pre-publish.js +1 -0
  62. package/dist/commands/pre-publish.js.map +1 -0
  63. package/dist/commands/rename.js +1 -0
  64. package/dist/commands/rename.js.map +1 -0
  65. package/dist/commands/universalize.js +1 -0
  66. package/dist/commands/universalize.js.map +1 -0
  67. package/dist/commands/version.js +1 -0
  68. package/dist/commands/version.js.map +1 -0
  69. package/dist/def/artifacts.d.ts +21 -1
  70. package/dist/def/artifacts.js +11 -2
  71. package/dist/def/artifacts.js.map +1 -0
  72. package/dist/def/build.d.ts +32 -2
  73. package/dist/def/build.js +23 -2
  74. package/dist/def/build.js.map +1 -0
  75. package/dist/def/create-npm-dirs.d.ts +10 -0
  76. package/dist/def/create-npm-dirs.js +5 -0
  77. package/dist/def/create-npm-dirs.js.map +1 -0
  78. package/dist/def/new.d.ts +24 -6
  79. package/dist/def/new.js +12 -1
  80. package/dist/def/new.js.map +1 -0
  81. package/dist/def/pre-publish.d.ts +10 -0
  82. package/dist/def/pre-publish.js +8 -3
  83. package/dist/def/pre-publish.js.map +1 -0
  84. package/dist/def/rename.d.ts +11 -1
  85. package/dist/def/rename.js +6 -1
  86. package/dist/def/rename.js.map +1 -0
  87. package/dist/def/universalize.d.ts +10 -0
  88. package/dist/def/universalize.js +5 -0
  89. package/dist/def/universalize.js.map +1 -0
  90. package/dist/def/version.d.ts +10 -0
  91. package/dist/def/version.js +5 -0
  92. package/dist/def/version.js.map +1 -0
  93. package/dist/index.cjs +6020 -8093
  94. package/dist/index.d.ts +1 -0
  95. package/dist/index.js +2 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  98. package/dist/utils/__tests__/config.spec.js +63 -0
  99. package/dist/utils/__tests__/config.spec.js.map +1 -0
  100. package/dist/utils/__tests__/target.spec.js +1 -0
  101. package/dist/utils/__tests__/target.spec.js.map +1 -0
  102. package/dist/utils/__tests__/typegen.spec.js +9 -4
  103. package/dist/utils/__tests__/typegen.spec.js.map +1 -0
  104. package/dist/utils/__tests__/version.spec.js +1 -0
  105. package/dist/utils/__tests__/version.spec.js.map +1 -0
  106. package/dist/utils/cargo.js +2 -1
  107. package/dist/utils/cargo.js.map +1 -0
  108. package/dist/utils/ci.js +10 -0
  109. package/dist/utils/ci.js.map +1 -0
  110. package/dist/utils/config.d.ts +24 -5
  111. package/dist/utils/config.js +39 -6
  112. package/dist/utils/config.js.map +1 -0
  113. package/dist/utils/index.js +1 -0
  114. package/dist/utils/index.js.map +1 -0
  115. package/dist/utils/log.js +1 -0
  116. package/dist/utils/log.js.map +1 -0
  117. package/dist/utils/metadata.js +3 -2
  118. package/dist/utils/metadata.js.map +1 -0
  119. package/dist/utils/misc.d.ts +1 -1
  120. package/dist/utils/misc.js +4 -3
  121. package/dist/utils/misc.js.map +1 -0
  122. package/dist/utils/target.d.ts +9 -5
  123. package/dist/utils/target.js +20 -1
  124. package/dist/utils/target.js.map +1 -0
  125. package/dist/utils/typegen.d.ts +4 -1
  126. package/dist/utils/typegen.js +27 -6
  127. package/dist/utils/typegen.js.map +1 -0
  128. package/dist/utils/version.d.ts +2 -1
  129. package/dist/utils/version.js +13 -10
  130. package/dist/utils/version.js.map +1 -0
  131. package/package.json +50 -15
  132. package/src/api/artifacts.ts +53 -9
  133. package/src/api/build.ts +289 -39
  134. package/src/api/create-npm-dirs.ts +51 -7
  135. package/src/api/new.ts +69 -33
  136. package/src/api/pre-publish.ts +21 -12
  137. package/src/api/rename.ts +10 -1
  138. package/src/api/templates/.gitignore.ts +1 -0
  139. package/src/api/templates/ci-template.ts +157 -157
  140. package/src/api/templates/ci.yml.ts +19 -4
  141. package/src/api/templates/js-binding.ts +312 -102
  142. package/src/api/templates/lib.rs.ts +1 -4
  143. package/src/api/templates/load-wasi-template.ts +81 -0
  144. package/src/api/templates/package.json.ts +78 -27
  145. package/src/api/templates/wasi-worker-template.ts +52 -0
  146. package/src/api/universalize.ts +6 -3
  147. package/src/api/version.ts +5 -2
  148. package/src/commands/artifacts.ts +2 -2
  149. package/src/commands/build.ts +1 -1
  150. package/src/commands/new.ts +14 -8
  151. package/src/def/artifacts.ts +22 -3
  152. package/src/def/build.ts +51 -4
  153. package/src/def/create-npm-dirs.ts +9 -0
  154. package/src/def/new.ts +28 -3
  155. package/src/def/pre-publish.ts +12 -3
  156. package/src/def/rename.ts +11 -2
  157. package/src/def/universalize.ts +9 -0
  158. package/src/def/version.ts +9 -0
  159. package/src/index.ts +2 -0
  160. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  161. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  162. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +14 -0
  163. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  164. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +555 -0
  165. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  166. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +9 -8
  167. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  168. package/src/utils/__tests__/config.spec.ts +81 -0
  169. package/src/utils/__tests__/typegen.spec.ts +19 -4
  170. package/src/utils/cargo.ts +1 -1
  171. package/src/utils/ci.ts +9 -0
  172. package/src/utils/config.ts +84 -9
  173. package/src/utils/metadata.ts +2 -2
  174. package/src/utils/misc.ts +11 -3
  175. package/src/utils/target.ts +28 -7
  176. package/src/utils/typegen.ts +30 -5
  177. package/src/utils/version.ts +11 -9
  178. package/dist/def/commands/artifacts.d.ts +0 -15
  179. package/dist/def/commands/artifacts.js +0 -29
  180. package/dist/def/commands/build.d.ts +0 -53
  181. package/dist/def/commands/build.js +0 -105
  182. package/dist/def/commands/create-npm-dirs.d.ts +0 -15
  183. package/dist/def/commands/create-npm-dirs.js +0 -29
  184. package/dist/def/commands/new.d.ts +0 -27
  185. package/dist/def/commands/new.js +0 -53
  186. package/dist/def/commands/pre-publish.d.ts +0 -23
  187. package/dist/def/commands/pre-publish.js +0 -45
  188. package/dist/def/commands/rename.d.ts +0 -25
  189. package/dist/def/commands/rename.js +0 -49
  190. package/dist/def/commands/universalize.d.ts +0 -13
  191. package/dist/def/commands/universalize.js +0 -25
  192. package/dist/def/commands/version.d.ts +0 -13
  193. package/dist/def/commands/version.js +0 -25
  194. package/dist/def/options/artifacts.d.ts +0 -35
  195. package/dist/def/options/artifacts.js +0 -11
  196. package/dist/def/options/build.d.ts +0 -97
  197. package/dist/def/options/build.js +0 -3
  198. package/dist/def/options/create-npm-dirs.d.ts +0 -35
  199. package/dist/def/options/create-npm-dirs.js +0 -11
  200. package/dist/def/options/new.d.ts +0 -79
  201. package/dist/def/options/new.js +0 -15
  202. package/dist/def/options/pre-publish.d.ts +0 -65
  203. package/dist/def/options/pre-publish.js +0 -13
  204. package/dist/def/options/rename.d.ts +0 -75
  205. package/dist/def/options/rename.js +0 -11
  206. package/dist/def/options/universalize.d.ts +0 -28
  207. package/dist/def/options/universalize.js +0 -10
  208. package/dist/def/options/version.d.ts +0 -28
  209. package/dist/def/options/version.js +0 -10
@@ -2,6 +2,7 @@ import { load, dump } from 'js-yaml'
2
2
 
3
3
  import {
4
4
  NodeArchToCpu,
5
+ type SupportedPackageManager,
5
6
  UniArchsByPlatform,
6
7
  parseTriple,
7
8
  } from '../../utils/index.js'
@@ -15,11 +16,12 @@ const TEST_LINUX_X64_MUSL = 'test-linux-x64-musl-binding'
15
16
  const TEST_LINUX_AARCH64_GNU = 'test-linux-aarch64-gnu-binding'
16
17
  const TEST_LINUX_AARCH64_MUSL = 'test-linux-aarch64-musl-binding'
17
18
  const TEST_LINUX_ARM_GNUEABIHF = 'test-linux-arm-gnueabihf-binding'
19
+ const TEST_WASI = 'test-wasi-nodejs'
18
20
  const UNIVERSAL_MACOS = 'universal-macOS'
19
21
 
20
22
  export const createGithubActionsCIYml = (
21
- binaryName: string,
22
23
  targets: string[],
24
+ packageManager: SupportedPackageManager,
23
25
  ) => {
24
26
  const allTargets = new Set(
25
27
  targets.flatMap((t) => {
@@ -34,7 +36,7 @@ export const createGithubActionsCIYml = (
34
36
  }),
35
37
  )
36
38
 
37
- const fullTemplate = load(YAML()) as any
39
+ const fullTemplate = load(YAML(packageManager)) as any
38
40
 
39
41
  const requiredSteps = []
40
42
  const enableWindowsX86 = allTargets.has('x86_64-pc-windows-msvc')
@@ -46,6 +48,7 @@ export const createGithubActionsCIYml = (
46
48
  const enableLinuxArm7 = allTargets.has('armv7-unknown-linux-gnueabihf')
47
49
  const enableFreeBSD = allTargets.has('x86_64-unknown-freebsd')
48
50
  const enableMacOSUni = allTargets.has('universal-apple-darwin')
51
+ const enableWasi = allTargets.has('wasm32-wasi-preview1-threads')
49
52
  fullTemplate.jobs.build.strategy.matrix.settings =
50
53
  fullTemplate.jobs.build.strategy.matrix.settings.filter(
51
54
  ({ target }: { target: string }) => allTargets.has(target),
@@ -63,10 +66,16 @@ export const createGithubActionsCIYml = (
63
66
  if (!enableWindowsX86 && !enableMacOSX86) {
64
67
  delete fullTemplate.jobs[TEST_MACOS_WINDOWS]
65
68
  } else {
66
- const filterTarget = enableWindowsX86 ? 'macos-latest' : 'windows-latest'
69
+ const filterTargets = new Set<string>()
70
+ if (enableWindowsX86) {
71
+ filterTargets.add('windows-latest')
72
+ }
73
+ if (enableMacOSUni || enableMacOSX86) {
74
+ filterTargets.add('macos-latest')
75
+ }
67
76
  fullTemplate.jobs[TEST_MACOS_WINDOWS].strategy.matrix.settings =
68
77
  fullTemplate.jobs[TEST_MACOS_WINDOWS].strategy.matrix.settings.filter(
69
- ({ host }: { host: string; target: string }) => host !== filterTarget,
78
+ ({ host }: { host: string; target: string }) => filterTargets.has(host),
70
79
  )
71
80
 
72
81
  requiredSteps.push(TEST_MACOS_WINDOWS)
@@ -108,6 +117,12 @@ export const createGithubActionsCIYml = (
108
117
  requiredSteps.push(UNIVERSAL_MACOS)
109
118
  }
110
119
 
120
+ if (!enableWasi) {
121
+ delete fullTemplate.jobs[TEST_WASI]
122
+ } else {
123
+ requiredSteps.push(TEST_WASI)
124
+ }
125
+
111
126
  fullTemplate.jobs.publish.needs = requiredSteps
112
127
 
113
128
  return dump(fullTemplate, {
@@ -1,130 +1,340 @@
1
- /* eslint-disable @typescript-eslint/switch-exhaustiveness-check */
1
+ export function createCjsBinding(
2
+ localName: string,
3
+ pkgName: string,
4
+ idents: string[],
5
+ ): string {
6
+ return `// prettier-ignore
7
+ /* eslint-disable */
8
+ /* auto-generated by NAPI-RS */
2
9
 
3
- function loadNapiModule(binaryName: string, packageName: string) {
4
- const { existsSync, readFileSync } = require('fs')
5
- const { join } = require('path')
6
- const { platform, arch } = process
10
+ const { existsSync, readFileSync } = require('fs')
11
+ const { join } = require('path')
7
12
 
8
- const candidates: string[] = []
13
+ const { platform, arch } = process
9
14
 
10
- function isMusl() {
11
- // For Node 10
12
- if (!process.report || typeof process.report.getReport !== 'function') {
13
- try {
14
- const lddPath = require('child_process')
15
- .execSync('which ldd')
16
- .toString()
17
- .trim()
18
- return readFileSync(lddPath, 'utf8').includes('musl')
19
- } catch (e) {
20
- return true
21
- }
22
- } else {
23
- // @ts-expect-error
24
- const { glibcVersionRuntime } = process.report.getReport().header
25
- return !glibcVersionRuntime
15
+ let nativeBinding = null
16
+ let localFileExisted = false
17
+ let loadError = null
18
+
19
+ const isMusl = () => {
20
+ let musl = false
21
+ if (process.platform === 'linux') {
22
+ musl = isMuslFromFilesystem()
23
+ if (musl === null) {
24
+ musl = isMuslFromReport()
25
+ }
26
+ if (musl === null) {
27
+ musl = isMuslFromChildProcess()
26
28
  }
27
29
  }
30
+ return musl
31
+ }
28
32
 
29
- switch (platform) {
30
- case 'android':
31
- switch (arch) {
32
- case 'arm64':
33
- candidates.push('android-arm64')
34
- break
35
- case 'arm':
36
- candidates.push('android-arm-eabi')
37
- break
38
- }
39
- break
40
- case 'win32':
41
- switch (arch) {
42
- case 'x64':
43
- candidates.push('win32-x64-msvc')
44
- break
45
- case 'ia32':
46
- candidates.push('win32-ia32-msvc')
47
- break
48
- case 'arm64':
49
- candidates.push('win32-arm64-msvc')
50
- break
51
- }
52
- break
53
- case 'darwin':
54
- candidates.push('darwin-universal')
55
- switch (arch) {
56
- case 'x64':
57
- candidates.push('darwin-x64')
58
- break
59
- case 'arm64':
60
- candidates.push('darwin-arm64')
61
- break
62
- }
63
- break
64
- case 'freebsd':
65
- if (arch === 'x64') {
66
- candidates.push('freebsd-x64')
67
- }
68
- break
69
- case 'linux':
70
- switch (arch) {
71
- case 'x64':
72
- if (isMusl()) {
73
- candidates.push('linux-x64-musl')
33
+ const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
34
+
35
+ const isMuslFromFilesystem = () => {
36
+ try {
37
+ return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
38
+ } catch {
39
+ return null
40
+ }
41
+ }
42
+
43
+ const isMuslFromReport = () => {
44
+ const report = typeof process.report.getReport === 'function' ? process.report.getReport() : null
45
+ if (!report) {
46
+ return null
47
+ }
48
+ if (report.header && report.header.glibcVersionRuntime) {
49
+ return false
50
+ }
51
+ if (Array.isArray(report.sharedObjects)) {
52
+ if (report.sharedObjects.some(isFileMusl)) {
53
+ return true
54
+ }
55
+ }
56
+ return false
57
+ }
58
+
59
+ const isMuslFromChildProcess = () => {
60
+ try {
61
+ return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
62
+ } catch (e) {
63
+ // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
64
+ return false
65
+ }
66
+ }
67
+
68
+ switch (platform) {
69
+ case 'android':
70
+ switch (arch) {
71
+ case 'arm64':
72
+ localFileExisted = existsSync(join(__dirname, '${localName}.android-arm64.node'))
73
+ try {
74
+ if (localFileExisted) {
75
+ nativeBinding = require('./${localName}.android-arm64.node')
74
76
  } else {
75
- candidates.push('linux-x64-gnu')
77
+ nativeBinding = require('${pkgName}-android-arm64')
76
78
  }
77
- break
78
- case 'arm64':
79
- if (isMusl()) {
80
- candidates.push('linux-arm64-musl')
79
+ } catch (e) {
80
+ loadError = e
81
+ }
82
+ break
83
+ case 'arm':
84
+ localFileExisted = existsSync(join(__dirname, '${localName}.android-arm-eabi.node'))
85
+ try {
86
+ if (localFileExisted) {
87
+ nativeBinding = require('./${localName}.android-arm-eabi.node')
81
88
  } else {
82
- candidates.push('linux-arm64-gnu')
89
+ nativeBinding = require('${pkgName}-android-arm-eabi')
83
90
  }
84
- break
85
- case 'arm':
86
- candidates.push('linux-arm-gnueabihf')
87
- break
91
+ } catch (e) {
92
+ loadError = e
93
+ }
94
+ break
95
+ default:
96
+ throw new Error(\`Unsupported architecture on Android \${arch}\`)
97
+ }
98
+ break
99
+ case 'win32':
100
+ switch (arch) {
101
+ case 'x64':
102
+ localFileExisted = existsSync(
103
+ join(__dirname, '${localName}.win32-x64-msvc.node')
104
+ )
105
+ try {
106
+ if (localFileExisted) {
107
+ nativeBinding = require('./${localName}.win32-x64-msvc.node')
108
+ } else {
109
+ nativeBinding = require('${pkgName}-win32-x64-msvc')
110
+ }
111
+ } catch (e) {
112
+ loadError = e
113
+ }
114
+ break
115
+ case 'ia32':
116
+ localFileExisted = existsSync(
117
+ join(__dirname, '${localName}.win32-ia32-msvc.node')
118
+ )
119
+ try {
120
+ if (localFileExisted) {
121
+ nativeBinding = require('./${localName}.win32-ia32-msvc.node')
122
+ } else {
123
+ nativeBinding = require('${pkgName}-win32-ia32-msvc')
124
+ }
125
+ } catch (e) {
126
+ loadError = e
127
+ }
128
+ break
129
+ case 'arm64':
130
+ localFileExisted = existsSync(
131
+ join(__dirname, '${localName}.win32-arm64-msvc.node')
132
+ )
133
+ try {
134
+ if (localFileExisted) {
135
+ nativeBinding = require('./${localName}.win32-arm64-msvc.node')
136
+ } else {
137
+ nativeBinding = require('${pkgName}-win32-arm64-msvc')
138
+ }
139
+ } catch (e) {
140
+ loadError = e
141
+ }
142
+ break
143
+ default:
144
+ throw new Error(\`Unsupported architecture on Windows: \${arch}\`)
145
+ }
146
+ break
147
+ case 'darwin':
148
+ localFileExisted = existsSync(join(__dirname, '${localName}.darwin-universal.node'))
149
+ try {
150
+ if (localFileExisted) {
151
+ nativeBinding = require('./${localName}.darwin-universal.node')
152
+ } else {
153
+ nativeBinding = require('${pkgName}-darwin-universal')
88
154
  }
89
155
  break
90
- }
91
-
92
- let nativeBinding: any
93
- let loadError: any
94
-
95
- for (const suffix of candidates) {
96
- const localPath = join(__dirname, `${binaryName}.${suffix}.node`)
97
- const pkgPath = `${packageName}-${suffix}`
98
-
156
+ } catch {}
157
+ switch (arch) {
158
+ case 'x64':
159
+ localFileExisted = existsSync(join(__dirname, '${localName}.darwin-x64.node'))
160
+ try {
161
+ if (localFileExisted) {
162
+ nativeBinding = require('./${localName}.darwin-x64.node')
163
+ } else {
164
+ nativeBinding = require('${pkgName}-darwin-x64')
165
+ }
166
+ } catch (e) {
167
+ loadError = e
168
+ }
169
+ break
170
+ case 'arm64':
171
+ localFileExisted = existsSync(
172
+ join(__dirname, '${localName}.darwin-arm64.node')
173
+ )
174
+ try {
175
+ if (localFileExisted) {
176
+ nativeBinding = require('./${localName}.darwin-arm64.node')
177
+ } else {
178
+ nativeBinding = require('${pkgName}-darwin-arm64')
179
+ }
180
+ } catch (e) {
181
+ loadError = e
182
+ }
183
+ break
184
+ default:
185
+ throw new Error(\`Unsupported architecture on macOS: \${arch}\`)
186
+ }
187
+ break
188
+ case 'freebsd':
189
+ if (arch !== 'x64') {
190
+ throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`)
191
+ }
192
+ localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node'))
99
193
  try {
100
- if (existsSync(localPath)) {
101
- nativeBinding = require(localPath)
194
+ if (localFileExisted) {
195
+ nativeBinding = require('./${localName}.freebsd-x64.node')
102
196
  } else {
103
- nativeBinding = require(pkgPath)
197
+ nativeBinding = require('${pkgName}-freebsd-x64')
104
198
  }
105
199
  } catch (e) {
106
200
  loadError = e
107
- continue
108
201
  }
109
-
110
- loadError = null
111
202
  break
112
- }
203
+ case 'linux':
204
+ switch (arch) {
205
+ case 'x64':
206
+ if (isMusl()) {
207
+ localFileExisted = existsSync(
208
+ join(__dirname, '${localName}.linux-x64-musl.node')
209
+ )
210
+ try {
211
+ if (localFileExisted) {
212
+ nativeBinding = require('./${localName}.linux-x64-musl.node')
213
+ } else {
214
+ nativeBinding = require('${pkgName}-linux-x64-musl')
215
+ }
216
+ } catch (e) {
217
+ loadError = e
218
+ }
219
+ } else {
220
+ localFileExisted = existsSync(
221
+ join(__dirname, '${localName}.linux-x64-gnu.node')
222
+ )
223
+ try {
224
+ if (localFileExisted) {
225
+ nativeBinding = require('./${localName}.linux-x64-gnu.node')
226
+ } else {
227
+ nativeBinding = require('${pkgName}-linux-x64-gnu')
228
+ }
229
+ } catch (e) {
230
+ loadError = e
231
+ }
232
+ }
233
+ break
234
+ case 'arm64':
235
+ if (isMusl()) {
236
+ localFileExisted = existsSync(
237
+ join(__dirname, '${localName}.linux-arm64-musl.node')
238
+ )
239
+ try {
240
+ if (localFileExisted) {
241
+ nativeBinding = require('./${localName}.linux-arm64-musl.node')
242
+ } else {
243
+ nativeBinding = require('${pkgName}-linux-arm64-musl')
244
+ }
245
+ } catch (e) {
246
+ loadError = e
247
+ }
248
+ } else {
249
+ localFileExisted = existsSync(
250
+ join(__dirname, '${localName}.linux-arm64-gnu.node')
251
+ )
252
+ try {
253
+ if (localFileExisted) {
254
+ nativeBinding = require('./${localName}.linux-arm64-gnu.node')
255
+ } else {
256
+ nativeBinding = require('${pkgName}-linux-arm64-gnu')
257
+ }
258
+ } catch (e) {
259
+ loadError = e
260
+ }
261
+ }
262
+ break
263
+ case 'arm':
264
+ localFileExisted = existsSync(
265
+ join(__dirname, '${localName}.linux-arm-gnueabihf.node')
266
+ )
267
+ try {
268
+ if (localFileExisted) {
269
+ nativeBinding = require('./${localName}.linux-arm-gnueabihf.node')
270
+ } else {
271
+ nativeBinding = require('${pkgName}-linux-arm-gnueabihf')
272
+ }
273
+ } catch (e) {
274
+ loadError = e
275
+ }
276
+ break
277
+ case 'riscv64':
278
+ if (isMusl()) {
279
+ localFileExisted = existsSync(
280
+ join(__dirname, '${localName}.linux-riscv64-musl.node')
281
+ )
282
+ try {
283
+ if (localFileExisted) {
284
+ nativeBinding = require('./${localName}.linux-riscv64-musl.node')
285
+ } else {
286
+ nativeBinding = require('${pkgName}-linux-riscv64-musl')
287
+ }
288
+ } catch (e) {
289
+ loadError = e
290
+ }
291
+ } else {
292
+ localFileExisted = existsSync(
293
+ join(__dirname, '${localName}.linux-riscv64-gnu.node')
294
+ )
295
+ try {
296
+ if (localFileExisted) {
297
+ nativeBinding = require('./${localName}.linux-riscv64-gnu.node')
298
+ } else {
299
+ nativeBinding = require('${pkgName}-linux-riscv64-gnu')
300
+ }
301
+ } catch (e) {
302
+ loadError = e
303
+ }
304
+ }
305
+ break
306
+ default:
307
+ throw new Error(\`Unsupported architecture on Linux: \${arch}\`)
308
+ }
309
+ break
310
+ default:
311
+ throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
312
+ }
113
313
 
314
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
315
+ try {
316
+ nativeBinding = require('./${localName}.wasi.cjs')
317
+ } catch {
318
+ // ignore
319
+ }
114
320
  if (!nativeBinding) {
115
- if (loadError) {
116
- throw loadError
321
+ try {
322
+ nativeBinding = require('${pkgName}-wasm32-wasi')
323
+ } catch (err) {
324
+ console.error(err)
117
325
  }
118
-
119
- throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
120
326
  }
121
-
122
- return nativeBinding
123
327
  }
124
328
 
125
- export function createJsBinding(localName: string, pkgName: string): string {
126
- return `${loadNapiModule.toString()}
329
+ if (!nativeBinding) {
330
+ if (loadError) {
331
+ throw loadError
332
+ }
333
+ throw new Error(\`Failed to load native binding\`)
334
+ }
127
335
 
128
- module.exports = loadNapiModule('${localName}', '${pkgName}')
336
+ ${idents
337
+ .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
338
+ .join('\n')}
129
339
  `
130
340
  }
@@ -1,7 +1,4 @@
1
- export const createLibRs = () => `#![deny(clippy::all)]
2
-
3
- #[macro_use]
4
- extern crate napi_derive;
1
+ export const createLibRs = () => `use napi_derive::napi;
5
2
 
6
3
  #[napi]
7
4
  pub fn sum(a: i32, b: i32) -> i32 {
@@ -0,0 +1,81 @@
1
+ export const createWasiBinding = (
2
+ wasmFileName: string,
3
+ packageName: string,
4
+ wasiRegisterFunctions: string[],
5
+ ) => `/* eslint-disable */
6
+ /* prettier-ignore */
7
+
8
+ /* auto-generated by NAPI-RS */
9
+
10
+ const __nodeFs= require('node:fs')
11
+ const __nodePath = require('node:path')
12
+ const { WASI: __nodeWASI } = require('node:wasi')
13
+ const { Worker } = require('node:worker_threads')
14
+
15
+ const { instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync } = require('@emnapi/core')
16
+ const { getDefaultContext: __emnapiGetDefaultContext } = require('@emnapi/runtime')
17
+
18
+ const __wasi = new __nodeWASI({
19
+ version: 'preview1',
20
+ env: process.env,
21
+ preopens: {
22
+ '/': '/'
23
+ }
24
+ })
25
+
26
+ const __emnapiContext = __emnapiGetDefaultContext()
27
+
28
+ const __sharedMemory = new WebAssembly.Memory({
29
+ initial: 1024,
30
+ maximum: 10240,
31
+ shared: true,
32
+ })
33
+
34
+ let __wasmFilePath = __nodePath.join(__dirname, '${wasmFileName}.wasm')
35
+
36
+ if (!__nodeFs.existsSync(__wasmFilePath)) {
37
+ try {
38
+ __wasmFilePath = __nodePath.resolve('${packageName}-wasm32-wasi')
39
+ } catch {
40
+ throw new Error('Cannot find ${wasmFileName}.wasm file, and ${packageName}-wasm32-wasi package is not installed.')
41
+ }
42
+ }
43
+
44
+ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
45
+ context: __emnapiContext,
46
+ asyncWorkPoolSize: (function() {
47
+ const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
48
+ // NaN > 0 is false
49
+ if (threadsSizeFromEnv > 0) {
50
+ return threadsSizeFromEnv
51
+ } else {
52
+ return 4
53
+ }
54
+ })(),
55
+ wasi: __wasi,
56
+ onCreateWorker() {
57
+ return new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
58
+ env: process.env,
59
+ execArgv: ['--experimental-wasi-unstable-preview1'],
60
+ })
61
+ },
62
+ overwriteImports(importObject) {
63
+ importObject.env = {
64
+ ...importObject.env,
65
+ ...importObject.napi,
66
+ ...importObject.emnapi,
67
+ memory: __sharedMemory,
68
+ }
69
+ return importObject
70
+ },
71
+ beforeInit({ instance }) {
72
+ __napi_rs_initialize_modules(instance)
73
+ }
74
+ })
75
+
76
+ function __napi_rs_initialize_modules(__napiInstance) {
77
+ ${wasiRegisterFunctions
78
+ .map((name) => ` __napiInstance.exports['${name}']?.()`)
79
+ .join('\n')}
80
+ }
81
+ `