@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.
- package/README.md +50 -0
- package/dist/index.js +183 -0
- package/dist/templates/default/.eas/workflows/asc-events.yml +84 -0
- package/dist/templates/default/.eas/workflows/deploy-production.yml +129 -0
- package/dist/templates/default/.eas/workflows/development-builds.yml +19 -0
- package/dist/templates/default/.eas/workflows/e2e-tests.yml +42 -0
- package/dist/templates/default/.eas/workflows/pr-preview.yml +98 -0
- package/dist/templates/default/.eas/workflows/release.yml +44 -0
- package/dist/templates/default/.eas/workflows/rollback.yml +86 -0
- package/dist/templates/default/.eas/workflows/rollout.yml +84 -0
- package/dist/templates/default/.eas/workflows/rotate-apple-jwt.yml +42 -0
- package/dist/templates/default/.eas/workflows/testflight.yml +57 -0
- package/dist/templates/default/.github/workflows/check.yml +28 -0
- package/dist/templates/default/.maestro/launch.yaml +18 -0
- package/dist/templates/default/AGENTS.md +79 -0
- package/dist/templates/default/DESIGN.md +331 -0
- package/dist/templates/default/LICENSE +21 -0
- package/dist/templates/default/README.md +153 -0
- package/dist/templates/default/SETUP.md +618 -0
- package/dist/templates/default/__tests__/convex/constants.test.ts +49 -0
- package/dist/templates/default/__tests__/convex/validators.test.ts +23 -0
- package/dist/templates/default/__tests__/convex/webhook.test.ts +343 -0
- package/dist/templates/default/__tests__/lib/deep-link.test.ts +67 -0
- package/dist/templates/default/_easignore +22 -0
- package/dist/templates/default/_editorconfig +9 -0
- package/dist/templates/default/_env.example +34 -0
- package/dist/templates/default/_fingerprintignore +24 -0
- package/dist/templates/default/_gitattributes +7 -0
- package/dist/templates/default/_gitignore +69 -0
- package/dist/templates/default/_oxfmtrc.json +3 -0
- package/dist/templates/default/_oxlintrc.json +34 -0
- package/dist/templates/default/app/(app)/(tabs)/(home)/index.tsx +50 -0
- package/dist/templates/default/app/(app)/(tabs)/(home,search)/_layout.tsx +44 -0
- package/dist/templates/default/app/(app)/(tabs)/(search)/index.tsx +247 -0
- package/dist/templates/default/app/(app)/(tabs)/_layout.tsx +77 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/_layout.tsx +37 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/index.tsx +362 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/preferences.tsx +184 -0
- package/dist/templates/default/app/(app)/_layout.tsx +73 -0
- package/dist/templates/default/app/(app)/debug.tsx +389 -0
- package/dist/templates/default/app/(app)/help.tsx +254 -0
- package/dist/templates/default/app/(app)/linked.tsx +116 -0
- package/dist/templates/default/app/(app)/privacy.tsx +159 -0
- package/dist/templates/default/app/(app)/profile.tsx +915 -0
- package/dist/templates/default/app/(app)/sessions.tsx +191 -0
- package/dist/templates/default/app/(app)/welcome.tsx +140 -0
- package/dist/templates/default/app/(auth)/_layout.tsx +31 -0
- package/dist/templates/default/app/(auth)/forgot-password.tsx +168 -0
- package/dist/templates/default/app/(auth)/reset-password.tsx +314 -0
- package/dist/templates/default/app/(auth)/sign-in.tsx +453 -0
- package/dist/templates/default/app/(auth)/sign-up.tsx +563 -0
- package/dist/templates/default/app/+native-intent.tsx +14 -0
- package/dist/templates/default/app/+not-found.tsx +51 -0
- package/dist/templates/default/app/_layout.tsx +102 -0
- package/dist/templates/default/app-store/screenshots/.gitkeep +0 -0
- package/dist/templates/default/app-store/screenshots/README.md +13 -0
- package/dist/templates/default/app.config.ts +201 -0
- package/dist/templates/default/app.json +11 -0
- package/dist/templates/default/assets/brand-icon-dark.png +0 -0
- package/dist/templates/default/assets/brand-icon-light.png +0 -0
- package/dist/templates/default/assets/fonts/Geist-Black.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-BlackItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Bold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-BoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraBold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraBoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraLight.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraLightItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Light.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-LightItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Medium.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-MediumItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Regular.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-SemiBold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-SemiBoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Thin.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ThinItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Variable-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Variable.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Bold.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-BoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Medium.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-MediumItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Regular.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistPixel-Square.ttf +0 -0
- package/dist/templates/default/assets/icon.png +0 -0
- package/dist/templates/default/assets/sounds/notification.wav +0 -0
- package/dist/templates/default/assets/splash-image-dark.png +0 -0
- package/dist/templates/default/assets/splash-image-light.png +0 -0
- package/dist/templates/default/bun.lock +1860 -0
- package/dist/templates/default/components/auth/otp-verification.tsx +255 -0
- package/dist/templates/default/components/auth/password-field.tsx +121 -0
- package/dist/templates/default/components/auth/segmented-toggle.tsx +47 -0
- package/dist/templates/default/components/ui/convex-error.tsx +32 -0
- package/dist/templates/default/components/ui/error-boundary.tsx +57 -0
- package/dist/templates/default/components/ui/loading-screen.tsx +31 -0
- package/dist/templates/default/components/ui/material.tsx +94 -0
- package/dist/templates/default/components/ui/offline-banner.tsx +58 -0
- package/dist/templates/default/components/ui/prominent-button.tsx +71 -0
- package/dist/templates/default/components/ui/skeleton.tsx +107 -0
- package/dist/templates/default/components/ui/status-text.tsx +49 -0
- package/dist/templates/default/components/ui/update-banner.tsx +82 -0
- package/dist/templates/default/constants/layout.ts +102 -0
- package/dist/templates/default/constants/theme.ts +401 -0
- package/dist/templates/default/constants/ui.ts +77 -0
- package/dist/templates/default/convex/_generated/api.d.ts +77 -0
- package/dist/templates/default/convex/_generated/api.js +23 -0
- package/dist/templates/default/convex/_generated/dataModel.d.ts +60 -0
- package/dist/templates/default/convex/_generated/server.d.ts +143 -0
- package/dist/templates/default/convex/_generated/server.js +93 -0
- package/dist/templates/default/convex/admin.ts +102 -0
- package/dist/templates/default/convex/auth.config.ts +6 -0
- package/dist/templates/default/convex/auth.ts +335 -0
- package/dist/templates/default/convex/constants.ts +46 -0
- package/dist/templates/default/convex/convex.config.ts +11 -0
- package/dist/templates/default/convex/crons.ts +42 -0
- package/dist/templates/default/convex/email.ts +109 -0
- package/dist/templates/default/convex/env.ts +31 -0
- package/dist/templates/default/convex/errors.ts +33 -0
- package/dist/templates/default/convex/functions.ts +54 -0
- package/dist/templates/default/convex/http.ts +176 -0
- package/dist/templates/default/convex/log.ts +81 -0
- package/dist/templates/default/convex/pushTokens.ts +114 -0
- package/dist/templates/default/convex/rateLimit.ts +92 -0
- package/dist/templates/default/convex/schema.ts +28 -0
- package/dist/templates/default/convex/tsconfig.json +18 -0
- package/dist/templates/default/convex/users.ts +279 -0
- package/dist/templates/default/convex/validators.ts +74 -0
- package/dist/templates/default/convex/webhook.ts +193 -0
- package/dist/templates/default/convex.json +6 -0
- package/dist/templates/default/eas.json +56 -0
- package/dist/templates/default/fingerprint.config.js +9 -0
- package/dist/templates/default/hooks/use-debounce.ts +20 -0
- package/dist/templates/default/hooks/use-deep-link.ts +43 -0
- package/dist/templates/default/hooks/use-navigation-tracking.ts +15 -0
- package/dist/templates/default/hooks/use-network.ts +11 -0
- package/dist/templates/default/hooks/use-notifications.ts +107 -0
- package/dist/templates/default/hooks/use-onboarding.ts +15 -0
- package/dist/templates/default/hooks/use-reduced-motion.ts +11 -0
- package/dist/templates/default/hooks/use-theme.ts +53 -0
- package/dist/templates/default/hooks/use-updates.ts +86 -0
- package/dist/templates/default/lib/a11y.ts +5 -0
- package/dist/templates/default/lib/app.ts +14 -0
- package/dist/templates/default/lib/assets.ts +17 -0
- package/dist/templates/default/lib/auth-client.ts +21 -0
- package/dist/templates/default/lib/convex-auth.tsx +79 -0
- package/dist/templates/default/lib/deep-link.ts +71 -0
- package/dist/templates/default/lib/dev-menu.ts +119 -0
- package/dist/templates/default/lib/device.ts +40 -0
- package/dist/templates/default/lib/dynamic-font.ts +49 -0
- package/dist/templates/default/lib/env.ts +10 -0
- package/dist/templates/default/lib/haptics.ts +24 -0
- package/dist/templates/default/lib/notifications.ts +276 -0
- package/dist/templates/default/lib/preferences.ts +45 -0
- package/dist/templates/default/lib/schemas.ts +137 -0
- package/dist/templates/default/lib/storage.ts +47 -0
- package/dist/templates/default/lib/updates.ts +107 -0
- package/dist/templates/default/metro.config.js +14 -0
- package/dist/templates/default/package.json +129 -0
- package/dist/templates/default/patches/PR-368.patch +91 -0
- package/dist/templates/default/patches/convex-dev-better-auth-0.12.2.tgz +0 -0
- package/dist/templates/default/plugins/README.md +9 -0
- package/dist/templates/default/plugins/with-auto-signing.js +45 -0
- package/dist/templates/default/plugins/with-pod-deployment-target.js +35 -0
- package/dist/templates/default/scripts/README.md +36 -0
- package/dist/templates/default/scripts/_run.mjs +77 -0
- package/dist/templates/default/scripts/clean.ts +543 -0
- package/dist/templates/default/scripts/rotate-apple-jwt.mjs +80 -0
- package/dist/templates/default/store.config.json +58 -0
- package/dist/templates/default/tsconfig.json +13 -0
- package/dist/templates/default/vitest.config.ts +21 -0
- 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
|
+
}
|
|
File without changes
|
|
@@ -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
|
+
};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|