@napi-rs/cli 3.0.0-alpha.2 → 3.0.0-alpha.21

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 (201) hide show
  1. package/dist/api/artifacts.js +5 -2
  2. package/dist/api/artifacts.js.map +1 -0
  3. package/dist/api/build.d.ts +1 -1
  4. package/dist/api/build.js +182 -32
  5. package/dist/api/build.js.map +1 -0
  6. package/dist/api/create-npm-dirs.js +3 -2
  7. package/dist/api/create-npm-dirs.js.map +1 -0
  8. package/dist/api/load-wasi-template.d.ts +1 -0
  9. package/dist/api/load-wasi-template.js +60 -0
  10. package/dist/api/load-wasi-template.js.map +1 -0
  11. package/dist/api/new.js +31 -12
  12. package/dist/api/new.js.map +1 -0
  13. package/dist/api/pre-publish.js +4 -3
  14. package/dist/api/pre-publish.js.map +1 -0
  15. package/dist/api/rename.js +9 -0
  16. package/dist/api/rename.js.map +1 -0
  17. package/dist/api/templates/.gitignore.d.ts +1 -1
  18. package/dist/api/templates/.gitignore.js +2 -0
  19. package/dist/api/templates/.gitignore.js.map +1 -0
  20. package/dist/api/templates/.npmignore.js +1 -0
  21. package/dist/api/templates/.npmignore.js.map +1 -0
  22. package/dist/api/templates/build.rs.js +1 -0
  23. package/dist/api/templates/build.rs.js.map +1 -0
  24. package/dist/api/templates/cargo.toml.js +1 -0
  25. package/dist/api/templates/cargo.toml.js.map +1 -0
  26. package/dist/api/templates/ci-template.js +64 -57
  27. package/dist/api/templates/ci-template.js.map +1 -0
  28. package/dist/api/templates/ci.yml.d.ts +1 -1
  29. package/dist/api/templates/ci.yml.js +10 -3
  30. package/dist/api/templates/ci.yml.js.map +1 -0
  31. package/dist/api/templates/index.js +1 -0
  32. package/dist/api/templates/index.js.map +1 -0
  33. package/dist/api/templates/js-binding.d.ts +1 -1
  34. package/dist/api/templates/js-binding.js +306 -108
  35. package/dist/api/templates/js-binding.js.map +1 -0
  36. package/dist/api/templates/lib.rs.js +2 -4
  37. package/dist/api/templates/lib.rs.js.map +1 -0
  38. package/dist/api/templates/package.json.js +30 -28
  39. package/dist/api/templates/package.json.js.map +1 -0
  40. package/dist/api/universalize.js +2 -1
  41. package/dist/api/universalize.js.map +1 -0
  42. package/dist/api/version.js +2 -1
  43. package/dist/api/version.js.map +1 -0
  44. package/dist/api/wasi-worker-template.d.ts +1 -0
  45. package/dist/api/wasi-worker-template.js +53 -0
  46. package/dist/api/wasi-worker-template.js.map +1 -0
  47. package/dist/cli.js +1 -0
  48. package/dist/cli.js.map +1 -0
  49. package/dist/commands/artifacts.js +1 -0
  50. package/dist/commands/artifacts.js.map +1 -0
  51. package/dist/commands/build.js +1 -0
  52. package/dist/commands/build.js.map +1 -0
  53. package/dist/commands/create-npm-dirs.js +1 -0
  54. package/dist/commands/create-npm-dirs.js.map +1 -0
  55. package/dist/commands/help.js +1 -0
  56. package/dist/commands/help.js.map +1 -0
  57. package/dist/commands/new.js +2 -4
  58. package/dist/commands/new.js.map +1 -0
  59. package/dist/commands/pre-publish.js +1 -0
  60. package/dist/commands/pre-publish.js.map +1 -0
  61. package/dist/commands/rename.js +1 -0
  62. package/dist/commands/rename.js.map +1 -0
  63. package/dist/commands/universalize.js +1 -0
  64. package/dist/commands/universalize.js.map +1 -0
  65. package/dist/commands/version.js +1 -0
  66. package/dist/commands/version.js.map +1 -0
  67. package/dist/def/artifacts.d.ts +11 -1
  68. package/dist/def/artifacts.js +7 -2
  69. package/dist/def/artifacts.js.map +1 -0
  70. package/dist/def/build.d.ts +32 -2
  71. package/dist/def/build.js +23 -2
  72. package/dist/def/build.js.map +1 -0
  73. package/dist/def/create-npm-dirs.d.ts +10 -0
  74. package/dist/def/create-npm-dirs.js +5 -0
  75. package/dist/def/create-npm-dirs.js.map +1 -0
  76. package/dist/def/new.d.ts +2 -2
  77. package/dist/def/new.js +1 -0
  78. package/dist/def/new.js.map +1 -0
  79. package/dist/def/pre-publish.d.ts +10 -0
  80. package/dist/def/pre-publish.js +7 -2
  81. package/dist/def/pre-publish.js.map +1 -0
  82. package/dist/def/rename.d.ts +11 -1
  83. package/dist/def/rename.js +6 -1
  84. package/dist/def/rename.js.map +1 -0
  85. package/dist/def/universalize.d.ts +10 -0
  86. package/dist/def/universalize.js +5 -0
  87. package/dist/def/universalize.js.map +1 -0
  88. package/dist/def/version.d.ts +10 -0
  89. package/dist/def/version.js +5 -0
  90. package/dist/def/version.js.map +1 -0
  91. package/dist/index.cjs +3424 -8044
  92. package/dist/index.d.ts +1 -0
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  96. package/dist/utils/__tests__/config.spec.js +63 -0
  97. package/dist/utils/__tests__/config.spec.js.map +1 -0
  98. package/dist/utils/__tests__/target.spec.js +1 -0
  99. package/dist/utils/__tests__/target.spec.js.map +1 -0
  100. package/dist/utils/__tests__/typegen.spec.js +9 -4
  101. package/dist/utils/__tests__/typegen.spec.js.map +1 -0
  102. package/dist/utils/__tests__/version.spec.js +1 -0
  103. package/dist/utils/__tests__/version.spec.js.map +1 -0
  104. package/dist/utils/cargo.js +1 -0
  105. package/dist/utils/cargo.js.map +1 -0
  106. package/dist/utils/ci.js +10 -0
  107. package/dist/utils/ci.js.map +1 -0
  108. package/dist/utils/config.d.ts +16 -5
  109. package/dist/utils/config.js +37 -6
  110. package/dist/utils/config.js.map +1 -0
  111. package/dist/utils/index.js +1 -0
  112. package/dist/utils/index.js.map +1 -0
  113. package/dist/utils/log.js +1 -0
  114. package/dist/utils/log.js.map +1 -0
  115. package/dist/utils/metadata.js +1 -0
  116. package/dist/utils/metadata.js.map +1 -0
  117. package/dist/utils/misc.js +1 -0
  118. package/dist/utils/misc.js.map +1 -0
  119. package/dist/utils/target.d.ts +6 -5
  120. package/dist/utils/target.js +15 -1
  121. package/dist/utils/target.js.map +1 -0
  122. package/dist/utils/typegen.d.ts +4 -1
  123. package/dist/utils/typegen.js +27 -6
  124. package/dist/utils/typegen.js.map +1 -0
  125. package/dist/utils/version.d.ts +2 -1
  126. package/dist/utils/version.js +13 -10
  127. package/dist/utils/version.js.map +1 -0
  128. package/package.json +48 -15
  129. package/src/api/artifacts.ts +7 -4
  130. package/src/api/build.ts +283 -39
  131. package/src/api/create-npm-dirs.ts +5 -2
  132. package/src/api/load-wasi-template.ts +62 -0
  133. package/src/api/new.ts +37 -14
  134. package/src/api/pre-publish.ts +14 -8
  135. package/src/api/rename.ts +9 -0
  136. package/src/api/templates/.gitignore.ts +1 -0
  137. package/src/api/templates/ci-template.ts +63 -57
  138. package/src/api/templates/ci.yml.ts +9 -6
  139. package/src/api/templates/js-binding.ts +299 -104
  140. package/src/api/templates/lib.rs.ts +1 -4
  141. package/src/api/templates/package.json.ts +31 -27
  142. package/src/api/universalize.ts +4 -1
  143. package/src/api/version.ts +4 -1
  144. package/src/api/wasi-worker-template.ts +52 -0
  145. package/src/commands/new.ts +1 -5
  146. package/src/def/artifacts.ts +12 -3
  147. package/src/def/build.ts +51 -4
  148. package/src/def/create-npm-dirs.ts +9 -0
  149. package/src/def/new.ts +1 -1
  150. package/src/def/pre-publish.ts +11 -2
  151. package/src/def/rename.ts +11 -2
  152. package/src/def/universalize.ts +9 -0
  153. package/src/def/version.ts +9 -0
  154. package/src/index.ts +2 -0
  155. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  156. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  157. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +7 -0
  158. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  159. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +555 -0
  160. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  161. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +9 -8
  162. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  163. package/src/utils/__tests__/config.spec.ts +81 -0
  164. package/src/utils/__tests__/typegen.spec.ts +19 -4
  165. package/src/utils/ci.ts +9 -0
  166. package/src/utils/config.ts +64 -9
  167. package/src/utils/target.ts +22 -8
  168. package/src/utils/typegen.ts +30 -5
  169. package/src/utils/version.ts +11 -9
  170. package/dist/def/commands/artifacts.d.ts +0 -15
  171. package/dist/def/commands/artifacts.js +0 -29
  172. package/dist/def/commands/build.d.ts +0 -53
  173. package/dist/def/commands/build.js +0 -105
  174. package/dist/def/commands/create-npm-dirs.d.ts +0 -15
  175. package/dist/def/commands/create-npm-dirs.js +0 -29
  176. package/dist/def/commands/new.d.ts +0 -27
  177. package/dist/def/commands/new.js +0 -53
  178. package/dist/def/commands/pre-publish.d.ts +0 -23
  179. package/dist/def/commands/pre-publish.js +0 -45
  180. package/dist/def/commands/rename.d.ts +0 -25
  181. package/dist/def/commands/rename.js +0 -49
  182. package/dist/def/commands/universalize.d.ts +0 -13
  183. package/dist/def/commands/universalize.js +0 -25
  184. package/dist/def/commands/version.d.ts +0 -13
  185. package/dist/def/commands/version.js +0 -25
  186. package/dist/def/options/artifacts.d.ts +0 -35
  187. package/dist/def/options/artifacts.js +0 -11
  188. package/dist/def/options/build.d.ts +0 -97
  189. package/dist/def/options/build.js +0 -3
  190. package/dist/def/options/create-npm-dirs.d.ts +0 -35
  191. package/dist/def/options/create-npm-dirs.js +0 -11
  192. package/dist/def/options/new.d.ts +0 -79
  193. package/dist/def/options/new.js +0 -15
  194. package/dist/def/options/pre-publish.d.ts +0 -65
  195. package/dist/def/options/pre-publish.js +0 -13
  196. package/dist/def/options/rename.d.ts +0 -75
  197. package/dist/def/options/rename.js +0 -11
  198. package/dist/def/options/universalize.d.ts +0 -28
  199. package/dist/def/options/universalize.js +0 -10
  200. package/dist/def/options/version.d.ts +0 -28
  201. package/dist/def/options/version.js +0 -10
