@napi-rs/cli 3.0.0-alpha.9 → 3.0.0-alpha.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/cli.mjs +1 -1
  2. package/dist/api/__tests__/new.spec.d.ts +1 -0
  3. package/dist/api/build.d.ts +1 -1
  4. package/dist/api/templates/ci-template.d.ts +3 -1
  5. package/dist/api/templates/ci.yml.d.ts +3 -1
  6. package/dist/api/templates/js-binding.d.ts +1 -0
  7. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  8. package/dist/api/templates/package.json.d.ts +9 -2
  9. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  10. package/dist/cli.js +3867 -15
  11. package/dist/def/artifacts.d.ts +21 -1
  12. package/dist/def/build.d.ts +149 -4
  13. package/dist/def/create-npm-dirs.d.ts +10 -0
  14. package/dist/def/new.d.ts +25 -7
  15. package/dist/def/pre-publish.d.ts +12 -2
  16. package/dist/def/rename.d.ts +16 -6
  17. package/dist/def/universalize.d.ts +10 -0
  18. package/dist/def/version.d.ts +10 -0
  19. package/dist/index.cjs +9946 -15669
  20. package/dist/index.js +3618 -32
  21. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  22. package/dist/utils/config.d.ts +48 -4
  23. package/dist/utils/index.d.ts +1 -1
  24. package/dist/utils/metadata.d.ts +13 -1
  25. package/dist/utils/misc.d.ts +3 -3
  26. package/dist/utils/read-config.d.ts +7 -0
  27. package/dist/utils/target.d.ts +7 -5
  28. package/dist/utils/typegen.d.ts +1 -1
  29. package/dist/utils/version.d.ts +2 -1
  30. package/package.json +38 -34
  31. package/src/api/__tests__/new.spec.ts +429 -0
  32. package/src/api/artifacts.ts +81 -9
  33. package/src/api/build.ts +498 -149
  34. package/src/api/create-npm-dirs.ts +57 -9
  35. package/src/api/new.ts +389 -122
  36. package/src/api/pre-publish.ts +13 -7
  37. package/src/api/rename.ts +103 -17
  38. package/src/api/templates/cargo.toml.ts +1 -0
  39. package/src/api/templates/ci-template.ts +150 -125
  40. package/src/api/templates/ci.yml.ts +27 -6
  41. package/src/api/templates/js-binding.ts +148 -220
  42. package/src/api/templates/load-wasi-template.ts +182 -0
  43. package/src/api/templates/package.json.ts +47 -5
  44. package/src/api/templates/wasi-worker-template.ts +122 -0
  45. package/src/api/universalize.ts +13 -8
  46. package/src/api/version.ts +5 -2
  47. package/src/commands/artifacts.ts +2 -2
  48. package/src/commands/build.ts +1 -1
  49. package/src/commands/new.ts +46 -45
  50. package/src/def/artifacts.ts +22 -3
  51. package/src/def/build.ts +55 -8
  52. package/src/def/create-npm-dirs.ts +9 -0
  53. package/src/def/new.ts +28 -3
  54. package/src/def/pre-publish.ts +12 -3
  55. package/src/def/rename.ts +11 -2
  56. package/src/def/universalize.ts +9 -0
  57. package/src/def/version.ts +9 -0
  58. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  59. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  60. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  61. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  62. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  63. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +316 -332
  64. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  65. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  66. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  67. package/src/utils/__tests__/config.spec.ts +81 -0
  68. package/src/utils/cargo.ts +2 -2
  69. package/src/utils/config.ts +110 -9
  70. package/src/utils/index.ts +1 -1
  71. package/src/utils/log.ts +1 -1
  72. package/src/utils/metadata.ts +52 -14
  73. package/src/utils/misc.ts +21 -12
  74. package/src/utils/read-config.ts +20 -0
  75. package/src/utils/target.ts +22 -4
  76. package/src/utils/typegen.ts +87 -52
  77. package/src/utils/version.ts +10 -8
  78. package/dist/api/artifacts.js +0 -53
  79. package/dist/api/artifacts.js.map +0 -1
  80. package/dist/api/build.js +0 -498
  81. package/dist/api/build.js.map +0 -1
  82. package/dist/api/create-npm-dirs.js +0 -64
  83. package/dist/api/create-npm-dirs.js.map +0 -1
  84. package/dist/api/load-wasi-template.d.ts +0 -1
  85. package/dist/api/load-wasi-template.js +0 -64
  86. package/dist/api/load-wasi-template.js.map +0 -1
  87. package/dist/api/new.js +0 -155
  88. package/dist/api/new.js.map +0 -1
  89. package/dist/api/pre-publish.js +0 -158
  90. package/dist/api/pre-publish.js.map +0 -1
  91. package/dist/api/rename.js +0 -29
  92. package/dist/api/rename.js.map +0 -1
  93. package/dist/api/templates/.gitignore.js +0 -200
  94. package/dist/api/templates/.gitignore.js.map +0 -1
  95. package/dist/api/templates/.npmignore.js +0 -15
  96. package/dist/api/templates/.npmignore.js.map +0 -1
  97. package/dist/api/templates/build.rs.js +0 -5
  98. package/dist/api/templates/build.rs.js.map +0 -1
  99. package/dist/api/templates/cargo.toml.js +0 -26
  100. package/dist/api/templates/cargo.toml.js.map +0 -1
  101. package/dist/api/templates/ci-template.js +0 -578
  102. package/dist/api/templates/ci-template.js.map +0 -1
  103. package/dist/api/templates/ci.yml.js +0 -99
  104. package/dist/api/templates/ci.yml.js.map +0 -1
  105. package/dist/api/templates/index.js +0 -9
  106. package/dist/api/templates/index.js.map +0 -1
  107. package/dist/api/templates/js-binding.js +0 -293
  108. package/dist/api/templates/js-binding.js.map +0 -1
  109. package/dist/api/templates/lib.rs.js +0 -8
  110. package/dist/api/templates/lib.rs.js.map +0 -1
  111. package/dist/api/templates/package.json.js +0 -32
  112. package/dist/api/templates/package.json.js.map +0 -1
  113. package/dist/api/universalize.js +0 -39
  114. package/dist/api/universalize.js.map +0 -1
  115. package/dist/api/version.js +0 -17
  116. package/dist/api/version.js.map +0 -1
  117. package/dist/api/wasi-worker-template.d.ts +0 -1
  118. package/dist/api/wasi-worker-template.js +0 -53
  119. package/dist/api/wasi-worker-template.js.map +0 -1
  120. package/dist/cli.js.map +0 -1
  121. package/dist/commands/artifacts.js +0 -20
  122. package/dist/commands/artifacts.js.map +0 -1
  123. package/dist/commands/build.js +0 -35
  124. package/dist/commands/build.js.map +0 -1
  125. package/dist/commands/create-npm-dirs.js +0 -8
  126. package/dist/commands/create-npm-dirs.js.map +0 -1
  127. package/dist/commands/help.js +0 -13
  128. package/dist/commands/help.js.map +0 -1
  129. package/dist/commands/new.js +0 -110
  130. package/dist/commands/new.js.map +0 -1
  131. package/dist/commands/pre-publish.js +0 -9
  132. package/dist/commands/pre-publish.js.map +0 -1
  133. package/dist/commands/rename.js +0 -8
  134. package/dist/commands/rename.js.map +0 -1
  135. package/dist/commands/universalize.js +0 -8
  136. package/dist/commands/universalize.js.map +0 -1
  137. package/dist/commands/version.js +0 -8
  138. package/dist/commands/version.js.map +0 -1
  139. package/dist/def/artifacts.js +0 -39
  140. package/dist/def/artifacts.js.map +0 -1
  141. package/dist/def/build.js +0 -118
  142. package/dist/def/build.js.map +0 -1
  143. package/dist/def/create-npm-dirs.js +0 -39
  144. package/dist/def/create-npm-dirs.js.map +0 -1
  145. package/dist/def/new.js +0 -67
  146. package/dist/def/new.js.map +0 -1
  147. package/dist/def/pre-publish.js +0 -57
  148. package/dist/def/pre-publish.js.map +0 -1
  149. package/dist/def/rename.js +0 -59
  150. package/dist/def/rename.js.map +0 -1
  151. package/dist/def/universalize.js +0 -34
  152. package/dist/def/universalize.js.map +0 -1
  153. package/dist/def/version.js +0 -34
  154. package/dist/def/version.js.map +0 -1
  155. package/dist/index.js.map +0 -1
  156. package/dist/utils/__tests__/target.spec.js +0 -11
  157. package/dist/utils/__tests__/target.spec.js.map +0 -1
  158. package/dist/utils/__tests__/typegen.spec.js +0 -42
  159. package/dist/utils/__tests__/typegen.spec.js.map +0 -1
  160. package/dist/utils/__tests__/version.spec.js +0 -6
  161. package/dist/utils/__tests__/version.spec.js.map +0 -1
  162. package/dist/utils/cargo.js +0 -34
  163. package/dist/utils/cargo.js.map +0 -1
  164. package/dist/utils/ci.d.ts +0 -11
  165. package/dist/utils/ci.js +0 -96
  166. package/dist/utils/ci.js.map +0 -1
  167. package/dist/utils/config.js +0 -43
  168. package/dist/utils/config.js.map +0 -1
  169. package/dist/utils/index.js +0 -10
  170. package/dist/utils/index.js.map +0 -1
  171. package/dist/utils/log.js +0 -15
  172. package/dist/utils/log.js.map +0 -1
  173. package/dist/utils/metadata.js +0 -20
  174. package/dist/utils/metadata.js.map +0 -1
  175. package/dist/utils/misc.js +0 -41
  176. package/dist/utils/misc.js.map +0 -1
  177. package/dist/utils/target.js +0 -121
  178. package/dist/utils/target.js.map +0 -1
  179. package/dist/utils/typegen.js +0 -179
  180. package/dist/utils/typegen.js.map +0 -1
  181. package/dist/utils/version.js +0 -60
  182. package/dist/utils/version.js.map +0 -1
  183. package/src/api/load-wasi-template.ts +0 -66
  184. package/src/api/wasi-worker-template.ts +0 -52
  185. 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
