const pkg = require('./package.json') module.exports = function (_config) { /** * App version number. Should be incremented as part of a release cycle. */ const VERSION = pkg.version /** * Uses built-in Expo env vars * * @see https://docs.expo.dev/build-reference/variables/#built-in-environment-variables */ const PLATFORM = process.env.EAS_BUILD_PLATFORM ?? 'web' const IS_TESTFLIGHT = process.env.EXPO_PUBLIC_ENV === 'testflight' const IS_PRODUCTION = process.env.EXPO_PUBLIC_ENV === 'production' const IS_DEV = !IS_TESTFLIGHT || !IS_PRODUCTION const ASSOCIATED_DOMAINS = [ 'applinks:witchsky.app', // When testing local services, enter an ngrok (et al) domain here. It must use a standard HTTP/HTTPS port. ...(IS_DEV || IS_TESTFLIGHT ? [] : []), ] // const UPDATES_CHANNEL = IS_TESTFLIGHT // ? 'testflight' // : IS_PRODUCTION // ? 'production' // : undefined // const UPDATES_ENABLED = !!UPDATES_CHANNEL const UPDATES_ENABLED = IS_TESTFLIGHT || IS_PRODUCTION const USE_SENTRY = Boolean(process.env.SENTRY_AUTH_TOKEN) return { expo: { version: VERSION, name: 'Witchsky', slug: 'witchsky', scheme: ['bluesky', 'witchsky'], // owner: 'blueskysocial', // owner: 'neema.brown', runtimeVersion: { policy: 'appVersion', }, icon: './assets/app-icons/ios_icon_default_next.png', userInterfaceStyle: 'automatic', primaryColor: '#ED5345', newArchEnabled: false, ios: { supportsTablet: false, bundleIdentifier: 'app.witchsky', config: { usesNonExemptEncryption: false, }, icon: PLATFORM === 'web' // web build doesn't like .icon files ? './assets/app-icons/ios_icon_default_next.png' : './assets/app-icons/ios_icon_default.icon', infoPlist: { UIBackgroundModes: ['remote-notification'], NSCameraUsageDescription: 'Used for profile pictures, skeets, and other kinds of content.', NSMicrophoneUsageDescription: 'Used for skeets and other kinds of content.', NSPhotoLibraryAddUsageDescription: 'Used to save images to your library.', NSPhotoLibraryUsageDescription: 'Used for profile pictures, skeets, and other kinds of content', CFBundleSpokenName: 'witchsky.app', CFBundleLocalizations: [ 'en', 'an', 'ast', 'ca', 'cy', 'da', 'de', 'el', 'eo', 'es', 'eu', 'fi', 'fr', 'fy', 'ga', 'gd', 'gl', 'hi', 'hu', 'ia', 'id', 'it', 'ja', 'km', 'ko', 'ne', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sv', 'th', 'tr', 'uk', 'vi', 'yue', 'zh-Hans', 'zh-Hant', ], UIDesignRequiresCompatibility: true, }, associatedDomains: ASSOCIATED_DOMAINS, entitlements: { 'com.apple.developer.kernel.increased-memory-limit': true, 'com.apple.developer.kernel.extended-virtual-addressing': true, 'com.apple.security.application-groups': 'group.app.witchsky', }, privacyManifests: { NSPrivacyCollectedDataTypes: [ { NSPrivacyCollectedDataType: 'NSPrivacyCollectedDataTypeCrashData', NSPrivacyCollectedDataTypeLinked: false, NSPrivacyCollectedDataTypeTracking: false, NSPrivacyCollectedDataTypePurposes: [ 'NSPrivacyCollectedDataTypePurposeAppFunctionality', ], }, { NSPrivacyCollectedDataType: 'NSPrivacyCollectedDataTypePerformanceData', NSPrivacyCollectedDataTypeLinked: false, NSPrivacyCollectedDataTypeTracking: false, NSPrivacyCollectedDataTypePurposes: [ 'NSPrivacyCollectedDataTypePurposeAppFunctionality', ], }, { NSPrivacyCollectedDataType: 'NSPrivacyCollectedDataTypeOtherDiagnosticData', NSPrivacyCollectedDataTypeLinked: false, NSPrivacyCollectedDataTypeTracking: false, NSPrivacyCollectedDataTypePurposes: [ 'NSPrivacyCollectedDataTypePurposeAppFunctionality', ], }, ], NSPrivacyAccessedAPITypes: [ { NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategoryFileTimestamp', NSPrivacyAccessedAPITypeReasons: ['C617.1', '3B52.1', '0A2A.1'], }, { NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategoryDiskSpace', NSPrivacyAccessedAPITypeReasons: ['E174.1', '85F4.1'], }, { NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategorySystemBootTime', NSPrivacyAccessedAPITypeReasons: ['35F9.1'], }, { NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategoryUserDefaults', NSPrivacyAccessedAPITypeReasons: ['CA92.1', '1C8F.1'], }, ], }, }, androidStatusBar: { barStyle: 'light-content', }, // Dark nav bar in light mode is better than light nav bar in dark mode androidNavigationBar: { barStyle: 'light-content', }, android: { icon: './assets/app-icons/android_icon_default_next.png', adaptiveIcon: { foregroundImage: './assets/icon-android-foreground.png', monochromeImage: './assets/icon-android-monochrome.png', backgroundColor: '#ED5345', }, googleServicesFile: './google-services.json', package: 'app.witchsky', intentFilters: [ { action: 'VIEW', autoVerify: true, data: [ { scheme: 'https', host: 'witchsky.app', }, { scheme: 'https', host: 'deer.social', }, { scheme: 'https', host: 'bsky.app', }, IS_DEV && { scheme: 'http', host: 'localhost:19006', }, ], category: ['BROWSABLE', 'DEFAULT'], }, ], }, web: { favicon: './assets/favicon.png', }, // updates: { // url: 'https://updates.bsky.app/manifest', // enabled: UPDATES_ENABLED, // fallbackToCacheTimeout: 30000, // codeSigningCertificate: UPDATES_ENABLED // ? './code-signing/certificate.pem' // : undefined, // codeSigningMetadata: UPDATES_ENABLED // ? { // keyid: 'main', // alg: 'rsa-v1_5-sha256', // } // : undefined, // checkAutomatically: 'NEVER', // channel: UPDATES_CHANNEL, // }, updates: { url: 'https://updates.bsky.app/manifest', enabled: UPDATES_ENABLED, fallbackToCacheTimeout: 30000, codeSigningCertificate: UPDATES_ENABLED ? './code-signing/certificate.pem' : undefined, codeSigningMetadata: UPDATES_ENABLED ? { keyid: 'main', alg: 'rsa-v1_5-sha256', } : undefined, checkAutomatically: 'NEVER', }, plugins: [ 'expo-video', 'expo-localization', 'expo-web-browser', [ 'react-native-edge-to-edge', {android: {enforceNavigationBarContrast: false}}, ], USE_SENTRY && [ '@sentry/react-native/expo', { organization: 'blueskyweb', project: 'app', url: 'https://sentry.io', }, ], [ 'expo-build-properties', { ios: { deploymentTarget: '15.1', buildReactNativeFromSource: true, }, android: { compileSdkVersion: 35, targetSdkVersion: 35, buildToolsVersion: '35.0.0', }, }, ], [ 'expo-notifications', { icon: './assets/icon-android-notification.png', color: '#ED5345', sounds: PLATFORM === 'ios' ? ['assets/dm.aiff'] : ['assets/dm.mp3'], }, ], 'react-native-compressor', [ '@bitdrift/react-native', { networkInstrumentation: true, }, ], './plugins/starterPackAppClipExtension/withStarterPackAppClip.js', './plugins/withGradleJVMHeapSizeIncrease.js', './plugins/withAndroidManifestLargeHeapPlugin.js', './plugins/withAndroidManifestFCMIconPlugin.js', './plugins/withAndroidManifestIntentQueriesPlugin.js', './plugins/withAndroidStylesAccentColorPlugin.js', './plugins/withAndroidDayNightThemePlugin.js', './plugins/withAndroidNoJitpackPlugin.js', './plugins/shareExtension/withShareExtensions.js', './plugins/notificationsExtension/withNotificationsExtension.js', [ 'expo-font', { fonts: [ './assets/fonts/inter/InterVariable.woff2', './assets/fonts/inter/InterVariable-Italic.woff2', // Android only './assets/fonts/inter/Inter-Regular.otf', './assets/fonts/inter/Inter-Italic.otf', './assets/fonts/inter/Inter-Medium.otf', './assets/fonts/inter/Inter-MediumItalic.otf', './assets/fonts/inter/Inter-SemiBold.otf', './assets/fonts/inter/Inter-SemiBoldItalic.otf', './assets/fonts/inter/Inter-Bold.otf', './assets/fonts/inter/Inter-BoldItalic.otf', ], }, ], [ 'expo-splash-screen', { ios: { enableFullScreenImage_legacy: true, backgroundColor: '#ffffff', image: './assets/splash.png', resizeMode: 'cover', dark: { enableFullScreenImage_legacy: true, backgroundColor: '#262220', image: './assets/splash-dark.png', resizeMode: 'cover', }, }, android: { backgroundColor: '#E25C50', image: './assets/splash-android-icon.png', imageWidth: 150, dark: { backgroundColor: '#ED5345', image: './assets/splash-android-icon-dark.png', imageWidth: 150, }, }, }, ], [ '@mozzius/expo-dynamic-app-icon', { /** * Default set */ default_light: { ios: './assets/app-icons/ios_icon_legacy_light.png', android: './assets/app-icons/android_icon_legacy_light.png', prerendered: true, }, default_dark: { ios: './assets/app-icons/ios_icon_legacy_dark.png', android: './assets/app-icons/android_icon_legacy_dark.png', prerendered: true, }, /** * Bluesky+ core set */ // core_aurora: { // ios: './assets/app-icons/ios_icon_core_aurora.png', // android: './assets/app-icons/android_icon_core_aurora.png', // prerendered: true, // }, // core_bonfire: { // ios: './assets/app-icons/ios_icon_core_bonfire.png', // android: './assets/app-icons/android_icon_core_bonfire.png', // prerendered: true, // }, // core_sunrise: { // ios: './assets/app-icons/ios_icon_core_sunrise.png', // android: './assets/app-icons/android_icon_core_sunrise.png', // prerendered: true, // }, // core_sunset: { // ios: './assets/app-icons/ios_icon_core_sunset.png', // android: './assets/app-icons/android_icon_core_sunset.png', // prerendered: true, // }, // core_midnight: { // ios: './assets/app-icons/ios_icon_core_midnight.png', // android: './assets/app-icons/android_icon_core_midnight.png', // prerendered: true, // }, // core_flat_blue: { // ios: './assets/app-icons/ios_icon_core_flat_blue.png', // android: './assets/app-icons/android_icon_core_flat_blue.png', // prerendered: true, // }, // core_flat_white: { // ios: './assets/app-icons/ios_icon_core_flat_white.png', // android: './assets/app-icons/android_icon_core_flat_white.png', // prerendered: true, // }, // core_flat_black: { // ios: './assets/app-icons/ios_icon_core_flat_black.png', // android: './assets/app-icons/android_icon_core_flat_black.png', // prerendered: true, // }, // core_classic: { // ios: './assets/app-icons/ios_icon_core_classic.png', // android: './assets/app-icons/android_icon_core_classic.png', // prerendered: true, // }, }, ], ['expo-screen-orientation', {initialOrientation: 'PORTRAIT_UP'}], ['expo-location'], ].filter(Boolean), extra: { eas: { build: { experimental: { ios: { // appExtensions: [ // { // targetName: 'Share-with-Bluesky', // bundleIdentifier: 'app.witchsky.Share-with-Bluesky', // entitlements: { // 'com.apple.security.application-groups': [ // 'group.app.witchsky', // ], // }, // }, // { // targetName: 'BlueskyNSE', // bundleIdentifier: 'app.witchsky.BlueskyNSE', // entitlements: { // 'com.apple.security.application-groups': [ // 'group.app.witchsky', // ], // }, // }, // { // targetName: 'BlueskyClip', // bundleIdentifier: 'app.witchsky.AppClip', // }, // ], }, }, }, projectId: 'da056e41-38f9-4fee-a534-b9c5891f9c8d', }, }, }, } }