@napi-rs/cli 3.0.0-alpha.6 → 3.0.0-alpha.61

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 (155) hide show
  1. package/dist/api/artifacts.js +28 -7
  2. package/dist/api/artifacts.js.map +1 -1
  3. package/dist/api/build.js +220 -39
  4. package/dist/api/build.js.map +1 -1
  5. package/dist/api/create-npm-dirs.js +45 -8
  6. package/dist/api/create-npm-dirs.js.map +1 -1
  7. package/dist/api/new.js +57 -20
  8. package/dist/api/new.js.map +1 -1
  9. package/dist/api/pre-publish.js +9 -7
  10. package/dist/api/pre-publish.js.map +1 -1
  11. package/dist/api/rename.js +9 -1
  12. package/dist/api/rename.js.map +1 -1
  13. package/dist/api/templates/ci-template.d.ts +3 -1
  14. package/dist/api/templates/ci-template.js +124 -124
  15. package/dist/api/templates/ci-template.js.map +1 -1
  16. package/dist/api/templates/ci.yml.d.ts +3 -1
  17. package/dist/api/templates/ci.yml.js +21 -5
  18. package/dist/api/templates/ci.yml.js.map +1 -1
  19. package/dist/api/templates/js-binding.js +104 -214
  20. package/dist/api/templates/js-binding.js.map +1 -1
  21. package/dist/api/templates/lib.rs.js +1 -4
  22. package/dist/api/templates/lib.rs.js.map +1 -1
  23. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  24. package/dist/api/templates/load-wasi-template.js +166 -0
  25. package/dist/api/templates/load-wasi-template.js.map +1 -0
  26. package/dist/api/templates/package.json.d.ts +9 -2
  27. package/dist/api/templates/package.json.js +26 -4
  28. package/dist/api/templates/package.json.js.map +1 -1
  29. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  30. package/dist/api/templates/wasi-worker-template.js +122 -0
  31. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  32. package/dist/api/universalize.js +5 -5
  33. package/dist/api/universalize.js.map +1 -1
  34. package/dist/api/version.js +2 -2
  35. package/dist/api/version.js.map +1 -1
  36. package/dist/commands/artifacts.js +2 -2
  37. package/dist/commands/artifacts.js.map +1 -1
  38. package/dist/commands/build.js +1 -1
  39. package/dist/commands/build.js.map +1 -1
  40. package/dist/commands/new.js +30 -8
  41. package/dist/commands/new.js.map +1 -1
  42. package/dist/def/artifacts.d.ts +21 -1
  43. package/dist/def/artifacts.js +10 -2
  44. package/dist/def/artifacts.js.map +1 -1
  45. package/dist/def/build.d.ts +22 -4
  46. package/dist/def/build.js +16 -4
  47. package/dist/def/build.js.map +1 -1
  48. package/dist/def/create-npm-dirs.d.ts +10 -0
  49. package/dist/def/create-npm-dirs.js +4 -0
  50. package/dist/def/create-npm-dirs.js.map +1 -1
  51. package/dist/def/new.d.ts +25 -7
  52. package/dist/def/new.js +11 -1
  53. package/dist/def/new.js.map +1 -1
  54. package/dist/def/pre-publish.d.ts +12 -2
  55. package/dist/def/pre-publish.js +7 -3
  56. package/dist/def/pre-publish.js.map +1 -1
  57. package/dist/def/rename.d.ts +16 -6
  58. package/dist/def/rename.js +5 -1
  59. package/dist/def/rename.js.map +1 -1
  60. package/dist/def/universalize.d.ts +10 -0
  61. package/dist/def/universalize.js +4 -0
  62. package/dist/def/universalize.js.map +1 -1
  63. package/dist/def/version.d.ts +10 -0
  64. package/dist/def/version.js +4 -0
  65. package/dist/def/version.js.map +1 -1
  66. package/dist/index.cjs +8143 -14638
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.js +1 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  71. package/dist/utils/__tests__/config.spec.js +63 -0
  72. package/dist/utils/__tests__/config.spec.js.map +1 -0
  73. package/dist/utils/__tests__/typegen.spec.js +8 -4
  74. package/dist/utils/__tests__/typegen.spec.js.map +1 -1
  75. package/dist/utils/cargo.js +1 -1
  76. package/dist/utils/cargo.js.map +1 -1
  77. package/dist/utils/config.d.ts +49 -5
  78. package/dist/utils/config.js +38 -6
  79. package/dist/utils/config.js.map +1 -1
  80. package/dist/utils/index.d.ts +0 -1
  81. package/dist/utils/index.js +0 -1
  82. package/dist/utils/index.js.map +1 -1
  83. package/dist/utils/metadata.js +2 -2
  84. package/dist/utils/metadata.js.map +1 -1
  85. package/dist/utils/misc.d.ts +1 -2
  86. package/dist/utils/misc.js +3 -3
  87. package/dist/utils/misc.js.map +1 -1
  88. package/dist/utils/target.d.ts +7 -5
  89. package/dist/utils/target.js +17 -3
  90. package/dist/utils/target.js.map +1 -1
  91. package/dist/utils/typegen.d.ts +1 -1
  92. package/dist/utils/typegen.js +29 -9
  93. package/dist/utils/typegen.js.map +1 -1
  94. package/dist/utils/version.d.ts +2 -1
  95. package/dist/utils/version.js +10 -8
  96. package/dist/utils/version.js.map +1 -1
  97. package/package.json +25 -24
  98. package/src/api/artifacts.ts +81 -9
  99. package/src/api/build.ts +379 -58
  100. package/src/api/create-npm-dirs.ts +56 -8
  101. package/src/api/new.ts +89 -31
  102. package/src/api/pre-publish.ts +13 -7
  103. package/src/api/rename.ts +10 -1
  104. package/src/api/templates/ci-template.ts +134 -124
  105. package/src/api/templates/ci.yml.ts +27 -6
  106. package/src/api/templates/js-binding.ts +105 -214
  107. package/src/api/templates/lib.rs.ts +1 -4
  108. package/src/api/templates/load-wasi-template.ts +180 -0
  109. package/src/api/templates/package.json.ts +47 -5
  110. package/src/api/templates/wasi-worker-template.ts +122 -0
  111. package/src/api/universalize.ts +13 -8
  112. package/src/api/version.ts +5 -2
  113. package/src/commands/artifacts.ts +2 -2
  114. package/src/commands/build.ts +1 -1
  115. package/src/commands/new.ts +31 -8
  116. package/src/def/artifacts.ts +22 -3
  117. package/src/def/build.ts +36 -8
  118. package/src/def/create-npm-dirs.ts +9 -0
  119. package/src/def/new.ts +28 -3
  120. package/src/def/pre-publish.ts +12 -3
  121. package/src/def/rename.ts +11 -2
  122. package/src/def/universalize.ts +9 -0
  123. package/src/def/version.ts +9 -0
  124. package/src/index.ts +2 -0
  125. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  126. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  127. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  128. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  129. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  130. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +713 -158
  131. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  132. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  133. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  134. package/src/utils/__tests__/config.spec.ts +81 -0
  135. package/src/utils/__tests__/typegen.spec.ts +18 -3
  136. package/src/utils/cargo.ts +1 -1
  137. package/src/utils/config.ts +114 -12
  138. package/src/utils/index.ts +0 -1
  139. package/src/utils/metadata.ts +2 -2
  140. package/src/utils/misc.ts +11 -3
  141. package/src/utils/target.ts +22 -4
  142. package/src/utils/typegen.ts +37 -8
  143. package/src/utils/version.ts +10 -8
  144. package/dist/api/load-wasi-template.d.ts +0 -1
  145. package/dist/api/load-wasi-template.js +0 -63
  146. package/dist/api/load-wasi-template.js.map +0 -1
  147. package/dist/api/wasi-worker-template.d.ts +0 -1
  148. package/dist/api/wasi-worker-template.js +0 -53
  149. package/dist/api/wasi-worker-template.js.map +0 -1
  150. package/dist/utils/ci.d.ts +0 -11
  151. package/dist/utils/ci.js +0 -96
  152. package/dist/utils/ci.js.map +0 -1
  153. package/src/api/load-wasi-template.ts +0 -65
  154. package/src/api/wasi-worker-template.ts +0 -52
  155. package/src/utils/ci.ts +0 -111