@@ -1,130 +1,325 @@
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')
76
+ } else {
77
+ nativeBinding = require('${pkgName}-android-arm64')
78
+ }
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')
88
+ } else {
89
+ nativeBinding = require('${pkgName}-android-arm-eabi')
90
+ }
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')
74
108
  } else {
75
- candidates.push('linux-x64-gnu')
109
+ nativeBinding = require('${pkgName}-win32-x64-msvc')
76
110
  }
77
- break
78
- case 'arm64':
79
- if (isMusl()) {
80
- candidates.push('linux-arm64-musl')
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')
81
122
  } else {
82
- candidates.push('linux-arm64-gnu')
123
+ nativeBinding = require('${pkgName}-win32-ia32-msvc')
83
124
  }
84
- break
85
- case 'arm':
86
- candidates.push('linux-arm-gnueabihf')
87
- break
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
- }
113
-
114
- if (!nativeBinding) {
115
- if (loadError) {
116
- throw loadError
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}\`)
117
308
  }
309
+ break
310
+ default:
311
+ throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
312
+ }
118
313
 
119
- throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
314
+ if (!nativeBinding) {
315
+ if (loadError) {
316
+ throw loadError
120
317
  }
121
-
122
- return nativeBinding
318
+ throw new Error(\`Failed to load native binding\`)
123
319
  }
124
320
 
125
- export function createJsBinding(localName: string, pkgName: string): string {
126
- return `${loadNapiModule.toString()}
127
-
128
- module.exports = loadNapiModule('${localName}', '${pkgName}')
321
+ ${idents
322
+ .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
323
+ .join('\n')}
129
324
  `
130
325
  }
@@ -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 {
@@ -1,3 +1,5 @@
1
+ import { CommonPackageJsonFields } from '../../utils/config.js'
2
+
1
3
  export const createPackageJson = ({
2
4
  name,
3
5
  binaryName,
@@ -13,32 +15,34 @@ export const createPackageJson = ({
13
15
  engineRequirement: string
14
16
  cliVersion: string
15
17
  }) => {
16
- return `{
17
- "name": "${name}",
18
- "version": "1.0.0",
19
- "main": "index.js",
20
- "types": "index.d.ts",
21
- "license": "${license}",
22
- "engines": {
23
- "node": "${engineRequirement}"
24
- },
25
- "napi": {
26
- "binaryName": "${binaryName}",
27
- "targets": [
28
- ${targets.map((t) => `"${t}"`).join(',\n ')}
29
- ]
30
- },
31
- "scripts": {
32
- "test": "yarn build:debug --platform && node -e \\"assert(require('.').sum(1, 2) === 3)\\"",
33
- "build": "napi build --release --platform --strip",
34
- "build:debug": "napi build",
35
- "prepublishOnly": "napi prepublish -t npm",
36
- "artifacts": "napi artifacts",
37
- "universal": "napi universal",
38
- "version": "napi version"
39
- },
40
- "devDependencies": {
41
- "@napi-rs/cli": "^${cliVersion}"
18
+ const content: CommonPackageJsonFields = {
19
+ name,
20
+ version: '1.0.0',
21
+ license,
22
+ engines: {
23
+ node: engineRequirement,
24
+ },
25
+ type: 'commonjs',
26
+ main: 'index.js',
27
+ types: 'index.d.ts',
28
+ module: undefined,
29
+ exports: undefined,
30
+ napi: {
31
+ binaryName,
32
+ targets,
33
+ },
34
+ scripts: {
35
+ test: 'node -e "assert(require(\'.\').sum(1, 2) === 3)"',
36
+ build: 'napi build --release --platform --strip',
37
+ 'build:debug': 'napi build',
38
+ prepublishOnly: 'napi prepublish -t npm',
39
+ artifacts: 'napi artifacts',
40
+ version: 'napi version',
41
+ },
42
+ devDependencies: {
43
+ '@napi-rs/cli': `^${cliVersion}`,
44
+ },
42
45
  }
43
- }`
46
+
47
+ return JSON.stringify(content, null, 2)
44
48
  }
@@ -27,7 +27,10 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
27
27
 
28
28
  const packageJsonPath = join(options.cwd, options.packageJsonPath)
29
29
 
30
- const config = await readNapiConfig(packageJsonPath)
30
+ const config = await readNapiConfig(
31
+ packageJsonPath,
32
+ options.configPath ? resolve(options.cwd, options.configPath) : undefined,
33
+ )
31
34
 
32
35
  const target = config.targets.find(
33
36
  (t) => t.platform === process.platform && t.arch === 'universal',
@@ -13,7 +13,10 @@ export async function version(userOptions: VersionOptions) {
13
13
  const options = applyDefaultVersionOptions(userOptions)
14
14
  const packageJsonPath = resolve(options.cwd, options.packageJsonPath)
15
15
 
16
- const config = await readNapiConfig(packageJsonPath)
16
+ const config = await readNapiConfig(
17
+ packageJsonPath,
18
+ options.configPath ? resolve(options.cwd, options.configPath) : undefined,
19
+ )
17
20
 
18
21
  for (const target of config.targets) {
19
22
  const pkgDir = resolve(options.cwd, options.npmDir, target.platformArchABI)
@@ -0,0 +1,52 @@
1
+ export const WASI_WORKER_TEMPLATE = `import fs from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { parentPort, Worker } from "node:worker_threads";
4
+
5
+ import { instantiateNapiModuleSync, MessageHandler } from "@emnapi/core";
6
+ import { WASI } from "@tybys/wasm-util";
7
+
8
+ const require = createRequire(import.meta.url);
9
+
10
+ if (parentPort) {
11
+ parentPort.on("message", (data) => {
12
+ globalThis.onmessage({ data });
13
+ });
14
+ }
15
+
16
+ Object.assign(globalThis, {
17
+ self: globalThis,
18
+ require,
19
+ Worker,
20
+ importScripts: function (f) {
21
+ ;(0, eval)(fs.readFileSync(f, "utf8") + "//# sourceURL=" + f);
22
+ },
23
+ postMessage: function (msg) {
24
+ if (parentPort) {
25
+ parentPort.postMessage(msg);
26
+ }
27
+ },
28
+ });
29
+
30
+ const handler = new MessageHandler({
31
+ onLoad({ wasmModule, wasmMemory }) {
32
+ const wasi = new WASI({ fs });
33
+
34
+ return instantiateNapiModuleSync(wasmModule, {
35
+ childThread: true,
36
+ wasi,
37
+ overwriteImports(importObject) {
38
+ importObject.env = {
39
+ ...importObject.env,
40
+ ...importObject.napi,
41
+ ...importObject.emnapi,
42
+ memory: wasmMemory
43
+ };
44
+ },
45
+ });
46
+ },
47
+ });
48
+
49
+ globalThis.onmessage = function (e) {
50
+ handler.handle(e);
51
+ };
52
+ `
@@ -94,10 +94,6 @@ export class NewCommand extends BaseNewCommand {
94
94
  }
95
95
 
96
96
  private async fetchTargets(): Promise<TargetTriple[]> {
97
- if (this.enableDefaultTargets) {
98
- return DEFAULT_TARGETS.concat()
99
- }
100
-
101
97
  if (this.enableAllTargets) {
102
98
  return AVAILABLE_TARGETS.concat()
103
99
  }
@@ -107,7 +103,7 @@ export class NewCommand extends BaseNewCommand {
107
103
  type: 'checkbox',
108
104
  loop: false,
109
105
  message: 'Choose target(s) your crate will be compiled to',
110
- default: DEFAULT_TARGETS,
106
+ default: this.enableDefaultTargets ? DEFAULT_TARGETS : [],
111
107
  choices: AVAILABLE_TARGETS,
112
108
  })
113
109
 
@@ -15,11 +15,15 @@ export abstract class BaseArtifactsCommand extends Command {
15
15
  'The working directory of where napi command will be executed in, all other paths options are relative to this path',
16
16
  })
17
17
 
18
+ configPath?: string = Option.String('--config-path,-c', {
19
+ description: 'Path to `napi` config json file',
20
+ })
21
+
18
22
  packageJsonPath = Option.String('--package-json-path', 'package.json', {
19
23
  description: 'Path to `package.json`',
20
24
  })
21
25
 
22
- outputDir = Option.String('--output-dir,-o', './', {
26
+ outputDir = Option.String('--output-dir,-o', './artifacts', {
23
27
  description:
24
28
  'Path to the folder where all built `.node` files put, same as `--output-dir` of build command',
25
29
  })
@@ -31,6 +35,7 @@ export abstract class BaseArtifactsCommand extends Command {
31
35
  getOptions() {
32
36
  return {
33
37
  cwd: this.cwd,
38
+ configPath: this.configPath,
34
39
  packageJsonPath: this.packageJsonPath,
35
40
  outputDir: this.outputDir,
36
41
  npmDir: this.npmDir,
@@ -48,6 +53,10 @@ export interface ArtifactsOptions {
48
53
  * @default process.cwd()
49
54
  */
50
55
  cwd?: string
56
+ /**
57
+ * Path to `napi` config json file
58
+ */
59
+ configPath?: string
51
60
  /**
52
61
  * Path to `package.json`
53
62
  *
@@ -57,7 +66,7 @@ export interface ArtifactsOptions {
57
66
  /**
58
67
  * Path to the folder where all built `.node` files put, same as `--output-dir` of build command
59
68
  *
60
- * @default './'
69
+ * @default './artifacts'
61
70
  */
62
71
  outputDir?: string
63
72
  /**
@@ -72,7 +81,7 @@ export function applyDefaultArtifactsOptions(options: ArtifactsOptions) {
72
81
  return {
73
82
  cwd: process.cwd(),
74
83
  packageJsonPath: 'package.json',
75
- outputDir: './',
84
+ outputDir: './artifacts',
76
85
  npmDir: 'npm',
77
86
  ...options,
78
87
  }