@napi-rs/cli 3.0.0-alpha.9 → 3.0.0-alpha.90

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 (163) hide show
  1. package/cli.mjs +1 -1
  2. package/dist/api/__tests__/new.spec.d.ts +1 -0
  3. package/dist/api/__tests__/new.spec.js +283 -0
  4. package/dist/api/__tests__/new.spec.js.map +1 -0
  5. package/dist/api/artifacts.js +28 -7
  6. package/dist/api/artifacts.js.map +1 -1
  7. package/dist/api/build.d.ts +1 -1
  8. package/dist/api/build.js +324 -115
  9. package/dist/api/build.js.map +1 -1
  10. package/dist/api/create-npm-dirs.js +46 -9
  11. package/dist/api/create-npm-dirs.js.map +1 -1
  12. package/dist/api/new.js +312 -107
  13. package/dist/api/new.js.map +1 -1
  14. package/dist/api/pre-publish.js +9 -7
  15. package/dist/api/pre-publish.js.map +1 -1
  16. package/dist/api/rename.js +74 -12
  17. package/dist/api/rename.js.map +1 -1
  18. package/dist/api/templates/cargo.toml.js +1 -0
  19. package/dist/api/templates/cargo.toml.js.map +1 -1
  20. package/dist/api/templates/ci-template.d.ts +3 -1
  21. package/dist/api/templates/ci-template.js +140 -125
  22. package/dist/api/templates/ci-template.js.map +1 -1
  23. package/dist/api/templates/ci.yml.d.ts +3 -1
  24. package/dist/api/templates/ci.yml.js +21 -5
  25. package/dist/api/templates/ci.yml.js.map +1 -1
  26. package/dist/api/templates/js-binding.d.ts +1 -0
  27. package/dist/api/templates/js-binding.js +142 -222
  28. package/dist/api/templates/js-binding.js.map +1 -1
  29. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  30. package/dist/api/templates/load-wasi-template.js +168 -0
  31. package/dist/api/templates/load-wasi-template.js.map +1 -0
  32. package/dist/api/templates/package.json.d.ts +9 -2
  33. package/dist/api/templates/package.json.js +26 -4
  34. package/dist/api/templates/package.json.js.map +1 -1
  35. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  36. package/dist/api/templates/wasi-worker-template.js +122 -0
  37. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  38. package/dist/api/universalize.js +5 -5
  39. package/dist/api/universalize.js.map +1 -1
  40. package/dist/api/version.js +2 -2
  41. package/dist/api/version.js.map +1 -1
  42. package/dist/commands/artifacts.js +2 -2
  43. package/dist/commands/artifacts.js.map +1 -1
  44. package/dist/commands/build.js +1 -1
  45. package/dist/commands/build.js.map +1 -1
  46. package/dist/commands/new.js +34 -34
  47. package/dist/commands/new.js.map +1 -1
  48. package/dist/def/artifacts.d.ts +21 -1
  49. package/dist/def/artifacts.js +10 -2
  50. package/dist/def/artifacts.js.map +1 -1
  51. package/dist/def/build.d.ts +149 -4
  52. package/dist/def/build.js +26 -4
  53. package/dist/def/build.js.map +1 -1
  54. package/dist/def/create-npm-dirs.d.ts +10 -0
  55. package/dist/def/create-npm-dirs.js +4 -0
  56. package/dist/def/create-npm-dirs.js.map +1 -1
  57. package/dist/def/new.d.ts +25 -7
  58. package/dist/def/new.js +11 -1
  59. package/dist/def/new.js.map +1 -1
  60. package/dist/def/pre-publish.d.ts +12 -2
  61. package/dist/def/pre-publish.js +7 -3
  62. package/dist/def/pre-publish.js.map +1 -1
  63. package/dist/def/rename.d.ts +16 -6
  64. package/dist/def/rename.js +5 -1
  65. package/dist/def/rename.js.map +1 -1
  66. package/dist/def/universalize.d.ts +10 -0
  67. package/dist/def/universalize.js +4 -0
  68. package/dist/def/universalize.js.map +1 -1
  69. package/dist/def/version.d.ts +10 -0
  70. package/dist/def/version.js +4 -0
  71. package/dist/def/version.js.map +1 -1
  72. package/dist/index.cjs +8743 -14849
  73. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  74. package/dist/utils/__tests__/config.spec.js +63 -0
  75. package/dist/utils/__tests__/config.spec.js.map +1 -0
  76. package/dist/utils/cargo.js +2 -2
  77. package/dist/utils/cargo.js.map +1 -1
  78. package/dist/utils/config.d.ts +48 -4
  79. package/dist/utils/config.js +36 -4
  80. package/dist/utils/config.js.map +1 -1
  81. package/dist/utils/index.d.ts +1 -1
  82. package/dist/utils/index.js +1 -1
  83. package/dist/utils/index.js.map +1 -1
  84. package/dist/utils/log.js +1 -1
  85. package/dist/utils/log.js.map +1 -1
  86. package/dist/utils/metadata.d.ts +13 -1
  87. package/dist/utils/metadata.js +31 -11
  88. package/dist/utils/metadata.js.map +1 -1
  89. package/dist/utils/misc.d.ts +3 -3
  90. package/dist/utils/misc.js +13 -11
  91. package/dist/utils/misc.js.map +1 -1
  92. package/dist/utils/read-config.d.ts +7 -0
  93. package/dist/utils/read-config.js +8 -0
  94. package/dist/utils/read-config.js.map +1 -0
  95. package/dist/utils/target.d.ts +7 -5
  96. package/dist/utils/target.js +17 -3
  97. package/dist/utils/target.js.map +1 -1
  98. package/dist/utils/typegen.d.ts +1 -1
  99. package/dist/utils/typegen.js +63 -32
  100. package/dist/utils/typegen.js.map +1 -1
  101. package/dist/utils/version.d.ts +2 -1
  102. package/dist/utils/version.js +10 -8
  103. package/dist/utils/version.js.map +1 -1
  104. package/package.json +34 -32
  105. package/src/api/__tests__/new.spec.ts +429 -0
  106. package/src/api/artifacts.ts +81 -9
  107. package/src/api/build.ts +498 -149
  108. package/src/api/create-npm-dirs.ts +57 -9
  109. package/src/api/new.ts +389 -122
  110. package/src/api/pre-publish.ts +13 -7
  111. package/src/api/rename.ts +103 -17
  112. package/src/api/templates/cargo.toml.ts +1 -0
  113. package/src/api/templates/ci-template.ts +150 -125
  114. package/src/api/templates/ci.yml.ts +27 -6
  115. package/src/api/templates/js-binding.ts +148 -220
  116. package/src/api/templates/load-wasi-template.ts +182 -0
  117. package/src/api/templates/package.json.ts +47 -5
  118. package/src/api/templates/wasi-worker-template.ts +122 -0
  119. package/src/api/universalize.ts +13 -8
  120. package/src/api/version.ts +5 -2
  121. package/src/commands/artifacts.ts +2 -2
  122. package/src/commands/build.ts +1 -1
  123. package/src/commands/new.ts +46 -45
  124. package/src/def/artifacts.ts +22 -3
  125. package/src/def/build.ts +55 -8
  126. package/src/def/create-npm-dirs.ts +9 -0
  127. package/src/def/new.ts +28 -3
  128. package/src/def/pre-publish.ts +12 -3
  129. package/src/def/rename.ts +11 -2
  130. package/src/def/universalize.ts +9 -0
  131. package/src/def/version.ts +9 -0
  132. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  133. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  134. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  135. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  136. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  137. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +316 -332
  138. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  139. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  140. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  141. package/src/utils/__tests__/config.spec.ts +81 -0
  142. package/src/utils/cargo.ts +2 -2
  143. package/src/utils/config.ts +110 -9
  144. package/src/utils/index.ts +1 -1
  145. package/src/utils/log.ts +1 -1
  146. package/src/utils/metadata.ts +52 -14
  147. package/src/utils/misc.ts +21 -12
  148. package/src/utils/read-config.ts +20 -0
  149. package/src/utils/target.ts +22 -4
  150. package/src/utils/typegen.ts +87 -52
  151. package/src/utils/version.ts +10 -8
  152. package/dist/api/load-wasi-template.d.ts +0 -1
  153. package/dist/api/load-wasi-template.js +0 -64
  154. package/dist/api/load-wasi-template.js.map +0 -1
  155. package/dist/api/wasi-worker-template.d.ts +0 -1
  156. package/dist/api/wasi-worker-template.js +0 -53
  157. package/dist/api/wasi-worker-template.js.map +0 -1
  158. package/dist/utils/ci.d.ts +0 -11
  159. package/dist/utils/ci.js +0 -96
  160. package/dist/utils/ci.js.map +0 -1
  161. package/src/api/load-wasi-template.ts +0 -66
  162. package/src/api/wasi-worker-template.ts +0 -52
  163. package/src/utils/ci.ts +0 -111
