Compare commits
10 Commits
86303e5c84
...
v0.1.15
| Author | SHA1 | Date | |
|---|---|---|---|
| 67c132d88b | |||
| f1a4b58234 | |||
| dca76ea394 | |||
| af8ec98bb4 | |||
| c43b913dde | |||
| 256b338ae3 | |||
| ec95406305 | |||
| 6bd1dc8358 | |||
| d3d73c255e | |||
| 72cfbf41f3 |
@@ -89,6 +89,17 @@ jobs:
|
|||||||
[ -n "$KEYSTORE_STORE_PASSWORD" ] && echo "KEYSTORE_STORE_PASSWORD: set" || echo "KEYSTORE_STORE_PASSWORD: EMPTY"
|
[ -n "$KEYSTORE_STORE_PASSWORD" ] && echo "KEYSTORE_STORE_PASSWORD: set" || echo "KEYSTORE_STORE_PASSWORD: EMPTY"
|
||||||
[ -n "$KEYSTORE_KEY_PASSWORD" ] && echo "KEYSTORE_KEY_PASSWORD: set" || echo "KEYSTORE_KEY_PASSWORD: EMPTY"
|
[ -n "$KEYSTORE_KEY_PASSWORD" ] && echo "KEYSTORE_KEY_PASSWORD: set" || echo "KEYSTORE_KEY_PASSWORD: EMPTY"
|
||||||
|
|
||||||
|
- name: Patch native modules for Android 15 16KB page size
|
||||||
|
run: |
|
||||||
|
WORKLETS="node_modules/react-native-worklets/android/CMakeLists.txt"
|
||||||
|
REANIMATED="node_modules/react-native-reanimated/android/CMakeLists.txt"
|
||||||
|
if [ -f "$WORKLETS" ] && ! grep -q "max-page-size" "$WORKLETS"; then
|
||||||
|
printf '\ntarget_link_options(worklets PRIVATE "-Wl,-z,max-page-size=16384")\n' >> "$WORKLETS"
|
||||||
|
fi
|
||||||
|
if [ -f "$REANIMATED" ] && ! grep -q "max-page-size" "$REANIMATED"; then
|
||||||
|
printf '\ntarget_link_options(reanimated PRIVATE "-Wl,-z,max-page-size=16384")\n' >> "$REANIMATED"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Build signed APK
|
- name: Build signed APK
|
||||||
run: ./build-apk.sh
|
run: ./build-apk.sh
|
||||||
|
|
||||||
@@ -103,6 +114,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
PREV_TAG=$(git tag --sort=-version:refname | grep -v "^${{ github.ref_name }}$" | head -1)
|
PREV_TAG=$(git tag --sort=-version:refname | grep -v "^${{ github.ref_name }}$" | head -1)
|
||||||
echo "Previous tag: $PREV_TAG"
|
echo "Previous tag: $PREV_TAG"
|
||||||
|
echo "prev_tag=$PREV_TAG" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
FEATS=$(git log "${PREV_TAG}..HEAD" --pretty=format:"%s" --no-merges \
|
FEATS=$(git log "${PREV_TAG}..HEAD" --pretty=format:"%s" --no-merges \
|
||||||
| grep -E "^feat(\([^)]+\))?: " \
|
| grep -E "^feat(\([^)]+\))?: " \
|
||||||
@@ -129,9 +141,45 @@ jobs:
|
|||||||
## SheetHappens ${{ github.ref_name }}
|
## SheetHappens ${{ github.ref_name }}
|
||||||
|
|
||||||
${{ steps.changelog.outputs.changelog }}
|
${{ steps.changelog.outputs.changelog }}
|
||||||
|
[Full changelog](https://github.com/${{ github.repository }}/compare/${{ steps.changelog.outputs.prev_tag }}...${{ github.ref_name }}) · [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md)
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
1. Enable "Unknown sources" on the device
|
1. Enable "Unknown sources" on the device
|
||||||
2. Transfer the APK to the device and open it to install
|
2. Transfer the APK to the device and open it to install
|
||||||
files: ${{ steps.apk.outputs.path }}
|
files: ${{ steps.apk.outputs.path }}
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: ${{ contains(github.ref_name, '-') }}
|
prerelease: ${{ contains(github.ref_name, '-') }}
|
||||||
|
|
||||||
|
- name: Create Gitea Release
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
TAG: ${{ github.ref_name }}
|
||||||
|
PREV_TAG: ${{ steps.changelog.outputs.prev_tag }}
|
||||||
|
CHANGELOG: ${{ steps.changelog.outputs.changelog }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
if [ -z "$GITEA_TOKEN" ]; then
|
||||||
|
echo "GITEA_TOKEN not set — skipping Gitea release"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
BODY="## SheetHappens ${TAG}
|
||||||
|
|
||||||
|
${CHANGELOG}
|
||||||
|
|
||||||
|
[Full changelog](https://homegit.gyozamancave.fr/billisdead/SheetHappens/compare/${PREV_TAG}...${TAG}) · [CHANGELOG.md](https://homegit.gyozamancave.fr/billisdead/SheetHappens/raw/branch/main/CHANGELOG.md)
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
Download the APK from the [GitHub release](https://github.com/${GH_REPO}/releases/tag/${TAG}), enable \"Unknown sources\" on the device and install."
|
||||||
|
|
||||||
|
curl -sf -X POST \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"https://homegit.gyozamancave.fr/api/v1/repos/billisdead/SheetHappens/releases" \
|
||||||
|
-d "{
|
||||||
|
\"tag_name\": \"${TAG}\",
|
||||||
|
\"name\": \"SheetHappens ${TAG}\",
|
||||||
|
\"body\": $(printf '%s' "$BODY" | jq -Rs .),
|
||||||
|
\"draft\": false,
|
||||||
|
\"prerelease\": $([ "${TAG#*-}" != "${TAG}" ] && echo true || echo false)
|
||||||
|
}"
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to SheetHappens are documented here.
|
||||||
|
Each release links to the full diff for detailed context.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v0.1.7] — 2026-06-22
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- Revert splash screen overrides that caused Android crash-to-desktop — expo-router already manages the splash lifecycle internally
|
||||||
|
- Remove redundant `SafeAreaProvider` wrapper (expo-router's `ExpoRoot` already injects it)
|
||||||
|
|
||||||
|
[View changes](https://github.com/pirona/SheetHappens/compare/v0.1.6...v0.1.7)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v0.1.6] — 2026-06-22
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- Prevent black screen on launch by holding splash until SecureStore settings load
|
||||||
|
- Add `splash.backgroundColor` to `app.json` to match app theme on Android
|
||||||
|
|
||||||
|
[View changes](https://github.com/pirona/SheetHappens/compare/v0.1.5...v0.1.6)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v0.1.5] — 2026-06-22
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- Fix signed APK release: inject signing secrets via env vars, write `signing.env` with `printf %q` to handle special characters
|
||||||
|
- Add `signing.env` verification step in CI
|
||||||
|
|
||||||
|
[View changes](https://github.com/pirona/SheetHappens/compare/v0.1.0...v0.1.5)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v0.1.0] — Initial release
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- Incident log with SQLite persistence
|
||||||
|
- Voice input via `expo-speech-recognition`
|
||||||
|
- Edit mode, service autocomplete
|
||||||
|
- Dark theme (NativeWind + expo-router)
|
||||||
|
- Onboarding flow
|
||||||
|
- Signed APK via GitHub Actions CI
|
||||||
@@ -6,9 +6,6 @@
|
|||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"userInterfaceStyle": "dark",
|
"userInterfaceStyle": "dark",
|
||||||
"backgroundColor": "#0f1117",
|
"backgroundColor": "#0f1117",
|
||||||
"splash": {
|
|
||||||
"backgroundColor": "#0f1117"
|
|
||||||
},
|
|
||||||
"scheme": "sheethappens",
|
"scheme": "sheethappens",
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
|
|||||||
+19
-29
@@ -1,22 +1,14 @@
|
|||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { Stack, router, SplashScreen } from "expo-router";
|
import { Stack, router } from "expo-router";
|
||||||
import { StatusBar } from "expo-status-bar";
|
import { StatusBar } from "expo-status-bar";
|
||||||
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
||||||
import { SafeAreaProvider } from "react-native-safe-area-context";
|
|
||||||
import "../global.css";
|
import "../global.css";
|
||||||
import { Colors } from "@/constants/theme";
|
import { Colors } from "@/constants/theme";
|
||||||
import { useSettings } from "@/hooks/useSettings";
|
import { useSettings } from "@/hooks/useSettings";
|
||||||
|
|
||||||
SplashScreen.preventAutoHideAsync();
|
|
||||||
|
|
||||||
export default function RootLayout() {
|
export default function RootLayout() {
|
||||||
const { settings, ready } = useSettings();
|
const { settings, ready } = useSettings();
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!ready) return;
|
|
||||||
SplashScreen.hideAsync();
|
|
||||||
}, [ready]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!ready) return;
|
if (!ready) return;
|
||||||
if (!settings.onboardingDone) {
|
if (!settings.onboardingDone) {
|
||||||
@@ -25,25 +17,23 @@ export default function RootLayout() {
|
|||||||
}, [ready, settings.onboardingDone]);
|
}, [ready, settings.onboardingDone]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaProvider>
|
<GestureHandlerRootView style={{ flex: 1, backgroundColor: Colors.bg }}>
|
||||||
<GestureHandlerRootView style={{ flex: 1, backgroundColor: Colors.bg }}>
|
<StatusBar style="light" />
|
||||||
<StatusBar style="light" />
|
<Stack
|
||||||
<Stack
|
screenOptions={{
|
||||||
screenOptions={{
|
headerStyle: { backgroundColor: Colors.surface },
|
||||||
headerStyle: { backgroundColor: Colors.surface },
|
headerTintColor: Colors.text1,
|
||||||
headerTintColor: Colors.text1,
|
headerTitleStyle: { color: Colors.text1 },
|
||||||
headerTitleStyle: { color: Colors.text1 },
|
contentStyle: { backgroundColor: Colors.bg },
|
||||||
contentStyle: { backgroundColor: Colors.bg },
|
animation: "slide_from_right",
|
||||||
animation: "slide_from_right",
|
}}
|
||||||
}}
|
>
|
||||||
>
|
<Stack.Screen name="index" options={{ title: "SheetHappens" }} />
|
||||||
<Stack.Screen name="index" options={{ title: "SheetHappens" }} />
|
<Stack.Screen name="new" options={{ title: "New Incident", presentation: "modal" }} />
|
||||||
<Stack.Screen name="new" options={{ title: "New Incident", presentation: "modal" }} />
|
<Stack.Screen name="incident/[id]" options={{ title: "Incident" }} />
|
||||||
<Stack.Screen name="incident/[id]" options={{ title: "Incident" }} />
|
<Stack.Screen name="settings" options={{ title: "Settings" }} />
|
||||||
<Stack.Screen name="settings" options={{ title: "Settings" }} />
|
<Stack.Screen name="onboarding" options={{ headerShown: false }} />
|
||||||
<Stack.Screen name="onboarding" options={{ headerShown: false }} />
|
</Stack>
|
||||||
</Stack>
|
</GestureHandlerRootView>
|
||||||
</GestureHandlerRootView>
|
|
||||||
</SafeAreaProvider>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useRef, useState } from "react";
|
import { useCallback, useEffect, useRef, useState } from "react";
|
||||||
import {
|
import {
|
||||||
View,
|
View,
|
||||||
Text,
|
Text,
|
||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
Pressable,
|
Pressable,
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
} from "react-native";
|
} from "react-native";
|
||||||
import { router } from "expo-router";
|
import { router, useFocusEffect } from "expo-router";
|
||||||
import { getIncidents } from "@/lib/db";
|
import { getIncidents } from "@/lib/db";
|
||||||
import { useSettings } from "@/hooks/useSettings";
|
import { useSettings } from "@/hooks/useSettings";
|
||||||
import type { Incident } from "@/types/incident";
|
import type { Incident } from "@/types/incident";
|
||||||
@@ -26,9 +26,11 @@ export default function HomeScreen() {
|
|||||||
}
|
}
|
||||||
}, [ready, settings.homeView]);
|
}, [ready, settings.homeView]);
|
||||||
|
|
||||||
useEffect(() => {
|
useFocusEffect(
|
||||||
loadIncidents();
|
useCallback(() => {
|
||||||
}, []);
|
loadIncidents();
|
||||||
|
}, [])
|
||||||
|
);
|
||||||
|
|
||||||
async function loadIncidents() {
|
async function loadIncidents() {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|||||||
+2
-2
@@ -46,7 +46,7 @@ const LABEL_STYLE = {
|
|||||||
letterSpacing: 0.5,
|
letterSpacing: 0.5,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
type VoiceField = "title" | "symptom" | "rootCause" | "fix";
|
type VoiceField = "title" | "service" | "symptom" | "rootCause" | "fix";
|
||||||
|
|
||||||
export default function NewIncidentScreen() {
|
export default function NewIncidentScreen() {
|
||||||
const { editId } = useLocalSearchParams<{ editId?: string }>();
|
const { editId } = useLocalSearchParams<{ editId?: string }>();
|
||||||
@@ -224,7 +224,7 @@ export default function NewIncidentScreen() {
|
|||||||
returnKeyType="next"
|
returnKeyType="next"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Text style={[LABEL_STYLE, { marginBottom: 6 }]}>Service</Text>
|
{labelRow("Service", "service")}
|
||||||
<TextInput
|
<TextInput
|
||||||
style={FIELD_STYLE}
|
style={FIELD_STYLE}
|
||||||
value={form.service}
|
value={form.service}
|
||||||
|
|||||||
@@ -77,6 +77,32 @@ info "Running expo prebuild (Android)…"
|
|||||||
cd "$SCRIPT_DIR"
|
cd "$SCRIPT_DIR"
|
||||||
npx expo prebuild --platform android --clean --no-install
|
npx expo prebuild --platform android --clean --no-install
|
||||||
|
|
||||||
|
# ─── 4.5. Patch native modules — 16KB page size (Android 15) ──────────────
|
||||||
|
info "Patching native modules for 16KB page size support (Android 15)…"
|
||||||
|
|
||||||
|
WORKLETS_CMAKE="$SCRIPT_DIR/node_modules/react-native-worklets/android/CMakeLists.txt"
|
||||||
|
REANIMATED_CMAKE="$SCRIPT_DIR/node_modules/react-native-reanimated/android/CMakeLists.txt"
|
||||||
|
|
||||||
|
if [ -f "$WORKLETS_CMAKE" ] && ! grep -q "max-page-size" "$WORKLETS_CMAKE"; then
|
||||||
|
printf '\ntarget_link_options(worklets PRIVATE "-Wl,-z,max-page-size=16384")\n' >> "$WORKLETS_CMAKE"
|
||||||
|
info "Patched react-native-worklets for 16KB pages"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$REANIMATED_CMAKE" ] && ! grep -q "max-page-size" "$REANIMATED_CMAKE"; then
|
||||||
|
printf '\ntarget_link_options(reanimated PRIVATE "-Wl,-z,max-page-size=16384")\n' >> "$REANIMATED_CMAKE"
|
||||||
|
info "Patched react-native-reanimated for 16KB pages"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─── 4.6. Disable New Architecture (Android 15 compat) ────────────────────
|
||||||
|
GRADLE_PROPS_NEWARCH="$SCRIPT_DIR/android/gradle.properties"
|
||||||
|
if [ -f "$GRADLE_PROPS_NEWARCH" ]; then
|
||||||
|
sed -i 's/^newArchEnabled=true/newArchEnabled=false/' "$GRADLE_PROPS_NEWARCH"
|
||||||
|
if ! grep -q "^newArchEnabled=" "$GRADLE_PROPS_NEWARCH"; then
|
||||||
|
echo "newArchEnabled=false" >> "$GRADLE_PROPS_NEWARCH"
|
||||||
|
fi
|
||||||
|
info "New Architecture disabled in gradle.properties"
|
||||||
|
fi
|
||||||
|
|
||||||
# ─── 5. Patch build.gradle — inject release signingConfig ──────────────────
|
# ─── 5. Patch build.gradle — inject release signingConfig ──────────────────
|
||||||
info "Patching android/app/build.gradle for release signing…"
|
info "Patching android/app/build.gradle for release signing…"
|
||||||
|
|
||||||
|
|||||||
Generated
+129
-143
@@ -19,7 +19,7 @@
|
|||||||
"expo-sqlite": "~56.0.5",
|
"expo-sqlite": "~56.0.5",
|
||||||
"expo-status-bar": "~56.0.4",
|
"expo-status-bar": "~56.0.4",
|
||||||
"nativewind": "~4.2.5",
|
"nativewind": "~4.2.5",
|
||||||
"react": "19.2.7",
|
"react": "19.2.3",
|
||||||
"react-native": "0.85.3",
|
"react-native": "0.85.3",
|
||||||
"react-native-gesture-handler": "~3.0.2",
|
"react-native-gesture-handler": "~3.0.2",
|
||||||
"react-native-reanimated": "~4.4.1",
|
"react-native-reanimated": "~4.4.1",
|
||||||
@@ -1154,99 +1154,6 @@
|
|||||||
"integrity": "sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==",
|
"integrity": "sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==",
|
||||||
"license": "MIT AND Apache-2.0"
|
"license": "MIT AND Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@expo/cli": {
|
|
||||||
"version": "56.1.16",
|
|
||||||
"resolved": "https://registry.npmjs.org/@expo/cli/-/cli-56.1.16.tgz",
|
|
||||||
"integrity": "sha512-VBQn0mqAwc67b9Cn0RVXyeodghomAx5xGRhA/bXaQzuxDjMQk0zIOb6pXMZX7yiIwJW66UZt/zQiJNSv6aWJYw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@expo/code-signing-certificates": "^0.0.6",
|
|
||||||
"@expo/config": "~56.0.9",
|
|
||||||
"@expo/config-plugins": "~56.0.9",
|
|
||||||
"@expo/devcert": "^1.2.1",
|
|
||||||
"@expo/env": "~2.3.0",
|
|
||||||
"@expo/image-utils": "^0.10.1",
|
|
||||||
"@expo/inline-modules": "^0.0.12",
|
|
||||||
"@expo/json-file": "^10.2.0",
|
|
||||||
"@expo/log-box": "^56.0.13",
|
|
||||||
"@expo/metro": "~56.0.0",
|
|
||||||
"@expo/metro-config": "~56.0.14",
|
|
||||||
"@expo/metro-file-map": "^56.0.3",
|
|
||||||
"@expo/osascript": "^2.6.0",
|
|
||||||
"@expo/package-manager": "^1.12.1",
|
|
||||||
"@expo/plist": "^0.7.0",
|
|
||||||
"@expo/prebuild-config": "^56.0.16",
|
|
||||||
"@expo/require-utils": "^56.1.3",
|
|
||||||
"@expo/router-server": "^56.0.14",
|
|
||||||
"@expo/schema-utils": "^56.0.0",
|
|
||||||
"@expo/spawn-async": "^1.8.0",
|
|
||||||
"@expo/ws-tunnel": "^2.0.0",
|
|
||||||
"@expo/xcpretty": "^4.4.4",
|
|
||||||
"@react-native/dev-middleware": "0.85.3",
|
|
||||||
"accepts": "^1.3.8",
|
|
||||||
"arg": "^5.0.2",
|
|
||||||
"bplist-creator": "0.1.0",
|
|
||||||
"bplist-parser": "^0.3.1",
|
|
||||||
"chalk": "^4.0.0",
|
|
||||||
"ci-info": "^3.3.0",
|
|
||||||
"compression": "^1.7.4",
|
|
||||||
"connect": "^3.7.0",
|
|
||||||
"debug": "^4.3.4",
|
|
||||||
"dnssd-advertise": "^1.1.4",
|
|
||||||
"expo-server": "^56.0.5",
|
|
||||||
"fetch-nodeshim": "^0.4.10",
|
|
||||||
"getenv": "^2.0.0",
|
|
||||||
"glob": "^13.0.0",
|
|
||||||
"lan-network": "^0.2.1",
|
|
||||||
"multitars": "^1.0.0",
|
|
||||||
"node-forge": "^1.3.3",
|
|
||||||
"npm-package-arg": "^11.0.0",
|
|
||||||
"ora": "^3.4.0",
|
|
||||||
"picomatch": "^4.0.4",
|
|
||||||
"pretty-format": "^29.7.0",
|
|
||||||
"progress": "^2.0.3",
|
|
||||||
"prompts": "^2.3.2",
|
|
||||||
"resolve-from": "^5.0.0",
|
|
||||||
"semver": "^7.6.0",
|
|
||||||
"send": "^0.19.0",
|
|
||||||
"slugify": "^1.3.4",
|
|
||||||
"stacktrace-parser": "^0.1.10",
|
|
||||||
"structured-headers": "^0.4.1",
|
|
||||||
"terminal-link": "^2.1.1",
|
|
||||||
"toqr": "^0.1.1",
|
|
||||||
"wrap-ansi": "^7.0.0",
|
|
||||||
"ws": "^8.12.1",
|
|
||||||
"zod": "^3.25.76"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"expo-internal": "main.js"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"expo": "*",
|
|
||||||
"expo-router": "*",
|
|
||||||
"react-native": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"expo-router": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react-native": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@expo/cli/node_modules/semver": {
|
|
||||||
"version": "7.8.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
|
|
||||||
"integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
|
|
||||||
"license": "ISC",
|
|
||||||
"bin": {
|
|
||||||
"semver": "bin/semver.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@expo/code-signing-certificates": {
|
"node_modules/@expo/code-signing-certificates": {
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz",
|
||||||
@@ -1659,9 +1566,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@expo/prebuild-config/node_modules/semver": {
|
"node_modules/@expo/prebuild-config/node_modules/semver": {
|
||||||
"version": "7.8.4",
|
"version": "7.8.5",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
||||||
"integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
|
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
@@ -1689,40 +1596,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@expo/router-server": {
|
|
||||||
"version": "56.0.14",
|
|
||||||
"resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-56.0.14.tgz",
|
|
||||||
"integrity": "sha512-2UCTtZfcq1ZPgp3wk8/+sq9DvFI9UxrPr1jcEKMAF2DGAJLosnpc8GWNNg2hkjt6SHUOdFHIPxujWPYyho2y3A==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^4.3.4"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@expo/metro-runtime": "^56.0.15",
|
|
||||||
"expo": "*",
|
|
||||||
"expo-constants": "^56.0.18",
|
|
||||||
"expo-font": "^56.0.6",
|
|
||||||
"expo-router": "*",
|
|
||||||
"expo-server": "^56.0.5",
|
|
||||||
"react": "*",
|
|
||||||
"react-dom": "*",
|
|
||||||
"react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@expo/metro-runtime": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"expo-router": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react-dom": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react-server-dom-webpack": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@expo/schema-utils": {
|
"node_modules/@expo/schema-utils": {
|
||||||
"version": "56.0.1",
|
"version": "56.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-56.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-56.0.1.tgz",
|
||||||
@@ -4306,6 +4179,121 @@
|
|||||||
"react-native": "*"
|
"react-native": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/expo/node_modules/@expo/cli": {
|
||||||
|
"version": "56.1.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@expo/cli/-/cli-56.1.16.tgz",
|
||||||
|
"integrity": "sha512-VBQn0mqAwc67b9Cn0RVXyeodghomAx5xGRhA/bXaQzuxDjMQk0zIOb6pXMZX7yiIwJW66UZt/zQiJNSv6aWJYw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@expo/code-signing-certificates": "^0.0.6",
|
||||||
|
"@expo/config": "~56.0.9",
|
||||||
|
"@expo/config-plugins": "~56.0.9",
|
||||||
|
"@expo/devcert": "^1.2.1",
|
||||||
|
"@expo/env": "~2.3.0",
|
||||||
|
"@expo/image-utils": "^0.10.1",
|
||||||
|
"@expo/inline-modules": "^0.0.12",
|
||||||
|
"@expo/json-file": "^10.2.0",
|
||||||
|
"@expo/log-box": "^56.0.13",
|
||||||
|
"@expo/metro": "~56.0.0",
|
||||||
|
"@expo/metro-config": "~56.0.14",
|
||||||
|
"@expo/metro-file-map": "^56.0.3",
|
||||||
|
"@expo/osascript": "^2.6.0",
|
||||||
|
"@expo/package-manager": "^1.12.1",
|
||||||
|
"@expo/plist": "^0.7.0",
|
||||||
|
"@expo/prebuild-config": "^56.0.16",
|
||||||
|
"@expo/require-utils": "^56.1.3",
|
||||||
|
"@expo/router-server": "^56.0.14",
|
||||||
|
"@expo/schema-utils": "^56.0.0",
|
||||||
|
"@expo/spawn-async": "^1.8.0",
|
||||||
|
"@expo/ws-tunnel": "^2.0.0",
|
||||||
|
"@expo/xcpretty": "^4.4.4",
|
||||||
|
"@react-native/dev-middleware": "0.85.3",
|
||||||
|
"accepts": "^1.3.8",
|
||||||
|
"arg": "^5.0.2",
|
||||||
|
"bplist-creator": "0.1.0",
|
||||||
|
"bplist-parser": "^0.3.1",
|
||||||
|
"chalk": "^4.0.0",
|
||||||
|
"ci-info": "^3.3.0",
|
||||||
|
"compression": "^1.7.4",
|
||||||
|
"connect": "^3.7.0",
|
||||||
|
"debug": "^4.3.4",
|
||||||
|
"dnssd-advertise": "^1.1.4",
|
||||||
|
"expo-server": "^56.0.5",
|
||||||
|
"fetch-nodeshim": "^0.4.10",
|
||||||
|
"getenv": "^2.0.0",
|
||||||
|
"glob": "^13.0.0",
|
||||||
|
"lan-network": "^0.2.1",
|
||||||
|
"multitars": "^1.0.0",
|
||||||
|
"node-forge": "^1.3.3",
|
||||||
|
"npm-package-arg": "^11.0.0",
|
||||||
|
"ora": "^3.4.0",
|
||||||
|
"picomatch": "^4.0.4",
|
||||||
|
"pretty-format": "^29.7.0",
|
||||||
|
"progress": "^2.0.3",
|
||||||
|
"prompts": "^2.3.2",
|
||||||
|
"resolve-from": "^5.0.0",
|
||||||
|
"semver": "^7.6.0",
|
||||||
|
"send": "^0.19.0",
|
||||||
|
"slugify": "^1.3.4",
|
||||||
|
"stacktrace-parser": "^0.1.10",
|
||||||
|
"structured-headers": "^0.4.1",
|
||||||
|
"terminal-link": "^2.1.1",
|
||||||
|
"toqr": "^0.1.1",
|
||||||
|
"wrap-ansi": "^7.0.0",
|
||||||
|
"ws": "^8.12.1",
|
||||||
|
"zod": "^3.25.76"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"expo-internal": "main.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"expo": "*",
|
||||||
|
"expo-router": "*",
|
||||||
|
"react-native": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"expo-router": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-native": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": {
|
||||||
|
"version": "56.0.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-56.0.14.tgz",
|
||||||
|
"integrity": "sha512-2UCTtZfcq1ZPgp3wk8/+sq9DvFI9UxrPr1jcEKMAF2DGAJLosnpc8GWNNg2hkjt6SHUOdFHIPxujWPYyho2y3A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.3.4"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@expo/metro-runtime": "^56.0.15",
|
||||||
|
"expo": "*",
|
||||||
|
"expo-constants": "^56.0.18",
|
||||||
|
"expo-font": "^56.0.6",
|
||||||
|
"expo-router": "*",
|
||||||
|
"expo-server": "^56.0.5",
|
||||||
|
"react": "*",
|
||||||
|
"react-dom": "*",
|
||||||
|
"react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@expo/metro-runtime": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"expo-router": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-dom": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-server-dom-webpack": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/expo/node_modules/expo-modules-core": {
|
"node_modules/expo/node_modules/expo-modules-core": {
|
||||||
"version": "56.0.17",
|
"version": "56.0.17",
|
||||||
"resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-56.0.17.tgz",
|
"resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-56.0.17.tgz",
|
||||||
@@ -4359,8 +4347,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
|
||||||
"integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
|
"integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
},
|
},
|
||||||
@@ -6124,9 +6110,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/npm-package-arg/node_modules/semver": {
|
"node_modules/npm-package-arg/node_modules/semver": {
|
||||||
"version": "7.8.4",
|
"version": "7.8.5",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
||||||
"integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
|
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
@@ -6722,9 +6708,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react": {
|
"node_modules/react": {
|
||||||
"version": "19.2.7",
|
"version": "19.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
|
||||||
"integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
|
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
@@ -6762,16 +6748,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-dom": {
|
"node_modules/react-dom": {
|
||||||
"version": "19.2.7",
|
"version": "19.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
|
||||||
"integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
|
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"scheduler": "^0.27.0"
|
"scheduler": "^0.27.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"react": "^19.2.7"
|
"react": "^19.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-fast-compare": {
|
"node_modules/react-fast-compare": {
|
||||||
|
|||||||
+5
-1
@@ -19,7 +19,7 @@
|
|||||||
"expo-sqlite": "~56.0.5",
|
"expo-sqlite": "~56.0.5",
|
||||||
"expo-status-bar": "~56.0.4",
|
"expo-status-bar": "~56.0.4",
|
||||||
"nativewind": "~4.2.5",
|
"nativewind": "~4.2.5",
|
||||||
"react": "19.2.7",
|
"react": "19.2.3",
|
||||||
"react-native": "0.85.3",
|
"react-native": "0.85.3",
|
||||||
"react-native-gesture-handler": "~3.0.2",
|
"react-native-gesture-handler": "~3.0.2",
|
||||||
"react-native-reanimated": "~4.4.1",
|
"react-native-reanimated": "~4.4.1",
|
||||||
@@ -27,6 +27,10 @@
|
|||||||
"react-native-screens": "~4.25.2",
|
"react-native-screens": "~4.25.2",
|
||||||
"tailwindcss": "~3.4.19"
|
"tailwindcss": "~3.4.19"
|
||||||
},
|
},
|
||||||
|
"overrides": {
|
||||||
|
"react": "19.2.3",
|
||||||
|
"react-dom": "19.2.3"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.0",
|
"@babel/core": "^7.25.0",
|
||||||
"@expo/metro-config": "~56.0.14",
|
"@expo/metro-config": "~56.0.14",
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
// Exclude native build for packages not used in this project.
|
||||||
|
// react-native-gesture-handler detects their absence and falls back to its
|
||||||
|
// noreanimated codepath, so GestureHandlerRootView continues to work.
|
||||||
|
module.exports = {
|
||||||
|
dependencies: {
|
||||||
|
'react-native-reanimated': {
|
||||||
|
platforms: { android: null },
|
||||||
|
},
|
||||||
|
'react-native-worklets': {
|
||||||
|
platforms: { android: null },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user