nitrogen 0.2.23 → 0.29.4

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 (333) hide show
  1. package/README.md +15 -109
  2. package/lib/Logger.d.ts +10 -0
  3. package/lib/Logger.js +56 -0
  4. package/lib/autolinking/Autolinking.d.ts +8 -0
  5. package/lib/autolinking/Autolinking.js +1 -0
  6. package/lib/autolinking/android/createCMakeExtension.d.ts +6 -0
  7. package/lib/autolinking/android/createCMakeExtension.js +106 -0
  8. package/lib/autolinking/android/createGradleExtension.d.ts +5 -0
  9. package/lib/autolinking/android/createGradleExtension.js +36 -0
  10. package/lib/autolinking/android/createHybridObjectInitializer.d.ts +2 -0
  11. package/lib/autolinking/android/createHybridObjectInitializer.js +159 -0
  12. package/lib/autolinking/createAndroidAutolinking.d.ts +11 -0
  13. package/lib/autolinking/createAndroidAutolinking.js +13 -0
  14. package/lib/autolinking/createIOSAutolinking.d.ts +5 -0
  15. package/lib/autolinking/createIOSAutolinking.js +19 -0
  16. package/lib/autolinking/ios/createHybridObjectInitializer.d.ts +9 -0
  17. package/lib/autolinking/ios/createHybridObjectInitializer.js +97 -0
  18. package/lib/autolinking/ios/createPodspecRubyExtension.d.ts +5 -0
  19. package/lib/autolinking/ios/createPodspecRubyExtension.js +69 -0
  20. package/lib/autolinking/ios/createSwiftCxxBridge.d.ts +2 -0
  21. package/lib/autolinking/ios/createSwiftCxxBridge.js +117 -0
  22. package/lib/autolinking/ios/createSwiftUmbrellaHeader.d.ts +3 -0
  23. package/lib/autolinking/ios/createSwiftUmbrellaHeader.js +74 -0
  24. package/lib/config/NitroConfig.d.ts +52 -0
  25. package/lib/config/NitroConfig.js +112 -0
  26. package/lib/config/NitroUserConfig.d.ts +22 -0
  27. package/lib/config/NitroUserConfig.js +88 -0
  28. package/lib/config/getConfig.d.ts +2 -0
  29. package/lib/config/getConfig.js +84 -0
  30. package/lib/createGitAttributes.d.ts +1 -0
  31. package/lib/createGitAttributes.js +11 -0
  32. package/lib/createPlatformSpec.d.ts +4 -0
  33. package/lib/createPlatformSpec.js +127 -0
  34. package/lib/getFiles.d.ts +1 -0
  35. package/lib/getFiles.js +28 -0
  36. package/lib/getPlatformSpecs.d.ts +17 -0
  37. package/lib/getPlatformSpecs.js +153 -0
  38. package/lib/index.d.ts +2 -0
  39. package/lib/index.js +113 -10
  40. package/lib/init.d.ts +1 -0
  41. package/lib/init.js +123 -0
  42. package/lib/nitrogen.d.ts +11 -0
  43. package/lib/nitrogen.js +165 -0
  44. package/lib/prettifyDirectory.d.ts +1 -0
  45. package/lib/prettifyDirectory.js +27 -0
  46. package/lib/syntax/BridgedType.d.ts +41 -0
  47. package/lib/syntax/BridgedType.js +1 -0
  48. package/lib/syntax/CodeNode.d.ts +23 -0
  49. package/lib/syntax/CodeNode.js +1 -0
  50. package/lib/syntax/HybridObjectSpec.d.ts +13 -0
  51. package/lib/syntax/HybridObjectSpec.js +1 -0
  52. package/lib/syntax/Method.d.ts +41 -0
  53. package/lib/syntax/Method.js +108 -0
  54. package/lib/syntax/Parameter.d.ts +15 -0
  55. package/lib/syntax/Parameter.js +65 -0
  56. package/lib/syntax/Property.d.ts +50 -0
  57. package/lib/syntax/Property.js +147 -0
  58. package/lib/syntax/SourceFile.d.ts +70 -0
  59. package/lib/syntax/SourceFile.js +7 -0
  60. package/lib/syntax/c++/CppEnum.d.ts +6 -0
  61. package/lib/syntax/c++/CppEnum.js +110 -0
  62. package/lib/syntax/c++/CppHybridObject.d.ts +3 -0
  63. package/lib/syntax/c++/CppHybridObject.js +146 -0
  64. package/lib/syntax/c++/CppHybridObjectRegistration.d.ts +17 -0
  65. package/lib/syntax/c++/CppHybridObjectRegistration.js +18 -0
  66. package/lib/syntax/c++/CppStruct.d.ts +3 -0
  67. package/lib/syntax/c++/CppStruct.js +108 -0
  68. package/lib/syntax/c++/CppUnion.d.ts +6 -0
  69. package/lib/syntax/c++/CppUnion.js +88 -0
  70. package/lib/syntax/c++/getForwardDeclaration.d.ts +3 -0
  71. package/lib/syntax/c++/getForwardDeclaration.js +14 -0
  72. package/lib/syntax/c++/includeNitroHeader.d.ts +7 -0
  73. package/lib/syntax/c++/includeNitroHeader.js +34 -0
  74. package/lib/syntax/createType.d.ts +15 -0
  75. package/lib/syntax/createType.js +303 -0
  76. package/lib/syntax/getAllTypes.d.ts +3 -0
  77. package/lib/syntax/getAllTypes.js +11 -0
  78. package/lib/syntax/getCustomTypeConfig.d.ts +8 -0
  79. package/lib/syntax/getCustomTypeConfig.js +53 -0
  80. package/lib/syntax/getHybridObjectName.d.ts +36 -0
  81. package/lib/syntax/getHybridObjectName.js +10 -0
  82. package/lib/syntax/getInterfaceProperties.d.ts +4 -0
  83. package/lib/syntax/getInterfaceProperties.js +9 -0
  84. package/lib/syntax/getReferencedTypes.d.ts +2 -0
  85. package/lib/syntax/getReferencedTypes.js +47 -0
  86. package/lib/syntax/helpers.d.ts +13 -0
  87. package/lib/syntax/helpers.js +53 -0
  88. package/lib/syntax/isCoreType.d.ts +9 -0
  89. package/lib/syntax/isCoreType.js +47 -0
  90. package/lib/syntax/kotlin/FbjniHybridObject.d.ts +3 -0
  91. package/lib/syntax/kotlin/FbjniHybridObject.js +261 -0
  92. package/lib/syntax/kotlin/JNINativeRegistrations.d.ts +8 -0
  93. package/lib/syntax/kotlin/JNINativeRegistrations.js +7 -0
  94. package/lib/syntax/kotlin/KotlinBoxedPrimitive.d.ts +7 -0
  95. package/lib/syntax/kotlin/KotlinBoxedPrimitive.js +17 -0
  96. package/lib/syntax/kotlin/KotlinCxxBridgedType.d.ts +19 -0
  97. package/lib/syntax/kotlin/KotlinCxxBridgedType.js +893 -0
  98. package/lib/syntax/kotlin/KotlinEnum.d.ts +3 -0
  99. package/lib/syntax/kotlin/KotlinEnum.js +113 -0
  100. package/lib/syntax/kotlin/KotlinFunction.d.ts +3 -0
  101. package/lib/syntax/kotlin/KotlinFunction.js +256 -0
  102. package/lib/syntax/kotlin/KotlinHybridObject.d.ts +3 -0
  103. package/lib/syntax/kotlin/KotlinHybridObject.js +177 -0
  104. package/lib/syntax/kotlin/KotlinHybridObjectRegistration.d.ts +17 -0
  105. package/lib/syntax/kotlin/KotlinHybridObjectRegistration.js +26 -0
  106. package/lib/syntax/kotlin/KotlinStruct.d.ts +3 -0
  107. package/lib/syntax/kotlin/KotlinStruct.js +172 -0
  108. package/lib/syntax/kotlin/KotlinVariant.d.ts +3 -0
  109. package/lib/syntax/kotlin/KotlinVariant.js +191 -0
  110. package/lib/syntax/swift/SwiftCxxBridgedType.d.ts +21 -0
  111. package/lib/syntax/swift/SwiftCxxBridgedType.js +819 -0
  112. package/lib/syntax/swift/SwiftCxxTypeHelper.d.ts +17 -0
  113. package/lib/syntax/swift/SwiftCxxTypeHelper.js +613 -0
  114. package/lib/syntax/swift/SwiftEnum.d.ts +3 -0
  115. package/lib/syntax/swift/SwiftEnum.js +52 -0
  116. package/lib/syntax/swift/SwiftFunction.d.ts +3 -0
  117. package/lib/syntax/swift/SwiftFunction.js +83 -0
  118. package/lib/syntax/swift/SwiftHybridObject.d.ts +3 -0
  119. package/lib/syntax/swift/SwiftHybridObject.js +103 -0
  120. package/lib/syntax/swift/SwiftHybridObjectBridge.d.ts +11 -0
  121. package/lib/syntax/swift/SwiftHybridObjectBridge.js +451 -0
  122. package/lib/syntax/swift/SwiftHybridObjectRegistration.d.ts +19 -0
  123. package/lib/syntax/swift/SwiftHybridObjectRegistration.js +42 -0
  124. package/lib/syntax/swift/SwiftStruct.d.ts +3 -0
  125. package/lib/syntax/swift/SwiftStruct.js +75 -0
  126. package/lib/syntax/swift/SwiftVariant.d.ts +3 -0
  127. package/lib/syntax/swift/SwiftVariant.js +58 -0
  128. package/lib/syntax/types/ArrayBufferType.d.ts +10 -0
  129. package/lib/syntax/types/ArrayBufferType.js +37 -0
  130. package/lib/syntax/types/ArrayType.d.ts +12 -0
  131. package/lib/syntax/types/ArrayType.js +52 -0
  132. package/lib/syntax/types/BigIntType.d.ts +10 -0
  133. package/lib/syntax/types/BigIntType.js +27 -0
  134. package/lib/syntax/types/BooleanType.d.ts +10 -0
  135. package/lib/syntax/types/BooleanType.js +27 -0
  136. package/lib/syntax/types/CustomType.d.ts +14 -0
  137. package/lib/syntax/types/CustomType.js +36 -0
  138. package/lib/syntax/types/DateType.d.ts +10 -0
  139. package/lib/syntax/types/DateType.js +35 -0
  140. package/lib/syntax/types/EnumType.d.ts +23 -0
  141. package/lib/syntax/types/EnumType.js +101 -0
  142. package/lib/syntax/types/ErrorType.d.ts +11 -0
  143. package/lib/syntax/types/ErrorType.js +37 -0
  144. package/lib/syntax/types/FunctionType.d.ts +29 -0
  145. package/lib/syntax/types/FunctionType.js +147 -0
  146. package/lib/syntax/types/HybridObjectBaseType.d.ts +11 -0
  147. package/lib/syntax/types/HybridObjectBaseType.js +38 -0
  148. package/lib/syntax/types/HybridObjectType.d.ts +23 -0
  149. package/lib/syntax/types/HybridObjectType.js +131 -0
  150. package/lib/syntax/types/MapType.d.ts +10 -0
  151. package/lib/syntax/types/MapType.js +37 -0
  152. package/lib/syntax/types/NamedWrappingType.d.ts +14 -0
  153. package/lib/syntax/types/NamedWrappingType.js +27 -0
  154. package/lib/syntax/types/NullType.d.ts +10 -0
  155. package/lib/syntax/types/NullType.js +23 -0
  156. package/lib/syntax/types/NumberType.d.ts +10 -0
  157. package/lib/syntax/types/NumberType.js +27 -0
  158. package/lib/syntax/types/OptionalType.d.ts +13 -0
  159. package/lib/syntax/types/OptionalType.js +59 -0
  160. package/lib/syntax/types/PromiseType.d.ts +16 -0
  161. package/lib/syntax/types/PromiseType.js +62 -0
  162. package/lib/syntax/types/RecordType.d.ts +13 -0
  163. package/lib/syntax/types/RecordType.js +47 -0
  164. package/lib/syntax/types/ResultWrappingType.d.ts +13 -0
  165. package/lib/syntax/types/ResultWrappingType.js +44 -0
  166. package/lib/syntax/types/StringType.d.ts +10 -0
  167. package/lib/syntax/types/StringType.js +35 -0
  168. package/lib/syntax/types/StructType.d.ts +14 -0
  169. package/lib/syntax/types/StructType.js +61 -0
  170. package/lib/syntax/types/TupleType.d.ts +12 -0
  171. package/lib/syntax/types/TupleType.js +39 -0
  172. package/lib/syntax/types/Type.d.ts +55 -0
  173. package/lib/syntax/types/Type.js +1 -0
  174. package/lib/syntax/types/VariantType.d.ts +19 -0
  175. package/lib/syntax/types/VariantType.js +75 -0
  176. package/lib/syntax/types/VoidType.d.ts +10 -0
  177. package/lib/syntax/types/VoidType.js +27 -0
  178. package/lib/syntax/types/getTypeAs.d.ts +2 -0
  179. package/lib/syntax/types/getTypeAs.js +12 -0
  180. package/lib/utils.d.ts +22 -0
  181. package/lib/utils.js +126 -0
  182. package/lib/views/CppHybridViewComponent.d.ts +14 -0
  183. package/lib/views/CppHybridViewComponent.js +254 -0
  184. package/lib/views/createHostComponentJs.d.ts +3 -0
  185. package/lib/views/createHostComponentJs.js +27 -0
  186. package/lib/views/kotlin/KotlinHybridViewManager.d.ts +3 -0
  187. package/lib/views/kotlin/KotlinHybridViewManager.js +229 -0
  188. package/lib/views/swift/SwiftHybridViewManager.d.ts +3 -0
  189. package/lib/views/swift/SwiftHybridViewManager.js +131 -0
  190. package/lib/writeFile.d.ts +5 -0
  191. package/lib/writeFile.js +19 -0
  192. package/package.json +58 -29
  193. package/src/Logger.ts +63 -0
  194. package/src/autolinking/Autolinking.ts +9 -0
  195. package/src/autolinking/android/createCMakeExtension.ts +123 -0
  196. package/src/autolinking/android/createGradleExtension.ts +43 -0
  197. package/src/autolinking/android/createHybridObjectInitializer.ts +174 -0
  198. package/src/autolinking/createAndroidAutolinking.ts +28 -0
  199. package/src/autolinking/createIOSAutolinking.ts +24 -0
  200. package/src/autolinking/ios/createHybridObjectInitializer.ts +112 -0
  201. package/src/autolinking/ios/createPodspecRubyExtension.ts +76 -0
  202. package/src/autolinking/ios/createSwiftCxxBridge.ts +137 -0
  203. package/src/autolinking/ios/createSwiftUmbrellaHeader.ts +90 -0
  204. package/src/config/NitroConfig.ts +139 -0
  205. package/src/config/NitroUserConfig.ts +105 -0
  206. package/src/config/getConfig.ts +91 -0
  207. package/src/createGitAttributes.ts +15 -0
  208. package/src/createPlatformSpec.ts +176 -0
  209. package/src/getFiles.ts +31 -0
  210. package/src/getPlatformSpecs.ts +202 -0
  211. package/src/index.ts +146 -0
  212. package/src/init.ts +186 -0
  213. package/src/nitrogen.ts +246 -0
  214. package/src/prettifyDirectory.ts +32 -0
  215. package/src/syntax/BridgedType.ts +59 -0
  216. package/src/syntax/CodeNode.ts +24 -0
  217. package/src/syntax/HybridObjectSpec.ts +14 -0
  218. package/src/syntax/Method.ts +154 -0
  219. package/src/syntax/Parameter.ts +81 -0
  220. package/src/syntax/Property.ts +203 -0
  221. package/src/syntax/SourceFile.ts +80 -0
  222. package/src/syntax/c++/CppEnum.ts +128 -0
  223. package/src/syntax/c++/CppHybridObject.ts +165 -0
  224. package/src/syntax/c++/CppHybridObjectRegistration.ts +39 -0
  225. package/src/syntax/c++/CppStruct.ts +129 -0
  226. package/src/syntax/c++/CppUnion.ts +105 -0
  227. package/src/syntax/c++/getForwardDeclaration.ts +19 -0
  228. package/src/syntax/c++/includeNitroHeader.ts +40 -0
  229. package/src/syntax/createType.ts +365 -0
  230. package/src/syntax/getAllTypes.ts +18 -0
  231. package/src/syntax/getCustomTypeConfig.ts +71 -0
  232. package/src/syntax/getHybridObjectName.ts +48 -0
  233. package/src/syntax/getInterfaceProperties.ts +21 -0
  234. package/src/syntax/getReferencedTypes.ts +57 -0
  235. package/src/syntax/helpers.ts +79 -0
  236. package/src/syntax/isCoreType.ts +60 -0
  237. package/src/syntax/kotlin/FbjniHybridObject.ts +313 -0
  238. package/src/syntax/kotlin/JNINativeRegistrations.ts +19 -0
  239. package/src/syntax/kotlin/KotlinBoxedPrimitive.ts +19 -0
  240. package/src/syntax/kotlin/KotlinCxxBridgedType.ts +942 -0
  241. package/src/syntax/kotlin/KotlinEnum.ts +130 -0
  242. package/src/syntax/kotlin/KotlinFunction.ts +277 -0
  243. package/src/syntax/kotlin/KotlinHybridObject.ts +205 -0
  244. package/src/syntax/kotlin/KotlinHybridObjectRegistration.ts +51 -0
  245. package/src/syntax/kotlin/KotlinStruct.ts +198 -0
  246. package/src/syntax/kotlin/KotlinVariant.ts +212 -0
  247. package/src/syntax/swift/SwiftCxxBridgedType.ts +874 -0
  248. package/src/syntax/swift/SwiftCxxTypeHelper.ts +674 -0
  249. package/src/syntax/swift/SwiftEnum.ts +65 -0
  250. package/src/syntax/swift/SwiftFunction.ts +91 -0
  251. package/src/syntax/swift/SwiftHybridObject.ts +121 -0
  252. package/src/syntax/swift/SwiftHybridObjectBridge.ts +522 -0
  253. package/src/syntax/swift/SwiftHybridObjectRegistration.ts +75 -0
  254. package/src/syntax/swift/SwiftStruct.ts +85 -0
  255. package/src/syntax/swift/SwiftVariant.ts +67 -0
  256. package/src/syntax/types/ArrayBufferType.ts +49 -0
  257. package/src/syntax/types/ArrayType.ts +62 -0
  258. package/src/syntax/types/BigIntType.ts +35 -0
  259. package/src/syntax/types/BooleanType.ts +35 -0
  260. package/src/syntax/types/CustomType.ts +47 -0
  261. package/src/syntax/types/DateType.ts +43 -0
  262. package/src/syntax/types/EnumType.ts +130 -0
  263. package/src/syntax/types/ErrorType.ts +44 -0
  264. package/src/syntax/types/FunctionType.ts +167 -0
  265. package/src/syntax/types/HybridObjectBaseType.ts +54 -0
  266. package/src/syntax/types/HybridObjectType.ts +198 -0
  267. package/src/syntax/types/MapType.ts +49 -0
  268. package/src/syntax/types/NamedWrappingType.ts +33 -0
  269. package/src/syntax/types/NullType.ts +30 -0
  270. package/src/syntax/types/NumberType.ts +34 -0
  271. package/src/syntax/types/OptionalType.ts +66 -0
  272. package/src/syntax/types/PromiseType.ts +72 -0
  273. package/src/syntax/types/RecordType.ts +56 -0
  274. package/src/syntax/types/ResultWrappingType.ts +53 -0
  275. package/src/syntax/types/StringType.ts +44 -0
  276. package/src/syntax/types/StructType.ts +83 -0
  277. package/src/syntax/types/TupleType.ts +53 -0
  278. package/src/syntax/types/Type.ts +82 -0
  279. package/src/syntax/types/VariantType.ts +92 -0
  280. package/src/syntax/types/VoidType.ts +34 -0
  281. package/src/syntax/types/getTypeAs.ts +15 -0
  282. package/src/utils.ts +162 -0
  283. package/src/views/CppHybridViewComponent.ts +301 -0
  284. package/src/views/createHostComponentJs.ts +34 -0
  285. package/src/views/kotlin/KotlinHybridViewManager.ts +258 -0
  286. package/src/views/swift/SwiftHybridViewManager.ts +153 -0
  287. package/src/writeFile.ts +27 -0
  288. package/.jshintignore +0 -6
  289. package/.jshintrc +0 -3
  290. package/.npmignore +0 -3
  291. package/.travis.yml +0 -13
  292. package/LICENSE +0 -13
  293. package/browser/nitrogen-min.js +0 -3
  294. package/browser/nitrogen.js +0 -6369
  295. package/lib/apiKey.js +0 -67
  296. package/lib/blob.js +0 -57
  297. package/lib/commandManager.js +0 -350
  298. package/lib/device.js +0 -19
  299. package/lib/memoryStore.js +0 -24
  300. package/lib/message.js +0 -298
  301. package/lib/permission.js +0 -121
  302. package/lib/principal.js +0 -330
  303. package/lib/service.js +0 -349
  304. package/lib/session.js +0 -494
  305. package/lib/user.js +0 -20
  306. package/publish +0 -2
  307. package/scripts/build-documentation +0 -4
  308. package/scripts/build-module +0 -27
  309. package/scripts/module.js +0 -12
  310. package/scripts/postamble.js +0 -1
  311. package/scripts/preamble.js +0 -2
  312. package/scripts/run-test-server +0 -9
  313. package/test/config.js +0 -12
  314. package/test/fixtures/images/image.jpg +0 -0
  315. package/test/fixtures/images/motion0.jpg +0 -0
  316. package/test/fixtures/images/motion1.jpg +0 -0
  317. package/test/fixtures/images/motion2.jpg +0 -0
  318. package/test/fixtures/index.js +0 -76
  319. package/test/main.js +0 -5
  320. package/test/memoryStore.js +0 -22
  321. package/test/mocha.opts +0 -3
  322. package/test/units/apiKey.js +0 -46
  323. package/test/units/blob.js +0 -35
  324. package/test/units/commandManager.js +0 -67
  325. package/test/units/device.js +0 -26
  326. package/test/units/heartbeat.js +0 -28
  327. package/test/units/message.js +0 -79
  328. package/test/units/permissions.js +0 -43
  329. package/test/units/principal.js +0 -116
  330. package/test/units/service.js +0 -92
  331. package/test/units/session.js +0 -97
  332. package/test/units/user.js +0 -48
  333. package/yuidoc.json +0 -8
