@napi-rs/cli 3.0.0-alpha.8 → 3.0.0-alpha.80

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 (161) 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 +309 -64
  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 +140 -125
  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 +141 -222
  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 +168 -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 +8706 -14649
  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 +52 -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.d.ts +12 -0
  88. package/dist/utils/metadata.js +21 -10
  89. package/dist/utils/metadata.js.map +1 -1
  90. package/dist/utils/misc.d.ts +1 -2
  91. package/dist/utils/misc.js +3 -3
  92. package/dist/utils/misc.js.map +1 -1
  93. package/dist/utils/target.d.ts +7 -5
  94. package/dist/utils/target.js +17 -3
  95. package/dist/utils/target.js.map +1 -1
  96. package/dist/utils/typegen.d.ts +1 -1
  97. package/dist/utils/typegen.js +55 -20
  98. package/dist/utils/typegen.js.map +1 -1
  99. package/dist/utils/version.d.ts +2 -1
  100. package/dist/utils/version.js +10 -8
  101. package/dist/utils/version.js.map +1 -1
  102. package/package.json +27 -26
  103. package/src/api/artifacts.ts +81 -9
  104. package/src/api/build.ts +467 -87
  105. package/src/api/create-npm-dirs.ts +57 -9
  106. package/src/api/new.ts +89 -31
  107. package/src/api/pre-publish.ts +13 -7
  108. package/src/api/rename.ts +10 -1
  109. package/src/api/templates/cargo.toml.ts +1 -0
  110. package/src/api/templates/ci-template.ts +150 -125
  111. package/src/api/templates/ci.yml.ts +27 -6
  112. package/src/api/templates/js-binding.ts +147 -220
  113. package/src/api/templates/lib.rs.ts +1 -4
  114. package/src/api/templates/load-wasi-template.ts +182 -0
  115. package/src/api/templates/package.json.ts +47 -5
  116. package/src/api/templates/wasi-worker-template.ts +122 -0
  117. package/src/api/universalize.ts +13 -8
  118. package/src/api/version.ts +5 -2
  119. package/src/commands/artifacts.ts +2 -2
  120. package/src/commands/build.ts +1 -1
  121. package/src/commands/new.ts +46 -45
  122. package/src/def/artifacts.ts +22 -3
  123. package/src/def/build.ts +64 -8
  124. package/src/def/create-npm-dirs.ts +9 -0
  125. package/src/def/new.ts +28 -3
  126. package/src/def/pre-publish.ts +12 -3
  127. package/src/def/rename.ts +11 -2
  128. package/src/def/universalize.ts +9 -0
  129. package/src/def/version.ts +9 -0
  130. package/src/index.ts +2 -0
  131. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  132. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  133. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  134. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  135. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  136. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +711 -158
  137. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  138. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  139. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  140. package/src/utils/__tests__/config.spec.ts +81 -0
  141. package/src/utils/__tests__/typegen.spec.ts +18 -3
  142. package/src/utils/cargo.ts +2 -2
  143. package/src/utils/config.ts +116 -10
  144. package/src/utils/index.ts +0 -1
  145. package/src/utils/metadata.ts +38 -13
  146. package/src/utils/misc.ts +11 -3
  147. package/src/utils/target.ts +22 -4
  148. package/src/utils/typegen.ts +98 -49
  149. package/src/utils/version.ts +10 -8
  150. package/dist/api/load-wasi-template.d.ts +0 -1
  151. package/dist/api/load-wasi-template.js +0 -64
  152. package/dist/api/load-wasi-template.js.map +0 -1
  153. package/dist/api/wasi-worker-template.d.ts +0 -1
  154. package/dist/api/wasi-worker-template.js +0 -53
  155. package/dist/api/wasi-worker-template.js.map +0 -1
  156. package/dist/utils/ci.d.ts +0 -11
  157. package/dist/utils/ci.js +0 -96
  158. package/dist/utils/ci.js.map +0 -1
  159. package/src/api/load-wasi-template.ts +0 -66
  160. package/src/api/wasi-worker-template.ts +0 -52
  161. package/src/utils/ci.ts +0 -111
@@ -1 +1,2 @@
1
1
  export declare function createCjsBinding(localName: string, pkgName: string, idents: string[]): string;
