@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.
- package/cli.mjs +1 -1
- package/dist/api/artifacts.js +28 -7
- package/dist/api/artifacts.js.map +1 -1
- package/dist/api/build.js +247 -47
- package/dist/api/build.js.map +1 -1
- package/dist/api/create-npm-dirs.js +46 -9
- package/dist/api/create-npm-dirs.js.map +1 -1
- package/dist/api/new.js +57 -20
- package/dist/api/new.js.map +1 -1
- package/dist/api/pre-publish.js +9 -7
- package/dist/api/pre-publish.js.map +1 -1
- package/dist/api/rename.js +9 -1
- package/dist/api/rename.js.map +1 -1
- package/dist/api/templates/cargo.toml.js +1 -0
- package/dist/api/templates/cargo.toml.js.map +1 -1
- package/dist/api/templates/ci-template.d.ts +3 -1
- package/dist/api/templates/ci-template.js +144 -131
- package/dist/api/templates/ci-template.js.map +1 -1
- package/dist/api/templates/ci.yml.d.ts +3 -1
- package/dist/api/templates/ci.yml.js +21 -5
- package/dist/api/templates/ci.yml.js.map +1 -1
- package/dist/api/templates/js-binding.d.ts +1 -0
- package/dist/api/templates/js-binding.js +135 -221
- package/dist/api/templates/js-binding.js.map +1 -1
- package/dist/api/templates/lib.rs.js +1 -4
- package/dist/api/templates/lib.rs.js.map +1 -1
- package/dist/api/templates/load-wasi-template.d.ts +2 -0
- package/dist/api/templates/load-wasi-template.js +166 -0
- package/dist/api/templates/load-wasi-template.js.map +1 -0
- package/dist/api/templates/package.json.d.ts +9 -2
- package/dist/api/templates/package.json.js +26 -4
- package/dist/api/templates/package.json.js.map +1 -1
- package/dist/api/templates/wasi-worker-template.d.ts +2 -0
- package/dist/api/templates/wasi-worker-template.js +122 -0
- package/dist/api/templates/wasi-worker-template.js.map +1 -0
- package/dist/api/universalize.js +5 -5
- package/dist/api/universalize.js.map +1 -1
- package/dist/api/version.js +2 -2
- package/dist/api/version.js.map +1 -1
- package/dist/commands/artifacts.js +2 -2
- package/dist/commands/artifacts.js.map +1 -1
- package/dist/commands/build.js +1 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/new.js +34 -34
- package/dist/commands/new.js.map +1 -1
- package/dist/def/artifacts.d.ts +21 -1
- package/dist/def/artifacts.js +10 -2
- package/dist/def/artifacts.js.map +1 -1
- package/dist/def/build.d.ts +155 -4
- package/dist/def/build.js +30 -4
- package/dist/def/build.js.map +1 -1
- package/dist/def/create-npm-dirs.d.ts +10 -0
- package/dist/def/create-npm-dirs.js +4 -0
- package/dist/def/create-npm-dirs.js.map +1 -1
- package/dist/def/new.d.ts +25 -7
- package/dist/def/new.js +11 -1
- package/dist/def/new.js.map +1 -1
- package/dist/def/pre-publish.d.ts +12 -2
- package/dist/def/pre-publish.js +7 -3
- package/dist/def/pre-publish.js.map +1 -1
- package/dist/def/rename.d.ts +16 -6
- package/dist/def/rename.js +5 -1
- package/dist/def/rename.js.map +1 -1
- package/dist/def/universalize.d.ts +10 -0
- package/dist/def/universalize.js +4 -0
- package/dist/def/universalize.js.map +1 -1
- package/dist/def/version.d.ts +10 -0
- package/dist/def/version.js +4 -0
- package/dist/def/version.js.map +1 -1
- package/dist/index.cjs +8146 -14672
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/config.spec.d.ts +1 -0
- package/dist/utils/__tests__/config.spec.js +63 -0
- package/dist/utils/__tests__/config.spec.js.map +1 -0
- package/dist/utils/__tests__/typegen.spec.js +8 -4
- package/dist/utils/__tests__/typegen.spec.js.map +1 -1
- package/dist/utils/cargo.js +2 -2
- package/dist/utils/cargo.js.map +1 -1
- package/dist/utils/config.d.ts +48 -4
- package/dist/utils/config.js +37 -5
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/metadata.js +2 -2
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/misc.d.ts +1 -2
- package/dist/utils/misc.js +3 -3
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/target.d.ts +7 -5
- package/dist/utils/target.js +17 -3
- package/dist/utils/target.js.map +1 -1
- package/dist/utils/typegen.d.ts +1 -1
- package/dist/utils/typegen.js +51 -17
- package/dist/utils/typegen.js.map +1 -1
- package/dist/utils/version.d.ts +2 -1
- package/dist/utils/version.js +10 -8
- package/dist/utils/version.js.map +1 -1
- package/package.json +27 -26
- package/src/api/artifacts.ts +81 -9
- package/src/api/build.ts +403 -66
- package/src/api/create-npm-dirs.ts +57 -9
- package/src/api/new.ts +89 -31
- package/src/api/pre-publish.ts +13 -7
- package/src/api/rename.ts +10 -1
- package/src/api/templates/cargo.toml.ts +1 -0
- package/src/api/templates/ci-template.ts +154 -131
- package/src/api/templates/ci.yml.ts +27 -6
- package/src/api/templates/js-binding.ts +141 -219
- package/src/api/templates/lib.rs.ts +1 -4
- package/src/api/templates/load-wasi-template.ts +180 -0
- package/src/api/templates/package.json.ts +47 -5
- package/src/api/templates/wasi-worker-template.ts +122 -0
- package/src/api/universalize.ts +13 -8
- package/src/api/version.ts +5 -2
- package/src/commands/artifacts.ts +2 -2
- package/src/commands/build.ts +1 -1
- package/src/commands/new.ts +46 -45
- package/src/def/artifacts.ts +22 -3
- package/src/def/build.ts +64 -8
- package/src/def/create-npm-dirs.ts +9 -0
- package/src/def/new.ts +28 -3
- package/src/def/pre-publish.ts +12 -3
- package/src/def/rename.ts +11 -2
- package/src/def/universalize.ts +9 -0
- package/src/def/version.ts +9 -0
- package/src/index.ts +2 -0
- package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
- 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 +28 -0
- package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +711 -158
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
- package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
- package/src/utils/__tests__/config.spec.ts +81 -0
- package/src/utils/__tests__/typegen.spec.ts +18 -3
- package/src/utils/cargo.ts +2 -2
- package/src/utils/config.ts +112 -10
- package/src/utils/index.ts +0 -1
- package/src/utils/metadata.ts +2 -2
- package/src/utils/misc.ts +11 -3
- package/src/utils/target.ts +22 -4
- package/src/utils/typegen.ts +81 -36
- package/src/utils/version.ts +10 -8
- package/dist/api/load-wasi-template.d.ts +0 -1
- package/dist/api/load-wasi-template.js +0 -63
- package/dist/api/load-wasi-template.js.map +0 -1
- package/dist/api/wasi-worker-template.d.ts +0 -1
- package/dist/api/wasi-worker-template.js +0 -53
- package/dist/api/wasi-worker-template.js.map +0 -1
- package/dist/utils/ci.d.ts +0 -11
- package/dist/utils/ci.js +0 -96
- package/dist/utils/ci.js.map +0 -1
- package/src/api/load-wasi-template.ts +0 -65
- package/src/api/wasi-worker-template.ts +0 -52
- 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 --
|
|
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(' ')}`,
|
package/dist/api/artifacts.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { join, parse
|
|
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 =
|
|
9
|
-
const { targets, binaryName } = await readNapiConfig(packageJsonPath);
|
|
10
|
-
const distDirs = targets.map((platform) =>
|
|
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(
|
|
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() &&
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,
|
|
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 {
|
|
9
|
-
import {
|
|
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
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
354
|
-
?
|
|
355
|
-
|
|
356
|
-
|
|
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
|
|
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 (
|
|
365
|
-
this.outputs.push(
|
|
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
|
-
|
|
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
|
|
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 += '.
|
|
571
|
+
destName += '.wasm';
|
|
418
572
|
}
|
|
419
573
|
else {
|
|
420
574
|
destName += '.node';
|
|
421
575
|
}
|
|
422
|
-
return [
|
|
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 ??
|
|
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 =
|
|
461
|
-
const
|
|
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,
|
|
632
|
+
const dest = join(this.outputDir, name);
|
|
464
633
|
debug('Writing js binding to:');
|
|
465
634
|
debug(' %i', dest);
|
|
466
|
-
await writeFileAsync(dest,
|
|
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
|
|
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
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
.
|
|
485
|
-
|
|
486
|
-
|
|
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
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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
|