Project: doctolib-doctolib · Branch: master · Mode: ` · **Model:**claude-haiku-4-5-20251001`
Stats: 1 user messages, 48 tool calls, tools used: Glob, Bash, Read.
Conversation
Turn 1 — User
Explore the codebase to understand how Vite is configured and used for building the frontend. Look for: 1. Vite configuration files (vite.config.ts, vite.config.js) 2. Package.json scripts related to Vite builds 3. How Vite integrates with the monorepo structure 4. Build commands and development server setup 5. Module federation or other Vite plugins being used
Thoroughness level: medium
Turn 1 — Assistant
I'll explore the codebase to understand how Vite is configured and used for building the frontend. Let me start by searching for Vite configuration files and relevant build setup.
Tools used:
Glob:**/vite.config.{ts,js}
Tools used:
Glob:**/package.json
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib -type f -name "package.json" | head -20
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/.cherry/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/pako/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/jest-runtime/node_modules/color-name/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/jest-runtime/node_modules/chalk/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/jest-runtime/node_modules/has-flag/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/jest-runtime/ …(truncated, 1382 more chars)
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/vite.config.ts /Users/USER/workspace/doctolib/doctolib/node_modules/@module-federation/bridge-react-webpack-plugin/vite.config.ts /Users/USER/workspace/doctolib/doctolib/node_modules/@doctolib/on-demand-care-chat/node_modules/@tanstack/react-query/build/query-codemods/vite.config.ts /Users/USER/workspace/doctolib/doctolib/node_modules/@doctolib/tpf-rich-texts-form/node_modules/@tanstack/react-query/build/query …(truncated, 1014 more chars)
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/.cherry/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/accessibility_sdk/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/advanced_patients_filters_sdk/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/agenda_legal_compliance_sdk/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/api-consumer-settings/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doc …(truncated, 9610 more chars)
Now let me read the root package.json and look at the main vite configuration files:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/package.json
Tool results:
→ result (ok): 1→{ 2→ "name": "doctolib", 3→ "private": true, 4→ "description": "Doctolib website", 5→ "scripts": { 6→ "build:static": "rm -f public/static_webpack/sentry public/static_webpack/rum && NO_SOURCE_MAPS=1 NODE_ENV=production ./config/bundler/bundler.sh build --config config/bundler/{bundler}/static.ts --progress && rm -f public/static_webpack/*.LICENSE.txt", 7→ "build": "NODE_ENV=production NODE_OPTIONS='--max_old_space_size=32768 --max_semi_space_size=160' …(truncated, 26969 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/vite.config.ts
Tool results:
→ result (ok): 1→import { defineConfig, type UserConfigExport } from 'vite' 2→import { resolve } from 'path' 3→// eslint-disable-next-line import/no-relative-packages 4→import getPackagesViteConfig from '../../../config/vite/packages-base' 5→ 6→// https://vitejs.dev/config/ 7→export default defineConfig( 8→ getPackagesViteConfig({ 9→ build: { 10→ lib: { 11→ entry: [resolve(__dirname, './src/circle/index.ts'), resolve(__dirname, './src/default/inde …(truncated, 487 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib -maxdepth 2 -name "vite.config.ts" -o -name "vite.config.js" 2>/dev/null | grep -v node_modules
Tool results:
→ result (ok)
Let me check for the Vite config referenced in the package:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/vite/packages-base.ts
Tool results:
→ result (ok): 1→import { type UserConfig, mergeConfig } from 'vite'
2→
3→const configBase = {
4→ build: {
5→ target: ['chrome70', 'firefox68', 'safari14', 'edge83'],
6→ outDir: 'lib',
7→ assetsDir: '.',
8→ lib: {
9→ fileName: (format: string) => index.${format}.js,
10→ formats: ['es'],
11→ },
12→ rollupOptions: { external: ['react', 'react-dom'] },
13→ },
14→}
15→
16→export const getPackagesViteConfig = (config
…(truncated, 459 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/config -type f \( -name "*.ts" -o -name "*.js" \) | head -30
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/config/vite/cors.test.ts /Users/USER/workspace/doctolib/doctolib/config/vite/svg-plugin.ts /Users/USER/workspace/doctolib/doctolib/config/vite/packages-base.ts /Users/USER/workspace/doctolib/doctolib/config/vite/cors.ts /Users/USER/workspace/doctolib/doctolib/config/bundler/ajv-generated-validators.test.js /Users/USER/workspace/doctolib/doctolib/config/bundler/plugins/hmr-status-plugin.ts /Users/USER/workspace/doctolib/doctolib/config/bundler/plugins/engin …(truncated, 1844 more chars)
Tools used:
Bash:ls -la /Users/USER/workspace/doctolib/doctolib/config/bundler/
Tool results:
→ result (ok): drwxr-xr-x clertonra staff 416 B Thu Jan 29 16:38:58 2026 . drwxr-xr-x clertonra staff 1.2 KB Tue Feb 10 15:16:39 2026 .. .rw-r--r-- clertonra staff 6.0 KB Mon Jan 26 17:07:05 2026 .DS_Store .rw-r--r-- clertonra staff 781 B Wed Dec 17 16:18:19 2025 ajv-generated-validators.test.js .rwxr-xr-x clertonra staff 884 B Thu Jan 29 16:38:58 2026 bundler.sh .rw-r--r-- clertonra staff 23 B Wed Dec 17 16:18:19 2025 CODEOWNERS.local .rwxr-xr-x clertonra staff 4.2 KB Wed Dec 17 16:18:19 2025 compile-ajv …(truncated, 411 more chars)
Let me check the bundler script and configuration files:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/bundler.sh
Tool results:
→ result (ok): 1→#!/bin/bash 2→# Wrapper script to choose between webpack and rspack based on USE_RSPACK environment variable 3→ 4→if [ "$USE_RSPACK" = "true" ]; then 5→ BUNDLER="rspack" 6→ CONFIG_DIR="rspack" 7→else 8→ BUNDLER="webpack" 9→ CONFIG_DIR="webpack" 10→fi 11→ 12→# Replace {bundler} placeholder and webpack/rspack paths in config 13→# Also filter out options not supported by rspack 14→ARGS=() 15→for arg in "$@"; do 16→ # rspack …(truncated, 942 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/webpack/development.ts
Tool results:
→ result (ok): 1→import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin' 2→import type { Configuration as DevServerConfiguration } from 'webpack-dev-server' 3→import { getWebpackConfig, babelLoader } from './base' 4→import WatchRunPlugin from '../plugins/watchrun-plugin' 5→import HMRStatusPlugin from '../plugins/hmr-status-plugin' 6→import { applyDevelopmentConfig, getDevServerConfig, getDevStatsConfig } from '../shared/development-config' 7→ 8→process.en …(truncated, 1219 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/rspack/development.ts
Tool results:
→ result (ok): 1→import { ReactRefreshRspackPlugin } from '@rspack/plugin-react-refresh' 2→import type { Configuration } from '@rspack/core' 3→import { getWebpackConfig, swcLoaderTS, swcLoaderJS } from './base' 4→import WatchRunPlugin from '../plugins/watchrun-plugin' 5→import HMRStatusPlugin from '../plugins/hmr-status-plugin' 6→import { applyDevelopmentConfig, getDevServerConfig, getDevStatsConfig } from '../shared/development-config' 7→ 8→process.env.NODE_ENV = process.env …(truncated, 1110 more chars)
Now let me check the shared configuration and look for how Nx/Vite integrates with packages:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/shared/common-config.ts(1–100)
Tool results:
→ result (ok): 1→/* 2→ * Common configuration pieces shared between webpack and rspack 3→ / 4→ 5→import path from 'path' 6→import { globSync } from 'glob' 7→import { isProduction, PUBLIC_PATH, BUNDLER_NAME } from './constants' 8→ 9→export const commonResolveConfig = { 10→ modules: [path.resolve('app/assets/javascripts'), 'node_modules'], 11→ fallback: { 12→ // https://webpack.js.org/configuration/resolve/#resolvefallback 13→ // Below are polyfil …(truncated, 3450 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib -maxdepth 2 -name "vite.config.ts" | head -5
Tools used:
Bash:ls /Users/USER/workspace/doctolib/doctolib/.cherry/
Tool results:
→ result (ok): CODEOWNERS.local constants.ts engines.ts financial.ts freemium.ts frontend-isolation hcp-account.ts helpers.ts main.ts modus.ts online-booking.ts online-identity.ts package.json packages.ts packaging.ts patient-account.ts pcf.ts tanstack-query.ts tests.ts types.ts upfront-isolation.ts
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/vite.config.ts
Let me check the .cherry package.json and look at some example packages:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/.cherry/package.json
Tool results:
→ result (ok): 1→{ 2→ "name": "cherry-config", 3→ "main": "./main.ts", 4→ "dependencies": { 5→ "@types/js-yaml": "4.0.9", 6→ "@types/node": "20.14.2", 7→ "glob": "11.1.0", 8→ "js-yaml": "4.1.1", 9→ "lodash": "^4.17.21", 10→ "minimatch": "10.0.1" 11→ } 12→} 13→
<system-reminder> Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But y …(truncated, 162 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/.cherry/main.ts
Tool results:
→ result (ok): 1→/ eslint-disable @typescript-eslint/no-explicit-any -- easier for scripting / 2→import fs from 'fs' 3→import * as glob from 'glob' 4→import yaml from 'js-yaml' 5→import { isEqual } from 'lodash-es' 6→import patientAccountRules from './patient-account' 7→import patientBasesRules from './modus' 8→import tanstackQueryRules from './tanstack-query' 9→import onlineIdentityRules from './online-identity' 10→import onlineBookingRules from './online-booking' …(truncated, 24854 more chars)
Tools used:
Bash:cat /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json | head -50
Tool results:
→ result (ok): { "name": "@doctolib/design-system-illustrations", "version": "1.0.0", "license": "Doctolib", "description": "Doctolib's design system illustrations", "scripts": { "type-check": "true", "build": "rimraf lib/ && vite build", "lint": "eslint ." }, "repository": { "type": "git", "url": "git+https://github.com/doctolib/doctolib.git" }, "homepage": "https://github.com/doctolib/doctolib", "devDependencies": { "rimraf": "6.0.1", "vite": "6.4.1" }, "vi …(truncated, 15 more chars)
Now let me check for more package examples and Nx configuration:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/nx.json
Tool results:
→ result (ok): 1→{ 2→ "$schema": "./node_modules/nx/schemas/nx-schema.json", 3→ "workspaceLayout": { 4→ "appsDir": "packages", 5→ "libsDir": "packages" 6→ }, 7→ "namedInputs": { 8→ "sharedGlobal": [ 9→ "{workspaceRoot}/.nvmrc", 10→ "{workspaceRoot}/package-lock.json", 11→ "{workspaceRoot}/package.json", 12→ "{workspaceRoot}/tsconfig.", 13→ "{workspaceRoot}/vite.", 14→ "!{workspaceRoot}/.cursor/*/", 15 …(truncated, 1951 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib -maxdepth 3 -name "package.json" | head -5 | xargs -I {} bash -c 'echo "=== {} ===" && grep -E "\"scripts\"|\"build\"|\"vite\"" {} …(truncated, 11 more chars)
Tools used:
Bash:grep -r "@module-federation/vite" /Users/USER/workspace/doctolib/doctolib/config --include="*.ts" --include="*.js" 2>/dev/null | head -5
Tool results:
→ result (ERROR): Exit code 1 xargs: command line cannot be assembled, too long
Tool results:
→ result (ERROR): <tool_use_error>Sibling tool call errored</tool_use_error>
Let me try a different approach to check packages:
Tools used:
Bash:cat /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/authentication/package.json 2>/dev/null | head -30
Tool results:
→ result (ok): { "name": "@doctolib/authentication", "version": "1.0.0", "license": "Doctolib", "scripts": { "test": "npm run test:unit", "test:unit": "jest --passWithNoTests", "type-check": "tsc --noEmit", "lint": "eslint ." }, "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1" }, "violations": [ "monolith_DEPRECATED/services/single-page-application/setup-dayjs", "monolith_DEPRECATED/types/assets", "@doctolib/cookies", "monolith_DEPRECATED/serv …(truncated, 123 more chars)
Tools used:
Bash:grep -l "vite" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/*/package.json 2>/dev/null | head -3
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/shared/module-federation-config.ts(1–100)
Tool results:
→ result (ok): 1→/* 2→ * Shared Module Federation configuration 3→ * Used by both webpack and rspack 4→ / 5→ 6→import { dependencies as deps } from '../../../package.json' 7→ 8→export const moduleFederationSharedConfig = { 9→ dayjs: { 10→ singleton: true, 11→ requiredVersion: deps.dayjs, 12→ eager: true, 13→ }, 14→ react: { 15→ singleton: true, 16→ requiredVersion: deps.react, 17→ eager: true, 18→ }, 19→ '@ …(truncated, 2078 more chars)
Let me check the webpack base configuration to understand the full build setup:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/webpack/base.ts(1–150)
Tool results:
→ result (ok): 1→import type { Configuration } from 'webpack' 2→import webpack from 'webpack' 3→import CopyPlugin from 'copy-webpack-plugin' 4→import MiniCssExtractPlugin from 'mini-css-extract-plugin' 5→import { WebpackAssetsManifest } from 'webpack-assets-manifest' 6→import CircularDependencyPlugin from 'circular-dependency-plugin' 7→import ModuleFederationPlugin from 'webpack/lib/container/ModuleFederationPlugin' 8→import { cssLoaders, scssLoaders } from '../loaders/css-an …(truncated, 4199 more chars)
Tools used:
Bash:ls /Users/USER/workspace/doctolib/doctolib/config/vite/
Tool results:
→ result (ok): CODEOWNERS.local cors.test.ts cors.ts packages-base.ts svg-plugin.ts
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/vite/svg-plugin.ts
Tool results:
→ result (ok): 1→// Copy pasted from https://github.com/andylacko/vite-svg-react-loader/blob/master/index.ts 2→ 3→import { transform as transformSvgr } from '@svgr/core' 4→import { transform } from 'esbuild' 5→import fs from 'fs' 6→import type { Plugin } from 'vite' 7→ 8→interface SvgrPluginOptions { 9→ query?: string 10→ keepEmittedAssets?: boolean 11→ svgrOptions?: SVGROptions 12→} 13→ 14→interface SVGROptions { 15→ icon?: boolean 16→ d …(truncated, 2313 more chars)
Let me check the development config for more details on how the build system is configured:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/shared/development-config.ts(1–150)
Tool results:
→ result (ok): 1→import notifier from 'node-notifier' 2→import type { Configuration as DevServerConfiguration } from 'webpack-dev-server' 3→import { BUNDLER_NAME, DEV_SERVER_PORT } from './constants' 4→ 5→export interface BabelLoaderConfig { 6→ [key: string]: unknown 7→ options: { 8→ [key: string]: unknown 9→ plugins?: string[] 10→ } 11→} 12→ 13→export interface SwcLoaderConfig { 14→ [key: string]: unknown 15→ options: { 16→ jsc: …(truncated, 5183 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib -maxdepth 3 -name "nx.json" | head -3
Tool results:
→ result (ok)
Tools used:
Bash:grep -r "start\|dev" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json: "devDependencies": {
Let me check for Nx project configuration in packages:
Tools used:
Bash:cat /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/project.json 2>/dev/null || echo "No project.json found"
Tool results:
→ result (ok): No project.json found
Tools used:
Bash:grep -r "vite\|@module-federation" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/ --include="*.json" --include="*.ts" --include="*.js" 2>/dev/null | head …(truncated, 3 more chars)
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json: "build": "rimraf lib/ && vite build", /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json: "vite": "6.4.1" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/vite.config.ts:import { defineConfig, type UserConfigExport } from 'vite' /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illu …(truncated, 227 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib -maxdepth 1 -name "vite.config.*" -o -name "tsconfig.json" | head -10
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/vite.config.mts /Users/USER/workspace/doctolib/doctolib/tsconfig.json
Perfect! Let me check the root Vite config:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/vite.config.mts
Tool results:
→ result (ok): 1→import fs from 'fs' 2→import path from 'path' 3→import { defineConfig } from 'vite' 4→import RubyPlugin from 'vite-plugin-ruby' 5→import { federation } from '@module-federation/vite' 6→import react from '@vitejs/plugin-react-swc' 7→import inject from '@rollup/plugin-inject' 8→import svgLoader from './config/vite/svg-plugin' 9→import { ALLOWED_ORIGIN_DOMAINS_PATTERN } from './config/vite/cors' 10→import { getImportAliases } from './config/bundler/help …(truncated, 5031 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/tsconfig.json(1–80)
Tool results:
→ result (ok): 1→{ 2→ "extends": "./tsconfig.base.json", 3→ "compilerOptions": { 4→ "allowImportingTsExtensions": true 5→ }, 6→ "include": [ 7→ ".cts", 8→ ".mts", 9→ ".ts", 10→ "..ts", 11→ ".cherry//.ts", 12→ "app/assets/javascripts", 13→ "bin", 14→ "config/vite", 15→ "engines//app/assets/javascripts", 16→ "packages" 17→ ], 18→ "exclude": ["/dist/", "/node_modules/**"] 19→} 2 …(truncated, 341 more chars)
Tools used:
Bash:grep -r "nx run-many\|@nx\|start\|build" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/package.json: "build": "rimraf lib/ && vite build",
Now let me check the vite plugins file and look for more package examples with Nx configuration:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/vite.plugins.mts(1–100)
Tool results:
→ result (ok): 1→import fs from 'fs' 2→import path from 'path' 3→import { transformWithEsbuild } from 'vite' 4→import commonjs from 'vite-plugin-commonjs' 5→import rollupCommonjs from '@rollup/plugin-commonjs' 6→ 7→/* 8→ * This plugin allows to parse decorators in fontkit js files. 9→ * https://github.com/evanw/esbuild/issues/104#issuecomment-1028686596 10→ / 11→const enableDecoratorsInFontkitJsPlugin = () => ({ 12→ name: 'enable-decorators-in-fontkit-js', …(truncated, 3874 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib -type d -maxdepth 1 | head -10 | while read dir; do if [ -f "$dir/package.json" ]; then echo "=== $(basename $dir) ==="; grep '"scr …(truncated, 78 more chars)
Tool results:
→ result (ok): === partner-integration === "scripts": { === equipment_configuration_sdk === "scripts": { === doctor_appointment_booking_actions === "scripts": { === calendar_display_sdk === "scripts": { === doctowebsite === "scripts": { === impending-deletions === "scripts": { === maps === "scripts": { === financial-os-integration === "scripts": { === agenda_legal_compliance_sdk === "scripts": {
Let me search for packages that use vite to understand better:
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib -type f -name "package.json" | while read f; do if grep -q '"vite"\|"build".*vite' "$f" 2>/dev/null; then echo "$f"; fi; done | hea …(truncated, 4 more chars)
Tools used:
Bash:ls /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/design-system-illustrations/
Tools used:
Bash:grep -r "start\|@nx" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/*/package.json 2>/dev/null | head -10
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/patient-consents/node_modules/@doctolib/design-system-icons/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/patient_messaging_pro_sdk/node_modules/@vis.gl/react-google-maps/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/secure_messaging_core/node_modules/@storybook/csf-plugin/package.json /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/secure_messaging_core/node_modules/@storybo …(truncated, 126 more chars)
Tool results:
→ result (ok): babel.config.js bin catalog-info.yaml CODEOWNERS.local jest.config.cjs node_modules package.json src tsconfig.json vite.config.ts
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/ehr-consultations/package.json: "./useStartConsultationOutsidePatientFileVariant": "./src/hooks/startConsultationOutsidePatientFile/useStartConsultationVariant.ts",
Now let me check the comprehensive configuration and look at how module federation is being used in more detail:
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib -maxdepth 3 -name "*.json" | xargs grep -l "\"start\"\|targets.*start" 2>/dev/null | head -5
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/shared/entrypoints-builder.ts(1–80)
Tool results:
→ result (ok): 1→import filterBundles from '../helpers/filter-bundles' 2→import generateWebpackEntry from '../helpers/generate-webpack-entry' 3→import { enableCoverage } from './constants' 4→ 5→/* 6→ * Build webpack/rspack entry points from entrypoint directory 7→ * @param entrypointNames - Optional array of entrypoint names to filter by 8→ * @returns Entry object with all or filtered entrypoints 9→ / 10→export function buildEntrypoints(entrypointNames?: string[]): …(truncated, 1101 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib -type f -name "webpack.mjs" -o -name "webpack.cjs" 2>/dev/null | head -5
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/node_modules/react-tabs/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/strip-literal/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/css-loader/package.json /Users/USER/workspace/doctolib/doctolib/node_modules/globals/globals.json /Users/USER/workspace/doctolib/doctolib/node_modules/rc-util/package.json
Tool results:
→ result (ok)
Let me check the CORS configuration and understand the development setup better:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/vite/cors.ts
Tool results:
→ result (ok): 1→const escapeRegex = (string: string): string => string.replace(/[.*+?^${}()|[]\]/g, '\$&')
2→
3→const SUPPORTED_COUNTRY_TLDS = ['com', 'co.uk', 'be', 'nl', 'it', 'de', 'fr']
4→
5→const LOCALHOST_AND_IP_ADDRESSES_PATTERN = /(?:https?:\/\/(?:(?:[^:]+.)?localhost|127.0.0.1|[::1]))/
6→
7→const DOCTOLIB_INTERNAL_DOMAINS_PATTERN = new RegExp(
8→ (?:https://([\\w-]+\\.)?[\\w-]+\\.doctolib\\.(?:${SUPPORTED_COUNTRY_TLDS.map(escapeRegex).join('|')}))
9
…(truncated, 637 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/config/bundler/shared/constants.ts(1–100)
Tool results:
→ result (ok): 1→/* 2→ * Shared constants used by both webpack and rspack configurations 3→ / 4→ 5→export const isProduction = process.env.NODE_ENV === 'production' 6→export const enableCoverage = process.env.ENABLE_COVERAGE === 'true' 7→export const enableCircularDependencyCheck = process.env.ENABLE_CIRCULAR_DEPENDENCY_CHECK === 'true' 8→ 9→export const USE_RSPACK = process.env.USE_RSPACK === 'true' 10→export const BUNDLER_NAME = USE_RSPACK ? 'rspack' : 'webpack'
…(truncated, 3675 more chars)
Perfect! Now let me compile a comprehensive report. Let me get a summary of the directory structure:
Tools used:
Bash:head -50 /Users/USER/workspace/doctolib/doctolib/vite.plugins.mts
Tool results:
→ result (ok): import fs from 'fs' import path from 'path' import { transformWithEsbuild } from 'vite' import commonjs from 'vite-plugin-commonjs' import rollupCommonjs from '@rollup/plugin-commonjs'
/* * This plugin allows to parse decorators in fontkit js files. * https://github.com/evanw/esbuild/issues/104#issuecomment-1028686596 / const enableDecoratorsInFontkitJsPlugin = () => ({ name: 'enable-decorators-in-fontkit-js', async transform(code: string, id: string) { if (!/node_modules\/@foliojs …(truncated, 1264 more chars)
Tools used:
Bash:grep -r "federation\|remotes\|exposes" /Users/USER/workspace/doctolib/doctolib/vite.config.mts
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/vite.config.mts:import { federation } from '@module-federation/vite' /Users/USER/workspace/doctolib/doctolib/vite.config.mts: federation({ /Users/USER/workspace/doctolib/doctolib/vite.config.mts: remotes: {},
Perfect! Now I have enough information to provide a comprehensive report. Let me create the summary:
Vite Configuration and Usage in Doctolib Monorepo
Based on my exploration of the codebase, here's a comprehensive overview of how Vite is configured and integrated:
1. Vite Configuration Files
Root Level Configuration:
- /vite.config.mts - Main Vite configuration for the monolith
- Uses @vitejs/plugin-react-swc for React with SWC compiler
- Integrates @module-federation/vite for module federation
- Includes custom Vite plugins for handling legacy modules and specialized file types
- Configured for development with HTTPS (cert/key at ci/ssl/)
- Dev server host: assets-dev.doctolib.com:9030
Package-Level Configuration:
- /config/vite/packages-base.ts - Base configuration factory for TypeScript packages
- Used by individual packages (e.g., design-system-illustrations/vite.config.ts)
- Targets: es format only
- Excludes React and React-DOM from rollup options
- Output directory: lib/
Package Example:
- /packages/@doctolib/design-system-illustrations/vite.config.ts
- Extends base packages config
- Multiple entry points for different illustration sets (circle, default)
2. Build Commands and Scripts
Root package.json Scripts:
npm run dev # Full dev setup (monolith + applications via Concurrently)
npm run dev:monolith # Monolith only (Webpack/rspack)
npm run dev:applications # TypeScript packages only (via Nx)
npm run build # Production build (Webpack/rspack)
npm run build:dev # Development build
npm run build:static # Static assets build
Package Scripts (e.g., design-system-illustrations):
npm run build # rimraf lib/ && vite build
3. Monorepo Structure Integration
Workspaces Configuration:
"workspaces": [
".cherry",
"app/assets",
"packages/@doctolib/*",
"packages/eslint-plugin-doctolib-custom-rules",
"packages/eslint-config-doctolib-typescript",
"packages/zipper",
"packages/jest-reporter-junit-with-flaky"
]
Nx Configuration (nx.json):
- Workspace layout: apps and libs under packages/
- Shared global inputs: vite.* (includes root vite config changes)
- Cache enabled with 10GB max size
- Target defaults for lint, type-check, test:unit
4. Module Federation Setup
Root Configuration:
// vite.config.mts
federation({
name: 'host',
remotes: {},
shared: {
react: { singleton: true },
'react-dom': { singleton: true },
'react-router-dom': { singleton: true },
'@doctolib/upfront-core': { singleton: true },
'@doctolib/pro-app-shell/patient-file': { singleton: true },
},
ignoreOrigin: true,
dts: false,
})
Shared Module Federation Config:
- Located at /config/bundler/shared/module-federation-config.ts
- Extensive shared dependencies including:
- dayjs, react, react-dom, react-router-dom (all eager, singleton)
- @tanstack/react-query (v4 and v5)
- Design system packages
- Tanker crypto libraries
5. Vite Plugins and Custom Configuration
Key Plugins in Root Vite Config:
1. SVG Plugin (svgrPlugin) - Transforms SVGs to React components using SVGR
2. React SWC Plugin - Fast React compilation with SWC
3. Inject Plugin - Polyfills for jQuery, Buffer, EventEmitter
4. Module Federation Plugin - Webpack 5 style module federation
5. Ruby Plugin - Integration with Rails via vite-plugin-ruby
Custom Plugin Implementations:
- enableDecoratorsInFontkitJsPlugin - Parses decorators in fontkit
- inlineFontkitFilesPlugin - Inlines font files as base64
- nullifyFontkitUninitializedVariablesPlugin - Fixes fontkit bugs
- circumventBrotliCircularDependencyPlugin - Resolves circular dependency
- commonjsPlugin - Handles CommonJS modules excluded from optimizeDeps
6. Build Setup
Bundler Abstraction Layer:
- /config/bundler/bundler.sh - Wrapper script supporting both Webpack and Rspack
- Environment variable: USE_RSPACK=true for Rspack, default is Webpack
- Dynamically switches between bundler configurations
Development Server:
- Host: assets-dev.doctolib.com
- Port: 9030 (shared between webpack and rspack)
- HTTPS: Enabled with certificates from ci/ssl/
- Dev Server Type: HTTPS with optional HTTP2 disabled (due to Node 20.5.1-20.14 crash)
Source Maps:
- Production: source-map
- Development: eval-cheap-module-source-map
- Can be disabled with NO_SOURCE_MAPS env var
7. Optimization and Performance
Dependency Pre-bundling:
- Excluded: @foliojs-fork/pdfkit, brotli, @doctolib/tpf-medical-device-forms
- Included: pdfmake dependencies, patient-health-search deps, CommonJS modules
Asset Handling:
- Includes .xslt files in asset processing
- CORS configuration with pattern matching for localhost, internal Doctolib domains
- Asset manifestation via webpack-assets-manifest
Cache Configuration:
- Type: filesystem
- Invalidated on config changes via getConfigDependencies()
- Build algorithm: SHA256
8. Development Workflow
HMR (Hot Module Replacement):
- Enabled by default, can be disabled with DOCTOLIB_DISABLE_HMR=true
- React Refresh integration (babel for webpack, SWC for rspack)
- Status plugin for HMR feedback
- Notification support via node-notifier
Type Checking:
- Uses tsgo for TypeScript checking
- Root tsconfig includes: .cherry, app/assets, config/vite, engines, packages
9. Cross-Browser Targeting
Build Targets: - Chrome 70 - Firefox 68 - Safari 14 - Edge 83
10. Key Differences from Webpack Setup
- Vite is primarily used for:
- Individual TypeScript packages (
packages/@doctolib/*) - Libraries and SDKs
-
Design system components
-
Webpack/Rspack is used for:
- Main monolith application
- Rails asset pipeline integration
- Complex entrypoint management
- Module federation host
File Paths Summary
Key configuration files:
- /vite.config.mts - Root Vite config
- /config/vite/packages-base.ts - Package configuration factory
- /config/vite/svg-plugin.ts - SVG transformation plugin
- /config/vite/cors.ts - CORS configuration
- /vite.plugins.mts - Legacy module patch plugins
- nx.json - Nx workspace configuration
- /config/bundler/ - Webpack/Rspack configurations (alternative bundler system)