@napi-rs/cli 3.0.0-alpha.7 → 3.0.0-alpha.71

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 (160) 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 +247 -47
  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 +144 -131
  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 +135 -221
  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 +166 -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 +8146 -14672
  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 +48 -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.js +2 -2
  88. package/dist/utils/metadata.js.map +1 -1
  89. package/dist/utils/misc.d.ts +1 -2
  90. package/dist/utils/misc.js +3 -3
  91. package/dist/utils/misc.js.map +1 -1
  92. package/dist/utils/target.d.ts +7 -5
  93. package/dist/utils/target.js +17 -3
  94. package/dist/utils/target.js.map +1 -1
  95. package/dist/utils/typegen.d.ts +1 -1
  96. package/dist/utils/typegen.js +51 -17
  97. package/dist/utils/typegen.js.map +1 -1
  98. package/dist/utils/version.d.ts +2 -1
  99. package/dist/utils/version.js +10 -8
  100. package/dist/utils/version.js.map +1 -1
  101. package/package.json +27 -26
  102. package/src/api/artifacts.ts +81 -9
  103. package/src/api/build.ts +403 -66
  104. package/src/api/create-npm-dirs.ts +57 -9
  105. package/src/api/new.ts +89 -31
  106. package/src/api/pre-publish.ts +13 -7
  107. package/src/api/rename.ts +10 -1
  108. package/src/api/templates/cargo.toml.ts +1 -0
  109. package/src/api/templates/ci-template.ts +154 -131
  110. package/src/api/templates/ci.yml.ts +27 -6
  111. package/src/api/templates/js-binding.ts +141 -219
  112. package/src/api/templates/lib.rs.ts +1 -4
  113. package/src/api/templates/load-wasi-template.ts +180 -0
  114. package/src/api/templates/package.json.ts +47 -5
  115. package/src/api/templates/wasi-worker-template.ts +122 -0
  116. package/src/api/universalize.ts +13 -8
  117. package/src/api/version.ts +5 -2
  118. package/src/commands/artifacts.ts +2 -2
  119. package/src/commands/build.ts +1 -1
  120. package/src/commands/new.ts +46 -45
  121. package/src/def/artifacts.ts +22 -3
  122. package/src/def/build.ts +64 -8
  123. package/src/def/create-npm-dirs.ts +9 -0
  124. package/src/def/new.ts +28 -3
  125. package/src/def/pre-publish.ts +12 -3
  126. package/src/def/rename.ts +11 -2
  127. package/src/def/universalize.ts +9 -0
  128. package/src/def/version.ts +9 -0
  129. package/src/index.ts +2 -0
  130. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  131. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  132. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  133. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  134. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  135. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +711 -158
  136. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  137. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  138. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  139. package/src/utils/__tests__/config.spec.ts +81 -0
  140. package/src/utils/__tests__/typegen.spec.ts +18 -3
  141. package/src/utils/cargo.ts +2 -2
  142. package/src/utils/config.ts +112 -10
  143. package/src/utils/index.ts +0 -1
  144. package/src/utils/metadata.ts +2 -2
  145. package/src/utils/misc.ts +11 -3
  146. package/src/utils/target.ts +22 -4
  147. package/src/utils/typegen.ts +81 -36
  148. package/src/utils/version.ts +10 -8
  149. package/dist/api/load-wasi-template.d.ts +0 -1
  150. package/dist/api/load-wasi-template.js +0 -63
  151. package/dist/api/load-wasi-template.js.map +0 -1
  152. package/dist/api/wasi-worker-template.d.ts +0 -1
  153. package/dist/api/wasi-worker-template.js +0 -53
  154. package/dist/api/wasi-worker-template.js.map +0 -1
  155. package/dist/utils/ci.d.ts +0 -11
  156. package/dist/utils/ci.js +0 -96
  157. package/dist/utils/ci.js.map +0 -1
  158. package/src/api/load-wasi-template.ts +0 -65
  159. package/src/api/wasi-worker-template.ts +0 -52
  160. package/src/utils/ci.ts +0 -111
package/cli.mjs CHANGED
@@ -5,7 +5,7 @@ import { resolve } from 'path'
5
5
  import { fileURLToPath } from 'url'
6
6
 
