@napi-rs/cli 3.0.0-alpha.78 → 3.0.0-alpha.79

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.
@@ -1,4 +1,4 @@
1
- import { sortBy } from 'lodash-es';
1
+ import { sortBy, unionWith, isEqual } from 'lodash-es';
2
2
  import { readFileAsync } from './misc.js';
3
3
  const TOP_LEVEL_NAMESPACE = '__TOP_LEVEL_MODULE__';
4
4
  export const DEFAULT_TYPE_DEF_HEADER = `/* auto-generated by NAPI-RS */
@@ -114,7 +114,7 @@ export declare class ExternalObject<T> {
114
114
  }
115
115
  async function readIntermediateTypeFile(file) {
116
116
  const content = await readFileAsync(file, 'utf8');
117
- const defs = content
117
+ const defs = unionWith(content
118
118
  .split('\n')
119
119
  .filter(Boolean)
120
120
  .map((line) => {
@@ -125,7 +125,8 @@ async function readIntermediateTypeFile(file) {
125
125
  line = line.slice(start);
126
126
  }
127
127
  return JSON.parse(line);
128
- });
128
+ })
129
+ .filter((def) => !!def.kind), (a, b) => isEqual(a, b));
129
130
  // move all `struct` def to the very top
130
131
  // and order the rest alphabetically.
131
132
  return defs.sort((a, b) => {
@@ -1 +1 @@
1
- {"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/utils/typegen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/utils/typegen.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@napi-rs/cli",
3
- "version": "3.0.0-alpha.78",
3
+ "version": "3.0.0-alpha.79",
4
4
  "description": "Cli tools for napi-rs",
5
5
  "author": "LongYinan <lynweklm@gmail.com>",
6
6
  "homepage": "https://github.com/napi-rs/napi-rs",
@@ -85,6 +85,7 @@
85
85
  "devDependencies": {
86
86
  "@emnapi/core": "^1.4.0",
87
87
  "@emnapi/runtime": "^1.4.0",
88
+ "@oxc-node/core": "^0.0.27",
88
89
  "@types/debug": "^4.1.12",
89
90
  "@types/inquirer": "^9.0.7",
90
91
  "@types/js-yaml": "^4.0.9",
@@ -95,7 +96,6 @@
95
96
  "env-paths": "^3.0.0",
96
97
  "esbuild": "^0.25.2",
97
98
  "prettier": "^3.5.3",
98
- "ts-node": "^10.9.2",
99
99
  "tslib": "^2.8.1",
100
100
  "typescript": "^5.8.2"
101
101
  },
@@ -116,10 +116,10 @@
116
116
  "url": "https://github.com/sponsors/Brooooooklyn"
117
117
  },
118
118
  "scripts": {
119
- "codegen": "node --loader ts-node/esm/transpile-only ./codegen/index.ts",
119
+ "codegen": "node --import @oxc-node/core/register ./codegen/index.ts",
120
120
  "build": "tsc && yarn build:cjs",
121
121
  "build:cjs": "node ./esbuild.mjs",
122
- "test": "node --loader ts-node/esm/transpile-only ../node_modules/ava/entrypoints/cli.mjs"
122
+ "test": "node --import @oxc-node/core/register ../node_modules/ava/entrypoints/cli.mjs"
123
123
  },
124
124
  "ava": {
125
125
  "extensions": {
@@ -129,5 +129,5 @@
129
129
  "**/__tests__/**/*.spec.ts"
130
130
  ]
131
131
  },
132
- "gitHead": "84209fc82931e8c6ef93e61e4a0e1d1a0ffaf511"
132
+ "gitHead": "c8c073a348308281c9131f2695f92e358ac321b7"
133
133
  }
package/src/api/build.ts CHANGED
@@ -1,11 +1,18 @@
1
1
  import { spawn } from 'node:child_process'
2
2
  import { createHash } from 'node:crypto'
3
- import { existsSync, mkdirSync, unlinkSync } from 'node:fs'
3
+ import {
4
+ existsSync,
5
+ mkdirSync,
6
+ unlinkSync,
7
+ readFileSync,
8
+ writeFileSync,
9
+ } from 'node:fs'
4
10
  import { createRequire } from 'node:module'
5
11
  import { tmpdir, homedir } from 'node:os'
6
12
  import { parse, join, resolve } from 'node:path'
7
13
 
8
14
  import * as colors from 'colorette'
15
+ import { groupBy, split } from 'lodash-es'
9
16
  import { include as setjmpInclude, lib as setjmpLib } from 'wasm-sjlj'
10
17
 
11
18
  import { BuildOptions as RawBuildOptions } from '../def/build.js'
@@ -85,6 +92,13 @@ export async function buildProject(options: BuildOptions) {
85
92
  )
86
93
  }
87
94
 
95
+ const depsNapiPackages = pkg.dependencies
96
+ .map((p) => metadata.packages.find((c) => c.name === p.name))
97
+ .filter(
98
+ (c): c is Crate =>
99
+ c != null && c.dependencies.some((d) => d.name == 'napi-derive'),
100
+ )
101
+
88
102
  const crateDir = parse(pkg.manifest_path).dir
89
103
 
90
104
  const builder = new Builder(
@@ -107,6 +121,7 @@ export async function buildProject(options: BuildOptions) {
107
121
  ),
108
122
  options.configPath ? resolvePath(options.configPath) : undefined,
109
123
  ),
124
+ depsNapiPackages,
110
125
  )
111
126
 
112
127
  return builder.build()
@@ -126,6 +141,7 @@ class Builder {
126
141
  private readonly outputDir: string,
127
142
  private readonly targetDir: string,
128
143
  private readonly config: NapiConfig,
144
+ private readonly depsNapiPackages: Crate[],
129
145
  ) {}
130
146
 
131
147
  get cdyLibName() {
@@ -463,11 +479,74 @@ class Builder {
463
479
  private setEnvs() {
464
480
  // type definition intermediate file
465
481
  this.envs.TYPE_DEF_TMP_PATH = this.getIntermediateTypeFile()
466
- // WASI register intermediate file
467
- this.envs.WASI_REGISTER_TMP_PATH = this.getIntermediateWasiRegisterFile()
468
- // TODO:
469
- // remove after napi-derive@v3 release
470
- this.envs.CARGO_CFG_NAPI_RS_CLI_VERSION = CLI_VERSION
482
+ // Validate the packages and dependencies
483
+ if (existsSync(this.envs.TYPE_DEF_TMP_PATH)) {
484
+ const { depsNapiPackages, crate } = this
485
+ let shouldInvalidateSelf = false
486
+ const content = readFileSync(this.envs.TYPE_DEF_TMP_PATH, 'utf-8')
487
+ const typedefRaw = content
488
+ .split('\n')
489
+ .filter((line) => line.trim().length)
490
+ .map((line) => {
491
+ const [pkgName, ...jsonContents] = split(line, ':')
492
+ return {
493
+ pkgName,
494
+ jsonContent: jsonContents.join(':'),
495
+ }
496
+ })
497
+ const groupedTypedefRaw = groupBy(typedefRaw, ({ pkgName }) => pkgName)
498
+ const invalidPackages = new Set<string>()
499
+ for (const [pkgName, value] of Object.entries(groupedTypedefRaw)) {
500
+ const packageInvalidKey = `NAPI_PACKAGE_${pkgName.toUpperCase().replaceAll('-', '_')}_INVALID`
501
+ let done = false
502
+ for (const { jsonContent } of value) {
503
+ try {
504
+ // package_name: { "done": true } was written by napi-build in project build.rs
505
+ // if it exists, the package was successfully built and typedef was written
506
+ const json = JSON.parse(jsonContent)
507
+ if (json.done === true) {
508
+ done = true
509
+ break
510
+ }
511
+ } catch {
512
+ done = false
513
+ break
514
+ }
515
+ }
516
+ if (!done) {
517
+ process.env[packageInvalidKey] = `${Date.now()}`
518
+ shouldInvalidateSelf = true
519
+ invalidPackages.add(pkgName)
520
+ }
521
+ }
522
+ const typedefPackages = new Set(Object.keys(groupedTypedefRaw))
523
+ for (const crate of depsNapiPackages) {
524
+ if (!typedefPackages.has(crate.name)) {
525
+ debug('Set invalid package typedef: %i', crate.name)
526
+ shouldInvalidateSelf = true
527
+ process.env[
528
+ `NAPI_PACKAGE_${crate.name.toUpperCase().replaceAll('-', '_')}_INVALID`
529
+ ] = `${Date.now()}`
530
+ }
531
+ }
532
+ if (shouldInvalidateSelf) {
533
+ debug('Set invalid package typedef: %i', crate.name)
534
+ process.env[
535
+ `NAPI_PACKAGE_${crate.name.toUpperCase().replaceAll('-', '_')}_INVALID`
536
+ ] = `${Date.now()}`
537
+ }
538
+ // clean invalid packages typedef
539
+ if (invalidPackages.size) {
540
+ debug('Clean invalid packages typedef: %O', invalidPackages)
541
+ writeFileSync(
542
+ this.envs.TYPE_DEF_TMP_PATH,
543
+ typedefRaw
544
+ .filter(({ pkgName }) => !invalidPackages.has(pkgName))
545
+ .map(({ pkgName, jsonContent }) => `${pkgName}:${jsonContent}`)
546
+ .join('\n'),
547
+ )
548
+ }
549
+ }
471
550
 
472
551
  // RUSTFLAGS
473
552
  let rustflags =
@@ -664,17 +743,6 @@ class Builder {
664
743
  return `${dtsPath}.tmp`
665
744
  }
666
745
 
667
- private getIntermediateWasiRegisterFile() {
668
- return join(
669
- tmpdir(),
670
- `${this.crate.name}-${createHash('sha256')
671
- .update(this.crate.manifest_path)
672
- .update(CLI_VERSION)
673
- .digest('hex')
674
- .substring(0, 8)}.napi_wasi_register.tmp`,
675
- )
676
- }
677
-
678
746
  private async postBuild() {
679
747
  try {
680
748
  debug(`Try to create output directory:`)
@@ -692,36 +760,8 @@ class Builder {
692
760
  // only for cdylib
693
761
  if (this.cdyLibName) {
694
762
  const idents = await this.generateTypeDef()
695
- const intermediateWasiRegisterFile = this.envs.WASI_REGISTER_TMP_PATH
696
- const wasiRegisterFunctions = this.config.targets.some(
697
- (t) => t.platform === 'wasi',
698
- )
699
- ? await (async function readIntermediateWasiRegisterFile() {
700
- const fileContent = await readFileAsync(
701
- intermediateWasiRegisterFile,
702
- 'utf8',
703
- ).catch((err) => {
704
- console.warn(
705
- `Read ${colors.yellowBright(
706
- intermediateWasiRegisterFile,
707
- )} failed, reason: ${err.message}`,
708
- )
709
- return ``
710
- })
711
- return fileContent
712
- .split('\n')
713
- .map((l) => l.trim())
714
- .filter((l) => l.length)
715
- .map((line) => {
716
- const [_, fn] = line.split(':')
717
- return fn?.trim()
718
- })
719
- .filter((fn) => !!fn)
720
- })()
721
- : []
722
763
  const jsOutput = await this.writeJsBinding(idents)
723
764
  const wasmBindingsOutput = await this.writeWasiBinding(
724
- wasiRegisterFunctions,
725
765
  wasmBinaryName ?? 'index.wasm',
726
766
  idents,
727
767
  )
@@ -926,11 +966,10 @@ class Builder {
926
966
  }
927
967
 
928
968
  private async writeWasiBinding(
929
- wasiRegisterFunctions: string[],
930
969
  distFileName: string | undefined,
931
970
  idents: string[],
932
971
  ) {
933
- if (distFileName && wasiRegisterFunctions.length) {
972
+ if (distFileName) {
934
973
  const { name, dir } = parse(distFileName)
935
974
  const bindingPath = join(dir, `${this.config.binaryName}.wasi.cjs`)
936
975
  const browserBindingPath = join(
@@ -940,11 +979,14 @@ class Builder {
940
979
  const workerPath = join(dir, 'wasi-worker.mjs')
941
980
  const browserWorkerPath = join(dir, 'wasi-worker-browser.mjs')
942
981
  const browserEntryPath = join(dir, 'browser.js')
943
- const exportsCode = idents
944
- .map(
945
- (ident) => `module.exports.${ident} = __napiModule.exports.${ident}`,
946
- )
947
- .join('\n')
982
+ const exportsCode =
983
+ `module.exports = __napiModule.exports\n` +
984
+ idents
985
+ .map(
986
+ (ident) =>
987
+ `module.exports.${ident} = __napiModule.exports.${ident}`,
988
+ )
989
+ .join('\n')
948
990
  await writeFileAsync(
949
991
  bindingPath,
950
992
  createWasiBinding(
@@ -966,6 +1008,7 @@ class Builder {
966
1008
  this.config.wasm?.browser?.fs,
967
1009
  this.config.wasm?.browser?.asyncInit,
968
1010
  ) +
1011
+ `export default __napiModule.exports\n` +
969
1012
  idents
970
1013
  .map(
971
1014
  (ident) =>
@@ -8,6 +8,7 @@ const { createRequire } = require('node:module')
8
8
  require = createRequire(__filename)
9
9
 
10
10
  ${createCommonBinding(localName, pkgName)}
11
+ module.exports = nativeBinding
11
12
  ${idents
12
13
  .map((ident) => `module.exports.${ident} = nativeBinding.${ident}`)
13
14
  .join('\n')}
@@ -113,7 +114,7 @@ function requireNative() {
113
114
  try {
114
115
  nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
115
116
  } catch (err) {
116
- loadErrors.push(err);
117
+ loadErrors.push(err)
117
118
  }
118
119
  } else if (process.platform === 'android') {
119
120
  if (process.arch === 'arm64') {
@@ -34,10 +34,10 @@ const __wasi = new __WASI({
34
34
  : `__emnapiInstantiateNapiModuleSync`
35
35
 
36
36
  return `import {
37
- ${emnapiInstantiateImport},
37
+ createOnMessage as __wasmCreateOnMessageForFsProxy,
38
38
  getDefaultContext as __emnapiGetDefaultContext,
39
+ ${emnapiInstantiateImport},
39
40
  WASI as __WASI,
40
- createOnMessage as __wasmCreateOnMessageForFsProxy,
41
41
  } from '@napi-rs/wasm-runtime'
