@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,110 @@
|
|
|
1
|
+
# templates/js/vue-tsx
|
|
2
|
+
|
|
3
|
+
Per-framework JS-level overlay for a Vue-**TSX**-flavored generated app (`.tsx` + JSX,
|
|
4
|
+
`@vue/babel-plugin-jsx` — as opposed to `templates/js/vue-sfc`'s `.vue` single-file-component
|
|
5
|
+
flavor). Combined at generation time with the shared `templates/native/{ios,android}` shell.
|
|
6
|
+
Source: `examples/vue-tsx/` (root-level files only — its `ios/`/`android/` are already covered
|
|
7
|
+
by the shared native template).
|
|
8
|
+
|
|
9
|
+
## Copied files
|
|
10
|
+
|
|
11
|
+
Every file below is bootstrap/tooling/config: identical (or safe-to-reuse-verbatim) in any new
|
|
12
|
+
SymbioteNative Vue-TSX app, regardless of what screens the app author writes on top.
|
|
13
|
+
|
|
14
|
+
| File | Why it belongs in the seam |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `index.js` | Entry point — `createApp(App).mount(appName)` via `@symbiote-native/vue/bootstrap`. Wires the native-host seam + RN's `AppRegistry`; every generated app needs this exact boilerplate (only `App` and `app.json`'s `name` vary, and both are supplied separately). |
|
|
17
|
+
| `metro.config.js` | Metro config. **Vue-TSX-specific**, not a copy of React's: sets `babelTransformerPath` to `@symbiote-native/vue/metro-css-parser` (not React's `@symbiote-native/react/metro-css-parser`), and adds a `resolver.extraNodeModules` alias mapping the bare `vue` specifier to this app's installed `@vue/runtime-core` — needed because `@vue/babel-plugin-jsx`'s generated helper imports say `from 'vue'`, but the app never installs the `vue` runtime package itself (see the dependency fragment below). |
|
|
18
|
+
| `babel.config.js` | **The file with the real TSX-vs-SFC-specific wiring** — see the dedicated section below. |
|
|
19
|
+
| `tsconfig.json` | Extends `@react-native/typescript-config`, adds the `@symbiote-native/css-parser/typescript-plugin` TS-server plugin (per-file `.module.css` literal-key typing in the editor). Same shape React/Angular use, just with the plugin swapped in. |
|
|
20
|
+
| `tsconfig.typecheck.json` | **Vue-TSX-specific.** A separate `vue-tsc` typecheck config with `jsx: "preserve"` and a `jsxFactory` pointed at a namespace (`VueJsx.createElement`) neither Vue nor React ever populate, purely to make TS's JSX-type-resolution algorithm fall through to the global `JSX` namespace declared in `vue-jsx.d.ts` (see that file's own comment for the exact TS-internal reason `declare global { namespace JSX {...} }` alone doesn't work). A `.vue`-SFC app has no equivalent file — the SFC compiler doesn't do JSX attribute excess-property checking the way TSX does. |
|
|
21
|
+
| `app.json` | RN app metadata (`name`, `displayName`). **Not parameterized** — see the explicit note below. |
|
|
22
|
+
| `css.d.ts` | Ambient module declarations for `*.css` (side-effect import) and the generic `*.module.css` fallback (before a real per-file generated `.d.ts` exists). Identical shape to `examples/react/css.d.ts` / `examples/angular/css.d.ts`. |
|
|
23
|
+
| `vue-jsx.d.ts` | **Vue-TSX-specific.** Declares the `VueJsx.JSX` namespace `tsconfig.typecheck.json`'s `jsxFactory` points at — `Element`, `ElementClass`, `ElementAttributesProperty`, and (load-bearing) an `IntrinsicAttributes` index signature, because several adapter components (`SafeAreaView`, `StatusBar`, `ActivityIndicator`, `Animated.*`) declare no `props` schema and forward everything through Vue's untyped `$attrs` fallthrough — without the index signature, TSX's excess-property check on those components would false-positive on every extra prop, whereas `.vue` SFCs never hit this at all (their template compiler doesn't excess-property-check against JSX's `IntrinsicAttributes`). |
|
|
24
|
+
| `vue-runtime-core.d.ts` | `declare module 'vue' { export * from '@vue/runtime-core' }` — makes the bare `'vue'` import specifier type-check even though the app only installs `@vue/runtime-core`, mirroring `metro.config.js`'s resolver alias at the type level. |
|
|
25
|
+
| `.eslintrc.js` | `extends: '@react-native'` — same base RN lint config every framework's overlay needs. |
|
|
26
|
+
| `.prettierrc.js` | Standard formatting (`arrowParens: 'avoid'`, `singleQuote: true`, `trailingComma: 'all'`) — framework-independent. |
|
|
27
|
+
| `.watchmanconfig` | Empty `{}` — Metro/Watchman boilerplate every RN app needs, framework-independent. |
|
|
28
|
+
| `.gitignore` | Standard RN `.gitignore` (Xcode/Gradle/CocoaPods/node_modules/Metro health-check files) — framework-independent. |
|
|
29
|
+
|
|
30
|
+
## The Vue-TSX-specific Babel/Metro wiring (read this before touching either file)
|
|
31
|
+
|
|
32
|
+
Compared against `examples/react/babel.config.js`, Vue TSX needs real JSX-pragma rewiring, not
|
|
33
|
+
just RN's stock preset:
|
|
34
|
+
|
|
35
|
+
- **Plugin order is load-bearing.** `babel.config.js`'s `plugins` array lists
|
|
36
|
+
`'@vue/babel-plugin-jsx'` FIRST. Babel runs `plugins` before `presets`, so the Vue plugin
|
|
37
|
+
rewrites every `JSXElement` into a `@vue/runtime-core` `createVNode()` call *before* the RN
|
|
38
|
+
preset's own React-JSX transform (pulled in via `presets: ['module:@react-native/babel-preset']`)
|
|
39
|
+
ever sees the file — by the time the React transform runs, there is no JSX left for it to
|
|
40
|
+
touch, so it silently no-ops. Reordering these would leave Vue JSX compiled as React
|
|
41
|
+
`createElement()` calls, which the Vue runtime cannot mount.
|
|
42
|
+
- **`stripReactJsxDevAttrs` is a real correctness fix, not cleanup.** The RN preset's dev
|
|
43
|
+
React-JSX transform injects `__self={this}` / `__source={...}` dev annotations on every
|
|
44
|
+
`JSXElement`; under React those are inert, but `@vue/babel-plugin-jsx` copies them verbatim
|
|
45
|
+
into the Vue vnode's `props`. At module scope `this` is the Hermes global `HostObject`, so any
|
|
46
|
+
Vue dev warning that tries to format that prop reads `Symbol.toStringTag` off the
|
|
47
|
+
`HostObject`, throws, and unwinds the whole mount into a blank screen. This plugin strips both
|
|
48
|
+
attributes on `JSXOpeningElement` exit (after the self/source plugins add them on enter, before
|
|
49
|
+
the Vue plugin reads attributes on the parent `JSXElement`'s exit).
|
|
50
|
+
- **`inlineDebugFlag`** is the same `DEBUG` env-var inlining every framework's `babel.config.js`
|
|
51
|
+
carries (see `<keep_logs_gate_behind_DEBUG>` in the root `CLAUDE.md`) — not TSX-specific, just
|
|
52
|
+
present here too.
|
|
53
|
+
- **`metro.config.js`'s `vue` → `@vue/runtime-core` alias is the resolver-level twin of the
|
|
54
|
+
Babel plugin order above**: the Vue plugin's generated helper imports say `from 'vue'`, but
|
|
55
|
+
this app never installs the `vue` runtime package as a dependency (only `@vue/runtime-core` —
|
|
56
|
+
see the dependency fragment). Without the alias, Metro would fail to resolve those bare `vue`
|
|
57
|
+
imports at bundle time.
|
|
58
|
+
|
|
59
|
+
## Deliberately excluded
|
|
60
|
+
|
|
61
|
+
- `App.tsx`, `App.css`, `components/`, `screens/`, `navigation-lines.ts`,
|
|
62
|
+
`navigation-linking.ts`, `routes.ts`, `assets/`, `e2e/`, `package-lock.json` — the example
|
|
63
|
+
app's own demo content, per the task scope. Not part of the scaffold seam.
|
|
64
|
+
- `package.json` (the full file) — not copied; only the dependency fragment below is.
|
|
65
|
+
- **`Gemfile`** — byte-identical to `examples/react/Gemfile` (verified via `diff`). It's Ruby/
|
|
66
|
+
CocoaPods toolchain config for the iOS build, framework-independent — conceptually it belongs
|
|
67
|
+
with the *shared* native shell (`templates/native/ios/`, which already has `Podfile`/
|
|
68
|
+
`Podfile.lock` but no `Gemfile`), not duplicated verbatim into every per-framework JS overlay.
|
|
69
|
+
Since this pass is scoped to `templates/js/vue-tsx/` only and must not touch `templates/
|
|
70
|
+
native/`, it's left out here — flagging it as a real gap for whoever wires the native+overlay
|
|
71
|
+
merge in `generate.ts` to close (add `Gemfile` to the shared native template once, not to
|
|
72
|
+
four JS overlays).
|
|
73
|
+
- **`detox.config.js`** — its `testRunner` points at `e2e/jest.config.js`, and its `binaryPath`/
|
|
74
|
+
`build` fields hardcode the app scheme (`Canary.xcworkspace`, `Canary.app`). Since `e2e/` is
|
|
75
|
+
excluded as app-authored test content, copying this file alone would ship a dead config with
|
|
76
|
+
no tests to run and no generic way to point it at a not-yet-generated app's real scheme name.
|
|
77
|
+
E2E scaffolding is a separate concern from this pass.
|
|
78
|
+
- **`vue-fragment.test.ts`** — a regression test for SymbioteNative's own Vue-adapter engine
|
|
79
|
+
internals (Fragment start/end anchor handling under the fake-Fabric test harness), ported from
|
|
80
|
+
a headless smoke test elsewhere in the monorepo. It verifies the *framework*, not something a
|
|
81
|
+
newly generated app needs; it isn't app code.
|
|
82
|
+
- **`tunnel-demo.ts`** — a `createTunnel()` demo singleton consumed only by the excluded
|
|
83
|
+
`screens/CanaryScreen.tsx`'s "Show toast" demo button. App-authored demo content, same
|
|
84
|
+
category as `App.tsx`.
|
|
85
|
+
|
|
86
|
+
## `package.json.fragment.json`
|
|
87
|
+
|
|
88
|
+
A dependency **fragment**, not a full `package.json` (this folder isn't an npm package itself).
|
|
89
|
+
Lists only the SymbioteNative-relevant `dependencies`/`devDependencies` a generated app's real
|
|
90
|
+
`package.json` needs, derived from what `index.js`, `metro.config.js`, `babel.config.js`,
|
|
91
|
+
`tsconfig.json`, and `tsconfig.typecheck.json` actually import/require/extend — not guessed.
|
|
92
|
+
Versions are pulled verbatim from `examples/vue-tsx/package.json`. Notably: the runtime
|
|
93
|
+
dependency is `@vue/runtime-core` (not the `vue` meta-package — see the Babel/Metro section
|
|
94
|
+
above for why), and `react-reconciler` is intentionally absent since it's the React adapter's
|
|
95
|
+
own driving mechanism, unused by Vue.
|
|
96
|
+
|
|
97
|
+
## Not yet parameterized
|
|
98
|
+
|
|
99
|
+
`app.json`'s `name`/`displayName` fields (`"Canary"`) are copied **literally**, as-is, from the
|
|
100
|
+
example app — no placeholder or templating scheme has been introduced. That's real follow-up
|
|
101
|
+
work for `@symbiote-native/cli new`'s actual generation logic, which still throws
|
|
102
|
+
`NotImplementedCommandError` as of this pass (see `packages/cli/README.md`'s
|
|
103
|
+
"What's real vs. stubbed" section).
|
|
104
|
+
|
|
105
|
+
## TSX vs SFC selection is not wired up yet
|
|
106
|
+
|
|
107
|
+
`@symbiote-native/cli new --framework vue` currently has no flag or prompt to choose between this
|
|
108
|
+
TSX overlay and `templates/js/vue-sfc`'s SFC flavor — both exist on disk, but nothing in
|
|
109
|
+
`src/commands/new.ts` or `src/prompts.ts` asks the user which one they want yet. Designing that
|
|
110
|
+
flag/prompt (and its default) is separate follow-up work, out of scope for this pass.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Inline `process.env.DEBUG` at bundle time so the @symbiote diagnostic logs can
|
|
2
|
+
// be toggled from the shell without a dependency:
|
|
3
|
+
// DEBUG=1 npx react-native start --reset-cache
|
|
4
|
+
// The value is read from Metro's own environment when this config is evaluated
|
|
5
|
+
// and baked into every transformed module (the app entry and the shared source).
|
|
6
|
+
const debugFlag = process.env.DEBUG === '1' ? '1' : '0';
|
|
7
|
+
|
|
8
|
+
function inlineDebugFlag({ types: t }) {
|
|
9
|
+
return {
|
|
10
|
+
name: 'inline-debug-flag',
|
|
11
|
+
visitor: {
|
|
12
|
+
MemberExpression(path) {
|
|
13
|
+
if (path.matchesPattern('process.env.DEBUG')) {
|
|
14
|
+
path.replaceWith(t.stringLiteral(debugFlag));
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// The RN preset's dev React-JSX transform injects __self={this} and __source={...} on every
|
|
22
|
+
// JSXElement. Under React they are inert dev annotations, but @vue/babel-plugin-jsx copies them
|
|
23
|
+
// verbatim into the Vue vnode's PROPS — and at module scope `this` is the Hermes global HostObject.
|
|
24
|
+
// Any Vue dev warn then formats that prop for its component trace, the formatter reads
|
|
25
|
+
// Symbol.toStringTag off the HostObject, that throws, and the throw unwinds the whole mount → blank
|
|
26
|
+
// screen. Strip both attributes on JSXOpeningElement exit: the self/source plugins add them on enter
|
|
27
|
+
// (so they exist by exit), and the Vue plugin reads attributes on JSXElement exit, which fires after
|
|
28
|
+
// this child-level exit — so the props never carry them.
|
|
29
|
+
function stripReactJsxDevAttrs() {
|
|
30
|
+
const DEV_ATTRS = new Set(['__self', '__source']);
|
|
31
|
+
return {
|
|
32
|
+
name: 'strip-react-jsx-dev-attrs',
|
|
33
|
+
visitor: {
|
|
34
|
+
JSXOpeningElement: {
|
|
35
|
+
exit(path) {
|
|
36
|
+
path.node.attributes = path.node.attributes.filter(
|
|
37
|
+
attr =>
|
|
38
|
+
!(
|
|
39
|
+
attr.type === 'JSXAttribute' &&
|
|
40
|
+
attr.name.type === 'JSXIdentifier' &&
|
|
41
|
+
DEV_ATTRS.has(attr.name.name)
|
|
42
|
+
),
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The Vue JSX pair comes from the adapter, not from a hand-written '@vue/babel-plugin-jsx' entry:
|
|
51
|
+
// it is the plugin PLUS the isCustomElement option that makes the `view`/`text`/… intrinsic tags
|
|
52
|
+
// compile to their lowered intrinsic element instead of to a Vue component instance each. Either
|
|
53
|
+
// half alone is broken — see @symbiote-native/vue/babel-jsx, which is why they arrive as one
|
|
54
|
+
// require() rather than two lines here. @vue/babel-plugin-jsx is a dependency of the adapter now,
|
|
55
|
+
// so a fresh install of a published @symbiote-native/vue brings it along; this app's own entry for
|
|
56
|
+
// it is redundant but harmless.
|
|
57
|
+
const symbioteVueJsx = require('@symbiote-native/vue/babel-jsx');
|
|
58
|
+
|
|
59
|
+
module.exports = {
|
|
60
|
+
presets: ['module:@react-native/babel-preset'],
|
|
61
|
+
// The Vue JSX pair is listed FIRST so it runs before the RN preset's React-JSX
|
|
62
|
+
// transform: babel applies `plugins` before `presets`, so the Vue plugin rewrites every
|
|
63
|
+
// JSXElement into a @vue/runtime-core createVNode call, leaving no JSX for the React
|
|
64
|
+
// transform to touch (it no-ops). The helper imports it injects come `from 'vue'`, which
|
|
65
|
+
// metro.config.js aliases to @vue/runtime-core, the one Vue runtime the adapter renders on.
|
|
66
|
+
plugins: [...symbioteVueJsx(), stripReactJsxDevAttrs, inlineDebugFlag],
|
|
67
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Ambient module for a plain, side-effect-only `.css` import (`import './App.css'`) —
|
|
2
|
+
// @symbiote-native/css-parser compiles it at build time (Metro's babelTransformerPath, see
|
|
3
|
+
// metro-css-transformer.js) into a registerStyles() call; there's no runtime export to type.
|
|
4
|
+
// Mirrors examples/react/css.d.ts and examples/angular/css.d.ts.
|
|
5
|
+
declare module '*.css';
|
|
6
|
+
|
|
7
|
+
// Same shape for the three optional preprocessor sources — css-parser reduces each to plain CSS
|
|
8
|
+
// before compiling, so a side-effect import of one is indistinguishable downstream from a `.css`
|
|
9
|
+
// one.
|
|
10
|
+
declare module '*.scss';
|
|
11
|
+
declare module '*.sass';
|
|
12
|
+
declare module '*.less';
|
|
13
|
+
declare module '*.styl';
|
|
14
|
+
|
|
15
|
+
// Generic (non-literal) fallback for a `.module.css` import — used by `tsc`/`vue-tsc` outside a
|
|
16
|
+
// file that already has its own generated `Card.module.css.d.ts` (see `css-dts`, wired to
|
|
17
|
+
// `pretypecheck`; a real per-file `.d.ts` takes priority over this wildcard once generated). The
|
|
18
|
+
// `@symbiote-native/vue/typescript-plugin` entry in tsconfig.json's `compilerOptions.plugins` gives the
|
|
19
|
+
// SAME per-file literal-key typing live in the editor — plugins never load for a standalone
|
|
20
|
+
// `tsc`/CI run, which is why both mechanisms exist side by side.
|
|
21
|
+
declare module '*.module.css' {
|
|
22
|
+
const styles: Record<string, string>;
|
|
23
|
+
export default styles;
|
|
24
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @format
|
|
3
|
+
*
|
|
4
|
+
* Symbiote Vue canary entry. createApp(App).mount(appName) wires the
|
|
5
|
+
* native-host seams and RN's own AppRegistry, then mounts via @symbiote-native/engine — RN's own
|
|
6
|
+
* renderer is never in the path. Same entry point as examples/vue-sfc, going through the
|
|
7
|
+
* shared AppRegistry seam like every other canary.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createApp } from '@symbiote-native/vue/bootstrap';
|
|
11
|
+
import App from './App';
|
|
12
|
+
import { name as appName } from './app.json';
|
|
13
|
+
|
|
14
|
+
createApp(App).mount(appName);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
|
|
3
|
+
|
|
4
|
+
const projectRoot = __dirname;
|
|
5
|
+
|
|
6
|
+
const defaultConfig = getDefaultConfig(projectRoot);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @symbiote-native/* and @vue/runtime-core resolve as ordinary npm packages from this app's
|
|
10
|
+
* own node_modules (examples/* is a standalone npm install, decoupled from the monorepo's
|
|
11
|
+
* pnpm workspace — see pnpm-workspace.yaml). @react-native/babel-preset strips the types.
|
|
12
|
+
*
|
|
13
|
+
* @type {import('@react-native/metro-config').MetroConfig}
|
|
14
|
+
*/
|
|
15
|
+
const runtimeCore = path.resolve(projectRoot, 'node_modules/@vue/runtime-core');
|
|
16
|
+
|
|
17
|
+
const config = {
|
|
18
|
+
// JSX is still compiled by @vue/babel-plugin-jsx via babel.config.js regardless of which
|
|
19
|
+
// transformer runs it (unlike the SFC canary, which needs a Metro transformer to compile
|
|
20
|
+
// .vue) — @symbiote-native/vue ships the standalone .css/.module.css transformer itself
|
|
21
|
+
// (same framework-agnostic path the React and Angular examples use via their own adapter's
|
|
22
|
+
// ./metro-css-parser export), so no local wiring file is needed here either.
|
|
23
|
+
transformer: {
|
|
24
|
+
babelTransformerPath: require.resolve('@symbiote-native/vue/metro-css-parser'),
|
|
25
|
+
},
|
|
26
|
+
resolver: {
|
|
27
|
+
// Teach Metro that a style file is a source file (the transformer turns it into a module).
|
|
28
|
+
// scss/sass/less/styl are optional SCSS/Sass/Less/Stylus preprocessor sources — see
|
|
29
|
+
// core/css-parser/src/preprocessors.ts.
|
|
30
|
+
sourceExts: [...defaultConfig.resolver.sourceExts, 'css', 'scss', 'sass', 'less', 'styl'],
|
|
31
|
+
extraNodeModules: {
|
|
32
|
+
// @vue/babel-plugin-jsx injects helper imports `from 'vue'`; there is no vue/runtime-dom
|
|
33
|
+
// in a native bundle, and this app never installs the `vue` package itself (only
|
|
34
|
+
// @vue/runtime-core), so the bare 'vue' specifier is aliased to the runtime-core
|
|
35
|
+
// singleton the adapter renders on (the resolver twin of the SFC transformer's
|
|
36
|
+
// 'vue'→runtime-core string rewrite).
|
|
37
|
+
vue: runtimeCore,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
module.exports = mergeConfig(defaultConfig, config);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scripts": {
|
|
3
|
+
"android": "react-native run-android",
|
|
4
|
+
"android:release": "react-native run-android --mode Release",
|
|
5
|
+
"ios": "react-native run-ios",
|
|
6
|
+
"ios:release": "react-native run-ios --mode Release",
|
|
7
|
+
"lint": "eslint .",
|
|
8
|
+
"start": "react-native start",
|
|
9
|
+
"dev": "react-native start --reset-cache"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@symbiote-native/android": "latest",
|
|
13
|
+
"@symbiote-native/vue": "latest",
|
|
14
|
+
"@symbiote-native/engine": "latest",
|
|
15
|
+
"@vue/runtime-core": "^3.5.13",
|
|
16
|
+
"react": "19.2.3",
|
|
17
|
+
"react-native": "0.86.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"vue": "^3.5.38",
|
|
21
|
+
"@vue/babel-plugin-jsx": "^1.5.0",
|
|
22
|
+
"@react-native/babel-preset": "0.86.0",
|
|
23
|
+
"@react-native/metro-config": "0.86.0",
|
|
24
|
+
"@symbiote-native/css-parser": "latest"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@react-native/typescript-config",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"types": [],
|
|
5
|
+
// Vue's JSX is compiled by @vue/babel-plugin-jsx, never by tsc — `preserve` leaves it alone
|
|
6
|
+
// and `jsxImportSource` only tells tsc whose JSX namespace to type-check against. Both
|
|
7
|
+
// override @react-native/typescript-config's React defaults, which would otherwise type
|
|
8
|
+
// every element here as React's.
|
|
9
|
+
"jsx": "preserve",
|
|
10
|
+
"jsxImportSource": "@symbiote-native/vue",
|
|
11
|
+
"plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
|
|
12
|
+
},
|
|
13
|
+
"include": ["**/*.ts", "**/*.tsx"],
|
|
14
|
+
"exclude": ["**/node_modules", "**/Pods", "e2e"]
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"comment": "vue-tsc typecheck of the app's Vue JSX (.tsx). @symbiote-native/* resolve to source (the monorepo's by-design source resolution), so this also re-checks adapter/engine source — `types: [node]` restores the runtime globals (setTimeout/process/console/queueMicrotask) the app tsconfig strips with `types: []`. e2e/ is excluded: Detox tests with jest globals, type-checked via ts-jest.",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"types": ["node"],
|
|
6
|
+
"jsx": "preserve",
|
|
7
|
+
"jsxFactory": "VueJsx.createElement"
|
|
8
|
+
},
|
|
9
|
+
"exclude": ["**/node_modules", "**/Pods", "e2e"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// TS's JSX type-checking algorithm resolves `JSX.*` types via the configured `jsxFactory`'s OWN
|
|
2
|
+
// namespace FIRST (default factory "React.createElement" → checks "React.JSX", which
|
|
3
|
+
// @types/react DOES export) and only falls back to a global `JSX` namespace when that lookup
|
|
4
|
+
// finds nothing. That priority order — not a declaration-merge conflict — is why a plain
|
|
5
|
+
// `declare global { namespace JSX {...} }` here had no effect: TS never got past the first check.
|
|
6
|
+
// The fix: point `jsxFactory` (tsconfig.typecheck.json) at a namespace React never touches
|
|
7
|
+
// (`VueJsx.createElement`, declared here) so `VueJsx.JSX` fails to resolve and TS falls through
|
|
8
|
+
// to the global `JSX` namespace below — which we DO control. Emit is unaffected (`"jsx": "preserve"`
|
|
9
|
+
// never calls the factory; @vue/babel-plugin-jsx already does the real transform in babel.config.js
|
|
10
|
+
// before React's own JSX plugin ever sees the file) — this is purely a type-checking concern.
|
|
11
|
+
import type { VNode } from '@vue/runtime-core';
|
|
12
|
+
|
|
13
|
+
declare global {
|
|
14
|
+
namespace VueJsx {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
16
|
+
namespace JSX {
|
|
17
|
+
interface Element extends VNode {}
|
|
18
|
+
interface ElementClass {
|
|
19
|
+
$props: {};
|
|
20
|
+
}
|
|
21
|
+
interface ElementAttributesProperty {
|
|
22
|
+
$props: {};
|
|
23
|
+
}
|
|
24
|
+
interface IntrinsicElements {
|
|
25
|
+
[name: string]: any;
|
|
26
|
+
}
|
|
27
|
+
// Index signature, not just `key`: several adapter components (SafeAreaView, StatusBar,
|
|
28
|
+
// ActivityIndicator, Animated.View/ScrollView accessed off the `Animated` namespace) declare
|
|
29
|
+
// NO `props` schema at all — they forward everything through Vue's untyped `$attrs`
|
|
30
|
+
// fallthrough by design (see adapters/vue/src/components/safe-area-view.ts's own comment).
|
|
31
|
+
// `.vue` SFCs never flag this (the template compiler doesn't excess-property-check against
|
|
32
|
+
// JSX's `IntrinsicAttributes`); TSX does, since JSX attribute checking always intersects a
|
|
33
|
+
// component's `$props` with this interface. Without the index signature here, passing
|
|
34
|
+
// `testID`/`class`/etc. to any of those attrs-passthrough components is a false-positive
|
|
35
|
+
// excess-property error, not a real type mismatch — the props genuinely do forward at runtime.
|
|
36
|
+
interface IntrinsicAttributes {
|
|
37
|
+
key?: string | number | symbol;
|
|
38
|
+
[name: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const VueJsx: { createElement: (...args: any[]) => any };
|
|
43
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# `templates/layers`
|
|
2
|
+
|
|
3
|
+
Framework-agnostic optional overlays, applied on top of `native/` + `js/<framework>` by
|
|
4
|
+
`--expo-modules` / `--navigation` / `--testing` / `--splash-screen` / `--slider` / one `--<id>`
|
|
5
|
+
flag per `EXPO_PACKAGE_LAYERS` entry (`src/expo-package-layers.ts`).
|
|
6
|
+
|
|
7
|
+
`expo-modules` is dependency-only, same regardless of `--framework` (diffing
|
|
8
|
+
`examples/expo-react` against `examples/react`, and checking `packages/navigation`'s
|
|
9
|
+
`peerDependencies`, showed a dependency-only addition with no framework-specific file content and
|
|
10
|
+
no native (`ios/`/`android/`) changes — see `packages/cli/README.md`'s "Design
|
|
11
|
+
decisions" section). It carries ONLY the core autolinking bits — `expo` and
|
|
12
|
+
`@symbiote-native/expo-modules-link` — never a specific Expo-backed package (2026-09-18): it used
|
|
13
|
+
to bundle all 21 `@symbiote-native/<expo-wrapper>` packages unconditionally, so picking any ONE of
|
|
14
|
+
them (or none at all) always installed every other one too. Each wrapper now has its OWN
|
|
15
|
+
`templates/layers/<id>/package.json.fragment.json` (`application`, `battery`, `brightness`,
|
|
16
|
+
`cellular`, `clipboard`, `crypto`, `device`, `haptics`, `keep-awake`, `local-auth`,
|
|
17
|
+
`localization`, `network`, `screen-orientation`, `secure-store`, `sensors`, `sharing`, `sms`,
|
|
18
|
+
`standard-web-crypto`, `store-review`, `system-ui`, `tracking-transparency`, `web-browser`) —
|
|
19
|
+
same dependency-only shape as `slider`, registered once in `EXPO_PACKAGE_LAYERS` so cli.ts's
|
|
20
|
+
`--<id>` flag, prompts.ts's multiselect option, and `detect-added-layers.ts`'s marker all derive
|
|
21
|
+
from that ONE table instead of 21 hand-written near-duplicates. `@symbiote-native/expo-modules-
|
|
22
|
+
link` (the "Expo-modules autolinking" feature) is never a SEPARATE explicit tick once one of these
|
|
23
|
+
21 is picked — it doesn't make sense to ask for autolinking twice, so `resolveFeatures` /
|
|
24
|
+
`resolveAddLayers` in `src/prompts.ts` fold `hasExpoModules` to true (or append the `expo-modules`
|
|
25
|
+
layer) automatically. (An earlier pass here also unconditionally added the raw npm `expo-linking`
|
|
26
|
+
package — reverted, 2026-09-18: checking the real installed `expo-battery`/`expo-web-browser`/
|
|
27
|
+
`expo-sharing`/`expo-store-review`/`expo-local-authentication`/`expo`/`expo-modules-autolinking`
|
|
28
|
+
`package.json`s found NONE of them depend on it. Nothing in this codebase's dependency graph
|
|
29
|
+
actually needs it, so it isn't shipped.)
|
|
30
|
+
|
|
31
|
+
`navigation` is NOT dependency-only (2026-09-15): besides `package.json.fragment.json`
|
|
32
|
+
(`@symbiote-native/navigation`, declaring every adapter as an optional peer itself), it carries an
|
|
33
|
+
`app/<framework>` subtree — a 2-screen `Stack` demo (Menu → Details) that OVERWRITES the base
|
|
34
|
+
`js/<framework>` App file, so `--navigation` demonstrates itself instead of silently doing
|
|
35
|
+
nothing visible. `src/generate.ts` renders `app/<framework>` as a separate call from the
|
|
36
|
+
package.json merge (see its own comment) — recursively copying the whole `navigation/` directory
|
|
37
|
+
would land every framework's `app/` folder on the generated root instead of just the selected
|
|
38
|
+
one.
|
|
39
|
+
|
|
40
|
+
`splash-screen` (2026-09-17) is the first layer that DOES carry native changes: a `native/`
|
|
41
|
+
subtree mirroring `templates/native`'s own layout (`native/android/...`, `native/ios/...`),
|
|
42
|
+
overlaid the same way `renderTemplate` already overlays `navigation`'s `app/<framework>` — no
|
|
43
|
+
`@expo/config-plugins` needed after all, because only 4 files actually require two variants.
|
|
44
|
+
`react-native-bootsplash` (vendored source checked via `/vendor`) has no setup codemod of its own
|
|
45
|
+
— its CLI only generates image assets, never touches app source — so both variants are hand-authored
|
|
46
|
+
here. The split is narrower than it looks: `MainActivity.kt`'s `RNBootSplash.init(...)` call and
|
|
47
|
+
`AppDelegate.swift`'s `RNBootSplash.initWithStoryboard(...)` call are Kotlin/Swift references to
|
|
48
|
+
the plugin's public API (hard compile error without the dependency), and `styles.xml`'s
|
|
49
|
+
`BootTheme` extends the plugin's own `Theme.BootSplash` (an aapt resource-linking error without
|
|
50
|
+
its AAR) — so those 3 files plus the one-line `AndroidManifest.xml` activity theme attribute are
|
|
51
|
+
the ONLY things gated. `colors.xml`, the `drawable-*/bootsplash_logo.png` assets,
|
|
52
|
+
`BootSplash.storyboard`, `Colors.xcassets`, `Images.xcassets`, `Info.plist`'s
|
|
53
|
+
`UILaunchStoryboardName`, and the `.xcodeproj/project.pbxproj` wiring all stay in the BASE
|
|
54
|
+
template unconditionally — none of them reference anything from the plugin (the storyboard only
|
|
55
|
+
draws from our own asset catalog), so leaving them in place when the option is off just means an
|
|
56
|
+
unused-but-harmless launch-screen asset, not a build break.
|
|
57
|
+
|
|
58
|
+
`testing` (2026-09-17) is also NOT dependency-only: besides the per-framework
|
|
59
|
+
`package.json.fragment.json` (`detox` + `jest` + `ts-jest` + the TypeScript floor, since e2e is a
|
|
60
|
+
separate TS project regardless of `--javascript`), it ships `detox.config.js` at the app root and
|
|
61
|
+
an `e2e/` directory (`jest.config.js`, `tsconfig.json`, `setup.ts`, `smoke.test.ts`). The fragment
|
|
62
|
+
is picked from `fragment/<base|angular>/package.json.fragment.json` — angular's `e2e:build:*`
|
|
63
|
+
scripts need an `ngc` pass before Detox builds the native binary, every other framework shares
|
|
64
|
+
`fragment/base`. Both live in their OWN subdirectory rather than as
|
|
65
|
+
`base.package.json.fragment.json` / `angular.package.json.fragment.json` side by side, because
|
|
66
|
+
`renderTemplate`'s package.json merge branch derives the destination filename from the SOURCE
|
|
67
|
+
file's own basename, not from the `dest` path passed to it — two source files with different
|
|
68
|
+
basenames merging into the same `package.json.fragment.json` silently land as two different
|
|
69
|
+
files instead (caught via smoke test: the merged scripts were missing entirely). The one smoke
|
|
70
|
+
test (`e2e/smoke.test.ts`) asserts the welcome text renders through Fabric — deliberately generic
|
|
71
|
+
so it passes whether or not `--navigation` is also selected (the nav layer's Menu screen renders
|
|
72
|
+
the same line).
|
|
73
|
+
|
|
74
|
+
| Layer | Adds |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `expo-modules` | `expo` + `@symbiote-native/expo-modules-link` — the core autolinking wiring, no specific Expo-backed package. |
|
|
77
|
+
| `application` / `battery` / `brightness` / `cellular` / `clipboard` / `crypto` / `device` / `haptics` / `keep-awake` / `local-auth` / `localization` / `network` / `screen-orientation` / `secure-store` / `sensors` / `sharing` / `sms` / `standard-web-crypto` / `store-review` / `system-ui` / `tracking-transparency` / `web-browser` | Its own `@symbiote-native/<id>` dependency only — same dependency-only shape as `slider`, registered in `EXPO_PACKAGE_LAYERS`. Implies `expo-modules` (see above). |
|
|
78
|
+
| `navigation` | `@symbiote-native/navigation` + a per-framework `app/<dir>/App.<ext>` (Stack + Menu/Details screens) overwriting the base App. |
|
|
79
|
+
| `testing` | `detox` + `jest`/`ts-jest` + a generic `e2e/smoke.test.ts` + `detox.config.js`, always TypeScript regardless of `--javascript`. |
|
|
80
|
+
| `splash-screen` | `@symbiote-native/splash-screen` + the 4 native files (`MainActivity.kt`, `AndroidManifest.xml`, `styles.xml`, `AppDelegate.swift`) that wire `react-native-bootsplash`, plus a JS-side text-splice (`utils/apply-splash-screen-hide.ts`) wiring the framework's own `hide()` call into the App entry — the native side alone would freeze every scaffold on the splash screen forever, since nothing ever tells it to hide. |
|
|
81
|
+
|
|
82
|
+
Every `@symbiote-native/*` version in every fragment (base and layer) is pinned to `"latest"`,
|
|
83
|
+
not a literal semver range — the monorepo's packages publish independently and a hand-copied
|
|
84
|
+
literal drifts out of sync with peer requirements almost immediately (measured 2026-09-15:
|
|
85
|
+
`templates/js/angular`'s `@symbiote-native/engine` pin was `^0.1.7` against `@symbiote-native/
|
|
86
|
+
navigation@4.0.1`'s `^0.5.0` peer, and `expo-modules`'s `@symbiote-native/application@2.0.0`
|
|
87
|
+
wants `@symbiote-native/angular@^2.0.0` while the angular fragment pinned `^0.6.1` — two separate
|
|
88
|
+
`npm install ERESOLVE` failures from the same root cause). Third-party dependencies (`react`,
|
|
89
|
+
`react-native`, `vue`, `svelte`, `solid-js`, `@angular/*`, `expo`, …) stay pinned as before —
|
|
90
|
+
only the `@symbiote-native/*` scope moved to `latest`.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
6
|
+
<true/>
|
|
7
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
8
|
+
<string>en</string>
|
|
9
|
+
<key>CFBundleDisplayName</key>
|
|
10
|
+
<string>Canary</string>
|
|
11
|
+
<key>CFBundleExecutable</key>
|
|
12
|
+
<string>$(EXECUTABLE_NAME)</string>
|
|
13
|
+
<key>CFBundleIdentifier</key>
|
|
14
|
+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
15
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
16
|
+
<string>6.0</string>
|
|
17
|
+
<key>CFBundleName</key>
|
|
18
|
+
<string>$(PRODUCT_NAME)</string>
|
|
19
|
+
<key>CFBundlePackageType</key>
|
|
20
|
+
<string>APPL</string>
|
|
21
|
+
<key>CFBundleShortVersionString</key>
|
|
22
|
+
<string>$(MARKETING_VERSION)</string>
|
|
23
|
+
<key>CFBundleSignature</key>
|
|
24
|
+
<string>????</string>
|
|
25
|
+
<key>CFBundleVersion</key>
|
|
26
|
+
<string>$(CURRENT_PROJECT_VERSION)</string>
|
|
27
|
+
<key>LSRequiresIPhoneOS</key>
|
|
28
|
+
<true/>
|
|
29
|
+
<key>NSAppTransportSecurity</key>
|
|
30
|
+
<dict>
|
|
31
|
+
<key>NSAllowsArbitraryLoads</key>
|
|
32
|
+
<false/>
|
|
33
|
+
<key>NSAllowsLocalNetworking</key>
|
|
34
|
+
<true/>
|
|
35
|
+
</dict>
|
|
36
|
+
<key>NSLocationWhenInUseUsageDescription</key>
|
|
37
|
+
<string></string>
|
|
38
|
+
<key>RCTNewArchEnabled</key>
|
|
39
|
+
<true/>
|
|
40
|
+
<key>UILaunchStoryboardName</key>
|
|
41
|
+
<string>BootSplash</string>
|
|
42
|
+
<key>UIRequiredDeviceCapabilities</key>
|
|
43
|
+
<array>
|
|
44
|
+
<string>arm64</string>
|
|
45
|
+
</array>
|
|
46
|
+
<key>UISupportedInterfaceOrientations</key>
|
|
47
|
+
<array>
|
|
48
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
49
|
+
</array>
|
|
50
|
+
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
51
|
+
<array>
|
|
52
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
53
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
54
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
55
|
+
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
56
|
+
</array>
|
|
57
|
+
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
58
|
+
<false/>
|
|
59
|
+
<key>NSFaceIDUsageDescription</key>
|
|
60
|
+
<string>This app uses Face ID to authenticate you.</string>
|
|
61
|
+
<key>NSMotionUsageDescription</key>
|
|
62
|
+
<string>This app uses motion sensor data.</string>
|
|
63
|
+
<key>NSUserTrackingUsageDescription</key>
|
|
64
|
+
<string>This app tracks your activity across other apps and websites.</string>
|
|
65
|
+
</dict>
|
|
66
|
+
</plist>
|