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
@@ -0,0 +1,36 @@
1
+ export interface HybridObjectName {
2
+ /**
3
+ * The raw name of the Hybrid Object (same as the TS interface name).
4
+ * @example "Image"
5
+ */
6
+ T: string;
7
+ /**
8
+ * The debug-only description name of the Hybrid Object as it can be described in natively.
9
+ * @example "HybridImage"
10
+ */
11
+ HybridT: string;
12
+ /**
13
+ * The name of the C++ class, Kotlin interface or Swift protocol that represents the
14
+ * specification (all of it's virtual properties and methods) of the Hybrid Object.
15
+ * @example "HybridImageSpec"
16
+ */
17
+ HybridTSpec: string;
18
+ /**
19
+ * The name of the Swift class that bridges any types from
20
+ * {@linkcode HybridTSpec} over to C++.
21
+ * This includes a few type conversions or result/exception wrapping.
22
+ * @example "HybridImage_cxx"
23
+ */
24
+ HybridTSpecCxx: string;
25
+ /**
26
+ * The name of the C++ class that actually bridges to the Java Hybrid Object.
27
+ * @example "JHybridImage"
28
+ */
29
+ JHybridTSpec: string;
30
+ /**
31
+ * The name of the C++ class that extends the Hybrid Object and bridges over to the Swift C++ wrapper class.
32
+ * @example "HybridImageSwift"
33
+ */
34
+ HybridTSpecSwift: string;
35
+ }
36
+ export declare function getHybridObjectName(hybridObjectName: string): HybridObjectName;
@@ -0,0 +1,10 @@
1
+ export function getHybridObjectName(hybridObjectName) {
2
+ return {
3
+ T: hybridObjectName,
4
+ HybridT: `Hybrid${hybridObjectName}`,
5
+ HybridTSpec: `Hybrid${hybridObjectName}Spec`,
6
+ HybridTSpecCxx: `Hybrid${hybridObjectName}Spec_cxx`,
7
+ JHybridTSpec: `JHybrid${hybridObjectName}Spec`,
8
+ HybridTSpecSwift: `Hybrid${hybridObjectName}SpecSwift`,
9
+ };
10
+ }
@@ -0,0 +1,4 @@
1
+ import type { ts, Type } from 'ts-morph';
2
+ import type { NamedType } from './types/Type.js';
3
+ import type { Language } from '../getPlatformSpecs.js';
4
+ export declare function getInterfaceProperties(language: Language, interfaceType: Type<ts.ObjectType>): NamedType[];
@@ -0,0 +1,9 @@
1
+ import { createNamedType } from './createType.js';
2
+ export function getInterfaceProperties(language, interfaceType) {
3
+ return interfaceType.getProperties().map((prop) => {
4
+ const declaration = prop.getValueDeclarationOrThrow();
5
+ const propType = prop.getTypeAtLocation(declaration);
6
+ const refType = createNamedType(language, prop.getName(), propType, prop.isOptional() || propType.isNullable());
7
+ return refType;
8
+ });
9
+ }
@@ -0,0 +1,2 @@
1
+ import type { Type } from './types/Type.js';
2
+ export declare function getReferencedTypes(type: Type): Type[];
@@ -0,0 +1,47 @@
1
+ import { ArrayType } from './types/ArrayType.js';
2
+ import { FunctionType } from './types/FunctionType.js';
3
+ import { getTypeAs } from './types/getTypeAs.js';
4
+ import { OptionalType } from './types/OptionalType.js';
5
+ import { PromiseType } from './types/PromiseType.js';
6
+ import { RecordType } from './types/RecordType.js';
7
+ import { StructType } from './types/StructType.js';
8
+ import { TupleType } from './types/TupleType.js';
9
+ import { VariantType } from './types/VariantType.js';
10
+ export function getReferencedTypes(type) {
11
+ switch (type.kind) {
12
+ case 'array':
13
+ const array = getTypeAs(type, ArrayType);
14
+ return [type, ...getReferencedTypes(array.itemType)];
15
+ case 'function':
16
+ const func = getTypeAs(type, FunctionType);
17
+ return [
18
+ type,
19
+ ...getReferencedTypes(func.returnType),
20
+ ...func.parameters.flatMap((t) => getReferencedTypes(t)),
21
+ ];
22
+ case 'optional':
23
+ const optional = getTypeAs(type, OptionalType);
24
+ return [type, ...getReferencedTypes(optional.wrappingType)];
25
+ case 'promise':
26
+ const promise = getTypeAs(type, PromiseType);
27
+ return [type, ...getReferencedTypes(promise.resultingType)];
28
+ case 'record':
29
+ const record = getTypeAs(type, RecordType);
30
+ return [
31
+ type,
32
+ ...getReferencedTypes(record.keyType),
33
+ ...getReferencedTypes(record.valueType),
34
+ ];
35
+ case 'struct':
36
+ const struct = getTypeAs(type, StructType);
37
+ return [type, ...struct.properties.flatMap((p) => getReferencedTypes(p))];
38
+ case 'tuple':
39
+ const tuple = getTypeAs(type, TupleType);
40
+ return [type, ...tuple.itemTypes.flatMap((t) => getReferencedTypes(t))];
41
+ case 'variant':
42
+ const variant = getTypeAs(type, VariantType);
43
+ return [type, ...variant.variants.flatMap((t) => getReferencedTypes(t))];
44
+ default:
45
+ return [type];
46
+ }
47
+ }
@@ -0,0 +1,13 @@
1
+ import type { SourceFile } from './SourceFile.js';
2
+ import type { Type } from './types/Type.js';
3
+ type Comment = '///' | '#';
4
+ export declare function createFileMetadataString(filename: string, comment?: Comment): string;
5
+ export declare function isFunction(type: Type): boolean;
6
+ export declare function toReferenceType(type: string): `const ${typeof type}&`;
7
+ export declare function escapeCppName(string: string): string;
8
+ export declare function isBooleanPropertyPrefix(name: string): boolean;
9
+ export declare function isNotDuplicate<T>(item: T, index: number, array: T[]): boolean;
10
+ export declare function isCppFile(file: SourceFile): boolean;
11
+ export declare function getRelativeDirectory(file: SourceFile): string;
12
+ export declare function getRelativeDirectoryGenerated(...subpath: string[]): string;
13
+ export {};
@@ -0,0 +1,53 @@
1
+ import path from 'path';
2
+ import { getTypeAs } from './types/getTypeAs.js';
3
+ import { OptionalType } from './types/OptionalType.js';
4
+ export function createFileMetadataString(filename, comment = '///') {
5
+ const now = new Date();
6
+ return `
7
+ ${comment}
8
+ ${comment} ${filename}
9
+ ${comment} This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
10
+ ${comment} https://github.com/mrousavy/nitro
11
+ ${comment} Copyright © ${now.getFullYear()} Marc Rousavy @ Margelo
12
+ ${comment}
13
+ `.trim();
14
+ }
15
+ export function isFunction(type) {
16
+ switch (type.kind) {
17
+ case 'function':
18
+ return true;
19
+ case 'optional': {
20
+ const optional = getTypeAs(type, OptionalType);
21
+ return isFunction(optional.wrappingType);
22
+ }
23
+ default:
24
+ return false;
25
+ }
26
+ }
27
+ export function toReferenceType(type) {
28
+ return `const ${type}&`;
29
+ }
30
+ export function escapeCppName(string) {
31
+ // Replace non-alphanumeric characters with underscores
32
+ let escapedStr = string.replace(/[^a-zA-Z0-9_]/g, '_');
33
+ // Ensure the first character is a letter or underscore
34
+ if (!/^[a-zA-Z_]/.test(escapedStr)) {
35
+ escapedStr = '_' + escapedStr;
36
+ }
37
+ return escapedStr;
38
+ }
39
+ export function isBooleanPropertyPrefix(name) {
40
+ return name.startsWith('is') || name.startsWith('has');
41
+ }
42
+ export function isNotDuplicate(item, index, array) {
43
+ return array.indexOf(item) === index;
44
+ }
45
+ export function isCppFile(file) {
46
+ return file.name.endsWith('cpp') || file.name.endsWith('c');
47
+ }
48
+ export function getRelativeDirectory(file) {
49
+ return path.join('..', 'nitrogen', 'generated', file.platform, file.language, ...file.subdirectory, file.name);
50
+ }
51
+ export function getRelativeDirectoryGenerated(...subpath) {
52
+ return path.join('..', 'nitrogen', 'generated', ...subpath);
53
+ }
@@ -0,0 +1,9 @@
1
+ import { Type as TSMorphType } from 'ts-morph';
2
+ export declare function isPromise(type: TSMorphType): boolean;
3
+ export declare function isRecord(type: TSMorphType): boolean;
4
+ export declare function isArrayBuffer(type: TSMorphType): boolean;
5
+ export declare function isDate(type: TSMorphType): boolean;
6
+ export declare function isMap(type: TSMorphType): boolean;
7
+ export declare function isError(type: TSMorphType): boolean;
8
+ export declare function isCustomType(type: TSMorphType): boolean;
9
+ export declare function isSyncFunction(type: TSMorphType): boolean;
@@ -0,0 +1,47 @@
1
+ import { Type as TSMorphType } from 'ts-morph';
2
+ function isSymbol(type, symbolName) {
3
+ // check the symbol directly
4
+ const symbol = type.getSymbol();
5
+ if (symbol?.getName() === symbolName) {
6
+ return true;
7
+ }
8
+ // loop through the alias symbol alias chain to test each one
9
+ let aliasSymbol = type.getAliasSymbol();
10
+ while (aliasSymbol != null) {
11
+ if (aliasSymbol.getName() === symbolName) {
12
+ return true;
13
+ }
14
+ aliasSymbol = aliasSymbol.getAliasedSymbol();
15
+ }
16
+ // nothing found.
17
+ return false;
18
+ }
19
+ export function isPromise(type) {
20
+ return isSymbol(type, 'Promise');
21
+ }
22
+ export function isRecord(type) {
23
+ return isSymbol(type, 'Record');
24
+ }
25
+ export function isArrayBuffer(type) {
26
+ return isSymbol(type, 'ArrayBuffer');
27
+ }
28
+ export function isDate(type) {
29
+ return isSymbol(type, 'Date');
30
+ }
31
+ export function isMap(type) {
32
+ return isSymbol(type, 'AnyMap');
33
+ }
34
+ export function isError(type) {
35
+ return isSymbol(type, 'Error');
36
+ }
37
+ export function isCustomType(type) {
38
+ return (type.getProperty('__customTypeName') != null &&
39
+ type.getProperty('__customTypeConfig') != null);
40
+ }
41
+ export function isSyncFunction(type) {
42
+ if (type.getCallSignatures().length < 1)
43
+ // not a function.
44
+ return false;
45
+ const syncTag = type.getProperty('__syncTag');
46
+ return syncTag != null;
47
+ }
@@ -0,0 +1,3 @@
1
+ import type { HybridObjectSpec } from '../HybridObjectSpec.js';
2
+ import type { SourceFile } from '../SourceFile.js';
3
+ export declare function createFbjniHybridObject(spec: HybridObjectSpec): SourceFile[];
@@ -0,0 +1,261 @@
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 { Method } from '../Method.js';
8
+ import { addJNINativeRegistration } from './JNINativeRegistrations.js';
9
+ import { KotlinCxxBridgedType } from './KotlinCxxBridgedType.js';
10
+ export function createFbjniHybridObject(spec) {
11
+ const name = getHybridObjectName(spec.name);
12
+ // Because we cache JNI methods as `static` inside our method bodies,
13
+ // we need to re-create the method bodies per inherited class.
14
+ // This way `Child`'s statically cached `someMethod()` JNI reference
15
+ // is not the same as `Base`'s statically cached `someMethod()` JNI reference.
16
+ const properties = [
17
+ ...spec.properties,
18
+ ...spec.baseTypes.flatMap((b) => b.properties),
19
+ ];
20
+ const methods = [...spec.methods, ...spec.baseTypes.flatMap((b) => b.methods)];
21
+ const propertiesDecl = properties
22
+ .map((p) => p.getCode('c++', { override: true }))
23
+ .join('\n');
24
+ const methodsDecl = methods
25
+ .map((p) => p.getCode('c++', { override: true }))
26
+ .join('\n');
27
+ const jniClassDescriptor = spec.config.getAndroidPackage('c++/jni', name.HybridTSpec);
28
+ const cxxNamespace = spec.config.getCxxNamespace('c++');
29
+ const spaces = createIndentation(name.JHybridTSpec.length);
30
+ let cppBase = 'JHybridObject';
31
+ if (spec.baseTypes.length > 0) {
32
+ if (spec.baseTypes.length > 1) {
33
+ throw new Error(`${name.T}: Inheriting from multiple HybridObject bases is not yet supported on Kotlin!`);
34
+ }
35
+ const base = spec.baseTypes[0];
36
+ cppBase = getHybridObjectName(base.name).JHybridTSpec;
37
+ if (base.config.isExternalConfig) {
38
+ // It's an external type we inherit from - we have to prefix the namespace
39
+ cppBase = base.config.getCxxNamespace('c++', cppBase);
40
+ }
41
+ }
42
+ const cppImports = [];
43
+ for (const base of spec.baseTypes) {
44
+ const { JHybridTSpec } = getHybridObjectName(base.name);
45
+ const headerName = base.config.isExternalConfig
46
+ ? `${base.config.getAndroidCxxLibName()}/${JHybridTSpec}.hpp`
47
+ : `${JHybridTSpec}.hpp`;
48
+ cppImports.push({
49
+ language: 'c++',
50
+ name: headerName,
51
+ space: base.config.isExternalConfig ? 'system' : 'user',
52
+ forwardDeclaration: getForwardDeclaration('class', JHybridTSpec, base.config.getCxxNamespace('c++')),
53
+ });
54
+ }
55
+ const cppHeaderCode = `
56
+ ${createFileMetadataString(`${name.HybridTSpec}.hpp`)}
57
+
58
+ #pragma once
59
+
60
+ #include <NitroModules/JHybridObject.hpp>
61
+ #include <fbjni/fbjni.h>
62
+ #include "${name.HybridTSpec}.hpp"
63
+
64
+ ${cppImports
65
+ .map((i) => i.forwardDeclaration)
66
+ .filter((f) => f != null)
67
+ .join('\n')}
68
+ ${cppImports.map((i) => includeHeader(i)).join('\n')}
69
+
70
+ namespace ${cxxNamespace} {
71
+
72
+ using namespace facebook;
73
+
74
+ class ${name.JHybridTSpec}: public jni::HybridClass<${name.JHybridTSpec}, ${cppBase}>,
75
+ ${spaces} public virtual ${name.HybridTSpec} {
76
+ public:
77
+ static auto constexpr kJavaDescriptor = "L${jniClassDescriptor};";
78
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
79
+ static void registerNatives();
80
+
81
+ protected:
82
+ // C++ constructor (called from Java via \`initHybrid()\`)
83
+ explicit ${name.JHybridTSpec}(jni::alias_ref<jhybridobject> jThis) :
84
+ HybridObject(${name.HybridTSpec}::TAG),
85
+ HybridBase(jThis),
86
+ _javaPart(jni::make_global(jThis)) {}
87
+
88
+ public:
89
+ ~${name.JHybridTSpec}() override {
90
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
91
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
92
+ }
93
+
94
+ public:
95
+ size_t getExternalMemorySize() noexcept override;
96
+ void dispose() noexcept override;
97
+
98
+ public:
99
+ inline const jni::global_ref<${name.JHybridTSpec}::javaobject>& getJavaPart() const noexcept {
100
+ return _javaPart;
101
+ }
102
+
103
+ public:
104
+ // Properties
105
+ ${indent(propertiesDecl, ' ')}
106
+
107
+ public:
108
+ // Methods
109
+ ${indent(methodsDecl, ' ')}
110
+
111
+ private:
112
+ friend HybridBase;
113
+ using HybridBase::HybridBase;
114
+ jni::global_ref<${name.JHybridTSpec}::javaobject> _javaPart;
115
+ };
116
+
117
+ } // namespace ${cxxNamespace}
118
+ `.trim();
119
+ // Make sure we register all native JNI methods on app startup
120
+ addJNINativeRegistration({
121
+ namespace: cxxNamespace,
122
+ className: `${name.JHybridTSpec}`,
123
+ import: {
124
+ name: `${name.JHybridTSpec}.hpp`,
125
+ space: 'user',
126
+ language: 'c++',
127
+ },
128
+ });
129
+ const propertiesImpl = properties
130
+ .map((m) => getFbjniPropertyForwardImplementation(spec, m))
131
+ .join('\n');
132
+ const methodsImpl = methods
133
+ .map((m) => getFbjniMethodForwardImplementation(spec, m, m.name))
134
+ .join('\n');
135
+ const allTypes = getAllTypes(spec);
136
+ allTypes.push(...getAllBaseTypes(spec)); // <-- remember, we copy all base methods & properties over too
137
+ const jniImports = allTypes
138
+ .map((t) => new KotlinCxxBridgedType(t))
139
+ .flatMap((t) => t.getRequiredImports('c++'))
140
+ .filter((i) => i != null);
141
+ const cppIncludes = jniImports
142
+ .map((i) => includeHeader(i))
143
+ .filter(isNotDuplicate);
144
+ const cppForwardDeclarations = jniImports
145
+ .map((i) => i.forwardDeclaration)
146
+ .filter((d) => d != null)
147
+ .filter(isNotDuplicate);
148
+ const cppImplCode = `
149
+ ${createFileMetadataString(`${name.JHybridTSpec}.cpp`)}
150
+
151
+ #include "${name.JHybridTSpec}.hpp"
152
+
153
+ ${cppForwardDeclarations.join('\n')}
154
+
155
+ ${cppIncludes.join('\n')}
156
+
157
+ namespace ${cxxNamespace} {
158
+
159
+ jni::local_ref<${name.JHybridTSpec}::jhybriddata> ${name.JHybridTSpec}::initHybrid(jni::alias_ref<jhybridobject> jThis) {
160
+ return makeCxxInstance(jThis);
161
+ }
162
+
163
+ void ${name.JHybridTSpec}::registerNatives() {
164
+ registerHybrid({
165
+ makeNativeMethod("initHybrid", ${name.JHybridTSpec}::initHybrid),
166
+ });
167
+ }
168
+
169
+ size_t ${name.JHybridTSpec}::getExternalMemorySize() noexcept {
170
+ static const auto method = javaClassStatic()->getMethod<jlong()>("getMemorySize");
171
+ return method(_javaPart);
172
+ }
173
+
174
+ void ${name.JHybridTSpec}::dispose() noexcept {
175
+ static const auto method = javaClassStatic()->getMethod<void()>("dispose");
176
+ method(_javaPart);
177
+ }
178
+
179
+ // Properties
180
+ ${indent(propertiesImpl, ' ')}
181
+
182
+ // Methods
183
+ ${indent(methodsImpl, ' ')}
184
+
185
+ } // namespace ${cxxNamespace}
186
+ `.trim();
187
+ const files = [];
188
+ files.push({
189
+ content: cppHeaderCode,
190
+ language: 'c++',
191
+ name: `${name.JHybridTSpec}.hpp`,
192
+ subdirectory: [],
193
+ platform: 'android',
194
+ });
195
+ files.push({
196
+ content: cppImplCode,
197
+ language: 'c++',
198
+ name: `${name.JHybridTSpec}.cpp`,
199
+ subdirectory: [],
200
+ platform: 'android',
201
+ });
202
+ return files;
203
+ }
204
+ function getFbjniMethodForwardImplementation(spec, method, jniMethodName) {
205
+ const name = getHybridObjectName(spec.name);
206
+ const returnJNI = new KotlinCxxBridgedType(method.returnType);
207
+ const requiresBridge = returnJNI.needsSpecialHandling ||
208
+ method.parameters.some((p) => {
209
+ const bridged = new KotlinCxxBridgedType(p.type);
210
+ return bridged.needsSpecialHandling;
211
+ });
212
+ const methodName = requiresBridge ? `${jniMethodName}_cxx` : jniMethodName;
213
+ const returnType = returnJNI.asJniReferenceType('local');
214
+ const paramsTypes = method.parameters
215
+ .map((p) => {
216
+ const bridge = new KotlinCxxBridgedType(p.type);
217
+ return `${bridge.asJniReferenceType('alias')} /* ${p.name} */`;
218
+ })
219
+ .join(', ');
220
+ const cxxSignature = `${returnType}(${paramsTypes})`;
221
+ const paramsForward = method.parameters.map((p) => {
222
+ const bridged = new KotlinCxxBridgedType(p.type);
223
+ return bridged.parse(p.name, 'c++', 'kotlin', 'c++');
224
+ });
225
+ paramsForward.unshift('_javaPart'); // <-- first param is always Java `this`
226
+ let body;
227
+ if (returnJNI.hasType) {
228
+ // return something - we need to parse it
229
+ body = `
230
+ static const auto method = javaClassStatic()->getMethod<${cxxSignature}>("${methodName}");
231
+ auto __result = method(${paramsForward.join(', ')});
232
+ return ${returnJNI.parse('__result', 'kotlin', 'c++', 'c++')};
233
+ `;
234
+ }
235
+ else {
236
+ // void method. no return
237
+ body = `
238
+ static const auto method = javaClassStatic()->getMethod<${cxxSignature}>("${methodName}");
239
+ method(${paramsForward.join(', ')});
240
+ `;
241
+ }
242
+ const code = method.getCode('c++', {
243
+ classDefinitionName: name.JHybridTSpec,
244
+ }, body.trim());
245
+ return code;
246
+ }
247
+ function getFbjniPropertyForwardImplementation(spec, property) {
248
+ const methods = [];
249
+ // getter
250
+ const getter = getFbjniMethodForwardImplementation(spec, property.cppGetter, property.getGetterName('jvm'));
251
+ methods.push(getter);
252
+ if (property.cppSetter != null) {
253
+ // setter
254
+ const setter = getFbjniMethodForwardImplementation(spec, property.cppSetter, property.getSetterName('jvm'));
255
+ methods.push(setter);
256
+ }
257
+ return methods.join('\n');
258
+ }
259
+ function getAllBaseTypes(spec) {
260
+ return spec.baseTypes.flatMap((b) => getAllTypes(b));
261
+ }
@@ -0,0 +1,8 @@
1
+ import type { SourceImport } from '../SourceFile.js';
2
+ export interface JNINativeRegistration {
3
+ namespace: string;
4
+ className: string;
5
+ import: SourceImport;
6
+ }
7
+ export declare function addJNINativeRegistration(registerFunc: JNINativeRegistration): void;
8
+ export declare function getJNINativeRegistrations(): JNINativeRegistration[];
@@ -0,0 +1,7 @@
1
+ const jniNativeRegistrations = [];
2
+ export function addJNINativeRegistration(registerFunc) {
3
+ jniNativeRegistrations.push(registerFunc);
4
+ }
5
+ export function getJNINativeRegistrations() {
6
+ return jniNativeRegistrations;
7
+ }
@@ -0,0 +1,7 @@
1
+ import type { Type } from '../types/Type.js';
2
+ /**
3
+ * Returns a boxed version of the given primitive type.
4
+ * In JNI/Kotlin, primitive types (like `double` or `boolean`)
5
+ * cannot be nullable, so we need to box them - e.g. as `JDouble` or `JBoolean`.
6
+ */
7
+ export declare function getKotlinBoxedPrimitiveType(type: Type): string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Returns a boxed version of the given primitive type.
3
+ * In JNI/Kotlin, primitive types (like `double` or `boolean`)
4
+ * cannot be nullable, so we need to box them - e.g. as `JDouble` or `JBoolean`.
5
+ */
6
+ export function getKotlinBoxedPrimitiveType(type) {
7
+ switch (type.kind) {
8
+ case 'number':
9
+ return 'jni::JDouble';
10
+ case 'boolean':
11
+ return 'jni::JBoolean';
12
+ case 'bigint':
13
+ return 'jni::JLong';
14
+ default:
15
+ throw new Error(`Type ${type.kind} is not a primitive!`);
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ import type { Language } from '../../getPlatformSpecs.js';
2
+ import type { BridgedType } from '../BridgedType.js';
3
+ import type { SourceFile, SourceImport } from '../SourceFile.js';
4
+ import type { Type } from '../types/Type.js';
5
+ export declare class KotlinCxxBridgedType implements BridgedType<'kotlin', 'c++'> {
6
+ readonly type: Type;
7
+ constructor(type: Type);
8
+ get hasType(): boolean;
9
+ get canBePassedByReference(): boolean;
10
+ get needsSpecialHandling(): boolean;
11
+ getRequiredImports(language: Language): SourceImport[];
12
+ getExtraFiles(): SourceFile[];
13
+ asJniReferenceType(referenceType?: 'alias' | 'local' | 'global'): string;
14
+ getTypeCode(language: 'kotlin' | 'c++', isBoxed?: boolean): string;
15
+ parse(parameterName: string, from: 'c++' | 'kotlin', to: 'kotlin' | 'c++', inLanguage: 'kotlin' | 'c++'): string;
16
+ parseFromCppToKotlin(parameterName: string, language: 'kotlin' | 'c++', isBoxed?: boolean): string;
17
+ parseFromKotlinToCpp(parameterName: string, language: 'kotlin' | 'c++', isBoxed?: boolean): string;
18
+ private getFullJHybridObjectName;
19
+ }