import { reactRouter } from "@react-router/dev/vite"; import tailwindcss from "@tailwindcss/vite"; import { defineConfig } from "vite"; export default defineConfig({ plugins: [tailwindcss(), reactRouter()], resolve: { tsconfigPaths: true, /* The workspace installs with `node-linker=hoisted` (see /.npmrc) and apps/cms pins React 18 for the Strapi admin, so React 18 wins the hoist to the root node_modules and React 19 ends up nested in more than one place - once under apps/web, once under react-router. Two React 19 copies in one render is one copy too many: every SSR render threw "Invalid hook call" until these two options were added. */ dedupe: ["react", "react-dom", "react-router"], }, ssr: { /* React Router is externalised by default, which means Node - not Vite - resolves its `react` import at runtime, straight to the nested copy that `dedupe` above cannot reach. Bundling it puts it back under Vite's resolver, so the server build ends up with exactly one React. */ noExternal: ["react-router"], }, server: { allowedHosts: ["dev.sharper.ly", "sharper.ly"] } });