mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-11 16:30:24 +01:00
Migrate the dynamic Expo config and all 12 local config plugins from CommonJS .js to typed TypeScript: - app.config.js -> app.config.ts (typed ConfigContext/ExpoConfig, behavior-identical port) - plugins/*.js -> plugins/*.ts with `ConfigPlugin` typings from expo/config-plugins; plugin options are now type-checked (withGitPod) - app.json plugin references updated to the .ts paths - imports unified on expo/config-plugins (some plugins used the @expo/config-plugins alias) Node evaluates the config at prebuild time and cannot parse TypeScript plugin modules on its own (verified empirically: Expo transpiles app.config.ts itself but not its imports), so the documented tsx approach is used: `import "tsx/cjs"` at the top of app.config.ts plus tsx as a devDependency. Validation: resolved prebuild configs (expo config --type prebuild) are byte-identical to the old JS config for both mobile and TV (modulo plugin path extensions and the builtAt timestamp); full `bun run prebuild` and `bun run prebuild:tv` pass and all Android plugin mods are present in the generated project (media3 exclusions, gradle properties, cast activity, network security config, alert colors).
172 lines
6.0 KiB
JSON
172 lines
6.0 KiB
JSON
{
|
|
"name": "streamyfin",
|
|
"main": "./index",
|
|
"version": "1.0.0",
|
|
"scripts": {
|
|
"submodule-reload": "git submodule update --init --remote --recursive",
|
|
"clean": "echo y | expo prebuild --clean",
|
|
"start": "bun run submodule-reload && expo start",
|
|
"prebuild": "cross-env EXPO_TV=0 bun run clean",
|
|
"prebuild:tv": "cross-env EXPO_TV=1 bun run clean",
|
|
"ios:install-metal-toolchain": "bash scripts/ios/install-metal-toolchain.sh",
|
|
"ios": "cross-env EXPO_TV=0 expo run:ios",
|
|
"ios:tv": "cross-env EXPO_TV=1 expo run:ios",
|
|
"android": "cross-env EXPO_TV=0 expo run:android",
|
|
"android:tv": "cross-env EXPO_TV=1 expo run:android",
|
|
"build:android:local": "cd android && cross-env NODE_ENV=production ./gradlew assembleRelease",
|
|
"ios:unsigned-build": "cross-env EXPO_TV=0 bun scripts/ios/build-ios.ts --production",
|
|
"ios:unsigned-build:tv": "cross-env EXPO_TV=1 bun scripts/ios/build-ios.ts --production",
|
|
"prepare": "husky",
|
|
"typecheck": "node scripts/typecheck.js",
|
|
"check": "biome check . --max-diagnostics 1000",
|
|
"lint": "biome check --write --unsafe --max-diagnostics 1000",
|
|
"format": "biome format --write .",
|
|
"doctor": "expo-doctor",
|
|
"i18n:check": "bun scripts/check-i18n-keys.mjs",
|
|
"i18n:fix-unused": "bun scripts/check-i18n-keys.mjs --fix-unused",
|
|
"test": "bun run typecheck && bun run lint && bun run format && bun run i18n:check && bun run doctor",
|
|
"postinstall": "patch-package"
|
|
},
|
|
"dependencies": {
|
|
"@bottom-tabs/react-navigation": "1.2.0",
|
|
"@douglowder/expo-av-route-picker-view": "^0.0.5",
|
|
"@expo/metro-runtime": "~56.0.13",
|
|
"@expo/react-native-action-sheet": "^4.1.1",
|
|
"@expo/ui": "~56.0.14",
|
|
"@expo/vector-icons": "^15.0.3",
|
|
"@gorhom/bottom-sheet": "5.2.14",
|
|
"@jellyfin/sdk": "^0.13.0",
|
|
"@react-native-community/netinfo": "^12.0.0",
|
|
"@react-navigation/material-top-tabs": "7.4.28",
|
|
"@react-navigation/native": "^7.2.5",
|
|
"@shopify/flash-list": "2.0.2",
|
|
"@tanstack/query-sync-storage-persister": "^5.100.14",
|
|
"@tanstack/react-pacer": "^0.19.1",
|
|
"@tanstack/react-query": "5.100.14",
|
|
"@tanstack/react-query-persist-client": "^5.100.14",
|
|
"axios": "^1.7.9",
|
|
"expo": "~56.0.6",
|
|
"expo-application": "~56.0.3",
|
|
"expo-asset": "~56.0.15",
|
|
"expo-audio": "~56.0.11",
|
|
"expo-background-task": "~56.0.15",
|
|
"expo-blur": "~56.0.3",
|
|
"expo-brightness": "~56.0.5",
|
|
"expo-build-properties": "~56.0.15",
|
|
"expo-camera": "~56.0.7",
|
|
"expo-constants": "~56.0.16",
|
|
"expo-crypto": "~56.0.4",
|
|
"expo-dev-client": "~56.0.16",
|
|
"expo-device": "~56.0.4",
|
|
"expo-font": "~56.0.5",
|
|
"expo-haptics": "~56.0.3",
|
|
"expo-image": "~56.0.9",
|
|
"expo-linear-gradient": "~56.0.4",
|
|
"expo-linking": "~56.0.12",
|
|
"expo-localization": "~56.0.6",
|
|
"expo-location": "~56.0.14",
|
|
"expo-notifications": "~56.0.14",
|
|
"expo-router": "~56.2.7",
|
|
"expo-screen-orientation": "~56.0.5",
|
|
"expo-secure-store": "~56.0.4",
|
|
"expo-sharing": "~56.0.14",
|
|
"expo-splash-screen": "~56.0.10",
|
|
"expo-status-bar": "~56.0.4",
|
|
"expo-system-ui": "~56.0.5",
|
|
"expo-task-manager": "~56.0.15",
|
|
"expo-web-browser": "~56.0.5",
|
|
"i18next": "^26.3.0",
|
|
"jotai": "2.20.0",
|
|
"lodash": "4.18.1",
|
|
"nativewind": "^2.0.11",
|
|
"patch-package": "^8.0.0",
|
|
"react": "19.2.3",
|
|
"react-dom": "19.2.3",
|
|
"react-i18next": "17.0.8",
|
|
"react-native": "npm:react-native-tvos@0.85.3-0",
|
|
"react-native-awesome-slider": "^2.9.0",
|
|
"react-native-bottom-tabs": "1.2.0",
|
|
"react-native-circular-progress": "^1.4.1",
|
|
"react-native-collapsible": "^1.6.2",
|
|
"react-native-country-flag": "^2.0.2",
|
|
"react-native-device-info": "^15.0.0",
|
|
"react-native-draggable-flatlist": "^4.0.3",
|
|
"react-native-edge-to-edge": "^1.7.0",
|
|
"react-native-gesture-handler": "~2.31.1",
|
|
"react-native-glass-effect-view": "^1.0.0",
|
|
"react-native-google-cast": "^4.9.1",
|
|
"react-native-image-colors": "^2.4.0",
|
|
"react-native-ios-context-menu": "^3.2.1",
|
|
"react-native-ios-utilities": "5.2.0",
|
|
"react-native-mmkv": "4.1.1",
|
|
"react-native-nitro-modules": "0.33.1",
|
|
"react-native-pager-view": "8.0.1",
|
|
"react-native-qrcode-svg": "^6.3.21",
|
|
"react-native-reanimated": "4.3.1",
|
|
"react-native-reanimated-carousel": "4.0.3",
|
|
"react-native-safe-area-context": "~5.7.0",
|
|
"react-native-screens": "4.25.2",
|
|
"react-native-svg": "15.15.4",
|
|
"react-native-tab-view": "4.3.0",
|
|
"react-native-text-ticker": "^1.15.0",
|
|
"react-native-track-player": "github:lovegaoshi/react-native-track-player#APM",
|
|
"react-native-udp": "^4.1.7",
|
|
"react-native-url-polyfill": "^2.0.0",
|
|
"react-native-uuid": "^2.0.3",
|
|
"react-native-volume-manager": "^2.0.8",
|
|
"react-native-web": "^0.21.0",
|
|
"react-native-worklets": "0.8.3",
|
|
"sonner-native": "0.21.2",
|
|
"tailwindcss": "3.3.2",
|
|
"use-debounce": "^10.0.4",
|
|
"zod": "4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@babel/core": "7.29.7",
|
|
"@biomejs/biome": "2.4.16",
|
|
"@react-native-community/cli": "20.1.3",
|
|
"@react-native-tvos/config-tv": "0.1.6",
|
|
"@types/jest": "29.5.14",
|
|
"@types/lodash": "4.17.24",
|
|
"@types/react": "~19.2.10",
|
|
"@types/react-test-renderer": "19.1.0",
|
|
"cross-env": "10.1.0",
|
|
"expo-doctor": "1.19.9",
|
|
"husky": "9.1.7",
|
|
"lint-staged": "17.0.5",
|
|
"react-test-renderer": "19.2.3",
|
|
"tsx": "^4.22.4",
|
|
"typescript": "5.9.3"
|
|
},
|
|
"expo": {
|
|
"doctor": {
|
|
"reactNativeDirectoryCheck": {
|
|
"exclude": [
|
|
"react-native-google-cast",
|
|
"react-native-udp",
|
|
"@jellyfin/sdk"
|
|
],
|
|
"listUnknownPackages": false
|
|
}
|
|
},
|
|
"install": {
|
|
"exclude": [
|
|
"react-native",
|
|
"react-native-screens"
|
|
]
|
|
}
|
|
},
|
|
"private": true,
|
|
"lint-staged": {
|
|
"*.{js,jsx,ts,tsx}": [
|
|
"biome check --write --unsafe --no-errors-on-unmatched"
|
|
],
|
|
"*.json": [
|
|
"biome format --write"
|
|
]
|
|
},
|
|
"trustedDependencies": [
|
|
"unrs-resolver"
|
|
]
|
|
}
|