@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,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@symbiote-native/angular/tsconfig.angular.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// packages/navigation's `./angular` export now hands ngc a prebuilt
|
|
5
|
+
// `build-ngc/angular/index.d.ts` (a conditional `exports` entry, mirroring
|
|
6
|
+
// packages/splash-screen and adapters/angular) instead of raw `.ts` source, so this app no
|
|
7
|
+
// longer pulls sibling package source into its own program — declaration files are exempt
|
|
8
|
+
// from TS's rootDir check, so rootDir stays scoped to this directory like every other
|
|
9
|
+
// `.examples/*` app.
|
|
10
|
+
"rootDir": ".",
|
|
11
|
+
"outDir": "build/angular",
|
|
12
|
+
"baseUrl": "."
|
|
13
|
+
},
|
|
14
|
+
"files": ["src/App.ts", "src/css.d.ts"],
|
|
15
|
+
"exclude": ["build", "e2e", "**/node_modules", "**/Pods"],
|
|
16
|
+
// `ngc --watch` (perform_watch.js) chokidar-watches `angularCompilerOptions.basePath`
|
|
17
|
+
// recursively, filtered only by a hardcoded regex (node_modules/.dotfiles/.js/.map/
|
|
18
|
+
// .metadata.json — NOT ios/android/build). basePath defaults to dirname(this file) =
|
|
19
|
+
// examples/angular/, a sibling of ios/ (17k+ files) and android/ (1k+ files), so the watcher
|
|
20
|
+
// recursed into both and hit EMFILE. All real source now lives under src/ (moved 2026-07-14
|
|
21
|
+
// specifically for this), so basePath narrows the watch root to just that — confirmed empirically
|
|
22
|
+
// that overriding basePath does NOT affect file/rootDir resolution (parseJsonConfigFileContent
|
|
23
|
+
// uses it only as the include/exclude glob base, independent of `files`), only the watch root.
|
|
24
|
+
// Kept relative here (portable, machine-independent) even though @angular/compiler-cli's
|
|
25
|
+
// INCREMENTAL recompile path needs it absolute (throws TS500 "path is not absolute" via
|
|
26
|
+
// absoluteFrom() otherwise, on the second file change onward) — symbiote-angular-dev.cjs
|
|
27
|
+
// resolves it to absolute at spawn time via a throwaway override config, so this file never
|
|
28
|
+
// carries a hardcoded machine path. `ngc -p tsconfig.angular.json` one-shot builds (ng:build)
|
|
29
|
+
// don't need that resolution — a relative basePath is fine for a cold compile.
|
|
30
|
+
"angularCompilerOptions": {
|
|
31
|
+
"basePath": "src"
|
|
32
|
+
},
|
|
33
|
+
// Editor tsserver honors this (and resolves it relative to THIS file, not the
|
|
34
|
+
// extended tsconfig.angular.base.json — microsoft/TypeScript#55656 — so it can't
|
|
35
|
+
// live in the shared base). `ngc --watch` itself does NOT: @angular/compiler-cli's
|
|
36
|
+
// watch mode calls chokidar directly (perform_watch.js) instead of TS's native
|
|
37
|
+
// watch host, so watchOptions has zero effect on it — the angularCompilerOptions.basePath
|
|
38
|
+
// above is what actually fixes the watch scope.
|
|
39
|
+
"watchOptions": {
|
|
40
|
+
"excludeDirectories": ["**/node_modules", "../../node_modules", "**/.git", "**/build"]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@react-native/typescript-config",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// @angular/core's own .d.ts surface references DOM lib types (Node, Document, …) even though
|
|
5
|
+
// this adapter never touches a real DOM at runtime (DOM-less bootstrap, see render.ts) — every
|
|
6
|
+
// file importing it needs DOM in scope or an editor language server spams TS2584 on those
|
|
7
|
+
// ambient names. tsconfig.angular.json (the real ngc build config) already sets this; mirrored
|
|
8
|
+
// here so editor diagnostics for the whole example (not just App.ts) match the real build.
|
|
9
|
+
"lib": ["ES2022", "DOM"],
|
|
10
|
+
"types": [],
|
|
11
|
+
"plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
|
|
12
|
+
},
|
|
13
|
+
"include": ["**/*.ts"],
|
|
14
|
+
// e2e/ ships its own complete tsconfig.json (jest + detox + node) — excluded here so this
|
|
15
|
+
// root config, which has no reason to typecheck it, doesn't also need jest's globals declared.
|
|
16
|
+
"exclude": ["build", "**/node_modules", "**/Pods", "e2e"]
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--ink: #0b1622;
|
|
3
|
+
--paper: #13243a;
|
|
4
|
+
--mist: #41506a;
|
|
5
|
+
--chalk: #cbd5e1;
|
|
6
|
+
--chalk-bright: #ffffff;
|
|
7
|
+
--brand: #61dafb;
|
|
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-logo {
|
|
20
|
+
height: 64px;
|
|
21
|
+
aspect-ratio: 1.0977;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.title {
|
|
25
|
+
color: var(--chalk-bright);
|
|
26
|
+
font-size: 22px;
|
|
27
|
+
font-weight: bold;
|
|
28
|
+
text-align: center;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.subtitle {
|
|
32
|
+
color: var(--chalk);
|
|
33
|
+
font-size: 14px;
|
|
34
|
+
text-align: center;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.counter-card {
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: 4px;
|
|
40
|
+
padding: 20px 28px;
|
|
41
|
+
border-radius: 16px;
|
|
42
|
+
background-color: var(--paper);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.counter-label {
|
|
46
|
+
color: var(--mist);
|
|
47
|
+
font-size: 12px;
|
|
48
|
+
letter-spacing: 1px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.counter-value {
|
|
52
|
+
color: var(--brand);
|
|
53
|
+
font-size: 32px;
|
|
54
|
+
font-weight: bold;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.button-primary {
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: center;
|
|
60
|
+
border-radius: 12px;
|
|
61
|
+
padding: 14px 22px;
|
|
62
|
+
background-color: var(--brand);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.button-primary-text {
|
|
66
|
+
color: var(--ink);
|
|
67
|
+
font-size: 15px;
|
|
68
|
+
font-weight: bold;
|
|
69
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import './App.css';
|
|
3
|
+
|
|
4
|
+
export default function App() {
|
|
5
|
+
const [count, setCount] = useState(0);
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<safe-area-view className="screen">
|
|
9
|
+
<image
|
|
10
|
+
className="brand-logo"
|
|
11
|
+
resizeMode="contain"
|
|
12
|
+
source={require('./assets/react-native-logo.png')}
|
|
13
|
+
/>
|
|
14
|
+
<text className="title">Welcome to SymbioteNative!</text>
|
|
15
|
+
<text className="subtitle">Framework-agnostic React Native, driven by React.</text>
|
|
16
|
+
|
|
17
|
+
<view className="counter-card">
|
|
18
|
+
<text className="counter-label">TAPS</text>
|
|
19
|
+
<text className="counter-value">{count}</text>
|
|
20
|
+
</view>
|
|
21
|
+
|
|
22
|
+
<pressable className="button-primary" onPress={() => setCount((value) => value + 1)}>
|
|
23
|
+
<text className="button-primary-text">Tap me</text>
|
|
24
|
+
</pressable>
|
|
25
|
+
</safe-area-view>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import './App.css';
|
|
3
|
+
|
|
4
|
+
export default function App() {
|
|
5
|
+
const [count, setCount] = useState<number>(0);
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<safe-area-view className="screen">
|
|
9
|
+
<image
|
|
10
|
+
className="brand-logo"
|
|
11
|
+
resizeMode="contain"
|
|
12
|
+
source={require('./assets/react-native-logo.png')}
|
|
13
|
+
/>
|
|
14
|
+
<text className="title">Welcome to SymbioteNative!</text>
|
|
15
|
+
<text className="subtitle">Framework-agnostic React Native, driven by React.</text>
|
|
16
|
+
|
|
17
|
+
<view className="counter-card">
|
|
18
|
+
<text className="counter-label">TAPS</text>
|
|
19
|
+
<text className="counter-value">{count}</text>
|
|
20
|
+
</view>
|
|
21
|
+
|
|
22
|
+
<pressable className="button-primary" onPress={() => setCount((value) => value + 1)}>
|
|
23
|
+
<text className="button-primary-text">Tap me</text>
|
|
24
|
+
</pressable>
|
|
25
|
+
</safe-area-view>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# `templates/js/react`
|
|
2
|
+
|
|
3
|
+
The React JS-level overlay for `@symbiote-native/cli new --framework react`. Combined at generation
|
|
4
|
+
time with `templates/native/{ios,android}` (the framework-agnostic native shell, shared by
|
|
5
|
+
every framework) to produce a full bare React Native app. Source of truth for every file here:
|
|
6
|
+
`examples/react` — the reference React canary — root-level files only (its `ios/`/`android/`
|
|
7
|
+
are covered by `templates/native`, not this folder).
|
|
8
|
+
|
|
9
|
+
## What was copied, and why each belongs in the seam
|
|
10
|
+
|
|
11
|
+
Every file below is bootstrap/tooling: identical (or safe-to-reuse-verbatim) in any new
|
|
12
|
+
SymbioteNative React app, regardless of what screens/components the app author writes.
|
|
13
|
+
|
|
14
|
+
| File | Why it's part of the seam |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `index.js` | The RN entry point. Calls `registerApp(App, { appName })` from `@symbiote-native/react/bootstrap`, which wires the native-host seams (colors, images, device events, third-party ViewConfigs) before mounting — every generated app needs this exact wiring, only `App` and `appName` vary. |
|
|
17
|
+
| `metro.config.js` | Wires `@symbiote-native/react/metro-css-parser` as Metro's `babelTransformerPath` (so `.css`/`.scss`/`.sass`/`.less`/`.styl` imports compile) and extends `resolver.sourceExts` accordingly. Framework-agnostic mechanism, React-specific only in which adapter package's transformer it points at. |
|
|
18
|
+
| `babel.config.js` | `@react-native/babel-preset` plus a small custom plugin that inlines `process.env.DEBUG` at bundle time, so `DEBUG=1` diagnostic logging (`dlog`/`isDebug` from `@symbiote-native/engine`) can be toggled without a runtime dependency. Generic to every SymbioteNative app. |
|
|
19
|
+
| `tsconfig.json` | Extends `@react-native/typescript-config` and registers `@symbiote-native/css-parser/typescript-plugin` for live per-file CSS-module typing in the editor. No app-specific paths. |
|
|
20
|
+
| `app.json` | RN's app registry name (`name`/`displayName`). Copied verbatim — see the parameterization note below. |
|
|
21
|
+
| `css.d.ts` | Ambient module declarations for `*.css` (side-effect import) and the generic `*.module.css` fallback typing. Needed by any app that imports CSS, regardless of what the CSS contains. |
|
|
22
|
+
| `.eslintrc.js` | `extends: '@react-native'` — the standard RN lint baseline, no app-specific rules. |
|
|
23
|
+
| `.prettierrc.js` | Formatting preferences (`arrowParens`, `singleQuote`, `trailingComma`) — a project-wide style choice, not app content. |
|
|
24
|
+
| `.watchmanconfig` | Empty `{}` — Watchman's marker file, identical in every RN project. |
|
|
25
|
+
| `.gitignore` | Standard RN ignore rules (Xcode/Gradle build artifacts, CocoaPods, node_modules, Detox artifacts, etc.) — applies at the generated app's root, which is where both this overlay and `templates/native` land, so it still earns its place here even though some entries (`ios/build/`, `.gradle`) cover the native tree. |
|
|
26
|
+
| `package.json.fragment.json` | Not from `examples/react` directly — see below. |
|
|
27
|
+
|
|
28
|
+
## What was deliberately excluded, and why
|
|
29
|
+
|
|
30
|
+
- **App content**: `App.tsx`, `App.css`, `components/`, `screens/`, `navigation-lines.ts`,
|
|
31
|
+
`navigation-linking.ts`, `routes.ts`, `assets/` — the example's own demo screens/components,
|
|
32
|
+
not part of the scaffold seam. A generated app needs its own `App` from scratch (or a future
|
|
33
|
+
minimal starter, out of scope for this pass).
|
|
34
|
+
- **`e2e/`** — the example's own Detox test journeys (`canary-journeys.test.ts`,
|
|
35
|
+
`probe.test.ts`), written against the example's specific screens/navigation. Not applicable
|
|
36
|
+
to a freshly generated app with no screens yet.
|
|
37
|
+
- **`package-lock.json`** — a lockfile is generated fresh by whichever package manager
|
|
38
|
+
`@symbiote-native/cli new --pm <pm>` runs, never copied.
|
|
39
|
+
- **`README.md`** (the example's own) — documents the *example app*'s specific run/test
|
|
40
|
+
instructions (mentions "Canary" by name, the shared-native-shell caveat between the three
|
|
41
|
+
React/Vue examples). Not generic bootstrap content; a generated app gets its own README from
|
|
42
|
+
a future `generate.ts`, not this one verbatim.
|
|
43
|
+
|
|
44
|
+
## Judgment calls on borderline files
|
|
45
|
+
|
|
46
|
+
- **`Gemfile` / `Gemfile.lock`** — excluded. These pin CocoaPods/Ruby gem versions for iOS
|
|
47
|
+
builds, which makes them native-tooling config, not JS-level config — closer in kind to
|
|
48
|
+
`templates/native/ios/Podfile`/`Podfile.lock` (which already live in the native shell) than
|
|
49
|
+
to anything in this folder. `templates/native/ios` doesn't currently have a `Gemfile` either,
|
|
50
|
+
which looks like a real gap for the native shell to close in its own pass — flagging it here
|
|
51
|
+
rather than silently copying it into `templates/js/react` (wrong tree) or into
|
|
52
|
+
`templates/native` (out of scope for this task, which was scoped to `templates/js/react`
|
|
53
|
+
only).
|
|
54
|
+
- **`detox.config.js`** — excluded. It's e2e test infrastructure, symmetric with excluding
|
|
55
|
+
`e2e/` itself (the config is useless without the test files it points at via
|
|
56
|
+
`testRunner.args.config: 'e2e/jest.config.js'`). It also hardcodes the literal app name/scheme
|
|
57
|
+
("Canary", `ios/Canary.xcworkspace`) the same way `app.json` does — another argument for
|
|
58
|
+
treating e2e wiring as a later, parameterization-aware addition rather than a verbatim copy
|
|
59
|
+
now.
|
|
60
|
+
- **`app.json`** — copied, but **not parameterized**. Its `name`/`displayName` are still the
|
|
61
|
+
literal `"Canary"` values from `examples/react`. Inventing a placeholder/templating scheme
|
|
62
|
+
(e.g. `ejs` variables) is explicitly out of scope for this pass — that's real follow-up work
|
|
63
|
+
for `@symbiote-native/cli new`'s actual generation logic, which as of this pass is still stubbed
|
|
64
|
+
with `NotImplementedCommandError` in `src/commands/new.ts`/`src/commands/add.ts`. When that
|
|
65
|
+
lands, `app.json`'s `name` (and the matching native-side bundle id / scheme) needs to be
|
|
66
|
+
rewritten per-app, not left as this example's value.
|
|
67
|
+
|
|
68
|
+
## `package.json.fragment.json`
|
|
69
|
+
|
|
70
|
+
A dependency **fragment**, not a full `package.json` — this folder isn't itself an npm
|
|
71
|
+
package. Lists only the dependencies a generated React app's `package.json` needs to run the
|
|
72
|
+
files above, pulled from `examples/react/package.json`'s exact (real, working) version ranges:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"@symbiote-native/react": "^0.2.8",
|
|
78
|
+
"react": "19.2.3",
|
|
79
|
+
"react-native": "0.86.0"
|
|
80
|
+
},
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"@react-native/babel-preset": "0.86.0",
|
|
83
|
+
"@react-native/metro-config": "0.86.0"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Derivation: `@symbiote-native/react`, `react`, `react-native` per the task brief (the
|
|
89
|
+
SymbioteNative React runtime plus its two peer-dependency anchors — see
|
|
90
|
+
`<react_native_is_an_explicit_top_level_peer>` in the root `CLAUDE.md`); `@react-native/babel-
|
|
91
|
+
preset` because `babel.config.js` names it in its `presets` array; `@react-native/metro-config`
|
|
92
|
+
because `metro.config.js` `require()`s it directly.
|
|
93
|
+
|
|
94
|
+
**Not included, on purpose** (scoped out by the task brief, which limited the "actually
|
|
95
|
+
import/require" check to `index.js`/`metro.config.js`/`babel.config.js`): `tsconfig.json` also
|
|
96
|
+
needs `@react-native/typescript-config` (its `extends`) and `@symbiote-native/css-parser` (its
|
|
97
|
+
`plugins` entry), and `.eslintrc.js` needs `@react-native/eslint-config` (its `extends:
|
|
98
|
+
'@react-native'` shorthand) plus `eslint` itself. A real generated `package.json` will need
|
|
99
|
+
those too — flagging them here rather than silently expanding this fragment beyond what was
|
|
100
|
+
asked, since the actual merge logic (and whether it lives in this fragment or a separate
|
|
101
|
+
devDependencies-only fragment) is a `generate.ts` design decision, not this pass's call to
|
|
102
|
+
make.
|
|
103
|
+
|
|
104
|
+
## No app-name/bundle-id parameterization yet
|
|
105
|
+
|
|
106
|
+
Worth repeating on its own: nothing in this folder is templated. `app.json`'s `name` field is
|
|
107
|
+
the literal `"Canary"` example value, unchanged. Turning this into a real generator — choosing
|
|
108
|
+
a templating mechanism (the package README's own notes point at `ejs`, matching `create-vue`'s
|
|
109
|
+
toolchain, but that's not decided or installed yet), parameterizing `app.json`, and wiring the
|
|
110
|
+
native-side app name/bundle id to match — is real follow-up work for `@symbiote-native/cli new`'s
|
|
111
|
+
generation logic, which is still stubbed with `NotImplementedCommandError` as of this pass.
|
|
112
|
+
|
|
113
|
+
## Precedent
|
|
114
|
+
|
|
115
|
+
`examples/react` (bare) / `examples/expo-react` (what `--expo-modules` adds on top — not yet
|
|
116
|
+
reflected in this folder, since `--expo-modules` overlay content wasn't part of this pass).
|
|
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-css-transformer.js) into a registerStyles() call; there's no runtime export to type.
|
|
4
|
+
// Mirrors 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` outside a file that
|
|
16
|
+
// already has its own generated `Card.module.css.d.ts` (see `css-dts`, wired to `pretypecheck`;
|
|
17
|
+
// a real per-file `.d.ts` takes priority over this wildcard once generated). The
|
|
18
|
+
// `@symbiote-native/react/typescript-plugin` entry in tsconfig.json's `compilerOptions.plugins` gives
|
|
19
|
+
// the 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 canary entry. App code uses our own AppRegistry (the RN-identical
|
|
5
|
+
* `registerComponent(appKey, () => App)`) which mounts via @symbiote-native/engine, not
|
|
6
|
+
* React Native's renderer; registerApp wires the native-host seams (colors, images, device
|
|
7
|
+
* events, third-party ViewConfigs) before registering, so this file only needs the app itself.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { registerApp } from '@symbiote-native/react/bootstrap';
|
|
11
|
+
import App from './App';
|
|
12
|
+
import { name as appName } from './app.json';
|
|
13
|
+
|
|
14
|
+
registerApp(App, { appName });
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
|
|
2
|
+
|
|
3
|
+
const projectRoot = __dirname;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @symbiote-native/* resolve as ordinary npm packages from this app's own node_modules
|
|
7
|
+
* (examples/* is a standalone npm install, decoupled from the monorepo's pnpm workspace —
|
|
8
|
+
* see pnpm-workspace.yaml). @react-native/babel-preset strips the types.
|
|
9
|
+
*
|
|
10
|
+
* @type {import('@react-native/metro-config').MetroConfig}
|
|
11
|
+
*/
|
|
12
|
+
const defaultConfig = getDefaultConfig(projectRoot);
|
|
13
|
+
|
|
14
|
+
const config = {
|
|
15
|
+
// Compile standalone .css/.module.css imports on the way into the bundle —
|
|
16
|
+
// @symbiote-native/react ships this transformer itself, the framework-agnostic path
|
|
17
|
+
// mirrored by the Vue and Angular examples' own adapter's ./metro-css-parser export.
|
|
18
|
+
transformer: {
|
|
19
|
+
babelTransformerPath: require.resolve('@symbiote-native/react/metro-css-parser'),
|
|
20
|
+
},
|
|
21
|
+
resolver: {
|
|
22
|
+
// Teach Metro that a style file is a source file (the transformer turns it into a module).
|
|
23
|
+
// scss/sass/less/styl are optional SCSS/Sass/Less/Stylus preprocessor sources handled by
|
|
24
|
+
// core/css-parser/src/preprocessors.ts, which reduces each to plain CSS before compiling.
|
|
25
|
+
sourceExts: [...defaultConfig.resolver.sourceExts, 'css', 'scss', 'sass', 'less', 'styl'],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports = mergeConfig(defaultConfig, config);
|
|
@@ -0,0 +1,22 @@
|
|
|
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/engine": "latest",
|
|
14
|
+
"@symbiote-native/react": "latest",
|
|
15
|
+
"react": "19.2.3",
|
|
16
|
+
"react-native": "0.86.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@react-native/babel-preset": "0.86.0",
|
|
20
|
+
"@react-native/metro-config": "0.86.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@react-native/typescript-config",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// @react-native/typescript-config's own base unconditionally sets types:["jest"] — an empty
|
|
5
|
+
// array here is a real override (not just "no opinion"), needed because @types/jest is only
|
|
6
|
+
// resolvable once --testing installs it; omitting this key entirely would inherit the
|
|
7
|
+
// base's ["jest"] through `extends` and fail with "Cannot find type definition file 'jest'".
|
|
8
|
+
"types": [],
|
|
9
|
+
// The adapter owns its own JSX namespace (adapters/react/src/jsx-runtime.ts) — without this,
|
|
10
|
+
// `<view>`/`<text>` are unknown intrinsics to tsc.
|
|
11
|
+
"jsxImportSource": "@symbiote-native/react",
|
|
12
|
+
"plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
|
|
13
|
+
},
|
|
14
|
+
"include": ["**/*.ts", "**/*.tsx"],
|
|
15
|
+
// e2e/ ships its own complete tsconfig.json (jest + detox + node) — excluded here so this root
|
|
16
|
+
// config, which has no reason to typecheck it, doesn't also need jest's globals declared.
|
|
17
|
+
"exclude": ["**/node_modules", "**/Pods", "e2e"]
|
|
18
|
+
}
|
|
@@ -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: #2c4f7c;
|
|
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-solid {
|
|
36
|
+
aspect-ratio: 1.03125;
|
|
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(--chalk-bright);
|
|
87
|
+
font-size: 15px;
|
|
88
|
+
font-weight: bold;
|
|
89
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createSignal } from 'solid-js';
|
|
2
|
+
import './App.css';
|
|
3
|
+
|
|
4
|
+
export default function App() {
|
|
5
|
+
const [count, setCount] = createSignal(0);
|
|
6
|
+
|
|
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 class="plus-icon" resizeMode="contain" source={require('./assets/plus-icon.png')} />
|
|
16
|
+
<image
|
|
17
|
+
class="brand-logo brand-logo-solid"
|
|
18
|
+
resizeMode="contain"
|
|
19
|
+
source={require('./assets/solid-logo.png')}
|
|
20
|
+
/>
|
|
21
|
+
</view>
|
|
22
|
+
<text class="title">Welcome to SymbioteNative!</text>
|
|
23
|
+
<text class="subtitle">Framework-agnostic React Native, driven by Solid.</text>
|
|
24
|
+
|
|
25
|
+
<view class="counter-card">
|
|
26
|
+
<text class="counter-label">TAPS</text>
|
|
27
|
+
<text class="counter-value">{count()}</text>
|
|
28
|
+
</view>
|
|
29
|
+
|
|
30
|
+
<pressable class="button-primary" onPress={() => setCount((value) => value + 1)}>
|
|
31
|
+
<text class="button-primary-text">Tap me</text>
|
|
32
|
+
</pressable>
|
|
33
|
+
</safe-area-view>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createSignal } from 'solid-js';
|
|
2
|
+
import './App.css';
|
|
3
|
+
|
|
4
|
+
export default function App() {
|
|
5
|
+
const [count, setCount] = createSignal<number>(0);
|
|
6
|
+
|
|
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 class="plus-icon" resizeMode="contain" source={require('./assets/plus-icon.png')} />
|
|
16
|
+
<image
|
|
17
|
+
class="brand-logo brand-logo-solid"
|
|
18
|
+
resizeMode="contain"
|
|
19
|
+
source={require('./assets/solid-logo.png')}
|
|
20
|
+
/>
|
|
21
|
+
</view>
|
|
22
|
+
<text class="title">Welcome to SymbioteNative!</text>
|
|
23
|
+
<text class="subtitle">Framework-agnostic React Native, driven by Solid.</text>
|
|
24
|
+
|
|
25
|
+
<view class="counter-card">
|
|
26
|
+
<text class="counter-label">TAPS</text>
|
|
27
|
+
<text class="counter-value">{count()}</text>
|
|
28
|
+
</view>
|
|
29
|
+
|
|
30
|
+
<pressable class="button-primary" onPress={() => setCount((value) => value + 1)}>
|
|
31
|
+
<text class="button-primary-text">Tap me</text>
|
|
32
|
+
</pressable>
|
|
33
|
+
</safe-area-view>
|
|
34
|
+
);
|
|
35
|
+
}
|