@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.
- package/dist/api/build.js +79 -39
- package/dist/api/build.js.map +1 -1
- package/dist/api/templates/js-binding.js +2 -1
- package/dist/api/templates/js-binding.js.map +1 -1
- package/dist/api/templates/load-wasi-template.js +4 -5
- package/dist/api/templates/load-wasi-template.js.map +1 -1
- package/dist/index.cjs +355 -43
- package/dist/utils/metadata.d.ts +12 -0
- package/dist/utils/metadata.js +20 -9
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/typegen.js +4 -3
- package/dist/utils/typegen.js.map +1 -1
- package/package.json +5 -5
- package/src/api/build.ts +95 -52
- package/src/api/templates/js-binding.ts +2 -1
- package/src/api/templates/load-wasi-template.ts +4 -5
- package/src/utils/metadata.ts +37 -12
- package/src/utils/typegen.ts +17 -13
package/dist/utils/typegen.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;
|
|
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.
|
|
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 --
|
|
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 --
|
|
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": "
|
|
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 {
|
|
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
|
-
//
|
|
467
|
-
this.envs.
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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
|
|
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 =
|
|
944
|
-
.
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
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
|
-
|
|
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
|
`
|
package/src/utils/metadata.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/utils/typegen.ts
CHANGED
|
@@ -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 =
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
line
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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.
|