@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.
Files changed (194) hide show
  1. package/README.md +17 -78
  2. package/cli.mjs +12 -0
  3. package/dist/api/artifacts.d.ts +2 -0
  4. package/dist/api/artifacts.js +50 -0
  5. package/dist/api/build.d.ts +14 -0
  6. package/dist/api/build.js +404 -0
  7. package/dist/api/create-npm-dirs.d.ts +2 -0
  8. package/dist/api/create-npm-dirs.js +63 -0
  9. package/dist/api/new.d.ts +4 -0
  10. package/dist/api/new.js +154 -0
  11. package/dist/api/pre-publish.d.ts +2 -0
  12. package/dist/api/pre-publish.js +157 -0
  13. package/dist/api/rename.d.ts +2 -0
  14. package/dist/api/rename.js +28 -0
  15. package/dist/api/templates/.gitignore.d.ts +1 -0
  16. package/dist/api/templates/.gitignore.js +198 -0
  17. package/dist/api/templates/.npmignore.d.ts +1 -0
  18. package/dist/api/templates/.npmignore.js +14 -0
  19. package/dist/api/templates/build.rs.d.ts +1 -0
  20. package/dist/api/templates/build.rs.js +4 -0
  21. package/dist/api/templates/cargo.toml.d.ts +6 -0
  22. package/dist/api/templates/cargo.toml.js +25 -0
  23. package/dist/api/templates/ci-template.d.ts +1 -0
  24. package/dist/api/templates/ci-template.js +566 -0
  25. package/dist/api/templates/ci.yml.d.ts +1 -0
  26. package/dist/api/templates/ci.yml.js +92 -0
  27. package/dist/api/templates/index.d.ts +8 -0
  28. package/dist/api/templates/index.js +8 -0
  29. package/dist/api/templates/js-binding.d.ts +1 -0
  30. package/dist/api/templates/js-binding.js +124 -0
  31. package/dist/api/templates/lib.rs.d.ts +1 -0
  32. package/dist/api/templates/lib.rs.js +10 -0
  33. package/dist/api/templates/package.json.d.ts +8 -0
  34. package/dist/api/templates/package.json.js +30 -0
  35. package/dist/api/universalize.d.ts +2 -0
  36. package/dist/api/universalize.js +38 -0
  37. package/dist/api/version.d.ts +2 -0
  38. package/dist/api/version.js +16 -0
  39. package/dist/cli.d.ts +1 -0
  40. package/dist/cli.js +25 -0
  41. package/dist/commands/artifacts.d.ts +6 -0
  42. package/dist/commands/artifacts.js +19 -0
  43. package/dist/commands/build.d.ts +6 -0
  44. package/dist/commands/build.js +34 -0
  45. package/dist/commands/create-npm-dirs.d.ts +4 -0
  46. package/dist/commands/create-npm-dirs.js +7 -0
  47. package/dist/commands/help.d.ts +10 -0
  48. package/dist/commands/help.js +12 -0
  49. package/dist/commands/new.d.ts +12 -0
  50. package/dist/commands/new.js +112 -0
  51. package/dist/commands/pre-publish.d.ts +4 -0
  52. package/dist/commands/pre-publish.js +8 -0
  53. package/dist/commands/rename.d.ts +4 -0
  54. package/dist/commands/rename.js +7 -0
  55. package/dist/commands/universalize.d.ts +4 -0
  56. package/dist/commands/universalize.js +7 -0
  57. package/dist/commands/version.d.ts +4 -0
  58. package/dist/commands/version.js +7 -0
  59. package/dist/def/artifacts.d.ts +50 -0
  60. package/dist/def/artifacts.js +38 -0
  61. package/dist/def/build.d.ts +150 -0
  62. package/dist/def/build.js +105 -0
  63. package/dist/def/commands/artifacts.d.ts +15 -0
  64. package/dist/def/commands/artifacts.js +29 -0
  65. package/dist/def/commands/build.d.ts +53 -0
  66. package/dist/def/commands/build.js +105 -0
  67. package/dist/def/commands/create-npm-dirs.d.ts +15 -0
  68. package/dist/def/commands/create-npm-dirs.js +29 -0
  69. package/dist/def/commands/new.d.ts +27 -0
  70. package/dist/def/commands/new.js +53 -0
  71. package/dist/def/commands/pre-publish.d.ts +23 -0
  72. package/dist/def/commands/pre-publish.js +45 -0
  73. package/dist/def/commands/rename.d.ts +25 -0
  74. package/dist/def/commands/rename.js +49 -0
  75. package/dist/def/commands/universalize.d.ts +13 -0
  76. package/dist/def/commands/universalize.js +25 -0
  77. package/dist/def/commands/version.d.ts +13 -0
  78. package/dist/def/commands/version.js +25 -0
  79. package/dist/def/create-npm-dirs.d.ts +50 -0
  80. package/dist/def/create-npm-dirs.js +38 -0
  81. package/dist/def/new.d.ts +106 -0
  82. package/dist/def/new.js +66 -0
  83. package/dist/def/options/artifacts.d.ts +35 -0
  84. package/dist/def/options/artifacts.js +11 -0
  85. package/dist/def/options/build.d.ts +97 -0
  86. package/dist/def/options/build.js +3 -0
  87. package/dist/def/options/create-npm-dirs.d.ts +35 -0
  88. package/dist/def/options/create-npm-dirs.js +11 -0
  89. package/dist/def/options/new.d.ts +79 -0
  90. package/dist/def/options/new.js +15 -0
  91. package/dist/def/options/pre-publish.d.ts +65 -0
  92. package/dist/def/options/pre-publish.js +13 -0
  93. package/dist/def/options/rename.d.ts +75 -0
  94. package/dist/def/options/rename.js +11 -0
  95. package/dist/def/options/universalize.d.ts +28 -0
  96. package/dist/def/options/universalize.js +10 -0
  97. package/dist/def/options/version.d.ts +28 -0
  98. package/dist/def/options/version.js +10 -0
  99. package/dist/def/pre-publish.d.ts +88 -0
  100. package/dist/def/pre-publish.js +56 -0
  101. package/dist/def/rename.d.ts +100 -0
  102. package/dist/def/rename.js +58 -0
  103. package/dist/def/universalize.d.ts +41 -0
  104. package/dist/def/universalize.js +33 -0
  105. package/dist/def/version.d.ts +41 -0
  106. package/dist/def/version.js +33 -0
  107. package/dist/index.cjs +20641 -0
  108. package/dist/index.d.ts +30 -0
  109. package/dist/index.js +30 -0
  110. package/dist/utils/__tests__/target.spec.d.ts +1 -0
  111. package/dist/utils/__tests__/target.spec.js +10 -0
  112. package/dist/utils/__tests__/typegen.spec.d.ts +1 -0
  113. package/dist/utils/__tests__/typegen.spec.js +37 -0
  114. package/dist/utils/__tests__/version.spec.d.ts +1 -0
  115. package/dist/utils/__tests__/version.spec.js +5 -0
  116. package/dist/utils/cargo.d.ts +1 -0
  117. package/dist/utils/cargo.js +33 -0
  118. package/dist/utils/ci.d.ts +11 -0
  119. package/dist/utils/ci.js +86 -0
  120. package/dist/utils/config.d.ts +65 -0
  121. package/dist/utils/config.js +42 -0
  122. package/dist/utils/index.d.ts +9 -0
  123. package/dist/utils/index.js +9 -0
  124. package/dist/utils/log.d.ts +10 -0
  125. package/dist/utils/log.js +14 -0
  126. package/dist/utils/metadata.d.ts +24 -0
  127. package/dist/utils/metadata.js +19 -0
  128. package/dist/utils/misc.d.ts +13 -0
  129. package/dist/utils/misc.js +35 -0
  130. package/dist/utils/target.d.ts +30 -0
  131. package/dist/utils/target.js +109 -0
  132. package/dist/utils/typegen.d.ts +3 -0
  133. package/dist/utils/typegen.js +158 -0
  134. package/dist/utils/version.d.ts +11 -0
  135. package/dist/utils/version.js +59 -0
  136. package/package.json +63 -27
  137. package/src/api/artifacts.ts +93 -0
  138. package/src/api/build.ts +549 -0
  139. package/src/api/create-npm-dirs.ts +105 -0
  140. package/src/api/new.ts +206 -0
  141. package/src/api/pre-publish.ts +216 -0
  142. package/src/api/rename.ts +51 -0
  143. package/src/api/templates/.gitignore.ts +198 -0
  144. package/src/api/templates/.npmignore.ts +14 -0
  145. package/src/api/templates/build.rs.ts +4 -0
  146. package/src/api/templates/cargo.toml.ts +35 -0
  147. package/src/api/templates/ci-template.ts +566 -0
  148. package/src/api/templates/ci.yml.ts +116 -0
  149. package/src/api/templates/index.ts +8 -0
  150. package/src/api/templates/js-binding.ts +130 -0
  151. package/src/api/templates/lib.rs.ts +10 -0
  152. package/src/api/templates/package.json.ts +44 -0
  153. package/src/api/universalize.ts +76 -0
  154. package/src/api/version.ts +26 -0
  155. package/src/cli.ts +29 -0
  156. package/src/commands/artifacts.ts +23 -0
  157. package/src/commands/build.ts +42 -0
  158. package/src/commands/create-npm-dirs.ts +8 -0
  159. package/src/commands/help.ts +13 -0
  160. package/src/commands/new.ts +138 -0
  161. package/src/commands/pre-publish.ts +9 -0
  162. package/src/commands/rename.ts +8 -0
  163. package/src/commands/universalize.ts +8 -0
  164. package/src/commands/version.ts +8 -0
  165. package/src/def/artifacts.ts +79 -0
  166. package/src/def/build.ts +242 -0
  167. package/src/def/create-npm-dirs.ts +79 -0
  168. package/src/def/new.ts +144 -0
  169. package/src/def/pre-publish.ts +120 -0
  170. package/src/def/rename.ts +122 -0
  171. package/src/def/universalize.ts +66 -0
  172. package/src/def/version.ts +65 -0
  173. package/src/index.ts +31 -0
  174. package/src/utils/__tests__/__fixtures__/napi_type_def +201 -0
  175. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +110 -0
  176. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  177. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +618 -0
  178. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  179. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +20 -0
  180. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  181. package/src/utils/__tests__/target.spec.ts +19 -0
  182. package/src/utils/__tests__/typegen.spec.ts +49 -0
  183. package/src/utils/__tests__/version.spec.ts +13 -0
  184. package/src/utils/cargo.ts +35 -0
  185. package/src/utils/ci.ts +102 -0
  186. package/src/utils/config.ts +123 -0
  187. package/src/utils/index.ts +9 -0
  188. package/src/utils/log.ts +34 -0
  189. package/src/utils/metadata.ts +59 -0
  190. package/src/utils/misc.ts +45 -0
  191. package/src/utils/target.ts +145 -0
  192. package/src/utils/typegen.ts +193 -0
  193. package/src/utils/version.ts +76 -0
  194. 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
+ }