@ramonclaudio/create-vexpo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +50 -0
  2. package/dist/index.js +183 -0
  3. package/dist/templates/default/.eas/workflows/asc-events.yml +84 -0
  4. package/dist/templates/default/.eas/workflows/deploy-production.yml +129 -0
  5. package/dist/templates/default/.eas/workflows/development-builds.yml +19 -0
  6. package/dist/templates/default/.eas/workflows/e2e-tests.yml +42 -0
  7. package/dist/templates/default/.eas/workflows/pr-preview.yml +98 -0
  8. package/dist/templates/default/.eas/workflows/release.yml +44 -0
  9. package/dist/templates/default/.eas/workflows/rollback.yml +86 -0
  10. package/dist/templates/default/.eas/workflows/rollout.yml +84 -0
  11. package/dist/templates/default/.eas/workflows/rotate-apple-jwt.yml +42 -0
  12. package/dist/templates/default/.eas/workflows/testflight.yml +57 -0
  13. package/dist/templates/default/.github/workflows/check.yml +28 -0
  14. package/dist/templates/default/.maestro/launch.yaml +18 -0
  15. package/dist/templates/default/AGENTS.md +79 -0
  16. package/dist/templates/default/DESIGN.md +331 -0
  17. package/dist/templates/default/LICENSE +21 -0
  18. package/dist/templates/default/README.md +153 -0
  19. package/dist/templates/default/SETUP.md +618 -0
  20. package/dist/templates/default/__tests__/convex/constants.test.ts +49 -0
  21. package/dist/templates/default/__tests__/convex/validators.test.ts +23 -0
  22. package/dist/templates/default/__tests__/convex/webhook.test.ts +343 -0
  23. package/dist/templates/default/__tests__/lib/deep-link.test.ts +67 -0
  24. package/dist/templates/default/_easignore +22 -0
  25. package/dist/templates/default/_editorconfig +9 -0
  26. package/dist/templates/default/_env.example +34 -0
  27. package/dist/templates/default/_fingerprintignore +24 -0
  28. package/dist/templates/default/_gitattributes +7 -0
  29. package/dist/templates/default/_gitignore +69 -0
  30. package/dist/templates/default/_oxfmtrc.json +3 -0
  31. package/dist/templates/default/_oxlintrc.json +34 -0
  32. package/dist/templates/default/app/(app)/(tabs)/(home)/index.tsx +50 -0
  33. package/dist/templates/default/app/(app)/(tabs)/(home,search)/_layout.tsx +44 -0
  34. package/dist/templates/default/app/(app)/(tabs)/(search)/index.tsx +247 -0
  35. package/dist/templates/default/app/(app)/(tabs)/_layout.tsx +77 -0
  36. package/dist/templates/default/app/(app)/(tabs)/settings/_layout.tsx +37 -0
  37. package/dist/templates/default/app/(app)/(tabs)/settings/index.tsx +362 -0
  38. package/dist/templates/default/app/(app)/(tabs)/settings/preferences.tsx +184 -0
  39. package/dist/templates/default/app/(app)/_layout.tsx +73 -0
  40. package/dist/templates/default/app/(app)/debug.tsx +389 -0
  41. package/dist/templates/default/app/(app)/help.tsx +254 -0
  42. package/dist/templates/default/app/(app)/linked.tsx +116 -0
  43. package/dist/templates/default/app/(app)/privacy.tsx +159 -0
  44. package/dist/templates/default/app/(app)/profile.tsx +915 -0
  45. package/dist/templates/default/app/(app)/sessions.tsx +191 -0
  46. package/dist/templates/default/app/(app)/welcome.tsx +140 -0
  47. package/dist/templates/default/app/(auth)/_layout.tsx +31 -0
  48. package/dist/templates/default/app/(auth)/forgot-password.tsx +168 -0
  49. package/dist/templates/default/app/(auth)/reset-password.tsx +314 -0
  50. package/dist/templates/default/app/(auth)/sign-in.tsx +453 -0
  51. package/dist/templates/default/app/(auth)/sign-up.tsx +563 -0
  52. package/dist/templates/default/app/+native-intent.tsx +14 -0
  53. package/dist/templates/default/app/+not-found.tsx +51 -0
  54. package/dist/templates/default/app/_layout.tsx +102 -0
  55. package/dist/templates/default/app-store/screenshots/.gitkeep +0 -0
  56. package/dist/templates/default/app-store/screenshots/README.md +13 -0
  57. package/dist/templates/default/app.config.ts +201 -0
  58. package/dist/templates/default/app.json +11 -0
  59. package/dist/templates/default/assets/brand-icon-dark.png +0 -0
  60. package/dist/templates/default/assets/brand-icon-light.png +0 -0
  61. package/dist/templates/default/assets/fonts/Geist-Black.ttf +0 -0
  62. package/dist/templates/default/assets/fonts/Geist-BlackItalic.ttf +0 -0
  63. package/dist/templates/default/assets/fonts/Geist-Bold.ttf +0 -0
  64. package/dist/templates/default/assets/fonts/Geist-BoldItalic.ttf +0 -0
  65. package/dist/templates/default/assets/fonts/Geist-ExtraBold.ttf +0 -0
  66. package/dist/templates/default/assets/fonts/Geist-ExtraBoldItalic.ttf +0 -0
  67. package/dist/templates/default/assets/fonts/Geist-ExtraLight.ttf +0 -0
  68. package/dist/templates/default/assets/fonts/Geist-ExtraLightItalic.ttf +0 -0
  69. package/dist/templates/default/assets/fonts/Geist-Italic.ttf +0 -0
  70. package/dist/templates/default/assets/fonts/Geist-Light.ttf +0 -0
  71. package/dist/templates/default/assets/fonts/Geist-LightItalic.ttf +0 -0
  72. package/dist/templates/default/assets/fonts/Geist-Medium.ttf +0 -0
  73. package/dist/templates/default/assets/fonts/Geist-MediumItalic.ttf +0 -0
  74. package/dist/templates/default/assets/fonts/Geist-Regular.ttf +0 -0
  75. package/dist/templates/default/assets/fonts/Geist-SemiBold.ttf +0 -0
  76. package/dist/templates/default/assets/fonts/Geist-SemiBoldItalic.ttf +0 -0
  77. package/dist/templates/default/assets/fonts/Geist-Thin.ttf +0 -0
  78. package/dist/templates/default/assets/fonts/Geist-ThinItalic.ttf +0 -0
  79. package/dist/templates/default/assets/fonts/Geist-Variable-Italic.ttf +0 -0
  80. package/dist/templates/default/assets/fonts/Geist-Variable.ttf +0 -0
  81. package/dist/templates/default/assets/fonts/GeistMono-Bold.ttf +0 -0
  82. package/dist/templates/default/assets/fonts/GeistMono-BoldItalic.ttf +0 -0
  83. package/dist/templates/default/assets/fonts/GeistMono-Italic.ttf +0 -0
  84. package/dist/templates/default/assets/fonts/GeistMono-Medium.ttf +0 -0
  85. package/dist/templates/default/assets/fonts/GeistMono-MediumItalic.ttf +0 -0
  86. package/dist/templates/default/assets/fonts/GeistMono-Regular.ttf +0 -0
  87. package/dist/templates/default/assets/fonts/GeistPixel-Square.ttf +0 -0
  88. package/dist/templates/default/assets/icon.png +0 -0
  89. package/dist/templates/default/assets/sounds/notification.wav +0 -0
  90. package/dist/templates/default/assets/splash-image-dark.png +0 -0
  91. package/dist/templates/default/assets/splash-image-light.png +0 -0
  92. package/dist/templates/default/bun.lock +1860 -0
  93. package/dist/templates/default/components/auth/otp-verification.tsx +255 -0
  94. package/dist/templates/default/components/auth/password-field.tsx +121 -0
  95. package/dist/templates/default/components/auth/segmented-toggle.tsx +47 -0
  96. package/dist/templates/default/components/ui/convex-error.tsx +32 -0
  97. package/dist/templates/default/components/ui/error-boundary.tsx +57 -0
  98. package/dist/templates/default/components/ui/loading-screen.tsx +31 -0
  99. package/dist/templates/default/components/ui/material.tsx +94 -0
  100. package/dist/templates/default/components/ui/offline-banner.tsx +58 -0
  101. package/dist/templates/default/components/ui/prominent-button.tsx +71 -0
  102. package/dist/templates/default/components/ui/skeleton.tsx +107 -0
  103. package/dist/templates/default/components/ui/status-text.tsx +49 -0
  104. package/dist/templates/default/components/ui/update-banner.tsx +82 -0
  105. package/dist/templates/default/constants/layout.ts +102 -0
  106. package/dist/templates/default/constants/theme.ts +401 -0
  107. package/dist/templates/default/constants/ui.ts +77 -0
  108. package/dist/templates/default/convex/_generated/api.d.ts +77 -0
  109. package/dist/templates/default/convex/_generated/api.js +23 -0
  110. package/dist/templates/default/convex/_generated/dataModel.d.ts +60 -0
  111. package/dist/templates/default/convex/_generated/server.d.ts +143 -0
  112. package/dist/templates/default/convex/_generated/server.js +93 -0
  113. package/dist/templates/default/convex/admin.ts +102 -0
  114. package/dist/templates/default/convex/auth.config.ts +6 -0
  115. package/dist/templates/default/convex/auth.ts +335 -0
  116. package/dist/templates/default/convex/constants.ts +46 -0
  117. package/dist/templates/default/convex/convex.config.ts +11 -0
  118. package/dist/templates/default/convex/crons.ts +42 -0
  119. package/dist/templates/default/convex/email.ts +109 -0
  120. package/dist/templates/default/convex/env.ts +31 -0
  121. package/dist/templates/default/convex/errors.ts +33 -0
  122. package/dist/templates/default/convex/functions.ts +54 -0
  123. package/dist/templates/default/convex/http.ts +176 -0
  124. package/dist/templates/default/convex/log.ts +81 -0
  125. package/dist/templates/default/convex/pushTokens.ts +114 -0
  126. package/dist/templates/default/convex/rateLimit.ts +92 -0
  127. package/dist/templates/default/convex/schema.ts +28 -0
  128. package/dist/templates/default/convex/tsconfig.json +18 -0
  129. package/dist/templates/default/convex/users.ts +279 -0
  130. package/dist/templates/default/convex/validators.ts +74 -0
  131. package/dist/templates/default/convex/webhook.ts +193 -0
  132. package/dist/templates/default/convex.json +6 -0
  133. package/dist/templates/default/eas.json +56 -0
  134. package/dist/templates/default/fingerprint.config.js +9 -0
  135. package/dist/templates/default/hooks/use-debounce.ts +20 -0
  136. package/dist/templates/default/hooks/use-deep-link.ts +43 -0
  137. package/dist/templates/default/hooks/use-navigation-tracking.ts +15 -0
  138. package/dist/templates/default/hooks/use-network.ts +11 -0
  139. package/dist/templates/default/hooks/use-notifications.ts +107 -0
  140. package/dist/templates/default/hooks/use-onboarding.ts +15 -0
  141. package/dist/templates/default/hooks/use-reduced-motion.ts +11 -0
  142. package/dist/templates/default/hooks/use-theme.ts +53 -0
  143. package/dist/templates/default/hooks/use-updates.ts +86 -0
  144. package/dist/templates/default/lib/a11y.ts +5 -0
  145. package/dist/templates/default/lib/app.ts +14 -0
  146. package/dist/templates/default/lib/assets.ts +17 -0
  147. package/dist/templates/default/lib/auth-client.ts +21 -0
  148. package/dist/templates/default/lib/convex-auth.tsx +79 -0
  149. package/dist/templates/default/lib/deep-link.ts +71 -0
  150. package/dist/templates/default/lib/dev-menu.ts +119 -0
  151. package/dist/templates/default/lib/device.ts +40 -0
  152. package/dist/templates/default/lib/dynamic-font.ts +49 -0
  153. package/dist/templates/default/lib/env.ts +10 -0
  154. package/dist/templates/default/lib/haptics.ts +24 -0
  155. package/dist/templates/default/lib/notifications.ts +276 -0
  156. package/dist/templates/default/lib/preferences.ts +45 -0
  157. package/dist/templates/default/lib/schemas.ts +137 -0
  158. package/dist/templates/default/lib/storage.ts +47 -0
  159. package/dist/templates/default/lib/updates.ts +107 -0
  160. package/dist/templates/default/metro.config.js +14 -0
  161. package/dist/templates/default/package.json +129 -0
  162. package/dist/templates/default/patches/PR-368.patch +91 -0
  163. package/dist/templates/default/patches/convex-dev-better-auth-0.12.2.tgz +0 -0
  164. package/dist/templates/default/plugins/README.md +9 -0
  165. package/dist/templates/default/plugins/with-auto-signing.js +45 -0
  166. package/dist/templates/default/plugins/with-pod-deployment-target.js +35 -0
  167. package/dist/templates/default/scripts/README.md +36 -0
  168. package/dist/templates/default/scripts/_run.mjs +77 -0
  169. package/dist/templates/default/scripts/clean.ts +543 -0
  170. package/dist/templates/default/scripts/rotate-apple-jwt.mjs +80 -0
  171. package/dist/templates/default/store.config.json +58 -0
  172. package/dist/templates/default/tsconfig.json +13 -0
  173. package/dist/templates/default/vitest.config.ts +21 -0
  174. package/package.json +69 -0