2
+ export declare function createEsmBinding(localName: string, pkgName: string, idents: string[]): string;
@@ -1,16 +1,48 @@
1
1
  export function createCjsBinding(localName, pkgName, idents) {
2
- return `// prettier-ignore
3
- /* eslint-disable */
4
- /* auto-generated by NAPI-RS */
5
-
6
- const { existsSync, readFileSync } = require('fs')
7
- const { join } = require('path')
2
+ return `${bindingHeader}
3
+ const { createRequire } = require('node:module')
4
+ require = createRequire(__filename)
8
5
 
9
- const { platform, arch } = process
6
+ ${createCommonBinding(localName, pkgName)}
7
+ module.exports = nativeBinding
8
+ ${idents
9
+ .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
10
+ .join('\n')}
11
+ `;
12
+ }
13
+ export function createEsmBinding(localName, pkgName, idents) {
14
+ return `${bindingHeader}
15
+ import { createRequire } from 'node:module'
16
+ const require = createRequire(import.meta.url)
17
+ const __dirname = new URL('.', import.meta.url).pathname
10
18
 
19
+ ${createCommonBinding(localName, pkgName)}
20
+ const { ${idents.join(', ')} } = nativeBinding
21
+ ${idents.map((ident) => `export { ${ident} }`).join('\n')}
22
+ `;
23
+ }
24
+ const bindingHeader = `// prettier-ignore
25
+ /* eslint-disable */
26
+ // @ts-nocheck
27
+ /* auto-generated by NAPI-RS */
28
+ `;
29
+ function createCommonBinding(localName, pkgName) {
30
+ function requireTuple(tuple) {
31
+ return `try {
32
+ return require('./${localName}.${tuple}.node')
33
+ } catch (e) {
34
+ loadErrors.push(e)
35
+ }
36
+ try {
37
+ return require('${pkgName}-${tuple}')
38
+ } catch (e) {
39
+ loadErrors.push(e)
40
+ }
41
+ `;
42
+ }
43
+ return `const { readFileSync } = require('node:fs')
11
44
  let nativeBinding = null
12
- let localFileExisted = false
13
- let loadError = null
45
+ const loadErrors = []
14
46
 
15
47
  const isMusl = () => {
16
48
  let musl = false
@@ -37,7 +69,11 @@ const isMuslFromFilesystem = () => {
37
69
  }
38
70
 
39
71
  const isMuslFromReport = () => {
40
- const report = typeof process.report.getReport === 'function' ? process.report.getReport() : null
72
+ let report = null
73
+ if (typeof process.report?.getReport === 'function') {
74
+ process.report.excludeNetwork = true
75
+ report = process.report.getReport()
76
+ }
41
77
  if (!report) {
42
78
  return null
43
79
  }
@@ -61,233 +97,116 @@ const isMuslFromChildProcess = () => {
61
97
  }
62
98
  }
63
99
 
64
- switch (platform) {
65
- case 'android':
66
- switch (arch) {
67
- case 'arm64':
68
- localFileExisted = existsSync(join(__dirname, '${localName}.android-arm64.node'))
69
- try {
70
- if (localFileExisted) {
71
- nativeBinding = require('./${localName}.android-arm64.node')
72
- } else {
73
- nativeBinding = require('${pkgName}-android-arm64')
74
- }
75
- } catch (e) {
76
- loadError = e
77
- }
78
- break
79
- case 'arm':
80
- localFileExisted = existsSync(join(__dirname, '${localName}.android-arm-eabi.node'))
81
- try {
82
- if (localFileExisted) {
83
- nativeBinding = require('./${localName}.android-arm-eabi.node')
84
- } else {
85
- nativeBinding = require('${pkgName}-android-arm-eabi')
86
- }
87
- } catch (e) {
88
- loadError = e
89
- }
90
- break
91
- default:
92
- throw new Error(\`Unsupported architecture on Android \${arch}\`)
100
+ function requireNative() {
101
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
102
+ try {
103
+ nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
104
+ } catch (err) {
105
+ loadErrors.push(err)
93
106
  }
94
- break
95
- case 'win32':
96
- switch (arch) {
97
- case 'x64':
98
- localFileExisted = existsSync(
99
- join(__dirname, '${localName}.win32-x64-msvc.node')
100
- )
101
- try {
102
- if (localFileExisted) {
103
- nativeBinding = require('./${localName}.win32-x64-msvc.node')
104
- } else {
105
- nativeBinding = require('${pkgName}-win32-x64-msvc')
106
- }
107
- } catch (e) {
108
- loadError = e
109
- }
110
- break
111
- case 'ia32':
112
- localFileExisted = existsSync(
113
- join(__dirname, '${localName}.win32-ia32-msvc.node')
114
- )
115
- try {
116
- if (localFileExisted) {
117
- nativeBinding = require('./${localName}.win32-ia32-msvc.node')
118
- } else {
119
- nativeBinding = require('${pkgName}-win32-ia32-msvc')
120
- }
121
- } catch (e) {
122
- loadError = e
123
- }
124
- break
125
- case 'arm64':
126
- localFileExisted = existsSync(
127
- join(__dirname, '${localName}.win32-arm64-msvc.node')
128
- )
129
- try {
130
- if (localFileExisted) {
131
- nativeBinding = require('./${localName}.win32-arm64-msvc.node')
132
- } else {
133
- nativeBinding = require('${pkgName}-win32-arm64-msvc')
134
- }
135
- } catch (e) {
136
- loadError = e
137
- }
138
- break
139
- default:
140
- throw new Error(\`Unsupported architecture on Windows: \${arch}\`)
107
+ } else if (process.platform === 'android') {
108
+ if (process.arch === 'arm64') {
109
+ ${requireTuple('android-arm64')}
110
+ } else if (process.arch === 'arm') {
111
+ ${requireTuple('android-arm-eabi')}
112
+ } else {
113
+ loadErrors.push(new Error(\`Unsupported architecture on Android \${process.arch}\`))
141
114
  }
142
- break
143
- case 'darwin':
144
- localFileExisted = existsSync(join(__dirname, '${localName}.darwin-universal.node'))
145
- try {
146
- if (localFileExisted) {
147
- nativeBinding = require('./${localName}.darwin-universal.node')
115
+ } else if (process.platform === 'win32') {
116
+ if (process.arch === 'x64') {
117
+ ${requireTuple('win32-x64-msvc')}
118
+ } else if (process.arch === 'ia32') {
119
+ ${requireTuple('win32-ia32-msvc')}
120
+ } else if (process.arch === 'arm64') {
121
+ ${requireTuple('win32-arm64-msvc')}
122
+ } else {
123
+ loadErrors.push(new Error(\`Unsupported architecture on Windows: \${process.arch}\`))
124
+ }
125
+ } else if (process.platform === 'darwin') {
126
+ ${requireTuple('darwin-universal')}
127
+ if (process.arch === 'x64') {
128
+ ${requireTuple('darwin-x64')}
129
+ } else if (process.arch === 'arm64') {
130
+ ${requireTuple('darwin-arm64')}
131
+ } else {
132
+ loadErrors.push(new Error(\`Unsupported architecture on macOS: \${process.arch}\`))
133
+ }
134
+ } else if (process.platform === 'freebsd') {
135
+ if (process.arch === 'x64') {
136
+ ${requireTuple('freebsd-x64')}
137
+ } else if (process.arch === 'arm64') {
138
+ ${requireTuple('freebsd-arm64')}
139
+ } else {
140
+ loadErrors.push(new Error(\`Unsupported architecture on FreeBSD: \${process.arch}\`))
141
+ }
142
+ } else if (process.platform === 'linux') {
143
+ if (process.arch === 'x64') {
144
+ if (isMusl()) {
145
+ ${requireTuple('linux-x64-musl')}
146
+ } else {
147
+ ${requireTuple('linux-x64-gnu')}
148
+ }
149
+ } else if (process.arch === 'arm64') {
150
+ if (isMusl()) {
151
+ ${requireTuple('linux-arm64-musl')}
152
+ } else {
153
+ ${requireTuple('linux-arm64-gnu')}
154
+ }
155
+ } else if (process.arch === 'arm') {
156
+ if (isMusl()) {
157
+ ${requireTuple('linux-arm-musleabihf')}
148
158
  } else {
149
- nativeBinding = require('${pkgName}-darwin-universal')
159
+ ${requireTuple('linux-arm-gnueabihf')}
150
160
  }
151
- break
152
- } catch {}
153
- switch (arch) {
154
- case 'x64':
155
- localFileExisted = existsSync(join(__dirname, '${localName}.darwin-x64.node'))
156
- try {
157
- if (localFileExisted) {
158
- nativeBinding = require('./${localName}.darwin-x64.node')
159
- } else {
160
- nativeBinding = require('${pkgName}-darwin-x64')
161
- }
162
- } catch (e) {
163
- loadError = e
164
- }
165
- break
166
- case 'arm64':
167
- localFileExisted = existsSync(
168
- join(__dirname, '${localName}.darwin-arm64.node')
169
- )
170
- try {
171
- if (localFileExisted) {
172
- nativeBinding = require('./${localName}.darwin-arm64.node')
173
- } else {
174
- nativeBinding = require('${pkgName}-darwin-arm64')
175
- }
176
- } catch (e) {
177
- loadError = e
178
- }
179
- break
180
- default:
181
- throw new Error(\`Unsupported architecture on macOS: \${arch}\`)
161
+ } else if (process.arch === 'riscv64') {
162
+ if (isMusl()) {
163
+ ${requireTuple('linux-riscv64-musl')}
164
+ } else {
165
+ ${requireTuple('linux-riscv64-gnu')}
166
+ }
167
+ } else if (process.arch === 'ppc64') {
168
+ ${requireTuple('linux-ppc64-gnu')}
169
+ } else if (process.arch === 's390x') {
170
+ ${requireTuple('linux-s390x-gnu')}
171
+ } else {
172
+ loadErrors.push(new Error(\`Unsupported architecture on Linux: \${process.arch}\`))
182
173
  }
183
- break
184
- case 'freebsd':
185
- if (arch !== 'x64') {
186
- throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`)
174
+ } else {
175
+ loadErrors.push(new Error(\`Unsupported OS: \${process.platform}, architecture: \${process.arch}\`))
176
+ }
177
+ }
178
+
179
+ nativeBinding = requireNative()
180
+
181
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
182
+ try {
183
+ nativeBinding = require('./${localName}.wasi.cjs')
184
+ } catch (err) {
185
+ if (process.env.NAPI_RS_FORCE_WASI) {
186
+ loadErrors.push(err)
187
187
  }
188
- localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node'))
188
+ }
189
+ if (!nativeBinding) {
189
190
  try {
190
- if (localFileExisted) {
191
- nativeBinding = require('./${localName}.freebsd-x64.node')
192
- } else {
193
- nativeBinding = require('${pkgName}-freebsd-x64')
191
+ nativeBinding = require('${pkgName}-wasm32-wasi')
192
+ } catch (err) {
193
+ if (process.env.NAPI_RS_FORCE_WASI) {
194
+ loadErrors.push(err)
194
195
  }
195
- } catch (e) {
196
- loadError = e
197
- }
198
- break
199
- case 'linux':
200
- switch (arch) {
201
- case 'x64':
202
- if (isMusl()) {
203
- localFileExisted = existsSync(
204
- join(__dirname, '${localName}.linux-x64-musl.node')
205
- )
206
- try {
207
- if (localFileExisted) {
208
- nativeBinding = require('./${localName}.linux-x64-musl.node')
209
- } else {
210
- nativeBinding = require('${pkgName}-linux-x64-musl')
211
- }
212
- } catch (e) {
213
- loadError = e
214
- }
215
- } else {
216
- localFileExisted = existsSync(
217
- join(__dirname, '${localName}.linux-x64-gnu.node')
218
- )
219
- try {
220
- if (localFileExisted) {
221
- nativeBinding = require('./${localName}.linux-x64-gnu.node')
222
- } else {
223
- nativeBinding = require('${pkgName}-linux-x64-gnu')
224
- }
225
- } catch (e) {
226
- loadError = e
227
- }
228
- }
229
- break
230
- case 'arm64':
231
- if (isMusl()) {
232
- localFileExisted = existsSync(
233
- join(__dirname, '${localName}.linux-arm64-musl.node')
234
- )
235
- try {
236
- if (localFileExisted) {
237
- nativeBinding = require('./${localName}.linux-arm64-musl.node')
238
- } else {
239
- nativeBinding = require('${pkgName}-linux-arm64-musl')
240
- }
241
- } catch (e) {
242
- loadError = e
243
- }
244
- } else {
245
- localFileExisted = existsSync(
246
- join(__dirname, '${localName}.linux-arm64-gnu.node')
247
- )
248
- try {
249
- if (localFileExisted) {
250
- nativeBinding = require('./${localName}.linux-arm64-gnu.node')
251
- } else {
252
- nativeBinding = require('${pkgName}-linux-arm64-gnu')
253
- }
254
- } catch (e) {
255
- loadError = e
256
- }
257
- }
258
- break
259
- case 'arm':
260
- localFileExisted = existsSync(
261
- join(__dirname, '${localName}.linux-arm-gnueabihf.node')
262
- )
263
- try {
264
- if (localFileExisted) {
265
- nativeBinding = require('./${localName}.linux-arm-gnueabihf.node')
266
- } else {
267
- nativeBinding = require('${pkgName}-linux-arm-gnueabihf')
268
- }
269
- } catch (e) {
270
- loadError = e
271
- }
272
- break
273
- default:
274
- throw new Error(\`Unsupported architecture on Linux: \${arch}\`)
275
196
  }
276
- break
277
- default:
278
- throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
197
+ }
279
198
  }
280
199
 
281
200
  if (!nativeBinding) {
282
- if (loadError) {
283
- throw loadError
201
+ if (loadErrors.length > 0) {
202
+ // TODO Link to documentation with potential fixes
203
+ // - The package owner could build/publish bindings for this arch
204
+ // - The user may need to bundle the correct files
205
+ // - The user may need to re-install node_modules to get new packages
206
+ throw new Error('Failed to load native binding', { cause: loadErrors })
284
207
  }
285
208
  throw new Error(\`Failed to load native binding\`)
286
209
  }
287
-
288
- ${idents
289
- .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
290
- .join('\n')}
291
210
  `;
292
211
  }
293
212
  //# sourceMappingURL=js-binding.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js-binding.js","sourceRoot":"","sources":["../../../src/api/templates/js-binding.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,OAAe,EACf,MAAgB;IAEhB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAkEgD,SAAS;;;yCAGzB,SAAS;;uCAEX,OAAO;;;;;;;yDAOW,SAAS;;;yCAGzB,SAAS;;uCAEX,OAAO;;;;;;;;;;;;;;6BAcjB,SAAS;;;;yCAIG,SAAS;;uCAEX,OAAO;;;;;;;;6BAQjB,SAAS;;;;yCAIG,SAAS;;uCAEX,OAAO;;;;;;;;6BAQjB,SAAS;;;;yCAIG,SAAS;;uCAEX,OAAO;;;;;;;;;;;qDAWO,SAAS;;;qCAGzB,SAAS;;mCAEX,OAAO;;;;;;yDAMe,SAAS;;;yCAGzB,SAAS;;uCAEX,OAAO;;;;;;;;6BAQjB,SAAS;;;;yCAIG,SAAS;;uCAEX,OAAO;;;;;;;;;;;;;;qDAcO,SAAS;;;qCAGzB,SAAS;;mCAEX,OAAO;;;;;;;;;;;+BAWX,SAAS;;;;2CAIG,SAAS;;yCAEX,OAAO;;;;;;;+BAOjB,SAAS;;;;2CAIG,SAAS;;yCAEX,OAAO;;;;;;;;;;+BAUjB,SAAS;;;;2CAIG,SAAS;;yCAEX,OAAO;;;;;;;+BAOjB,SAAS;;;;2CAIG,SAAS;;yCAEX,OAAO;;;;;;;;;6BASnB,SAAS;;;;yCAIG,SAAS;;uCAEX,OAAO;;;;;;;;;;;;;;;;;;;;;EAqB5C,MAAM;SACL,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,KAAK,oBAAoB,KAAK,EAAE,CAAC;SAClE,IAAI,CAAC,IAAI,CAAC;CACZ,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"js-binding.js","sourceRoot":"","sources":["../../../src/api/templates/js-binding.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,OAAe,EACf,MAAgB;IAEhB,OAAO,GAAG,aAAa;;;;EAIvB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;;EAEvC,MAAM;SACL,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,KAAK,oBAAoB,KAAK,EAAE,CAAC;SAClE,IAAI,CAAC,IAAI,CAAC;CACZ,CAAA;AACD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,OAAe,EACf,MAAgB;IAEhB,OAAO,GAAG,aAAa;;;;;EAKvB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;UAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;EACzB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACxD,CAAA;AACD,CAAC;AAED,MAAM,aAAa,GAAG;;;;CAIrB,CAAA;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAE,OAAe;IAC7D,SAAS,YAAY,CAAC,KAAa;QACjC,OAAO;4BACiB,SAAS,IAAI,KAAK;;;;;0BAKpB,OAAO,IAAI,KAAK;;;;CAIzC,CAAA;IACC,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkED,YAAY,CAAC,eAAe,CAAC;;QAE7B,YAAY,CAAC,kBAAkB,CAAC;;;;;;QAMhC,YAAY,CAAC,gBAAgB,CAAC;;QAE9B,YAAY,CAAC,iBAAiB,CAAC;;QAE/B,YAAY,CAAC,kBAAkB,CAAC;;;;;MAKlC,YAAY,CAAC,kBAAkB,CAAC;;QAE9B,YAAY,CAAC,YAAY,CAAC;;QAE1B,YAAY,CAAC,cAAc,CAAC;;;;;;QAM5B,YAAY,CAAC,aAAa,CAAC;;QAE3B,YAAY,CAAC,eAAe,CAAC;;;;;;;UAO3B,YAAY,CAAC,gBAAgB,CAAC;;UAE9B,YAAY,CAAC,eAAe,CAAC;;;;UAI7B,YAAY,CAAC,kBAAkB,CAAC;;UAEhC,YAAY,CAAC,iBAAiB,CAAC;;;;UAI/B,YAAY,CAAC,sBAAsB,CAAC;;UAEpC,YAAY,CAAC,qBAAqB,CAAC;;;;UAInC,YAAY,CAAC,oBAAoB,CAAC;;UAElC,YAAY,CAAC,mBAAmB,CAAC;;;QAGnC,YAAY,CAAC,iBAAiB,CAAC;;QAE/B,YAAY,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;iCAaN,SAAS;;;;;;;;iCAQT,OAAO;;;;;;;;;;;;;;;;;;;CAmBvC,CAAA;AACD,CAAC"}
@@ -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 +1 @@
1
- {"version":3,"file":"lib.rs.js","sourceRoot":"","sources":["../../../src/api/templates/lib.rs.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;;;;;;;;;CAShC,CAAA"}
1
+ {"version":3,"file":"lib.rs.js","sourceRoot":"","sources":["../../../src/api/templates/lib.rs.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;;;;;;CAMhC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const createWasiBrowserBinding: (wasiFilename: string, initialMemory?: number, maximumMemory?: number, fs?: boolean, asyncInit?: boolean) => string;
2
+ export declare const createWasiBinding: (wasmFileName: string, packageName: string, initialMemory?: number, maximumMemory?: number) => string;
@@ -0,0 +1,168 @@
1
+ export const createWasiBrowserBinding = (wasiFilename, initialMemory = 4000, maximumMemory = 65536, fs = false, asyncInit = false) => {
2
+ const fsImport = fs ? `import { memfs } from '@napi-rs/wasm-runtime/fs'` : '';
3
+ const wasiCreation = fs
4
+ ? `
5
+ export const { fs: __fs, vol: __volume } = memfs()
6
+
7
+ const __wasi = new __WASI({
8
+ version: 'preview1',
9
+ fs: __fs,
10
+ preopens: {
11
+ '/': '/',
12
+ },
13
+ })`
14
+ : `
15
+ const __wasi = new __WASI({
16
+ version: 'preview1',
17
+ })`;
18
+ const workerFsHandler = fs
19
+ ? ` worker.addEventListener('message', __wasmCreateOnMessageForFsProxy(__fs))\n`
20
+ : '';
21
+ const emnapiInstantiateImport = asyncInit
22
+ ? `instantiateNapiModule as __emnapiInstantiateNapiModule`
23
+ : `instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync`;
24
+ const emnapiInstantiateCall = asyncInit
25
+ ? `await __emnapiInstantiateNapiModule`
26
+ : `__emnapiInstantiateNapiModuleSync`;
27
+ return `import {
28
+ createOnMessage as __wasmCreateOnMessageForFsProxy,
29
+ getDefaultContext as __emnapiGetDefaultContext,
30
+ ${emnapiInstantiateImport},
31
+ WASI as __WASI,
32
+ } from '@napi-rs/wasm-runtime'
33
+ ${fsImport}
34
+ import __wasmUrl from './${wasiFilename}.wasm?url'
35
+ ${wasiCreation}
36
+
37
+ const __emnapiContext = __emnapiGetDefaultContext()
38
+
39
+ const __sharedMemory = new WebAssembly.Memory({
40
+ initial: ${initialMemory},
41
+ maximum: ${maximumMemory},
42
+ shared: true,
43
+ })
44
+
45
+ const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())
46
+
47
+ const {
48
+ instance: __napiInstance,
49
+ module: __wasiModule,
50
+ napiModule: __napiModule,
51
+ } = ${emnapiInstantiateCall}(__wasmFile, {
52
+ context: __emnapiContext,
53
+ asyncWorkPoolSize: 4,
54
+ wasi: __wasi,
55
+ onCreateWorker() {
56
+ const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {
57
+ type: 'module',
58
+ })
59
+ ${workerFsHandler}
60
+ return worker
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
+ for (const name of Object.keys(instance.exports)) {
73
+ if (name.startsWith('__napi_register__')) {
74
+ instance.exports[name]()
75
+ }
76
+ }
77
+ },
78
+ })
79
+ `;
80
+ };
81
+ export const createWasiBinding = (wasmFileName, packageName, initialMemory = 4000, maximumMemory = 65536) => `/* eslint-disable */
82
+ /* prettier-ignore */
83
+
84
+ /* auto-generated by NAPI-RS */
85
+
86
+ const __nodeFs = require('node:fs')
87
+ const __nodePath = require('node:path')
88
+ const { WASI: __nodeWASI } = require('node:wasi')
89
+ const { Worker } = require('node:worker_threads')
90
+
91
+ const {
92
+ createOnMessage: __wasmCreateOnMessageForFsProxy,
93
+ getDefaultContext: __emnapiGetDefaultContext,
94
+ instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
95
+ } = require('@napi-rs/wasm-runtime')
96
+
97
+ const __rootDir = __nodePath.parse(process.cwd()).root
98
+
99
+ const __wasi = new __nodeWASI({
100
+ version: 'preview1',
101
+ env: process.env,
102
+ preopens: {
103
+ [__rootDir]: __rootDir,
104
+ }
105
+ })
106
+
107
+ const __emnapiContext = __emnapiGetDefaultContext()
108
+
109
+ const __sharedMemory = new WebAssembly.Memory({
110
+ initial: ${initialMemory},
111
+ maximum: ${maximumMemory},
112
+ shared: true,
113
+ })
114
+
115
+ let __wasmFilePath = __nodePath.join(__dirname, '${wasmFileName}.wasm')
116
+ const __wasmDebugFilePath = __nodePath.join(__dirname, '${wasmFileName}.debug.wasm')
117
+
118
+ if (__nodeFs.existsSync(__wasmDebugFilePath)) {
119
+ __wasmFilePath = __wasmDebugFilePath
120
+ } else if (!__nodeFs.existsSync(__wasmFilePath)) {
121
+ try {
122
+ __wasmFilePath = __nodePath.resolve('${packageName}-wasm32-wasi')
123
+ } catch {
124
+ throw new Error('Cannot find ${wasmFileName}.wasm file, and ${packageName}-wasm32-wasi package is not installed.')
125
+ }
126
+ }
127
+
128
+ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
129
+ context: __emnapiContext,
130
+ asyncWorkPoolSize: (function() {
131
+ const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
132
+ // NaN > 0 is false
133
+ if (threadsSizeFromEnv > 0) {
134
+ return threadsSizeFromEnv
135
+ } else {
136
+ return 4
137
+ }
138
+ })(),
139
+ reuseWorker: true,
140
+ wasi: __wasi,
141
+ onCreateWorker() {
142
+ const worker = new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
143
+ env: process.env,
144
+ })
145
+ worker.onmessage = ({ data }) => {
146
+ __wasmCreateOnMessageForFsProxy(__nodeFs)(data)
147
+ }
148
+ return worker
149
+ },
150
+ overwriteImports(importObject) {
151
+ importObject.env = {
152
+ ...importObject.env,
153
+ ...importObject.napi,
154
+ ...importObject.emnapi,
155
+ memory: __sharedMemory,
156
+ }
157
+ return importObject
158
+ },
159
+ beforeInit({ instance }) {
160
+ for (const name of Object.keys(instance.exports)) {
161
+ if (name.startsWith('__napi_register__')) {
162
+ instance.exports[name]()
163
+ }
164
+ }
165
+ },
166
+ })
167
+ `;
168
+ //# sourceMappingURL=load-wasi-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-wasi-template.js","sourceRoot":"","sources":["../../../src/api/templates/load-wasi-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAAoB,EACpB,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,KAAK,EACrB,EAAE,GAAG,KAAK,EACV,SAAS,GAAG,KAAK,EACjB,EAAE;IACF,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7E,MAAM,YAAY,GAAG,EAAE;QACrB,CAAC,CAAC;;;;;;;;;GASH;QACC,CAAC,CAAC;;;GAGH,CAAA;IAED,MAAM,eAAe,GAAG,EAAE;QACxB,CAAC,CAAC,iFAAiF;QACnF,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,uBAAuB,GAAG,SAAS;QACvC,CAAC,CAAC,wDAAwD;QAC1D,CAAC,CAAC,gEAAgE,CAAA;IACpE,MAAM,qBAAqB,GAAG,SAAS;QACrC,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,mCAAmC,CAAA;IAEvC,OAAO;;;IAGL,uBAAuB;;;EAGzB,QAAQ;2BACiB,YAAY;EACrC,YAAY;;;;;aAKD,aAAa;aACb,aAAa;;;;;;;;;;MAUpB,qBAAqB;;;;;;;;EAQzB,eAAe;;;;;;;;;;;;;;;;;;;;CAoBhB,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,YAAoB,EACpB,WAAmB,EACnB,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,KAAK,EACrB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6BQ,aAAa;aACb,aAAa;;;;mDAIyB,YAAY;0DACL,YAAY;;;;;;2CAM3B,WAAW;;mCAEnB,YAAY,mBAAmB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C5E,CAAA"}
@@ -1,8 +1,15 @@
1
- export declare const createPackageJson: ({ name, binaryName, targets, license, engineRequirement, cliVersion, }: {
1
+ import type { SupportedTestFramework } from '../../utils/config.js';
2
+ export interface PackageMeta {
3
+ 'dist-tags': {
4
+ [index: string]: string;
5
+ };
6
+ }
7
+ export declare const createPackageJson: ({ name, binaryName, targets, license, engineRequirement, cliVersion, testFramework, }: {
2
8
  name: string;
3
9
  binaryName: string;
4
10
  targets: string[];
5
11
  license: string;
6
12
  engineRequirement: string;
7
13
  cliVersion: string;
8
- }) => string;
14
+ testFramework: SupportedTestFramework;
15
+ }) => Promise<string>;
@@ -1,7 +1,16 @@
1
- export const createPackageJson = ({ name, binaryName, targets, license, engineRequirement, cliVersion, }) => {
1
+ import { UNIVERSAL_TARGETS } from '../../utils/target.js';
2
+ export const createPackageJson = async ({ name, binaryName, targets, license, engineRequirement, cliVersion, testFramework, }) => {
3
+ const hasWasmTarget = targets.some((t) => t.includes('wasm'));
4
+ const universalTargets = targets.filter((t) => t in UNIVERSAL_TARGETS);
5
+ const unifiedtargets = universalTargets.length
6
+ ? targets.filter((target) => !universalTargets.some((t) => {
7
+ // @ts-expect-error
8
+ return UNIVERSAL_TARGETS[t].includes(target);
9
+ }))
10
+ : targets;
2
11
  const content = {
3
12
  name,
4
- version: '1.0.0',
13
+ version: '0.0.0',
5
14
  license,
6
15
  engines: {
7
16
  node: engineRequirement,
@@ -9,14 +18,15 @@ export const createPackageJson = ({ name, binaryName, targets, license, engineRe
9
18
  type: 'commonjs',
10
19
  main: 'index.js',
11
20
  types: 'index.d.ts',
21
+ browser: 'browser.js',
12
22
  module: undefined,
13
23
  exports: undefined,
14
24
  napi: {
15
25
  binaryName,
16
- targets,
26
+ targets: unifiedtargets,
17
27
  },
18
28
  scripts: {
19
- test: 'node -e "assert(require(\'.\').sum(1, 2) === 3)"',
29
+ test: testFramework,
20
30
  build: 'napi build --release --platform --strip',
21
31
  'build:debug': 'napi build',
22
32
  prepublishOnly: 'napi prepublish -t npm',
@@ -27,6 +37,18 @@ export const createPackageJson = ({ name, binaryName, targets, license, engineRe
27
37
  '@napi-rs/cli': `^${cliVersion}`,
28
38
  },
29
39
  };
40
+ if (testFramework === 'ava') {
41
+ const avaMeta = await fetch(`https://registry.npmjs.org/ava`).then((res) => res.json());
42
+ content.devDependencies['ava'] = `^${avaMeta['dist-tags'].latest}`;
43
+ content.ava = {
44
+ timeout: '1m',
45
+ };
46
+ }
47
+ if (hasWasmTarget) {
48
+ const wasmRuntime = await fetch(`https://registry.npmjs.org/@napi-rs/wasm-runtime`).then((res) => res.json());
49
+ const latest = wasmRuntime['dist-tags'].latest;
50
+ content.devDependencies['@napi-rs/wasm-runtime'] = `^${latest}`;
51
+ }
30
52
  return JSON.stringify(content, null, 2);
31
53
  };
32
54
  //# sourceMappingURL=package.json.js.map