@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.
Files changed (40) hide show
  1. package/dist/cli.js +201 -52
  2. package/dist/index.cjs +200 -51
  3. package/dist/index.d.cts +4 -4
  4. package/dist/index.d.ts +4 -4
  5. package/dist/index.js +201 -52
  6. package/package.json +3 -3
  7. package/src/api/__tests__/__snapshots__/templates.spec.ts.md +353 -0
  8. package/src/api/__tests__/__snapshots__/templates.spec.ts.snap +0 -0
  9. package/src/api/__tests__/android-build.spec.ts +113 -0
  10. package/src/api/__tests__/artifacts.spec.ts +95 -0
  11. package/src/api/__tests__/build-regressions.spec.ts +128 -0
  12. package/src/api/__tests__/build.spec.ts +1020 -0
  13. package/src/api/__tests__/create-npm-dirs.spec.ts +561 -0
  14. package/src/api/__tests__/new-node-api-version.spec.ts +87 -0
  15. package/src/api/__tests__/new.spec.ts +527 -0
  16. package/src/api/__tests__/rename.spec.ts +181 -0
  17. package/src/api/__tests__/templates.spec.ts +164 -0
  18. package/src/api/__tests__/universalize.spec.ts +128 -0
  19. package/src/api/artifacts.ts +7 -16
  20. package/src/api/build.ts +346 -105
  21. package/src/api/new.ts +65 -1
  22. package/src/commands/__tests__/new.spec.ts +13 -0
  23. package/src/def/build.ts +6 -6
  24. package/src/utils/__tests__/__fixtures__/napi_type_def +202 -0
  25. package/src/utils/__tests__/__fixtures__/runtime_string_enum_flag +2 -0
  26. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  27. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  28. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +180 -0
  29. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  30. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +1197 -0
  31. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  32. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +22 -0
  33. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  34. package/src/utils/__tests__/config.spec.ts +81 -0
  35. package/src/utils/__tests__/metadata.spec.ts +28 -0
  36. package/src/utils/__tests__/misc.spec.ts +56 -0
  37. package/src/utils/__tests__/target.spec.ts +19 -0
  38. package/src/utils/__tests__/typegen.spec.ts +85 -0
  39. package/src/utils/__tests__/version.spec.ts +7 -0
  40. 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.2",
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.135.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": "2m",
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
+ `
@@ -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
+ })