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

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 +243 -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 +129 -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 +8007 -14675
  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 +398 -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 +135 -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,13 +1,15 @@
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) {
@@ -35,7 +37,7 @@ export async function buildProject(options) {
35
37
  ? parseTriple(process.env.CARGO_BUILD_TARGET)
36
38
  : getSystemDefaultTarget(), crateDir, resolvePath(options.outputDir ?? crateDir), options.targetDir ??
37
39
  process.env.CARGO_BUILD_TARGET_DIR ??
38
- metadata.target_directory, await readNapiConfig(resolvePath(options.packageJsonPath ?? 'package.json')));
40
+ metadata.target_directory, await readNapiConfig(resolvePath(options.configPath ?? options.packageJsonPath ?? 'package.json'), options.configPath ? resolvePath(options.configPath) : undefined));
39
41
  return builder.build();
40
42
  }
41
43
  class Builder {
@@ -85,16 +87,91 @@ class Builder {
85
87
  .setPackage()
86
88
  .setFeatures()
87
89
  .setTarget()
90
+ .pickCrossToolchain()
88
91
  .setEnvs()
89
92
  .setBypassArgs()
90
93
  .exec();
91
94
  }
95
+ pickCrossToolchain() {
96
+ if (!this.options.useNapiCross) {
97
+ return this;
98
+ }
99
+ if (this.options.useCross) {
100
+ debug.warn('You are trying to use both `--cross` and `--use-napi-cross` options, `--use-cross` will be ignored.');
101
+ }
102
+ if (this.options.crossCompile) {
103
+ debug.warn('You are trying to use both `--cross-compile` and `--use-napi-cross` options, `--cross-compile` will be ignored.');
104
+ }
105
+ try {
106
+ const { version, download } = require('@napi-rs/cross-toolchain');
107
+ const alias = {
108
+ 's390x-unknown-linux-gnu': 's390x-ibm-linux-gnu',
109
+ };
110
+ const toolchainPath = join(homedir(), '.napi-rs', 'cross-toolchain', version, this.target.triple);
111
+ mkdirSync(toolchainPath, { recursive: true });
112
+ if (existsSync(join(toolchainPath, 'package.json'))) {
113
+ debug(`Toolchain ${toolchainPath} exists, skip extracting`);
114
+ }
115
+ else {
116
+ const tarArchive = download(process.arch, this.target.triple);
117
+ tarArchive.unpack(toolchainPath);
118
+ }
119
+ const upperCaseTarget = targetToEnvVar(this.target.triple);
120
+ const crossTargetName = alias[this.target.triple] ?? this.target.triple;
121
+ const linkerEnv = `CARGO_TARGET_${upperCaseTarget}_LINKER`;
122
+ this.envs[linkerEnv] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
123
+ if (!process.env.TARGET_SYSROOT) {
124
+ this.envs[`TARGET_SYSROOT`] = join(toolchainPath, crossTargetName, 'sysroot');
125
+ }
126
+ if (!process.env.TARGET_AR) {
127
+ this.envs[`TARGET_AR`] = join(toolchainPath, 'bin', `${crossTargetName}-ar`);
128
+ }
129
+ if (!process.env.TARGET_RANLIB) {
130
+ this.envs[`TARGET_RANLIB`] = join(toolchainPath, 'bin', `${crossTargetName}-ranlib`);
131
+ }
132
+ if (!process.env.TARGET_READELF) {
133
+ this.envs[`TARGET_READELF`] = join(toolchainPath, 'bin', `${crossTargetName}-readelf`);
134
+ }
135
+ if (!process.env.TARGET_C_INCLUDE_PATH) {
136
+ this.envs[`TARGET_C_INCLUDE_PATH`] = join(toolchainPath, crossTargetName, 'sysroot', 'usr', 'include/');
137
+ }
138
+ if (!process.env.CC && !process.env.TARGET_CC) {
139
+ this.envs[`CC`] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
140
+ this.envs[`TARGET_CC`] = join(toolchainPath, 'bin', `${crossTargetName}-gcc`);
141
+ }
142
+ if (!process.env.CXX && !process.env.TARGET_CXX) {
143
+ this.envs[`CXX`] = join(toolchainPath, 'bin', `${this.target.triple}-g++`);
144
+ this.envs[`TARGET_CXX`] = join(toolchainPath, 'bin', `${this.target.triple}-g++`);
145
+ }
146
+ if ((process.env.CC === 'clang' &&
147
+ (process.env.TARGET_CC === 'clang' || !process.env.TARGET_CC)) ||
148
+ process.env.TARGET_CC === 'clang') {
149
+ this.envs.CFLAGS = `--sysroot=${this.envs.TARGET_SYSROOT} --gcc-toolchain=${toolchainPath}`;
150
+ }
151
+ if ((process.env.CXX === 'clang++' &&
152
+ (process.env.TARGET_CXX === 'clang++' || !process.env.TARGET_CXX)) ||
153
+ process.env.TARGET_CXX === 'clang++') {
154
+ this.envs.CXXFLAGS = `--sysroot=${this.envs.TARGET_SYSROOT} --gcc-toolchain=${toolchainPath}`;
155
+ }
156
+ this.envs.PATH = this.envs.PATH
157
+ ? `${toolchainPath}/bin:${this.envs.PATH}:${process.env.PATH}`
158
+ : `${toolchainPath}/bin:${process.env.PATH}`;
159
+ }
160
+ catch (e) {
161
+ debug.warn('Pick cross toolchain failed', e);
162
+ // ignore, do nothing
163
+ }
164
+ return this;
165
+ }
92
166
  exec() {
93
167
  debug(`Start building crate: ${this.crate.name}`);
94
168
  debug(' %i', `cargo ${this.args.join(' ')}`);
95
169
  const controller = new AbortController();
96
170
  const watch = this.options.watch;
97
171
  const buildTask = new Promise((resolve, reject) => {
172
+ if (this.options.useCross && this.options.crossCompile) {
173
+ throw new Error('`--use-cross` and `--cross-compile` can not be used together');
174
+ }
98
175
  const command = process.env.CARGO ?? (this.options.useCross ? 'cross' : 'cargo');
99
176
  const buildProcess = spawn(command, this.args, {
100
177
  env: {
@@ -123,7 +200,7 @@ class Builder {
123
200
  buildProcess.stderr?.on('data', (data) => {
124
201
  const output = data.toString();
125
202
  console.error(output);
126
- if (/Finished\s(dev|release)/.test(output)) {
203
+ if (/Finished\s(`dev`|`release`)/.test(output)) {
127
204
  this.postBuild().catch(() => { });
128
205
  }
129
206
  });
@@ -248,7 +325,7 @@ class Builder {
248
325
  // will detect by cargo config when it becomes stable
249
326
  // see: https://github.com/rust-lang/cargo/issues/9301
250
327
  const linkerEnv = `CARGO_TARGET_${targetToEnvVar(this.target.triple)}_LINKER`;
251
- if (linker && !process.env[linkerEnv]) {
328
+ if (linker && !process.env[linkerEnv] && !this.envs[linkerEnv]) {
252
329
  this.envs[linkerEnv] = linker;
253
330
  }
254
331
  if (this.target.platform === 'android') {
@@ -266,10 +343,10 @@ class Builder {
266
343
  Object.assign(this.envs, {
267
344
  CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-android24-clang`,
268
345
  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`,
346
+ TARGET_CC: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang`,
347
+ TARGET_CXX: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/${targetArch}-linux-${targetPlatform}-clang++`,
348
+ TARGET_AR: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ar`,
349
+ TARGET_RANLIB: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin/llvm-ranlib`,
273
350
  ANDROID_NDK: ANDROID_NDK_LATEST_HOME,
274
351
  PATH: `${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/${hostPlatform}-x86_64/bin:${process.env.PATH}`,
275
352
  });
@@ -278,6 +355,21 @@ class Builder {
278
355
  if (this.target.platform === 'wasi') {
279
356
  const emnapi = join(require.resolve('emnapi'), '..', 'lib', 'wasm32-wasi-threads');
280
357
  this.envs.EMNAPI_LINK_DIR = emnapi;
358
+ this.envs.SETJMP_LINK_DIR = setjmpLib;
359
+ const { WASI_SDK_PATH } = process.env;
360
+ if (WASI_SDK_PATH && existsSync(WASI_SDK_PATH)) {
361
+ this.envs.CARGO_TARGET_WASM32_WASI_PREVIEW1_THREADS_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
362
+ this.envs.CARGO_TARGET_WASM32_WASIP1_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
363
+ this.envs.CARGO_TARGET_WASM32_WASIP1_THREADS_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
364
+ this.envs.CARGO_TARGET_WASM32_WASIP2_LINKER = join(WASI_SDK_PATH, 'bin', 'wasm-ld');
365
+ this.setEnvIfNotExists('CC', join(WASI_SDK_PATH, 'bin', 'clang'));
366
+ this.setEnvIfNotExists('CXX', join(WASI_SDK_PATH, 'bin', 'clang++'));
367
+ this.setEnvIfNotExists('AR', join(WASI_SDK_PATH, 'bin', 'ar'));
368
+ this.setEnvIfNotExists('RANLIB', join(WASI_SDK_PATH, 'bin', 'ranlib'));
369
+ this.setEnvIfNotExists('CFLAGS', `--target=wasm32-wasi-threads --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -I${setjmpInclude}`);
370
+ this.setEnvIfNotExists('CXXFLAGS', `--target=wasm32-wasi-threads --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -I${setjmpInclude}`);
371
+ this.setEnvIfNotExists(`LDFLAGS`, `-fuse-ld=${WASI_SDK_PATH}/bin/wasm-ld --target=wasm32-wasi-threads`);
372
+ }
281
373
  }
282
374
  debug('Set envs: ');
283
375
  Object.entries(this.envs).forEach(([k, v]) => {
@@ -287,13 +379,16 @@ class Builder {
287
379
  }
288
380
  setFeatures() {
289
381
  const args = [];
382
+ if (this.options.allFeatures && this.options.noDefaultFeatures) {
383
+ throw new Error('Cannot specify --all-features and --no-default-features together');
384
+ }
290
385
  if (this.options.allFeatures) {
291
386
  args.push('--all-features');
292
387
  }
293
388
  else if (this.options.noDefaultFeatures) {
294
389
  args.push('--no-default-features');
295
390
  }
296
- else if (this.options.features) {
391
+ if (this.options.features) {
297
392
  args.push('--features', ...this.options.features);
298
393
  }
299
394
  debug('Set features flags: ');
@@ -314,17 +409,28 @@ class Builder {
314
409
  if (this.options.profile) {
315
410
  this.args.push('--profile', this.options.profile);
316
411
  }
412
+ if (this.options.manifestPath) {
413
+ this.args.push('--manifest-path', this.options.manifestPath);
414
+ }
317
415
  if (this.options.cargoOptions?.length) {
318
416
  this.args.push(...this.options.cargoOptions);
319
417
  }
320
418
  return this;
321
419
  }
322
420
  getIntermediateTypeFile() {
323
- return join(tmpdir(), `${this.crate.name}-${createHash('sha256')
421
+ const dtsPath = join(tmpdir(), `${this.crate.name}-${createHash('sha256')
324
422
  .update(this.crate.manifest_path)
325
423
  .update(CLI_VERSION)
326
424
  .digest('hex')
327
- .substring(0, 8)}.napi_type_def.tmp`);
425
+ .substring(0, 8)}.napi_type_def`);
426
+ if (!this.options.dtsCache) {
427
+ try {
428
+ unlinkSync(dtsPath);
429
+ }
430
+ catch { }
431
+ return `${dtsPath}_${Date.now()}.tmp`;
432
+ }
433
+ return `${dtsPath}.tmp`;
328
434
  }
329
435
  getIntermediateWasiRegisterFile() {
330
436
  return join(tmpdir(), `${this.crate.name}-${createHash('sha256')
@@ -345,30 +451,40 @@ class Builder {
345
451
  cause: e,
346
452
  });
347
453
  }
348
- const dest = await this.copyArtifact();
454
+ const wasmBinaryName = await this.copyArtifact();
349
455
  // only for cdylib
350
456
  if (this.cdyLibName) {
351
457
  const idents = await this.generateTypeDef();
352
458
  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
- }))
459
+ const wasiRegisterFunctions = this.config.targets.some((t) => t.platform === 'wasi')
460
+ ? await (async function readIntermediateWasiRegisterFile() {
461
+ const fileContent = await readFileAsync(intermediateWasiRegisterFile, 'utf8').catch((err) => {
462
+ console.warn(`Read ${colors.yellowBright(intermediateWasiRegisterFile)} failed, reason: ${err.message}`);
463
+ return ``;
464
+ });
465
+ return fileContent
466
+ .split('\n')
467
+ .map((l) => l.trim())
468
+ .filter((l) => l.length)
469
+ .map((line) => {
470
+ const [_, fn] = line.split(':');
471
+ return fn.trim();
472
+ });
473
+ })()
358
474
  : [];
359
475
  const jsOutput = await this.writeJsBinding(idents);
360
- const wasmOutput = await this.writeWasiBinding(wasiRegisterFunctions, dest ?? 'index.wasm', idents);
476
+ const wasmBindingsOutput = await this.writeWasiBinding(wasiRegisterFunctions, wasmBinaryName ?? 'index.wasm', idents);
361
477
  if (jsOutput) {
362
478
  this.outputs.push(jsOutput);
363
479
  }
364
- if (wasmOutput) {
365
- this.outputs.push(wasmOutput);
480
+ if (wasmBindingsOutput) {
481
+ this.outputs.push(...wasmBindingsOutput);
366
482
  }
367
483
  }
368
484
  return this.outputs;
369
485
  }
370
486
  async copyArtifact() {
371
- const [srcName, destName] = this.getArtifactNames();
487
+ const [srcName, destName, wasmBinaryName] = this.getArtifactNames();
372
488
  if (!srcName || !destName) {
373
489
  return;
374
490
  }
@@ -376,6 +492,7 @@ class Builder {
376
492
  const src = join(this.targetDir, this.target.triple, profile, srcName);
377
493
  debug(`Copy artifact from: [${src}]`);
378
494
  const dest = join(this.outputDir, destName);
495
+ const isWasm = dest.endsWith('.wasm');
379
496
  try {
380
497
  if (await fileExists(dest)) {
381
498
  debug('Old artifact found, remove it first');
@@ -383,12 +500,44 @@ class Builder {
383
500
  }
384
501
  debug('Copy artifact to:');
385
502
  debug(' %i', dest);
386
- await copyFileAsync(src, dest);
503
+ if (isWasm) {
504
+ const { ModuleConfig } = await import('@napi-rs/wasm-tools');
505
+ debug('Generate debug wasm module');
506
+ try {
507
+ const debugWasmModule = new ModuleConfig()
508
+ .generateDwarf(true)
509
+ .generateNameSection(true)
510
+ .generateProducersSection(true)
511
+ .preserveCodeTransform(true)
512
+ .strictValidate(false)
513
+ .parse(await readFileAsync(src));
514
+ const debugWasmBinary = debugWasmModule.emitWasm(true);
515
+ await writeFileAsync(dest.replace('.wasm', '.debug.wasm'), debugWasmBinary);
516
+ debug('Generate release wasm module');
517
+ const releaseWasmModule = new ModuleConfig()
518
+ .generateDwarf(false)
519
+ .generateNameSection(false)
520
+ .generateProducersSection(false)
521
+ .preserveCodeTransform(false)
522
+ .strictValidate(false)
523
+ .onlyStableFeatures(false)
524
+ .parse(debugWasmBinary);
525
+ const releaseWasmBinary = releaseWasmModule.emitWasm(false);
526
+ await writeFileAsync(dest, releaseWasmBinary);
527
+ }
528
+ catch (e) {
529
+ debug.warn(`Failed to generate debug wasm module: ${e.message ?? e}`);
530
+ await copyFileAsync(src, dest);
531
+ }
532
+ }
533
+ else {
534
+ await copyFileAsync(src, dest);
535
+ }
387
536
  this.outputs.push({
388
- kind: dest.endsWith('.node') ? 'node' : 'exe',
537
+ kind: dest.endsWith('.node') ? 'node' : isWasm ? 'wasm' : 'exe',
389
538
  path: dest,
390
539
  });
391
- return dest;
540
+ return wasmBinaryName ? join(this.outputDir, wasmBinaryName) : null;
392
541
  }
393
542
  catch (e) {
394
543
  throw new Error('Failed to copy artifact', {
@@ -399,6 +548,7 @@ class Builder {
399
548
  getArtifactNames() {
400
549
  if (this.cdyLibName) {
401
550
  const cdyLib = this.cdyLibName.replace(/-/g, '_');
551
+ const wasiTarget = this.config.targets.find((t) => t.platform === 'wasi');
402
552
  const srcName = this.target.platform === 'darwin'
403
553
  ? `lib${cdyLib}.dylib`
404
554
  : this.target.platform === 'win32'
@@ -414,12 +564,18 @@ class Builder {
414
564
  destName += `.${this.target.platformArchABI}`;
415
565
  }
416
566
  if (srcName.endsWith('.wasm')) {
417
- destName += '.wasi-wasm32.wasm';
567
+ destName += '.wasm';
418
568
  }
419
569
  else {
420
570
  destName += '.node';
421
571
  }
422
- return [srcName, destName];
572
+ return [
573
+ srcName,
574
+ destName,
575
+ wasiTarget
576
+ ? `${this.config.binaryName}.${wasiTarget.platformArchABI}.wasm`
577
+ : null,
578
+ ];
423
579
  }
424
580
  else if (this.binName) {
425
581
  const srcName = this.target.platform === 'win32' ? `${this.binName}.exe` : this.binName;
@@ -432,8 +588,16 @@ class Builder {
432
588
  return [];
433
589
  }
434
590
  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
591
+ const { dts, exports } = await processTypeDef(this.envs.TYPE_DEF_TMP_PATH, this.options.constEnum ?? this.config.constEnum ?? true, !this.options.noDtsHeader
592
+ ? (this.options.dtsHeader ??
593
+ (this.config.dtsHeaderFile
594
+ ? await readFileAsync(join(this.cwd, this.config.dtsHeaderFile), 'utf-8').catch(() => {
595
+ debug.warn(`Failed to read dts header file ${this.config.dtsHeaderFile}`);
596
+ return null;
597
+ })
598
+ : null) ??
599
+ this.config.dtsHeader ??
600
+ DEFAULT_TYPE_DEF_HEADER)
437
601
  : '');
438
602
  try {
439
603
  debug('Writing type def to:');
@@ -457,13 +621,14 @@ class Builder {
457
621
  idents.length === 0) {
458
622
  return;
459
623
  }
460
- const name = parse(this.options.jsBinding ?? 'index.js').name;
461
- const cjs = createCjsBinding(this.config.binaryName, this.config.packageName, idents);
624
+ const name = this.options.jsBinding ?? 'index.js';
625
+ const createBinding = this.options.esm ? createEsmBinding : createCjsBinding;
626
+ const binding = createBinding(this.config.binaryName, this.config.packageName, idents);
462
627
  try {
463
- const dest = join(this.outputDir, `${name}.js`);
628
+ const dest = join(this.outputDir, name);
464
629
  debug('Writing js binding to:');
465
630
  debug(' %i', dest);
466
- await writeFileAsync(dest, cjs, 'utf-8');
631
+ await writeFileAsync(dest, binding, 'utf-8');
467
632
  return {
468
633
  kind: 'js',
469
634
  path: dest,
@@ -476,23 +641,54 @@ class Builder {
476
641
  async writeWasiBinding(wasiRegisterFunctions, distFileName, idents) {
477
642
  if (distFileName && wasiRegisterFunctions.length) {
478
643
  const { name, dir } = parse(distFileName);
479
- const newPath = join(dir, `${this.config.binaryName}.wasi.mjs`);
644
+ const bindingPath = join(dir, `${this.config.binaryName}.wasi.cjs`);
645
+ const browserBindingPath = join(dir, `${this.config.binaryName}.wasi-browser.js`);
480
646
  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 +
647
+ const browserWorkerPath = join(dir, 'wasi-worker-browser.mjs');
648
+ const browserEntryPath = join(dir, 'browser.js');
649
+ const exportsCode = idents
650
+ .map((ident) => `module.exports.${ident} = __napiModule.exports.${ident}`)
651
+ .join('\n');
652
+ await writeFileAsync(bindingPath, createWasiBinding(name, this.config.packageName, wasiRegisterFunctions, this.config.wasm?.initialMemory, this.config.wasm?.maximumMemory) +
487
653
  exportsCode +
488
654
  '\n', 'utf8');
655
+ await writeFileAsync(browserBindingPath, createWasiBrowserBinding(name, wasiRegisterFunctions, this.config.wasm?.initialMemory, this.config.wasm?.maximumMemory, this.config.wasm?.browser?.fs) +
656
+ idents
657
+ .map((ident) => `export const ${ident} = __napiModule.exports.${ident}`)
658
+ .join('\n') +
659
+ '\n', 'utf8');
489
660
  await writeFileAsync(workerPath, WASI_WORKER_TEMPLATE, 'utf8');
490
- return {
491
- kind: 'wasm',
492
- path: newPath,
493
- };
661
+ await writeFileAsync(browserWorkerPath, createWasiBrowserWorkerBinding(this.config.wasm?.browser?.fs ?? false), 'utf8');
662
+ await writeFileAsync(browserEntryPath, `export * from '${this.config.packageName}-wasm32-wasi'\n`);
663
+ return [
664
+ {
665
+ kind: 'js',
666
+ path: bindingPath,
667
+ },
668
+ {
669
+ kind: 'js',
670
+ path: browserBindingPath,
671
+ },
672
+ {
673
+ kind: 'js',
674
+ path: workerPath,
675
+ },
676
+ {
677
+ kind: 'js',
678
+ path: browserWorkerPath,
679
+ },
680
+ {
681
+ kind: 'js',
682
+ path: browserEntryPath,
683
+ },
684
+ ];
685
+ }
686
+ return [];
687
+ }
688
+ setEnvIfNotExists(env, value) {
689
+ if (!process.env[env]) {
690
+ this.envs[env] = value;
494
691
  }
495
- return null;
496
692
  }
497
693
  }
498
694
  //# sourceMappingURL=build.js.map