@@ -1,16 +1,25 @@
1
1
  export function createCjsBinding(localName, pkgName, idents) {
2
+ function requireTuple(tuple) {
3
+ return `try {
4
+ return require('./${localName}.${tuple}.node')
5
+ } catch (e) {
6
+ loadErrors.push(e)
7
+ }
8
+ try {
9
+ return require('${pkgName}-${tuple}')
10
+ } catch (e) {
11
+ loadErrors.push(e)
12
+ }
13
+ `;
14
+ }
2
15
  return `// prettier-ignore
3
16
  /* eslint-disable */
4
17
  /* auto-generated by NAPI-RS */
5
18
 
6
- const { existsSync, readFileSync } = require('fs')
7
- const { join } = require('path')
8
-
9
- const { platform, arch } = process
19
+ const { readFileSync } = require('fs')
10
20
 
11
21
  let nativeBinding = null
12
- let localFileExisted = false
13
- let loadError = null
22
+ const loadErrors = []
14
23
 
15
24
  const isMusl = () => {
16
25
  let musl = false
@@ -61,226 +70,107 @@ const isMuslFromChildProcess = () => {
61
70
  }
62
71
  }
63
72
 
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}\`)
73
+ function requireNative() {
74
+ if (process.platform === 'android') {
75
+ if (process.arch === 'arm64') {
76
+ ${requireTuple('android-arm64')}
77
+ } else if (process.arch === 'arm') {
78
+ ${requireTuple('android-arm-eabi')}
79
+ } else {
80
+ loadErrors.push(new Error(\`Unsupported architecture on Android \${process.arch}\`))
93
81
  }
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}\`)
82
+ } else if (process.platform === 'win32') {
83
+ if (process.arch === 'x64') {
84
+ ${requireTuple('win32-x64-msvc')}
85
+ } else if (process.arch === 'ia32') {
86
+ ${requireTuple('win32-ia32-msvc')}
87
+ } else if (process.arch === 'arm64') {
88
+ ${requireTuple('win32-arm64-msvc')}
89
+ } else {
90
+ loadErrors.push(new Error(\`Unsupported architecture on Windows: \${process.arch}\`))
141
91
  }
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')
92
+ } else if (process.platform === 'darwin') {
93
+ ${requireTuple('darwin-universal')}
94
+ if (process.arch === 'x64') {
95
+ ${requireTuple('darwin-x64')}
96
+ } else if (process.arch === 'arm64') {
97
+ ${requireTuple('darwin-arm64')}
98
+ } else {
99
+ loadErrors.push(new Error(\`Unsupported architecture on macOS: \${process.arch}\`))
100
+ }
101
+ } else if (process.platform === 'freebsd') {
102
+ if (process.arch === 'x64') {
103
+ ${requireTuple('freebsd-x64')}
104
+ } else if (process.arch === 'arm64') {
105
+ ${requireTuple('freebsd-arm64')}
106
+ } else {
107
+ loadErrors.push(new Error(\`Unsupported architecture on FreeBSD: \${process.arch}\`))
108
+ }
109
+ } else if (process.platform === 'linux') {
110
+ if (process.arch === 'x64') {
111
+ if (isMusl()) {
112
+ ${requireTuple('linux-x64-musl')}
113
+ } else {
114
+ ${requireTuple('linux-x64-gnu')}
115
+ }
116
+ } else if (process.arch === 'arm64') {
117
+ if (isMusl()) {
118
+ ${requireTuple('linux-arm64-musl')}
119
+ } else {
120
+ ${requireTuple('linux-arm64-gnu')}
121
+ }
122
+ } else if (process.arch === 'arm') {
123
+ if (isMusl()) {
124
+ ${requireTuple('linux-arm-musleabihf')}
148
125
  } else {
149
- nativeBinding = require('${pkgName}-darwin-universal')
126
+ ${requireTuple('linux-arm-gnueabihf')}
150
127
  }
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}\`)
128
+ } else if (process.arch === 'riscv64') {
129
+ if (isMusl()) {
130
+ ${requireTuple('linux-riscv64-musl')}
131
+ } else {
132
+ ${requireTuple('linux-riscv64-gnu')}
133
+ }
134
+ } else if (process.arch === 'ppc64') {
135
+ ${requireTuple('linux-ppc64-gnu')}
136
+ } else if (process.arch === 's390x') {
137
+ ${requireTuple('linux-s390x-gnu')}
138
+ } else {
139
+ loadErrors.push(new Error(\`Unsupported architecture on Linux: \${process.arch}\`))
182
140
  }
183
- break
184
- case 'freebsd':
185
- if (arch !== 'x64') {
186
- throw new Error(\`Unsupported architecture on FreeBSD: \${arch}\`)
141
+ } else {
142
+ loadErrors.push(new Error(\`Unsupported OS: \${process.platform}, architecture: \${process.arch}\`))
143
+ }
144
+ }
145
+
146
+ nativeBinding = requireNative()
147
+
148
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
149
+ try {
150
+ nativeBinding = require('./${localName}.wasi.cjs')
151
+ } catch (err) {
152
+ if (process.env.NAPI_RS_FORCE_WASI) {
153
+ console.error(err)
187
154
  }
188
- localFileExisted = existsSync(join(__dirname, '${localName}.freebsd-x64.node'))
155
+ }
156
+ if (!nativeBinding) {
189
157
  try {
190
- if (localFileExisted) {
191
- nativeBinding = require('./${localName}.freebsd-x64.node')
192
- } else {
193
- nativeBinding = require('${pkgName}-freebsd-x64')
158
+ nativeBinding = require('${pkgName}-wasm32-wasi')
159
+ } catch (err) {
160
+ if (process.env.NAPI_RS_FORCE_WASI) {
161
+ console.error(err)
194
162
  }
195
- } catch (e) {
196
- loadError = e
197
163
  }
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
- }
276
- break
277
- default:
278
- throw new Error(\`Unsupported OS: \${platform}, architecture: \${arch}\`)
164
+ }
279
165
  }
280
166
 
281
167
  if (!nativeBinding) {
282
- if (loadError) {
283
- throw loadError
168
+ if (loadErrors.length > 0) {
169
+ // TODO Link to documentation with potential fixes
170
+ // - The package owner could build/publish bindings for this arch
171
+ // - The user may need to bundle the correct files
172
+ // - The user may need to re-install node_modules to get new packages
173
+ throw new Error('Failed to load native binding', { cause: loadErrors })
284
174
  }
285
175
  throw new Error(\`Failed to load native binding\`)
286
176
  }
@@ -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,SAAS,YAAY,CAAC,KAAa;QACjC,OAAO;4BACiB,SAAS,IAAI,KAAK;;;;;0BAKpB,OAAO,IAAI,KAAK;;;;CAIzC,CAAA;IACC,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6DD,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;;;;;;;;;;;;;;;;;;;;EAoBtC,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,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, wasiRegisterFunctions: string[], initialMemory?: number, maximumMemory?: number, fs?: boolean) => string;
2
+ export declare const createWasiBinding: (wasmFileName: string, packageName: string, wasiRegisterFunctions: string[], initialMemory?: number, maximumMemory?: number) => string;
@@ -0,0 +1,166 @@
1
+ export const createWasiBrowserBinding = (wasiFilename, wasiRegisterFunctions, initialMemory = 4000, maximumMemory = 65536, fs = 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
+ return `import {
22
+ instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,
23
+ getDefaultContext as __emnapiGetDefaultContext,
24
+ WASI as __WASI,
25
+ createOnMessage as __wasmCreateOnMessageForFsProxy,
26
+ } from '@napi-rs/wasm-runtime'
27
+ ${fsImport}
28
+ import __wasmUrl from './${wasiFilename}.wasm?url'
29
+ ${wasiCreation}
30
+
31
+ const __emnapiContext = __emnapiGetDefaultContext()
32
+
33
+ const __sharedMemory = new WebAssembly.Memory({
34
+ initial: ${initialMemory},
35
+ maximum: ${maximumMemory},
36
+ shared: true,
37
+ })
38
+
39
+ const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())
40
+
41
+ const {
42
+ instance: __napiInstance,
43
+ module: __wasiModule,
44
+ napiModule: __napiModule,
45
+ } = __emnapiInstantiateNapiModuleSync(__wasmFile, {
46
+ context: __emnapiContext,
47
+ asyncWorkPoolSize: 4,
48
+ wasi: __wasi,
49
+ onCreateWorker() {
50
+ const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {
51
+ type: 'module',
52
+ })
53
+ ${workerFsHandler}
54
+ return worker
55
+ },
56
+ overwriteImports(importObject) {
57
+ importObject.env = {
58
+ ...importObject.env,
59
+ ...importObject.napi,
60
+ ...importObject.emnapi,
61
+ memory: __sharedMemory,
62
+ }
63
+ return importObject
64
+ },
65
+ beforeInit({ instance }) {
66
+ __napi_rs_initialize_modules(instance)
67
+ },
68
+ })
69
+
70
+ function __napi_rs_initialize_modules(__napiInstance) {
71
+ ${wasiRegisterFunctions
72
+ .map((name) => ` __napiInstance.exports['${name}']?.()`)
73
+ .join('\n')}
74
+ }
75
+ `;
76
+ };
77
+ export const createWasiBinding = (wasmFileName, packageName, wasiRegisterFunctions, initialMemory = 4000, maximumMemory = 65536) => `/* eslint-disable */
78
+ /* prettier-ignore */
79
+
80
+ /* auto-generated by NAPI-RS */
81
+
82
+ const __nodeFs = require('node:fs')
83
+ const __nodePath = require('node:path')
84
+ const { WASI: __nodeWASI } = require('node:wasi')
85
+ const { Worker } = require('node:worker_threads')
86
+
87
+ const {
88
+ instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
89
+ getDefaultContext: __emnapiGetDefaultContext,
90
+ createOnMessage: __wasmCreateOnMessageForFsProxy,
91
+ } = require('@napi-rs/wasm-runtime')
92
+
93
+ const __rootDir = __nodePath.parse(process.cwd()).root
94
+
95
+ const __wasi = new __nodeWASI({
96
+ version: 'preview1',
97
+ env: process.env,
98
+ preopens: {
99
+ [__rootDir]: __rootDir,
100
+ }
101
+ })
102
+
103
+ const __emnapiContext = __emnapiGetDefaultContext()
104
+
105
+ const __sharedMemory = new WebAssembly.Memory({
106
+ initial: ${initialMemory},
107
+ maximum: ${maximumMemory},
108
+ shared: true,
109
+ })
110
+
111
+ let __wasmFilePath = __nodePath.join(__dirname, '${wasmFileName}.wasm')
112
+ const __wasmDebugFilePath = __nodePath.join(__dirname, '${wasmFileName}.debug.wasm')
113
+
114
+ if (__nodeFs.existsSync(__wasmDebugFilePath)) {
115
+ __wasmFilePath = __wasmDebugFilePath
116
+ } else if (!__nodeFs.existsSync(__wasmFilePath)) {
117
+ try {
118
+ __wasmFilePath = __nodePath.resolve('${packageName}-wasm32-wasi')
119
+ } catch {
120
+ throw new Error('Cannot find ${wasmFileName}.wasm file, and ${packageName}-wasm32-wasi package is not installed.')
121
+ }
122
+ }
123
+
124
+ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
125
+ context: __emnapiContext,
126
+ asyncWorkPoolSize: (function() {
127
+ const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
128
+ // NaN > 0 is false
129
+ if (threadsSizeFromEnv > 0) {
130
+ return threadsSizeFromEnv
131
+ } else {
132
+ return 4
133
+ }
134
+ })(),
135
+ wasi: __wasi,
136
+ onCreateWorker() {
137
+ const worker = new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
138
+ env: process.env,
139
+ execArgv: ['--experimental-wasi-unstable-preview1'],
140
+ })
141
+ worker.onmessage = ({ data }) => {
142
+ __wasmCreateOnMessageForFsProxy(__nodeFs)(data)
143
+ }
144
+ return worker
145
+ },
146
+ overwriteImports(importObject) {
147
+ importObject.env = {
148
+ ...importObject.env,
149
+ ...importObject.napi,
150
+ ...importObject.emnapi,
151
+ memory: __sharedMemory,
152
+ }
153
+ return importObject
154
+ },
155
+ beforeInit({ instance }) {
156
+ __napi_rs_initialize_modules(instance)
157
+ }
158
+ })
159
+
160
+ function __napi_rs_initialize_modules(__napiInstance) {
161
+ ${wasiRegisterFunctions
162
+ .map((name) => ` __napiInstance.exports['${name}']?.()`)
163
+ .join('\n')}
164
+ }
165
+ `;
166
+ //# 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,qBAA+B,EAC/B,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,KAAK,EACrB,EAAE,GAAG,KAAK,EACV,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,OAAO;;;;;;EAMP,QAAQ;2BACiB,YAAY;EACrC,YAAY;;;;;aAKD,aAAa;aACb,aAAa;;;;;;;;;;;;;;;;;;EAkBxB,eAAe;;;;;;;;;;;;;;;;;;EAkBf,qBAAqB;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,6BAA6B,IAAI,QAAQ,CAAC;SACxD,IAAI,CAAC,IAAI,CAAC;;CAEZ,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,YAAoB,EACpB,WAAmB,EACnB,qBAA+B,EAC/B,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,KAAK,EACrB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6BQ,aAAa;aACb,aAAa;;;;mDAIyB,YAAY;0DACL,YAAY;;;;;;2CAM3B,WAAW;;mCAEnB,YAAY,mBAAmB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyC3E,qBAAqB;KACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,6BAA6B,IAAI,QAAQ,CAAC;KACxD,IAAI,CAAC,IAAI,CAAC;;CAEZ,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
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sourceRoot":"","sources":["../../../src/api/templates/package.json.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,IAAI,EACJ,UAAU,EACV,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,UAAU,GAQX,EAAE,EAAE;IACH,MAAM,OAAO,GAA4B;QACvC,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,iBAAiB;SACxB;QACD,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,UAAU;YACV,OAAO;SACR;QACD,OAAO,EAAE;YACP,IAAI,EAAE,kDAAkD;YACxD,KAAK,EAAE,yCAAyC;YAChD,aAAa,EAAE,YAAY;YAC3B,cAAc,EAAE,wBAAwB;YACxC,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,cAAc;SACxB;QACD,eAAe,EAAE;YACf,cAAc,EAAE,IAAI,UAAU,EAAE;SACjC;KACF,CAAA;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACzC,CAAC,CAAA"}
1
+ {"version":3,"file":"package.json.js","sourceRoot":"","sources":["../../../src/api/templates/package.json.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAMzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACtC,IAAI,EACJ,UAAU,EACV,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,aAAa,GASd,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7D,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CACQ,CAAA;IACvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM;QAC5C,CAAC,CAAC,OAAO,CAAC,MAAM,CACZ,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,mBAAmB;YACnB,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC,CAAC,CACL;QACH,CAAC,CAAC,OAAO,CAAA;IACX,MAAM,OAAO,GAA4B;QACvC,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,iBAAiB;SACxB;QACD,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,UAAU;YACV,OAAO,EAAE,cAAc;SACxB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,yCAAyC;YAChD,aAAa,EAAE,YAAY;YAC3B,cAAc,EAAE,wBAAwB;YACxC,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,cAAc;SACxB;QACD,eAAe,EAAE;YACf,cAAc,EAAE,IAAI,UAAU,EAAE;SACjC;KACF,CAAA;IAED,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAChE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAA0B,CAC5C,CAAA;QACD,OAAO,CAAC,eAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAA;QACnE,OAAO,CAAC,GAAG,GAAG;YACZ,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,MAAM,KAAK,CAC7B,kDAAkD,CACnD,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAA0B,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAA;QAC9C,OAAO,CAAC,eAAgB,CAAC,uBAAuB,CAAC,GAAG,IAAI,MAAM,EAAE,CAAA;IAClE,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACzC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const WASI_WORKER_TEMPLATE = "import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { parse } from \"node:path\";\nimport { WASI } from \"node:wasi\";\nimport { parentPort, Worker } from \"node:worker_threads\";\n\nconst require = createRequire(import.meta.url);\n\nconst { instantiateNapiModuleSync, MessageHandler, getDefaultContext } = require(\"@napi-rs/wasm-runtime\");\n\nif (parentPort) {\n parentPort.on(\"message\", (data) => {\n globalThis.onmessage({ data });\n });\n}\n\nObject.assign(globalThis, {\n self: globalThis,\n require,\n Worker,\n importScripts: function (f) {\n ;(0, eval)(fs.readFileSync(f, \"utf8\") + \"//# sourceURL=\" + f);\n },\n postMessage: function (msg) {\n if (parentPort) {\n parentPort.postMessage(msg);\n }\n },\n});\n\nconst emnapiContext = getDefaultContext();\n\nconst __rootDir = parse(process.cwd()).root;\n\nconst handler = new MessageHandler({\n onLoad({ wasmModule, wasmMemory }) {\n const wasi = new WASI({\n version: 'preview1',\n env: process.env,\n preopens: {\n [__rootDir]: __rootDir,\n },\n });\n\n return instantiateNapiModuleSync(wasmModule, {\n childThread: true,\n wasi,\n context: emnapiContext,\n overwriteImports(importObject) {\n importObject.env = {\n ...importObject.env,\n ...importObject.napi,\n ...importObject.emnapi,\n memory: wasmMemory\n };\n },\n });\n },\n});\n\nglobalThis.onmessage = function (e) {\n handler.handle(e);\n};\n";
2
+ export declare const createWasiBrowserWorkerBinding: (fs: boolean) => string;