7
7
  execSync(
8
- `node --loader ts-node/esm/transpile-only ${resolve(
8
+ `node --import @oxc-node/core/register ${resolve(
9
9
  fileURLToPath(import.meta.url),
10
10
  '../src/cli.ts',
11
11
  )} ${process.argv.slice(2).join(' ')}`,
@@ -1,18 +1,18 @@
1
- import { join, parse, resolve } from 'node:path';
1
+ import { join, parse } from 'node:path';
2
2
  import * as colors from 'colorette';
3
3
  import { applyDefaultArtifactsOptions, } from '../def/artifacts.js';
4
4
  import { readNapiConfig, debugFactory, readFileAsync, writeFileAsync, UniArchsByPlatform, readdirAsync, } from '../utils/index.js';
5
5
  const debug = debugFactory('artifacts');
6
6
  export async function collectArtifacts(userOptions) {
7
7
  const options = applyDefaultArtifactsOptions(userOptions);
8
- const packageJsonPath = resolve(options.cwd, options.packageJsonPath);
9
- const { targets, binaryName } = await readNapiConfig(packageJsonPath);
10
- const distDirs = targets.map((platform) => resolve(options.cwd, options.npmDir, platform.platformArchABI));
8
+ const packageJsonPath = join(options.cwd, options.packageJsonPath);
9
+ const { targets, binaryName, packageName } = await readNapiConfig(packageJsonPath);
10
+ const distDirs = targets.map((platform) => join(options.cwd, options.npmDir, platform.platformArchABI));
11
11
  const universalSourceBins = new Set(targets
12
12
  .filter((platform) => platform.arch === 'universal')
13
13
  .flatMap((p) => UniArchsByPlatform[p.platform]?.map((a) => `${p.platform}-${a}`))
14
14
  .filter(Boolean));
15
- await collectNodeBinaries(resolve(options.cwd, options.outputDir)).then((output) => Promise.all(output.map(async (filePath) => {
15
+ await collectNodeBinaries(join(options.cwd, options.outputDir)).then((output) => Promise.all(output.map(async (filePath) => {
16
16
  debug.info(`Read [${colors.yellowBright(filePath)}]`);
17
17
  const sourceContent = await readFileAsync(filePath);
18
18
  const parsedName = parse(filePath);
@@ -38,15 +38,36 @@ export async function collectArtifacts(userOptions) {
38
38
  debug.info(`Write file content to [${colors.yellowBright(distFilePathLocal)}]`);
39
39
  await writeFileAsync(distFilePathLocal, sourceContent);
40
40
  })));
41
+ const wasiTarget = targets.find((t) => t.platform === 'wasi');
42
+ if (wasiTarget) {
43
+ const wasiDir = join(options.cwd, options.npmDir, wasiTarget.platformArchABI);
44
+ const cjsFile = join(options.buildOutputDir ?? options.cwd, `${binaryName}.wasi.cjs`);
45
+ const workerFile = join(options.buildOutputDir ?? options.cwd, `wasi-worker.mjs`);
46
+ const browserEntry = join(options.buildOutputDir ?? options.cwd, `${binaryName}.wasi-browser.js`);
47
+ const browserWorkerFile = join(options.buildOutputDir ?? options.cwd, `wasi-worker-browser.mjs`);
48
+ debug.info(`Move wasi binding file [${colors.yellowBright(cjsFile)}] to [${colors.yellowBright(wasiDir)}]`);
49
+ await writeFileAsync(join(wasiDir, `${binaryName}.wasi.cjs`), await readFileAsync(cjsFile));
50
+ debug.info(`Move wasi worker file [${colors.yellowBright(workerFile)}] to [${colors.yellowBright(wasiDir)}]`);
51
+ await writeFileAsync(join(wasiDir, `wasi-worker.mjs`), await readFileAsync(workerFile));
52
+ debug.info(`Move wasi browser entry file [${colors.yellowBright(browserEntry)}] to [${colors.yellowBright(wasiDir)}]`);
53
+ await writeFileAsync(join(wasiDir, `${binaryName}.wasi-browser.js`),
54
+ // https://github.com/vitejs/vite/issues/8427
55
+ (await readFileAsync(browserEntry, 'utf8')).replace(`new URL('./wasi-worker-browser.mjs', import.meta.url)`, `new URL('${packageName}-wasm32-wasi/wasi-worker-browser.mjs', import.meta.url)`));
56
+ debug.info(`Move wasi browser worker file [${colors.yellowBright(browserWorkerFile)}] to [${colors.yellowBright(wasiDir)}]`);
57
+ await writeFileAsync(join(wasiDir, `wasi-worker-browser.mjs`), await readFileAsync(browserWorkerFile));
58
+ }
41
59
  }
42
60
  async function collectNodeBinaries(root) {
43
61
  const files = await readdirAsync(root, { withFileTypes: true });
44
62
  const nodeBinaries = files
45
- .filter((file) => file.isFile() && file.name.endsWith('.node'))
63
+ .filter((file) => file.isFile() &&
64
+ (file.name.endsWith('.node') || file.name.endsWith('.wasm')))
46
65
  .map((file) => join(root, file.name));
47
66
  const dirs = files.filter((file) => file.isDirectory());
48
67
  for (const dir of dirs) {
49
- nodeBinaries.push(...(await collectNodeBinaries(join(root, dir.name))));
68
+ if (dir.name !== 'node_modules') {
69
+ nodeBinaries.push(...(await collectNodeBinaries(join(root, dir.name))));
70
+ }
50
71
  }
51
72
  return nodeBinaries;
52
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/api/artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/api/artifacts.ts"],"names":[],"mappings":"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"}
package/dist/api/build.js CHANGED
@@ -1,17 +1,23 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { createHash } from 'node:crypto';
3
+ import { existsSync, mkdirSync, unlinkSync } from 'node:fs';
3
4
  import { createRequire } from 'node:module';
4
- import { tmpdir } from 'node:os';
5
+ import { tmpdir, homedir } from 'node:os';
5
6
  import { parse, join, resolve } from 'node:path';
6
7
  import * as colors from 'colorette';
8
+ import { include as setjmpInclude, lib as setjmpLib } from 'wasm-sjlj';
7
9
  import { CLI_VERSION, copyFileAsync, debugFactory, DEFAULT_TYPE_DEF_HEADER, fileExists, getSystemDefaultTarget, getTargetLinker, mkdirAsync, parseMetadata, parseTriple, processTypeDef, readFileAsync, readNapiConfig, targetToEnvVar, tryInstallCargoBinary, unlinkAsync, writeFileAsync, } from '../utils/index.js';
8
- import { createWasiBinding } from './load-wasi-template.js';
9
- import { createCjsBinding } from './templates/index.js';
10
- import { WASI_WORKER_TEMPLATE } from './wasi-worker-template.js';
10
+ import { createCjsBinding, createEsmBinding } from './templates/index.js';
11
+ import { createWasiBinding, createWasiBrowserBinding, } from './templates/load-wasi-template.js';
12
+ import { createWasiBrowserWorkerBinding, WASI_WORKER_TEMPLATE, } from './templates/wasi-worker-template.js';
11
13
  const debug = debugFactory('build');
12
14
  const require = createRequire(import.meta.url);
13
15
  export async function buildProject(options) {
14
16
  debug('napi build command receive options: %O', options);
17
+ options = {
18
+ dtsCache: true,
19
+ ...options,
20
+ };
15
21
  const cwd = options.cwd ?? process.cwd();
16
22
  const resolvePath = (...paths) => resolve(cwd, ...paths);
17
23
  const manifestPath = resolvePath(options.manifestPath ?? 'Cargo.toml');
@@ -35,7 +41,7 @@ export async function buildProject(options) {
35
41
  ? parseTriple(process.env.CARGO_BUILD_TARGET)
36
42
  : getSystemDefaultTarget(), crateDir, resolvePath(options.outputDir ?? crateDir), options.targetDir ??
37
43
  process.env.CARGO_BUILD_TARGET_DIR ??
38
- metadata.target_directory, await readNapiConfig(resolvePath(options.packageJsonPath ?? 'package.json')));
44
+ metadata.target_directory, await readNapiConfig(resolvePath(options.configPath ?? options.packageJsonPath ?? 'package.json'), options.configPath ? resolvePath(options.configPath) : undefined));
39
45
  return builder.build();
40
46
  }
41
47
  class Builder {
@@ -85,16 +91,91 @@ class Builder {
85
91
  .setPackage()
86
92
  .setFeatures()
87
93
  .setTarget()
94
+ .pickCrossToolchain()
88
95
  .setEnvs()
89
96
  .setBypassArgs()
90
97
  .exec();
91
98
  }
99
+ pickCrossToolchain() {
100
+ if (!this.options.useNapiCross) {
101
+ return this;
102
+ }
103
+ if (this.options.useCross) {
104
+ debug.warn('You are trying to use both `--cross` and `--use-napi-cross` options, `--use-cross` will be ignored.');
105
+ }
106
+ if (this.options.crossCompile) {
107
+ debug.warn('You are trying to use both `--cross-compile` and `--use-napi-cross` options, `--cross-compile` will be ignored.');
108
+ }
109
+ try {
110
+ const { version, download } = require('@napi-rs/cross-toolchain');
111
+ const alias = {
112
+ 's390x-unknown-linux-gnu': 's390x-ibm-linux-gnu',
113
+ };
114
+ const toolchainPath = join(homedir(), '.napi-rs', 'cross-toolchain', version, this.target.triple);
115
+ mkdirSync(toolchainPath, { recursive: true });
116
+ if (existsSync(join(toolchainPath, 'package.json'))) {
117
+ debug(`Toolchain ${toolchainPath} exists, skip extracting`);
118
+ }
119
+ else {
120
+ const tarArchive = download(process.arch, this.target.triple);
121
+ tarArchive.unpack(toolchainPath);
122
+ }
123
+ const upperCaseTarget = targetToEnvVar(this.target.triple);
124
+ const crossTargetName = alias[this.target.triple] ?? this.target.triple;
125
+ const linkerEnv = `CARGO_TARGET_${upperCaseTarget}_LINKER`;
126
+ this.envs[linkerEnv] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
127
+ if (!process.env.TARGET_SYSROOT) {
128
+ this.envs[`TARGET_SYSROOT`] = join(toolchainPath, crossTargetName, 'sysroot');
129
+ }
130
+ if (!process.env.TARGET_AR) {
131
+ this.envs[`TARGET_AR`] = join(toolchainPath, 'bin', `${crossTargetName}-ar`);
132
+ }
133
+ if (!process.env.TARGET_RANLIB) {
134
+ this.envs[`TARGET_RANLIB`] = join(toolchainPath, 'bin', `${crossTargetName}-ranlib`);
135
+ }
136
+ if (!process.env.TARGET_READELF) {
137
+ this.envs[`TARGET_READELF`] = join(toolchainPath, 'bin', `${crossTargetName}-readelf`);
138
+ }
139
+ if (!process.env.TARGET_C_INCLUDE_PATH) {
140
+ this.envs[`TARGET_C_INCLUDE_PATH`] = join(toolchainPath, crossTargetName, 'sysroot', 'usr', 'include/');
141
+ }
142
+ if (!process.env.CC && !process.env.TARGET_CC) {
143
+ this.envs[`CC`] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
144
+ this.envs[`TARGET_CC`] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
145
+ }
146
+ if (!process.env.CXX && !process.env.TARGET_CXX) {
147
+ this.envs[`CXX`] = join(toolchainPath, 'bin', `${this.target.triple}-g++`);
148
+ this.envs[`TARGET_CXX`] = join(toolchainPath, 'bin', `${this.target.triple}-g++`);
149
+ }
150
+ if ((process.env.CC === 'clang' &&
151
+ (process.env.TARGET_CC === 'clang' || !process.env.TARGET_CC)) ||
152
+ process.env.TARGET_CC === 'clang') {
153
+ this.envs.CFLAGS = `--sysroot=${this.envs.TARGET_SYSROOT} --gcc-toolchain=${toolchainPath}`;
154
+ }
155
+ if ((process.env.CXX === 'clang++' &&
156
+ (process.env.TARGET_CXX === 'clang++' || !process.env.TARGET_CXX)) ||
157
+ process.env.TARGET_CXX === 'clang++') {
158
+ this.envs.CXXFLAGS = `--sysroot=${this.envs.TARGET_SYSROOT} --gcc-toolchain=${toolchainPath}`;
159
+ }
160
+ this.envs.PATH = this.envs.PATH
161
+ ? `${toolchainPath}/bin:${this.envs.PATH}:${process.env.PATH}`
162
+ : `${toolchainPath}/bin:${process.env.PATH}`;
163
+ }
164
+ catch (e) {
165
+ debug.warn('Pick cross toolchain failed', e);
166
+ // ignore, do nothing
167
+ }
168
+ return this;
169
+ }
92
170
  exec() {
93
171
  debug(`Start building crate: ${this.crate.name}`);
94
172
  debug(' %i', `cargo ${this.args.join(' ')}`);
95
173
  const controller = new AbortController();
96
174
  const watch = this.options.watch;
97
175
  const buildTask = new Promise((resolve, reject) => {
176
+ if (this.options.useCross && this.options.crossCompile) {
177
+ throw new Error('`--use-cross` and `--cross-compile` can not be used together');
178
+ }
98
179
  const command = process.env.CARGO ?? (this.options.useCross ? 'cross' : 'cargo');
99
180
  const buildProcess = spawn(command, this.args, {
100
181
  env: {
@@ -123,7 +204,7 @@ class Builder {
123
204
  buildProcess.stderr?.on('data', (data) => {
124
205
  const output = data.toString();
125
206
  console.error(output);
126
- if (/Finished\s(dev|release)/.test(output)) {
207
+ if (/Finished\s(`dev`|`release`)/.test(output)) {
127
208
  this.postBuild().catch(() => { });
128
209
  }
129
210
  });
@@ -248,7 +329,7 @@ class Builder {
248
329
  // will detect by cargo config when it becomes stable
249
330
  // see: https://github.com/rust-lang/cargo/issues/9301
250
331
  const linkerEnv = `CARGO_TARGET_${targetToEnvVar(this.target.triple)}_LINKER`;
251
- if (linker && !process.env[linkerEnv]) {
332
+ if (linker && !process.env[linkerEnv] && !this.envs[linkerEnv]) {
252
333
  this.envs[linkerEnv] = linker;
253
334
  }
254
335
  if (this.target.platform === 'android') {
@@ -266,10 +347,10 @@ class Builder {
266
347
  Object.assign(this.envs, {
267
348
  CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-android24-clang`,
268
349
  CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-androideabi24-clang`,
269
- CC: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang`,
270
- CXX: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang++`,
271
- AR: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ar`,
272
- RANLIB: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ranlib`,
350
+ TARGET_CC: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang`,
351
+ TARGET_CXX: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang++`,
352
+ TARGET_AR: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ar`,
353
+ TARGET_RANLIB: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ranlib`,
273
354
  ANDROID_NDK: ANDROID_NDK_LATEST_HOME,
274
355
  PATH: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin:${process.env.PATH}`,
275
356
  });