42
42
  ${fsImport}
43
43
  import __wasmUrl from './${wasiFilename}.wasm?url'
@@ -104,9 +104,9 @@ const { WASI: __nodeWASI } = require('node:wasi')
104
104
  const { Worker } = require('node:worker_threads')
105
105
 
106
106
  const {
107
- instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
108
- getDefaultContext: __emnapiGetDefaultContext,
109
107
  createOnMessage: __wasmCreateOnMessageForFsProxy,
108
+ getDefaultContext: __emnapiGetDefaultContext,
109
+ instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
110
110
  } = require('@napi-rs/wasm-runtime')
111
111
 
112
112
  const __rootDir = __nodePath.parse(process.cwd()).root
@@ -179,5 +179,4 @@ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule
179
179
  }
180
180
  },
181
181
  })
182
-
183
182
  `
@@ -1,4 +1,4 @@
1
- import { execSync } from 'node:child_process'
1
+ import { spawnSync } from 'node:child_process'
2
2
  import fs from 'node:fs'
3
3
 
4
4
  export type CrateTargetKind =
@@ -26,6 +26,18 @@ export interface Crate {
26
26
  targets: CrateTarget[]
27
27
  features: Record<string, string[]>
28
28
  manifest_path: string
29
+ dependencies: Array<{
30
+ name: string
31
+ source: string
32
+ req: string
33
+ kind: string | null
34
+ rename: string | null
35
+ optional: boolean
36
+ uses_default_features: boolean
37
+ features: string[]
38
+ target: string | null
39
+ registry: string | null
40
+ }>
29
41
  }
30
42
 
31
43
  export interface CargoWorkspaceMetadata {
@@ -41,19 +53,32 @@ export function parseMetadata(manifestPath: string) {
41
53
  throw new Error(`No crate found in manifest: ${manifestPath}`)
42
54
  }
43
55
 
44
- const cmd = `cargo metadata --manifest-path ${manifestPath} --format-version 1 --no-deps`
56
+ const { stdout, stderr, status, error } = spawnSync(
57
+ 'cargo',
58
+ [
59
+ 'metadata',
60
+ '--manifest-path',
61
+ manifestPath,
62
+ '--format-version',
63
+ '1',
64
+ '--no-deps',
65
+ ],
66
+ { encoding: 'utf-8' },
67
+ )
45
68
 
46
- try {
47
- const output = execSync(cmd, {
48
- encoding: 'utf-8',
69
+ if (error) {
70
+ throw new Error('cargo metadata failed to run', { cause: error })
71
+ }
72
+ if (status !== 0) {
73
+ const simpleMessage = `cargo metadata exited with code ${status}`
74
+ throw new Error(`${simpleMessage} and error message:\n\n${stderr}`, {
75
+ cause: new Error(simpleMessage),
49
76
  })
50
- return JSON.parse(output) as CargoWorkspaceMetadata
77
+ }
78
+
79
+ try {
80
+ return JSON.parse(stdout) as CargoWorkspaceMetadata
51
81
  } catch (e) {
52
- throw new Error(
53
- `Failed to parse cargo metadata output by command: ${cmd}`,
54
- {
55
- cause: e,
56
- },
57
- )
82
+ throw new Error('Failed to parse cargo metadata JSON', { cause: e })
58
83
  }
59
84
  }
@@ -1,4 +1,4 @@
1
- import { sortBy } from 'lodash-es'
1
+ import { sortBy, unionWith, isEqual } from 'lodash-es'
2
2
 
3
3
  import { readFileAsync } from './misc.js'
4
4
 
@@ -149,18 +149,22 @@ export declare class ExternalObject<T> {
149
149
 
150
150
  async function readIntermediateTypeFile(file: string) {
151
151
  const content = await readFileAsync(file, 'utf8')
152
- const defs = content
153
- .split('\n')
154
- .filter(Boolean)
155
- .map((line) => {
156
- line = line.trim()
157
- if (!line.startsWith('{')) {
158
- // crateName:{ "def": "", ... }
159
- const start = line.indexOf(':') + 1
160
- line = line.slice(start)
161
- }
162
- return JSON.parse(line) as TypeDefLine
163
- })
152
+ const defs = unionWith(
153
+ content
154
+ .split('\n')
155
+ .filter(Boolean)
156
+ .map((line) => {
157
+ line = line.trim()
158
+ if (!line.startsWith('{')) {
159
+ // crateName:{ "def": "", ... }
160
+ const start = line.indexOf(':') + 1
161
+ line = line.slice(start)
162
+ }
163
+ return JSON.parse(line) as TypeDefLine
164
+ })
165
+ .filter((def) => !!def.kind),
166
+ (a, b) => isEqual(a, b),
167
+ )
164
168
 
165
169
  // move all `struct` def to the very top
166
170
  // and order the rest alphabetically.