@symbiote-native/cli 0.0.1

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 (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +492 -0
  3. package/bundle.js +2833 -0
  4. package/package.json +49 -0
  5. package/src/index.ts +70 -0
  6. package/templates/README.md +93 -0
  7. package/templates/js/angular/.prettierrc.js +5 -0
  8. package/templates/js/angular/.watchmanconfig +1 -0
  9. package/templates/js/angular/README.md +117 -0
  10. package/templates/js/angular/app.json +4 -0
  11. package/templates/js/angular/babel.config.js +34 -0
  12. package/templates/js/angular/index.js +12 -0
  13. package/templates/js/angular/metro.config.js +38 -0
  14. package/templates/js/angular/package.json.fragment.json +29 -0
  15. package/templates/js/angular/src/App.css +89 -0
  16. package/templates/js/angular/src/App.ts +40 -0
  17. package/templates/js/angular/src/assets/angular-logo.png +0 -0
  18. package/templates/js/angular/src/assets/angular-logo@2x.png +0 -0
  19. package/templates/js/angular/src/assets/angular-logo@3x.png +0 -0
  20. package/templates/js/angular/src/assets/plus-icon.png +0 -0
  21. package/templates/js/angular/src/assets/plus-icon@2x.png +0 -0
  22. package/templates/js/angular/src/assets/plus-icon@3x.png +0 -0
  23. package/templates/js/angular/src/assets/react-native-logo.png +0 -0
  24. package/templates/js/angular/src/assets/react-native-logo@2x.png +0 -0
  25. package/templates/js/angular/src/assets/react-native-logo@3x.png +0 -0
  26. package/templates/js/angular/src/css.d.ts +23 -0
  27. package/templates/js/angular/tsconfig.angular.json +42 -0
  28. package/templates/js/angular/tsconfig.json +17 -0
  29. package/templates/js/react/.prettierrc.js +5 -0
  30. package/templates/js/react/.watchmanconfig +1 -0
  31. package/templates/js/react/App.css +69 -0
  32. package/templates/js/react/App.jsx +27 -0
  33. package/templates/js/react/App.tsx +27 -0
  34. package/templates/js/react/README.md +116 -0
  35. package/templates/js/react/app.json +4 -0
  36. package/templates/js/react/assets/react-native-logo.png +0 -0
  37. package/templates/js/react/assets/react-native-logo@2x.png +0 -0
  38. package/templates/js/react/assets/react-native-logo@3x.png +0 -0
  39. package/templates/js/react/babel.config.js +24 -0
  40. package/templates/js/react/css.d.ts +24 -0
  41. package/templates/js/react/index.js +14 -0
  42. package/templates/js/react/metro.config.js +29 -0
  43. package/templates/js/react/package.json.fragment.json +22 -0
  44. package/templates/js/react/package.json.fragment.typescript.json +11 -0
  45. package/templates/js/react/tsconfig.json +18 -0
  46. package/templates/js/solid/.prettierrc.js +5 -0
  47. package/templates/js/solid/.watchmanconfig +1 -0
  48. package/templates/js/solid/App.css +89 -0
  49. package/templates/js/solid/App.jsx +35 -0
  50. package/templates/js/solid/App.tsx +35 -0
  51. package/templates/js/solid/README.md +18 -0
  52. package/templates/js/solid/app.json +4 -0
  53. package/templates/js/solid/assets/plus-icon.png +0 -0
  54. package/templates/js/solid/assets/plus-icon@2x.png +0 -0
  55. package/templates/js/solid/assets/plus-icon@3x.png +0 -0
  56. package/templates/js/solid/assets/react-native-logo.png +0 -0
  57. package/templates/js/solid/assets/react-native-logo@2x.png +0 -0
  58. package/templates/js/solid/assets/react-native-logo@3x.png +0 -0
  59. package/templates/js/solid/assets/solid-logo.png +0 -0
  60. package/templates/js/solid/assets/solid-logo@2x.png +0 -0
  61. package/templates/js/solid/assets/solid-logo@3x.png +0 -0
  62. package/templates/js/solid/babel.config.js +29 -0
  63. package/templates/js/solid/css.d.ts +20 -0
  64. package/templates/js/solid/eslint.config.js +3 -0
  65. package/templates/js/solid/index.js +13 -0
  66. package/templates/js/solid/metro.config.js +50 -0
  67. package/templates/js/solid/package.json.fragment.json +23 -0
  68. package/templates/js/solid/package.json.fragment.typescript.json +11 -0
  69. package/templates/js/solid/tsconfig.json +11 -0
  70. package/templates/js/svelte/.prettierrc.js +15 -0
  71. package/templates/js/svelte/.watchmanconfig +1 -0
  72. package/templates/js/svelte/App.svelte +123 -0
  73. package/templates/js/svelte/App.typescript.svelte +123 -0
  74. package/templates/js/svelte/README.md +18 -0
  75. package/templates/js/svelte/app.json +4 -0
  76. package/templates/js/svelte/babel.config.js +22 -0
  77. package/templates/js/svelte/css.d.ts +21 -0
  78. package/templates/js/svelte/eslint.config.js +37 -0
  79. package/templates/js/svelte/image-uris.js +8 -0
  80. package/templates/js/svelte/index.js +13 -0
  81. package/templates/js/svelte/metro.config.js +83 -0
  82. package/templates/js/svelte/package.json.fragment.json +26 -0
  83. package/templates/js/svelte/package.json.fragment.typescript.json +12 -0
  84. package/templates/js/svelte/svelte.config.js +47 -0
  85. package/templates/js/svelte/tsconfig.json +9 -0
  86. package/templates/js/svelte/tsconfig.typecheck.json +4 -0
  87. package/templates/js/vue-sfc/.prettierrc.js +5 -0
  88. package/templates/js/vue-sfc/.watchmanconfig +1 -0
  89. package/templates/js/vue-sfc/App.typescript.vue +128 -0
  90. package/templates/js/vue-sfc/App.vue +128 -0
  91. package/templates/js/vue-sfc/README.md +124 -0
  92. package/templates/js/vue-sfc/app.json +4 -0
  93. package/templates/js/vue-sfc/assets/plus-icon.png +0 -0
  94. package/templates/js/vue-sfc/assets/plus-icon@2x.png +0 -0
  95. package/templates/js/vue-sfc/assets/plus-icon@3x.png +0 -0
  96. package/templates/js/vue-sfc/assets/react-native-logo.png +0 -0
  97. package/templates/js/vue-sfc/assets/react-native-logo@2x.png +0 -0
  98. package/templates/js/vue-sfc/assets/react-native-logo@3x.png +0 -0
  99. package/templates/js/vue-sfc/assets/vue-logo.png +0 -0
  100. package/templates/js/vue-sfc/assets/vue-logo@2x.png +0 -0
  101. package/templates/js/vue-sfc/assets/vue-logo@3x.png +0 -0
  102. package/templates/js/vue-sfc/babel.config.js +24 -0
  103. package/templates/js/vue-sfc/css.d.ts +24 -0
  104. package/templates/js/vue-sfc/eslint.config.js +48 -0
  105. package/templates/js/vue-sfc/index.js +13 -0
  106. package/templates/js/vue-sfc/metro.config.js +30 -0
  107. package/templates/js/vue-sfc/package.json.fragment.json +26 -0
  108. package/templates/js/vue-sfc/package.json.fragment.typescript.json +11 -0
  109. package/templates/js/vue-sfc/tsconfig.json +18 -0
  110. package/templates/js/vue-sfc/tsconfig.typecheck.json +8 -0
  111. package/templates/js/vue-sfc/vue-runtime-core.d.ts +3 -0
  112. package/templates/js/vue-tsx/.prettierrc.js +5 -0
  113. package/templates/js/vue-tsx/.watchmanconfig +1 -0
  114. package/templates/js/vue-tsx/App.css +89 -0
  115. package/templates/js/vue-tsx/App.jsx +40 -0
  116. package/templates/js/vue-tsx/App.tsx +40 -0
  117. package/templates/js/vue-tsx/README.md +110 -0
  118. package/templates/js/vue-tsx/app.json +4 -0
  119. package/templates/js/vue-tsx/assets/plus-icon.png +0 -0
  120. package/templates/js/vue-tsx/assets/plus-icon@2x.png +0 -0
  121. package/templates/js/vue-tsx/assets/plus-icon@3x.png +0 -0
  122. package/templates/js/vue-tsx/assets/react-native-logo.png +0 -0
  123. package/templates/js/vue-tsx/assets/react-native-logo@2x.png +0 -0
  124. package/templates/js/vue-tsx/assets/react-native-logo@3x.png +0 -0
  125. package/templates/js/vue-tsx/assets/vue-logo.png +0 -0
  126. package/templates/js/vue-tsx/assets/vue-logo@2x.png +0 -0
  127. package/templates/js/vue-tsx/assets/vue-logo@3x.png +0 -0
  128. package/templates/js/vue-tsx/babel.config.js +67 -0
  129. package/templates/js/vue-tsx/css.d.ts +24 -0
  130. package/templates/js/vue-tsx/index.js +14 -0
  131. package/templates/js/vue-tsx/metro.config.js +42 -0
  132. package/templates/js/vue-tsx/package.json.fragment.json +26 -0
  133. package/templates/js/vue-tsx/package.json.fragment.typescript.json +11 -0
  134. package/templates/js/vue-tsx/tsconfig.json +15 -0
  135. package/templates/js/vue-tsx/tsconfig.typecheck.json +10 -0
  136. package/templates/js/vue-tsx/vue-jsx.d.ts +43 -0
  137. package/templates/js/vue-tsx/vue-runtime-core.d.ts +3 -0
  138. package/templates/layers/README.md +90 -0
  139. package/templates/layers/application/package.json.fragment.json +5 -0
  140. package/templates/layers/battery/package.json.fragment.json +5 -0
  141. package/templates/layers/brightness/package.json.fragment.json +5 -0
  142. package/templates/layers/cellular/package.json.fragment.json +5 -0
  143. package/templates/layers/clipboard/package.json.fragment.json +5 -0
  144. package/templates/layers/crypto/package.json.fragment.json +5 -0
  145. package/templates/layers/device/package.json.fragment.json +5 -0
  146. package/templates/layers/expo-modules/ios/Canary/Info.plist +66 -0
  147. package/templates/layers/expo-modules/package.json.fragment.json +9 -0
  148. package/templates/layers/haptics/package.json.fragment.json +5 -0
  149. package/templates/layers/keep-awake/package.json.fragment.json +5 -0
  150. package/templates/layers/local-auth/package.json.fragment.json +5 -0
  151. package/templates/layers/localization/package.json.fragment.json +5 -0
  152. package/templates/layers/navigation/app/angular/assets/angular-logo.png +0 -0
  153. package/templates/layers/navigation/app/angular/assets/angular-logo@2x.png +0 -0
  154. package/templates/layers/navigation/app/angular/assets/angular-logo@3x.png +0 -0
  155. package/templates/layers/navigation/app/angular/assets/plus-icon.png +0 -0
  156. package/templates/layers/navigation/app/angular/assets/plus-icon@2x.png +0 -0
  157. package/templates/layers/navigation/app/angular/assets/plus-icon@3x.png +0 -0
  158. package/templates/layers/navigation/app/angular/assets/react-native-logo.png +0 -0
  159. package/templates/layers/navigation/app/angular/assets/react-native-logo@2x.png +0 -0
  160. package/templates/layers/navigation/app/angular/assets/react-native-logo@3x.png +0 -0
  161. package/templates/layers/navigation/app/angular/src/App.css +129 -0
  162. package/templates/layers/navigation/app/angular/src/App.ts +31 -0
  163. package/templates/layers/navigation/app/angular/src/DetailsScreen.ts +24 -0
  164. package/templates/layers/navigation/app/angular/src/MenuScreen.ts +43 -0
  165. package/templates/layers/navigation/app/react/App.css +109 -0
  166. package/templates/layers/navigation/app/react/App.jsx +77 -0
  167. package/templates/layers/navigation/app/react/App.tsx +77 -0
  168. package/templates/layers/navigation/app/react/assets/react-native-logo.png +0 -0
  169. package/templates/layers/navigation/app/react/assets/react-native-logo@2x.png +0 -0
  170. package/templates/layers/navigation/app/react/assets/react-native-logo@3x.png +0 -0
  171. package/templates/layers/navigation/app/solid/App.css +129 -0
  172. package/templates/layers/navigation/app/solid/App.jsx +85 -0
  173. package/templates/layers/navigation/app/solid/App.tsx +85 -0
  174. package/templates/layers/navigation/app/solid/assets/plus-icon.png +0 -0
  175. package/templates/layers/navigation/app/solid/assets/plus-icon@2x.png +0 -0
  176. package/templates/layers/navigation/app/solid/assets/plus-icon@3x.png +0 -0
  177. package/templates/layers/navigation/app/solid/assets/react-native-logo.png +0 -0
  178. package/templates/layers/navigation/app/solid/assets/react-native-logo@2x.png +0 -0
  179. package/templates/layers/navigation/app/solid/assets/react-native-logo@3x.png +0 -0
  180. package/templates/layers/navigation/app/solid/assets/solid-logo.png +0 -0
  181. package/templates/layers/navigation/app/solid/assets/solid-logo@2x.png +0 -0
  182. package/templates/layers/navigation/app/solid/assets/solid-logo@3x.png +0 -0
  183. package/templates/layers/navigation/app/svelte/App.css +129 -0
  184. package/templates/layers/navigation/app/svelte/App.svelte +19 -0
  185. package/templates/layers/navigation/app/svelte/App.typescript.svelte +19 -0
  186. package/templates/layers/navigation/app/svelte/DetailsScreen.svelte +17 -0
  187. package/templates/layers/navigation/app/svelte/DetailsScreen.typescript.svelte +17 -0
  188. package/templates/layers/navigation/app/svelte/MenuScreen.svelte +40 -0
  189. package/templates/layers/navigation/app/svelte/MenuScreen.typescript.svelte +40 -0
  190. package/templates/layers/navigation/app/svelte/image-uris.js +8 -0
  191. package/templates/layers/navigation/app/vue-sfc/App.css +129 -0
  192. package/templates/layers/navigation/app/vue-sfc/App.typescript.vue +36 -0
  193. package/templates/layers/navigation/app/vue-sfc/App.vue +36 -0
  194. package/templates/layers/navigation/app/vue-sfc/DetailsScreen.typescript.vue +20 -0
  195. package/templates/layers/navigation/app/vue-sfc/DetailsScreen.vue +20 -0
  196. package/templates/layers/navigation/app/vue-sfc/MenuScreen.typescript.vue +52 -0
  197. package/templates/layers/navigation/app/vue-sfc/MenuScreen.vue +52 -0
  198. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon.png +0 -0
  199. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@2x.png +0 -0
  200. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@3x.png +0 -0
  201. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo.png +0 -0
  202. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@2x.png +0 -0
  203. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@3x.png +0 -0
  204. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo.png +0 -0
  205. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@2x.png +0 -0
  206. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@3x.png +0 -0
  207. package/templates/layers/navigation/app/vue-tsx/App.css +129 -0
  208. package/templates/layers/navigation/app/vue-tsx/App.jsx +91 -0
  209. package/templates/layers/navigation/app/vue-tsx/App.tsx +91 -0
  210. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon.png +0 -0
  211. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@2x.png +0 -0
  212. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@3x.png +0 -0
  213. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo.png +0 -0
  214. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@2x.png +0 -0
  215. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@3x.png +0 -0
  216. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo.png +0 -0
  217. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@2x.png +0 -0
  218. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@3x.png +0 -0
  219. package/templates/layers/navigation/package.json.fragment.json +5 -0
  220. package/templates/layers/network/package.json.fragment.json +5 -0
  221. package/templates/layers/screen-orientation/package.json.fragment.json +5 -0
  222. package/templates/layers/secure-store/package.json.fragment.json +5 -0
  223. package/templates/layers/sensors/package.json.fragment.json +5 -0
  224. package/templates/layers/sharing/package.json.fragment.json +5 -0
  225. package/templates/layers/slider/package.json.fragment.json +5 -0
  226. package/templates/layers/sms/package.json.fragment.json +5 -0
  227. package/templates/layers/splash-screen/native/android/app/src/main/AndroidManifest.xml +28 -0
  228. package/templates/layers/splash-screen/native/android/app/src/main/java/com/canary/MainActivity.kt +29 -0
  229. package/templates/layers/splash-screen/native/android/app/src/main/res/values/styles.xml +12 -0
  230. package/templates/layers/splash-screen/native/ios/Canary/AppDelegate.swift +54 -0
  231. package/templates/layers/splash-screen/package.json.fragment.json +5 -0
  232. package/templates/layers/standard-web-crypto/package.json.fragment.json +5 -0
  233. package/templates/layers/store-review/package.json.fragment.json +5 -0
  234. package/templates/layers/system-ui/package.json.fragment.json +5 -0
  235. package/templates/layers/testing/detox.config.js +42 -0
  236. package/templates/layers/testing/e2e/jest.config.js +21 -0
  237. package/templates/layers/testing/e2e/setup.ts +3 -0
  238. package/templates/layers/testing/e2e/smoke.test.ts +17 -0
  239. package/templates/layers/testing/e2e/tsconfig.json +7 -0
  240. package/templates/layers/testing/fragment/angular/package.json.fragment.json +18 -0
  241. package/templates/layers/testing/fragment/base/package.json.fragment.json +18 -0
  242. package/templates/layers/tracking-transparency/package.json.fragment.json +5 -0
  243. package/templates/layers/web-browser/package.json.fragment.json +5 -0
  244. package/templates/native/Gemfile +17 -0
  245. package/templates/native/README.md +48 -0
  246. package/templates/native/android/app/build.gradle +130 -0
  247. package/templates/native/android/app/debug.keystore +0 -0
  248. package/templates/native/android/app/proguard-rules.pro +10 -0
  249. package/templates/native/android/app/src/androidTest/java/com/canary/DetoxTest.java +29 -0
  250. package/templates/native/android/app/src/main/AndroidManifest.xml +28 -0
  251. package/templates/native/android/app/src/main/java/com/canary/MainActivity.kt +22 -0
  252. package/templates/native/android/app/src/main/java/com/canary/MainApplication.kt +27 -0
  253. package/templates/native/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  254. package/templates/native/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  255. package/templates/native/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  256. package/templates/native/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  257. package/templates/native/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  258. package/templates/native/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  259. package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  260. package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  261. package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  262. package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  263. package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  264. package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  265. package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  266. package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  267. package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  268. package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  269. package/templates/native/android/app/src/main/res/values/colors.xml +3 -0
  270. package/templates/native/android/app/src/main/res/values/strings.xml +3 -0
  271. package/templates/native/android/app/src/main/res/values/styles.xml +6 -0
  272. package/templates/native/android/build.gradle +33 -0
  273. package/templates/native/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  274. package/templates/native/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  275. package/templates/native/android/gradle.properties +44 -0
  276. package/templates/native/android/gradlew +248 -0
  277. package/templates/native/android/gradlew.bat +98 -0
  278. package/templates/native/android/settings.gradle +10 -0
  279. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  280. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  281. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  282. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  283. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  284. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  285. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  286. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  287. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  288. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  289. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  290. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  291. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  292. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  293. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  294. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  295. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  296. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  297. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  298. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  299. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  300. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  301. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  302. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  303. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  304. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  305. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  306. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  307. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  308. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  309. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  310. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  311. package/templates/native/eslint.config.js +3 -0
  312. package/templates/native/ios/.xcode.env +11 -0
  313. package/templates/native/ios/Canary/AppDelegate.swift +48 -0
  314. package/templates/native/ios/Canary/BootSplash.storyboard +46 -0
  315. package/templates/native/ios/Canary/Colors.xcassets/BootSplashBackground-498e55.colorset/Contents.json +20 -0
  316. package/templates/native/ios/Canary/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  317. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/Contents.json +23 -0
  318. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  319. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  320. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  321. package/templates/native/ios/Canary/Images.xcassets/Contents.json +6 -0
  322. package/templates/native/ios/Canary/Info.plist +60 -0
  323. package/templates/native/ios/Canary/LaunchScreen.storyboard +47 -0
  324. package/templates/native/ios/Canary/PrivacyInfo.xcprivacy +37 -0
  325. package/templates/native/ios/Canary.xcodeproj/project.pbxproj +504 -0
  326. package/templates/native/ios/Canary.xcodeproj/xcshareddata/xcschemes/Canary.xcscheme +88 -0
  327. package/templates/native/ios/Canary.xcworkspace/contents.xcworkspacedata +10 -0
  328. package/templates/native/ios/Podfile +34 -0
  329. package/templates/native/package.json.fragment.json +22 -0
  330. package/templates/native/package.json.fragment.typescript.json +8 -0
  331. package/templates/styling/js/angular/css-modules/src/App.ts +25 -0
  332. package/templates/styling/js/angular/stylesheet/src/App.ts +26 -0
  333. package/templates/styling/js/react/css-modules/App.jsx +15 -0
  334. package/templates/styling/js/react/css-modules/App.tsx +15 -0
  335. package/templates/styling/js/react/stylesheet/App.jsx +19 -0
  336. package/templates/styling/js/react/stylesheet/App.tsx +19 -0
  337. package/templates/styling/js/solid/css-modules/App.jsx +15 -0
  338. package/templates/styling/js/solid/css-modules/App.tsx +15 -0
  339. package/templates/styling/js/solid/stylesheet/App.jsx +19 -0
  340. package/templates/styling/js/solid/stylesheet/App.tsx +19 -0
  341. package/templates/styling/js/svelte/css-modules/App.svelte +12 -0
  342. package/templates/styling/js/svelte/css-modules/App.typescript.svelte +12 -0
  343. package/templates/styling/js/svelte/stylesheet/App.svelte +15 -0
  344. package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +15 -0
  345. package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +15 -0
  346. package/templates/styling/js/vue-sfc/css-modules/App.vue +15 -0
  347. package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +18 -0
  348. package/templates/styling/js/vue-sfc/stylesheet/App.vue +18 -0
  349. package/templates/styling/js/vue-tsx/css-modules/App.jsx +16 -0
  350. package/templates/styling/js/vue-tsx/css-modules/App.tsx +16 -0
  351. package/templates/styling/js/vue-tsx/stylesheet/App.jsx +20 -0
  352. package/templates/styling/js/vue-tsx/stylesheet/App.tsx +20 -0
  353. package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +17 -0
  354. package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +22 -0
  355. package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +18 -0
  356. package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +23 -0
  357. package/templates/styling/navigation/react/css-modules/App.jsx +32 -0
  358. package/templates/styling/navigation/react/css-modules/App.tsx +32 -0
  359. package/templates/styling/navigation/react/stylesheet/App.jsx +36 -0
  360. package/templates/styling/navigation/react/stylesheet/App.tsx +36 -0
  361. package/templates/styling/navigation/solid/css-modules/App.jsx +32 -0
  362. package/templates/styling/navigation/solid/css-modules/App.tsx +32 -0
  363. package/templates/styling/navigation/solid/stylesheet/App.jsx +36 -0
  364. package/templates/styling/navigation/solid/stylesheet/App.tsx +36 -0
  365. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +7 -0
  366. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +7 -0
  367. package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +13 -0
  368. package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +13 -0
  369. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +11 -0
  370. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +11 -0
  371. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +16 -0
  372. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +16 -0
  373. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +9 -0
  374. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +9 -0
  375. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +15 -0
  376. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +15 -0
  377. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +13 -0
  378. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +13 -0
  379. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +18 -0
  380. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +18 -0
  381. package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +34 -0
  382. package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +34 -0
  383. package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +38 -0
  384. package/templates/styling/navigation/vue-tsx/stylesheet/App.tsx +38 -0
@@ -0,0 +1,110 @@
1
+ # templates/js/vue-tsx
2
+
3
+ Per-framework JS-level overlay for a Vue-**TSX**-flavored generated app (`.tsx` + JSX,
4
+ `@vue/babel-plugin-jsx` — as opposed to `templates/js/vue-sfc`'s `.vue` single-file-component
5
+ flavor). Combined at generation time with the shared `templates/native/{ios,android}` shell.
6
+ Source: `examples/vue-tsx/` (root-level files only — its `ios/`/`android/` are already covered
7
+ by the shared native template).
8
+
9
+ ## Copied files
10
+
11
+ Every file below is bootstrap/tooling/config: identical (or safe-to-reuse-verbatim) in any new
12
+ SymbioteNative Vue-TSX app, regardless of what screens the app author writes on top.
13
+
14
+ | File | Why it belongs in the seam |
15
+ |---|---|
16
+ | `index.js` | Entry point — `createApp(App).mount(appName)` via `@symbiote-native/vue/bootstrap`. Wires the native-host seam + RN's `AppRegistry`; every generated app needs this exact boilerplate (only `App` and `app.json`'s `name` vary, and both are supplied separately). |
17
+ | `metro.config.js` | Metro config. **Vue-TSX-specific**, not a copy of React's: sets `babelTransformerPath` to `@symbiote-native/vue/metro-css-parser` (not React's `@symbiote-native/react/metro-css-parser`), and adds a `resolver.extraNodeModules` alias mapping the bare `vue` specifier to this app's installed `@vue/runtime-core` — needed because `@vue/babel-plugin-jsx`'s generated helper imports say `from 'vue'`, but the app never installs the `vue` runtime package itself (see the dependency fragment below). |
18
+ | `babel.config.js` | **The file with the real TSX-vs-SFC-specific wiring** — see the dedicated section below. |
19
+ | `tsconfig.json` | Extends `@react-native/typescript-config`, adds the `@symbiote-native/css-parser/typescript-plugin` TS-server plugin (per-file `.module.css` literal-key typing in the editor). Same shape React/Angular use, just with the plugin swapped in. |
20
+ | `tsconfig.typecheck.json` | **Vue-TSX-specific.** A separate `vue-tsc` typecheck config with `jsx: "preserve"` and a `jsxFactory` pointed at a namespace (`VueJsx.createElement`) neither Vue nor React ever populate, purely to make TS's JSX-type-resolution algorithm fall through to the global `JSX` namespace declared in `vue-jsx.d.ts` (see that file's own comment for the exact TS-internal reason `declare global { namespace JSX {...} }` alone doesn't work). A `.vue`-SFC app has no equivalent file — the SFC compiler doesn't do JSX attribute excess-property checking the way TSX does. |
21
+ | `app.json` | RN app metadata (`name`, `displayName`). **Not parameterized** — see the explicit note below. |
22
+ | `css.d.ts` | Ambient module declarations for `*.css` (side-effect import) and the generic `*.module.css` fallback (before a real per-file generated `.d.ts` exists). Identical shape to `examples/react/css.d.ts` / `examples/angular/css.d.ts`. |
23
+ | `vue-jsx.d.ts` | **Vue-TSX-specific.** Declares the `VueJsx.JSX` namespace `tsconfig.typecheck.json`'s `jsxFactory` points at — `Element`, `ElementClass`, `ElementAttributesProperty`, and (load-bearing) an `IntrinsicAttributes` index signature, because several adapter components (`SafeAreaView`, `StatusBar`, `ActivityIndicator`, `Animated.*`) declare no `props` schema and forward everything through Vue's untyped `$attrs` fallthrough — without the index signature, TSX's excess-property check on those components would false-positive on every extra prop, whereas `.vue` SFCs never hit this at all (their template compiler doesn't excess-property-check against JSX's `IntrinsicAttributes`). |
24
+ | `vue-runtime-core.d.ts` | `declare module 'vue' { export * from '@vue/runtime-core' }` — makes the bare `'vue'` import specifier type-check even though the app only installs `@vue/runtime-core`, mirroring `metro.config.js`'s resolver alias at the type level. |
25
+ | `.eslintrc.js` | `extends: '@react-native'` — same base RN lint config every framework's overlay needs. |
26
+ | `.prettierrc.js` | Standard formatting (`arrowParens: 'avoid'`, `singleQuote: true`, `trailingComma: 'all'`) — framework-independent. |
27
+ | `.watchmanconfig` | Empty `{}` — Metro/Watchman boilerplate every RN app needs, framework-independent. |
28
+ | `.gitignore` | Standard RN `.gitignore` (Xcode/Gradle/CocoaPods/node_modules/Metro health-check files) — framework-independent. |
29
+
30
+ ## The Vue-TSX-specific Babel/Metro wiring (read this before touching either file)
31
+
32
+ Compared against `examples/react/babel.config.js`, Vue TSX needs real JSX-pragma rewiring, not
33
+ just RN's stock preset:
34
+
35
+ - **Plugin order is load-bearing.** `babel.config.js`'s `plugins` array lists
36
+ `'@vue/babel-plugin-jsx'` FIRST. Babel runs `plugins` before `presets`, so the Vue plugin
37
+ rewrites every `JSXElement` into a `@vue/runtime-core` `createVNode()` call *before* the RN
38
+ preset's own React-JSX transform (pulled in via `presets: ['module:@react-native/babel-preset']`)
39
+ ever sees the file — by the time the React transform runs, there is no JSX left for it to
40
+ touch, so it silently no-ops. Reordering these would leave Vue JSX compiled as React
41
+ `createElement()` calls, which the Vue runtime cannot mount.
42
+ - **`stripReactJsxDevAttrs` is a real correctness fix, not cleanup.** The RN preset's dev
43
+ React-JSX transform injects `__self={this}` / `__source={...}` dev annotations on every
44
+ `JSXElement`; under React those are inert, but `@vue/babel-plugin-jsx` copies them verbatim
45
+ into the Vue vnode's `props`. At module scope `this` is the Hermes global `HostObject`, so any
46
+ Vue dev warning that tries to format that prop reads `Symbol.toStringTag` off the
47
+ `HostObject`, throws, and unwinds the whole mount into a blank screen. This plugin strips both
48
+ attributes on `JSXOpeningElement` exit (after the self/source plugins add them on enter, before
49
+ the Vue plugin reads attributes on the parent `JSXElement`'s exit).
50
+ - **`inlineDebugFlag`** is the same `DEBUG` env-var inlining every framework's `babel.config.js`
51
+ carries (see `<keep_logs_gate_behind_DEBUG>` in the root `CLAUDE.md`) — not TSX-specific, just
52
+ present here too.
53
+ - **`metro.config.js`'s `vue` → `@vue/runtime-core` alias is the resolver-level twin of the
54
+ Babel plugin order above**: the Vue plugin's generated helper imports say `from 'vue'`, but
55
+ this app never installs the `vue` runtime package as a dependency (only `@vue/runtime-core` —
56
+ see the dependency fragment). Without the alias, Metro would fail to resolve those bare `vue`
57
+ imports at bundle time.
58
+
59
+ ## Deliberately excluded
60
+
61
+ - `App.tsx`, `App.css`, `components/`, `screens/`, `navigation-lines.ts`,
62
+ `navigation-linking.ts`, `routes.ts`, `assets/`, `e2e/`, `package-lock.json` — the example
63
+ app's own demo content, per the task scope. Not part of the scaffold seam.
64
+ - `package.json` (the full file) — not copied; only the dependency fragment below is.
65
+ - **`Gemfile`** — byte-identical to `examples/react/Gemfile` (verified via `diff`). It's Ruby/
66
+ CocoaPods toolchain config for the iOS build, framework-independent — conceptually it belongs
67
+ with the *shared* native shell (`templates/native/ios/`, which already has `Podfile`/
68
+ `Podfile.lock` but no `Gemfile`), not duplicated verbatim into every per-framework JS overlay.
69
+ Since this pass is scoped to `templates/js/vue-tsx/` only and must not touch `templates/
70
+ native/`, it's left out here — flagging it as a real gap for whoever wires the native+overlay
71
+ merge in `generate.ts` to close (add `Gemfile` to the shared native template once, not to
72
+ four JS overlays).
73
+ - **`detox.config.js`** — its `testRunner` points at `e2e/jest.config.js`, and its `binaryPath`/
74
+ `build` fields hardcode the app scheme (`Canary.xcworkspace`, `Canary.app`). Since `e2e/` is
75
+ excluded as app-authored test content, copying this file alone would ship a dead config with
76
+ no tests to run and no generic way to point it at a not-yet-generated app's real scheme name.
77
+ E2E scaffolding is a separate concern from this pass.
78
+ - **`vue-fragment.test.ts`** — a regression test for SymbioteNative's own Vue-adapter engine
79
+ internals (Fragment start/end anchor handling under the fake-Fabric test harness), ported from
80
+ a headless smoke test elsewhere in the monorepo. It verifies the *framework*, not something a
81
+ newly generated app needs; it isn't app code.
82
+ - **`tunnel-demo.ts`** — a `createTunnel()` demo singleton consumed only by the excluded
83
+ `screens/CanaryScreen.tsx`'s "Show toast" demo button. App-authored demo content, same
84
+ category as `App.tsx`.
85
+
86
+ ## `package.json.fragment.json`
87
+
88
+ A dependency **fragment**, not a full `package.json` (this folder isn't an npm package itself).
89
+ Lists only the SymbioteNative-relevant `dependencies`/`devDependencies` a generated app's real
90
+ `package.json` needs, derived from what `index.js`, `metro.config.js`, `babel.config.js`,
91
+ `tsconfig.json`, and `tsconfig.typecheck.json` actually import/require/extend — not guessed.
92
+ Versions are pulled verbatim from `examples/vue-tsx/package.json`. Notably: the runtime
93
+ dependency is `@vue/runtime-core` (not the `vue` meta-package — see the Babel/Metro section
94
+ above for why), and `react-reconciler` is intentionally absent since it's the React adapter's
95
+ own driving mechanism, unused by Vue.
96
+
97
+ ## Not yet parameterized
98
+
99
+ `app.json`'s `name`/`displayName` fields (`"Canary"`) are copied **literally**, as-is, from the
100
+ example app — no placeholder or templating scheme has been introduced. That's real follow-up
101
+ work for `@symbiote-native/cli new`'s actual generation logic, which still throws
102
+ `NotImplementedCommandError` as of this pass (see `packages/cli/README.md`'s
103
+ "What's real vs. stubbed" section).
104
+
105
+ ## TSX vs SFC selection is not wired up yet
106
+
107
+ `@symbiote-native/cli new --framework vue` currently has no flag or prompt to choose between this
108
+ TSX overlay and `templates/js/vue-sfc`'s SFC flavor — both exist on disk, but nothing in
109
+ `src/commands/new.ts` or `src/prompts.ts` asks the user which one they want yet. Designing that
110
+ flag/prompt (and its default) is separate follow-up work, out of scope for this pass.
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "Canary",
3
+ "displayName": "Canary"
4
+ }
@@ -0,0 +1,67 @@
1
+ // Inline `process.env.DEBUG` at bundle time so the @symbiote diagnostic logs can
2
+ // be toggled from the shell without a dependency:
3
+ // DEBUG=1 npx react-native start --reset-cache
4
+ // The value is read from Metro's own environment when this config is evaluated
5
+ // and baked into every transformed module (the app entry and the shared source).
6
+ const debugFlag = process.env.DEBUG === '1' ? '1' : '0';
7
+
8
+ function inlineDebugFlag({ types: t }) {
9
+ return {
10
+ name: 'inline-debug-flag',
11
+ visitor: {
12
+ MemberExpression(path) {
13
+ if (path.matchesPattern('process.env.DEBUG')) {
14
+ path.replaceWith(t.stringLiteral(debugFlag));
15
+ }
16
+ },
17
+ },
18
+ };
19
+ }
20
+
21
+ // The RN preset's dev React-JSX transform injects __self={this} and __source={...} on every
22
+ // JSXElement. Under React they are inert dev annotations, but @vue/babel-plugin-jsx copies them
23
+ // verbatim into the Vue vnode's PROPS — and at module scope `this` is the Hermes global HostObject.
24
+ // Any Vue dev warn then formats that prop for its component trace, the formatter reads
25
+ // Symbol.toStringTag off the HostObject, that throws, and the throw unwinds the whole mount → blank
26
+ // screen. Strip both attributes on JSXOpeningElement exit: the self/source plugins add them on enter
27
+ // (so they exist by exit), and the Vue plugin reads attributes on JSXElement exit, which fires after
28
+ // this child-level exit — so the props never carry them.
29
+ function stripReactJsxDevAttrs() {
30
+ const DEV_ATTRS = new Set(['__self', '__source']);
31
+ return {
32
+ name: 'strip-react-jsx-dev-attrs',
33
+ visitor: {
34
+ JSXOpeningElement: {
35
+ exit(path) {
36
+ path.node.attributes = path.node.attributes.filter(
37
+ attr =>
38
+ !(
39
+ attr.type === 'JSXAttribute' &&
40
+ attr.name.type === 'JSXIdentifier' &&
41
+ DEV_ATTRS.has(attr.name.name)
42
+ ),
43
+ );
44
+ },
45
+ },
46
+ },
47
+ };
48
+ }
49
+
50
+ // The Vue JSX pair comes from the adapter, not from a hand-written '@vue/babel-plugin-jsx' entry:
51
+ // it is the plugin PLUS the isCustomElement option that makes the `view`/`text`/… intrinsic tags
52
+ // compile to their lowered intrinsic element instead of to a Vue component instance each. Either
53
+ // half alone is broken — see @symbiote-native/vue/babel-jsx, which is why they arrive as one
54
+ // require() rather than two lines here. @vue/babel-plugin-jsx is a dependency of the adapter now,
55
+ // so a fresh install of a published @symbiote-native/vue brings it along; this app's own entry for
56
+ // it is redundant but harmless.
57
+ const symbioteVueJsx = require('@symbiote-native/vue/babel-jsx');
58
+
59
+ module.exports = {
60
+ presets: ['module:@react-native/babel-preset'],
61
+ // The Vue JSX pair is listed FIRST so it runs before the RN preset's React-JSX
62
+ // transform: babel applies `plugins` before `presets`, so the Vue plugin rewrites every
63
+ // JSXElement into a @vue/runtime-core createVNode call, leaving no JSX for the React
64
+ // transform to touch (it no-ops). The helper imports it injects come `from 'vue'`, which
65
+ // metro.config.js aliases to @vue/runtime-core, the one Vue runtime the adapter renders on.
66
+ plugins: [...symbioteVueJsx(), stripReactJsxDevAttrs, inlineDebugFlag],
67
+ };
@@ -0,0 +1,24 @@
1
+ // Ambient module for a plain, side-effect-only `.css` import (`import './App.css'`) —
2
+ // @symbiote-native/css-parser compiles it at build time (Metro's babelTransformerPath, see
3
+ // metro-css-transformer.js) into a registerStyles() call; there's no runtime export to type.
4
+ // Mirrors examples/react/css.d.ts and examples/angular/css.d.ts.
5
+ declare module '*.css';
6
+
7
+ // Same shape for the three optional preprocessor sources — css-parser reduces each to plain CSS
8
+ // before compiling, so a side-effect import of one is indistinguishable downstream from a `.css`
9
+ // one.
10
+ declare module '*.scss';
11
+ declare module '*.sass';
12
+ declare module '*.less';
13
+ declare module '*.styl';
14
+
15
+ // Generic (non-literal) fallback for a `.module.css` import — used by `tsc`/`vue-tsc` outside a
16
+ // file that already has its own generated `Card.module.css.d.ts` (see `css-dts`, wired to
17
+ // `pretypecheck`; a real per-file `.d.ts` takes priority over this wildcard once generated). The
18
+ // `@symbiote-native/vue/typescript-plugin` entry in tsconfig.json's `compilerOptions.plugins` gives the
19
+ // SAME per-file literal-key typing live in the editor — plugins never load for a standalone
20
+ // `tsc`/CI run, which is why both mechanisms exist side by side.
21
+ declare module '*.module.css' {
22
+ const styles: Record<string, string>;
23
+ export default styles;
24
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @format
3
+ *
4
+ * Symbiote Vue canary entry. createApp(App).mount(appName) wires the
5
+ * native-host seams and RN's own AppRegistry, then mounts via @symbiote-native/engine — RN's own
6
+ * renderer is never in the path. Same entry point as examples/vue-sfc, going through the
7
+ * shared AppRegistry seam like every other canary.
8
+ */
9
+
10
+ import { createApp } from '@symbiote-native/vue/bootstrap';
11
+ import App from './App';
12
+ import { name as appName } from './app.json';
13
+
14
+ createApp(App).mount(appName);
@@ -0,0 +1,42 @@
1
+ const path = require('path');
2
+ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
3
+
4
+ const projectRoot = __dirname;
5
+
6
+ const defaultConfig = getDefaultConfig(projectRoot);
7
+
8
+ /**
9
+ * @symbiote-native/* and @vue/runtime-core resolve as ordinary npm packages from this app's
10
+ * own node_modules (examples/* is a standalone npm install, decoupled from the monorepo's
11
+ * pnpm workspace — see pnpm-workspace.yaml). @react-native/babel-preset strips the types.
12
+ *
13
+ * @type {import('@react-native/metro-config').MetroConfig}
14
+ */
15
+ const runtimeCore = path.resolve(projectRoot, 'node_modules/@vue/runtime-core');
16
+
17
+ const config = {
18
+ // JSX is still compiled by @vue/babel-plugin-jsx via babel.config.js regardless of which
19
+ // transformer runs it (unlike the SFC canary, which needs a Metro transformer to compile
20
+ // .vue) — @symbiote-native/vue ships the standalone .css/.module.css transformer itself
21
+ // (same framework-agnostic path the React and Angular examples use via their own adapter's
22
+ // ./metro-css-parser export), so no local wiring file is needed here either.
23
+ transformer: {
24
+ babelTransformerPath: require.resolve('@symbiote-native/vue/metro-css-parser'),
25
+ },
26
+ resolver: {
27
+ // Teach Metro that a style file is a source file (the transformer turns it into a module).
28
+ // scss/sass/less/styl are optional SCSS/Sass/Less/Stylus preprocessor sources — see
29
+ // core/css-parser/src/preprocessors.ts.
30
+ sourceExts: [...defaultConfig.resolver.sourceExts, 'css', 'scss', 'sass', 'less', 'styl'],
31
+ extraNodeModules: {
32
+ // @vue/babel-plugin-jsx injects helper imports `from 'vue'`; there is no vue/runtime-dom
33
+ // in a native bundle, and this app never installs the `vue` package itself (only
34
+ // @vue/runtime-core), so the bare 'vue' specifier is aliased to the runtime-core
35
+ // singleton the adapter renders on (the resolver twin of the SFC transformer's
36
+ // 'vue'→runtime-core string rewrite).
37
+ vue: runtimeCore,
38
+ },
39
+ },
40
+ };
41
+
42
+ module.exports = mergeConfig(defaultConfig, config);
@@ -0,0 +1,26 @@
1
+ {
2
+ "scripts": {
3
+ "android": "react-native run-android",
4
+ "android:release": "react-native run-android --mode Release",
5
+ "ios": "react-native run-ios",
6
+ "ios:release": "react-native run-ios --mode Release",
7
+ "lint": "eslint .",
8
+ "start": "react-native start",
9
+ "dev": "react-native start --reset-cache"
10
+ },
11
+ "dependencies": {
12
+ "@symbiote-native/android": "latest",
13
+ "@symbiote-native/vue": "latest",
14
+ "@symbiote-native/engine": "latest",
15
+ "@vue/runtime-core": "^3.5.13",
16
+ "react": "19.2.3",
17
+ "react-native": "0.86.0"
18
+ },
19
+ "devDependencies": {
20
+ "vue": "^3.5.38",
21
+ "@vue/babel-plugin-jsx": "^1.5.0",
22
+ "@react-native/babel-preset": "0.86.0",
23
+ "@react-native/metro-config": "0.86.0",
24
+ "@symbiote-native/css-parser": "latest"
25
+ }
26
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "scripts": {
3
+ "pretypecheck": "css-dts .",
4
+ "typecheck": "vue-tsc --noEmit -p tsconfig.typecheck.json"
5
+ },
6
+ "devDependencies": {
7
+ "vue-tsc": "^2.2.12",
8
+ "@react-native/typescript-config": "0.86.0",
9
+ "typescript": "~6.0.0"
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "@react-native/typescript-config",
3
+ "compilerOptions": {
4
+ "types": [],
5
+ // Vue's JSX is compiled by @vue/babel-plugin-jsx, never by tsc — `preserve` leaves it alone
6
+ // and `jsxImportSource` only tells tsc whose JSX namespace to type-check against. Both
7
+ // override @react-native/typescript-config's React defaults, which would otherwise type
8
+ // every element here as React's.
9
+ "jsx": "preserve",
10
+ "jsxImportSource": "@symbiote-native/vue",
11
+ "plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
12
+ },
13
+ "include": ["**/*.ts", "**/*.tsx"],
14
+ "exclude": ["**/node_modules", "**/Pods", "e2e"]
15
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "comment": "vue-tsc typecheck of the app's Vue JSX (.tsx). @symbiote-native/* resolve to source (the monorepo's by-design source resolution), so this also re-checks adapter/engine source — `types: [node]` restores the runtime globals (setTimeout/process/console/queueMicrotask) the app tsconfig strips with `types: []`. e2e/ is excluded: Detox tests with jest globals, type-checked via ts-jest.",
4
+ "compilerOptions": {
5
+ "types": ["node"],
6
+ "jsx": "preserve",
7
+ "jsxFactory": "VueJsx.createElement"
8
+ },
9
+ "exclude": ["**/node_modules", "**/Pods", "e2e"]
10
+ }
@@ -0,0 +1,43 @@
1
+ // TS's JSX type-checking algorithm resolves `JSX.*` types via the configured `jsxFactory`'s OWN
2
+ // namespace FIRST (default factory "React.createElement" → checks "React.JSX", which
3
+ // @types/react DOES export) and only falls back to a global `JSX` namespace when that lookup
4
+ // finds nothing. That priority order — not a declaration-merge conflict — is why a plain
5
+ // `declare global { namespace JSX {...} }` here had no effect: TS never got past the first check.
6
+ // The fix: point `jsxFactory` (tsconfig.typecheck.json) at a namespace React never touches
7
+ // (`VueJsx.createElement`, declared here) so `VueJsx.JSX` fails to resolve and TS falls through
8
+ // to the global `JSX` namespace below — which we DO control. Emit is unaffected (`"jsx": "preserve"`
9
+ // never calls the factory; @vue/babel-plugin-jsx already does the real transform in babel.config.js
10
+ // before React's own JSX plugin ever sees the file) — this is purely a type-checking concern.
11
+ import type { VNode } from '@vue/runtime-core';
12
+
13
+ declare global {
14
+ namespace VueJsx {
15
+ // eslint-disable-next-line @typescript-eslint/no-namespace
16
+ namespace JSX {
17
+ interface Element extends VNode {}
18
+ interface ElementClass {
19
+ $props: {};
20
+ }
21
+ interface ElementAttributesProperty {
22
+ $props: {};
23
+ }
24
+ interface IntrinsicElements {
25
+ [name: string]: any;
26
+ }
27
+ // Index signature, not just `key`: several adapter components (SafeAreaView, StatusBar,
28
+ // ActivityIndicator, Animated.View/ScrollView accessed off the `Animated` namespace) declare
29
+ // NO `props` schema at all — they forward everything through Vue's untyped `$attrs`
30
+ // fallthrough by design (see adapters/vue/src/components/safe-area-view.ts's own comment).
31
+ // `.vue` SFCs never flag this (the template compiler doesn't excess-property-check against
32
+ // JSX's `IntrinsicAttributes`); TSX does, since JSX attribute checking always intersects a
33
+ // component's `$props` with this interface. Without the index signature here, passing
34
+ // `testID`/`class`/etc. to any of those attrs-passthrough components is a false-positive
35
+ // excess-property error, not a real type mismatch — the props genuinely do forward at runtime.
36
+ interface IntrinsicAttributes {
37
+ key?: string | number | symbol;
38
+ [name: string]: unknown;
39
+ }
40
+ }
41
+ }
42
+ const VueJsx: { createElement: (...args: any[]) => any };
43
+ }
@@ -0,0 +1,3 @@
1
+ declare module 'vue' {
2
+ export * from '@vue/runtime-core';
3
+ }
@@ -0,0 +1,90 @@
1
+ # `templates/layers`
2
+
3
+ Framework-agnostic optional overlays, applied on top of `native/` + `js/<framework>` by
4
+ `--expo-modules` / `--navigation` / `--testing` / `--splash-screen` / `--slider` / one `--<id>`
5
+ flag per `EXPO_PACKAGE_LAYERS` entry (`src/expo-package-layers.ts`).
6
+
7
+ `expo-modules` is dependency-only, same regardless of `--framework` (diffing
8
+ `examples/expo-react` against `examples/react`, and checking `packages/navigation`'s
9
+ `peerDependencies`, showed a dependency-only addition with no framework-specific file content and
10
+ no native (`ios/`/`android/`) changes — see `packages/cli/README.md`'s "Design
11
+ decisions" section). It carries ONLY the core autolinking bits — `expo` and
12
+ `@symbiote-native/expo-modules-link` — never a specific Expo-backed package (2026-09-18): it used
13
+ to bundle all 21 `@symbiote-native/<expo-wrapper>` packages unconditionally, so picking any ONE of
14
+ them (or none at all) always installed every other one too. Each wrapper now has its OWN
15
+ `templates/layers/<id>/package.json.fragment.json` (`application`, `battery`, `brightness`,
16
+ `cellular`, `clipboard`, `crypto`, `device`, `haptics`, `keep-awake`, `local-auth`,
17
+ `localization`, `network`, `screen-orientation`, `secure-store`, `sensors`, `sharing`, `sms`,
18
+ `standard-web-crypto`, `store-review`, `system-ui`, `tracking-transparency`, `web-browser`) —
19
+ same dependency-only shape as `slider`, registered once in `EXPO_PACKAGE_LAYERS` so cli.ts's
20
+ `--<id>` flag, prompts.ts's multiselect option, and `detect-added-layers.ts`'s marker all derive
21
+ from that ONE table instead of 21 hand-written near-duplicates. `@symbiote-native/expo-modules-
22
+ link` (the "Expo-modules autolinking" feature) is never a SEPARATE explicit tick once one of these
23
+ 21 is picked — it doesn't make sense to ask for autolinking twice, so `resolveFeatures` /
24
+ `resolveAddLayers` in `src/prompts.ts` fold `hasExpoModules` to true (or append the `expo-modules`
25
+ layer) automatically. (An earlier pass here also unconditionally added the raw npm `expo-linking`
26
+ package — reverted, 2026-09-18: checking the real installed `expo-battery`/`expo-web-browser`/
27
+ `expo-sharing`/`expo-store-review`/`expo-local-authentication`/`expo`/`expo-modules-autolinking`
28
+ `package.json`s found NONE of them depend on it. Nothing in this codebase's dependency graph
29
+ actually needs it, so it isn't shipped.)
30
+
31
+ `navigation` is NOT dependency-only (2026-09-15): besides `package.json.fragment.json`
32
+ (`@symbiote-native/navigation`, declaring every adapter as an optional peer itself), it carries an
33
+ `app/<framework>` subtree — a 2-screen `Stack` demo (Menu → Details) that OVERWRITES the base
34
+ `js/<framework>` App file, so `--navigation` demonstrates itself instead of silently doing
35
+ nothing visible. `src/generate.ts` renders `app/<framework>` as a separate call from the
36
+ package.json merge (see its own comment) — recursively copying the whole `navigation/` directory
37
+ would land every framework's `app/` folder on the generated root instead of just the selected
38
+ one.
39
+
40
+ `splash-screen` (2026-09-17) is the first layer that DOES carry native changes: a `native/`
41
+ subtree mirroring `templates/native`'s own layout (`native/android/...`, `native/ios/...`),
42
+ overlaid the same way `renderTemplate` already overlays `navigation`'s `app/<framework>` — no
43
+ `@expo/config-plugins` needed after all, because only 4 files actually require two variants.
44
+ `react-native-bootsplash` (vendored source checked via `/vendor`) has no setup codemod of its own
45
+ — its CLI only generates image assets, never touches app source — so both variants are hand-authored
46
+ here. The split is narrower than it looks: `MainActivity.kt`'s `RNBootSplash.init(...)` call and
47
+ `AppDelegate.swift`'s `RNBootSplash.initWithStoryboard(...)` call are Kotlin/Swift references to
48
+ the plugin's public API (hard compile error without the dependency), and `styles.xml`'s
49
+ `BootTheme` extends the plugin's own `Theme.BootSplash` (an aapt resource-linking error without
50
+ its AAR) — so those 3 files plus the one-line `AndroidManifest.xml` activity theme attribute are
51
+ the ONLY things gated. `colors.xml`, the `drawable-*/bootsplash_logo.png` assets,
52
+ `BootSplash.storyboard`, `Colors.xcassets`, `Images.xcassets`, `Info.plist`'s
53
+ `UILaunchStoryboardName`, and the `.xcodeproj/project.pbxproj` wiring all stay in the BASE
54
+ template unconditionally — none of them reference anything from the plugin (the storyboard only
55
+ draws from our own asset catalog), so leaving them in place when the option is off just means an
56
+ unused-but-harmless launch-screen asset, not a build break.
57
+
58
+ `testing` (2026-09-17) is also NOT dependency-only: besides the per-framework
59
+ `package.json.fragment.json` (`detox` + `jest` + `ts-jest` + the TypeScript floor, since e2e is a
60
+ separate TS project regardless of `--javascript`), it ships `detox.config.js` at the app root and
61
+ an `e2e/` directory (`jest.config.js`, `tsconfig.json`, `setup.ts`, `smoke.test.ts`). The fragment
62
+ is picked from `fragment/<base|angular>/package.json.fragment.json` — angular's `e2e:build:*`
63
+ scripts need an `ngc` pass before Detox builds the native binary, every other framework shares
64
+ `fragment/base`. Both live in their OWN subdirectory rather than as
65
+ `base.package.json.fragment.json` / `angular.package.json.fragment.json` side by side, because
66
+ `renderTemplate`'s package.json merge branch derives the destination filename from the SOURCE
67
+ file's own basename, not from the `dest` path passed to it — two source files with different
68
+ basenames merging into the same `package.json.fragment.json` silently land as two different
69
+ files instead (caught via smoke test: the merged scripts were missing entirely). The one smoke
70
+ test (`e2e/smoke.test.ts`) asserts the welcome text renders through Fabric — deliberately generic
71
+ so it passes whether or not `--navigation` is also selected (the nav layer's Menu screen renders
72
+ the same line).
73
+
74
+ | Layer | Adds |
75
+ |---|---|
76
+ | `expo-modules` | `expo` + `@symbiote-native/expo-modules-link` — the core autolinking wiring, no specific Expo-backed package. |
77
+ | `application` / `battery` / `brightness` / `cellular` / `clipboard` / `crypto` / `device` / `haptics` / `keep-awake` / `local-auth` / `localization` / `network` / `screen-orientation` / `secure-store` / `sensors` / `sharing` / `sms` / `standard-web-crypto` / `store-review` / `system-ui` / `tracking-transparency` / `web-browser` | Its own `@symbiote-native/<id>` dependency only — same dependency-only shape as `slider`, registered in `EXPO_PACKAGE_LAYERS`. Implies `expo-modules` (see above). |
78
+ | `navigation` | `@symbiote-native/navigation` + a per-framework `app/<dir>/App.<ext>` (Stack + Menu/Details screens) overwriting the base App. |
79
+ | `testing` | `detox` + `jest`/`ts-jest` + a generic `e2e/smoke.test.ts` + `detox.config.js`, always TypeScript regardless of `--javascript`. |
80
+ | `splash-screen` | `@symbiote-native/splash-screen` + the 4 native files (`MainActivity.kt`, `AndroidManifest.xml`, `styles.xml`, `AppDelegate.swift`) that wire `react-native-bootsplash`, plus a JS-side text-splice (`utils/apply-splash-screen-hide.ts`) wiring the framework's own `hide()` call into the App entry — the native side alone would freeze every scaffold on the splash screen forever, since nothing ever tells it to hide. |
81
+
82
+ Every `@symbiote-native/*` version in every fragment (base and layer) is pinned to `"latest"`,
83
+ not a literal semver range — the monorepo's packages publish independently and a hand-copied
84
+ literal drifts out of sync with peer requirements almost immediately (measured 2026-09-15:
85
+ `templates/js/angular`'s `@symbiote-native/engine` pin was `^0.1.7` against `@symbiote-native/
86
+ navigation@4.0.1`'s `^0.5.0` peer, and `expo-modules`'s `@symbiote-native/application@2.0.0`
87
+ wants `@symbiote-native/angular@^2.0.0` while the angular fragment pinned `^0.6.1` — two separate
88
+ `npm install ERESOLVE` failures from the same root cause). Third-party dependencies (`react`,
89
+ `react-native`, `vue`, `svelte`, `solid-js`, `@angular/*`, `expo`, …) stay pinned as before —
90
+ only the `@symbiote-native/*` scope moved to `latest`.
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/application": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/battery": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/brightness": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/cellular": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/clipboard": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/crypto": "latest"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@symbiote-native/device": "latest"
4
+ }
5
+ }
@@ -0,0 +1,66 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CADisableMinimumFrameDurationOnPhone</key>
6
+ <true/>
7
+ <key>CFBundleDevelopmentRegion</key>
8
+ <string>en</string>
9
+ <key>CFBundleDisplayName</key>
10
+ <string>Canary</string>
11
+ <key>CFBundleExecutable</key>
12
+ <string>$(EXECUTABLE_NAME)</string>
13
+ <key>CFBundleIdentifier</key>
14
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
15
+ <key>CFBundleInfoDictionaryVersion</key>
16
+ <string>6.0</string>
17
+ <key>CFBundleName</key>
18
+ <string>$(PRODUCT_NAME)</string>
19
+ <key>CFBundlePackageType</key>
20
+ <string>APPL</string>
21
+ <key>CFBundleShortVersionString</key>
22
+ <string>$(MARKETING_VERSION)</string>
23
+ <key>CFBundleSignature</key>
24
+ <string>????</string>
25
+ <key>CFBundleVersion</key>
26
+ <string>$(CURRENT_PROJECT_VERSION)</string>
27
+ <key>LSRequiresIPhoneOS</key>
28
+ <true/>
29
+ <key>NSAppTransportSecurity</key>
30
+ <dict>
31
+ <key>NSAllowsArbitraryLoads</key>
32
+ <false/>
33
+ <key>NSAllowsLocalNetworking</key>
34
+ <true/>
35
+ </dict>
36
+ <key>NSLocationWhenInUseUsageDescription</key>
37
+ <string></string>
38
+ <key>RCTNewArchEnabled</key>
39
+ <true/>
40
+ <key>UILaunchStoryboardName</key>
41
+ <string>BootSplash</string>
42
+ <key>UIRequiredDeviceCapabilities</key>
43
+ <array>
44
+ <string>arm64</string>
45
+ </array>
46
+ <key>UISupportedInterfaceOrientations</key>
47
+ <array>
48
+ <string>UIInterfaceOrientationPortrait</string>
49
+ </array>
50
+ <key>UISupportedInterfaceOrientations~ipad</key>
51
+ <array>
52
+ <string>UIInterfaceOrientationLandscapeLeft</string>
53
+ <string>UIInterfaceOrientationLandscapeRight</string>
54
+ <string>UIInterfaceOrientationPortrait</string>
55
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
56
+ </array>
57
+ <key>UIViewControllerBasedStatusBarAppearance</key>
58
+ <false/>
59
+ <key>NSFaceIDUsageDescription</key>
60
+ <string>This app uses Face ID to authenticate you.</string>
61
+ <key>NSMotionUsageDescription</key>
62
+ <string>This app uses motion sensor data.</string>
63
+ <key>NSUserTrackingUsageDescription</key>
64
+ <string>This app tracks your activity across other apps and websites.</string>
65
+ </dict>
66
+ </plist>
@@ -0,0 +1,9 @@
1
+ {
2
+ "scripts": {
3
+ "postinstall": "symbiote-expo-link"
4
+ },
5
+ "dependencies": {
6
+ "expo": "57.0.14",
7
+ "@symbiote-native/expo-modules-link": "latest"
8
+ }
9
+ }