@napi-rs/cli 2.15.2 → 3.0.0-alpha.0
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/README.md +17 -78
- package/cli.mjs +12 -0
- package/dist/api/artifacts.d.ts +2 -0
- package/dist/api/artifacts.js +50 -0
- package/dist/api/build.d.ts +14 -0
- package/dist/api/build.js +404 -0
- package/dist/api/create-npm-dirs.d.ts +2 -0
- package/dist/api/create-npm-dirs.js +63 -0
- package/dist/api/new.d.ts +4 -0
- package/dist/api/new.js +154 -0
- package/dist/api/pre-publish.d.ts +2 -0
- package/dist/api/pre-publish.js +157 -0
- package/dist/api/rename.d.ts +2 -0
- package/dist/api/rename.js +28 -0
- package/dist/api/templates/.gitignore.d.ts +1 -0
- package/dist/api/templates/.gitignore.js +198 -0
- package/dist/api/templates/.npmignore.d.ts +1 -0
- package/dist/api/templates/.npmignore.js +14 -0
- package/dist/api/templates/build.rs.d.ts +1 -0
- package/dist/api/templates/build.rs.js +4 -0
- package/dist/api/templates/cargo.toml.d.ts +6 -0
- package/dist/api/templates/cargo.toml.js +25 -0
- package/dist/api/templates/ci-template.d.ts +1 -0
- package/dist/api/templates/ci-template.js +566 -0
- package/dist/api/templates/ci.yml.d.ts +1 -0
- package/dist/api/templates/ci.yml.js +92 -0
- package/dist/api/templates/index.d.ts +8 -0
- package/dist/api/templates/index.js +8 -0
- package/dist/api/templates/js-binding.d.ts +1 -0
- package/dist/api/templates/js-binding.js +124 -0
- package/dist/api/templates/lib.rs.d.ts +1 -0
- package/dist/api/templates/lib.rs.js +10 -0
- package/dist/api/templates/package.json.d.ts +8 -0
- package/dist/api/templates/package.json.js +30 -0
- package/dist/api/universalize.d.ts +2 -0
- package/dist/api/universalize.js +38 -0
- package/dist/api/version.d.ts +2 -0
- package/dist/api/version.js +16 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +25 -0
- package/dist/commands/artifacts.d.ts +6 -0
- package/dist/commands/artifacts.js +19 -0
- package/dist/commands/build.d.ts +6 -0
- package/dist/commands/build.js +34 -0
- package/dist/commands/create-npm-dirs.d.ts +4 -0
- package/dist/commands/create-npm-dirs.js +7 -0
- package/dist/commands/help.d.ts +10 -0
- package/dist/commands/help.js +12 -0
- package/dist/commands/new.d.ts +12 -0
- package/dist/commands/new.js +112 -0
- package/dist/commands/pre-publish.d.ts +4 -0
- package/dist/commands/pre-publish.js +8 -0
- package/dist/commands/rename.d.ts +4 -0
- package/dist/commands/rename.js +7 -0
- package/dist/commands/universalize.d.ts +4 -0
- package/dist/commands/universalize.js +7 -0
- package/dist/commands/version.d.ts +4 -0
- package/dist/commands/version.js +7 -0
- package/dist/def/artifacts.d.ts +50 -0
- package/dist/def/artifacts.js +38 -0
- package/dist/def/build.d.ts +150 -0
- package/dist/def/build.js +105 -0
- package/dist/def/commands/artifacts.d.ts +15 -0
- package/dist/def/commands/artifacts.js +29 -0
- package/dist/def/commands/build.d.ts +53 -0
- package/dist/def/commands/build.js +105 -0
- package/dist/def/commands/create-npm-dirs.d.ts +15 -0
- package/dist/def/commands/create-npm-dirs.js +29 -0
- package/dist/def/commands/new.d.ts +27 -0
- package/dist/def/commands/new.js +53 -0
- package/dist/def/commands/pre-publish.d.ts +23 -0
- package/dist/def/commands/pre-publish.js +45 -0
- package/dist/def/commands/rename.d.ts +25 -0
- package/dist/def/commands/rename.js +49 -0
- package/dist/def/commands/universalize.d.ts +13 -0
- package/dist/def/commands/universalize.js +25 -0
- package/dist/def/commands/version.d.ts +13 -0
- package/dist/def/commands/version.js +25 -0
- package/dist/def/create-npm-dirs.d.ts +50 -0
- package/dist/def/create-npm-dirs.js +38 -0
- package/dist/def/new.d.ts +106 -0
- package/dist/def/new.js +66 -0
- package/dist/def/options/artifacts.d.ts +35 -0
- package/dist/def/options/artifacts.js +11 -0
- package/dist/def/options/build.d.ts +97 -0
- package/dist/def/options/build.js +3 -0
- package/dist/def/options/create-npm-dirs.d.ts +35 -0
- package/dist/def/options/create-npm-dirs.js +11 -0
- package/dist/def/options/new.d.ts +79 -0
- package/dist/def/options/new.js +15 -0
- package/dist/def/options/pre-publish.d.ts +65 -0
- package/dist/def/options/pre-publish.js +13 -0
- package/dist/def/options/rename.d.ts +75 -0
- package/dist/def/options/rename.js +11 -0
- package/dist/def/options/universalize.d.ts +28 -0
- package/dist/def/options/universalize.js +10 -0
- package/dist/def/options/version.d.ts +28 -0
- package/dist/def/options/version.js +10 -0
- package/dist/def/pre-publish.d.ts +88 -0
- package/dist/def/pre-publish.js +56 -0
- package/dist/def/rename.d.ts +100 -0
- package/dist/def/rename.js +58 -0
- package/dist/def/universalize.d.ts +41 -0
- package/dist/def/universalize.js +33 -0
- package/dist/def/version.d.ts +41 -0
- package/dist/def/version.js +33 -0
- package/dist/index.cjs +20641 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +30 -0
- package/dist/utils/__tests__/target.spec.d.ts +1 -0
- package/dist/utils/__tests__/target.spec.js +10 -0
- package/dist/utils/__tests__/typegen.spec.d.ts +1 -0
- package/dist/utils/__tests__/typegen.spec.js +37 -0
- package/dist/utils/__tests__/version.spec.d.ts +1 -0
- package/dist/utils/__tests__/version.spec.js +5 -0
- package/dist/utils/cargo.d.ts +1 -0
- package/dist/utils/cargo.js +33 -0
- package/dist/utils/ci.d.ts +11 -0
- package/dist/utils/ci.js +86 -0
- package/dist/utils/config.d.ts +65 -0
- package/dist/utils/config.js +42 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/log.d.ts +10 -0
- package/dist/utils/log.js +14 -0
- package/dist/utils/metadata.d.ts +24 -0
- package/dist/utils/metadata.js +19 -0
- package/dist/utils/misc.d.ts +13 -0
- package/dist/utils/misc.js +35 -0
- package/dist/utils/target.d.ts +30 -0
- package/dist/utils/target.js +109 -0
- package/dist/utils/typegen.d.ts +3 -0
- package/dist/utils/typegen.js +158 -0
- package/dist/utils/version.d.ts +11 -0
- package/dist/utils/version.js +59 -0
- package/package.json +63 -27
- package/src/api/artifacts.ts +93 -0
- package/src/api/build.ts +549 -0
- package/src/api/create-npm-dirs.ts +105 -0
- package/src/api/new.ts +206 -0
- package/src/api/pre-publish.ts +216 -0
- package/src/api/rename.ts +51 -0
- package/src/api/templates/.gitignore.ts +198 -0
- package/src/api/templates/.npmignore.ts +14 -0
- package/src/api/templates/build.rs.ts +4 -0
- package/src/api/templates/cargo.toml.ts +35 -0
- package/src/api/templates/ci-template.ts +566 -0
- package/src/api/templates/ci.yml.ts +116 -0
- package/src/api/templates/index.ts +8 -0
- package/src/api/templates/js-binding.ts +130 -0
- package/src/api/templates/lib.rs.ts +10 -0
- package/src/api/templates/package.json.ts +44 -0
- package/src/api/universalize.ts +76 -0
- package/src/api/version.ts +26 -0
- package/src/cli.ts +29 -0
- package/src/commands/artifacts.ts +23 -0
- package/src/commands/build.ts +42 -0
- package/src/commands/create-npm-dirs.ts +8 -0
- package/src/commands/help.ts +13 -0
- package/src/commands/new.ts +138 -0
- package/src/commands/pre-publish.ts +9 -0
- package/src/commands/rename.ts +8 -0
- package/src/commands/universalize.ts +8 -0
- package/src/commands/version.ts +8 -0
- package/src/def/artifacts.ts +79 -0
- package/src/def/build.ts +242 -0
- package/src/def/create-npm-dirs.ts +79 -0
- package/src/def/new.ts +144 -0
- package/src/def/pre-publish.ts +120 -0
- package/src/def/rename.ts +122 -0
- package/src/def/universalize.ts +66 -0
- package/src/def/version.ts +65 -0
- package/src/index.ts +31 -0
- package/src/utils/__tests__/__fixtures__/napi_type_def +201 -0
- package/src/utils/__tests__/__snapshots__/target.spec.ts.md +110 -0
- package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +618 -0
- package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
- package/src/utils/__tests__/__snapshots__/version.spec.ts.md +20 -0
- package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
- package/src/utils/__tests__/target.spec.ts +19 -0
- package/src/utils/__tests__/typegen.spec.ts +49 -0
- package/src/utils/__tests__/version.spec.ts +13 -0
- package/src/utils/cargo.ts +35 -0
- package/src/utils/ci.ts +102 -0
- package/src/utils/config.ts +123 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/log.ts +34 -0
- package/src/utils/metadata.ts +59 -0
- package/src/utils/misc.ts +45 -0
- package/src/utils/target.ts +145 -0
- package/src/utils/typegen.ts +193 -0
- package/src/utils/version.ts +76 -0
- package/scripts/index.js +0 -153779
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { sortBy } from 'lodash-es'
|
|
2
|
+
|
|
3
|
+
import { readFileAsync } from './misc.js'
|
|
4
|
+
|
|
5
|
+
const TOP_LEVEL_NAMESPACE = '__TOP_LEVEL_MODULE__'
|
|
6
|
+
export const DEFAULT_TYPE_DEF_HEADER = `/* auto-generated by NAPI-RS */
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
`
|
|
9
|
+
|
|
10
|
+
enum TypeDefKind {
|
|
11
|
+
Const = 'const',
|
|
12
|
+
Enum = 'enum',
|
|
13
|
+
Interface = 'interface',
|
|
14
|
+
Fn = 'fn',
|
|
15
|
+
Struct = 'struct',
|
|
16
|
+
Impl = 'impl',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface TypeDefLine {
|
|
20
|
+
kind: TypeDefKind
|
|
21
|
+
name: string
|
|
22
|
+
original_name?: string
|
|
23
|
+
def: string
|
|
24
|
+
js_doc?: string
|
|
25
|
+
js_mod?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function prettyPrint(line: TypeDefLine, ident: number): string {
|
|
29
|
+
let s = line.js_doc ?? ''
|
|
30
|
+
switch (line.kind) {
|
|
31
|
+
case TypeDefKind.Interface:
|
|
32
|
+
s += `export interface ${line.name} {\n${line.def}\n}`
|
|
33
|
+
break
|
|
34
|
+
|
|
35
|
+
case TypeDefKind.Enum:
|
|
36
|
+
s += `export const enum ${line.name} {\n${line.def}\n}`
|
|
37
|
+
break
|
|
38
|
+
|
|
39
|
+
case TypeDefKind.Struct:
|
|
40
|
+
s += `export class ${line.name} {\n${line.def}\n}`
|
|
41
|
+
if (line.original_name && line.original_name !== line.name) {
|
|
42
|
+
s += `\nexport type ${line.original_name} = ${line.name}`
|
|
43
|
+
}
|
|
44
|
+
break
|
|
45
|
+
|
|
46
|
+
default:
|
|
47
|
+
s += line.def
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return correctStringIdent(s, ident)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function processTypeDef(
|
|
54
|
+
intermediateTypeFile: string,
|
|
55
|
+
header?: string,
|
|
56
|
+
) {
|
|
57
|
+
const defs = await readIntermediateTypeFile(intermediateTypeFile)
|
|
58
|
+
const groupedDefs = preprocessTypeDef(defs)
|
|
59
|
+
|
|
60
|
+
header = header ? header + '\n' : ''
|
|
61
|
+
let dts = ''
|
|
62
|
+
|
|
63
|
+
sortBy(Array.from(groupedDefs), ([namespace]) => namespace).forEach(
|
|
64
|
+
([namespace, defs]) => {
|
|
65
|
+
if (namespace === TOP_LEVEL_NAMESPACE) {
|
|
66
|
+
for (const def of defs) {
|
|
67
|
+
dts += prettyPrint(def, 0) + '\n\n'
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
dts += `export namespace ${namespace} {\n`
|
|
71
|
+
for (const def of defs) {
|
|
72
|
+
dts += prettyPrint(def, 2) + '\n'
|
|
73
|
+
}
|
|
74
|
+
dts += '}\n\n'
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
if (dts.indexOf('ExternalObject<') > -1) {
|
|
80
|
+
header += `
|
|
81
|
+
export class ExternalObject<T> {
|
|
82
|
+
readonly '': {
|
|
83
|
+
readonly '': unique symbol
|
|
84
|
+
[K: symbol]: T
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
`
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return header + dts
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function readIntermediateTypeFile(file: string) {
|
|
94
|
+
const content = await readFileAsync(file, 'utf8')
|
|
95
|
+
const defs = content
|
|
96
|
+
.split('\n')
|
|
97
|
+
.filter(Boolean)
|
|
98
|
+
.map((line) => {
|
|
99
|
+
line = line.trim()
|
|
100
|
+
if (!line.startsWith('{')) {
|
|
101
|
+
// crateName:{ "def": "", ... }
|
|
102
|
+
const start = line.indexOf(':') + 1
|
|
103
|
+
line = line.slice(start)
|
|
104
|
+
}
|
|
105
|
+
return JSON.parse(line) as TypeDefLine
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
// move all `struct` def to the very top
|
|
109
|
+
// and order the rest alphabetically.
|
|
110
|
+
return defs.sort((a, b) => {
|
|
111
|
+
if (a.kind === TypeDefKind.Struct) {
|
|
112
|
+
if (b.kind === TypeDefKind.Struct) {
|
|
113
|
+
return a.name.localeCompare(b.name)
|
|
114
|
+
}
|
|
115
|
+
return -1
|
|
116
|
+
} else if (b.kind === TypeDefKind.Struct) {
|
|
117
|
+
return 1
|
|
118
|
+
} else {
|
|
119
|
+
return a.name.localeCompare(b.name)
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function preprocessTypeDef(defs: TypeDefLine[]): Map<string, TypeDefLine[]> {
|
|
125
|
+
const namespaceGrouped = new Map<string, TypeDefLine[]>()
|
|
126
|
+
const classDefs = new Map<string, TypeDefLine>()
|
|
127
|
+
|
|
128
|
+
for (const def of defs) {
|
|
129
|
+
const namespace = def.js_mod ?? TOP_LEVEL_NAMESPACE
|
|
130
|
+
if (!namespaceGrouped.has(namespace)) {
|
|
131
|
+
namespaceGrouped.set(namespace, [])
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const group = namespaceGrouped.get(namespace)!
|
|
135
|
+
|
|
136
|
+
if (def.kind === TypeDefKind.Struct) {
|
|
137
|
+
group.push(def)
|
|
138
|
+
classDefs.set(def.name, def)
|
|
139
|
+
} else if (def.kind === TypeDefKind.Impl) {
|
|
140
|
+
// merge `impl` into class definition
|
|
141
|
+
const classDef = classDefs.get(def.name)
|
|
142
|
+
if (classDef) {
|
|
143
|
+
if (classDef.def) {
|
|
144
|
+
classDef.def += '\n'
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
classDef.def += def.def
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
group.push(def)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return namespaceGrouped
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function correctStringIdent(src: string, ident: number): string {
|
|
158
|
+
let bracketDepth = 0
|
|
159
|
+
const result = src
|
|
160
|
+
.split('\n')
|
|
161
|
+
.map((line) => {
|
|
162
|
+
line = line.trim()
|
|
163
|
+
if (line === '') {
|
|
164
|
+
return ''
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const isInMultilineComment = line.startsWith('*')
|
|
168
|
+
const isClosingBracket = line.endsWith('}')
|
|
169
|
+
const isOpeningBracket = line.endsWith('{')
|
|
170
|
+
|
|
171
|
+
let rightIndent = ident
|
|
172
|
+
if (isOpeningBracket && !isInMultilineComment) {
|
|
173
|
+
bracketDepth += 1
|
|
174
|
+
rightIndent += (bracketDepth - 1) * 2
|
|
175
|
+
} else {
|
|
176
|
+
if (isClosingBracket && bracketDepth > 0 && !isInMultilineComment) {
|
|
177
|
+
bracketDepth -= 1
|
|
178
|
+
}
|
|
179
|
+
rightIndent += bracketDepth * 2
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (isInMultilineComment) {
|
|
183
|
+
rightIndent += 1
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const s = `${' '.repeat(rightIndent)}${line}`
|
|
187
|
+
|
|
188
|
+
return s
|
|
189
|
+
})
|
|
190
|
+
.join('\n')
|
|
191
|
+
|
|
192
|
+
return result
|
|
193
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export enum NapiVersion {
|
|
2
|
+
Napi1 = 1,
|
|
3
|
+
Napi2,
|
|
4
|
+
Napi3,
|
|
5
|
+
Napi4,
|
|
6
|
+
Napi5,
|
|
7
|
+
Napi6,
|
|
8
|
+
Napi7,
|
|
9
|
+
Napi8,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// because node support new napi version in some minor version updates, so we might meet such situation:
|
|
13
|
+
/// `node v10.20.0` supports `napi5` and `napi6`, but `node v12.0.0` only support `napi4`,
|
|
14
|
+
/// by which, we can not tell directly napi version supportness from node version directly.
|
|
15
|
+
const NAPI_VERSION_MATRIX = new Map<NapiVersion, string>([
|
|
16
|
+
[NapiVersion.Napi1, '8.6.0'],
|
|
17
|
+
[NapiVersion.Napi2, '8.10.0 | 9.3.0'],
|
|
18
|
+
[NapiVersion.Napi3, '6.14.2 | 8.11.2 | 9.11.0'],
|
|
19
|
+
[NapiVersion.Napi4, '10.16.0 | 11.8.0'],
|
|
20
|
+
[NapiVersion.Napi5, '10.17.0 | 12.11.0'],
|
|
21
|
+
[NapiVersion.Napi6, '10.20.0 | 12.17.0 | 14.0.0'],
|
|
22
|
+
[NapiVersion.Napi7, '10.23.0 | 12.19.0 | 14.12.0'],
|
|
23
|
+
[NapiVersion.Napi8, '12.22.0 | 14.17.0 | 15.12.0'],
|
|
24
|
+
])
|
|
25
|
+
|
|
26
|
+
interface NodeVersion {
|
|
27
|
+
major: number
|
|
28
|
+
minor: number
|
|
29
|
+
patch: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function parseNodeVersion(v: string): NodeVersion {
|
|
33
|
+
const matches = v.match(/v?([0-9]+)\.([0-9]+)\.([0-9]+)/i)
|
|
34
|
+
|
|
35
|
+
if (!matches) {
|
|
36
|
+
throw new Error('Unknown node version number: ' + v)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const [, major, minor, patch] = matches
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
major: parseInt(major),
|
|
43
|
+
minor: parseInt(minor),
|
|
44
|
+
patch: parseInt(patch),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function requiredNodeVersions(napiVersion: NapiVersion): NodeVersion[] {
|
|
49
|
+
const requirement = NAPI_VERSION_MATRIX.get(napiVersion)
|
|
50
|
+
|
|
51
|
+
if (!requirement) {
|
|
52
|
+
return [parseNodeVersion('10.0.0')]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return requirement.split('|').map(parseNodeVersion)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function toEngineRequirement(versions: NodeVersion[]): string {
|
|
59
|
+
const requirements: string[] = []
|
|
60
|
+
versions.forEach((v, i) => {
|
|
61
|
+
let req = ''
|
|
62
|
+
if (i !== 0) {
|
|
63
|
+
const lastVersion = versions[i - 1]
|
|
64
|
+
req += `< ${lastVersion.major + 1}`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
req += `${i === 0 ? '' : ' || '}>= ${v.major}.${v.minor}.${v.patch}`
|
|
68
|
+
requirements.push(req)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
return requirements.join(' && ')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function napiEngineRequirement(napiVersion: NapiVersion): string {
|
|
75
|
+
return toEngineRequirement(requiredNodeVersions(napiVersion))
|
|
76
|
+
}
|