package/src/index.ts ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+
3
+ import yargs from 'yargs/yargs'
4
+ import { hideBin } from 'yargs/helpers'
5
+ import chalk from 'chalk'
6
+ import { prettifyDirectory } from './prettifyDirectory.js'
7
+ import { getFiles } from './getFiles.js'
8
+ import { runNitrogen } from './nitrogen.js'
9
+ import { promises as fs } from 'fs'
10
+ import { isValidLogLevel, setLogLevel } from './Logger.js'
11
+ import { initNewNitroModule } from './init.js'
12
+ import { NITROGEN_VERSION } from './utils.js'
13
+
14
+ const commandName = 'nitrogen'
15
+
16
+ // Maximum of 100 col width
17
+ const cliWidth = Math.min(process.stdout.columns * 0.9, 100)
18
+
19
+ // Set up yargs CLI app
20
+ await yargs(hideBin(process.argv))
21
+ .option('log-level', {
22
+ type: 'string',
23
+ description: 'Configures the log-level of nitrogen.',
24
+ default: 'info',
25
+ choices: ['debug', 'info', 'warning', 'error'],
26
+ })
27
+ .middleware((args) => {
28
+ if (!isValidLogLevel(args.logLevel)) {
29
+ throw new Error(`Invalid log-level ("${args.logLevel}")!`)
30
+ }
31
+ setLogLevel(args.logLevel)
32
+ })
33
+ // 🔥 nitrogen [path]
34
+ .command(
35
+ '$0 [basePath]',
36
+ `Usage: ${chalk.bold(`${commandName} <basePath> [options]`)}\n` +
37
+ `Run the nitro code-generator on all ${chalk.underline('**/*.nitro.ts')} files found ` +
38
+ `in the current directory and generate C++, Swift or Kotlin outputs in ${chalk.underline('./nitrogen/generated')}.`,
39
+ (y) =>
40
+ y
41
+ .positional('basePath', {
42
+ type: 'string',
43
+ description: `The base path of where Nitrogen will start looking for ${chalk.underline('**/*.nitro.ts')} specs.`,
44
+ default: process.cwd(),
45
+ })
46
+ .option('out', {
47
+ type: 'string',
48
+ description:
49
+ 'Configures the output path of the generated C++, Swift or Kotlin files.',
50
+ default: './nitrogen/generated',
51
+ })
52
+ .option('config', {
53
+ type: 'string',
54
+ description: `A custom path to a ${chalk.underline('nitro.json')} config file.`,
55
+ default: './nitro.json',
56
+ }),
57
+ async (argv) => {
58
+ const basePath = argv.basePath
59
+ const outputDirectory = argv.out
60
+ await runNitrogenCommand(basePath, outputDirectory)
61
+ }
62
+ )
63
+ // 🔥 nitrogen init <moduleName>
64
+ .command(
65
+ 'init <moduleName>',
66
+ `Usage: ${chalk.bold(`${commandName} init <moduleName> [options]`)}\n` +
67
+ `Create a new Nitro Module.`,
68
+ (y) =>
69
+ y
70
+ .positional('moduleName', {
71
+ type: 'string',
72
+ description: 'The name of the Nitro Module that will be created.',
73
+ demandOption: true,
74
+ })
75
+ .option('path', {
76
+ type: 'string',
77
+ description: `A custom path to create the new Nitro Module in - instead of the current working directory.`,
78
+ default: process.cwd(),
79
+ }),
80
+ async (argv) => {
81
+ await initNewNitroModule(argv.path, argv.moduleName)
82
+ }
83
+ )
84
+ .usage(
85
+ `Usage: ${chalk.bold('$0 [options]')}\n` +
86
+ `$0 is a code-generater for Nitro Modules (${chalk.underline('https://github.com/mrousavy/nitro')})\n` +
87
+ `It converts all TypeScript specs found in ${chalk.underline('**/*.nitro.ts')} to C++, Swift or Kotlin specs.\n` +
88
+ `Each library/module must have a ${chalk.underline('nitro.json')} configuration file in it's root directory.\n` +
89
+ `$Nitrogen Version: ${chalk.bold(NITROGEN_VERSION)}`
90
+ )
91
+ .help()
92
+ .strict()
93
+ .wrap(cliWidth).argv
94
+
95
+ async function runNitrogenCommand(
96
+ baseDirectory: string,
97
+ outputDirectory: string
98
+ ): Promise<void> {
99
+ // 1. Prepare output folders
100
+ const filesBefore = await getFiles(outputDirectory)
101
+
102
+ const start = performance.now()
103
+
104
+ // 2. Run Nitrogen
105
+ const { generatedFiles, generatedSpecsCount, targetSpecsCount } =
106
+ await runNitrogen({
107
+ baseDirectory: baseDirectory,
108
+ outputDirectory: outputDirectory,
109
+ })
110
+
111
+ const end = performance.now()
112
+ const timeS = ((end - start) / 1000).toFixed(1)
113
+ console.log(
114
+ `🎉 Generated ${generatedSpecsCount}/${targetSpecsCount} HybridObject${generatedSpecsCount === 1 ? '' : 's'} in ${timeS}s!`
115
+ )
116
+ console.log(
117
+ `💡 Your code is in ${chalk.underline(prettifyDirectory(outputDirectory))}`
118
+ )
119
+
120
+ // 3. Delete all old dangling files
121
+ const addedFiles = generatedFiles.filter((f) => !filesBefore.includes(f))
122
+ const removedFiles = filesBefore.filter((f) => !generatedFiles.includes(f))
123
+ if (addedFiles.length > 0 || removedFiles.length > 0) {
124
+ let text = ''
125
+ const as = addedFiles.length > 1 ? 's' : ''
126
+ const rs = removedFiles.length > 1 ? 's' : ''
127
+ if (addedFiles.length > 0 && removedFiles.length === 0) {
128
+ text = `Added ${addedFiles.length} file${as}`
129
+ } else if (addedFiles.length === 0 && removedFiles.length > 0) {
130
+ text = `Removed ${removedFiles.length} file${rs}`
131
+ } else {
132
+ text = `Added ${addedFiles.length} file${as} and removed ${removedFiles.length} file${rs}`
133
+ }
134
+
135
+ console.log(
136
+ `‼️ ${text} - ${chalk.bold('you need to run `pod install`/sync gradle to update files!')}`
137
+ )
138
+ }
139
+ const promises = removedFiles.map(async (file) => {
140
+ const stat = await fs.stat(file)
141
+ if (stat.isFile()) {
142
+ await fs.rm(file)
143
+ }
144
+ })
145
+ await Promise.all(promises)
146
+ }
package/src/init.ts ADDED
@@ -0,0 +1,186 @@
1
+ import path from 'path'
2
+ import { prettifyDirectory } from './prettifyDirectory.js'
3
+ import fs from 'fs/promises'
4
+ import { existsSync } from 'fs'
5
+ import { Logger } from './Logger.js'
6
+ import chalk from 'chalk'
7
+ import { execSync } from 'child_process'
8
+ import { randomUUID } from 'crypto'
9
+
10
+ export async function initNewNitroModule(
11
+ baseDirectory: string,
12
+ moduleName: string,
13
+ ref: string = 'main'
14
+ ): Promise<void> {
15
+ Logger.info(
16
+ `⚙️ Creating new Nitro Module "${chalk.bold(moduleName)}" in ${chalk.underline(prettifyDirectory(baseDirectory))}...`
17
+ )
18
+
19
+ const directory = path.join(baseDirectory, moduleName)
20
+ if (existsSync(directory)) {
21
+ Logger.error(
22
+ `❌ A folder named "${chalk.underline(moduleName)}" already exists in the directory ${chalk.underline(prettifyDirectory(baseDirectory))}!`
23
+ )
24
+ process.exit(1)
25
+ }
26
+
27
+ await fs.mkdir(directory)
28
+
29
+ const modulePath = await downloadGitHubFolder(
30
+ 'mrousavy',
31
+ 'nitro',
32
+ ref,
33
+ 'packages/template',
34
+ directory
35
+ )
36
+ Logger.info(`🏗️ Constructing template...`)
37
+
38
+ const cleanLibraryName = moduleName.replace('react-native-', '')
39
+ const cxxNamespace = cleanLibraryName.replaceAll('-', '')
40
+ let camelCaseName = cleanLibraryName
41
+ .split('-')
42
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
43
+ .join('')
44
+ if (!camelCaseName.startsWith('Nitro')) {
45
+ camelCaseName = 'Nitro' + camelCaseName
46
+ }
47
+
48
+ await replaceTemplate(modulePath, `cxxNamespace`, cxxNamespace)
49
+ await replaceTemplate(modulePath, `androidNamespace`, cxxNamespace)
50
+ await replaceTemplate(modulePath, `androidCxxLibName`, camelCaseName)
51
+ await replaceTemplate(modulePath, `iosModuleName`, camelCaseName)
52
+ await replaceTemplate(modulePath, `packageName`, moduleName)
53
+ await replaceTemplate(modulePath, `packageDescription`, moduleName)
54
+
55
+ Logger.info(
56
+ `🎉 Created Nitro Module "${chalk.bold(moduleName)}" in ${chalk.underline(prettifyDirectory(directory))}!`
57
+ )
58
+ Logger.info(
59
+ `👉 To install dependencies, use your package manager of choice (e.g. ${chalk.bold('npm install')})`
60
+ )
61
+ Logger.info(
62
+ `👉 To create your first Hybrid Object, add a ${chalk.underline(`*.nitro.ts`)} file, declare a TypeScript interface that extends ${chalk.bold('HybridObject<...>')}, and run ${chalk.bold('npx nitrogen')}.`
63
+ )
64
+ Logger.info(
65
+ `👉 To test your module in an app, create a new React Native app somewhere (e.g. in ${chalk.underline(`./${moduleName}/example`)}) and add ${chalk.bold(moduleName)} as a local dependency.`
66
+ )
67
+ }
68
+
69
+ async function isGitInstalled(): Promise<boolean> {
70
+ try {
71
+ execSync('git --version')
72
+ return true
73
+ } catch (error) {
74
+ return false
75
+ }
76
+ }
77
+
78
+ async function downloadGitHubFolder(
79
+ owner: string,
80
+ repo: string,
81
+ branch: string,
82
+ folder: string,
83
+ outputPath: string
84
+ ): Promise<string> {
85
+ if (!isGitInstalled()) {
86
+ console.error(
87
+ `❌ ${chalk.bold('git')} is not installed or available in the current path! Make sure to install ${chalk.bold('git')} and try again.`
88
+ )
89
+ process.exit(1)
90
+ }
91
+
92
+ const repoUrl = `https://github.com/${owner}/${repo}`
93
+ Logger.info(`⏳ Cloning ${chalk.underline(repoUrl)}...`)
94
+ const tempPath = randomUUID()
95
+ const tempDir = path.join(outputPath, tempPath)
96
+ execSync(
97
+ `git clone --depth 1 --filter=blob:none -b ${branch} --quiet --sparse ${repoUrl} ${tempDir}`
98
+ )
99
+ const prettyOutputPath = prettifyDirectory(outputPath)
100
+
101
+ const initialDir = process.cwd()
102
+ try {
103
+ process.chdir(tempDir)
104
+
105
+ Logger.debug(`⏳ Checking out ${chalk.underline(folder)}...`)
106
+ execSync(`git sparse-checkout set ${folder}`)
107
+
108
+ Logger.debug(
109
+ `📁 Copying files from ${chalk.underline(`${prettyOutputPath}/${tempPath}`)} to ${chalk.underline(prettyOutputPath)}...`
110
+ )
111
+ const sourcePath = path.join(tempDir, folder)
112
+ await fs.mkdir(outputPath, { recursive: true })
113
+ await copyFolder(sourcePath, outputPath)
114
+
115
+ return outputPath
116
+ } finally {
117
+ // change dir back to original
118
+ process.chdir(initialDir)
119
+
120
+ Logger.debug(
121
+ `🗑️ Removing temporary folder ${chalk.underline(prettifyDirectory(tempDir))}...`
122
+ )
123
+ await fs.rm(tempDir, { recursive: true, force: true })
124
+ }
125
+ }
126
+
127
+ async function copyFolder(src: string, dest: string) {
128
+ const entries = await fs.readdir(src, { withFileTypes: true })
129
+ for (const entry of entries) {
130
+ const srcPath = path.join(src, entry.name)
131
+ const destPath = path.join(dest, entry.name)
132
+ if (entry.isDirectory()) {
133
+ await fs.mkdir(destPath, { recursive: true })
134
+ await copyFolder(srcPath, destPath)
135
+ } else {
136
+ await fs.copyFile(srcPath, destPath)
137
+ }
138
+ }
139
+ }
140
+
141
+ async function replaceTemplate(
142
+ dir: string,
143
+ templateName: string,
144
+ replacementValue: string
145
+ ): Promise<void> {
146
+ const replaceInFile = async (filePath: string) => {
147
+ const content = await fs.readFile(filePath, 'utf8')
148
+ const updatedContent = content.replaceAll(
149
+ `$$${templateName}$$`,
150
+ replacementValue
151
+ )
152
+ if (content !== updatedContent) {
153
+ await fs.writeFile(filePath, updatedContent, 'utf8')
154
+ }
155
+ }
156
+
157
+ const replaceInName = (name: string) => {
158
+ return name.replaceAll(`$$${templateName}$$`, replacementValue)
159
+ }
160
+
161
+ const processDirectory = async (currentDir: string) => {
162
+ const entries = await fs.readdir(currentDir, { withFileTypes: true })
163
+
164
+ for (const entry of entries) {
165
+ const oldPath = path.join(currentDir, entry.name)
166
+ const updatedName = replaceInName(entry.name)
167
+ const newPath = path.join(currentDir, updatedName)
168
+
169
+ if (oldPath !== newPath) {
170
+ await fs.rename(oldPath, newPath)
171
+ }
172
+
173
+ if (entry.isDirectory()) {
174
+ await processDirectory(newPath)
175
+ } else if (entry.isFile()) {
176
+ await replaceInFile(newPath)
177
+ }
178
+ }
179
+ }
180
+
181
+ if (!existsSync(dir)) {
182
+ throw new Error(`The directory "${dir}" does not exist.`)
183
+ }
184
+
185
+ await processDirectory(dir)
186
+ }
@@ -0,0 +1,246 @@
1
+ import { Project } from 'ts-morph'
2
+ import {
3
+ extendsHybridObject,
4
+ isHybridView,
5
+ getHybridObjectPlatforms,
6
+ getHybridViewPlatforms,
7
+ type Platform,
8
+ } from './getPlatformSpecs.js'
9
+ import { generatePlatformFiles } from './createPlatformSpec.js'
10
+ import path from 'path'
11
+ import { prettifyDirectory } from './prettifyDirectory.js'
12
+ import {
13
+ capitalizeName,
14
+ deduplicateFiles,
15
+ errorToString,
16
+ indent,
17
+ NITROGEN_VERSION,
18
+ } from './utils.js'
19
+ import { writeFile } from './writeFile.js'
20
+ import chalk from 'chalk'
21
+ import { groupByPlatform, type SourceFile } from './syntax/SourceFile.js'
22
+ import { Logger } from './Logger.js'
23
+ import { NitroConfig } from './config/NitroConfig.js'
24
+ import { createIOSAutolinking } from './autolinking/createIOSAutolinking.js'
25
+ import { createAndroidAutolinking } from './autolinking/createAndroidAutolinking.js'
26
+ import type { Autolinking } from './autolinking/Autolinking.js'
27
+ import { createGitAttributes } from './createGitAttributes.js'
28
+ import type { PlatformSpec } from 'react-native-nitro-modules'
29
+
30
+ interface NitrogenOptions {
31
+ baseDirectory: string
32
+ outputDirectory: string
33
+ }
34
+
35
+ interface NitrogenResult {
36
+ generatedFiles: string[]
37
+ targetSpecsCount: number
38
+ generatedSpecsCount: number
39
+ }
40
+
41
+ export async function runNitrogen({
42
+ baseDirectory,
43
+ outputDirectory,
44
+ }: NitrogenOptions): Promise<NitrogenResult> {
45
+ let targetSpecs = 0
46
+ let generatedSpecs = 0
47
+
48
+ // Create the TS project
49
+ const project = new Project({
50
+ compilerOptions: {
51
+ strict: true,
52
+ strictNullChecks: true,
53
+ noUncheckedIndexedAccess: true,
54
+ },
55
+ })
56
+
57
+ const ignorePaths = NitroConfig.current.getIgnorePaths()
58
+ const globPattern = [path.join(baseDirectory, '**', '*.nitro.ts')]
59
+ ignorePaths.forEach((ignorePath) => {
60
+ globPattern.push('!' + path.join(baseDirectory, ignorePath))
61
+ })
62
+ project.addSourceFilesAtPaths(globPattern)
63
+
64
+ // Loop through all source files to log them
65
+ Logger.info(
66
+ chalk.reset(
67
+ `🚀 Nitrogen ${chalk.bold(NITROGEN_VERSION)} runs at ${chalk.underline(prettifyDirectory(baseDirectory))}`
68
+ )
69
+ )
70
+ for (const dir of project.getDirectories()) {
71
+ const specs = dir.getSourceFiles().length
72
+ const relativePath = prettifyDirectory(dir.getPath())
73
+ Logger.info(
74
+ ` 🔍 Nitrogen found ${specs} spec${specs === 1 ? '' : 's'} in ${chalk.underline(relativePath)}`
75
+ )
76
+ }
77
+
78
+ // If no source files are found, we can exit
79
+ if (project.getSourceFiles().length === 0) {
80
+ const searchDir = prettifyDirectory(
81
+ path.join(path.resolve(baseDirectory), '**', '*.nitro.ts')
82
+ )
83
+ Logger.error(
84
+ `❌ Nitrogen didn't find any spec files in ${chalk.underline(searchDir)}! ` +
85
+ `To create a Nitro Module, create a TypeScript file with the "${chalk.underline('.nitro.ts')}" suffix ` +
86
+ 'and export an interface that extends HybridObject<T>.'
87
+ )
88
+ process.exit()
89
+ }
90
+
91
+ const usedPlatforms: Platform[] = []
92
+ const filesAfter: string[] = []
93
+ const writtenFiles: SourceFile[] = []
94
+
95
+ for (const sourceFile of project.getSourceFiles()) {
96
+ Logger.info(`⏳ Parsing ${sourceFile.getBaseName()}...`)
97
+
98
+ const startedWithSpecs = generatedSpecs
99
+
100
+ // Find all interfaceDeclarations in the given file
101
+ const declarations = [
102
+ ...sourceFile.getInterfaces(),
103
+ ...sourceFile.getTypeAliases(),
104
+ ]
105
+ for (const declaration of declarations) {
106
+ let typeName = declaration.getName()
107
+ try {
108
+ let platformSpec: PlatformSpec
109
+ if (isHybridView(declaration.getType())) {
110
+ // Hybrid View Props
111
+ const targetPlatforms = getHybridViewPlatforms(declaration)
112
+ if (targetPlatforms == null) {
113
+ // It does not extend HybridView, continue..
114
+ continue
115
+ }
116
+ platformSpec = targetPlatforms
117
+ } else if (extendsHybridObject(declaration.getType(), true)) {
118
+ // Hybrid View
119
+ const targetPlatforms = getHybridObjectPlatforms(declaration)
120
+ if (targetPlatforms == null) {
121
+ // It does not extend HybridObject, continue..
122
+ continue
123
+ }
124
+ platformSpec = targetPlatforms
125
+ } else {
126
+ continue
127
+ }
128
+
129
+ const platforms = Object.keys(platformSpec) as Platform[]
130
+
131
+ if (platforms.length === 0) {
132
+ Logger.warn(
133
+ `⚠️ ${typeName} does not declare any platforms in HybridObject<T> - nothing can be generated.`
134
+ )
135
+ continue
136
+ }
137
+
138
+ targetSpecs++
139
+
140
+ Logger.info(
141
+ ` ⚙️ Generating specs for HybridObject "${chalk.bold(typeName)}"...`
142
+ )
143
+
144
+ // Create all files and throw it into a big list
145
+ let allFiles = platforms.flatMap((p) => {
146
+ usedPlatforms.push(p)
147
+ const language = platformSpec[p]!
148
+ const r = generatePlatformFiles(declaration.getType(), language)
149
+ return r
150
+ })
151
+ allFiles = deduplicateFiles(allFiles)
152
+ // Group the files by platform ({ ios: [], android: [], shared: [] })
153
+ const filesPerPlatform = groupByPlatform(allFiles)
154
+ // Loop through each platform one by one so that it has some kind of order (per-platform)
155
+ for (const [p, files] of Object.entries(filesPerPlatform)) {
156
+ const platform = p as SourceFile['platform']
157
+ const language =
158
+ platform === 'shared' ? 'c++' : platformSpec[platform]
159
+ if (language == null) {
160
+ // if the language was never specified in the spec, skip it
161
+ continue
162
+ }
163
+ if (files.length === 0) {
164
+ // if no files exist on this platform, skip it
165
+ continue
166
+ }
167
+
168
+ Logger.info(
169
+ ` ${chalk.dim(platform)}: Generating ${capitalizeName(language)} code...`
170
+ )
171
+ // Write the actual files for this specific platform.
172
+ for (const file of files) {
173
+ const basePath = path.join(
174
+ outputDirectory,
175
+ file.platform,
176
+ file.language
177
+ )
178
+ const actualPath = await writeFile(basePath, file)
179
+ filesAfter.push(actualPath)
180
+ writtenFiles.push(file)
181
+ }
182
+ }
183
+
184
+ // Done!
185
+ generatedSpecs++
186
+ } catch (error) {
187
+ const message = indent(errorToString(error), ' ')
188
+ Logger.error(
189
+ chalk.redBright(
190
+ ` ❌ Failed to generate spec for ${typeName}! ${message}`
191
+ )
192
+ )
193
+ process.exitCode = 1
194
+ }
195
+ }
196
+
197
+ if (generatedSpecs === startedWithSpecs) {
198
+ Logger.error(
199
+ chalk.redBright(
200
+ ` ❌ No specs found in ${sourceFile.getBaseName()}!`
201
+ )
202
+ )
203
+ }
204
+ }
205
+
206
+ // Autolinking
207
+ Logger.info(`⛓️ Setting up build configs for autolinking...`)
208
+
209
+ const autolinkingFiles: Autolinking[] = []
210
+
211
+ if (usedPlatforms.includes('ios')) {
212
+ autolinkingFiles.push(createIOSAutolinking())
213
+ }
214
+ if (usedPlatforms.includes('android')) {
215
+ autolinkingFiles.push(createAndroidAutolinking(writtenFiles))
216
+ }
217
+
218
+ for (const autolinking of autolinkingFiles) {
219
+ Logger.info(
220
+ ` Creating autolinking build setup for ${chalk.dim(autolinking.platform)}...`
221
+ )
222
+ for (const file of autolinking.sourceFiles) {
223
+ const basePath = path.join(outputDirectory, file.platform)
224
+ const actualPath = await writeFile(
225
+ basePath,
226
+ file as unknown as SourceFile
227
+ )
228
+ filesAfter.push(actualPath)
229
+ }
230
+ }
231
+
232
+ try {
233
+ // write a .gitattributes file
234
+ const markAsGenerated = NitroConfig.current.getGitAttributesGeneratedFlag()
235
+ const file = await createGitAttributes(markAsGenerated, outputDirectory)
236
+ filesAfter.push(file)
237
+ } catch {
238
+ Logger.error(`❌ Failed to write ${chalk.dim(`.gitattributes`)}!`)
239
+ }
240
+
241
+ return {
242
+ generatedFiles: filesAfter,
243
+ targetSpecsCount: targetSpecs,
244
+ generatedSpecsCount: generatedSpecs,
245
+ }
246
+ }
@@ -0,0 +1,32 @@
1
+ import os from 'os'
2
+ import path from 'path'
3
+
4
+ export function prettifyDirectory(directory: string): string {
5
+ let relativePath = path.relative(process.cwd(), path.resolve(directory))
6
+ if (!relativePath.startsWith('.') && relativePath.length > 0) {
7
+ // Make sure all relative paths start with "./something", not just "something"
8
+ relativePath = `./${relativePath}`
9
+ }
10
+
11
+ const home = os.homedir()
12
+ const homeShorthand = os.platform() === 'win32' ? '$HOME' : '~'
13
+ const prettifiedHomeShorthand = directory.startsWith(home)
14
+ ? `${homeShorthand}${directory.slice(home.length)}`
15
+ : directory
16
+
17
+ if (relativePath.length < 1) {
18
+ // If relativePath is ".", we don't want to return it
19
+ return prettifiedHomeShorthand
20
+ }
21
+
22
+ if (
23
+ relativePath.length > 0 &&
24
+ relativePath.length < prettifiedHomeShorthand.length
25
+ ) {
26
+ // If relativePath is shroter than the ~/... home path, we use the relative one.
27
+ return relativePath
28
+ } else {
29
+ // ..otherwise just use the ~/... home relative path.
30
+ return prettifiedHomeShorthand
31
+ }
32
+ }
@@ -0,0 +1,59 @@
1
+ import type { Language } from '../getPlatformSpecs.js'
2
+ import type { SourceFile, SourceImport } from './SourceFile.js'
3
+ import type { Type } from './types/Type.js'
4
+
5
+ export interface BridgedType<
6
+ FromLanguage extends Language,
7
+ ToLanguage extends Language,
8
+ > {
9
+ /**
10
+ * The underlying type that is being bridged between {@linkcode FromLanguage} and {@linkcode ToLanguage}
11
+ */
12
+ readonly type: Type
13
+ /**
14
+ * Whether the underlying type has a valid type (is not void or null)
15
+ */
16
+ readonly hasType: boolean
17
+ /**
18
+ * Whether this type can be passed by reference
19
+ */
20
+ readonly canBePassedByReference: boolean
21
+ /**
22
+ * Whether this bridged type needs special handling, or can just be used as-is
23
+ */
24
+ readonly needsSpecialHandling: boolean
25
+
26
+ /**
27
+ * Get all imports required for this bridge to work
28
+ */
29
+ getRequiredImports(language: Language): SourceImport[]
30
+
31
+ /**
32
+ * Get all extra files that need to be created for this type, as well as the bridge.
33
+ */
34
+ getExtraFiles(): SourceFile[]
35
+
36
+ /**
37
+ * Get the code for the type itself in the given language
38
+ */
39
+ getTypeCode(language: FromLanguage | ToLanguage): string
40
+
41
+ /**
42
+ * Parse the given parameter from the source language to the given target language, in the given language.
43
+ * For example, to convert an ArrayBuffer from Swift ({@linkcode from}) to C++ ({@linkcode to}) we
44
+ * have to wrap it in an ArrayBufferHolder in Swift ({@linkcode inLanguage}), and unwrap
45
+ * it from the ArrayBufferHolder again in C++ ({@linkcode inLanguage})
46
+ */
47
+ parse(
48
+ parameterName: string,
49
+ from: FromLanguage,
50
+ to: ToLanguage,
51
+ inLanguage: FromLanguage | ToLanguage
52
+ ): string
53
+ parse(
54
+ parameterName: string,
55
+ from: ToLanguage,
56
+ to: FromLanguage,
57
+ inLanguage: FromLanguage | ToLanguage
58
+ ): string
59
+ }
@@ -0,0 +1,24 @@
1
+ import type { Language } from '../getPlatformSpecs.js'
2
+ import type { SourceFile, SourceImport } from './SourceFile.js'
3
+
4
+ export interface CodeNode {
5
+ /**
6
+ * Get the code of this code node (e.g. property, method) in the given language.
7
+ */
8
+ getCode(language: Language): string
9
+ /**
10
+ * Get all extra definition files this code node needs (e.g. extra type/struct declarations
11
+ * for complex types), or `[]` if none are required (e.g. if this uses primitive types only)
12
+ *
13
+ * All files returned here must be created in the project.
14
+ * To include them, see {@linkcode getRequiredImports | getRequiredImports()}
15
+ */
16
+ getExtraFiles(): SourceFile[]
17
+ /**
18
+ * Get all required imports this code node needs (e.g. extra type/struct declarations for complex types),
19
+ * or `[]` if no imports are required (e.g. if this uses primitive types only).
20
+ *
21
+ * All imports returned here must be included in the current file (e.g. `#include "..."` or `import ...`)
22
+ */
23
+ getRequiredImports(language: Language): SourceImport[]
24
+ }