@napi-rs/cli 3.0.0-alpha.7 → 3.0.0-alpha.71

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 (160) hide show
  1. package/cli.mjs +1 -1
  2. package/dist/api/artifacts.js +28 -7
  3. package/dist/api/artifacts.js.map +1 -1
  4. package/dist/api/build.js +247 -47
  5. package/dist/api/build.js.map +1 -1
  6. package/dist/api/create-npm-dirs.js +46 -9
  7. package/dist/api/create-npm-dirs.js.map +1 -1
  8. package/dist/api/new.js +57 -20
  9. package/dist/api/new.js.map +1 -1
  10. package/dist/api/pre-publish.js +9 -7
  11. package/dist/api/pre-publish.js.map +1 -1
  12. package/dist/api/rename.js +9 -1
  13. package/dist/api/rename.js.map +1 -1
  14. package/dist/api/templates/cargo.toml.js +1 -0
  15. package/dist/api/templates/cargo.toml.js.map +1 -1
  16. package/dist/api/templates/ci-template.d.ts +3 -1
  17. package/dist/api/templates/ci-template.js +144 -131
  18. package/dist/api/templates/ci-template.js.map +1 -1
  19. package/dist/api/templates/ci.yml.d.ts +3 -1
  20. package/dist/api/templates/ci.yml.js +21 -5
  21. package/dist/api/templates/ci.yml.js.map +1 -1
  22. package/dist/api/templates/js-binding.d.ts +1 -0
  23. package/dist/api/templates/js-binding.js +135 -221
  24. package/dist/api/templates/js-binding.js.map +1 -1
  25. package/dist/api/templates/lib.rs.js +1 -4
  26. package/dist/api/templates/lib.rs.js.map +1 -1
  27. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  28. package/dist/api/templates/load-wasi-template.js +166 -0
  29. package/dist/api/templates/load-wasi-template.js.map +1 -0
  30. package/dist/api/templates/package.json.d.ts +9 -2
  31. package/dist/api/templates/package.json.js +26 -4
  32. package/dist/api/templates/package.json.js.map +1 -1
  33. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  34. package/dist/api/templates/wasi-worker-template.js +122 -0
  35. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  36. package/dist/api/universalize.js +5 -5
  37. package/dist/api/universalize.js.map +1 -1
  38. package/dist/api/version.js +2 -2
  39. package/dist/api/version.js.map +1 -1
  40. package/dist/commands/artifacts.js +2 -2
  41. package/dist/commands/artifacts.js.map +1 -1
  42. package/dist/commands/build.js +1 -1
  43. package/dist/commands/build.js.map +1 -1
  44. package/dist/commands/new.js +34 -34
  45. package/dist/commands/new.js.map +1 -1
  46. package/dist/def/artifacts.d.ts +21 -1
  47. package/dist/def/artifacts.js +10 -2
  48. package/dist/def/artifacts.js.map +1 -1
  49. package/dist/def/build.d.ts +155 -4
  50. package/dist/def/build.js +30 -4
  51. package/dist/def/build.js.map +1 -1
  52. package/dist/def/create-npm-dirs.d.ts +10 -0
  53. package/dist/def/create-npm-dirs.js +4 -0
  54. package/dist/def/create-npm-dirs.js.map +1 -1
  55. package/dist/def/new.d.ts +25 -7
  56. package/dist/def/new.js +11 -1
  57. package/dist/def/new.js.map +1 -1
  58. package/dist/def/pre-publish.d.ts +12 -2
  59. package/dist/def/pre-publish.js +7 -3
  60. package/dist/def/pre-publish.js.map +1 -1
  61. package/dist/def/rename.d.ts +16 -6
  62. package/dist/def/rename.js +5 -1
  63. package/dist/def/rename.js.map +1 -1
  64. package/dist/def/universalize.d.ts +10 -0
  65. package/dist/def/universalize.js +4 -0
  66. package/dist/def/universalize.js.map +1 -1
  67. package/dist/def/version.d.ts +10 -0
  68. package/dist/def/version.js +4 -0
  69. package/dist/def/version.js.map +1 -1
  70. package/dist/index.cjs +8146 -14672
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  75. package/dist/utils/__tests__/config.spec.js +63 -0
  76. package/dist/utils/__tests__/config.spec.js.map +1 -0
  77. package/dist/utils/__tests__/typegen.spec.js +8 -4
  78. package/dist/utils/__tests__/typegen.spec.js.map +1 -1
  79. package/dist/utils/cargo.js +2 -2
  80. package/dist/utils/cargo.js.map +1 -1
  81. package/dist/utils/config.d.ts +48 -4
  82. package/dist/utils/config.js +37 -5
  83. package/dist/utils/config.js.map +1 -1
  84. package/dist/utils/index.d.ts +0 -1
  85. package/dist/utils/index.js +0 -1
  86. package/dist/utils/index.js.map +1 -1
  87. package/dist/utils/metadata.js +2 -2
  88. package/dist/utils/metadata.js.map +1 -1
  89. package/dist/utils/misc.d.ts +1 -2
  90. package/dist/utils/misc.js +3 -3
  91. package/dist/utils/misc.js.map +1 -1
  92. package/dist/utils/target.d.ts +7 -5
  93. package/dist/utils/target.js +17 -3
  94. package/dist/utils/target.js.map +1 -1
  95. package/dist/utils/typegen.d.ts +1 -1
  96. package/dist/utils/typegen.js +51 -17
  97. package/dist/utils/typegen.js.map +1 -1
  98. package/dist/utils/version.d.ts +2 -1
  99. package/dist/utils/version.js +10 -8
  100. package/dist/utils/version.js.map +1 -1
  101. package/package.json +27 -26
  102. package/src/api/artifacts.ts +81 -9
  103. package/src/api/build.ts +403 -66
  104. package/src/api/create-npm-dirs.ts +57 -9
  105. package/src/api/new.ts +89 -31
  106. package/src/api/pre-publish.ts +13 -7
  107. package/src/api/rename.ts +10 -1
  108. package/src/api/templates/cargo.toml.ts +1 -0
  109. package/src/api/templates/ci-template.ts +154 -131
  110. package/src/api/templates/ci.yml.ts +27 -6
  111. package/src/api/templates/js-binding.ts +141 -219
  112. package/src/api/templates/lib.rs.ts +1 -4
  113. package/src/api/templates/load-wasi-template.ts +180 -0
  114. package/src/api/templates/package.json.ts +47 -5
  115. package/src/api/templates/wasi-worker-template.ts +122 -0
  116. package/src/api/universalize.ts +13 -8
  117. package/src/api/version.ts +5 -2
  118. package/src/commands/artifacts.ts +2 -2
  119. package/src/commands/build.ts +1 -1
  120. package/src/commands/new.ts +46 -45
  121. package/src/def/artifacts.ts +22 -3
  122. package/src/def/build.ts +64 -8
  123. package/src/def/create-npm-dirs.ts +9 -0
  124. package/src/def/new.ts +28 -3
  125. package/src/def/pre-publish.ts +12 -3
  126. package/src/def/rename.ts +11 -2
  127. package/src/def/universalize.ts +9 -0
  128. package/src/def/version.ts +9 -0
  129. package/src/index.ts +2 -0
  130. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  131. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  132. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  133. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  134. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  135. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +711 -158
  136. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  137. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  138. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  139. package/src/utils/__tests__/config.spec.ts +81 -0
  140. package/src/utils/__tests__/typegen.spec.ts +18 -3
  141. package/src/utils/cargo.ts +2 -2
  142. package/src/utils/config.ts +112 -10
  143. package/src/utils/index.ts +0 -1
  144. package/src/utils/metadata.ts +2 -2
  145. package/src/utils/misc.ts +11 -3
  146. package/src/utils/target.ts +22 -4
  147. package/src/utils/typegen.ts +81 -36
  148. package/src/utils/version.ts +10 -8
  149. package/dist/api/load-wasi-template.d.ts +0 -1
  150. package/dist/api/load-wasi-template.js +0 -63
  151. package/dist/api/load-wasi-template.js.map +0 -1
  152. package/dist/api/wasi-worker-template.d.ts +0 -1
  153. package/dist/api/wasi-worker-template.js +0 -53
  154. package/dist/api/wasi-worker-template.js.map +0 -1
  155. package/dist/utils/ci.d.ts +0 -11
  156. package/dist/utils/ci.js +0 -96
  157. package/dist/utils/ci.js.map +0 -1
  158. package/src/api/load-wasi-template.ts +0 -65
  159. package/src/api/wasi-worker-template.ts +0 -52
  160. package/src/utils/ci.ts +0 -111
