@napi-rs/cli 3.0.0-alpha.5 → 3.0.0-alpha.51

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 (178) hide show
  1. package/dist/api/artifacts.js +32 -8
  2. package/dist/api/artifacts.js.map +1 -0
  3. package/dist/api/build.d.ts +1 -1
  4. package/dist/api/build.js +249 -25
  5. package/dist/api/build.js.map +1 -0
  6. package/dist/api/create-npm-dirs.js +46 -8
  7. package/dist/api/create-npm-dirs.js.map +1 -0
  8. package/dist/api/new.js +58 -20
  9. package/dist/api/new.js.map +1 -0
  10. package/dist/api/pre-publish.js +10 -7
  11. package/dist/api/pre-publish.js.map +1 -0
  12. package/dist/api/rename.js +10 -1
  13. package/dist/api/rename.js.map +1 -0
  14. package/dist/api/templates/.gitignore.d.ts +1 -1
  15. package/dist/api/templates/.gitignore.js +2 -0
  16. package/dist/api/templates/.gitignore.js.map +1 -0
  17. package/dist/api/templates/.npmignore.js +1 -0
  18. package/dist/api/templates/.npmignore.js.map +1 -0
  19. package/dist/api/templates/build.rs.js +1 -0
  20. package/dist/api/templates/build.rs.js.map +1 -0
  21. package/dist/api/templates/cargo.toml.js +1 -0
  22. package/dist/api/templates/cargo.toml.js.map +1 -0
  23. package/dist/api/templates/ci-template.d.ts +3 -1
  24. package/dist/api/templates/ci-template.js +165 -150
  25. package/dist/api/templates/ci-template.js.map +1 -0
  26. package/dist/api/templates/ci.yml.d.ts +3 -1
  27. package/dist/api/templates/ci.yml.js +22 -5
  28. package/dist/api/templates/ci.yml.js.map +1 -0
  29. package/dist/api/templates/index.js +1 -0
  30. package/dist/api/templates/index.js.map +1 -0
  31. package/dist/api/templates/js-binding.js +150 -225
  32. package/dist/api/templates/js-binding.js.map +1 -0
  33. package/dist/api/templates/lib.rs.js +2 -4
  34. package/dist/api/templates/lib.rs.js.map +1 -0
  35. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  36. package/dist/api/templates/load-wasi-template.js +155 -0
  37. package/dist/api/templates/load-wasi-template.js.map +1 -0
  38. package/dist/api/templates/package.json.d.ts +9 -2
  39. package/dist/api/templates/package.json.js +27 -4
  40. package/dist/api/templates/package.json.js.map +1 -0
  41. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  42. package/dist/api/templates/wasi-worker-template.js +103 -0
  43. package/dist/api/templates/wasi-worker-template.js.map +1 -0
  44. package/dist/api/universalize.js +6 -5
  45. package/dist/api/universalize.js.map +1 -0
  46. package/dist/api/version.js +3 -2
  47. package/dist/api/version.js.map +1 -0
  48. package/dist/cli.js +1 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/commands/artifacts.js +3 -2
  51. package/dist/commands/artifacts.js.map +1 -0
  52. package/dist/commands/build.js +2 -1
  53. package/dist/commands/build.js.map +1 -0
  54. package/dist/commands/create-npm-dirs.js +1 -0
  55. package/dist/commands/create-npm-dirs.js.map +1 -0
  56. package/dist/commands/help.js +1 -0
  57. package/dist/commands/help.js.map +1 -0
  58. package/dist/commands/new.js +25 -6
  59. package/dist/commands/new.js.map +1 -0
  60. package/dist/commands/pre-publish.js +1 -0
  61. package/dist/commands/pre-publish.js.map +1 -0
  62. package/dist/commands/rename.js +1 -0
  63. package/dist/commands/rename.js.map +1 -0
  64. package/dist/commands/universalize.js +1 -0
  65. package/dist/commands/universalize.js.map +1 -0
  66. package/dist/commands/version.js +1 -0
  67. package/dist/commands/version.js.map +1 -0
  68. package/dist/def/artifacts.d.ts +21 -1
  69. package/dist/def/artifacts.js +11 -2
  70. package/dist/def/artifacts.js.map +1 -0
  71. package/dist/def/build.d.ts +20 -2
  72. package/dist/def/build.js +15 -2
  73. package/dist/def/build.js.map +1 -0
  74. package/dist/def/create-npm-dirs.d.ts +10 -0
  75. package/dist/def/create-npm-dirs.js +5 -0
  76. package/dist/def/create-npm-dirs.js.map +1 -0
  77. package/dist/def/new.d.ts +24 -6
  78. package/dist/def/new.js +12 -1
  79. package/dist/def/new.js.map +1 -0
  80. package/dist/def/pre-publish.d.ts +10 -0
  81. package/dist/def/pre-publish.js +8 -3
  82. package/dist/def/pre-publish.js.map +1 -0
  83. package/dist/def/rename.d.ts +11 -1
  84. package/dist/def/rename.js +6 -1
  85. package/dist/def/rename.js.map +1 -0
  86. package/dist/def/universalize.d.ts +10 -0
  87. package/dist/def/universalize.js +5 -0
  88. package/dist/def/universalize.js.map +1 -0
  89. package/dist/def/version.d.ts +10 -0
  90. package/dist/def/version.js +5 -0
  91. package/dist/def/version.js.map +1 -0
  92. package/dist/index.cjs +3931 -718
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.js +2 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  97. package/dist/utils/__tests__/config.spec.js +63 -0
  98. package/dist/utils/__tests__/config.spec.js.map +1 -0
  99. package/dist/utils/__tests__/target.spec.js +1 -0
  100. package/dist/utils/__tests__/target.spec.js.map +1 -0
  101. package/dist/utils/__tests__/typegen.spec.js +9 -4
  102. package/dist/utils/__tests__/typegen.spec.js.map +1 -0
  103. package/dist/utils/__tests__/version.spec.js +1 -0
  104. package/dist/utils/__tests__/version.spec.js.map +1 -0
  105. package/dist/utils/cargo.js +2 -1
  106. package/dist/utils/cargo.js.map +1 -0
  107. package/dist/utils/config.d.ts +49 -5
  108. package/dist/utils/config.js +39 -6
  109. package/dist/utils/config.js.map +1 -0
  110. package/dist/utils/index.d.ts +0 -1
  111. package/dist/utils/index.js +1 -1
  112. package/dist/utils/index.js.map +1 -0
  113. package/dist/utils/log.js +1 -0
  114. package/dist/utils/log.js.map +1 -0
  115. package/dist/utils/metadata.js +3 -2
  116. package/dist/utils/metadata.js.map +1 -0
  117. package/dist/utils/misc.d.ts +1 -1
  118. package/dist/utils/misc.js +4 -3
  119. package/dist/utils/misc.js.map +1 -0
  120. package/dist/utils/target.d.ts +9 -5
  121. package/dist/utils/target.js +25 -1
  122. package/dist/utils/target.js.map +1 -0
  123. package/dist/utils/typegen.d.ts +1 -1
  124. package/dist/utils/typegen.js +8 -6
  125. package/dist/utils/typegen.js.map +1 -0
  126. package/dist/utils/version.d.ts +2 -1
  127. package/dist/utils/version.js +11 -8
  128. package/dist/utils/version.js.map +1 -0
  129. package/package.json +46 -13
  130. package/src/api/artifacts.ts +83 -8
  131. package/src/api/build.ts +417 -27
  132. package/src/api/create-npm-dirs.ts +56 -8
  133. package/src/api/new.ts +86 -31
  134. package/src/api/pre-publish.ts +13 -7
  135. package/src/api/rename.ts +10 -1
  136. package/src/api/templates/.gitignore.ts +1 -0
  137. package/src/api/templates/ci-template.ts +174 -150
  138. package/src/api/templates/ci.yml.ts +24 -6
  139. package/src/api/templates/js-binding.ts +150 -225
  140. package/src/api/templates/lib.rs.ts +1 -4
  141. package/src/api/templates/load-wasi-template.ts +168 -0
  142. package/src/api/templates/package.json.ts +47 -5
  143. package/src/api/templates/wasi-worker-template.ts +103 -0
  144. package/src/api/universalize.ts +8 -5
  145. package/src/api/version.ts +5 -2
  146. package/src/commands/artifacts.ts +2 -2
  147. package/src/commands/build.ts +1 -1
  148. package/src/commands/new.ts +25 -6
  149. package/src/def/artifacts.ts +22 -3
  150. package/src/def/build.ts +32 -4
  151. package/src/def/create-npm-dirs.ts +9 -0
  152. package/src/def/new.ts +28 -3
  153. package/src/def/pre-publish.ts +12 -3
  154. package/src/def/rename.ts +11 -2
  155. package/src/def/universalize.ts +9 -0
  156. package/src/def/version.ts +9 -0
  157. package/src/index.ts +2 -0
  158. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  159. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  160. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +28 -0
  161. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  162. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +555 -0
  163. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  164. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  165. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  166. package/src/utils/__tests__/config.spec.ts +81 -0
  167. package/src/utils/__tests__/typegen.spec.ts +18 -3
  168. package/src/utils/cargo.ts +1 -1
  169. package/src/utils/config.ts +114 -12
  170. package/src/utils/index.ts +0 -1
  171. package/src/utils/metadata.ts +2 -2
  172. package/src/utils/misc.ts +11 -3
  173. package/src/utils/target.ts +34 -7
  174. package/src/utils/typegen.ts +11 -5
  175. package/src/utils/version.ts +10 -8
  176. package/dist/utils/ci.d.ts +0 -11
  177. package/dist/utils/ci.js +0 -95
  178. package/src/utils/ci.ts +0 -111
