import type { UserConfig } from 'vite' import { webExtensions } from '../constants' // TODO we need to traverse to get sub-deps... export function getOptimizeDeps(mode: 'build' | 'serve') { const needsInterop = [ 'nativewind/jsx-dev-runtime', 'nativewind/jsx-runtime', 'nativewind', 'react-native-css-interop/jsx-runtime', 'react-native-css-interop/jsx-dev-runtime', 'react-native-css-interop', 'secure-json-parse', '@react-native/normalize-colors', '@vxrn/safe-area', '@vxrn/vendor/react-19-prod', '@vxrn/vendor/react-19', '@vxrn/vendor/react-19-compiler-runtime', '@vxrn/vendor/react-dom-19', '@vxrn/vendor/react-dom-client-19', '@vxrn/vendor/react-dom-server.browser-19', '@vxrn/vendor/react-jsx-19', '@vxrn/vendor/react-jsx-dev-19', 'react', 'react/jsx-runtime', 'react/jsx-dev-runtime', 'react/compiler-runtime', 'react-dom', 'react-dom/server', 'react-dom/client', 'react-native-web-internals', '@react-native-masked-view/masked-view', 'url-parse', 'query-string', 'escape-string-regexp', 'use-latest-callback', 'react-is', 'fast-deep-equal', '@supabase/auth-helpers-react', '@supabase/postgres-js', 'core-js', 'parse-numeric-range', 'use-sync-external-store', 'use-sync-external-store/shim', 'expo-constants', 'expo-linking', 'inline-style-prefixer', '@docsearch/react', '@algolia/autocomplete-core', '@algolia/autocomplete-plugin-algolia-insights', '@algolia/autocomplete-shared', 'moti', ] const depsToOptimize = [ ...needsInterop, 'fast-xml-parser', 'set-cookie-parser', 'ipaddr.js', 'cross-fetch', 'pg', 'react-native-svg', 'react-native-screens', 'ws', 'lodash', // added these when using a worker env 'reading-time', 'mdx-bundler/client', 'gray-matter', 'glob', 'memoize-one', 'css-in-js-utils', 'hyphenate-style-name', 'use-sync-external-store', 'react-native-reanimated', // uses .web.js extensions '@react-navigation/core', '@react-navigation/native', '@react-navigation/elements', '@react-navigation/bottom-tabs', '@react-navigation/native-stack', 'one', 'styleq', 'fbjs', '@vxrn/universal-color-scheme', '@vxrn/color-scheme', 'requires-port', 'querystringify', 'compare-versions', 'strict-uri-encode', 'expo-document-picker', 'decode-uri-component', 'split-on-first', 'filter-obj', 'scheduler', 'warn-once', '@radix-ui/react-compose-refs', '@radix-ui/react-slot', 'expo-splash-screen', 'nanoid', 'swr', 'swr/mutation', 'one', 'one/zero', 'refractor/lang/tsx', 'invariant', 'tamagui/linear-gradient', '@react-native/normalize-color', 'expo-modules-core', 'expo-status-bar', 'react-native', '@floating-ui/react', '@floating-ui/react-dom', 'tamagui', 'reforest', ] if (mode === 'build') { // breaks in serve mode depsToOptimize.push('@babel/runtime') } return { needsInterop, depsToOptimize, optimizeDeps: { include: depsToOptimize, exclude: [ 'util', '@swc/wasm', '@swc/core-darwin-arm64', 'moti/author', '@expo/log-box', 'qrcode-terminal', '@hot-updater/cli-tools', ], needsInterop, // Enable lazy optimization - don't wait for all deps before starting server // This allows browser to process requests in parallel for faster initial load holdUntilCrawlEnd: false, rolldownOptions: { resolve: { extensions: webExtensions, }, // some packages ship JSX in .js files (e.g., react-native-css-interop/dist/doctor.js) moduleTypes: { '.js': 'jsx' }, // react-native packages import native-only exports (TurboModuleRegistry etc.) // from react-native, which is aliased to react-native-web on web. react-native-web // doesn't export these, so rolldown would error. shimMissingExports creates // undefined shims instead, matching esbuild's lenient behavior. shimMissingExports: true, }, } satisfies UserConfig['optimizeDeps'], } }