@@ -3,18 +3,57 @@ export function createCjsBinding(
3
3
  pkgName: string,
4
4
  idents: string[],
5
5
  ): string {
6
- return `// prettier-ignore
6
+ return `${bindingHeader}
7
+ const { createRequire } = require('node:module')
8
+ require = createRequire(__filename)
9
+
10
+ ${createCommonBinding(localName, pkgName)}
11
+ ${idents
12
+ .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
13
+ .join('\n')}
14
+ `
15
+ }
16
+
17
+ export function createEsmBinding(
18
+ localName: string,
19
+ pkgName: string,
20
+ idents: string[],
21
+ ): string {
22
+ return `${bindingHeader}
23
+ import { createRequire } from 'node:module'
24
+ const require = createRequire(import.meta.url)
25
+ const __dirname = new URL('.', import.meta.url).pathname
26
+
27
+ ${createCommonBinding(localName, pkgName)}
28
+ const { ${idents.join(', ')} } = nativeBinding
29
+ ${idents.map((ident) => `export { ${ident} }`).join('\n')}
30
+ `
31
+ }
32
+
33
+ const bindingHeader = `// prettier-ignore
7
34
  /* eslint-disable */
35
+ // @ts-nocheck
8
36
  /* auto-generated by NAPI-RS */
37
+ `
9
38
 
10
- const { existsSync, readFileSync } = require('fs')
11
- const { join } = require('path')
12
-
13
- const { platform, arch } = process
39
+ function createCommonBinding(localName: string, pkgName: string): string {
40
+ function requireTuple(tuple: string) {
41
+ return `try {
42
+ return require('./${localName}.${tuple}.node')
43
+ } catch (e) {
44
+ loadErrors.push(e)
45
+ }
46
+ try {
47
+ return require('${pkgName}-${tuple}')
48
+ } catch (e) {
49
+ loadErrors.push(e)
50
+ }
51
+ `
52
+ }
14
53
 
54
+ return `const { readFileSync } = require('node:fs')
15
55
  let nativeBinding = null
16
- let localFileExisted = false
17
- let loadError = null
56
+ const loadErrors = []
18
57
 
19
58
  const isMusl = () => {
20
59
  let musl = false
@@ -65,232 +104,115 @@ const isMuslFromChildProcess = () => {
65
104
  }
66
105
  }
67
106
 
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}\`)
107
+ function requireNative() {
108
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
109
+ try {
110
+ nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
111
+ } catch (err) {
112
+ loadErrors.push(err);
97
113
  }
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}\`)
114
+ } else if (process.platform === 'android') {
115
+ if (process.arch === 'arm64') {
116
+ ${requireTuple('android-arm64')}
117
+ } else if (process.arch === 'arm') {
118
+ ${requireTuple('android-arm-eabi')}
119
+ } else {
120
+ loadErrors.push(new Error(\`Unsupported architecture on Android \${process.arch}\`))
145
121
  }
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')
122
+ } else if (process.platform === 'win32') {
123
+ if (process.arch === 'x64') {
124
+ ${requireTuple('win32-x64-msvc')}
125
+ } else if (process.arch === 'ia32') {
126
+ ${requireTuple('win32-ia32-msvc')}
127
+ } else if (process.arch === 'arm64') {
128
+ ${requireTuple('win32-arm64-msvc')}
129
+ } else {
130
+ loadErrors.push(new Error(\`Unsupported architecture on Windows: \${process.arch}\`))
131
+ }
132
+ } else if (process.platform === 'darwin') {
133
+ ${requireTuple('darwin-universal')}
134
+ if (process.arch === 'x64') {
135
+ ${requireTuple('darwin-x64')}
136
+ } else if (process.arch === 'arm64') {
137
+ ${requireTuple('darwin-arm64')}
138
+ } else {
139
+ loadErrors.push(new Error(\`Unsupported architecture on macOS: \${process.arch}\`))
140
+ }
141
+ } else if (process.platform === 'freebsd') {
142
+ if (process.arch === 'x64') {
143
+ ${requireTuple('freebsd-x64')}
144
+ } else if (process.arch === 'arm64') {
145
+ ${requireTuple('freebsd-arm64')}
146
+ } else {
147
+ loadErrors.push(new Error(\`Unsupported architecture on FreeBSD: \${process.arch}\`))
148
+ }
149
+ } else if (process.platform === 'linux') {
150
+ if (process.arch === 'x64') {
151
+ if (isMusl()) {
152
+ ${requireTuple('linux-x64-musl')}
152
153
  } else {
153
- nativeBinding = require('${pkgName}-darwin-universal')
154
+ ${requireTuple('linux-x64-gnu')}
154
155
  }
155
- break
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}\`)
156
+ } else if (process.arch === 'arm64') {
157
+ if (isMusl()) {
158
+ ${requireTuple('linux-arm64-musl')}
159
+ } else {
160
+ ${requireTuple('linux-arm64-gnu')}
161
+ }
162
+ } else if (process.arch === 'arm') {
163
+ if (isMusl()) {
164
+ ${requireTuple('linux-arm-musleabihf')}
165
+ } else {
166
+ ${requireTuple('linux-arm-gnueabihf')}
167
+ }
168
+ } else if (process.arch === 'riscv64') {
169
+ if (isMusl()) {
170
+ ${requireTuple('linux-riscv64-musl')}
171
+ } else {
172
+ ${requireTuple('linux-riscv64-gnu')}
173
+ }
174
+ } else if (process.arch === 'ppc64') {
175
+ ${requireTuple('linux-ppc64-gnu')}
176
+ } else if (process.arch === 's390x') {
177
+ ${requireTuple('linux-s390x-gnu')}
178
+ } else {
179
+ loadErrors.push(new Error(\`Unsupported architecture on Linux: \${process.arch}\`))
186
180
  }
187
- break
188
- case 'freebsd':
189
- if (arch !== 'x64') {
190
- throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`)
181
+ } else {
182
+ loadErrors.push(new Error(\`Unsupported OS: \${process.platform}, architecture: \${process.arch}\`))
183
+ }
184
+ }
185
+
186
+ nativeBinding = requireNative()
187
+
188
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
189
+ try {
190
+ nativeBinding = require('./${localName}.wasi.cjs')
191
+ } catch (err) {
192
+ if (process.env.NAPI_RS_FORCE_WASI) {
193
+ loadErrors.push(err)
191
194
  }
192
- localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node'))
195
+ }
196
+ if (!nativeBinding) {
193
197
  try {
194
- if (localFileExisted) {
195
- nativeBinding = require('./${localName}.freebsd-x64.node')
196
- } else {
197
- nativeBinding = require('${pkgName}-freebsd-x64')
198
+ nativeBinding = require('${pkgName}-wasm32-wasi')
199
+ } catch (err) {
200
+ if (process.env.NAPI_RS_FORCE_WASI) {
201
+ loadErrors.push(err)
198
202
  }
199
- } catch (e) {
200
- loadError = e
201
- }
202
- break
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
- default:
278
- throw new Error(\`Unsupported architecture on Linux: \${arch}\`)
279
203
  }
280
- break
281
- default:
282
- throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
204
+ }
283
205
  }
284
206
 
285
207
  if (!nativeBinding) {
286
- if (loadError) {
287
- throw loadError
208
+ if (loadErrors.length > 0) {
209
+ // TODO Link to documentation with potential fixes
210
+ // - The package owner could build/publish bindings for this arch
211
+ // - The user may need to bundle the correct files
212
+ // - The user may need to re-install node_modules to get new packages
213
+ throw new Error('Failed to load native binding', { cause: loadErrors })
288
214
  }
289
215
  throw new Error(\`Failed to load native binding\`)
290
216
  }
291
-
292
- ${idents
293
- .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
294
- .join('\n')}
295
217
  `
296
218
  }
@@ -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,180 @@
1
+ export const createWasiBrowserBinding = (
2
+ wasiFilename: string,
3
+ wasiRegisterFunctions: string[],
4
+ initialMemory = 4000,
5
+ maximumMemory = 65536,
6
+ fs = false,
7
+ ) => {
8
+ const fsImport = fs ? `import { memfs } from '@napi-rs/wasm-runtime/fs'` : ''
9
+ const wasiCreation = fs
10
+ ? `
11
+ export const { fs: __fs, vol: __volume } = memfs()
12
+
13
+ const __wasi = new __WASI({
14
+ version: 'preview1',
15
+ fs: __fs,
16
+ preopens: {
17
+ '/': '/',
18
+ },
19
+ })`
20
+ : `
21
+ const __wasi = new __WASI({
22
+ version: 'preview1',
23
+ })`
24
+
25
+ const workerFsHandler = fs
26
+ ? ` worker.addEventListener('message', __wasmCreateOnMessageForFsProxy(__fs))\n`
27
+ : ''
28
+
29
+ return `import {
30
+ instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,
31
+ getDefaultContext as __emnapiGetDefaultContext,
32
+ WASI as __WASI,
33
+ createOnMessage as __wasmCreateOnMessageForFsProxy,
34
+ } from '@napi-rs/wasm-runtime'
35
+ ${fsImport}
36
+ import __wasmUrl from './${wasiFilename}.wasm?url'
37
+ ${wasiCreation}
38
+
39
+ const __emnapiContext = __emnapiGetDefaultContext()
40
+
41
+ const __sharedMemory = new WebAssembly.Memory({
42
+ initial: ${initialMemory},
43
+ maximum: ${maximumMemory},
44
+ shared: true,
45
+ })
46
+
47
+ const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())
48
+
49
+ const {
50
+ instance: __napiInstance,
51
+ module: __wasiModule,
52
+ napiModule: __napiModule,
53
+ } = __emnapiInstantiateNapiModuleSync(__wasmFile, {
54
+ context: __emnapiContext,
55
+ asyncWorkPoolSize: 4,
56
+ wasi: __wasi,
57
+ onCreateWorker() {
58
+ const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {
59
+ type: 'module',
60
+ })
61
+ ${workerFsHandler}
62
+ return worker
63
+ },
64
+ overwriteImports(importObject) {
65
+ importObject.env = {
66
+ ...importObject.env,
67
+ ...importObject.napi,
68
+ ...importObject.emnapi,
69
+ memory: __sharedMemory,
70
+ }
71
+ return importObject
72
+ },
73
+ beforeInit({ instance }) {
74
+ __napi_rs_initialize_modules(instance)
75
+ },
76
+ })
77
+
78
+ function __napi_rs_initialize_modules(__napiInstance) {
79
+ ${wasiRegisterFunctions
80
+ .map((name) => ` __napiInstance.exports['${name}']?.()`)
81
+ .join('\n')}
82
+ }
83
+ `
84
+ }
85
+
86
+ export const createWasiBinding = (
87
+ wasmFileName: string,
88
+ packageName: string,
89
+ wasiRegisterFunctions: string[],
90
+ initialMemory = 4000,
91
+ maximumMemory = 65536,
92
+ ) => `/* eslint-disable */
93
+ /* prettier-ignore */
94
+
95
+ /* auto-generated by NAPI-RS */
96
+
97
+ const __nodeFs = require('node:fs')
98
+ const __nodePath = require('node:path')
99
+ const { WASI: __nodeWASI } = require('node:wasi')
100
+ const { Worker } = require('node:worker_threads')
101
+
102
+ const {
103
+ instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
104
+ getDefaultContext: __emnapiGetDefaultContext,
105
+ createOnMessage: __wasmCreateOnMessageForFsProxy,
106
+ } = require('@napi-rs/wasm-runtime')
107
+
108
+ const __rootDir = __nodePath.parse(process.cwd()).root
109
+
110
+ const __wasi = new __nodeWASI({
111
+ version: 'preview1',
112
+ env: process.env,
113
+ preopens: {
114
+ [__rootDir]: __rootDir,
115
+ }
116
+ })
117
+
118
+ const __emnapiContext = __emnapiGetDefaultContext()
119
+
120
+ const __sharedMemory = new WebAssembly.Memory({
121
+ initial: ${initialMemory},
122
+ maximum: ${maximumMemory},
123
+ shared: true,
124
+ })
125
+
126
+ let __wasmFilePath = __nodePath.join(__dirname, '${wasmFileName}.wasm')
127
+ const __wasmDebugFilePath = __nodePath.join(__dirname, '${wasmFileName}.debug.wasm')
128
+
129
+ if (__nodeFs.existsSync(__wasmDebugFilePath)) {
130
+ __wasmFilePath = __wasmDebugFilePath
131
+ } else if (!__nodeFs.existsSync(__wasmFilePath)) {
132
+ try {
133
+ __wasmFilePath = __nodePath.resolve('${packageName}-wasm32-wasi')
134
+ } catch {
135
+ throw new Error('Cannot find ${wasmFileName}.wasm file, and ${packageName}-wasm32-wasi package is not installed.')
136
+ }
137
+ }
138
+
139
+ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
140
+ context: __emnapiContext,
141
+ asyncWorkPoolSize: (function() {
142
+ const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
143
+ // NaN > 0 is false
144
+ if (threadsSizeFromEnv > 0) {
145
+ return threadsSizeFromEnv
146
+ } else {
147
+ return 4
148
+ }
149
+ })(),
150
+ reuseWorker: true,
151
+ wasi: __wasi,
152
+ onCreateWorker() {
153
+ const worker = new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
154
+ env: process.env,
155
+ })
156
+ worker.onmessage = ({ data }) => {
157
+ __wasmCreateOnMessageForFsProxy(__nodeFs)(data)
158
+ }
159
+ return worker
160
+ },
161
+ overwriteImports(importObject) {
162
+ importObject.env = {
163
+ ...importObject.env,
164
+ ...importObject.napi,
165
+ ...importObject.emnapi,
166
+ memory: __sharedMemory,
167
+ }
168
+ return importObject
169
+ },
170
+ beforeInit({ instance }) {
171
+ __napi_rs_initialize_modules(instance)
172
+ }
173
+ })
174
+
175
+ function __napi_rs_initialize_modules(__napiInstance) {
176
+ ${wasiRegisterFunctions
177
+ .map((name) => ` __napiInstance.exports['${name}']?.()`)
178
+ .join('\n')}
179
+ }
180
+ `
@@ -1,12 +1,21 @@
1
- import { CommonPackageJsonFields } from '../../utils/config.js'
1
+ import type {
2
+ CommonPackageJsonFields,
3
+ SupportedTestFramework,
4
+ } from '../../utils/config.js'
5
+ import { UNIVERSAL_TARGETS } from '../../utils/target.js'
2
6
 
3
- export const createPackageJson = ({
7
+ export interface PackageMeta {
8
+ 'dist-tags': { [index: string]: string }
9
+ }
10
+
11
+ export const createPackageJson = async ({
4
12
  name,
5
13
  binaryName,
6
14
  targets,
7
15
  license,
8
16
  engineRequirement,
9
17
  cliVersion,
18
+ testFramework,
10
19
  }: {
11
20
  name: string
12
21
  binaryName: string
@@ -14,10 +23,24 @@ export const createPackageJson = ({
14
23
  license: string
15
24
  engineRequirement: string
16
25
  cliVersion: string
26
+ testFramework: SupportedTestFramework
17
27
  }) => {
28
+ const hasWasmTarget = targets.some((t) => t.includes('wasm'))
29
+ const universalTargets = targets.filter(
30
+ (t) => t in UNIVERSAL_TARGETS,
31
+ ) as (keyof typeof UNIVERSAL_TARGETS)[]
32
+ const unifiedtargets = universalTargets.length
33
+ ? targets.filter(
34
+ (target) =>
35
+ !universalTargets.some((t) => {
36
+ // @ts-expect-error
37
+ return UNIVERSAL_TARGETS[t].includes(target)
38
+ }),
39
+ )
40
+ : targets
18
41
  const content: CommonPackageJsonFields = {
19
42
  name,
20
- version: '1.0.0',
43
+ version: '0.0.0',
21
44
  license,
22
45
  engines: {
23
46
  node: engineRequirement,
@@ -25,14 +48,15 @@ export const createPackageJson = ({
25
48
  type: 'commonjs',
26
49
  main: 'index.js',
27
50
  types: 'index.d.ts',
51
+ browser: 'browser.js',
28
52
  module: undefined,
29
53
  exports: undefined,
30
54
  napi: {
31
55
  binaryName,
32
- targets,
56
+ targets: unifiedtargets,
33
57
  },
34
58
  scripts: {
35
- test: 'node -e "assert(require(\'.\').sum(1, 2) === 3)"',
59
+ test: testFramework,
36
60
  build: 'napi build --release --platform --strip',
37
61
  'build:debug': 'napi build',
38
62
  prepublishOnly: 'napi prepublish -t npm',
@@ -44,5 +68,23 @@ export const createPackageJson = ({
44
68
  },
45
69
  }
46
70
 
71
+ if (testFramework === 'ava') {
72
+ const avaMeta = await fetch(`https://registry.npmjs.org/ava`).then(
73
+ (res) => res.json() as Promise<PackageMeta>,
74
+ )
75
+ content.devDependencies!['ava'] = `^${avaMeta['dist-tags'].latest}`
76
+ content.ava = {
77
+ timeout: '1m',
78
+ }
79
+ }
80
+
81
+ if (hasWasmTarget) {
82
+ const wasmRuntime = await fetch(
83
+ `https://registry.npmjs.org/@napi-rs/wasm-runtime`,
84
+ ).then((res) => res.json() as Promise<PackageMeta>)
85
+ const latest = wasmRuntime['dist-tags'].latest
86
+ content.devDependencies!['@napi-rs/wasm-runtime'] = `^${latest}`
87
+ }
88
+
47
89
  return JSON.stringify(content, null, 2)
48
90
  }