@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.
- 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 +243 -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 +129 -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 +8007 -14675
- 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 +398 -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 +135 -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,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 {
|
|
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) {
|
|
@@ -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
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
354
|
-
?
|
|
355
|
-
|
|
356
|
-
|
|
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
|
|
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 (
|
|
365
|
-
this.outputs.push(
|
|
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
|
-
|
|
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
|
|
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 += '.
|
|
567
|
+
destName += '.wasm';
|
|
418
568
|
}
|
|
419
569
|
else {
|
|
420
570
|
destName += '.node';
|
|
421
571
|
}
|
|
422
|
-
return [
|
|
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 ??
|
|
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 =
|
|
461
|
-
const
|
|
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,
|
|
628
|
+
const dest = join(this.outputDir, name);
|
|
464
629
|
debug('Writing js binding to:');
|
|
465
630
|
debug(' %i', dest);
|
|
466
|
-
await writeFileAsync(dest,
|
|
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
|
|
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
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
.
|
|
485
|
-
|
|
486
|
-
|
|
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
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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
|