nitrogen 0.2.24 → 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 -347
  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
@@ -0,0 +1,60 @@
1
+ import { Type as TSMorphType } from 'ts-morph'
2
+
3
+ function isSymbol(type: TSMorphType, symbolName: string): boolean {
4
+ // check the symbol directly
5
+ const symbol = type.getSymbol()
6
+ if (symbol?.getName() === symbolName) {
7
+ return true
8
+ }
9
+
10
+ // loop through the alias symbol alias chain to test each one
11
+ let aliasSymbol = type.getAliasSymbol()
12
+ while (aliasSymbol != null) {
13
+ if (aliasSymbol.getName() === symbolName) {
14
+ return true
15
+ }
16
+ aliasSymbol = aliasSymbol.getAliasedSymbol()
17
+ }
18
+
19
+ // nothing found.
20
+ return false
21
+ }
22
+
23
+ export function isPromise(type: TSMorphType): boolean {
24
+ return isSymbol(type, 'Promise')
25
+ }
26
+
27
+ export function isRecord(type: TSMorphType): boolean {
28
+ return isSymbol(type, 'Record')
29
+ }
30
+
31
+ export function isArrayBuffer(type: TSMorphType): boolean {
32
+ return isSymbol(type, 'ArrayBuffer')
33
+ }
34
+
35
+ export function isDate(type: TSMorphType): boolean {
36
+ return isSymbol(type, 'Date')
37
+ }
38
+
39
+ export function isMap(type: TSMorphType): boolean {
40
+ return isSymbol(type, 'AnyMap')
41
+ }
42
+
43
+ export function isError(type: TSMorphType): boolean {
44
+ return isSymbol(type, 'Error')
45
+ }
46
+
47
+ export function isCustomType(type: TSMorphType): boolean {
48
+ return (
49
+ type.getProperty('__customTypeName') != null &&
50
+ type.getProperty('__customTypeConfig') != null
51
+ )
52
+ }
53
+
54
+ export function isSyncFunction(type: TSMorphType): boolean {
55
+ if (type.getCallSignatures().length < 1)
56
+ // not a function.
57
+ return false
58
+ const syncTag = type.getProperty('__syncTag')
59
+ return syncTag != null
60
+ }
@@ -0,0 +1,313 @@
1
+ import { createIndentation, indent } from '../../utils.js'
2
+ import { getForwardDeclaration } from '../c++/getForwardDeclaration.js'
3
+ import { includeHeader } from '../c++/includeNitroHeader.js'
4
+ import { getAllTypes } from '../getAllTypes.js'
5
+ import { getHybridObjectName } from '../getHybridObjectName.js'
6
+ import { createFileMetadataString, isNotDuplicate } from '../helpers.js'
7
+ import type { HybridObjectSpec } from '../HybridObjectSpec.js'
8
+ import { Method } from '../Method.js'
9
+ import type { Property } from '../Property.js'
10
+ import type { SourceFile, SourceImport } from '../SourceFile.js'
11
+ import type { Type } from '../types/Type.js'
12
+ import { addJNINativeRegistration } from './JNINativeRegistrations.js'
13
+ import { KotlinCxxBridgedType } from './KotlinCxxBridgedType.js'
14
+
15
+ export function createFbjniHybridObject(spec: HybridObjectSpec): SourceFile[] {
16
+ const name = getHybridObjectName(spec.name)
17
+
18
+ // Because we cache JNI methods as `static` inside our method bodies,
19
+ // we need to re-create the method bodies per inherited class.
20
+ // This way `Child`'s statically cached `someMethod()` JNI reference
21
+ // is not the same as `Base`'s statically cached `someMethod()` JNI reference.
22
+ const properties = [
23
+ ...spec.properties,
24
+ ...spec.baseTypes.flatMap((b) => b.properties),
25
+ ]
26
+ const methods = [...spec.methods, ...spec.baseTypes.flatMap((b) => b.methods)]
27
+
28
+ const propertiesDecl = properties
29
+ .map((p) => p.getCode('c++', { override: true }))
30
+ .join('\n')
31
+ const methodsDecl = methods
32
+ .map((p) => p.getCode('c++', { override: true }))
33
+ .join('\n')
34
+ const jniClassDescriptor = spec.config.getAndroidPackage(
35
+ 'c++/jni',
36
+ name.HybridTSpec
37
+ )
38
+ const cxxNamespace = spec.config.getCxxNamespace('c++')
39
+ const spaces = createIndentation(name.JHybridTSpec.length)
40
+
41
+ let cppBase = 'JHybridObject'
42
+ if (spec.baseTypes.length > 0) {
43
+ if (spec.baseTypes.length > 1) {
44
+ throw new Error(
45
+ `${name.T}: Inheriting from multiple HybridObject bases is not yet supported on Kotlin!`
46
+ )
47
+ }
48
+ const base = spec.baseTypes[0]!
49
+ cppBase = getHybridObjectName(base.name).JHybridTSpec
50
+ if (base.config.isExternalConfig) {
51
+ // It's an external type we inherit from - we have to prefix the namespace
52
+ cppBase = base.config.getCxxNamespace('c++', cppBase)
53
+ }
54
+ }
55
+ const cppImports: SourceImport[] = []
56
+ for (const base of spec.baseTypes) {
57
+ const { JHybridTSpec } = getHybridObjectName(base.name)
58
+
59
+ const headerName = base.config.isExternalConfig
60
+ ? `${base.config.getAndroidCxxLibName()}/${JHybridTSpec}.hpp`
61
+ : `${JHybridTSpec}.hpp`
62
+ cppImports.push({
63
+ language: 'c++',
64
+ name: headerName,
65
+ space: base.config.isExternalConfig ? 'system' : 'user',
66
+ forwardDeclaration: getForwardDeclaration(
67
+ 'class',
68
+ JHybridTSpec,
69
+ base.config.getCxxNamespace('c++')
70
+ ),
71
+ })
72
+ }
73
+
74
+ const cppHeaderCode = `
75
+ ${createFileMetadataString(`${name.HybridTSpec}.hpp`)}
76
+
77
+ #pragma once
78
+
79
+ #include <NitroModules/JHybridObject.hpp>
80
+ #include <fbjni/fbjni.h>
81
+ #include "${name.HybridTSpec}.hpp"
82
+
83
+ ${cppImports
84
+ .map((i) => i.forwardDeclaration)
85
+ .filter((f) => f != null)
86
+ .join('\n')}
87
+ ${cppImports.map((i) => includeHeader(i)).join('\n')}
88
+
89
+ namespace ${cxxNamespace} {
90
+
91
+ using namespace facebook;
92
+
93
+ class ${name.JHybridTSpec}: public jni::HybridClass<${name.JHybridTSpec}, ${cppBase}>,
94
+ ${spaces} public virtual ${name.HybridTSpec} {
95
+ public:
96
+ static auto constexpr kJavaDescriptor = "L${jniClassDescriptor};";
97
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
98
+ static void registerNatives();
99
+
100
+ protected:
101
+ // C++ constructor (called from Java via \`initHybrid()\`)
102
+ explicit ${name.JHybridTSpec}(jni::alias_ref<jhybridobject> jThis) :
103
+ HybridObject(${name.HybridTSpec}::TAG),
104
+ HybridBase(jThis),
105
+ _javaPart(jni::make_global(jThis)) {}
106
+
107
+ public:
108
+ ~${name.JHybridTSpec}() override {
109
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
110
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
111
+ }
112
+
113
+ public:
114
+ size_t getExternalMemorySize() noexcept override;
115
+ void dispose() noexcept override;
116
+
117
+ public:
118
+ inline const jni::global_ref<${name.JHybridTSpec}::javaobject>& getJavaPart() const noexcept {
119
+ return _javaPart;
120
+ }
121
+
122
+ public:
123
+ // Properties
124
+ ${indent(propertiesDecl, ' ')}
125
+
126
+ public:
127
+ // Methods
128
+ ${indent(methodsDecl, ' ')}
129
+
130
+ private:
131
+ friend HybridBase;
132
+ using HybridBase::HybridBase;
133
+ jni::global_ref<${name.JHybridTSpec}::javaobject> _javaPart;
134
+ };
135
+
136
+ } // namespace ${cxxNamespace}
137
+ `.trim()
138
+
139
+ // Make sure we register all native JNI methods on app startup
140
+ addJNINativeRegistration({
141
+ namespace: cxxNamespace,
142
+ className: `${name.JHybridTSpec}`,
143
+ import: {
144
+ name: `${name.JHybridTSpec}.hpp`,
145
+ space: 'user',
146
+ language: 'c++',
147
+ },
148
+ })
149
+
150
+ const propertiesImpl = properties
151
+ .map((m) => getFbjniPropertyForwardImplementation(spec, m))
152
+ .join('\n')
153
+ const methodsImpl = methods
154
+ .map((m) => getFbjniMethodForwardImplementation(spec, m, m.name))
155
+ .join('\n')
156
+ const allTypes = getAllTypes(spec)
157
+ allTypes.push(...getAllBaseTypes(spec)) // <-- remember, we copy all base methods & properties over too
158
+ const jniImports = allTypes
159
+ .map((t) => new KotlinCxxBridgedType(t))
160
+ .flatMap((t) => t.getRequiredImports('c++'))
161
+ .filter((i) => i != null)
162
+ const cppIncludes = jniImports
163
+ .map((i) => includeHeader(i))
164
+ .filter(isNotDuplicate)
165
+ const cppForwardDeclarations = jniImports
166
+ .map((i) => i.forwardDeclaration)
167
+ .filter((d) => d != null)
168
+ .filter(isNotDuplicate)
169
+
170
+ const cppImplCode = `
171
+ ${createFileMetadataString(`${name.JHybridTSpec}.cpp`)}
172
+
173
+ #include "${name.JHybridTSpec}.hpp"
174
+
175
+ ${cppForwardDeclarations.join('\n')}
176
+
177
+ ${cppIncludes.join('\n')}
178
+
179
+ namespace ${cxxNamespace} {
180
+
181
+ jni::local_ref<${name.JHybridTSpec}::jhybriddata> ${name.JHybridTSpec}::initHybrid(jni::alias_ref<jhybridobject> jThis) {
182
+ return makeCxxInstance(jThis);
183
+ }
184
+
185
+ void ${name.JHybridTSpec}::registerNatives() {
186
+ registerHybrid({
187
+ makeNativeMethod("initHybrid", ${name.JHybridTSpec}::initHybrid),
188
+ });
189
+ }
190
+
191
+ size_t ${name.JHybridTSpec}::getExternalMemorySize() noexcept {
192
+ static const auto method = javaClassStatic()->getMethod<jlong()>("getMemorySize");
193
+ return method(_javaPart);
194
+ }
195
+
196
+ void ${name.JHybridTSpec}::dispose() noexcept {
197
+ static const auto method = javaClassStatic()->getMethod<void()>("dispose");
198
+ method(_javaPart);
199
+ }
200
+
201
+ // Properties
202
+ ${indent(propertiesImpl, ' ')}
203
+
204
+ // Methods
205
+ ${indent(methodsImpl, ' ')}
206
+
207
+ } // namespace ${cxxNamespace}
208
+ `.trim()
209
+
210
+ const files: SourceFile[] = []
211
+ files.push({
212
+ content: cppHeaderCode,
213
+ language: 'c++',
214
+ name: `${name.JHybridTSpec}.hpp`,
215
+ subdirectory: [],
216
+ platform: 'android',
217
+ })
218
+ files.push({
219
+ content: cppImplCode,
220
+ language: 'c++',
221
+ name: `${name.JHybridTSpec}.cpp`,
222
+ subdirectory: [],
223
+ platform: 'android',
224
+ })
225
+ return files
226
+ }
227
+
228
+ function getFbjniMethodForwardImplementation(
229
+ spec: HybridObjectSpec,
230
+ method: Method,
231
+ jniMethodName: string
232
+ ): string {
233
+ const name = getHybridObjectName(spec.name)
234
+
235
+ const returnJNI = new KotlinCxxBridgedType(method.returnType)
236
+ const requiresBridge =
237
+ returnJNI.needsSpecialHandling ||
238
+ method.parameters.some((p) => {
239
+ const bridged = new KotlinCxxBridgedType(p.type)
240
+ return bridged.needsSpecialHandling
241
+ })
242
+ const methodName = requiresBridge ? `${jniMethodName}_cxx` : jniMethodName
243
+
244
+ const returnType = returnJNI.asJniReferenceType('local')
245
+ const paramsTypes = method.parameters
246
+ .map((p) => {
247
+ const bridge = new KotlinCxxBridgedType(p.type)
248
+ return `${bridge.asJniReferenceType('alias')} /* ${p.name} */`
249
+ })
250
+ .join(', ')
251
+ const cxxSignature = `${returnType}(${paramsTypes})`
252
+
253
+ const paramsForward = method.parameters.map((p) => {
254
+ const bridged = new KotlinCxxBridgedType(p.type)
255
+ return bridged.parse(p.name, 'c++', 'kotlin', 'c++')
256
+ })
257
+ paramsForward.unshift('_javaPart') // <-- first param is always Java `this`
258
+
259
+ let body: string
260
+ if (returnJNI.hasType) {
261
+ // return something - we need to parse it
262
+ body = `
263
+ static const auto method = javaClassStatic()->getMethod<${cxxSignature}>("${methodName}");
264
+ auto __result = method(${paramsForward.join(', ')});
265
+ return ${returnJNI.parse('__result', 'kotlin', 'c++', 'c++')};
266
+ `
267
+ } else {
268
+ // void method. no return
269
+ body = `
270
+ static const auto method = javaClassStatic()->getMethod<${cxxSignature}>("${methodName}");
271
+ method(${paramsForward.join(', ')});
272
+ `
273
+ }
274
+ const code = method.getCode(
275
+ 'c++',
276
+ {
277
+ classDefinitionName: name.JHybridTSpec,
278
+ },
279
+ body.trim()
280
+ )
281
+ return code
282
+ }
283
+
284
+ function getFbjniPropertyForwardImplementation(
285
+ spec: HybridObjectSpec,
286
+ property: Property
287
+ ): string {
288
+ const methods: string[] = []
289
+
290
+ // getter
291
+ const getter = getFbjniMethodForwardImplementation(
292
+ spec,
293
+ property.cppGetter,
294
+ property.getGetterName('jvm')
295
+ )
296
+ methods.push(getter)
297
+
298
+ if (property.cppSetter != null) {
299
+ // setter
300
+ const setter = getFbjniMethodForwardImplementation(
301
+ spec,
302
+ property.cppSetter,
303
+ property.getSetterName('jvm')
304
+ )
305
+ methods.push(setter)
306
+ }
307
+
308
+ return methods.join('\n')
309
+ }
310
+
311
+ function getAllBaseTypes(spec: HybridObjectSpec): Type[] {
312
+ return spec.baseTypes.flatMap((b) => getAllTypes(b))
313
+ }
@@ -0,0 +1,19 @@
1
+ import type { SourceImport } from '../SourceFile.js'
2
+
3
+ export interface JNINativeRegistration {
4
+ namespace: string
5
+ className: string
6
+ import: SourceImport
7
+ }
8
+
9
+ const jniNativeRegistrations: JNINativeRegistration[] = []
10
+
11
+ export function addJNINativeRegistration(
12
+ registerFunc: JNINativeRegistration
13
+ ): void {
14
+ jniNativeRegistrations.push(registerFunc)
15
+ }
16
+
17
+ export function getJNINativeRegistrations(): JNINativeRegistration[] {
18
+ return jniNativeRegistrations
19
+ }
@@ -0,0 +1,19 @@
1
+ import type { Type } from '../types/Type.js'
2
+
3
+ /**
4
+ * Returns a boxed version of the given primitive type.
5
+ * In JNI/Kotlin, primitive types (like `double` or `boolean`)
6
+ * cannot be nullable, so we need to box them - e.g. as `JDouble` or `JBoolean`.
7
+ */
8
+ export function getKotlinBoxedPrimitiveType(type: Type): string {
9
+ switch (type.kind) {
10
+ case 'number':
11
+ return 'jni::JDouble'
12
+ case 'boolean':
13
+ return 'jni::JBoolean'
14
+ case 'bigint':
15
+ return 'jni::JLong'
16
+ default:
17
+ throw new Error(`Type ${type.kind} is not a primitive!`)
18
+ }
19
+ }