Files
Folo/apps/mobile/package.json
T
DIYgod b7df9ad01e fix(i18n): stop title-casing non-English titles and labels
Entry titles and settings labels went through title-case unconditionally,
but it applies English capitalization rules, so with a French UI and French
feeds titles rendered as "Pourquoi Votre Café Est Une Arme De Défense" and
settings labels as "Afficher Le Nombre De Non Lus". CJK titles were also
touched ("iOS 27 beta" became "IOS 27 Beta").

titleCaseIfEnglish in @follow/utils only applies title case when the
language is English (en, en-US, en_GB, or franc's eng). On desktop, entry
titles use the entry language and translated titles the translation
language, falling back to the UI language when unknown; settings labels
and section titles use the UI language. Mobile grouped list cells use the
UI language too. AI chat tool names keep title case since they are English
identifiers.

Mobile no longer imports title-case directly, so the dependency moves to
@follow/utils.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 09:46:44 +08:00

202 lines
6.8 KiB
JSON

{
"name": "@follow/mobile",
"version": "0.5.10",
"private": true,
"main": "src/main.tsx",
"scripts": {
"android": "expo run:android",
"bump": "vv",
"dev": "npm run start",
"e2e:android": "sh ./e2e/run-maestro.sh android",
"e2e:bootstrap:ios:auth": "tsx scripts/e2e-prod-ios-auth-bootstrap.ts",
"e2e:bootstrap:ios:prod-auth": "pnpm run e2e:bootstrap:ios:auth",
"e2e:doctor": "sh -c 'for f in e2e/flows/shared/*.yaml e2e/flows/android/*.yaml e2e/flows/ios/*.yaml; do maestro check-syntax $f; done'",
"e2e:ios": "sh ./e2e/run-maestro.sh ios",
"e2e:ios:bootstrap": "sh ./e2e/run-maestro.sh ios bootstrap-auth",
"eas-build-post-install": "rm -rf $TMPDIR/metro-cache",
"eas-build-pre-install": "command -v pod >/dev/null 2>&1 && pod repo update || echo 'CocoaPods not found, skipping pod repo update'",
"ios": "expo run:ios",
"ios:device": "expo run:ios --device",
"start": "expo start --dev-client",
"start:clean": "expo start --dev-client --clear",
"test": "vitest run --config vitest.config.ts",
"typecheck": "tsc --noEmit",
"update": "tsx scripts/expo-update.ts",
"update:bundle": "node ../../.github/scripts/build-ota-release.mjs",
"update:export": "expo export -p ios -p android --output-dir dist",
"web": "expo start --web"
},
"dependencies": {
"@better-auth/expo": "1.7.5",
"@expo/dom-webview": "57.0.1",
"@expo/metro-runtime": "57.0.16",
"@expo/react-native-action-sheet": "4.1.1",
"@follow-app/client-sdk": "catalog:",
"@follow/components": "workspace:*",
"@follow/constants": "workspace:*",
"@follow/database": "workspace:*",
"@follow/hooks": "workspace:*",
"@follow/models": "workspace:*",
"@follow/shared": "workspace:*",
"@follow/store": "workspace:*",
"@follow/tracker": "workspace:*",
"@follow/types": "workspace:*",
"@follow/utils": "workspace:*",
"@gorhom/portal": "1.0.14",
"@hookform/resolvers": "5.9.1",
"@react-native-community/image-editor": "4.3.1",
"@react-native-firebase/analytics": "26.4.0",
"@react-native-firebase/app": "26.4.0",
"@react-native-firebase/app-check": "26.4.0",
"@react-native-firebase/messaging": "26.4.0",
"@react-native-masked-view/masked-view": "0.3.2",
"@react-native-menu/menu": "2.0.0",
"@react-native-picker/picker": "2.11.4",
"@rntp/player": "5.9.2",
"@shikijs/themes": "4.4.3",
"@shopify/flash-list": "2.3.2",
"@tanstack/query-sync-storage-persister": "5.103.2",
"@tanstack/react-query": "5.103.2",
"@tanstack/react-query-persist-client": "5.103.2",
"@types/qrcode": "1.5.6",
"better-auth": "1.7.5",
"camelcase-keys": "10.0.3",
"dayjs": "1.11.23",
"dnum": "2.17.0",
"es-toolkit": "1.52.0",
"expo": "57.0.24",
"expo-apple-authentication": "57.0.2",
"expo-application": "57.0.3",
"expo-background-task": "57.0.19",
"expo-blur": "57.0.3",
"expo-build-properties": "57.0.21",
"expo-clipboard": "57.0.2",
"expo-constants": "57.0.19",
"expo-dev-client": "57.0.19",
"expo-device": "57.0.2",
"expo-document-picker": "57.0.2",
"expo-file-system": "57.0.7",
"expo-glass-effect": "57.0.3",
"expo-haptics": "57.0.3",
"expo-iap": "5.6.3",
"expo-image": "57.0.5",
"expo-image-manipulator": "57.0.19",
"expo-image-picker": "57.0.19",
"expo-linear-gradient": "57.0.2",
"expo-linking": "57.0.10",
"expo-localization": "57.0.2",
"expo-media-library": "57.0.5",
"expo-network": "57.0.2",
"expo-notifications": "57.0.20",
"expo-secure-store": "57.0.4",
"expo-sharing": "57.0.21",
"expo-splash-screen": "57.0.9",
"expo-sqlite": "57.0.3",
"expo-status-bar": "57.0.1",
"expo-store-review": "57.0.3",
"expo-symbols": "57.0.3",
"expo-system-ui": "57.0.4",
"expo-task-manager": "57.0.19",
"expo-updates": "57.0.23",
"expo-video": "57.0.4",
"expo-web-browser": "57.0.3",
"foxact": "0.3.12",
"franc-min": "6.2.0",
"i18next": "26.4.2",
"jotai": "3.0.0",
"lru-cache": "11.5.3",
"nanoid": "6.0.1",
"nativewind": "4.2.7",
"ofetch": "1.5.1",
"posthog-react-native": "4.75.0",
"qrcode": "1.5.4",
"react": "19.2.8",
"react-dom": "19.2.8",
"react-error-boundary": "6.1.6",
"react-freeze": "1.0.4",
"react-hook-form": "7.88.0",
"react-i18next": "17.0.15",
"react-native": "0.86.3",
"react-native-awesome-slider": "2.9.0",
"react-native-bouncy-checkbox": "4.1.4",
"react-native-color-matrix-image-filters": "8.0.2",
"react-native-css-interop": "0.2.7",
"react-native-device-info": "15.0.2",
"react-native-edge-to-edge": "1.8.2",
"react-native-gesture-handler": "3.3.0",
"react-native-image-colors": "2.6.0",
"react-native-ios-context-menu": "3.2.1",
"react-native-ios-utilities": "5.2.0",
"react-native-keyboard-controller": "1.22.5",
"react-native-otp-entry": "1.8.6",
"react-native-pager-view": "9.0.4",
"react-native-reanimated": "4.7.0",
"react-native-root-siblings": "5.0.1",
"react-native-safe-area-context": "5.10.0",
"react-native-screens": "4.28.0",
"react-native-sheet-transitions": "0.1.2",
"react-native-svg": "15.15.5",
"react-native-uikit-colors": "1.0.0",
"react-native-volume-manager": "2.2.0",
"react-native-web": "0.21.2",
"react-native-webview": "14.0.1",
"react-native-worklets": "0.13.0",
"shiki": "4.4.3",
"tailwindcss": "3.4.19",
"use-sync-external-store": "1.7.0",
"usehooks-ts": "3.1.1",
"zeego": "3.0.6",
"zod": "4.6.5",
"zustand": "5.0.15"
},
"devDependencies": {
"@babel/core": "7.29.7",
"@follow/configs": "workspace:*",
"@tailwindcss/typography": "0.5.20",
"@types/react": "19.2.18",
"babel-plugin-inline-import": "3.0.0",
"babel-preset-expo": "57.0.12",
"expo-drizzle-studio-plugin": "0.2.1",
"nbump": "2.1.8",
"pathe": "2.0.3",
"postcss": "8.5.28",
"sf-symbols-typescript": "2.2.0",
"typescript": "catalog:"
},
"appName": "Folo",
"expo": {
"install": {
"exclude": [
"@shopify/flash-list",
"react",
"react-dom",
"react-native-keyboard-controller",
"react-native-gesture-handler",
"react-native-pager-view",
"react-native-reanimated",
"react-native-safe-area-context",
"react-native-svg",
"react-native-webview",
"react-native-worklets"
]
},
"autolinking": {
"nativeModulesDir": "./native"
},
"doctor": {
"appConfigFieldsNotSyncedCheck": {
"enabled": false
},
"reactNativeDirectoryCheck": {
"enabled": true,
"exclude": [
"@rntp/player",
"follow-native",
"react-native-color-matrix-image-filters"
],
"listUnknownPackages": false
}
}
}
}