@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.
- package/LICENSE +21 -0
- package/README.md +492 -0
- package/bundle.js +2833 -0
- package/package.json +49 -0
- package/src/index.ts +70 -0
- package/templates/README.md +93 -0
- package/templates/js/angular/.prettierrc.js +5 -0
- package/templates/js/angular/.watchmanconfig +1 -0
- package/templates/js/angular/README.md +117 -0
- package/templates/js/angular/app.json +4 -0
- package/templates/js/angular/babel.config.js +34 -0
- package/templates/js/angular/index.js +12 -0
- package/templates/js/angular/metro.config.js +38 -0
- package/templates/js/angular/package.json.fragment.json +29 -0
- package/templates/js/angular/src/App.css +89 -0
- package/templates/js/angular/src/App.ts +40 -0
- package/templates/js/angular/src/assets/angular-logo.png +0 -0
- package/templates/js/angular/src/assets/angular-logo@2x.png +0 -0
- package/templates/js/angular/src/assets/angular-logo@3x.png +0 -0
- package/templates/js/angular/src/assets/plus-icon.png +0 -0
- package/templates/js/angular/src/assets/plus-icon@2x.png +0 -0
- package/templates/js/angular/src/assets/plus-icon@3x.png +0 -0
- package/templates/js/angular/src/assets/react-native-logo.png +0 -0
- package/templates/js/angular/src/assets/react-native-logo@2x.png +0 -0
- package/templates/js/angular/src/assets/react-native-logo@3x.png +0 -0
- package/templates/js/angular/src/css.d.ts +23 -0
- package/templates/js/angular/tsconfig.angular.json +42 -0
- package/templates/js/angular/tsconfig.json +17 -0
- package/templates/js/react/.prettierrc.js +5 -0
- package/templates/js/react/.watchmanconfig +1 -0
- package/templates/js/react/App.css +69 -0
- package/templates/js/react/App.jsx +27 -0
- package/templates/js/react/App.tsx +27 -0
- package/templates/js/react/README.md +116 -0
- package/templates/js/react/app.json +4 -0
- package/templates/js/react/assets/react-native-logo.png +0 -0
- package/templates/js/react/assets/react-native-logo@2x.png +0 -0
- package/templates/js/react/assets/react-native-logo@3x.png +0 -0
- package/templates/js/react/babel.config.js +24 -0
- package/templates/js/react/css.d.ts +24 -0
- package/templates/js/react/index.js +14 -0
- package/templates/js/react/metro.config.js +29 -0
- package/templates/js/react/package.json.fragment.json +22 -0
- package/templates/js/react/package.json.fragment.typescript.json +11 -0
- package/templates/js/react/tsconfig.json +18 -0
- package/templates/js/solid/.prettierrc.js +5 -0
- package/templates/js/solid/.watchmanconfig +1 -0
- package/templates/js/solid/App.css +89 -0
- package/templates/js/solid/App.jsx +35 -0
- package/templates/js/solid/App.tsx +35 -0
- package/templates/js/solid/README.md +18 -0
- package/templates/js/solid/app.json +4 -0
- package/templates/js/solid/assets/plus-icon.png +0 -0
- package/templates/js/solid/assets/plus-icon@2x.png +0 -0
- package/templates/js/solid/assets/plus-icon@3x.png +0 -0
- package/templates/js/solid/assets/react-native-logo.png +0 -0
- package/templates/js/solid/assets/react-native-logo@2x.png +0 -0
- package/templates/js/solid/assets/react-native-logo@3x.png +0 -0
- package/templates/js/solid/assets/solid-logo.png +0 -0
- package/templates/js/solid/assets/solid-logo@2x.png +0 -0
- package/templates/js/solid/assets/solid-logo@3x.png +0 -0
- package/templates/js/solid/babel.config.js +29 -0
- package/templates/js/solid/css.d.ts +20 -0
- package/templates/js/solid/eslint.config.js +3 -0
- package/templates/js/solid/index.js +13 -0
- package/templates/js/solid/metro.config.js +50 -0
- package/templates/js/solid/package.json.fragment.json +23 -0
- package/templates/js/solid/package.json.fragment.typescript.json +11 -0
- package/templates/js/solid/tsconfig.json +11 -0
- package/templates/js/svelte/.prettierrc.js +15 -0
- package/templates/js/svelte/.watchmanconfig +1 -0
- package/templates/js/svelte/App.svelte +123 -0
- package/templates/js/svelte/App.typescript.svelte +123 -0
- package/templates/js/svelte/README.md +18 -0
- package/templates/js/svelte/app.json +4 -0
- package/templates/js/svelte/babel.config.js +22 -0
- package/templates/js/svelte/css.d.ts +21 -0
- package/templates/js/svelte/eslint.config.js +37 -0
- package/templates/js/svelte/image-uris.js +8 -0
- package/templates/js/svelte/index.js +13 -0
- package/templates/js/svelte/metro.config.js +83 -0
- package/templates/js/svelte/package.json.fragment.json +26 -0
- package/templates/js/svelte/package.json.fragment.typescript.json +12 -0
- package/templates/js/svelte/svelte.config.js +47 -0
- package/templates/js/svelte/tsconfig.json +9 -0
- package/templates/js/svelte/tsconfig.typecheck.json +4 -0
- package/templates/js/vue-sfc/.prettierrc.js +5 -0
- package/templates/js/vue-sfc/.watchmanconfig +1 -0
- package/templates/js/vue-sfc/App.typescript.vue +128 -0
- package/templates/js/vue-sfc/App.vue +128 -0
- package/templates/js/vue-sfc/README.md +124 -0
- package/templates/js/vue-sfc/app.json +4 -0
- package/templates/js/vue-sfc/assets/plus-icon.png +0 -0
- package/templates/js/vue-sfc/assets/plus-icon@2x.png +0 -0
- package/templates/js/vue-sfc/assets/plus-icon@3x.png +0 -0
- package/templates/js/vue-sfc/assets/react-native-logo.png +0 -0
- package/templates/js/vue-sfc/assets/react-native-logo@2x.png +0 -0
- package/templates/js/vue-sfc/assets/react-native-logo@3x.png +0 -0
- package/templates/js/vue-sfc/assets/vue-logo.png +0 -0
- package/templates/js/vue-sfc/assets/vue-logo@2x.png +0 -0
- package/templates/js/vue-sfc/assets/vue-logo@3x.png +0 -0
- package/templates/js/vue-sfc/babel.config.js +24 -0
- package/templates/js/vue-sfc/css.d.ts +24 -0
- package/templates/js/vue-sfc/eslint.config.js +48 -0
- package/templates/js/vue-sfc/index.js +13 -0
- package/templates/js/vue-sfc/metro.config.js +30 -0
- package/templates/js/vue-sfc/package.json.fragment.json +26 -0
- package/templates/js/vue-sfc/package.json.fragment.typescript.json +11 -0
- package/templates/js/vue-sfc/tsconfig.json +18 -0
- package/templates/js/vue-sfc/tsconfig.typecheck.json +8 -0
- package/templates/js/vue-sfc/vue-runtime-core.d.ts +3 -0
- package/templates/js/vue-tsx/.prettierrc.js +5 -0
- package/templates/js/vue-tsx/.watchmanconfig +1 -0
- package/templates/js/vue-tsx/App.css +89 -0
- package/templates/js/vue-tsx/App.jsx +40 -0
- package/templates/js/vue-tsx/App.tsx +40 -0
- package/templates/js/vue-tsx/README.md +110 -0
- package/templates/js/vue-tsx/app.json +4 -0
- package/templates/js/vue-tsx/assets/plus-icon.png +0 -0
- package/templates/js/vue-tsx/assets/plus-icon@2x.png +0 -0
- package/templates/js/vue-tsx/assets/plus-icon@3x.png +0 -0
- package/templates/js/vue-tsx/assets/react-native-logo.png +0 -0
- package/templates/js/vue-tsx/assets/react-native-logo@2x.png +0 -0
- package/templates/js/vue-tsx/assets/react-native-logo@3x.png +0 -0
- package/templates/js/vue-tsx/assets/vue-logo.png +0 -0
- package/templates/js/vue-tsx/assets/vue-logo@2x.png +0 -0
- package/templates/js/vue-tsx/assets/vue-logo@3x.png +0 -0
- package/templates/js/vue-tsx/babel.config.js +67 -0
- package/templates/js/vue-tsx/css.d.ts +24 -0
- package/templates/js/vue-tsx/index.js +14 -0
- package/templates/js/vue-tsx/metro.config.js +42 -0
- package/templates/js/vue-tsx/package.json.fragment.json +26 -0
- package/templates/js/vue-tsx/package.json.fragment.typescript.json +11 -0
- package/templates/js/vue-tsx/tsconfig.json +15 -0
- package/templates/js/vue-tsx/tsconfig.typecheck.json +10 -0
- package/templates/js/vue-tsx/vue-jsx.d.ts +43 -0
- package/templates/js/vue-tsx/vue-runtime-core.d.ts +3 -0
- package/templates/layers/README.md +90 -0
- package/templates/layers/application/package.json.fragment.json +5 -0
- package/templates/layers/battery/package.json.fragment.json +5 -0
- package/templates/layers/brightness/package.json.fragment.json +5 -0
- package/templates/layers/cellular/package.json.fragment.json +5 -0
- package/templates/layers/clipboard/package.json.fragment.json +5 -0
- package/templates/layers/crypto/package.json.fragment.json +5 -0
- package/templates/layers/device/package.json.fragment.json +5 -0
- package/templates/layers/expo-modules/ios/Canary/Info.plist +66 -0
- package/templates/layers/expo-modules/package.json.fragment.json +9 -0
- package/templates/layers/haptics/package.json.fragment.json +5 -0
- package/templates/layers/keep-awake/package.json.fragment.json +5 -0
- package/templates/layers/local-auth/package.json.fragment.json +5 -0
- package/templates/layers/localization/package.json.fragment.json +5 -0
- package/templates/layers/navigation/app/angular/assets/angular-logo.png +0 -0
- package/templates/layers/navigation/app/angular/assets/angular-logo@2x.png +0 -0
- package/templates/layers/navigation/app/angular/assets/angular-logo@3x.png +0 -0
- package/templates/layers/navigation/app/angular/assets/plus-icon.png +0 -0
- package/templates/layers/navigation/app/angular/assets/plus-icon@2x.png +0 -0
- package/templates/layers/navigation/app/angular/assets/plus-icon@3x.png +0 -0
- package/templates/layers/navigation/app/angular/assets/react-native-logo.png +0 -0
- package/templates/layers/navigation/app/angular/assets/react-native-logo@2x.png +0 -0
- package/templates/layers/navigation/app/angular/assets/react-native-logo@3x.png +0 -0
- package/templates/layers/navigation/app/angular/src/App.css +129 -0
- package/templates/layers/navigation/app/angular/src/App.ts +31 -0
- package/templates/layers/navigation/app/angular/src/DetailsScreen.ts +24 -0
- package/templates/layers/navigation/app/angular/src/MenuScreen.ts +43 -0
- package/templates/layers/navigation/app/react/App.css +109 -0
- package/templates/layers/navigation/app/react/App.jsx +77 -0
- package/templates/layers/navigation/app/react/App.tsx +77 -0
- package/templates/layers/navigation/app/react/assets/react-native-logo.png +0 -0
- package/templates/layers/navigation/app/react/assets/react-native-logo@2x.png +0 -0
- package/templates/layers/navigation/app/react/assets/react-native-logo@3x.png +0 -0
- package/templates/layers/navigation/app/solid/App.css +129 -0
- package/templates/layers/navigation/app/solid/App.jsx +85 -0
- package/templates/layers/navigation/app/solid/App.tsx +85 -0
- package/templates/layers/navigation/app/solid/assets/plus-icon.png +0 -0
- package/templates/layers/navigation/app/solid/assets/plus-icon@2x.png +0 -0
- package/templates/layers/navigation/app/solid/assets/plus-icon@3x.png +0 -0
- package/templates/layers/navigation/app/solid/assets/react-native-logo.png +0 -0
- package/templates/layers/navigation/app/solid/assets/react-native-logo@2x.png +0 -0
- package/templates/layers/navigation/app/solid/assets/react-native-logo@3x.png +0 -0
- package/templates/layers/navigation/app/solid/assets/solid-logo.png +0 -0
- package/templates/layers/navigation/app/solid/assets/solid-logo@2x.png +0 -0
- package/templates/layers/navigation/app/solid/assets/solid-logo@3x.png +0 -0
- package/templates/layers/navigation/app/svelte/App.css +129 -0
- package/templates/layers/navigation/app/svelte/App.svelte +19 -0
- package/templates/layers/navigation/app/svelte/App.typescript.svelte +19 -0
- package/templates/layers/navigation/app/svelte/DetailsScreen.svelte +17 -0
- package/templates/layers/navigation/app/svelte/DetailsScreen.typescript.svelte +17 -0
- package/templates/layers/navigation/app/svelte/MenuScreen.svelte +40 -0
- package/templates/layers/navigation/app/svelte/MenuScreen.typescript.svelte +40 -0
- package/templates/layers/navigation/app/svelte/image-uris.js +8 -0
- package/templates/layers/navigation/app/vue-sfc/App.css +129 -0
- package/templates/layers/navigation/app/vue-sfc/App.typescript.vue +36 -0
- package/templates/layers/navigation/app/vue-sfc/App.vue +36 -0
- package/templates/layers/navigation/app/vue-sfc/DetailsScreen.typescript.vue +20 -0
- package/templates/layers/navigation/app/vue-sfc/DetailsScreen.vue +20 -0
- package/templates/layers/navigation/app/vue-sfc/MenuScreen.typescript.vue +52 -0
- package/templates/layers/navigation/app/vue-sfc/MenuScreen.vue +52 -0
- package/templates/layers/navigation/app/vue-sfc/assets/plus-icon.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@2x.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@3x.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@2x.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@3x.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/vue-logo.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@2x.png +0 -0
- package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@3x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/App.css +129 -0
- package/templates/layers/navigation/app/vue-tsx/App.jsx +91 -0
- package/templates/layers/navigation/app/vue-tsx/App.tsx +91 -0
- package/templates/layers/navigation/app/vue-tsx/assets/plus-icon.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@2x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@3x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@2x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@3x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/vue-logo.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@2x.png +0 -0
- package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@3x.png +0 -0
- package/templates/layers/navigation/package.json.fragment.json +5 -0
- package/templates/layers/network/package.json.fragment.json +5 -0
- package/templates/layers/screen-orientation/package.json.fragment.json +5 -0
- package/templates/layers/secure-store/package.json.fragment.json +5 -0
- package/templates/layers/sensors/package.json.fragment.json +5 -0
- package/templates/layers/sharing/package.json.fragment.json +5 -0
- package/templates/layers/slider/package.json.fragment.json +5 -0
- package/templates/layers/sms/package.json.fragment.json +5 -0
- package/templates/layers/splash-screen/native/android/app/src/main/AndroidManifest.xml +28 -0
- package/templates/layers/splash-screen/native/android/app/src/main/java/com/canary/MainActivity.kt +29 -0
- package/templates/layers/splash-screen/native/android/app/src/main/res/values/styles.xml +12 -0
- package/templates/layers/splash-screen/native/ios/Canary/AppDelegate.swift +54 -0
- package/templates/layers/splash-screen/package.json.fragment.json +5 -0
- package/templates/layers/standard-web-crypto/package.json.fragment.json +5 -0
- package/templates/layers/store-review/package.json.fragment.json +5 -0
- package/templates/layers/system-ui/package.json.fragment.json +5 -0
- package/templates/layers/testing/detox.config.js +42 -0
- package/templates/layers/testing/e2e/jest.config.js +21 -0
- package/templates/layers/testing/e2e/setup.ts +3 -0
- package/templates/layers/testing/e2e/smoke.test.ts +17 -0
- package/templates/layers/testing/e2e/tsconfig.json +7 -0
- package/templates/layers/testing/fragment/angular/package.json.fragment.json +18 -0
- package/templates/layers/testing/fragment/base/package.json.fragment.json +18 -0
- package/templates/layers/tracking-transparency/package.json.fragment.json +5 -0
- package/templates/layers/web-browser/package.json.fragment.json +5 -0
- package/templates/native/Gemfile +17 -0
- package/templates/native/README.md +48 -0
- package/templates/native/android/app/build.gradle +130 -0
- package/templates/native/android/app/debug.keystore +0 -0
- package/templates/native/android/app/proguard-rules.pro +10 -0
- package/templates/native/android/app/src/androidTest/java/com/canary/DetoxTest.java +29 -0
- package/templates/native/android/app/src/main/AndroidManifest.xml +28 -0
- package/templates/native/android/app/src/main/java/com/canary/MainActivity.kt +22 -0
- package/templates/native/android/app/src/main/java/com/canary/MainApplication.kt +27 -0
- package/templates/native/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
- package/templates/native/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- package/templates/native/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- package/templates/native/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- package/templates/native/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/templates/native/android/app/src/main/res/values/colors.xml +3 -0
- package/templates/native/android/app/src/main/res/values/strings.xml +3 -0
- package/templates/native/android/app/src/main/res/values/styles.xml +6 -0
- package/templates/native/android/build.gradle +33 -0
- package/templates/native/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/native/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/native/android/gradle.properties +44 -0
- package/templates/native/android/gradlew +248 -0
- package/templates/native/android/gradlew.bat +98 -0
- package/templates/native/android/settings.gradle +10 -0
- package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- package/templates/native/eslint.config.js +3 -0
- package/templates/native/ios/.xcode.env +11 -0
- package/templates/native/ios/Canary/AppDelegate.swift +48 -0
- package/templates/native/ios/Canary/BootSplash.storyboard +46 -0
- package/templates/native/ios/Canary/Colors.xcassets/BootSplashBackground-498e55.colorset/Contents.json +20 -0
- package/templates/native/ios/Canary/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/Contents.json +23 -0
- package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- package/templates/native/ios/Canary/Images.xcassets/Contents.json +6 -0
- package/templates/native/ios/Canary/Info.plist +60 -0
- package/templates/native/ios/Canary/LaunchScreen.storyboard +47 -0
- package/templates/native/ios/Canary/PrivacyInfo.xcprivacy +37 -0
- package/templates/native/ios/Canary.xcodeproj/project.pbxproj +504 -0
- package/templates/native/ios/Canary.xcodeproj/xcshareddata/xcschemes/Canary.xcscheme +88 -0
- package/templates/native/ios/Canary.xcworkspace/contents.xcworkspacedata +10 -0
- package/templates/native/ios/Podfile +34 -0
- package/templates/native/package.json.fragment.json +22 -0
- package/templates/native/package.json.fragment.typescript.json +8 -0
- package/templates/styling/js/angular/css-modules/src/App.ts +25 -0
- package/templates/styling/js/angular/stylesheet/src/App.ts +26 -0
- package/templates/styling/js/react/css-modules/App.jsx +15 -0
- package/templates/styling/js/react/css-modules/App.tsx +15 -0
- package/templates/styling/js/react/stylesheet/App.jsx +19 -0
- package/templates/styling/js/react/stylesheet/App.tsx +19 -0
- package/templates/styling/js/solid/css-modules/App.jsx +15 -0
- package/templates/styling/js/solid/css-modules/App.tsx +15 -0
- package/templates/styling/js/solid/stylesheet/App.jsx +19 -0
- package/templates/styling/js/solid/stylesheet/App.tsx +19 -0
- package/templates/styling/js/svelte/css-modules/App.svelte +12 -0
- package/templates/styling/js/svelte/css-modules/App.typescript.svelte +12 -0
- package/templates/styling/js/svelte/stylesheet/App.svelte +15 -0
- package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +15 -0
- package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +15 -0
- package/templates/styling/js/vue-sfc/css-modules/App.vue +15 -0
- package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +18 -0
- package/templates/styling/js/vue-sfc/stylesheet/App.vue +18 -0
- package/templates/styling/js/vue-tsx/css-modules/App.jsx +16 -0
- package/templates/styling/js/vue-tsx/css-modules/App.tsx +16 -0
- package/templates/styling/js/vue-tsx/stylesheet/App.jsx +20 -0
- package/templates/styling/js/vue-tsx/stylesheet/App.tsx +20 -0
- package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +17 -0
- package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +22 -0
- package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +18 -0
- package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +23 -0
- package/templates/styling/navigation/react/css-modules/App.jsx +32 -0
- package/templates/styling/navigation/react/css-modules/App.tsx +32 -0
- package/templates/styling/navigation/react/stylesheet/App.jsx +36 -0
- package/templates/styling/navigation/react/stylesheet/App.tsx +36 -0
- package/templates/styling/navigation/solid/css-modules/App.jsx +32 -0
- package/templates/styling/navigation/solid/css-modules/App.tsx +32 -0
- package/templates/styling/navigation/solid/stylesheet/App.jsx +36 -0
- package/templates/styling/navigation/solid/stylesheet/App.tsx +36 -0
- package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +7 -0
- package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +7 -0
- package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +13 -0
- package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +13 -0
- package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +11 -0
- package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +11 -0
- package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +16 -0
- package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +16 -0
- package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +9 -0
- package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +9 -0
- package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +15 -0
- package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +15 -0
- package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +13 -0
- package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +13 -0
- package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +18 -0
- package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +18 -0
- package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +34 -0
- package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +34 -0
- package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +38 -0
- 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.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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,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 @@
|
|
|
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
|
+
};
|