@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,124 @@
1
+ # `templates/js/vue-sfc`
2
+
3
+ The Vue-**SFC** (`.vue` Single File Component) flavor of the per-framework JS overlay. Sourced
4
+ verbatim from `examples/vue-sfc/` (root-level files only — its `ios/`/`android/` are already
5
+ covered by the shared `templates/native/{ios,android}` shell).
6
+
7
+ Vue has a second, divergent flavor — `templates/js/vue-tsx/` — sourced from `examples/vue-tsx/`
8
+ by a separate pass. The two are not interchangeable: SFC compiles `.vue` files through a
9
+ dedicated Metro transformer (see below); TSX has no such file and no such transformer to wire.
10
+
11
+ ## What was copied, and why each file belongs in the seam
12
+
13
+ Every file below would be identical (or safely near-identical) in any new SymbioteNative
14
+ Vue-SFC app, regardless of what screens the app author writes — that's the bar for "part of the
15
+ scaffold seam" vs. "the example's own demo content."
16
+
17
+ | File | Why it's part of the seam |
18
+ |---|---|
19
+ | `index.js` | The entry point: `createApp(App).mount(appName)` via `@symbiote-native/vue/bootstrap`. Only `App` and `appName` are app-specific, and both are already externalized as imports — the file itself doesn't change per app. |
20
+ | `metro.config.js` | Wires the `.vue` SFC transformer (see the dedicated section below) and registers `vue`/`css`/`scss`/`sass`/`less`/`styl` as Metro source extensions. The one genuinely SFC-specific piece of tooling in this list. |
21
+ | `babel.config.js` | `@react-native/babel-preset` + an `inline-debug-flag` plugin that bakes `process.env.DEBUG` into the bundle at build time (the project-wide `dlog`/`isDebug` gate). Framework-agnostic, identical across all three adapters' examples. |
22
+ | `tsconfig.json` | Extends `@react-native/typescript-config`, registers the `@symbiote-native/css-parser/typescript-plugin` language-service plugin, and includes `**/*.vue` in the type-checked file set. |
23
+ | `tsconfig.typecheck.json` | The `vue-tsc --noEmit` entry point used by the `typecheck` script — widens `types` back to `["node"]` (the app tsconfig strips it) and excludes `e2e/` (type-checked separately via `ts-jest`/jest globals). |
24
+ | `app.json` | `{ name, displayName }` — RN's own app manifest. **Not parameterized in this pass** (see below). |
25
+ | `css.d.ts` | Ambient `declare module '*.css'` / a generic `*.module.css` fallback type, for a `.module.css` import that has no generated per-file `.d.ts` yet (see `css-dts` below). Mirrors `examples/react/css.d.ts` and `examples/angular/css.d.ts` verbatim in spirit. |
26
+ | `vue-runtime-core.d.ts` | Re-exports `'vue'` from `'@vue/runtime-core'` — the app's actual runtime dependency is `@vue/runtime-core` (lighter, no `runtime-dom`), but SFC `<script>` blocks idiomatically `import { ref } from 'vue'`; this ambient module bridges the two without a real `vue` runtime dependency. |
27
+ | `.eslintrc.js` | `{ root: true, extends: '@react-native' }` — the stock RN lint config, no SFC/Vue-specific rule. |
28
+ | `.prettierrc.js` | Formatting only (`arrowParens`, `singleQuote`, `trailingComma`) — project-wide convention, not app content. |
29
+ | `.watchmanconfig` | Empty `{}` — Metro/Watchman boilerplate every RN app ships. |
30
+ | `.gitignore` | Stock RN app gitignore (Xcode/Gradle build artifacts, `node_modules`, CocoaPods, Metro health-check files, etc.). |
31
+
32
+ ## The `.vue` Metro transformer — the one SFC-specific piece
33
+
34
+ `metro.config.js` points `transformer.babelTransformerPath` at
35
+ `@symbiote-native/vue/metro-vue-transformer` — a subpath the `@symbiote-native/vue` package ships
36
+ itself (`adapters/vue/metro-vue-transformer.cjs`), so **no local transformer file needs to be
37
+ authored or copied** into this template; requiring it by package subpath is the entire wiring.
38
+ This one function does three things on the way into the bundle:
39
+
40
+ 1. Compiles every `.vue` SFC (`@vue/compiler-sfc`'s `compileScript`/`compileTemplate`) into a
41
+ plain JS module the Vue adapter's renderer can mount.
42
+ 2. Reads each SFC's `<style>`/`<style scoped>`/`<style module>` block (via
43
+ `descriptor.styles`, not a hand-rolled regex extractor) and compiles it at build time into a
44
+ `registerStyles({...})` call prepended to the module — the same runtime style registry every
45
+ adapter shares (`core/engine/src/style-registry`).
46
+ 3. Also handles standalone `.css`/`.scss`/`.sass`/`.less`/`.styl` files reached via the
47
+ `resolver.sourceExts` list (Vue's transformer is the one file in this app that has to
48
+ disambiguate SFC-inline styles from standalone stylesheet imports, since Metro allows only
49
+ one `babelTransformerPath`).
50
+
51
+ Full mechanism — `scoped` class suffixing, `:global()`, CSS Modules, the preprocessor layer —
52
+ is documented in the `symbiote-sfc-style-compiler` skill; not re-derived here.
53
+
54
+ **Why `@symbiote-native/css-parser` is a devDependency of the app but the Metro transformer
55
+ doesn't need it directly**: `@symbiote-native/css-parser` is a regular `dependency` of the
56
+ `@symbiote-native/vue` package itself (confirmed in `adapters/vue/package.json`) — the transformer
57
+ above resolves it from there, not from this app's own `node_modules`. The app needs its own copy
58
+ only for **TypeScript tooling that runs outside Metro entirely**: the
59
+ `@symbiote-native/css-parser/typescript-plugin` entry in `tsconfig.json`'s `compilerOptions.plugins`
60
+ (live in-editor `.module.css` autocomplete) and the `css-dts` CLI wired as this app's
61
+ `pretypecheck` script (on-disk `.d.ts` generation, the `tsc`/CI-time source of truth for
62
+ `.module.css` typo-catching) — both are plugins/binaries a project depends on directly by
63
+ convention, never routed through a UI-framework package. Verified by reading the real import
64
+ statements in `metro.config.js` and the adapter's own `package.json`, not guessed.
65
+
66
+ ## What was deliberately excluded
67
+
68
+ - **App-authored content** (explicitly out of scope per the task): `App.vue`, `App.css`,
69
+ `components/`, `screens/`, `navigation-lines.ts`, `navigation-linking.ts`, `routes.ts`,
70
+ `e2e/`, `assets/`, `package-lock.json`.
71
+ - **`Gemfile`** — CocoaPods/Ruby dependency pinning for the iOS native build. This is native
72
+ tooling, not a JS-level concern, and belongs (if anywhere) alongside `Podfile`/`Podfile.lock`
73
+ in `templates/native/ios/` — a directory this pass was explicitly told not to touch.
74
+ `templates/native/ios/` currently has no `Gemfile` either; that's a native-template gap outside
75
+ this pass's scope, not something to route around by stashing it here.
76
+ <br>*(judgment call — the task listed this as one of the borderline files to decide.)*
77
+ - **`detox.config.js`** — its `testRunner.args.config` points at `e2e/jest.config.js`, and
78
+ `e2e/` is explicitly excluded app content, so copying it verbatim would ship a config that
79
+ points at a folder that doesn't exist in the scaffold. It also hardcodes the demo app's Xcode
80
+ scheme/workspace name (`Canary`) throughout its build paths — the same parameterization gap
81
+ called out for `app.json` below, but deeper (baked into multiple shell command strings, not one
82
+ JSON field), so it can't be "left literal for now" the same low-risk way `app.json` can. Real
83
+ e2e scaffolding for generated apps is follow-up work, once `e2e/`'s own template shape is
84
+ decided.
85
+ <br>*(judgment call — the task listed this as one of the borderline files to decide.)*
86
+
87
+ ## `package.json.fragment.json`
88
+
89
+ A dependency **fragment**, not a full `package.json` (this folder is not itself an npm package —
90
+ `new`'s generation logic will splice this into the generated app's real `package.json` once
91
+ implemented). Versions pulled verbatim from `examples/vue-sfc/package.json`, the real working
92
+ app:
93
+
94
+ - **`dependencies`**: `@symbiote-native/vue`, `@symbiote-native/engine`, `@vue/runtime-core`,
95
+ `react`, `react-native`. `@symbiote-native/engine` is included beyond the task's literal
96
+ starter list because it's a real `peerDependency` of `@symbiote-native/vue`
97
+ (`adapters/vue/package.json`) — omitting it would ship a scaffold with an unmet peer dep.
98
+ `@vue/runtime-core` and `react`/`react-native` are the runtime-singleton pins (same class as
99
+ the root `CLAUDE.md`'s `react_native_is_an_explicit_top_level_peer` invariant — one copy,
100
+ declared at the app root, Metro's version anchor).
101
+ - **`devDependencies`**: `vue` (types/tooling only — `vue-tsc` and the `vue-runtime-core.d.ts`
102
+ bridge; the actual runtime import is `@vue/runtime-core`), `vue-tsc` (the `typecheck` script),
103
+ `@symbiote-native/css-parser` (the TS plugin + `css-dts`, see above).
104
+
105
+ Deliberately **not** included, despite appearing in `examples/vue-sfc/package.json`:
106
+ `@symbiote-native/android`, `@symbiote-native/components`, `@symbiote-native/navigation`,
107
+ `@symbiote-native/slider`, `@symbiote-native/splash-screen` — these are optional feature
108
+ packages the example app's demo screens happen to showcase (navigation, a slider, a splash
109
+ screen, Android host-shim modules), not part of the minimal bootstrap seam every app needs. An
110
+ app that wants them installs them itself (or via a future `@symbiote-native/cli add`), same as any
111
+ other opt-in `@symbiote-native/*` package.
112
+
113
+ ## Known gaps, carried forward honestly
114
+
115
+ - **No app-name/bundle-id parameterization yet.** `app.json`'s `name`/`displayName` fields are
116
+ still the literal `"Canary"` example value, copied verbatim as instructed. Templating
117
+ (`ejs`-based, per `templates/README.md`) is real follow-up work for `new.ts`'s actual
118
+ generation logic — `new`/`add` both still throw `NotImplementedCommandError` as of this pass.
119
+ - **No TSX-vs-SFC selection yet.** `@symbiote-native/cli new --framework vue` currently has no flag
120
+ or prompt to choose between this template and `templates/js/vue-tsx/` — both exist as real,
121
+ divergent precedents, but the selection UX (a `--variant`/`--sfc` flag? an interactive prompt
122
+ when `--framework vue` is given with no further qualifier?) hasn't been designed. This is
123
+ flagged in the `symbiote-create-cli` skill as a known open gap, not silently defaulted to
124
+ either flavor.
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "Canary",
3
+ "displayName": "Canary"
4
+ }
@@ -0,0 +1,24 @@
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
+ module.exports = {
22
+ presets: ['module:@react-native/babel-preset'],
23
+ plugins: [inlineDebugFlag],
24
+ };
@@ -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.config.js) into a registerStyles() call; there's no runtime export to type. Mirrors
4
+ // 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 `vue-tsc` outside a file
16
+ // 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/css-parser/typescript-plugin` entry in tsconfig.json's `compilerOptions.plugins`
19
+ // gives the SAME per-file literal-key typing live in the editor — plugins never load for a
20
+ // standalone `tsc`/`vue-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,48 @@
1
+ const reactNativeFlatConfig = require('@react-native/eslint-config/flat');
2
+ const vue = require('eslint-plugin-vue');
3
+ const tsParser = require('@typescript-eslint/parser');
4
+
5
+ // `@react-native/eslint-config/flat` has no `files` pattern covering `.vue` at all, so ESLint's
6
+ // flat-config default (only recognized JS-like extensions unless a config explicitly opts a file
7
+ // in) reports every `.vue` file "ignored because of a matching ignore pattern" — same root cause
8
+ // and fix as examples/svelte's own eslint.config.js.
9
+ module.exports = [
10
+ ...reactNativeFlatConfig,
11
+ ...vue.configs['flat/recommended'],
12
+ {
13
+ // `<script lang="ts">` needs a real TS parser inside the SFC, or every type annotation in the
14
+ // block is a syntax error to vue-eslint-parser's own (JS-only) script sub-parser.
15
+ files: ['**/*.vue'],
16
+ languageOptions: {
17
+ parserOptions: { parser: tsParser },
18
+ },
19
+ rules: {
20
+ // `@react-native/eslint-config`'s react-hooks plugin pattern-matches any `use*`-named call
21
+ // as a React Hook. Vue composables (`useNavigation`, `useIsFocused`, …) share that naming
22
+ // convention by accident of both ecosystems' idiom, and are not React Hooks — the rule has
23
+ // no way to tell the two apart, so it is a standing false positive on every `.vue` file.
24
+ 'react-hooks/rules-of-hooks': 'off',
25
+ // The `**/*.ts`/`**/*.tsx` block in this same config turns `no-undef` off — typescript-eslint's
26
+ // own recommendation, since a plain (non-type-aware) ESLint rule cannot see ambient globals a
27
+ // `.d.ts` lib declares (`performance`, RN's own globals, …) and false-flags every one of them.
28
+ // `.vue`'s `<script lang="ts">` isn't matched by that glob, so it needs the same override here.
29
+ 'no-undef': 'off',
30
+ // Our own primitives take RN's exact camelCase prop names (`testID`, `onPress`, …), never DOM
31
+ // attributes — hyphenating them is not just unwanted, it silently produces a DIFFERENT wrong
32
+ // prop when auto-fixed (`testID` -> `test-i-d`, not `test-id`, since the rule's fixer does not
33
+ // know these are camelCase words rather than a single unhyphenated one).
34
+ 'vue/attribute-hyphenation': 'off',
35
+ // The rule's "is this a component" check does not know our lowercase custom host tags
36
+ // (`text`, `view`, …) are bare Fabric elements, not Vue components — so ANY `v-text`/`v-html`
37
+ // on one of them false-positives, not just a single call site.
38
+ 'vue/no-v-text-v-html-on-component': 'off',
39
+ },
40
+ },
41
+ {
42
+ // Deliberately re-exports FROM `@vue/runtime-core` to declare the ambient `'vue'` module —
43
+ // that IS the fix `vue/prefer-import-from-vue` would otherwise ask for, so the rule can never
44
+ // be satisfied here without breaking the file's one job.
45
+ files: ['vue-runtime-core.d.ts'],
46
+ rules: { 'vue/prefer-import-from-vue': 'off' },
47
+ },
48
+ ];
@@ -0,0 +1,13 @@
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.
7
+ */
8
+
9
+ import { createApp } from '@symbiote-native/vue/bootstrap';
10
+ import App from './App';
11
+ import { name as appName } from './app.json';
12
+
13
+ createApp(App).mount(appName);
@@ -0,0 +1,30 @@
1
+ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
2
+
3
+ const projectRoot = __dirname;
4
+
5
+ const defaultConfig = getDefaultConfig(projectRoot);
6
+
7
+ /**
8
+ * @symbiote-native/* and @vue/runtime-core resolve as ordinary npm packages from this app's
9
+ * own node_modules (examples/* is a standalone npm install, decoupled from the monorepo's
10
+ * pnpm workspace — see pnpm-workspace.yaml). @react-native/babel-preset strips the types.
11
+ *
12
+ * @type {import('@react-native/metro-config').MetroConfig}
13
+ */
14
+ const config = {
15
+ // Compile .vue SFCs on the way into the bundle — @symbiote-native/vue ships the transformer
16
+ // itself, so no local wiring file is needed (see adapters/vue/metro-vue-transformer.cjs).
17
+ transformer: {
18
+ babelTransformerPath: require.resolve('@symbiote-native/vue/metro-vue-transformer'),
19
+ },
20
+ resolver: {
21
+ // Teach Metro that .vue and every style extension are source files (the transformer turns
22
+ // each into a module) — css/scss/sass/less/styl is the framework-agnostic standalone
23
+ // stylesheet/CSS-Modules path, shared with the React and Angular examples (see
24
+ // metro-css-transformer.js there); scss/sass/less/styl are optional preprocessor sources
25
+ // (see core/css-parser/src/preprocessors.ts).
26
+ sourceExts: [...defaultConfig.resolver.sourceExts, 'vue', 'css', 'scss', 'sass', 'less', 'styl'],
27
+ },
28
+ };
29
+
30
+ 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
+ "eslint-plugin-vue": "^10.11.0",
22
+ "@typescript-eslint/parser": "^8.70.0",
23
+ "@react-native/babel-preset": "0.86.0",
24
+ "@react-native/metro-config": "0.86.0"
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,18 @@
1
+ {
2
+ "extends": "@react-native/typescript-config",
3
+ "compilerOptions": {
4
+ "types": [],
5
+ "plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
6
+ },
7
+ // Points vue-tsc/Volar's virtual codegen at OUR package instead of Vue's default "vue" - see
8
+ // adapters/vue/src/index.ts's comment on the `export * from 'vue'` this depends on. Without it,
9
+ // view/text/image/switch (the 4 tags colliding with real SVG element names) type-check against
10
+ // Vue's own SVGAttributes in every .vue template. Lives HERE, not only in tsconfig.typecheck.json:
11
+ // the editor's Volar resolves the plain tsconfig.json, not the CLI's typecheck config, so a copy
12
+ // stuck in the latter only fixes `npm run typecheck` and leaves every live hover/error wrong.
13
+ "vueCompilerOptions": {
14
+ "lib": "@symbiote-native/vue"
15
+ },
16
+ "include": ["**/*.ts", "**/*.tsx", "**/*.vue"],
17
+ "exclude": ["**/node_modules", "**/Pods", "e2e"]
18
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "comment": "vue-tsc typecheck of the app + SFC components. @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
+ },
7
+ "exclude": ["**/node_modules", "**/Pods", "e2e"]
8
+ }
@@ -0,0 +1,3 @@
1
+ declare module 'vue' {
2
+ export * from '@vue/runtime-core';
3
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ arrowParens: 'avoid',
3
+ singleQuote: true,
4
+ trailingComma: 'all',
5
+ };
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,89 @@
1
+ :root {
2
+ --ink: #0b1622;
3
+ --paper: #13243a;
4
+ --mist: #41506a;
5
+ --chalk: #cbd5e1;
6
+ --chalk-bright: #ffffff;
7
+ --brand: #42b883;
8
+ }
9
+
10
+ .screen {
11
+ flex: 1;
12
+ background-color: var(--ink);
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 24px;
16
+ padding: 24px 32px;
17
+ }
18
+
19
+ .brand-row {
20
+ flex-direction: row;
21
+ align-items: center;
22
+ gap: 28px;
23
+ }
24
+
25
+ .brand-logo {
26
+ height: 64px;
27
+ }
28
+
29
+ /* aspect-ratio matches each source PNG's real pixel proportions — a shared square box would
30
+ stretch them off their real shape. */
31
+ .brand-logo-react {
32
+ aspect-ratio: 1.0977;
33
+ }
34
+
35
+ .brand-logo-vue {
36
+ aspect-ratio: 1.1542;
37
+ }
38
+
39
+ .plus-icon {
40
+ width: 48px;
41
+ height: 48px;
42
+ }
43
+
44
+ .title {
45
+ color: var(--chalk-bright);
46
+ font-size: 22px;
47
+ font-weight: bold;
48
+ text-align: center;
49
+ }
50
+
51
+ .subtitle {
52
+ color: var(--chalk);
53
+ font-size: 14px;
54
+ text-align: center;
55
+ }
56
+
57
+ .counter-card {
58
+ align-items: center;
59
+ gap: 4px;
60
+ padding: 20px 28px;
61
+ border-radius: 16px;
62
+ background-color: var(--paper);
63
+ }
64
+
65
+ .counter-label {
66
+ color: var(--mist);
67
+ font-size: 12px;
68
+ letter-spacing: 1px;
69
+ }
70
+
71
+ .counter-value {
72
+ color: var(--brand);
73
+ font-size: 32px;
74
+ font-weight: bold;
75
+ }
76
+
77
+ .button-primary {
78
+ align-items: center;
79
+ justify-content: center;
80
+ border-radius: 12px;
81
+ padding: 14px 22px;
82
+ background-color: var(--brand);
83
+ }
84
+
85
+ .button-primary-text {
86
+ color: var(--ink);
87
+ font-size: 15px;
88
+ font-weight: bold;
89
+ }
@@ -0,0 +1,40 @@
1
+ import { ref } from '@vue/runtime-core';
2
+ import './App.css';
3
+
4
+ export default {
5
+ setup() {
6
+ const count = ref(0);
7
+ return () => (
8
+ <safe-area-view class="screen">
9
+ <view class="brand-row">
10
+ <image
11
+ class="brand-logo brand-logo-react"
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image
16
+ class="plus-icon"
17
+ resizeMode="contain"
18
+ source={require('./assets/plus-icon.png')}
19
+ />
20
+ <image
21
+ class="brand-logo brand-logo-vue"
22
+ resizeMode="contain"
23
+ source={require('./assets/vue-logo.png')}
24
+ />
25
+ </view>
26
+ <text class="title">Welcome to SymbioteNative!</text>
27
+ <text class="subtitle">Framework-agnostic React Native, driven by Vue.</text>
28
+
29
+ <view class="counter-card">
30
+ <text class="counter-label">TAPS</text>
31
+ <text class="counter-value">{count.value}</text>
32
+ </view>
33
+
34
+ <pressable class="button-primary" onPress={() => count.value++}>
35
+ <text class="button-primary-text">Tap me</text>
36
+ </pressable>
37
+ </safe-area-view>
38
+ );
39
+ },
40
+ };
@@ -0,0 +1,40 @@
1
+ import { ref } from '@vue/runtime-core';
2
+ import './App.css';
3
+
4
+ export default {
5
+ setup() {
6
+ const count = ref(0);
7
+ return () => (
8
+ <safe-area-view class="screen">
9
+ <view class="brand-row">
10
+ <image
11
+ class="brand-logo brand-logo-react"
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image
16
+ class="plus-icon"
17
+ resizeMode="contain"
18
+ source={require('./assets/plus-icon.png')}
19
+ />
20
+ <image
21
+ class="brand-logo brand-logo-vue"
22
+ resizeMode="contain"
23
+ source={require('./assets/vue-logo.png')}
24
+ />
25
+ </view>
26
+ <text class="title">Welcome to SymbioteNative!</text>
27
+ <text class="subtitle">Framework-agnostic React Native, driven by Vue.</text>
28
+
29
+ <view class="counter-card">
30
+ <text class="counter-label">TAPS</text>
31
+ <text class="counter-value">{count.value}</text>
32
+ </view>
33
+
34
+ <pressable class="button-primary" onPress={() => count.value++}>
35
+ <text class="button-primary-text">Tap me</text>
36
+ </pressable>
37
+ </safe-area-view>
38
+ );
39
+ },
40
+ };