+ }
@@ -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(packageJsonPath)
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
- (arch) => `${config.binaryName}.${process.platform}-${arch}.node`,
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
 
@@ -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(packageJsonPath)
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 . --dist ./npm',
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
  })
@@ -1,4 +1,4 @@
1
- import { execSync } from 'child_process'
1
+ import { execSync } from 'node:child_process'
2
2
 
3
3
  import { Option } from 'clipanion'
4
4
 
@@ -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', false, {
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(cmdOptions.path).base),
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
- (await inquirer
58
- .prompt({
59
- type: 'input',
60
- name: 'name',
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 inquirer
70
- .prompt({
71
- type: 'input',
72
- name: 'license',
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 inquirer
81
- .prompt({
82
- type: 'list',
83
- name: 'minNodeApiVersion',
84
- message: 'Minimum node-api version (with node version requirement)',
85
- loop: false,
86
- choices: new Array(8).fill(0).map((_, i) => ({
87
- name: `napi${i + 1} (${napiEngineRequirement(i + 1)})`,
88
- value: i + 1,
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 { targets } = await inquirer.prompt({
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
- default: this.enableDefaultTargets ? DEFAULT_TARGETS : [],
107
- choices: AVAILABLE_TARGETS,
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 { enableTypeDef } = await inquirer.prompt({
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 { enableGithubActions } = await inquirer.prompt({
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
+ }
@@ -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 napi-rs project',
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 `--output_dir`.',
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 `--output_dir`',
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 continiously with `cargo-watch` crates',
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 napi-rs project
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 `--output_dir`.
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 `--output_dir`
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
- * watch the crate changes and build continiously with `cargo-watch` crates
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
  *