-
Notifications
You must be signed in to change notification settings - Fork 159
Open
Labels
needs reviewIssue is ready to be reviewed by a maintainerIssue is ready to be reviewed by a maintainer
Description
Build/Submit details page URL
Summary
app.config.ts
import type { ConfigContext, ExpoConfig } from '@expo/config';
import type { AppIconBadgeConfig } from 'app-icon-badge/types';
import { ClientEnv, Env } from './env';
const appIconBadgeConfig: AppIconBadgeConfig = {
enabled: Env.APP_ENV !== 'production',
badges: [
{
text: Env.APP_ENV,
type: 'banner',
color: 'white',
},
{
text: Env.VERSION.toString(),
type: 'ribbon',
color: 'white',
},
],
};
const getBaseConfig = (config: any) => ({
...config,
name: Env.NAME,
description: `${Env.NAME} Mobile App for projects time tracking & time management`,
owner: Env.EXPO_ACCOUNT_OWNER,
scheme: Env.SCHEME,
slug: Env.SLUG,
version: Env.VERSION.toString(),
orientation: 'portrait',
icon: './assets/icon-new.png',
userInterfaceStyle: 'automatic',
newArchEnabled: true,
jsEngine: 'hermes',
updates: {
url: `https://u.expo.dev/${Env.EAS_PROJECT_ID}`,
fallbackToCacheTimeout: 0,
},
runtimeVersion: {
policy: 'appVersion',
},
experiments: {
typedRoutes: true,
turboModules: true,
},
assetBundlePatterns: ['**/*'],
});
const getPlatformConfig = () => ({
ios: {
supportsTablet: true,
bundleIdentifier: Env.BUNDLE_ID,
infoPlist: {
ITSAppUsesNonExemptEncryption: false,
},
},
android: {
adaptiveIcon: {
foregroundImage: './assets/adaptive-icon-new.png',
backgroundColor: '#FFFFFF',
},
package: Env.PACKAGE,
},
web: {
favicon: './assets/favicon-new.png',
bundler: 'metro',
},
});
const getPlugins = () => [
[
'expo-splash-screen',
{
backgroundColor: '#FFFFFF',
image: './assets/splash-icon-new.png',
imageWidth: 150,
dark: {
image: './assets/splash-icon-new.png',
backgroundColor: '#000000',
},
},
],
[
'expo-font',
{
fonts: ['./assets/fonts/Inter.ttf'],
},
],
'expo-localization',
'expo-router',
['app-icon-badge', appIconBadgeConfig],
'react-native-edge-to-edge',
];
export default ({ config }: ConfigContext): ExpoConfig => ({
...getBaseConfig(config),
...getPlatformConfig(),
plugins: getPlugins(),
extra: {
...ClientEnv,
eas: {
projectId: Env.EAS_PROJECT_ID,
},
},
});
eas.json
{
"cli": {
"version": ">= 3.8.1",
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true,
"channel": "production",
"distribution": "store",
"pnpm": "9.12.3",
"ios": {
"image": "latest"
},
"android": {
"buildType": "app-bundle",
"image": "latest"
},
"env": {
"EXPO_NO_DOTENV": "1",
"APP_ENV": "production",
"FLIPPER_DISABLE": "1"
}
},
"staging": {
"channel": "staging",
"distribution": "internal",
"pnpm": "9.12.3",
"ios": {
"image": "latest"
},
"android": {
"gradleCommand": "assembleRelease",
"buildType": "apk",
"image": "latest"
},
"env": {
"APP_ENV": "staging",
"EXPO_NO_DOTENV": "1",
"FLIPPER_DISABLE": "1"
}
},
"development": {
"autoIncrement": true,
"developmentClient": true,
"distribution": "internal",
"pnpm": "9.12.3",
"ios": {
"image": "latest"
},
"android": {
"image": "latest"
},
"env": {
"APP_ENV": "development",
"EXPO_NO_DOTENV": "1"
}
},
"simulator": {
"pnpm": "9.12.3",
"ios": {
"simulator": true,
"image": "latest"
},
"android": {
"image": "latest"
},
"env": {
"APP_ENV": "development",
"EXPO_NO_DOTENV": "1"
}
}
},
"submit": {
"production": {}
}
}
babel.config.js
module.exports = function (api) {
api.cache(true);
return {
presets: [
['babel-preset-expo', { jsxImportSource: 'nativewind' }],
'nativewind/babel',
],
plugins: [
// ⚙️ Babel proposal transforms
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-transform-class-properties', { loose: true }],
['@babel/plugin-transform-private-methods', { loose: true }],
['@babel/plugin-transform-private-property-in-object', { loose: true }],
['@babel/plugin-transform-export-namespace-from'],
// 🧭 Module resolution aliases
[
'module-resolver',
{
root: ['./'],
alias: {
'@': './src',
'@env': './src/lib/env.js',
'@data': './src/data/*',
'@types': './src/types/*',
'@lib': './src/lib/*',
'@components': './src/components/*',
'@api': './src/api/*',
'@app': './src/app/*',
'@translations': './src/translations/*',
'@context': './src/context/*',
'@assets': './assets',
},
extensions: [
'.ios.ts',
'.android.ts',
'.ts',
'.ios.tsx',
'.android.tsx',
'.tsx',
'.jsx',
'.js',
'.json',
],
},
],
// ⚡ Animation & Worklet plugins (aliased to avoid duplication)
['react-native-worklets/plugin', {}, 'worklets'],
'react-native-reanimated/plugin',
],
};
};
package.json
{
"name": "timetracker",
"version": "1.0.0",
"private": true,
"packageManager": "[email protected]",
"main": "expo-router/entry",
"scripts": {
"start": "cross-env EXPO_NO_DOTENV=1 expo start -c",
"prebuild": "cross-env EXPO_NO_DOTENV=1 pnpm expo prebuild --clean",
"android": "cross-env EXPO_NO_DOTENV=1 expo run:android",
"ios": "cross-env EXPO_NO_DOTENV=1 expo run:ios",
"web": "cross-env EXPO_NO_DOTENV=1 expo start --web",
"xcode": "xed -b ios",
"doctor": "npx expo-doctor@latest --verbose",
"preinstall": "npx only-allow pnpm",
"start:staging": "cross-env APP_ENV=staging pnpm run start",
"prebuild:staging": "cross-env APP_ENV=staging pnpm run prebuild --clean",
"prebuild:development": "cross-env APP_ENV=development pnpm run prebuild --clean",
"android:staging": "cross-env APP_ENV=staging pnpm run android",
"ios:staging": "cross-env APP_ENV=staging pnpm run ios",
"start:production": "cross-env APP_ENV=production pnpm run start",
"prebuild:production": "cross-env APP_ENV=production pnpm run prebuild --clean",
"android:production": "cross-env APP_ENV=production pnpm run android",
"ios:production": "cross-env APP_ENV=production pnpm run ios",
"build:development:ios": "cross-env APP_ENV=development EXPO_NO_DOTENV=1 eas build --profile development --platform ios",
"build:development:android": "cross-env APP_ENV=development EXPO_NO_DOTENV=1 eas build --profile development --platform android --clear-cache",
"build:staging:ios": "cross-env APP_ENV=staging EXPO_NO_DOTENV=1 eas build --profile staging --platform ios",
"build:staging:android": "cross-env APP_ENV=staging EXPO_NO_DOTENV=1 eas build --profile staging --platform android --clear-cache",
"build:production:ios": "cross-env APP_ENV=production EXPO_NO_DOTENV=1 eas build --profile production --platform ios",
"build:production:android": "cross-env APP_ENV=production EXPO_NO_DOTENV=1 eas build --profile production --platform android --clear-cache",
"app-release": "cross-env SKIP_BRANCH_PROTECTION=true np --no-publish --no-cleanup --no-release-draft",
"version": "pnpm run prebuild && git add .",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
"type-check": "tsc --noemit",
"lint:translations": "eslint ./src/translations/ --fix --ext .json ",
"test": "jest",
"check-all": "pnpm run lint && pnpm run type-check && pnpm run lint:translations && pnpm run test",
"test:ci": "pnpm run test --coverage",
"test:watch": "pnpm run test --watch",
"install-maestro": "curl -Ls 'https://get.maestro.mobile.dev' | bash",
"e2e-test": "maestro test .maestro/ -e APP_ID=com.timetracker.development"
},
"browser": {
"better-sqlite3": false,
"@nozbe/watermelondb/adapters/sqlite": false
},
"lint-staged": {
"package.json": [
"pnpm install --lockfile-only",
"git add pnpm-lock.yaml"
],
"pnpm-lock.yaml": [
"git add pnpm-lock.yaml"
]
},
"dependencies": {
"@expo/metro-runtime": "^6.1.2",
"@expo/next-adapter": "^6.0.0",
"@expo/vector-icons": "^15.0.3",
"@gorhom/bottom-sheet": "5.2.6",
"@gorhom/portal": "^1.0.14",
"@hookform/resolvers": "^3.9.0",
"@nozbe/watermelondb": "^0.28.0",
"@react-native-community/netinfo": "11.4.1",
"@react-navigation/drawer": "^7.3.9",
"@react-navigation/native": "^7.1.6",
"@shopify/flash-list": "2.0.2",
"@shopify/react-native-skia": "2.2.12",
"@tanstack/react-query": "^5.85.5",
"@tanstack/react-table": "^8.21.3",
"@wuba/react-native-echarts": "1.1.1-alpha.1",
"app-icon-badge": "^0.1.2",
"axios": "^1.7.5",
"babel-preset-expo": "^54.0.6",
"better-sqlite3": "^12.2.0",
"clsx": "^2.1.1",
"expo": "^54.0.21",
"expo-build-properties": "^1.0.9",
"expo-constants": "~18.0.9",
"expo-crypto": "^15.0.7",
"expo-dev-client": "~6.0.16",
"expo-file-system": "~19.0.17",
"expo-font": "~14.0.9",
"expo-image": "~3.0.10",
"expo-linear-gradient": "~15.0.7",
"expo-linking": "~8.0.8",
"expo-localization": "~17.0.7",
"expo-router": "~6.0.14",
"expo-splash-screen": "~31.0.10",
"expo-sqlite": "^16.0.8",
"expo-status-bar": "~3.0.8",
"expo-system-ui": "~6.0.7",
"expo-updates": "~29.0.12",
"i18next": "^23.14.0",
"jimp": "^1.6.0",
"jimp-compact": "0.16.1-2",
"lodash.memoize": "^4.1.2",
"lottie-react-native": "7.3.4",
"moti": "^0.29.0",
"nativewind": "^4.1.23",
"next": "^15.5.0",
"prettier-plugin-tailwindcss": "^0.5.14",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-error-boundary": "^4.0.13",
"react-hook-form": "^7.53.0",
"react-i18next": "^15.0.1",
"react-icons": "^5.5.0",
"react-native": "0.81.5",
"react-native-chart-kit": "^6.12.0",
"react-native-css-interop": "^0.2.1",
"react-native-datatable-component": "^2.1.14",
"react-native-edge-to-edge": "1.6.0",
"react-native-flash-message": "^0.4.2",
"react-native-gesture-handler": "~2.28.0",
"react-native-gifted-charts": "^1.4.64",
"react-native-keyboard-controller": "^1.18.5",
"react-native-mmkv": "4.0.0",
"react-native-nitro-modules": "^0.31.0",
"react-native-paper": "^5.14.5",
"react-native-reanimated": "~4.1.3",
"react-native-reanimated-table": "^0.0.2",
"react-native-restart": "0.0.27",
"react-native-safe-area-context": "5.6.1",
"react-native-screens": "~4.16.0",
"react-native-svg": "15.12.1",
"react-native-tableview-simple": "^4.4.1",
"react-native-url-polyfill": "^2.0.0",
"react-native-worklets": "0.5.1",
"react-query-kit": "^3.3.0",
"tailwind-merge": "^3.3.1",
"tailwind-rn": "^4.2.0",
"tailwind-variants": "^0.2.1",
"uuid": "^13.0.0",
"zod": "^3.23.8",
"zustand": "^5.0.5"
},
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/plugin-transform-export-namespace-from": "^7.27.1",
"@commitlint/cli": "^19.2.2",
"@commitlint/config-conventional": "^19.2.2",
"@dev-plugins/react-query": "^0.0.7",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.28.0",
"@expo/config": "~12.0.10",
"@react-native-community/cli": "latest",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react-native": "^12.7.2",
"@types/i18n-js": "^3.8.9",
"@types/invariant": "^2.2.37",
"@types/jest": "^29.5.12",
"@types/lodash.memoize": "^4.1.9",
"@types/react": "~19.1.17",
"@typescript-eslint/eslint-plugin": "^8.34.0",
"@typescript-eslint/parser": "^8.34.0",
"babel-plugin-module-resolver": "^5.0.2",
"cross-env": "^7.0.3",
"dotenv": "^16.4.5",
"eslint": "^9.28.0",
"eslint-config-expo": "^10.0.0",
"eslint-config-prettier": "^10.1.5",
"eslint-import-resolver-typescript": "^4.4.3",
"eslint-plugin-i18n-json": "^4.0.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-prettier": "^5.4.1",
"eslint-plugin-react-compiler": "19.1.0-rc.2",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-tailwindcss": "^3.18.0",
"eslint-plugin-testing-library": "^7.5.2",
"eslint-plugin-unicorn": "^59.0.1",
"eslint-plugin-unused-imports": "^4.1.4",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-expo": "~54.0.12",
"jest-junit": "^16.0.0",
"lint-staged": "^15.2.9",
"np": "^10.0.7",
"prettier": "^3.3.3",
"react-native-web": "0.21.2",
"tailwindcss": "3.4.4",
"ts-jest": "^29.1.2",
"typescript": "~5.9.3",
"typescript-eslint": "^8.34.0"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Khalid-Ihya/time-tracker.git"
},
"expo": {
"doctor": {
"reactNativeDirectoryCheck": {
"listUnknownPackages": false,
"exclude": [
"react-native-restart",
"@nozbe/watermelondb"
]
}
},
"install": {
"exclude": [
"eslint-config-expo"
]
}
},
"osMetadata": {
"initVersion": "8.0.0"
}
}
Managed or bare?
im new for reak idk
Environment
staging
Error output
No response
Reproducible demo or steps to reproduce from a blank project
.
Metadata
Metadata
Assignees
Labels
needs reviewIssue is ready to be reviewed by a maintainerIssue is ready to be reviewed by a maintainer