@napi-rs/cli 3.0.0-alpha.9 → 3.0.0-alpha.90
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/__tests__/new.spec.d.ts +1 -0
- package/dist/api/__tests__/new.spec.js +283 -0
- package/dist/api/__tests__/new.spec.js.map +1 -0
- package/dist/api/artifacts.js +28 -7
- package/dist/api/artifacts.js.map +1 -1
- package/dist/api/build.d.ts +1 -1
- package/dist/api/build.js +324 -115
- 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 +312 -107
- 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 +74 -12
- 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 +140 -125
- 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 +142 -222
- package/dist/api/templates/js-binding.js.map +1 -1
- package/dist/api/templates/load-wasi-template.d.ts +2 -0
- package/dist/api/templates/load-wasi-template.js +168 -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 +149 -4
- package/dist/def/build.js +26 -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 +8743 -14849
- 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/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 +36 -4
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/log.js +1 -1
- package/dist/utils/log.js.map +1 -1
- package/dist/utils/metadata.d.ts +13 -1
- package/dist/utils/metadata.js +31 -11
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/misc.d.ts +3 -3
- package/dist/utils/misc.js +13 -11
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/read-config.d.ts +7 -0
- package/dist/utils/read-config.js +8 -0
- package/dist/utils/read-config.js.map +1 -0
- 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 +63 -32
- 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 +34 -32
- package/src/api/__tests__/new.spec.ts +429 -0
- package/src/api/artifacts.ts +81 -9
- package/src/api/build.ts +498 -149
- package/src/api/create-npm-dirs.ts +57 -9
- package/src/api/new.ts +389 -122
- package/src/api/pre-publish.ts +13 -7
- package/src/api/rename.ts +103 -17
- package/src/api/templates/cargo.toml.ts +1 -0
- package/src/api/templates/ci-template.ts +150 -125
- package/src/api/templates/ci.yml.ts +27 -6
- package/src/api/templates/js-binding.ts +148 -220
- package/src/api/templates/load-wasi-template.ts +182 -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 +55 -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/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 +316 -332
- 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/cargo.ts +2 -2
- package/src/utils/config.ts +110 -9
- package/src/utils/index.ts +1 -1
- package/src/utils/log.ts +1 -1
- package/src/utils/metadata.ts +52 -14
- package/src/utils/misc.ts +21 -12
- package/src/utils/read-config.ts +20 -0
- package/src/utils/target.ts +22 -4
- package/src/utils/typegen.ts +87 -52
- 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 -64
- 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 -66
- 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
|
})
|
|
@@ -53,7 +57,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
53
57
|
|
|
54
58
|
jsBinding?: string = Option.String('--js', {
|
|
55
59
|
description:
|
|
56
|
-
'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`.',
|
|
57
61
|
})
|
|
58
62
|
|
|
59
63
|
noJsBinding?: boolean = Option.Boolean('--no-js', {
|
|
@@ -63,7 +67,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
63
67
|
|
|
64
68
|
dts?: string = Option.String('--dts', {
|
|
65
69
|
description:
|
|
66
|
-
'Path and filename of generated type def file. Relative to `--
|
|
70
|
+
'Path and filename of generated type def file. Relative to `--output-dir`',
|
|
67
71
|
})
|
|
68
72
|
|
|
69
73
|
dtsHeader?: string = Option.String('--dts-header', {
|
|
@@ -76,6 +80,15 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
76
80
|
'Whether to disable the default file header for generated type def file. Only works when `typedef` feature enabled.',
|
|
77
81
|
})
|
|
78
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
|
+
|
|
79
92
|
strip?: boolean = Option.Boolean('--strip,-s', {
|
|
80
93
|
description: 'Whether strip the library to achieve the minimum file size',
|
|
81
94
|
})
|
|
@@ -110,9 +123,14 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
110
123
|
'[experimental] use [cross](https://github.com/cross-rs/cross) instead of `cargo`',
|
|
111
124
|
})
|
|
112
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
|
+
|
|
113
131
|
watch?: boolean = Option.Boolean('--watch,-w', {
|
|
114
132
|
description:
|
|
115
|
-
'watch the crate changes and build
|
|
133
|
+
'watch the crate changes and build continuously with `cargo-watch` crates',
|
|
116
134
|
})
|
|
117
135
|
|
|
118
136
|
features?: string[] = Option.Array('--features,-F', {
|
|
@@ -132,6 +150,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
132
150
|
target: this.target,
|
|
133
151
|
cwd: this.cwd,
|
|
134
152
|
manifestPath: this.manifestPath,
|
|
153
|
+
configPath: this.configPath,
|
|
135
154
|
packageJsonPath: this.packageJsonPath,
|
|
136
155
|
targetDir: this.targetDir,
|
|
137
156
|
outputDir: this.outputDir,
|
|
@@ -143,6 +162,8 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
143
162
|
dts: this.dts,
|
|
144
163
|
dtsHeader: this.dtsHeader,
|
|
145
164
|
noDtsHeader: this.noDtsHeader,
|
|
165
|
+
dtsCache: this.dtsCache,
|
|
166
|
+
esm: this.esm,
|
|
146
167
|
strip: this.strip,
|
|
147
168
|
release: this.release,
|
|
148
169
|
verbose: this.verbose,
|
|
@@ -151,6 +172,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
151
172
|
profile: this.profile,
|
|
152
173
|
crossCompile: this.crossCompile,
|
|
153
174
|
useCross: this.useCross,
|
|
175
|
+
useNapiCross: this.useNapiCross,
|
|
154
176
|
watch: this.watch,
|
|
155
177
|
features: this.features,
|
|
156
178
|
allFeatures: this.allFeatures,
|
|
@@ -160,7 +182,7 @@ export abstract class BaseBuildCommand extends Command {
|
|
|
160
182
|
}
|
|
161
183
|
|
|
162
184
|
/**
|
|
163
|
-
* Build the
|
|
185
|
+
* Build the NAPI-RS project
|
|
164
186
|
*/
|
|
165
187
|
export interface BuildOptions {
|
|
166
188
|
/**
|
|
@@ -175,6 +197,10 @@ export interface BuildOptions {
|
|
|
175
197
|
* Path to `Cargo.toml`
|
|
176
198
|
*/
|
|
177
199
|
manifestPath?: string
|
|
200
|
+
/**
|
|
201
|
+
* Path to `napi` config json file
|
|
202
|
+
*/
|
|
203
|
+
configPath?: string
|
|
178
204
|
/**
|
|
179
205
|
* Path to `package.json`
|
|
180
206
|
*/
|
|
@@ -200,7 +226,7 @@ export interface BuildOptions {
|
|
|
200
226
|
*/
|
|
201
227
|
constEnum?: boolean
|
|
202
228
|
/**
|
|
203
|
-
* Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--
|
|
229
|
+
* Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output-dir`.
|
|
204
230
|
*/
|
|
205
231
|
jsBinding?: string
|
|
206
232
|
/**
|
|
@@ -208,7 +234,7 @@ export interface BuildOptions {
|
|
|
208
234
|
*/
|
|
209
235
|
noJsBinding?: boolean
|
|
210
236
|
/**
|
|
211
|
-
* Path and filename of generated type def file. Relative to `--
|
|
237
|
+
* Path and filename of generated type def file. Relative to `--output-dir`
|
|
212
238
|
*/
|
|
213
239
|
dts?: string
|
|
214
240
|
/**
|
|
@@ -219,6 +245,16 @@ export interface BuildOptions {
|
|
|
219
245
|
* Whether to disable the default file header for generated type def file. Only works when `typedef` feature enabled.
|
|
220
246
|
*/
|
|
221
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
|
|
222
258
|
/**
|
|
223
259
|
* Whether strip the library to achieve the minimum file size
|
|
224
260
|
*/
|
|
@@ -252,7 +288,11 @@ export interface BuildOptions {
|
|
|
252
288
|
*/
|
|
253
289
|
useCross?: boolean
|
|
254
290
|
/**
|
|
255
|
-
*
|
|
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
|
|
256
296
|
*/
|
|
257
297
|
watch?: boolean
|
|
258
298
|
/**
|
|
@@ -268,3 +308,10 @@ export interface BuildOptions {
|
|
|
268
308
|
*/
|
|
269
309
|
noDefaultFeatures?: boolean
|
|
270
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
|
*
|