@@ -278,6 +359,21 @@ class Builder {
278
359
  if (this.target.platform === 'wasi') {
279
360
  const emnapi = join(require.resolve('emnapi'), '..', 'lib', 'wasm32-wasi-threads');
280
361
  this.envs.EMNAPI_LINK_DIR = emnapi;
362
+ this.envs.SETJMP_LINK_DIR = setjmpLib;
363
+ const { WASI_SDK_PATH } = process.env;
364
+ if (WASI_SDK_PATH && existsSync(WASI_SDK_PATH)) {
365
+ this.envs.CARGO_TARGET_WASM32_WASI_PREVIEW1_THREADS_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
366
+ this.envs.CARGO_TARGET_WASM32_WASIP1_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
367
+ this.envs.CARGO_TARGET_WASM32_WASIP1_THREADS_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
368
+ this.envs.CARGO_TARGET_WASM32_WASIP2_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
369
+ this.setEnvIfNotExists('CC', join(WASI_SDK_PATH, 'bin', 'clang'));
370
+ this.setEnvIfNotExists('CXX', join(WASI_SDK_PATH, 'bin', 'clang++'));
371
+ this.setEnvIfNotExists('AR', join(WASI_SDK_PATH, 'bin', 'ar'));
372
+ this.setEnvIfNotExists('RANLIB', join(WASI_SDK_PATH, 'bin', 'ranlib'));
373
+ this.setEnvIfNotExists('CFLAGS', `--target=wasm32-wasi-threads --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -I${setjmpInclude}`);
374
+ this.setEnvIfNotExists('CXXFLAGS', `--target=wasm32-wasi-threads --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -I${setjmpInclude}`);
375
+ this.setEnvIfNotExists(`LDFLAGS`, `-fuse-ld=${WASI_SDK_PATH}/bin/wasm-ld --target=wasm32-wasi-threads`);
376
+ }
281
377
  }
282
378
  debug('Set envs: ');
283
379
  Object.entries(this.envs).forEach(([k, v]) => {
@@ -287,13 +383,16 @@ class Builder {
287
383
  }
288
384
  setFeatures() {
289
385
  const args = [];
386
+ if (this.options.allFeatures && this.options.noDefaultFeatures) {
387
+ throw new Error('Cannot specify --all-features and --no-default-features together');
388
+ }
290
389
  if (this.options.allFeatures) {
291
390
  args.push('--all-features');
292
391
  }
293
392
  else if (this.options.noDefaultFeatures) {
294
393
  args.push('--no-default-features');
295
394
  }
296
- else if (this.options.features) {
395
+ if (this.options.features) {
297
396
  args.push('--features', ...this.options.features);
298
397
  }
299
398
  debug('Set features flags: ');
@@ -314,17 +413,28 @@ class Builder {
314
413
  if (this.options.profile) {
315
414
  this.args.push('--profile', this.options.profile);
316
415
  }
416
+ if (this.options.manifestPath) {
417
+ this.args.push('--manifest-path', this.options.manifestPath);
418
+ }
317
419
  if (this.options.cargoOptions?.length) {
318
420
  this.args.push(...this.options.cargoOptions);
319
421
  }
320
422
  return this;
321
423
  }
322
424
  getIntermediateTypeFile() {
323
- return join(tmpdir(), `${this.crate.name}-${createHash('sha256')
425
+ const dtsPath = join(tmpdir(), `${this.crate.name}-${createHash('sha256')
324
426
  .update(this.crate.manifest_path)
325
427
  .update(CLI_VERSION)
326
428
  .digest('hex')
327
- .substring(0, 8)}.napi_type_def.tmp`);
429
+ .substring(0, 8)}.napi_type_def`);
430
+ if (!this.options.dtsCache) {
431
+ try {
432
+ unlinkSync(dtsPath);
433
+ }
434
+ catch { }
435
+ return `${dtsPath}_${Date.now()}.tmp`;
436
+ }
437
+ return `${dtsPath}.tmp`;
328
438
  }
329
439
  getIntermediateWasiRegisterFile() {
330
440
  return join(tmpdir(), `${this.crate.name}-${createHash('sha256')
@@ -345,30 +455,40 @@ class Builder {
345
455
  cause: e,
346
456
  });
347
457
  }
348
- const dest = await this.copyArtifact();
458
+ const wasmBinaryName = await this.copyArtifact();
349
459
  // only for cdylib
350
460
  if (this.cdyLibName) {
351
461
  const idents = await this.generateTypeDef();
352
462
  const intermediateWasiRegisterFile = this.envs.WASI_REGISTER_TMP_PATH;
353
- const wasiRegisterFunctions = this.target.arch === 'wasm32'
354
- ? JSON.parse(await readFileAsync(intermediateWasiRegisterFile, 'utf8').catch((err) => {
355
- console.warn(`Read ${colors.yellowBright(intermediateWasiRegisterFile)} failed, reason: ${err.message}`);
356
- return `[]`;
357
- }))
463
+ const wasiRegisterFunctions = this.config.targets.some((t) => t.platform === 'wasi')
464
+ ? await (async function readIntermediateWasiRegisterFile() {
465
+ const fileContent = await readFileAsync(intermediateWasiRegisterFile, 'utf8').catch((err) => {
466
+ console.warn(`Read ${colors.yellowBright(intermediateWasiRegisterFile)} failed, reason: ${err.message}`);
467
+ return ``;
468
+ });
469
+ return fileContent
470
+ .split('\n')
471
+ .map((l) => l.trim())
472
+ .filter((l) => l.length)
473
+ .map((line) => {
474
+ const [_, fn] = line.split(':');
475
+ return fn.trim();
476
+ });
477
+ })()
358
478
  : [];
359
479
  const jsOutput = await this.writeJsBinding(idents);
360
- const wasmOutput = await this.writeWasiBinding(wasiRegisterFunctions, dest ?? 'index.wasm', idents);
480
+ const wasmBindingsOutput = await this.writeWasiBinding(wasiRegisterFunctions, wasmBinaryName ?? 'index.wasm', idents);
361
481
  if (jsOutput) {
362
482
  this.outputs.push(jsOutput);
363
483
  }
364
- if (wasmOutput) {
365
- this.outputs.push(wasmOutput);
484
+ if (wasmBindingsOutput) {
485
+ this.outputs.push(...wasmBindingsOutput);
366
486
  }
367
487
  }
368
488
  return this.outputs;
369
489
  }
370
490
  async copyArtifact() {
371
- const [srcName, destName] = this.getArtifactNames();
491
+ const [srcName, destName, wasmBinaryName] = this.getArtifactNames();
372
492
  if (!srcName || !destName) {
373
493
  return;
374
494
  }
@@ -376,6 +496,7 @@ class Builder {
376
496
  const src = join(this.targetDir, this.target.triple, profile, srcName);
377
497
  debug(`Copy artifact from: [${src}]`);
378
498
  const dest = join(this.outputDir, destName);
499
+ const isWasm = dest.endsWith('.wasm');
379
500
  try {
380
501
  if (await fileExists(dest)) {
381
502
  debug('Old artifact found, remove it first');
@@ -383,12 +504,44 @@ class Builder {
383
504
  }
384
505
  debug('Copy artifact to:');
385
506
  debug(' %i', dest);
386
- await copyFileAsync(src, dest);
507
+ if (isWasm) {
508
+ const { ModuleConfig } = await import('@napi-rs/wasm-tools');
509
+ debug('Generate debug wasm module');
510
+ try {
511
+ const debugWasmModule = new ModuleConfig()
512
+ .generateDwarf(true)
513
+ .generateNameSection(true)
514
+ .generateProducersSection(true)
515
+ .preserveCodeTransform(true)
516
+ .strictValidate(false)
517
+ .parse(await readFileAsync(src));
518
+ const debugWasmBinary = debugWasmModule.emitWasm(true);
519
+ await writeFileAsync(dest.replace('.wasm', '.debug.wasm'), debugWasmBinary);
520
+ debug('Generate release wasm module');
521
+ const releaseWasmModule = new ModuleConfig()
522
+ .generateDwarf(false)
523
+ .generateNameSection(false)
524
+ .generateProducersSection(false)
525
+ .preserveCodeTransform(false)
526
+ .strictValidate(false)
527
+ .onlyStableFeatures(false)
528
+ .parse(debugWasmBinary);
529
+ const releaseWasmBinary = releaseWasmModule.emitWasm(false);
530
+ await writeFileAsync(dest, releaseWasmBinary);
531
+ }
532
+ catch (e) {
533
+ debug.warn(`Failed to generate debug wasm module: ${e.message ?? e}`);
534
+ await copyFileAsync(src, dest);
535
+ }
536
+ }
537
+ else {
538
+ await copyFileAsync(src, dest);
539
+ }
387
540
  this.outputs.push({
388
- kind: dest.endsWith('.node') ? 'node' : 'exe',
541
+ kind: dest.endsWith('.node') ? 'node' : isWasm ? 'wasm' : 'exe',
389
542
  path: dest,
390
543
  });
391
- return dest;
544
+ return wasmBinaryName ? join(this.outputDir, wasmBinaryName) : null;
392
545
  }
393
546
  catch (e) {
394
547
  throw new Error('Failed to copy artifact', {
@@ -399,6 +552,7 @@ class Builder {
399
552
  getArtifactNames() {
400
553
  if (this.cdyLibName) {
401
554
  const cdyLib = this.cdyLibName.replace(/-/g, '_');
555
+ const wasiTarget = this.config.targets.find((t) => t.platform === 'wasi');
402
556
  const srcName = this.target.platform === 'darwin'
403
557
  ? `lib${cdyLib}.dylib`
404
558
  : this.target.platform === 'win32'
@@ -414,12 +568,18 @@ class Builder {
414
568
  destName += `.${this.target.platformArchABI}`;
415
569
  }
416
570
  if (srcName.endsWith('.wasm')) {
417
- destName += '.wasi-wasm32.wasm';
571
+ destName += '.wasm';
418
572
  }
419
573
  else {
420
574
  destName += '.node';
421
575
  }
422
- return [srcName, destName];
576
+ return [
577
+ srcName,
578
+ destName,
579
+ wasiTarget
580
+ ? `${this.config.binaryName}.${wasiTarget.platformArchABI}.wasm`
581
+ : null,
582
+ ];
423
583
  }
424
584
  else if (this.binName) {
425
585
  const srcName = this.target.platform === 'win32' ? `${this.binName}.exe` : this.binName;
@@ -432,8 +592,16 @@ class Builder {
432
592
  return [];
433
593
  }
434
594
  const dest = join(this.outputDir, this.options.dts ?? 'index.d.ts');
435
- const { dts, exports } = await processTypeDef(this.envs.TYPE_DEF_TMP_PATH, !this.options.noDtsHeader
436
- ? this.options.dtsHeader ?? DEFAULT_TYPE_DEF_HEADER
595
+ const { dts, exports } = await processTypeDef(this.envs.TYPE_DEF_TMP_PATH, this.options.constEnum ?? this.config.constEnum ?? true, !this.options.noDtsHeader
596
+ ? (this.options.dtsHeader ??
597
+ (this.config.dtsHeaderFile
598
+ ? await readFileAsync(join(this.cwd, this.config.dtsHeaderFile), 'utf-8').catch(() => {
599
+ debug.warn(`Failed to read dts header file ${this.config.dtsHeaderFile}`);
600
+ return null;
601
+ })
602
+ : null) ??
603
+ this.config.dtsHeader ??
604
+ DEFAULT_TYPE_DEF_HEADER)
437
605
  : '');
438
606
  try {
439
607
  debug('Writing type def to:');
@@ -457,13 +625,14 @@ class Builder {
457
625
  idents.length === 0) {
458
626
  return;
459
627
  }
460
- const name = parse(this.options.jsBinding ?? 'index.js').name;
461
- const cjs = createCjsBinding(this.config.binaryName, this.config.packageName, idents);
628
+ const name = this.options.jsBinding ?? 'index.js';
629
+ const createBinding = this.options.esm ? createEsmBinding : createCjsBinding;
630
+ const binding = createBinding(this.config.binaryName, this.config.packageName, idents);
462
631
  try {
463
- const dest = join(this.outputDir, `${name}.js`);
632
+ const dest = join(this.outputDir, name);
464
633
  debug('Writing js binding to:');
465
634
  debug(' %i', dest);
466
- await writeFileAsync(dest, cjs, 'utf-8');
635
+ await writeFileAsync(dest, binding, 'utf-8');
467
636
  return {
468
637
  kind: 'js',
469
638
  path: dest,
@@ -476,23 +645,54 @@ class Builder {
476
645
  async writeWasiBinding(wasiRegisterFunctions, distFileName, idents) {
477
646
  if (distFileName && wasiRegisterFunctions.length) {
478
647
  const { name, dir } = parse(distFileName);
479
- const newPath = join(dir, `${this.config.binaryName}.wasi.mjs`);
648
+ const bindingPath = join(dir, `${this.config.binaryName}.wasi.cjs`);
649
+ const browserBindingPath = join(dir, `${this.config.binaryName}.wasi-browser.js`);
480
650
  const workerPath = join(dir, 'wasi-worker.mjs');
481
- const declareCodes = `const { ${idents.join(', ')} } = binding\n`;
482
- const exportsCode = `export {\n${idents
483
- .map((ident) => ` ${ident}`)
484
- .join(',\n')}\n}`;
485
- await writeFileAsync(newPath, createWasiBinding(name, wasiRegisterFunctions) +
486
- declareCodes +
651
+ const browserWorkerPath = join(dir, 'wasi-worker-browser.mjs');
652
+ const browserEntryPath = join(dir, 'browser.js');
653
+ const exportsCode = idents
654
+ .map((ident) => `module.exports.${ident} = __napiModule.exports.${ident}`)
655
+ .join('\n');
656
+ await writeFileAsync(bindingPath, createWasiBinding(name, this.config.packageName, wasiRegisterFunctions, this.config.wasm?.initialMemory, this.config.wasm?.maximumMemory) +
487
657
  exportsCode +
488
658
  '\n', 'utf8');
659
+ await writeFileAsync(browserBindingPath, createWasiBrowserBinding(name, wasiRegisterFunctions, this.config.wasm?.initialMemory, this.config.wasm?.maximumMemory, this.config.wasm?.browser?.fs) +
660
+ idents
661
+ .map((ident) => `export const ${ident} = __napiModule.exports.${ident}`)
662
+ .join('\n') +
663
+ '\n', 'utf8');
489
664
  await writeFileAsync(workerPath, WASI_WORKER_TEMPLATE, 'utf8');
490
- return {
491
- kind: 'wasm',
492
- path: newPath,
493
- };
665
+ await writeFileAsync(browserWorkerPath, createWasiBrowserWorkerBinding(this.config.wasm?.browser?.fs ?? false), 'utf8');
666
+ await writeFileAsync(browserEntryPath, `export * from '${this.config.packageName}-wasm32-wasi'\n`);
667
+ return [
668
+ {
669
+ kind: 'js',
670
+ path: bindingPath,
671
+ },
672
+ {
673
+ kind: 'js',
674
+ path: browserBindingPath,
675
+ },
676
+ {
677
+ kind: 'js',
678
+ path: workerPath,
679
+ },
680
+ {
681
+ kind: 'js',
682
+ path: browserWorkerPath,
683
+ },
684
+ {
685
+ kind: 'js',
686
+ path: browserEntryPath,
687
+ },
688
+ ];
689
+ }
690
+ return [];
691
+ }
692
+ setEnvIfNotExists(env, value) {
693
+ if (!process.env[env]) {
694
+ this.envs[env] = value;
494
695
  }
495
- return null;
496
696
  }
497
697
  }
498
698
  //# sourceMappingURL=build.js.map