@@ -1,12 +1,21 @@
1
- import { CommonPackageJsonFields } from '../../utils/config.js'
1
+ import type {
2
+ CommonPackageJsonFields,
3
+ SupportedTestFramework,
4
+ } from '../../utils/config.js'
5
+ import { UNIVERSAL_TARGETS } from '../../utils/target.js'
2
6
 
3
- export const createPackageJson = ({
7
+ export interface PackageMeta {
8
+ 'dist-tags': { [index: string]: string }
9
+ }
10
+
11
+ export const createPackageJson = async ({
4
12
  name,
5
13
  binaryName,
6
14
  targets,
7
15
  license,
8
16
  engineRequirement,
9
17
  cliVersion,
18
+ testFramework,
10
19
  }: {
11
20
  name: string
12
21
  binaryName: string
@@ -14,10 +23,24 @@ export const createPackageJson = ({
14
23
  license: string
15
24
  engineRequirement: string
16
25
  cliVersion: string
26
+ testFramework: SupportedTestFramework
17
27
  }) => {
28
+ const hasWasmTarget = targets.some((t) => t.includes('wasm'))
29
+ const universalTargets = targets.filter(
30
+ (t) => t in UNIVERSAL_TARGETS,
31
+ ) as (keyof typeof UNIVERSAL_TARGETS)[]
32
+ const unifiedtargets = universalTargets.length
33
+ ? targets.filter(
34
+ (target) =>
35
+ !universalTargets.some((t) => {
36
+ // @ts-expect-error
37
+ return UNIVERSAL_TARGETS[t].includes(target)
38
+ }),
39
+ )
40
+ : targets
18
41
  const content: CommonPackageJsonFields = {
19
42
  name,
20
- version: '1.0.0',
43
+ version: '0.0.0',
21
44
  license,
22
45
  engines: {
23
46
  node: engineRequirement,
@@ -25,14 +48,15 @@ export const createPackageJson = ({
25
48
  type: 'commonjs',
26
49
  main: 'index.js',
27
50
  types: 'index.d.ts',
51
+ browser: 'browser.js',
28
52
  module: undefined,
29
53
  exports: undefined,
30
54
  napi: {
31
55
  binaryName,
32
- targets,
56
+ targets: unifiedtargets,
33
57
  },
34
58
  scripts: {
35
- test: 'node -e "assert(require(\'.\').sum(1, 2) === 3)"',
59
+ test: testFramework,
36
60
  build: 'napi build --release --platform --strip',
37
61
  'build:debug': 'napi build',
38
62
  prepublishOnly: 'napi prepublish -t npm',
@@ -44,5 +68,23 @@ export const createPackageJson = ({
44
68
  },
45
69
  }
46
70
 
71
+ if (testFramework === 'ava') {
72
+ const avaMeta = await fetch(`https://registry.npmjs.org/ava`).then(
73
+ (res) => res.json() as Promise<PackageMeta>,
74
+ )
75
+ content.devDependencies!['ava'] = `^${avaMeta['dist-tags'].latest}`
76
+ content.ava = {
77
+ timeout: '1m',
78
+ }
79
+ }
80
+
81
+ if (hasWasmTarget) {
82
+ const wasmRuntime = await fetch(
83
+ `https://registry.npmjs.org/@napi-rs/wasm-runtime`,
84
+ ).then((res) => res.json() as Promise<PackageMeta>)
85
+ const latest = wasmRuntime['dist-tags'].latest
86
+ content.devDependencies!['@napi-rs/wasm-runtime'] = `^${latest}`
87
+ }
88
+
47
89
  return JSON.stringify(content, null, 2)
48
90
  }
@@ -0,0 +1,103 @@
1
+ export const WASI_WORKER_TEMPLATE = `import fs from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { WASI } from "node:wasi";
4
+ import { parentPort, Worker } from "node:worker_threads";
5
+
6
+ const require = createRequire(import.meta.url);
7
+
8
+ const { instantiateNapiModuleSync, MessageHandler, getDefaultContext } = require("@napi-rs/wasm-runtime");
9
+
10
+ if (parentPort) {
11
+ parentPort.on("message", (data) => {
12
+ globalThis.onmessage({ data });
13
+ });
14
+ }
15
+
16
+ Object.assign(globalThis, {
17
+ self: globalThis,
18
+ require,
19
+ Worker,
20
+ importScripts: function (f) {
21
+ ;(0, eval)(fs.readFileSync(f, "utf8") + "//# sourceURL=" + f);
22
+ },
23
+ postMessage: function (msg) {
24
+ if (parentPort) {
25
+ parentPort.postMessage(msg);
26
+ }
27
+ },
28
+ });
29
+
30
+ const emnapiContext = getDefaultContext()
31
+
32
+ const handler = new MessageHandler({
33
+ onLoad({ wasmModule, wasmMemory }) {
34
+ const wasi = new WASI({
35
+ version: 'preview1',
36
+ env: process.env,
37
+ preopens: {
38
+ '/': '/',
39
+ },
40
+ });
41
+
42
+ return instantiateNapiModuleSync(wasmModule, {
43
+ childThread: true,
44
+ wasi,
45
+ context: emnapiContext,
46
+ overwriteImports(importObject) {
47
+ importObject.env = {
48
+ ...importObject.env,
49
+ ...importObject.napi,
50
+ ...importObject.emnapi,
51
+ memory: wasmMemory
52
+ };
53
+ },
54
+ });
55
+ },
56
+ });
57
+
58
+ globalThis.onmessage = function (e) {
59
+ handler.handle(e);
60
+ };
61
+ `
62
+
63
+ export const WASI_WORKER_BROWSER_TEMPLATE = `import { instantiateNapiModuleSync, MessageHandler, WASI } from '@napi-rs/wasm-runtime'
64
+ import { Volume, createFsFromVolume } from '@napi-rs/wasm-runtime/fs'
65
+
66
+ const fs = createFsFromVolume(
67
+ Volume.fromJSON({
68
+ '/': null,
69
+ }),
70
+ )
71
+
72
+ const handler = new MessageHandler({
73
+ onLoad({ wasmModule, wasmMemory }) {
74
+ const wasi = new WASI({
75
+ fs,
76
+ print: function () {
77
+ // eslint-disable-next-line no-console
78
+ console.log.apply(console, arguments)
79
+ },
80
+ printErr: function() {
81
+ // eslint-disable-next-line no-console
82
+ console.error.apply(console, arguments)
83
+ },
84
+ })
85
+ return instantiateNapiModuleSync(wasmModule, {
86
+ childThread: true,
87
+ wasi,
88
+ overwriteImports(importObject) {
89
+ importObject.env = {
90
+ ...importObject.env,
91
+ ...importObject.napi,
92
+ ...importObject.emnapi,
93
+ memory: wasmMemory,
94
+ }
95
+ },
96
+ })
97
+ },
98
+ })
99
+
100
+ globalThis.onmessage = function (e) {
101
+ handler.handle(e)
102
+ }
103
+ `
@@ -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',
@@ -40,7 +43,7 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
40
43
  }
41
44
 
42
45
  const srcFiles = UniArchsByPlatform[process.platform]?.map(
43
- (arch) => `${config.binaryName}.${process.platform}-${arch}.node`,
46
+ (arch) => resolve(options.cwd, options.outputDir, `${config.binaryName}.${process.platform}-${arch}.node`),
44
47
  )
45
48
 
46
49
  if (!srcFiles || !universalizers[process.platform]) {
@@ -53,7 +56,7 @@ export async function universalizeBinaries(userOptions: UniversalizeOptions) {
53
56
  debug(' %O', srcFiles)
54
57
 
55
58
  const srcFileLookup = await Promise.all(
56
- srcFiles.map((f) => fileExists(resolve(options.cwd, options.outputDir, f))),
59
+ srcFiles.map((f) => fileExists(f)),
57
60
  )
58
61
 
59
62
  const notFoundFiles = srcFiles.filter((_, i) => !srcFileLookup[i])
@@ -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,4 +1,4 @@
1
- import path from 'path'
1
+ import path from 'node:path'
2
2
 
3
3
  import { Option } from 'clipanion'
4
4
  import inquirer from 'inquirer'
@@ -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,14 +58,14 @@ export class NewCommand extends BaseNewCommand {
54
58
  private async fetchName(defaultName: string): Promise<string> {
55
59
  return (
56
60
  this.$$name ??
57
- (await inquirer
61
+ inquirer
58
62
  .prompt({
59
63
  type: 'input',
60
64
  name: 'name',
61
65
  message: 'Package name (the name field in your package.json file)',
62
66
  default: defaultName,
63
67
  })
64
- .then(({ name }) => name))
68
+ .then(({ name }) => name)
65
69
  )
66
70
  }
67
71
 
@@ -83,7 +87,7 @@ export class NewCommand extends BaseNewCommand {
83
87
  name: 'minNodeApiVersion',
84
88
  message: 'Minimum node-api version (with node version requirement)',
85
89
  loop: false,
86
- choices: new Array(8).fill(0).map((_, i) => ({
90
+ choices: Array.from({ length: 8 }, (_, i) => ({
87
91
  name: `napi${i + 1} (${napiEngineRequirement(i + 1)})`,
88
92
  value: i + 1,
89
93
  })),
@@ -132,3 +136,18 @@ export class NewCommand extends BaseNewCommand {
132
136
  return enableGithubActions
133
137
  }
134
138
  }
139
+
140
+ async function inquirerProjectPath(): Promise<string> {
141
+ return inquirer
142
+ .prompt({
143
+ type: 'input',
144
+ name: 'path',
145
+ message: 'Target path to create the project, relative to cwd.',
146
+ })
147
+ .then(({ path }) => {
148
+ if (!path) {
149
+ return inquirerProjectPath()
150
+ }
151
+ return path
152
+ })
153
+ }
@@ -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,6 +51,10 @@ 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
60
  'Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output_dir`.',
@@ -106,9 +114,14 @@ export abstract class BaseBuildCommand extends Command {
106
114
  '[experimental] use [cross](https://github.com/cross-rs/cross) instead of `cargo`',
107
115
  })
108
116
 
117
+ useNapiCross?: boolean = Option.Boolean('--use-napi-cross', {
118
+ description:
119
+ '[experimental] use @napi-rs/cross-toolchain to cross-compile Linux arm/arm64/x64 gnu targets.',
120
+ })
121
+
109
122
  watch?: boolean = Option.Boolean('--watch,-w', {
110
123
  description:
111
- 'watch the crate changes and build continiously with `cargo-watch` crates',
124
+ 'watch the crate changes and build continuously with `cargo-watch` crates',
112
125
  })
113
126
 
114
127
  features?: string[] = Option.Array('--features,-F', {
@@ -128,11 +141,13 @@ export abstract class BaseBuildCommand extends Command {
128
141
  target: this.target,
129
142
  cwd: this.cwd,
130
143
  manifestPath: this.manifestPath,
144
+ configPath: this.configPath,
131
145
  packageJsonPath: this.packageJsonPath,
132
146
  targetDir: this.targetDir,
133
147
  outputDir: this.outputDir,
134
148
  platform: this.platform,
135
149
  jsPackageName: this.jsPackageName,
150
+ constEnum: this.constEnum,
136
151
  jsBinding: this.jsBinding,
137
152
  noJsBinding: this.noJsBinding,
138
153
  dts: this.dts,
@@ -146,6 +161,7 @@ export abstract class BaseBuildCommand extends Command {
146
161
  profile: this.profile,
147
162
  crossCompile: this.crossCompile,
148
163
  useCross: this.useCross,
164
+ useNapiCross: this.useNapiCross,
149
165
  watch: this.watch,
150
166
  features: this.features,
151
167
  allFeatures: this.allFeatures,
@@ -155,7 +171,7 @@ export abstract class BaseBuildCommand extends Command {
155
171
  }
156
172
 
157
173
  /**
158
- * Build the napi-rs project
174
+ * Build the NAPI-RS project
159
175
  */
160
176
  export interface BuildOptions {
161
177
  /**
@@ -170,6 +186,10 @@ export interface BuildOptions {
170
186
  * Path to `Cargo.toml`
171
187
  */
172
188
  manifestPath?: string
189
+ /**
190
+ * Path to `napi` config json file
191
+ */
192
+ configPath?: string
173
193
  /**
174
194
  * Path to `package.json`
175
195
  */
@@ -190,6 +210,10 @@ export interface BuildOptions {
190
210
  * Package name in generated js binding file. Only works with `--platform` flag
191
211
  */
192
212
  jsPackageName?: string
213
+ /**
214
+ * Whether generate const enum for typescript bindings
215
+ */
216
+ constEnum?: boolean
193
217
  /**
194
218
  * Path and filename of generated JS binding file. Only works with `--platform` flag. Relative to `--output_dir`.
195
219
  */
@@ -243,7 +267,11 @@ export interface BuildOptions {
243
267
  */
244
268
  useCross?: boolean
245
269
  /**
246
- * watch the crate changes and build continiously with `cargo-watch` crates
270
+ * [experimental] use @napi-rs/cross-toolchain to cross-compile Linux arm/arm64/x64 gnu targets.
271
+ */
272
+ useNapiCross?: boolean
273
+ /**
274
+ * watch the crate changes and build continuously with `cargo-watch` crates
247
275
  */
248
276
  watch?: boolean
249
277
  /**
@@ -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
  *
package/src/def/new.ts CHANGED
@@ -10,7 +10,7 @@ export abstract class BaseNewCommand extends Command {
10
10
  description: 'Create a new project with pre-configured boilerplate',
11
11
  })
12
12
 
13
- $$path = Option.String({ required: true })
13
+ $$path = Option.String({ required: false })
14
14
 
15
15
  $$name?: string = Option.String('--name,-n', {
16
16
  description:
@@ -22,6 +22,10 @@ export abstract class BaseNewCommand extends Command {
22
22
  description: 'The minimum Node-API version to support',
23
23
  })
24
24
 
25
+ packageManager = Option.String('--package-manager', 'yarn', {
26
+ description: 'The package manager to use. Only support yarn 4.x for now.',
27
+ })
28
+
25
29
  license = Option.String('--license,-l', 'MIT', {
26
30
  description: 'License for open-sourced project',
27
31
  })
@@ -47,6 +51,11 @@ export abstract class BaseNewCommand extends Command {
47
51
  description: 'Whether generate preconfigured GitHub Actions workflow',
48
52
  })
49
53
 
54
+ testFramework = Option.String('--test-framework', 'ava', {
55
+ description:
56
+ 'The JavaScript test framework to use, only support `ava` for now',
57
+ })
58
+
50
59
  dryRun = Option.Boolean('--dry-run', false, {
51
60
  description: 'Whether to run the command in dry-run mode',
52
61
  })
@@ -56,12 +65,14 @@ export abstract class BaseNewCommand extends Command {
56
65
  path: this.$$path,
57
66
  name: this.$$name,
58
67
  minNodeApiVersion: this.minNodeApiVersion,
68
+ packageManager: this.packageManager,
59
69
  license: this.license,
60
70
  targets: this.targets,
61
71
  enableDefaultTargets: this.enableDefaultTargets,
62
72
  enableAllTargets: this.enableAllTargets,
63
73
  enableTypeDef: this.enableTypeDef,
64
74
  enableGithubActions: this.enableGithubActions,
75
+ testFramework: this.testFramework,
65
76
  dryRun: this.dryRun,
66
77
  }
67
78
  }
@@ -72,9 +83,9 @@ export abstract class BaseNewCommand extends Command {
72
83
  */
73
84
  export interface NewOptions {
74
85
  /**
75
- * The path where the napi-rs project will be created.
86
+ * The path where the NAPI-RS project will be created.
76
87
  */
77
- path: string
88
+ path?: string
78
89
  /**
79
90
  * The name of the project, default to the name of the directory if not provided
80
91
  */
@@ -85,6 +96,12 @@ export interface NewOptions {
85
96
  * @default 4
86
97
  */
87
98
  minNodeApiVersion?: number
99
+ /**
100
+ * The package manager to use. Only support yarn 4.x for now.
101
+ *
102
+ * @default 'yarn'
103
+ */
104
+ packageManager?: string
88
105
  /**
89
106
  * License for open-sourced project
90
107
  *
@@ -121,6 +138,12 @@ export interface NewOptions {
121
138
  * @default true
122
139
  */
123
140
  enableGithubActions?: boolean
141
+ /**
142
+ * The JavaScript test framework to use, only support `ava` for now
143
+ *
144
+ * @default 'ava'
145
+ */
146
+ testFramework?: string
124
147
  /**
125
148
  * Whether to run the command in dry-run mode
126
149
  *
@@ -132,12 +155,14 @@ export interface NewOptions {
132
155
  export function applyDefaultNewOptions(options: NewOptions) {
133
156
  return {
134
157
  minNodeApiVersion: 4,
158
+ packageManager: 'yarn',
135
159
  license: 'MIT',
136
160
  targets: [],
137
161
  enableDefaultTargets: true,
138
162
  enableAllTargets: false,
139
163
  enableTypeDef: true,
140
164
  enableGithubActions: true,
165
+ testFramework: 'ava',
141
166
  dryRun: false,
142
167
  ...options,
143
168
  }