@@ -3,18 +3,58 @@ 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
+ module.exports = nativeBinding
12
+ ${idents
13
+ .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
14
+ .join('\n')}
15
+ `
16
+ }
17
+
18
+ export function createEsmBinding(
19
+ localName: string,
20
+ pkgName: string,
21
+ idents: string[],
22
+ ): string {
23
+ return `${bindingHeader}
24
+ import { createRequire } from 'node:module'
25
+ const require = createRequire(import.meta.url)
26
+ const __dirname = new URL('.', import.meta.url).pathname
27
+
28
+ ${createCommonBinding(localName, pkgName)}
29
+ const { ${idents.join(', ')} } = nativeBinding
30
+ ${idents.map((ident) => `export { ${ident} }`).join('\n')}
31
+ `
32
+ }
33
+
34
+ const bindingHeader = `// prettier-ignore
7
35
  /* eslint-disable */
36
+ // @ts-nocheck
8
37
  /* auto-generated by NAPI-RS */
38
+ `
9
39
 
10
- const { existsSync, readFileSync } = require('fs')
11
- const { join } = require('path')
12
-
13
- const { platform, arch } = process
40
+ function createCommonBinding(localName: string, pkgName: string): string {
41
+ function requireTuple(tuple: string) {
42
+ return `try {
43
+ return require('./${localName}.${tuple}.node')
44
+ } catch (e) {
45
+ loadErrors.push(e)
46
+ }
47
+ try {
48
+ return require('${pkgName}-${tuple}')
49
+ } catch (e) {
50
+ loadErrors.push(e)
51
+ }
52
+ `
53
+ }
14
54
 
55
+ return `const { readFileSync } = require('node:fs')
15
56
  let nativeBinding = null
