@napi-rs/cli 3.7.2 → 3.7.3
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.
- package/dist/cli.js +201 -52
- package/dist/index.cjs +200 -51
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +201 -52
- package/package.json +3 -3
- package/src/api/__tests__/__snapshots__/templates.spec.ts.md +353 -0
- package/src/api/__tests__/__snapshots__/templates.spec.ts.snap +0 -0
- package/src/api/__tests__/android-build.spec.ts +113 -0
- package/src/api/__tests__/artifacts.spec.ts +95 -0
- package/src/api/__tests__/build-regressions.spec.ts +128 -0
- package/src/api/__tests__/build.spec.ts +1020 -0
- package/src/api/__tests__/create-npm-dirs.spec.ts +561 -0
- package/src/api/__tests__/new-node-api-version.spec.ts +87 -0
- package/src/api/__tests__/new.spec.ts +527 -0
- package/src/api/__tests__/rename.spec.ts +181 -0
- package/src/api/__tests__/templates.spec.ts +164 -0
- package/src/api/__tests__/universalize.spec.ts +128 -0
- package/src/api/artifacts.ts +7 -16
- package/src/api/build.ts +346 -105
- package/src/api/new.ts +65 -1
- package/src/commands/__tests__/new.spec.ts +13 -0
- package/src/def/build.ts +6 -6
- package/src/utils/__tests__/__fixtures__/napi_type_def +202 -0
- package/src/utils/__tests__/__fixtures__/runtime_string_enum_flag +2 -0
- package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
- package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/target.spec.ts.md +180 -0
- package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +1197 -0
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/version.spec.ts.md +22 -0
- package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
- package/src/utils/__tests__/config.spec.ts +81 -0
- package/src/utils/__tests__/metadata.spec.ts +28 -0
- package/src/utils/__tests__/misc.spec.ts +56 -0
- package/src/utils/__tests__/target.spec.ts +19 -0
- package/src/utils/__tests__/typegen.spec.ts +85 -0
- package/src/utils/__tests__/version.spec.ts +7 -0
- package/src/utils/version.ts +2 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@napi-rs/cli",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.3",
|
|
4
4
|
"description": "Cli tools for napi-rs",
|
|
5
5
|
"author": "LongYinan <lynweklm@gmail.com>",
|
|
6
6
|
"homepage": "https://napi.rs/",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"ava": "^8.0.1",
|
|
85
85
|
"empathic": "^2.0.1",
|
|
86
86
|
"env-paths": "^4.0.0",
|
|
87
|
-
"oxc-parser": "^0.
|
|
87
|
+
"oxc-parser": "^0.139.0",
|
|
88
88
|
"prettier": "^3.8.3",
|
|
89
89
|
"tsdown": "^0.22.2",
|
|
90
90
|
"tslib": "^2.8.1",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"extensions": [
|
|
112
112
|
"ts"
|
|
113
113
|
],
|
|
114
|
-
"timeout": "
|
|
114
|
+
"timeout": "5m",
|
|
115
115
|
"workerThreads": false,
|
|
116
116
|
"files": [
|
|
117
117
|
"**/__tests__/**/*.spec.ts",
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# Snapshot report for `src/api/__tests__/templates.spec.ts`
|
|
2
|
+
|
|
3
|
+
The actual snapshot is saved in `templates.spec.ts.snap`.
|
|
4
|
+
|
|
5
|
+
Generated by [AVA](https://avajs.dev).
|
|
6
|
+
|
|
7
|
+
## createWasiBrowserBinding default
|
|
8
|
+
|
|
9
|
+
> Snapshot 1
|
|
10
|
+
|
|
11
|
+
`import {␊
|
|
12
|
+
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
|
|
13
|
+
getDefaultContext as __emnapiGetDefaultContext,␊
|
|
14
|
+
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
|
|
15
|
+
WASI as __WASI,␊
|
|
16
|
+
} from '@napi-rs/wasm-runtime'␊
|
|
17
|
+
␊
|
|
18
|
+
␊
|
|
19
|
+
␊
|
|
20
|
+
const __wasi = new __WASI({␊
|
|
21
|
+
version: 'preview1',␊
|
|
22
|
+
})␊
|
|
23
|
+
␊
|
|
24
|
+
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
|
|
25
|
+
const __emnapiContext = __emnapiGetDefaultContext()␊
|
|
26
|
+
␊
|
|
27
|
+
␊
|
|
28
|
+
const __sharedMemory = new WebAssembly.Memory({␊
|
|
29
|
+
initial: 4000,␊
|
|
30
|
+
maximum: 65536,␊
|
|
31
|
+
shared: true,␊
|
|
32
|
+
})␊
|
|
33
|
+
␊
|
|
34
|
+
const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())␊
|
|
35
|
+
␊
|
|
36
|
+
const {␊
|
|
37
|
+
instance: __napiInstance,␊
|
|
38
|
+
module: __wasiModule,␊
|
|
39
|
+
napiModule: __napiModule,␊
|
|
40
|
+
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
|
|
41
|
+
context: __emnapiContext,␊
|
|
42
|
+
asyncWorkPoolSize: 4,␊
|
|
43
|
+
wasi: __wasi,␊
|
|
44
|
+
onCreateWorker() {␊
|
|
45
|
+
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
|
|
46
|
+
type: 'module',␊
|
|
47
|
+
})␊
|
|
48
|
+
␊
|
|
49
|
+
␊
|
|
50
|
+
return worker␊
|
|
51
|
+
},␊
|
|
52
|
+
overwriteImports(importObject) {␊
|
|
53
|
+
importObject.env = {␊
|
|
54
|
+
...importObject.env,␊
|
|
55
|
+
...importObject.napi,␊
|
|
56
|
+
...importObject.emnapi,␊
|
|
57
|
+
memory: __sharedMemory,␊
|
|
58
|
+
}␊
|
|
59
|
+
return importObject␊
|
|
60
|
+
},␊
|
|
61
|
+
beforeInit({ instance }) {␊
|
|
62
|
+
for (const name of Object.keys(instance.exports)) {␊
|
|
63
|
+
if (name.startsWith('__napi_register__')) {␊
|
|
64
|
+
instance.exports[name]()␊
|
|
65
|
+
}␊
|
|
66
|
+
}␊
|
|
67
|
+
},␊
|
|
68
|
+
})␊
|
|
69
|
+
`
|
|
70
|
+
|
|
71
|
+
## createWasiBrowserBinding with errorEvent
|
|
72
|
+
|
|
73
|
+
> Snapshot 1
|
|
74
|
+
|
|
75
|
+
`import {␊
|
|
76
|
+
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
|
|
77
|
+
getDefaultContext as __emnapiGetDefaultContext,␊
|
|
78
|
+
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
|
|
79
|
+
WASI as __WASI,␊
|
|
80
|
+
} from '@napi-rs/wasm-runtime'␊
|
|
81
|
+
␊
|
|
82
|
+
␊
|
|
83
|
+
␊
|
|
84
|
+
const __wasi = new __WASI({␊
|
|
85
|
+
version: 'preview1',␊
|
|
86
|
+
})␊
|
|
87
|
+
␊
|
|
88
|
+
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
|
|
89
|
+
const __emnapiContext = __emnapiGetDefaultContext()␊
|
|
90
|
+
␊
|
|
91
|
+
␊
|
|
92
|
+
const __sharedMemory = new WebAssembly.Memory({␊
|
|
93
|
+
initial: 4000,␊
|
|
94
|
+
maximum: 65536,␊
|
|
95
|
+
shared: true,␊
|
|
96
|
+
})␊
|
|
97
|
+
␊
|
|
98
|
+
const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())␊
|
|
99
|
+
␊
|
|
100
|
+
const {␊
|
|
101
|
+
instance: __napiInstance,␊
|
|
102
|
+
module: __wasiModule,␊
|
|
103
|
+
napiModule: __napiModule,␊
|
|
104
|
+
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
|
|
105
|
+
context: __emnapiContext,␊
|
|
106
|
+
asyncWorkPoolSize: 4,␊
|
|
107
|
+
wasi: __wasi,␊
|
|
108
|
+
onCreateWorker() {␊
|
|
109
|
+
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
|
|
110
|
+
type: 'module',␊
|
|
111
|
+
})␊
|
|
112
|
+
␊
|
|
113
|
+
worker.addEventListener('message', (event) => {␊
|
|
114
|
+
if (event.data && typeof event.data === 'object' && event.data.type === 'error') {␊
|
|
115
|
+
window.dispatchEvent(new CustomEvent('napi-rs-worker-error', { detail: event.data }))␊
|
|
116
|
+
}␊
|
|
117
|
+
})␊
|
|
118
|
+
␊
|
|
119
|
+
return worker␊
|
|
120
|
+
},␊
|
|
121
|
+
overwriteImports(importObject) {␊
|
|
122
|
+
importObject.env = {␊
|
|
123
|
+
...importObject.env,␊
|
|
124
|
+
...importObject.napi,␊
|
|
125
|
+
...importObject.emnapi,␊
|
|
126
|
+
memory: __sharedMemory,␊
|
|
127
|
+
}␊
|
|
128
|
+
return importObject␊
|
|
129
|
+
},␊
|
|
130
|
+
beforeInit({ instance }) {␊
|
|
131
|
+
for (const name of Object.keys(instance.exports)) {␊
|
|
132
|
+
if (name.startsWith('__napi_register__')) {␊
|
|
133
|
+
instance.exports[name]()␊
|
|
134
|
+
}␊
|
|
135
|
+
}␊
|
|
136
|
+
},␊
|
|
137
|
+
})␊
|
|
138
|
+
`
|
|
139
|
+
|
|
140
|
+
## createWasiBrowserBinding with errorEvent and fs
|
|
141
|
+
|
|
142
|
+
> Snapshot 1
|
|
143
|
+
|
|
144
|
+
`import {␊
|
|
145
|
+
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
|
|
146
|
+
getDefaultContext as __emnapiGetDefaultContext,␊
|
|
147
|
+
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
|
|
148
|
+
WASI as __WASI,␊
|
|
149
|
+
} from '@napi-rs/wasm-runtime'␊
|
|
150
|
+
import { memfs } from '@napi-rs/wasm-runtime/fs'␊
|
|
151
|
+
␊
|
|
152
|
+
␊
|
|
153
|
+
export const { fs: __fs, vol: __volume } = memfs()␊
|
|
154
|
+
␊
|
|
155
|
+
const __wasi = new __WASI({␊
|
|
156
|
+
version: 'preview1',␊
|
|
157
|
+
fs: __fs,␊
|
|
158
|
+
preopens: {␊
|
|
159
|
+
'/': '/',␊
|
|
160
|
+
},␊
|
|
161
|
+
})␊
|
|
162
|
+
␊
|
|
163
|
+
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
|
|
164
|
+
const __emnapiContext = __emnapiGetDefaultContext()␊
|
|
165
|
+
␊
|
|
166
|
+
␊
|
|
167
|
+
const __sharedMemory = new WebAssembly.Memory({␊
|
|
168
|
+
initial: 4000,␊
|
|
169
|
+
maximum: 65536,␊
|
|
170
|
+
shared: true,␊
|
|
171
|
+
})␊
|
|
172
|
+
␊
|
|
173
|
+
const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())␊
|
|
174
|
+
␊
|
|
175
|
+
const {␊
|
|
176
|
+
instance: __napiInstance,␊
|
|
177
|
+
module: __wasiModule,␊
|
|
178
|
+
napiModule: __napiModule,␊
|
|
179
|
+
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
|
|
180
|
+
context: __emnapiContext,␊
|
|
181
|
+
asyncWorkPoolSize: 4,␊
|
|
182
|
+
wasi: __wasi,␊
|
|
183
|
+
onCreateWorker() {␊
|
|
184
|
+
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
|
|
185
|
+
type: 'module',␊
|
|
186
|
+
})␊
|
|
187
|
+
worker.addEventListener('message', __wasmCreateOnMessageForFsProxy(__fs))␊
|
|
188
|
+
␊
|
|
189
|
+
worker.addEventListener('message', (event) => {␊
|
|
190
|
+
if (event.data && typeof event.data === 'object' && event.data.type === 'error') {␊
|
|
191
|
+
window.dispatchEvent(new CustomEvent('napi-rs-worker-error', { detail: event.data }))␊
|
|
192
|
+
}␊
|
|
193
|
+
})␊
|
|
194
|
+
␊
|
|
195
|
+
return worker␊
|
|
196
|
+
},␊
|
|
197
|
+
overwriteImports(importObject) {␊
|
|
198
|
+
importObject.env = {␊
|
|
199
|
+
...importObject.env,␊
|
|
200
|
+
...importObject.napi,␊
|
|
201
|
+
...importObject.emnapi,␊
|
|
202
|
+
memory: __sharedMemory,␊
|
|
203
|
+
}␊
|
|
204
|
+
return importObject␊
|
|
205
|
+
},␊
|
|
206
|
+
beforeInit({ instance }) {␊
|
|
207
|
+
for (const name of Object.keys(instance.exports)) {␊
|
|
208
|
+
if (name.startsWith('__napi_register__')) {␊
|
|
209
|
+
instance.exports[name]()␊
|
|
210
|
+
}␊
|
|
211
|
+
}␊
|
|
212
|
+
},␊
|
|
213
|
+
})␊
|
|
214
|
+
`
|
|
215
|
+
|
|
216
|
+
## createWasiBrowserWorkerBinding default
|
|
217
|
+
|
|
218
|
+
> Snapshot 1
|
|
219
|
+
|
|
220
|
+
`import { instantiateNapiModuleSync, MessageHandler, WASI } from '@napi-rs/wasm-runtime'␊
|
|
221
|
+
␊
|
|
222
|
+
const handler = new MessageHandler({␊
|
|
223
|
+
onLoad({ wasmModule, wasmMemory }) {␊
|
|
224
|
+
const wasi = new WASI({␊
|
|
225
|
+
print: function () {␊
|
|
226
|
+
// eslint-disable-next-line no-console␊
|
|
227
|
+
console.log.apply(console, arguments)␊
|
|
228
|
+
},␊
|
|
229
|
+
printErr: function() {␊
|
|
230
|
+
// eslint-disable-next-line no-console␊
|
|
231
|
+
console.error.apply(console, arguments)␊
|
|
232
|
+
␊
|
|
233
|
+
},␊
|
|
234
|
+
})␊
|
|
235
|
+
return instantiateNapiModuleSync(wasmModule, {␊
|
|
236
|
+
childThread: true,␊
|
|
237
|
+
wasi,␊
|
|
238
|
+
overwriteImports(importObject) {␊
|
|
239
|
+
importObject.env = {␊
|
|
240
|
+
...importObject.env,␊
|
|
241
|
+
...importObject.napi,␊
|
|
242
|
+
...importObject.emnapi,␊
|
|
243
|
+
memory: wasmMemory,␊
|
|
244
|
+
}␊
|
|
245
|
+
},␊
|
|
246
|
+
})␊
|
|
247
|
+
},␊
|
|
248
|
+
␊
|
|
249
|
+
})␊
|
|
250
|
+
␊
|
|
251
|
+
globalThis.onmessage = function (e) {␊
|
|
252
|
+
handler.handle(e)␊
|
|
253
|
+
}␊
|
|
254
|
+
`
|
|
255
|
+
|
|
256
|
+
## createWasiBrowserWorkerBinding with errorEvent
|
|
257
|
+
|
|
258
|
+
> Snapshot 1
|
|
259
|
+
|
|
260
|
+
`import { instantiateNapiModuleSync, MessageHandler, WASI } from '@napi-rs/wasm-runtime'␊
|
|
261
|
+
␊
|
|
262
|
+
const errorOutputs = []␊
|
|
263
|
+
␊
|
|
264
|
+
const handler = new MessageHandler({␊
|
|
265
|
+
onLoad({ wasmModule, wasmMemory }) {␊
|
|
266
|
+
const wasi = new WASI({␊
|
|
267
|
+
print: function () {␊
|
|
268
|
+
// eslint-disable-next-line no-console␊
|
|
269
|
+
console.log.apply(console, arguments)␊
|
|
270
|
+
},␊
|
|
271
|
+
printErr: function() {␊
|
|
272
|
+
// eslint-disable-next-line no-console␊
|
|
273
|
+
console.error.apply(console, arguments)␊
|
|
274
|
+
␊
|
|
275
|
+
errorOutputs.push([...arguments])␊
|
|
276
|
+
},␊
|
|
277
|
+
})␊
|
|
278
|
+
return instantiateNapiModuleSync(wasmModule, {␊
|
|
279
|
+
childThread: true,␊
|
|
280
|
+
wasi,␊
|
|
281
|
+
overwriteImports(importObject) {␊
|
|
282
|
+
importObject.env = {␊
|
|
283
|
+
...importObject.env,␊
|
|
284
|
+
...importObject.napi,␊
|
|
285
|
+
...importObject.emnapi,␊
|
|
286
|
+
memory: wasmMemory,␊
|
|
287
|
+
}␊
|
|
288
|
+
},␊
|
|
289
|
+
})␊
|
|
290
|
+
},␊
|
|
291
|
+
onError(error) {␊
|
|
292
|
+
postMessage({ type: 'error', error, errorOutputs })␊
|
|
293
|
+
errorOutputs.length = 0␊
|
|
294
|
+
}␊
|
|
295
|
+
})␊
|
|
296
|
+
␊
|
|
297
|
+
globalThis.onmessage = function (e) {␊
|
|
298
|
+
handler.handle(e)␊
|
|
299
|
+
}␊
|
|
300
|
+
`
|
|
301
|
+
|
|
302
|
+
## createWasiBrowserWorkerBinding with errorEvent and fs
|
|
303
|
+
|
|
304
|
+
> Snapshot 1
|
|
305
|
+
|
|
306
|
+
`import { instantiateNapiModuleSync, MessageHandler, WASI, createFsProxy } from '@napi-rs/wasm-runtime'␊
|
|
307
|
+
import { memfsExported as __memfsExported } from '@napi-rs/wasm-runtime/fs'␊
|
|
308
|
+
␊
|
|
309
|
+
const fs = createFsProxy(__memfsExported)␊
|
|
310
|
+
␊
|
|
311
|
+
const errorOutputs = []␊
|
|
312
|
+
␊
|
|
313
|
+
const handler = new MessageHandler({␊
|
|
314
|
+
onLoad({ wasmModule, wasmMemory }) {␊
|
|
315
|
+
const wasi = new WASI({␊
|
|
316
|
+
fs,␊
|
|
317
|
+
preopens: {␊
|
|
318
|
+
'/': '/',␊
|
|
319
|
+
},␊
|
|
320
|
+
print: function () {␊
|
|
321
|
+
// eslint-disable-next-line no-console␊
|
|
322
|
+
console.log.apply(console, arguments)␊
|
|
323
|
+
},␊
|
|
324
|
+
printErr: function() {␊
|
|
325
|
+
// eslint-disable-next-line no-console␊
|
|
326
|
+
console.error.apply(console, arguments)␊
|
|
327
|
+
␊
|
|
328
|
+
errorOutputs.push([...arguments])␊
|
|
329
|
+
},␊
|
|
330
|
+
})␊
|
|
331
|
+
return instantiateNapiModuleSync(wasmModule, {␊
|
|
332
|
+
childThread: true,␊
|
|
333
|
+
wasi,␊
|
|
334
|
+
overwriteImports(importObject) {␊
|
|
335
|
+
importObject.env = {␊
|
|
336
|
+
...importObject.env,␊
|
|
337
|
+
...importObject.napi,␊
|
|
338
|
+
...importObject.emnapi,␊
|
|
339
|
+
memory: wasmMemory,␊
|
|
340
|
+
}␊
|
|
341
|
+
},␊
|
|
342
|
+
})␊
|
|
343
|
+
},␊
|
|
344
|
+
onError(error) {␊
|
|
345
|
+
postMessage({ type: 'error', error, errorOutputs })␊
|
|
346
|
+
errorOutputs.length = 0␊
|
|
347
|
+
}␊
|
|
348
|
+
})␊
|
|
349
|
+
␊
|
|
350
|
+
globalThis.onmessage = function (e) {␊
|
|
351
|
+
handler.handle(e)␊
|
|
352
|
+
}␊
|
|
353
|
+
`
|
|
Binary file
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { join } from 'node:path'
|
|
5
|
+
|
|
6
|
+
import ava, { type TestFn } from 'ava'
|
|
7
|
+
|
|
8
|
+
import { buildProject } from '../build.js'
|
|
9
|
+
|
|
10
|
+
const test = ava as TestFn<{ tmpDir: string; projectDir: string }>
|
|
11
|
+
|
|
12
|
+
test.beforeEach(async (t) => {
|
|
13
|
+
const tmpDir = join(
|
|
14
|
+
tmpdir(),
|
|
15
|
+
'napi-rs-test',
|
|
16
|
+
`android-build-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
17
|
+
)
|
|
18
|
+
const projectDir = join(tmpDir, 'project')
|
|
19
|
+
|
|
20
|
+
await mkdir(join(projectDir, 'src'), { recursive: true })
|
|
21
|
+
await writeFile(
|
|
22
|
+
join(projectDir, 'Cargo.toml'),
|
|
23
|
+
`[package]
|
|
24
|
+
name = "android_build"
|
|
25
|
+
version = "0.1.0"
|
|
26
|
+
edition = "2021"
|
|
27
|
+
|
|
28
|
+
[[bin]]
|
|
29
|
+
name = "android-build"
|
|
30
|
+
path = "src/main.rs"
|
|
31
|
+
`,
|
|
32
|
+
)
|
|
33
|
+
await writeFile(join(projectDir, 'src', 'main.rs'), 'fn main() {}\n')
|
|
34
|
+
await writeFile(
|
|
35
|
+
join(projectDir, 'package.json'),
|
|
36
|
+
JSON.stringify({ name: 'android-build', version: '0.1.0' }),
|
|
37
|
+
)
|
|
38
|
+
t.context = { tmpDir, projectDir }
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test.afterEach.always(async (t) => {
|
|
42
|
+
if (existsSync(t.context.tmpDir)) {
|
|
43
|
+
await rm(t.context.tmpDir, { recursive: true, force: true })
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
test.serial(
|
|
48
|
+
'requires ANDROID_NDK_LATEST_HOME before spawning an Android cross-build',
|
|
49
|
+
async (t) => {
|
|
50
|
+
const { projectDir } = t.context
|
|
51
|
+
const originalCargo = process.env.CARGO
|
|
52
|
+
const originalNdkHome = process.env.ANDROID_NDK_LATEST_HOME
|
|
53
|
+
process.env.CARGO = join(projectDir, 'cargo-must-not-run')
|
|
54
|
+
delete process.env.ANDROID_NDK_LATEST_HOME
|
|
55
|
+
try {
|
|
56
|
+
const error = await t.throwsAsync(() =>
|
|
57
|
+
buildProject({
|
|
58
|
+
cwd: projectDir,
|
|
59
|
+
target: 'aarch64-linux-android',
|
|
60
|
+
bin: 'android-build',
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
t.regex(error!.message, /ANDROID_NDK_LATEST_HOME.+required/)
|
|
65
|
+
} finally {
|
|
66
|
+
if (originalCargo === undefined) {
|
|
67
|
+
delete process.env.CARGO
|
|
68
|
+
} else {
|
|
69
|
+
process.env.CARGO = originalCargo
|
|
70
|
+
}
|
|
71
|
+
if (originalNdkHome === undefined) {
|
|
72
|
+
delete process.env.ANDROID_NDK_LATEST_HOME
|
|
73
|
+
} else {
|
|
74
|
+
process.env.ANDROID_NDK_LATEST_HOME = originalNdkHome
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
test.serial(
|
|
81
|
+
'skips host Android NDK setup when building with cross',
|
|
82
|
+
async (t) => {
|
|
83
|
+
const { projectDir } = t.context
|
|
84
|
+
const originalCargo = process.env.CARGO
|
|
85
|
+
const originalNdkHome = process.env.ANDROID_NDK_LATEST_HOME
|
|
86
|
+
const cargoPath = join(projectDir, 'cross-must-be-spawned')
|
|
87
|
+
process.env.CARGO = cargoPath
|
|
88
|
+
delete process.env.ANDROID_NDK_LATEST_HOME
|
|
89
|
+
try {
|
|
90
|
+
const { task } = await buildProject({
|
|
91
|
+
cwd: projectDir,
|
|
92
|
+
target: 'aarch64-linux-android',
|
|
93
|
+
bin: 'android-build',
|
|
94
|
+
useCross: true,
|
|
95
|
+
})
|
|
96
|
+
const error = await t.throwsAsync(task)
|
|
97
|
+
|
|
98
|
+
t.is((error!.cause as NodeJS.ErrnoException).path, cargoPath)
|
|
99
|
+
t.notRegex(error!.message, /ANDROID_NDK_LATEST_HOME/)
|
|
100
|
+
} finally {
|
|
101
|
+
if (originalCargo === undefined) {
|
|
102
|
+
delete process.env.CARGO
|
|
103
|
+
} else {
|
|
104
|
+
process.env.CARGO = originalCargo
|
|
105
|
+
}
|
|
106
|
+
if (originalNdkHome === undefined) {
|
|
107
|
+
delete process.env.ANDROID_NDK_LATEST_HOME
|
|
108
|
+
} else {
|
|
109
|
+
process.env.ANDROID_NDK_LATEST_HOME = originalNdkHome
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { join } from 'node:path'
|
|
5
|
+
|
|
6
|
+
import ava, { type TestFn } from 'ava'
|
|
7
|
+
|
|
8
|
+
import { collectArtifacts } from '../artifacts.js'
|
|
9
|
+
|
|
10
|
+
const test = ava as TestFn<{ tmpDir: string }>
|
|
11
|
+
|
|
12
|
+
test.beforeEach(async (t) => {
|
|
13
|
+
const tmpDir = join(
|
|
14
|
+
tmpdir(),
|
|
15
|
+
'napi-rs-test',
|
|
16
|
+
`artifacts-spec-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
await mkdir(tmpDir, { recursive: true })
|
|
20
|
+
t.context = { tmpDir }
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test.afterEach.always(async (t) => {
|
|
24
|
+
if (existsSync(t.context.tmpDir)) {
|
|
25
|
+
await rm(t.context.tmpDir, { recursive: true, force: true })
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('resolves a relative WASI build output directory from cwd', async (t) => {
|
|
30
|
+
const { tmpDir } = t.context
|
|
31
|
+
const binaryName = 'wasi-artifact'
|
|
32
|
+
const packageName = '@napi-rs/wasi-artifact'
|
|
33
|
+
const buildOutputDir = join(tmpDir, 'build-output')
|
|
34
|
+
const wasiPackageDir = join(tmpDir, 'npm', 'wasm32-wasi')
|
|
35
|
+
|
|
36
|
+
await Promise.all([
|
|
37
|
+
mkdir(join(tmpDir, 'artifacts'), { recursive: true }),
|
|
38
|
+
mkdir(buildOutputDir, { recursive: true }),
|
|
39
|
+
mkdir(wasiPackageDir, { recursive: true }),
|
|
40
|
+
])
|
|
41
|
+
await writeFile(
|
|
42
|
+
join(tmpDir, 'package.json'),
|
|
43
|
+
JSON.stringify({
|
|
44
|
+
name: packageName,
|
|
45
|
+
version: '0.0.0',
|
|
46
|
+
napi: {
|
|
47
|
+
binaryName,
|
|
48
|
+
targets: ['wasm32-wasi-preview1-threads'],
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
const browserEntry =
|
|
54
|
+
"const worker = new URL('./wasi-worker-browser.mjs', import.meta.url)\n"
|
|
55
|
+
await Promise.all([
|
|
56
|
+
writeFile(join(buildOutputDir, `${binaryName}.wasi.cjs`), 'node binding'),
|
|
57
|
+
writeFile(join(buildOutputDir, 'wasi-worker.mjs'), 'node worker'),
|
|
58
|
+
writeFile(
|
|
59
|
+
join(buildOutputDir, `${binaryName}.wasi-browser.js`),
|
|
60
|
+
browserEntry,
|
|
61
|
+
),
|
|
62
|
+
writeFile(
|
|
63
|
+
join(buildOutputDir, 'wasi-worker-browser.mjs'),
|
|
64
|
+
'browser worker',
|
|
65
|
+
),
|
|
66
|
+
])
|
|
67
|
+
|
|
68
|
+
await collectArtifacts({
|
|
69
|
+
cwd: tmpDir,
|
|
70
|
+
buildOutputDir: 'build-output',
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
t.is(
|
|
74
|
+
await readFile(join(wasiPackageDir, `${binaryName}.wasi.cjs`), 'utf8'),
|
|
75
|
+
'node binding',
|
|
76
|
+
)
|
|
77
|
+
t.is(
|
|
78
|
+
await readFile(join(wasiPackageDir, 'wasi-worker.mjs'), 'utf8'),
|
|
79
|
+
'node worker',
|
|
80
|
+
)
|
|
81
|
+
t.is(
|
|
82
|
+
await readFile(join(wasiPackageDir, 'wasi-worker-browser.mjs'), 'utf8'),
|
|
83
|
+
'browser worker',
|
|
84
|
+
)
|
|
85
|
+
t.is(
|
|
86
|
+
await readFile(
|
|
87
|
+
join(wasiPackageDir, `${binaryName}.wasi-browser.js`),
|
|
88
|
+
'utf8',
|
|
89
|
+
),
|
|
90
|
+
browserEntry.replace(
|
|
91
|
+
"new URL('./wasi-worker-browser.mjs', import.meta.url)",
|
|
92
|
+
`new URL('${packageName}-wasm32-wasi/wasi-worker-browser.mjs', import.meta.url)`,
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
})
|