@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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export const WASI_WORKER_TEMPLATE = `import fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { parse } from "node:path";
|
|
4
|
+
import { WASI } from "node:wasi";
|
|
5
|
+
import { parentPort, Worker } from "node:worker_threads";
|
|
6
|
+
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
|
|
9
|
+
const { instantiateNapiModuleSync, MessageHandler, getDefaultContext } = require("@napi-rs/wasm-runtime");
|
|
10
|
+
|
|
11
|
+
if (parentPort) {
|
|
12
|
+
parentPort.on("message", (data) => {
|
|
13
|
+
globalThis.onmessage({ data });
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Object.assign(globalThis, {
|
|
18
|
+
self: globalThis,
|
|
19
|
+
require,
|
|
20
|
+
Worker,
|
|
21
|
+
importScripts: function (f) {
|
|
22
|
+
;(0, eval)(fs.readFileSync(f, "utf8") + "//# sourceURL=" + f);
|
|
23
|
+
},
|
|
24
|
+
postMessage: function (msg) {
|
|
25
|
+
if (parentPort) {
|
|
26
|
+
parentPort.postMessage(msg);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const emnapiContext = getDefaultContext();
|
|
32
|
+
|
|
33
|
+
const __rootDir = parse(process.cwd()).root;
|
|
34
|
+
|
|
35
|
+
const handler = new MessageHandler({
|
|
36
|
+
onLoad({ wasmModule, wasmMemory }) {
|
|
37
|
+
const wasi = new WASI({
|
|
38
|
+
version: 'preview1',
|
|
39
|
+
env: process.env,
|
|
40
|
+
preopens: {
|
|
41
|
+
[__rootDir]: __rootDir,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return instantiateNapiModuleSync(wasmModule, {
|
|
46
|
+
childThread: true,
|
|
47
|
+
wasi,
|
|
48
|
+
context: emnapiContext,
|
|
49
|
+
overwriteImports(importObject) {
|
|
50
|
+
importObject.env = {
|
|
51
|
+
...importObject.env,
|
|
52
|
+
...importObject.napi,
|
|
53
|
+
...importObject.emnapi,
|
|
54
|
+
memory: wasmMemory
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
globalThis.onmessage = function (e) {
|
|
62
|
+
handler.handle(e);
|
|
63
|
+
};
|
|
64
|
+
`
|
|
65
|
+
|
|
66
|
+
export const createWasiBrowserWorkerBinding = (fs: boolean) => {
|
|
67
|
+
const fsImport = fs
|
|
68
|
+
? `import { instantiateNapiModuleSync, MessageHandler, WASI, createFsProxy } from '@napi-rs/wasm-runtime'
|
|
69
|
+
import { memfsExported as __memfsExported } from '@napi-rs/wasm-runtime/fs'
|
|
70
|
+
|
|
71
|
+
const fs = createFsProxy(__memfsExported)`
|
|
72
|
+
: `import { instantiateNapiModuleSync, MessageHandler, WASI } from '@napi-rs/wasm-runtime'`
|
|
73
|
+
const wasiCreation = fs
|
|
74
|
+
? `const wasi = new WASI({
|
|
75
|
+
fs,
|
|
76
|
+
preopens: {
|
|
77
|
+
'/': '/',
|
|
78
|
+
},
|
|
79
|
+
print: function () {
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.log.apply(console, arguments)
|
|
82
|
+
},
|
|
83
|
+
printErr: function() {
|
|
84
|
+
// eslint-disable-next-line no-console
|
|
85
|
+
console.error.apply(console, arguments)
|
|
86
|
+
},
|
|
87
|
+
})`
|
|
88
|
+
: `const wasi = new WASI({
|
|
89
|
+
print: function () {
|
|
90
|
+
// eslint-disable-next-line no-console
|
|
91
|
+
console.log.apply(console, arguments)
|
|
92
|
+
},
|
|
93
|
+
printErr: function() {
|
|
94
|
+
// eslint-disable-next-line no-console
|
|
95
|
+
console.error.apply(console, arguments)
|
|
96
|
+
},
|
|
97
|
+
})`
|
|
98
|
+
return `${fsImport}
|
|
99
|
+
|
|
100
|
+
const handler = new MessageHandler({
|
|
101
|
+
onLoad({ wasmModule, wasmMemory }) {
|
|
102
|
+
${wasiCreation}
|
|
103
|
+
return instantiateNapiModuleSync(wasmModule, {
|
|
104
|
+
childThread: true,
|
|
105
|
+
wasi,
|
|
106
|
+
overwriteImports(importObject) {
|
|
107
|
+
importObject.env = {
|
|
108
|
+
...importObject.env,
|
|
109
|
+
...importObject.napi,
|
|
110
|
+
...importObject.emnapi,
|
|
111
|
+
memory: wasmMemory,
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
globalThis.onmessage = function (e) {
|
|
119
|
+
handler.handle(e)
|
|
120
|
+
}
|
|
121
|
+
`
|
|
122
|
+
}
|
package/src/api/universalize.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { spawnSync } from 'child_process'
|
|
2
|
-
import { join, resolve } from 'path'
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import { join, resolve } from 'node:path'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
applyDefaultUniversalizeOptions,
|
|
@@ -27,7 +27,10 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
|
|
|
27
27
|
|
|
28
28
|
const packageJsonPath = join(options.cwd, options.packageJsonPath)
|
|
29
29
|
|
|
30
|
-
const config = await readNapiConfig(
|
|
30
|
+
const config = await readNapiConfig(
|
|
31
|
+
packageJsonPath,
|
|
32
|
+
options.configPath ? resolve(options.cwd, options.configPath) : undefined,
|
|
33
|
+
)
|
|
31
34
|
|
|
32
35
|
const target = config.targets.find(
|
|
33
36
|
(t) => t.platform === process.platform && t.arch === 'universal',
|
|
@@ -39,8 +42,12 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
|
|
|
39
42
|
)
|
|
40
43
|
}
|
|
41
44
|
|
|
42
|
-
const srcFiles = UniArchsByPlatform[process.platform]?.map(
|
|
43
|
-
(
|
|
45
|
+
const srcFiles = UniArchsByPlatform[process.platform]?.map((arch) =>
|
|
46
|
+
resolve(
|
|
47
|
+
options.cwd,
|
|
48
|
+
options.outputDir,
|
|
49
|
+
`${config.binaryName}.${process.platform}-${arch}.node`,
|
|
50
|
+
),
|
|
44
51
|
)
|
|
45
52
|
|
|
46
53
|
if (!srcFiles || !universalizers[process.platform]) {
|
|
@@ -52,9 +59,7 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
|
|
|
52
59
|
debug(`Looking up source binaries to combine: `)
|
|
53
60
|
debug(' %O', srcFiles)
|
|
54
61
|
|
|
55
|
-
const srcFileLookup = await Promise.all(
|
|
56
|
-
srcFiles.map((f) => fileExists(resolve(options.cwd, options.outputDir, f))),
|
|
57
|
-
)
|
|
62
|
+
const srcFileLookup = await Promise.all(srcFiles.map((f) => fileExists(f)))
|
|
58
63
|
|
|
59
64
|
const notFoundFiles = srcFiles.filter((_, i) => !srcFileLookup[i])
|
|
60
65
|
|
package/src/api/version.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join, resolve } from 'path'
|
|
1
|
+
import { join, resolve } from 'node:path'
|
|
2
2
|
|
|
3
3
|
import { applyDefaultVersionOptions, VersionOptions } from '../def/version.js'
|
|
4
4
|
import {
|
|
@@ -13,7 +13,10 @@ export async function version(userOptions: VersionOptions) {
|
|
|
13
13
|
const options = applyDefaultVersionOptions(userOptions)
|
|
14
14
|
const packageJsonPath = resolve(options.cwd, options.packageJsonPath)
|
|
15
15
|
|
|
16
|
-
const config = await readNapiConfig(
|
|
16
|
+
const config = await readNapiConfig(
|
|
17
|
+
packageJsonPath,
|
|
18
|
+
options.configPath ? resolve(options.cwd, options.configPath) : undefined,
|
|
19
|
+
)
|
|
17
20
|
|
|
18
21
|
for (const target of config.targets) {
|
|
19
22
|
const pkgDir = resolve(options.cwd, options.npmDir, target.platformArchABI)
|
|
@@ -8,9 +8,9 @@ export class ArtifactsCommand extends BaseArtifactsCommand {
|
|
|
8
8
|
description: 'Copy artifacts from Github Actions into specified dir',
|
|
9
9
|
examples: [
|
|
10
10
|
[
|
|
11
|
-
'$0 artifacts --dir
|
|
11
|
+
'$0 artifacts --output-dir ./artifacts --dist ./npm',
|
|
12
12
|
`Copy [binaryName].[platform].node under current dir(.) into packages under npm dir.
|
|
13
|
-
e.g: index.linux-x64-gnu.node --> ./npm/linux-x64-gnu/index.node`,
|
|
13
|
+
e.g: index.linux-x64-gnu.node --> ./npm/linux-x64-gnu/index.linux-x64-gnu.node`,
|
|
14
14
|
],
|
|
15
15
|
],
|
|
16
16
|
})
|
package/src/commands/build.ts
CHANGED
package/src/commands/new.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import path from 'path'
|
|
1
|
+
import path from 'node:path'
|
|
2
2
|
|
|
3
|
+
import { input, select, checkbox, confirm } from '@inquirer/prompts'
|
|
3
4
|
import { Option } from 'clipanion'
|
|
4
|
-
import inquirer from 'inquirer'
|
|
5
5
|
|
|
6
6
|
import { newProject } from '../api/new.js'
|
|
7
7
|
import { BaseNewCommand } from '../def/new.js'
|
|
@@ -16,7 +16,7 @@ import { napiEngineRequirement } from '../utils/version.js'
|
|
|
16
16
|
const debug = debugFactory('new')
|
|
17
17
|
|
|
18
18
|
export class NewCommand extends BaseNewCommand {
|
|
19
|
-
interactive = Option.Boolean('--interactive,-i',
|
|
19
|
+
interactive = Option.Boolean('--interactive,-i', true, {
|
|
20
20
|
description:
|
|
21
21
|
'Ask project basic information interactively without just using the default.',
|
|
22
22
|
})
|
|
@@ -37,9 +37,13 @@ export class NewCommand extends BaseNewCommand {
|
|
|
37
37
|
const cmdOptions = super.getOptions()
|
|
38
38
|
|
|
39
39
|
if (this.interactive) {
|
|
40
|
+
const targetPath: string = cmdOptions.path
|
|
41
|
+
? cmdOptions.path
|
|
42
|
+
: await inquirerProjectPath()
|
|
43
|
+
cmdOptions.path = targetPath
|
|
40
44
|
return {
|
|
41
45
|
...cmdOptions,
|
|
42
|
-
name: await this.fetchName(path.parse(
|
|
46
|
+
name: await this.fetchName(path.parse(targetPath).base),
|
|
43
47
|
minNodeApiVersion: await this.fetchNapiVersion(),
|
|
44
48
|
targets: await this.fetchTargets(),
|
|
45
49
|
license: await this.fetchLicense(),
|
|
@@ -54,43 +58,31 @@ export class NewCommand extends BaseNewCommand {
|
|
|
54
58
|
private async fetchName(defaultName: string): Promise<string> {
|
|
55
59
|
return (
|
|
56
60
|
this.$$name ??
|
|
57
|
-
(
|
|
58
|
-
.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
message: 'Package name (the name field in your package.json file)',
|
|
62
|
-
default: defaultName,
|
|
63
|
-
})
|
|
64
|
-
.then(({ name }) => name))
|
|
61
|
+
input({
|
|
62
|
+
message: 'Package name (the name field in your package.json file)',
|
|
63
|
+
default: defaultName,
|
|
64
|
+
})
|
|
65
65
|
)
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
private async fetchLicense(): Promise<string> {
|
|
69
|
-
return
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
message: 'License for open-sourced project',
|
|
74
|
-
default: this.license,
|
|
75
|
-
})
|
|
76
|
-
.then(({ license }) => license)
|
|
69
|
+
return input({
|
|
70
|
+
message: 'License for open-sourced project',
|
|
71
|
+
default: this.license,
|
|
72
|
+
})
|
|
77
73
|
}
|
|
78
74
|
|
|
79
75
|
private async fetchNapiVersion(): Promise<number> {
|
|
80
|
-
return
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
// choice index
|
|
91
|
-
default: this.minNodeApiVersion - 1,
|
|
92
|
-
})
|
|
93
|
-
.then(({ minNodeApiVersion }) => minNodeApiVersion)
|
|
76
|
+
return select({
|
|
77
|
+
message: 'Minimum node-api version (with node version requirement)',
|
|
78
|
+
loop: false,
|
|
79
|
+
choices: Array.from({ length: 8 }, (_, i) => ({
|
|
80
|
+
name: `napi${i + 1} (${napiEngineRequirement(i + 1)})`,
|
|
81
|
+
value: i + 1,
|
|
82
|
+
})),
|
|
83
|
+
// choice index
|
|
84
|
+
default: this.minNodeApiVersion - 1,
|
|
85
|
+
})
|
|
94
86
|
}
|
|
95
87
|
|
|
96
88
|
private async fetchTargets(): Promise<TargetTriple[]> {
|
|
@@ -98,22 +90,22 @@ export class NewCommand extends BaseNewCommand {
|
|
|
98
90
|
return AVAILABLE_TARGETS.concat()
|
|
99
91
|
}
|
|
100
92
|
|
|
101
|
-
const
|
|
102
|
-
name: 'targets',
|
|
103
|
-
type: 'checkbox',
|
|
93
|
+
const targets = await checkbox({
|
|
104
94
|
loop: false,
|
|
105
95
|
message: 'Choose target(s) your crate will be compiled to',
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
choices: AVAILABLE_TARGETS.map((target) => ({
|
|
97
|
+
name: target,
|
|
98
|
+
value: target,
|
|
99
|
+
// @ts-expect-error
|
|
100
|
+
checked: DEFAULT_TARGETS.includes(target),
|
|
101
|
+
})),
|
|
108
102
|
})
|
|
109
103
|
|
|
110
104
|
return targets
|
|
111
105
|
}
|
|
112
106
|
|
|
113
107
|
private async fetchTypeDef(): Promise<boolean> {
|
|
114
|
-
const
|
|
115
|
-
name: 'enableTypeDef',
|
|
116
|
-
type: 'confirm',
|
|
108
|
+
const enableTypeDef = await confirm({
|
|
117
109
|
message: 'Enable type definition auto-generation',
|
|
118
110
|
default: this.enableTypeDef,
|
|
119
111
|
})
|
|
@@ -122,9 +114,7 @@ export class NewCommand extends BaseNewCommand {
|
|
|
122
114
|
}
|
|
123
115
|
|
|
124
116
|
private async fetchGithubActions(): Promise<boolean> {
|
|
125
|
-
const
|
|
126
|
-
name: 'enableGithubActions',
|
|
127
|
-
type: 'confirm',
|
|
117
|
+
const enableGithubActions = await confirm({
|
|
128
118
|
message: 'Enable Github Actions CI',
|
|
129
119
|
default: this.enableGithubActions,
|
|
130
120
|
})
|
|
@@ -132,3 +122,14 @@ export class NewCommand extends BaseNewCommand {
|
|
|
132
122
|
return enableGithubActions
|
|
133
123
|
}
|
|
134
124
|
}
|
|
125
|
+
|
|
126
|
+
async function inquirerProjectPath(): Promise<string> {
|
|
127
|
+
return input({
|
|
128
|
+
message: 'Target path to create the project, relative to cwd.',
|
|
129
|
+
}).then((path) => {
|
|
130
|
+
if (!path) {
|
|
131
|
+
return inquirerProjectPath()
|
|
132
|
+
}
|
|
133
|
+
return path
|
|
134
|
+
})
|
|
135
|
+
}
|
package/src/def/artifacts.ts
CHANGED
|
@@ -15,11 +15,15 @@ export abstract class BaseArtifactsCommand extends Command {
|
|
|
15
15
|
'The working directory of where napi command will be executed in, all other paths options are relative to this path',
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
+
configPath?: string = Option.String('--config-path,-c', {
|
|
19
|
+
description: 'Path to `napi` config json file',
|
|
20
|
+
})
|
|
21
|
+
|
|
18
22
|
packageJsonPath = Option.String('--package-json-path', 'package.json', {
|
|
19
23
|
description: 'Path to `package.json`',
|
|
20
24
|
})
|
|
21
25
|
|
|
22
|
-
outputDir = Option.String('--output-dir,-o', './', {
|
|
26
|
+
outputDir = Option.String('--output-dir,-o,-d', './artifacts', {
|
|
23
27
|
description:
|
|
24
28
|
'Path to the folder where all built `.node` files put, same as `--output-dir` of build command',
|
|
25
29
|
})
|
|
@@ -28,12 +32,19 @@ export abstract class BaseArtifactsCommand extends Command {
|
|
|
28
32
|
description: 'Path to the folder where the npm packages put',
|
|
29
33
|
})
|
|
30
34
|
|
|
35
|
+
buildOutputDir?: string = Option.String('--build-output-dir', {
|
|
36
|
+
description:
|
|
37
|
+
'Path to the build output dir, only needed when targets contains `wasm32-wasi-*`',
|
|
38
|
+
})
|
|
39
|
+
|
|
31
40
|
getOptions() {
|
|
32
41
|
return {
|
|
33
42
|
cwd: this.cwd,
|
|
43
|
+
configPath: this.configPath,
|
|
34
44
|
packageJsonPath: this.packageJsonPath,
|
|
35
45
|
outputDir: this.outputDir,
|
|
36
46
|
npmDir: this.npmDir,
|
|
47
|
+
buildOutputDir: this.buildOutputDir,
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
50
|
}
|
|
@@ -48,6 +59,10 @@ export interface ArtifactsOptions {
|
|
|
48
59
|
* @default process.cwd()
|
|
49
60
|
*/
|
|
50
61
|
cwd?: string
|
|
62
|
+
/**
|
|
63
|
+
* Path to `napi` config json file
|
|
64
|
+
*/
|
|
65
|
+
configPath?: string
|
|
51
66
|
/**
|
|
52
67
|
* Path to `package.json`
|
|
53
68
|
*
|
|
@@ -57,7 +72,7 @@ export interface ArtifactsOptions {
|
|
|
57
72
|
/**
|
|
58
73
|
* Path to the folder where all built `.node` files put, same as `--output-dir` of build command
|
|
59
74
|
*
|
|
60
|
-
* @default './'
|
|
75
|
+
* @default './artifacts'
|
|
61
76
|
*/
|
|
62
77
|
outputDir?: string
|
|
63
78
|
/**
|
|
@@ -66,13 +81,17 @@ export interface ArtifactsOptions {
|
|
|
66
81
|
* @default 'npm'
|
|
67
82
|
*/
|
|
68
83
|
npmDir?: string
|
|
84
|
+
/**
|
|
85
|
+
* Path to the build output dir, only needed when targets contains `wasm32-wasi-*`
|
|
86
|
+
*/
|
|
87
|
+
buildOutputDir?: string
|
|
69
88
|
}
|
|
70
89
|
|
|
71
90
|
export function applyDefaultArtifactsOptions(options: ArtifactsOptions) {
|
|
72
91
|
return {
|
|
73
92
|
cwd: process.cwd(),
|
|
74
93
|
packageJsonPath: 'package.json',
|
|
75
|
-
outputDir: './',
|
|
94
|
+
outputDir: './artifacts',
|
|
76
95
|
npmDir: 'npm',
|
|
77
96
|
...options,
|
|
78
97
|
}
|
package/src/def/build.ts
CHANGED
|
@@ -6,7 +6,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
6
6
|
static paths = [['build']]
|
|
7
7
|
|
|
8
8
|
static usage = Command.Usage({
|
|
9
|
-
description: 'Build the
|
|
9
|
+
description: 'Build the NAPI-RS project',
|
|
10
10
|
})
|
|
11
11
|
|
|
12
12
|
target?: string = Option.String('--target,-t', {
|
|
@@ -23,6 +23,10 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
23
23
|
description: 'Path to `Cargo.toml`',
|
|
24
24
|
})
|
|
25
25
|
|
|
26
|
+
configPath?: string = Option.String('--config-path,-c', {
|
|
27
|
+
description: 'Path to `napi` config json file',
|
|
28
|
+
})
|
|
29
|
+
|
|
26
30
|
packageJsonPath?: string = Option.String('--package-json-path', {
|
|
27
31
|
description: 'Path to `package.json`',
|
|
28
32
|
})
|
|
@@ -47,9 +51,13 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
47
51
|
'Package name in generated js binding file. Only works with `--platform` flag',
|
|
48
52
|
})
|
|
49
53
|
|
|
54
|
+
constEnum?: boolean = Option.Boolean('--const-enum', {
|
|
55
|
+
description: 'Whether generate const enum for typescript bindings',
|
|
56
|
+
})
|
|
57
|
+
|
|
50
58
|
jsBinding?: string = Option.String('--js', {
|
|
51
59
|
description:
|
|
52
|
-
'Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--
|
|
60
|
+
'Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output-dir`.',
|
|
53
61
|
})
|
|
54
62
|
|
|
55
63
|
noJsBinding?: boolean = Option.Boolean('--no-js', {
|
|
@@ -59,7 +67,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
59
67
|
|
|
60
68
|
dts?: string = Option.String('--dts', {
|
|
61
69
|
description:
|
|
62
|
-
'Path and filename of generated type def file. Relative to `--
|
|
70
|
+
'Path and filename of generated type def file. Relative to `--output-dir`',
|
|
63
71
|
})
|
|
64
72
|
|
|
65
73
|
dtsHeader?: string = Option.String('--dts-header', {
|
|
@@ -72,6 +80,15 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
72
80
|
'Whether to disable the default file header for generated type def file. Only works when `typedef` feature enabled.',
|
|
73
81
|
})
|
|
74
82
|
|
|
83
|
+
dtsCache = Option.Boolean('--dts-cache', true, {
|
|
84
|
+
description: 'Whether to enable the dts cache, default to true',
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
esm?: boolean = Option.Boolean('--esm', {
|
|
88
|
+
description:
|
|
89
|
+
'Whether to emit an ESM JS binding file instead of CJS format. Only works with `--platform` flag.',
|
|
90
|
+
})
|
|
91
|
+
|
|
75
92
|
strip?: boolean = Option.Boolean('--strip,-s', {
|
|
76
93
|
description: 'Whether strip the library to achieve the minimum file size',
|
|
77
94
|
})
|
|
@@ -106,9 +123,14 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
106
123
|
'[experimental] use [cross](https://github.com/cross-rs/cross) instead of `cargo`',
|
|
107
124
|
})
|
|
108
125
|
|
|
126
|
+
useNapiCross?: boolean = Option.Boolean('--use-napi-cross', {
|
|
127
|
+
description:
|
|
128
|
+
'[experimental] use @napi-rs/cross-toolchain to cross-compile Linux arm/arm64/x64 gnu targets.',
|
|
129
|
+
})
|
|
130
|
+
|
|
109
131
|
watch?: boolean = Option.Boolean('--watch,-w', {
|
|
110
132
|
description:
|
|
111
|
-
'watch the crate changes and build
|
|
133
|
+
'watch the crate changes and build continuously with `cargo-watch` crates',
|
|
112
134
|
})
|
|
113
135
|
|
|
114
136
|
features?: string[] = Option.Array('--features,-F', {
|
|
@@ -128,16 +150,20 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
128
150
|
target: this.target,
|
|
129
151
|
cwd: this.cwd,
|
|
130
152
|
manifestPath: this.manifestPath,
|
|
153
|
+
configPath: this.configPath,
|
|
131
154
|
packageJsonPath: this.packageJsonPath,
|
|
132
155
|
targetDir: this.targetDir,
|
|
133
156
|
outputDir: this.outputDir,
|
|
134
157
|
platform: this.platform,
|
|
135
158
|
jsPackageName: this.jsPackageName,
|
|
159
|
+
constEnum: this.constEnum,
|
|
136
160
|
jsBinding: this.jsBinding,
|
|
137
161
|
noJsBinding: this.noJsBinding,
|
|
138
162
|
dts: this.dts,
|
|
139
163
|
dtsHeader: this.dtsHeader,
|
|
140
164
|
noDtsHeader: this.noDtsHeader,
|
|
165
|
+
dtsCache: this.dtsCache,
|
|
166
|
+
esm: this.esm,
|
|
141
167
|
strip: this.strip,
|
|
142
168
|
release: this.release,
|
|
143
169
|
verbose: this.verbose,
|
|
@@ -146,6 +172,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
146
172
|
profile: this.profile,
|
|
147
173
|
crossCompile: this.crossCompile,
|
|
148
174
|
useCross: this.useCross,
|
|
175
|
+
useNapiCross: this.useNapiCross,
|
|
149
176
|
watch: this.watch,
|
|
150
177
|
features: this.features,
|
|
151
178
|
allFeatures: this.allFeatures,
|
|
@@ -155,7 +182,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
155
182
|
}
|
|
156
183
|
|
|
157
184
|
/**
|
|
158
|
-
* Build the
|
|
185
|
+
* Build the NAPI-RS project
|
|
159
186
|
*/
|
|
160
187
|
export interface BuildOptions {
|
|
161
188
|
/**
|
|
@@ -170,6 +197,10 @@ export interface BuildOptions {
|
|
|
170
197
|
* Path to `Cargo.toml`
|
|
171
198
|
*/
|
|
172
199
|
manifestPath?: string
|
|
200
|
+
/**
|
|
201
|
+
* Path to `napi` config json file
|
|
202
|
+
*/
|
|
203
|
+
configPath?: string
|
|
173
204
|
/**
|
|
174
205
|
* Path to `package.json`
|
|
175
206
|
*/
|
|
@@ -191,7 +222,11 @@ export interface BuildOptions {
|
|
|
191
222
|
*/
|
|
192
223
|
jsPackageName?: string
|
|
193
224
|
/**
|
|
194
|
-
*
|
|
225
|
+
* Whether generate const enum for typescript bindings
|
|
226
|
+
*/
|
|
227
|
+
constEnum?: boolean
|
|
228
|
+
/**
|
|
229
|
+
* Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output-dir`.
|
|
195
230
|
*/
|
|
196
231
|
jsBinding?: string
|
|
197
232
|
/**
|
|
@@ -199,7 +234,7 @@ export interface BuildOptions {
|
|
|
199
234
|
*/
|
|
200
235
|
noJsBinding?: boolean
|
|
201
236
|
/**
|
|
202
|
-
* Path and filename of generated type def file. Relative to `--
|
|
237
|
+
* Path and filename of generated type def file. Relative to `--output-dir`
|
|
203
238
|
*/
|
|
204
239
|
dts?: string
|
|
205
240
|
/**
|
|
@@ -210,6 +245,16 @@ export interface BuildOptions {
|
|
|
210
245
|
* Whether to disable the default file header for generated type def file. Only works when `typedef` feature enabled.
|
|
211
246
|
*/
|
|
212
247
|
noDtsHeader?: boolean
|
|
248
|
+
/**
|
|
249
|
+
* Whether to enable the dts cache, default to true
|
|
250
|
+
*
|
|
251
|
+
* @default true
|
|
252
|
+
*/
|
|
253
|
+
dtsCache?: boolean
|
|
254
|
+
/**
|
|
255
|
+
* Whether to emit an ESM JS binding file instead of CJS format. Only works with `--platform` flag.
|
|
256
|
+
*/
|
|
257
|
+
esm?: boolean
|
|
213
258
|
/**
|
|
214
259
|
* Whether strip the library to achieve the minimum file size
|
|
215
260
|
*/
|
|
@@ -243,7 +288,11 @@ export interface BuildOptions {
|
|
|
243
288
|
*/
|
|
244
289
|
useCross?: boolean
|
|
245
290
|
/**
|
|
246
|
-
*
|
|
291
|
+
* [experimental] use @napi-rs/cross-toolchain to cross-compile Linux arm/arm64/x64 gnu targets.
|
|
292
|
+
*/
|
|
293
|
+
useNapiCross?: boolean
|
|
294
|
+
/**
|
|
295
|
+
* watch the crate changes and build continuously with `cargo-watch` crates
|
|
247
296
|
*/
|
|
248
297
|
watch?: boolean
|
|
249
298
|
/**
|
|
@@ -259,3 +308,10 @@ export interface BuildOptions {
|
|
|
259
308
|
*/
|
|
260
309
|
noDefaultFeatures?: boolean
|
|
261
310
|
}
|
|
311
|
+
|
|
312
|
+
export function applyDefaultBuildOptions(options: BuildOptions) {
|
|
313
|
+
return {
|
|
314
|
+
dtsCache: true,
|
|
315
|
+
...options,
|
|
316
|
+
}
|
|
317
|
+
}
|
|
@@ -14,6 +14,10 @@ export abstract class BaseCreateNpmDirsCommand extends Command {
|
|
|
14
14
|
'The working directory of where napi command will be executed in, all other paths options are relative to this path',
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
+
configPath?: string = Option.String('--config-path,-c', {
|
|
18
|
+
description: 'Path to `napi` config json file',
|
|
19
|
+
})
|
|
20
|
+
|
|
17
21
|
packageJsonPath = Option.String('--package-json-path', 'package.json', {
|
|
18
22
|
description: 'Path to `package.json`',
|
|
19
23
|
})
|
|
@@ -29,6 +33,7 @@ export abstract class BaseCreateNpmDirsCommand extends Command {
|
|
|
29
33
|
getOptions() {
|
|
30
34
|
return {
|
|
31
35
|
cwd: this.cwd,
|
|
36
|
+
configPath: this.configPath,
|
|
32
37
|
packageJsonPath: this.packageJsonPath,
|
|
33
38
|
npmDir: this.npmDir,
|
|
34
39
|
dryRun: this.dryRun,
|
|
@@ -46,6 +51,10 @@ export interface CreateNpmDirsOptions {
|
|
|
46
51
|
* @default process.cwd()
|
|
47
52
|
*/
|
|
48
53
|
cwd?: string
|
|
54
|
+
/**
|
|
55
|
+
* Path to `napi` config json file
|
|
56
|
+
*/
|
|
57
|
+
configPath?: string
|
|
49
58
|
/**
|
|
50
59
|
* Path to `package.json`
|
|
51
60
|
*
|