@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.
Files changed (160) hide show
  1. package/cli.mjs +1 -1
  2. package/dist/api/artifacts.js +28 -7
  3. package/dist/api/artifacts.js.map +1 -1
  4. package/dist/api/build.js +247 -47
  5. package/dist/api/build.js.map +1 -1
  6. package/dist/api/create-npm-dirs.js +46 -9
  7. package/dist/api/create-npm-dirs.js.map +1 -1
  8. package/dist/api/new.js +57 -20
  9. package/dist/api/new.js.map +1 -1
  10. package/dist/api/pre-publish.js +9 -7
  11. package/dist/api/pre-publish.js.map +1 -1
  12. package/dist/api/rename.js +9 -1
  13. package/dist/api/rename.js.map +1 -1
  14. package/dist/api/templates/cargo.toml.js +1 -0
  15. package/dist/api/templates/cargo.toml.js.map +1 -1
  16. package/dist/api/templates/ci-template.d.ts +3 -1
  17. package/dist/api/templates/ci-template.js +144 -131
  18. package/dist/api/templates/ci-template.js.map +1 -1
  19. package/dist/api/templates/ci.yml.d.ts +3 -1
  20. package/dist/api/templates/ci.yml.js +21 -5
  21. package/dist/api/templates/ci.yml.js.map +1 -1
  22. package/dist/api/templates/js-binding.d.ts +1 -0
  23. package/dist/api/templates/js-binding.js +135 -221
  24. package/dist/api/templates/js-binding.js.map +1 -1
  25. package/dist/api/templates/lib.rs.js +1 -4
  26. package/dist/api/templates/lib.rs.js.map +1 -1
  27. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  28. package/dist/api/templates/load-wasi-template.js +166 -0
  29. package/dist/api/templates/load-wasi-template.js.map +1 -0
  30. package/dist/api/templates/package.json.d.ts +9 -2
  31. package/dist/api/templates/package.json.js +26 -4
  32. package/dist/api/templates/package.json.js.map +1 -1
  33. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  34. package/dist/api/templates/wasi-worker-template.js +122 -0
  35. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  36. package/dist/api/universalize.js +5 -5
  37. package/dist/api/universalize.js.map +1 -1
  38. package/dist/api/version.js +2 -2
  39. package/dist/api/version.js.map +1 -1
  40. package/dist/commands/artifacts.js +2 -2
  41. package/dist/commands/artifacts.js.map +1 -1
  42. package/dist/commands/build.js +1 -1
  43. package/dist/commands/build.js.map +1 -1
  44. package/dist/commands/new.js +34 -34
  45. package/dist/commands/new.js.map +1 -1
  46. package/dist/def/artifacts.d.ts +21 -1
  47. package/dist/def/artifacts.js +10 -2
  48. package/dist/def/artifacts.js.map +1 -1
  49. package/dist/def/build.d.ts +155 -4
  50. package/dist/def/build.js +30 -4
  51. package/dist/def/build.js.map +1 -1
  52. package/dist/def/create-npm-dirs.d.ts +10 -0
  53. package/dist/def/create-npm-dirs.js +4 -0
  54. package/dist/def/create-npm-dirs.js.map +1 -1
  55. package/dist/def/new.d.ts +25 -7
  56. package/dist/def/new.js +11 -1
  57. package/dist/def/new.js.map +1 -1
  58. package/dist/def/pre-publish.d.ts +12 -2
  59. package/dist/def/pre-publish.js +7 -3
  60. package/dist/def/pre-publish.js.map +1 -1
  61. package/dist/def/rename.d.ts +16 -6
  62. package/dist/def/rename.js +5 -1
  63. package/dist/def/rename.js.map +1 -1
  64. package/dist/def/universalize.d.ts +10 -0
  65. package/dist/def/universalize.js +4 -0
  66. package/dist/def/universalize.js.map +1 -1
  67. package/dist/def/version.d.ts +10 -0
  68. package/dist/def/version.js +4 -0
  69. package/dist/def/version.js.map +1 -1
  70. package/dist/index.cjs +8146 -14672
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  75. package/dist/utils/__tests__/config.spec.js +63 -0
  76. package/dist/utils/__tests__/config.spec.js.map +1 -0
  77. package/dist/utils/__tests__/typegen.spec.js +8 -4
  78. package/dist/utils/__tests__/typegen.spec.js.map +1 -1
  79. package/dist/utils/cargo.js +2 -2
  80. package/dist/utils/cargo.js.map +1 -1
  81. package/dist/utils/config.d.ts +48 -4
  82. package/dist/utils/config.js +37 -5
  83. package/dist/utils/config.js.map +1 -1
  84. package/dist/utils/index.d.ts +0 -1
  85. package/dist/utils/index.js +0 -1
  86. package/dist/utils/index.js.map +1 -1
  87. package/dist/utils/metadata.js +2 -2
  88. package/dist/utils/metadata.js.map +1 -1
  89. package/dist/utils/misc.d.ts +1 -2
  90. package/dist/utils/misc.js +3 -3
  91. package/dist/utils/misc.js.map +1 -1
  92. package/dist/utils/target.d.ts +7 -5
  93. package/dist/utils/target.js +17 -3
  94. package/dist/utils/target.js.map +1 -1
  95. package/dist/utils/typegen.d.ts +1 -1
  96. package/dist/utils/typegen.js +51 -17
  97. package/dist/utils/typegen.js.map +1 -1
  98. package/dist/utils/version.d.ts +2 -1
  99. package/dist/utils/version.js +10 -8
  100. package/dist/utils/version.js.map +1 -1
  101. package/package.json +27 -26
  102. package/src/api/artifacts.ts +81 -9
  103. package/src/api/build.ts +403 -66
  104. package/src/api/create-npm-dirs.ts +57 -9
  105. package/src/api/new.ts +89 -31
  106. package/src/api/pre-publish.ts +13 -7
  107. package/src/api/rename.ts +10 -1
  108. package/src/api/templates/cargo.toml.ts +1 -0
  109. package/src/api/templates/ci-template.ts +154 -131
  110. package/src/api/templates/ci.yml.ts +27 -6
  111. package/src/api/templates/js-binding.ts +141 -219
  112. package/src/api/templates/lib.rs.ts +1 -4
  113. package/src/api/templates/load-wasi-template.ts +180 -0
  114. package/src/api/templates/package.json.ts +47 -5
  115. package/src/api/templates/wasi-worker-template.ts +122 -0
  116. package/src/api/universalize.ts +13 -8
  117. package/src/api/version.ts +5 -2
  118. package/src/commands/artifacts.ts +2 -2
  119. package/src/commands/build.ts +1 -1
  120. package/src/commands/new.ts +46 -45
  121. package/src/def/artifacts.ts +22 -3
  122. package/src/def/build.ts +64 -8
  123. package/src/def/create-npm-dirs.ts +9 -0
  124. package/src/def/new.ts +28 -3
  125. package/src/def/pre-publish.ts +12 -3
  126. package/src/def/rename.ts +11 -2
  127. package/src/def/universalize.ts +9 -0
  128. package/src/def/version.ts +9 -0
  129. package/src/index.ts +2 -0
  130. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  131. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  132. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  133. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  134. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  135. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +711 -158
  136. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  137. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  138. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  139. package/src/utils/__tests__/config.spec.ts +81 -0
  140. package/src/utils/__tests__/typegen.spec.ts +18 -3
  141. package/src/utils/cargo.ts +2 -2
  142. package/src/utils/config.ts +112 -10
  143. package/src/utils/index.ts +0 -1
  144. package/src/utils/metadata.ts +2 -2
  145. package/src/utils/misc.ts +11 -3
  146. package/src/utils/target.ts +22 -4
  147. package/src/utils/typegen.ts +81 -36
  148. package/src/utils/version.ts +10 -8
  149. package/dist/api/load-wasi-template.d.ts +0 -1
  150. package/dist/api/load-wasi-template.js +0 -63
  151. package/dist/api/load-wasi-template.js.map +0 -1
  152. package/dist/api/wasi-worker-template.d.ts +0 -1
  153. package/dist/api/wasi-worker-template.js +0 -53
  154. package/dist/api/wasi-worker-template.js.map +0 -1
  155. package/dist/utils/ci.d.ts +0 -11
  156. package/dist/utils/ci.js +0 -96
  157. package/dist/utils/ci.js.map +0 -1
  158. package/src/api/load-wasi-template.ts +0 -65
  159. package/src/api/wasi-worker-template.ts +0 -52
  160. 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
  })
@@ -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 `--output_dir`.',
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 `--output_dir`',
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 continiously with `cargo-watch` crates',
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 napi-rs project
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
- * Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output_dir`.
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 `--output_dir`
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
- * 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
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
  *