16
- let localFileExisted = false
17
- let loadError = null
57
+ const loadErrors = []
18
58
 
19
59
  const isMusl = () => {
20
60
  let musl = false
@@ -41,7 +81,11 @@ const isMuslFromFilesystem = () => {
41
81
  }
42
82
 
43
83
  const isMuslFromReport = () => {
44
- const report = typeof process.report.getReport === 'function' ? process.report.getReport() : null
84
+ let report = null
85
+ if (typeof process.report?.getReport === 'function') {
86
+ process.report.excludeNetwork = true
87
+ report = process.report.getReport()
88
+ }
45
89
  if (!report) {
46
90
  return null
47
91
  }
@@ -65,232 +109,116 @@ const isMuslFromChildProcess = () => {
65
109
  }
66
110
  }
67
111
 
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}\`)
112
+ function requireNative() {
113
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
114
+ try {
115
+ nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
116
+ } catch (err) {
117
+ loadErrors.push(err)
97
118
  }
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}\`)
119
+ } else if (process.platform === 'android') {
120
+ if (process.arch === 'arm64') {
121
+ ${requireTuple('android-arm64')}
122
+ } else if (process.arch === 'arm') {
123
+ ${requireTuple('android-arm-eabi')}
124
+ } else {
125
+ loadErrors.push(new Error(\`Unsupported architecture on Android \${process.arch}\`))
145
126
  }
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')
127
+ } else if (process.platform === 'win32') {
128
+ if (process.arch === 'x64') {
129
+ ${requireTuple('win32-x64-msvc')}
130
+ } else if (process.arch === 'ia32') {
131
+ ${requireTuple('win32-ia32-msvc')}
132
+ } else if (process.arch === 'arm64') {
133
+ ${requireTuple('win32-arm64-msvc')}
134
+ } else {
135
+ loadErrors.push(new Error(\`Unsupported architecture on Windows: \${process.arch}\`))
136
+ }
137
+ } else if (process.platform === 'darwin') {
138
+ ${requireTuple('darwin-universal')}
139
+ if (process.arch === 'x64') {
140
+ ${requireTuple('darwin-x64')}
141
+ } else if (process.arch === 'arm64') {
142
+ ${requireTuple('darwin-arm64')}
143
+ } else {
144
+ loadErrors.push(new Error(\`Unsupported architecture on macOS: \${process.arch}\`))
145
+ }
146
+ } else if (process.platform === 'freebsd') {
147
+ if (process.arch === 'x64') {
148
+ ${requireTuple('freebsd-x64')}
149
+ } else if (process.arch === 'arm64') {
150
+ ${requireTuple('freebsd-arm64')}
151
+ } else {
152
+ loadErrors.push(new Error(\`Unsupported architecture on FreeBSD: \${process.arch}\`))
153
+ }
154
+ } else if (process.platform === 'linux') {
155
+ if (process.arch === 'x64') {
156
+ if (isMusl()) {
157
+ ${requireTuple('linux-x64-musl')}
158
+ } else {
159
+ ${requireTuple('linux-x64-gnu')}
160
+ }
161
+ } else if (process.arch === 'arm64') {
162
+ if (isMusl()) {
163
+ ${requireTuple('linux-arm64-musl')}
152
164
  } else {
153
- nativeBinding = require('${pkgName}-darwin-universal')
165
+ ${requireTuple('linux-arm64-gnu')}
154
166
  }
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}\`)
167
+ } else if (process.arch === 'arm') {
168
+ if (isMusl()) {
169
+ ${requireTuple('linux-arm-musleabihf')}
170
+ } else {
171
+ ${requireTuple('linux-arm-gnueabihf')}
172
+ }
173
+ } else if (process.arch === 'riscv64') {
174
+ if (isMusl()) {
175
+ ${requireTuple('linux-riscv64-musl')}
176
+ } else {
177
+ ${requireTuple('linux-riscv64-gnu')}
178
+ }
179
+ } else if (process.arch === 'ppc64') {
180
+ ${requireTuple('linux-ppc64-gnu')}
181
+ } else if (process.arch === 's390x') {
182
+ ${requireTuple('linux-s390x-gnu')}
183
+ } else {
184
+ loadErrors.push(new Error(\`Unsupported architecture on Linux: \${process.arch}\`))
186
185
  }
187
- break
188
- case 'freebsd':
189
- if (arch !== 'x64') {
190
- throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`)
186
+ } else {
187
+ loadErrors.push(new Error(\`Unsupported OS: \${process.platform}, architecture: \${process.arch}\`))
188
+ }
189
+ }
190
+
191
+ nativeBinding = requireNative()
192
+
193
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
194
+ try {
195
+ nativeBinding = require('./${localName}.wasi.cjs')
196
+ } catch (err) {
197
+ if (process.env.NAPI_RS_FORCE_WASI) {
198
+ loadErrors.push(err)
191
199
  }
192
- localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node'))
200
+ }
201
+ if (!nativeBinding) {
193
202
  try {
194
- if (localFileExisted) {
195
- nativeBinding = require('./${localName}.freebsd-x64.node')
196
- } else {
197
- nativeBinding = require('${pkgName}-freebsd-x64')
203
+ nativeBinding = require('${pkgName}-wasm32-wasi')
204
+ } catch (err) {
205
+ if (process.env.NAPI_RS_FORCE_WASI) {
206
+ loadErrors.push(err)
198
207
  }
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
208
  }
280
- break
281
- default:
282
- throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
209
+ }
283
210
  }
284
211
 
285
212
  if (!nativeBinding) {
286
- if (loadError) {
287
- throw loadError
213
+ if (loadErrors.length > 0) {
214
+ throw new Error(
215
+ \`Cannot find native binding. \` +
216
+ \`npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). \` +
217
+ 'Please try \`npm i\` again after removing both package-lock.json and node_modules directory.',
218
+ { cause: loadErrors }
219
+ )
288
220
  }
289
221
  throw new Error(\`Failed to load native binding\`)
290
222
  }
291
-
292
- ${idents
293
- .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
294
- .join('\n')}
295
223
  `
296
224
  }
@@ -0,0 +1,182 @@
1
+ export const createWasiBrowserBinding = (
2
+ wasiFilename: string,
3
+ initialMemory = 4000,
4
+ maximumMemory = 65536,
5
+ fs = false,
6
+ asyncInit = 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
+ const emnapiInstantiateImport = asyncInit
30
+ ? `instantiateNapiModule as __emnapiInstantiateNapiModule`
31
+ : `instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync`
32
+ const emnapiInstantiateCall = asyncInit
33
+ ? `await __emnapiInstantiateNapiModule`
34
+ : `__emnapiInstantiateNapiModuleSync`
35
+
36
+ return `import {
37
+ createOnMessage as __wasmCreateOnMessageForFsProxy,
38
+ getDefaultContext as __emnapiGetDefaultContext,
39
+ ${emnapiInstantiateImport},
40
+ WASI as __WASI,
41
+ } from '@napi-rs/wasm-runtime'
42
+ ${fsImport}
43
+ ${wasiCreation}
44
+
45
+ const __wasmUrl = new URL('./${wasiFilename}.wasm', import.meta.url).href
46
+ const __emnapiContext = __emnapiGetDefaultContext()
47
+
48
+ const __sharedMemory = new WebAssembly.Memory({
49
+ initial: ${initialMemory},
50
+ maximum: ${maximumMemory},
51
+ shared: true,
52
+ })
53
+
54
+ const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())
55
+
56
+ const {
57
+ instance: __napiInstance,
58
+ module: __wasiModule,
59
+ napiModule: __napiModule,
60
+ } = ${emnapiInstantiateCall}(__wasmFile, {
61
+ context: __emnapiContext,
62
+ asyncWorkPoolSize: 4,
63
+ wasi: __wasi,
64
+ onCreateWorker() {
65
+ const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {
66
+ type: 'module',
67
+ })
68
+ ${workerFsHandler}
69
+ return worker
70
+ },
71
+ overwriteImports(importObject) {
72
+ importObject.env = {
73
+ ...importObject.env,
74
+ ...importObject.napi,
75
+ ...importObject.emnapi,
76
+ memory: __sharedMemory,
77
+ }
78
+ return importObject
79
+ },
80
+ beforeInit({ instance }) {
81
+ for (const name of Object.keys(instance.exports)) {
82
+ if (name.startsWith('__napi_register__')) {
83
+ instance.exports[name]()
84
+ }
85
+ }
86
+ },
87
+ })
88
+ `
89
+ }
90
+
91
+ export const createWasiBinding = (
92
+ wasmFileName: string,
93
+ packageName: string,
94
+ initialMemory = 4000,
95
+ maximumMemory = 65536,
96
+ ) => `/* eslint-disable */
97
+ /* prettier-ignore */
98
+
99
+ /* auto-generated by NAPI-RS */
100
+
101
+ const __nodeFs = require('node:fs')
102
+ const __nodePath = require('node:path')
103
+ const { WASI: __nodeWASI } = require('node:wasi')
104
+ const { Worker } = require('node:worker_threads')
105
+
106
+ const {
107
+ createOnMessage: __wasmCreateOnMessageForFsProxy,
108
+ getDefaultContext: __emnapiGetDefaultContext,
109
+ instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
110
+ } = require('@napi-rs/wasm-runtime')
111
+
112
+ const __rootDir = __nodePath.parse(process.cwd()).root
113
+
114
+ const __wasi = new __nodeWASI({
115
+ version: 'preview1',
116
+ env: process.env,
117
+ preopens: {
118
+ [__rootDir]: __rootDir,
119
+ }
120
+ })
121
+
122
+ const __emnapiContext = __emnapiGetDefaultContext()
123
+
124
+ const __sharedMemory = new WebAssembly.Memory({
125
+ initial: ${initialMemory},
126
+ maximum: ${maximumMemory},
127
+ shared: true,
128
+ })
129
+
130
+ let __wasmFilePath = __nodePath.join(__dirname, '${wasmFileName}.wasm')
131
+ const __wasmDebugFilePath = __nodePath.join(__dirname, '${wasmFileName}.debug.wasm')
132
+
133
+ if (__nodeFs.existsSync(__wasmDebugFilePath)) {
134
+ __wasmFilePath = __wasmDebugFilePath
135
+ } else if (!__nodeFs.existsSync(__wasmFilePath)) {
136
+ try {
137
+ __wasmFilePath = __nodePath.resolve('${packageName}-wasm32-wasi')
138
+ } catch {
139
+ throw new Error('Cannot find ${wasmFileName}.wasm file, and ${packageName}-wasm32-wasi package is not installed.')
140
+ }
141
+ }
142
+
143
+ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
144
+ context: __emnapiContext,
145
+ asyncWorkPoolSize: (function() {
146
+ const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
147
+ // NaN > 0 is false
148
+ if (threadsSizeFromEnv > 0) {
149
+ return threadsSizeFromEnv
150
+ } else {
151
+ return 4
152
+ }
153
+ })(),
154
+ reuseWorker: true,
155
+ wasi: __wasi,
156
+ onCreateWorker() {
157
+ const worker = new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
158
+ env: process.env,
159
+ })
160
+ worker.onmessage = ({ data }) => {
161
+ __wasmCreateOnMessageForFsProxy(__nodeFs)(data)
162
+ }
163
+ return worker
164
+ },
165
+ overwriteImports(importObject) {
166
+ importObject.env = {
167
+ ...importObject.env,
168
+ ...importObject.napi,
169
+ ...importObject.emnapi,
170
+ memory: __sharedMemory,
171
+ }
172
+ return importObject
173
+ },
174
+ beforeInit({ instance }) {
175
+ for (const name of Object.keys(instance.exports)) {
176
+ if (name.startsWith('__napi_register__')) {
177
+ instance.exports[name]()
178
+ }
179
+ }
180
+ },
181
+ })
182
+ `
@@ -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
  }