@@ -0,0 +1,102 @@
1
+ import { ConvexReactClient } from "convex/react";
2
+ import { Stack, ThemeProvider as NavigationThemeProvider } from "expo-router";
3
+ import * as SplashScreen from "expo-splash-screen";
4
+ import { StatusBar } from "expo-status-bar";
5
+ import { Suspense, useEffect } from "react";
6
+ import { View } from "react-native";
7
+ import { GestureHandlerRootView } from "react-native-gesture-handler";
8
+ import { KeyboardProvider } from "react-native-keyboard-controller";
9
+ import "react-native-reanimated";
10
+
11
+ import { registerDevMenuItems } from "@/lib/dev-menu";
12
+ import { authClient } from "@/lib/auth-client";
13
+ import { BetterAuthConvexProvider } from "@/lib/convex-auth";
14
+ import { assetModules } from "@/lib/assets";
15
+ import { useAssets } from "expo-asset";
16
+ import { env } from "@/lib/env";
17
+ import { useColorScheme, useColors } from "@/hooks/use-theme";
18
+ import { useReducedMotion } from "@/hooks/use-reduced-motion";
19
+ import { useNotifications } from "@/hooks/use-notifications";
20
+ import { useNavigationTracking } from "@/hooks/use-navigation-tracking";
21
+ import { useDeepLinkHandler } from "@/hooks/use-deep-link";
22
+ import { OfflineBanner } from "@/components/ui/offline-banner";
23
+ import { UpdateBanner } from "@/components/ui/update-banner";
24
+ import { LoadingScreen } from "@/components/ui/loading-screen";
25
+ import { Duration } from "@/constants/ui";
26
+ import { NavigationDark, NavigationLight } from "@/constants/theme";
27
+ import { setForegroundHandler, registerBackgroundTask } from "@/lib/notifications";
28
+
29
+ const convex = new ConvexReactClient(env.convexUrl, {
30
+ expectAuth: true,
31
+ unsavedChangesWarning: false,
32
+ });
33
+
34
+ export { AppErrorBoundary as ErrorBoundary } from "@/components/ui/error-boundary";
35
+
36
+ if (__DEV__) registerDevMenuItems();
37
+
38
+ SplashScreen.preventAutoHideAsync();
39
+ SplashScreen.setOptions({ duration: Duration.splash, fade: true });
40
+ setForegroundHandler();
41
+ registerBackgroundTask();
42
+
43
+ export default function RootLayout() {
44
+ return (
45
+ <BetterAuthConvexProvider client={convex}>
46
+ <Suspense fallback={<LoadingScreen />}>
47
+ <RootNavigator />
48
+ </Suspense>
49
+ </BetterAuthConvexProvider>
50
+ );
51
+ }
52
+
53
+ function RootNavigator() {
54
+ // Routing reads Better Auth directly. Convex queries authenticate through
55
+ // `BetterAuthConvexProvider` (see `lib/convex-auth.tsx` for the why).
56
+ const { data: session, isPending } = authClient.useSession();
57
+ const isAuthenticated = !!session?.session;
58
+ const isLoading = isPending;
59
+ const colorScheme = useColorScheme();
60
+ const colors = useColors();
61
+ const reduceMotion = useReducedMotion();
62
+ const [assets] = useAssets(assetModules);
63
+
64
+ useNotifications();
65
+ useNavigationTracking();
66
+ useDeepLinkHandler();
67
+
68
+ useEffect(() => {
69
+ if (!isLoading && assets) {
70
+ SplashScreen.hideAsync();
71
+ }
72
+ }, [isLoading, assets]);
73
+
74
+ return (
75
+ <GestureHandlerRootView style={{ flex: 1 }}>
76
+ <KeyboardProvider>
77
+ <NavigationThemeProvider value={colorScheme === "dark" ? NavigationDark : NavigationLight}>
78
+ <View style={{ flex: 1, backgroundColor: colors.background as string }}>
79
+ <Stack
80
+ screenOptions={{
81
+ headerShown: false,
82
+ animation: reduceMotion ? "fade" : "default",
83
+ animationDuration: reduceMotion ? 150 : undefined,
84
+ }}
85
+ >
86
+ <Stack.Protected guard={!isAuthenticated}>
87
+ <Stack.Screen name="(auth)" />
88
+ </Stack.Protected>
89
+ <Stack.Protected guard={isAuthenticated}>
90
+ <Stack.Screen name="(app)" />
91
+ </Stack.Protected>
92
+ <Stack.Screen name="+not-found" />
93
+ </Stack>
94
+ <StatusBar style="auto" />
95
+ <OfflineBanner />
96
+ <UpdateBanner />
97
+ </View>
98
+ </NavigationThemeProvider>
99
+ </KeyboardProvider>
100
+ </GestureHandlerRootView>
101
+ );
102
+ }
@@ -0,0 +1,13 @@
1
+ Drop iPhone screenshots here.
2
+
3
+ Required sizes (PNG, portrait):
4
+
5
+ - 6.7" (iPhone 14/15 Pro Max): 1290 x 2796 px
6
+ - 6.9" (iPhone 16 Pro Max): 1320 x 2868 px
7
+
8
+ File naming:
9
+
10
+ - 6.7": `6.7-01.png`, `6.7-02.png`, ..., up to `6.7-10.png`
11
+ - 6.9": `6.9-01.png`, `6.9-02.png`, ..., up to `6.9-10.png`
12
+
13
+ Apple rejects submissions missing required sizes.
@@ -0,0 +1,201 @@
1
+ import type { ConfigContext, ExpoConfig } from "expo/config";
2
+
3
+ import pkg from "./package.json";
4
+
5
+ const IS_DEV = process.env.APP_VARIANT === "development";
6
+
7
+ // Identity comes from .env.local (written by `bun run setup:convex`). Fallbacks
8
+ // keep `expo prebuild` from crashing on a fresh checkout, but a real build
9
+ // requires real values.
10
+ const BUNDLE_ID = process.env.EXPO_PUBLIC_APP_BUNDLE_ID ?? `com.example.${pkg.name}`;
11
+ const APPLE_TEAM_ID = process.env.EXPO_PUBLIC_APPLE_TEAM_ID ?? "ABCDE12345";
12
+ const EXPO_OWNER = process.env.EXPO_PUBLIC_EXPO_OWNER ?? undefined;
13
+
14
+ // Support contact surface. Populated by `vexpo rebrand` from `store.config.json`
15
+ // once the user creates one (needed only for App Store submission). On a fresh
16
+ // checkout these are empty and `app/(app)/help.tsx` hides the corresponding
17
+ // buttons gracefully.
18
+ type StoreConfig = {
19
+ apple: {
20
+ copyright?: string;
21
+ info?: { "en-US"?: { marketingUrl?: string; supportUrl?: string } };
22
+ review?: { email?: string };
23
+ };
24
+ };
25
+ const storeConfig: StoreConfig | undefined = (() => {
26
+ try {
27
+ return require("./store.config.json") as StoreConfig;
28
+ } catch {
29
+ return undefined;
30
+ }
31
+ })();
32
+ const cleanPlaceholder = (value: string | undefined): string =>
33
+ !value || /YOUR_|example\.com|REPLACE_/.test(value) ? "" : value;
34
+ const SUPPORT = {
35
+ githubUrl: cleanPlaceholder(storeConfig?.apple.info?.["en-US"]?.marketingUrl),
36
+ issuesUrl: cleanPlaceholder(storeConfig?.apple.info?.["en-US"]?.supportUrl),
37
+ email: cleanPlaceholder(storeConfig?.apple.review?.email),
38
+ };
39
+
40
+ export default ({ config }: ConfigContext): ExpoConfig => {
41
+ // `eas init` writes `extra.eas.projectId` into app.json. The static config
42
+ // is merged into our return value via `...config`, so reading from
43
+ // `config.extra?.eas?.projectId` here picks up the EAS project id without
44
+ // hand-editing this file every time `eas init` runs.
45
+ const projectId = (config.extra as { eas?: { projectId?: string } } | undefined)?.eas?.projectId;
46
+
47
+ return {
48
+ ...config,
49
+ name: IS_DEV ? "Vexpo (Dev)" : "Vexpo",
50
+ slug: "vexpo",
51
+ description: "",
52
+ version: pkg.version,
53
+ orientation: "portrait",
54
+ userInterfaceStyle: "automatic",
55
+ // Aligned with the shadcn neutral palette: light bg = #FFFFFF
56
+ // (oklch(1 0 0)), dark bg = #0A0A0A (oklch(0.145 0 0)). Deck color
57
+ // matches dark mode so cold-launches in the dark theme don't flash.
58
+ backgroundColor: "#0A0A0A",
59
+ primaryColor: "#171717",
60
+ platforms: ["ios"],
61
+ scheme: "vexpo",
62
+ icon: "./assets/icon.png",
63
+ ...(EXPO_OWNER ? { owner: EXPO_OWNER } : {}),
64
+ runtimeVersion: { policy: "fingerprint" },
65
+ developmentClient: {
66
+ silentLaunch: true,
67
+ },
68
+ updates: {
69
+ enabled: !!projectId,
70
+ checkAutomatically: "ON_LOAD",
71
+ fallbackToCacheTimeout: 0,
72
+ enableBsdiffPatchSupport: true,
73
+ ...(projectId ? { url: `https://u.expo.dev/${projectId}` } : {}),
74
+ // `expo-channel-name` request header is required for runtime channel
75
+ // surfing via `Updates.setUpdateRequestHeadersOverride`. Baseline
76
+ // value is overwritten per-build by EAS Build (it reads the channel
77
+ // from the eas.json build profile). Without this baseline declared
78
+ // here, override calls reject with "unknown header".
79
+ requestHeaders: { "expo-channel-name": "production" },
80
+ // Only ship icon + splash with each OTA. Fonts, sounds, and other
81
+ // build-baked assets stay in the .ipa and never download. Shrinks
82
+ // bundle by ~95% on diff-able updates.
83
+ assetPatternsToBeBundled: ["assets/icon.png", "assets/splash-image-*.png"],
84
+ // Production/Enterprise plan opt-in. Sign updates with a private key
85
+ // checked against the bundled certificate so a compromised CDN can't
86
+ // ship arbitrary JS. Generate keypair + cert via:
87
+ // bunx expo-updates codesigning:generate \
88
+ // --certificate-output-directory certs \
89
+ // --key-output-directory ../keys \
90
+ // --certificate-validity-duration-years 10 \
91
+ // --certificate-common-name "Your Organization Name"
92
+ // Store `../keys/private-key.pem` as an EAS env file-type secret
93
+ // (`EAS_UPDATE_PRIVATE_KEY`) and reference it from
94
+ // `.eas/workflows/deploy-production.yml`'s update job via
95
+ // `params.private_key_path: "$EAS_UPDATE_PRIVATE_KEY"`. Then
96
+ // uncomment the block below.
97
+ // codeSigningCertificate: "./certs/certificate.pem",
98
+ // codeSigningMetadata: { keyid: "main", alg: "rsa-v1_5-sha256" },
99
+ },
100
+ ios: {
101
+ supportsTablet: false,
102
+ bundleIdentifier: BUNDLE_ID,
103
+ appleTeamId: APPLE_TEAM_ID,
104
+ userInterfaceStyle: "automatic",
105
+ backgroundColor: "#0A0A0A",
106
+ usesAppleSignIn: true,
107
+ infoPlist: {
108
+ ITSAppUsesNonExemptEncryption: false,
109
+ LSApplicationQueriesSchemes: ["mailto", "tel", "sms", "itms-apps"],
110
+ },
111
+ associatedDomains: [
112
+ `applinks:${process.env.EXPO_PUBLIC_CONVEX_SITE_URL?.replace(/^https?:\/\//, "") ?? "example.convex.site"}`,
113
+ ],
114
+ privacyManifests: {
115
+ NSPrivacyTracking: false,
116
+ NSPrivacyCollectedDataTypes: [],
117
+ NSPrivacyAccessedAPITypes: [
118
+ {
119
+ NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryUserDefaults",
120
+ NSPrivacyAccessedAPITypeReasons: ["CA92.1"],
121
+ },
122
+ {
123
+ NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryFileTimestamp",
124
+ NSPrivacyAccessedAPITypeReasons: ["C617.1"],
125
+ },
126
+ {
127
+ NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategorySystemBootTime",
128
+ NSPrivacyAccessedAPITypeReasons: ["35F9.1"],
129
+ },
130
+ {
131
+ NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryDiskSpace",
132
+ NSPrivacyAccessedAPITypeReasons: ["E174.1"],
133
+ },
134
+ ],
135
+ },
136
+ },
137
+ plugins: [
138
+ [
139
+ "expo-router",
140
+ {
141
+ asyncRoutes: {
142
+ default: "development",
143
+ },
144
+ },
145
+ ],
146
+ [
147
+ "expo-splash-screen",
148
+ {
149
+ image: "./assets/splash-image-light.png",
150
+ resizeMode: "contain",
151
+ backgroundColor: "#FFFFFF",
152
+ imageWidth: 200,
153
+ dark: {
154
+ image: "./assets/splash-image-dark.png",
155
+ backgroundColor: "#0A0A0A",
156
+ },
157
+ },
158
+ ],
159
+ ["expo-font", { fonts: ["./assets/fonts"] }],
160
+ [
161
+ "expo-notifications",
162
+ {
163
+ icon: "./assets/icon.png",
164
+ color: "#171717",
165
+ sounds: ["./assets/sounds/notification.wav"],
166
+ enableBackgroundRemoteNotifications: true,
167
+ },
168
+ ],
169
+ [
170
+ "expo-image-picker",
171
+ {
172
+ photosPermission: "Allow $(PRODUCT_NAME) to access your photos for profile pictures.",
173
+ cameraPermission: "Allow $(PRODUCT_NAME) to take photos for profile pictures.",
174
+ },
175
+ ],
176
+ [
177
+ "expo-local-authentication",
178
+ {
179
+ faceIDPermission: "Allow $(PRODUCT_NAME) to use Face ID to confirm sensitive actions.",
180
+ },
181
+ ],
182
+ "expo-system-ui",
183
+ "expo-secure-store",
184
+ "expo-web-browser",
185
+ "expo-sharing",
186
+ ["expo-dev-client", { launchMode: "most-recent" }],
187
+ ["expo-build-properties", { ios: { deploymentTarget: "16.4" } }],
188
+ ["./plugins/with-pod-deployment-target", { target: "16.4" }],
189
+ "./plugins/with-auto-signing",
190
+ ],
191
+ extra: {
192
+ ...config.extra,
193
+ support: SUPPORT,
194
+ },
195
+ experiments: {
196
+ typedRoutes: true,
197
+ reactCompiler: true,
198
+ tsconfigPaths: true,
199
+ },
200
+ };
201
+ };
@@ -0,0 +1,11 @@
1
+ {
2
+ "expo": {
3
+ "extra": {
4
+ "router": {
5
+ "asyncRoutes": {
6
+ "default": "development"
7
+ }
8
+ }
9
+ }
10
+ }
11
+ }