mon-entreprise/site/vite.config.ts

214 lines
5.6 KiB
TypeScript
Raw Normal View History

2023-09-19 17:52:36 +00:00
/// <reference types="vitest" />
2022-03-28 14:30:39 +00:00
/* eslint-disable no-console */
2023-09-12 07:37:17 +00:00
2023-06-15 13:57:48 +00:00
import path from 'path'
2022-04-13 16:42:50 +00:00
import replace from '@rollup/plugin-replace'
2023-02-08 09:09:19 +00:00
import yaml, { ValidYamlType } from '@rollup/plugin-yaml'
2023-09-25 14:01:42 +00:00
import { sentryVitePlugin } from '@sentry/vite-plugin'
import legacy from '@vitejs/plugin-legacy'
2023-03-01 11:48:46 +00:00
import react from '@vitejs/plugin-react-swc'
2023-09-25 17:59:53 +00:00
import { defineConfig, loadEnv, splitVendorChunkPlugin } from 'vite'
2022-06-30 17:32:57 +00:00
import { VitePWA } from 'vite-plugin-pwa'
2022-11-03 16:32:04 +00:00
2023-09-12 07:37:17 +00:00
import { multipleSPA } from './build/multiple-SPA'
import { pwaOptions } from './build/vite-pwa-options'
2022-01-26 08:53:15 +00:00
const env = (mode: string) => loadEnv(mode, process.cwd(), '')
2023-09-25 14:01:42 +00:00
const branch = (mode: string) => getBranch(mode)
const sentryReleaseName = (mode: string) =>
env(mode).VITE_GITHUB_SHA
? `${branch(mode).split('/').at(-1)}-` +
env(mode).VITE_GITHUB_SHA?.substring(0, 7)
2023-09-25 14:01:42 +00:00
: undefined
export default defineConfig(({ command, mode }) => ({
resolve: {
2023-02-01 00:28:35 +00:00
alias: [{ find: '@', replacement: path.resolve('./source') }],
extensions: ['.js', '.ts', '.jsx', '.tsx', '.json'],
},
publicDir: 'source/public',
2022-04-13 16:42:50 +00:00
build: {
minify: process.env.NODE_ENV === 'production' ? 'esbuild' : false,
2022-08-03 16:33:43 +00:00
sourcemap: true,
2022-08-03 15:00:50 +00:00
rollupOptions: {
output: {
2023-09-25 17:59:53 +00:00
hoistTransitiveImports: false,
manualChunks: (id) => {
if (id.includes('modele-social')) {
return 'modele-social'
}
},
2022-08-03 15:00:50 +00:00
chunkFileNames: (chunkInfo) => {
if (chunkInfo.isDynamicEntry) {
return 'assets/lazy_[name].[hash].js'
}
return 'assets/[name].[hash].js'
},
},
},
2022-04-13 16:42:50 +00:00
},
define: {
2023-09-25 14:01:42 +00:00
BRANCH_NAME: JSON.stringify(branch(mode)),
IS_DEVELOPMENT: mode === 'development',
IS_STAGING: mode === 'production' && !isProductionBranch(mode),
IS_PRODUCTION: mode === 'production' && isProductionBranch(mode),
SENTRY_RELEASE_NAME: JSON.stringify(sentryReleaseName(mode)),
},
plugins: [
2022-04-13 16:42:50 +00:00
command === 'build' &&
replace({
__SENTRY_DEBUG__: false,
preventAssignment: false,
}),
2023-09-12 07:37:17 +00:00
react(),
2023-09-12 07:37:17 +00:00
2023-02-08 09:09:19 +00:00
yaml({
transform(data, filePath) {
return filePath.endsWith('/rules-en.yaml')
? cleanAutomaticTag(data)
: data
},
}),
2023-09-12 07:37:17 +00:00
multipleSPA({
defaultSite: 'mon-entreprise',
templatePath: './source/entries/template.html',
sites: {
'mon-entreprise': {
lang: 'fr',
entry: '/source/entries/entry-fr.tsx',
logo: '/source/assets/images/logo-monentreprise.svg',
logoAlt: 'Logo mon-entreprise, site Urssaf',
},
infrance: {
lang: 'en',
entry: '/source/entries/entry-en.tsx',
logo: '/logo-mycompany-share.png',
logoAlt: 'Logo My company in France by Urssaf',
},
},
}),
2023-09-12 07:37:17 +00:00
2022-08-03 15:00:50 +00:00
VitePWA(pwaOptions),
2023-09-12 07:37:17 +00:00
legacy({
targets: ['defaults', 'not IE 11'],
}),
2023-09-25 14:01:42 +00:00
2023-09-25 17:59:53 +00:00
splitVendorChunkPlugin(),
2023-09-25 14:01:42 +00:00
sentryVitePlugin({
org: 'betagouv',
project: 'mon-entreprise',
url: 'https://sentry.incubateur.net/',
authToken: process.env.SENTRY_AUTH_TOKEN,
telemetry: false,
release: {
// Use same release name as the one used in the app.
name: sentryReleaseName(mode),
inject: false, // Avoid adding imports with a hash in chunks, as this causes long term caching issues.
2023-09-25 14:01:42 +00:00
uploadLegacySourcemaps: {
paths: ['./dist'],
ignore: ['./node_modules'],
},
},
}),
],
2023-09-12 07:37:17 +00:00
2022-02-10 11:07:19 +00:00
server: {
2022-11-15 14:26:06 +00:00
port: 3000,
hmr: {
clientPort:
typeof env(mode).HMR_CLIENT_PORT !== 'undefined'
? parseInt(env(mode).HMR_CLIENT_PORT)
: undefined,
},
2022-02-10 11:07:19 +00:00
// Keep watching changes in the publicodes package to support live reload
// when we iterate on publicodes logic.
// https://vitejs.dev/config/#server-watch
watch: {
ignored: [
'!**/node_modules/publicodes/**',
2023-12-14 09:54:17 +00:00
'!**/node_modules/@publicodes\\/react-ui/**',
2022-02-10 11:07:19 +00:00
],
},
proxy: {
'/api': 'http://localhost:3004',
'/twemoji': {
target: 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/twemoji/, ''),
2022-09-13 17:32:16 +00:00
timeout: 3 * 1000,
},
},
2022-02-10 11:07:19 +00:00
},
2023-09-12 07:37:17 +00:00
2022-02-10 11:07:19 +00:00
optimizeDeps: {
entries: ['./source/entries/entry-fr.tsx', './source/entries/entry-en.tsx'],
2023-12-14 09:54:17 +00:00
include: ['@publicodes\\/react-ui > react/jsx-runtime'],
exclude: ['@publicodes\\/react-ui', 'publicodes'],
2022-02-10 11:07:19 +00:00
},
2023-09-12 07:37:17 +00:00
2022-11-22 11:12:17 +00:00
ssr: {
/**
* Prevent listed dependencies from being externalized for SSR build cause some
2023-09-12 07:37:17 +00:00
* packages are not esm ready or package.json setup seems wrong:
2022-11-22 11:12:17 +00:00
*/
2023-09-12 07:37:17 +00:00
noExternal: [/tslib/],
2022-11-22 11:12:17 +00:00
},
test: {
environmentMatchGlobs: [
// all tests in source with tsx will run in happy-dom (component tests)
['source/**/*.test.tsx', 'happy-dom'],
],
setupFiles: ['./vitest-setup.ts'],
},
}))
/**
2023-09-12 07:37:17 +00:00
* We use this function to hide some features in production while keeping them
* in feature-branches. In case we do A/B testing with several branches served
* in production, we should add the public faced branch names in the test below.
* This is different from the import.meta.env.MODE in that a feature branch may
* be build in production mode (with the NODE_ENV) but we may still want to show
* or hide some features.
*/
2023-09-12 07:37:17 +00:00
const isProductionBranch = (mode: string) => {
return ['master', 'next'].includes(getBranch(mode))
}
2023-09-12 07:37:17 +00:00
const getBranch = (mode: string) => {
let branch: string | undefined = env(mode)
.VITE_GITHUB_REF?.split('/')
?.slice(-1)?.[0]
if (branch === 'merge') {
branch = env(mode).VITE_GITHUB_HEAD_REF
}
return branch ?? ''
}
2023-02-08 09:09:19 +00:00
const cleanAutomaticTag = (data: ValidYamlType): ValidYamlType => {
if (typeof data === 'string' && data.startsWith('[automatic] ')) {
return data.replace('[automatic] ', '')
}
if (Array.isArray(data)) {
return data.map((val) => cleanAutomaticTag(val))
}
if (data && typeof data === 'object') {
return Object.fromEntries<ValidYamlType>(
Object.entries(data).map(([key, val]) => [key, cleanAutomaticTag(val)])
)
}
return data
}