e93bbc5776
* init * add: vite dev build working * fix: href serving from public * feat: add ejs plugin * feat: migrated env files and ejs templating * chore: add types related to envs * chore: add vite-env types * feat: support vite pwa * chore: upgrade vite pwa * chore: pin node version to 16.18.1 * chore: preserve use of nodejs 14 * refactor: preserve REACT_APP as env prefix * chore: support esm environment variables * fix ts config * use VITE prefix and remove vite-plugin-env-compatible * introduce import-meta-loader for building pacakge as webpack isn't compatible with import.meta syntax * lint * remove import.meta.env in main.js * set debug flag to false * migrate to vitest and use jest-canvas-mock 2.4.0 so its comp atible with vite * integrate vitest-ui * fix most of teh test * snaps * Add script for testing with vite ui * fix all tests related to mocking * fix more test * fix more * fix flip.test.tsx * fix contentxmenu snaps * fix regression snaps * fix excalidraw.test.tsx and this makes all tests finally pass :) * use node 16 * specify node version * use node 16 in lint as well * fix mobile.test.tsx * use node 16 * add style-loader * upgrade to node 18 * fix lint package.json * support eslint with vite * fix lint * fix lint * fix ts * remove pwa/sw stuff * use env vars in EJS the vite way * fix lint * move remainig jest mock/spy to vite * don't cache locales * fix regex * add fonts cache * tweak * add custom service worker * upgrade vite and create font cache again * cache fonts.css and locales * tweak * use manifestTransforms for filtering locales * use assets js pattern for locales * add font.css to globIgnore so its pushed to fonts cache * create a separate chunk for locales with rollup * remove manifestTransforms and fix glob pattern for locales to filter from workbox pre-cache * push sourcemaps in production * add comments in config * lint * use node 18 * disable pwa in dev * fix * fix * increase limit of bundle * upgrade vite-pwa to latest * remove public/workbox so workbox assets are not precached * fon't club en.json and percentages.json with manual locales chunk to fix first load+offline mode * tweak regex * remove happy-dom as its not used * add comment * use any instead of ts-ignore * cleanup * remove jest-canvas-mock resolution as vite-canvas-mock was patched locking deps at 2.4.0 * use same theme color present in entry point --------- Co-authored-by: Weslley Braga <weslley@bambee.com> Co-authored-by: dwelle <luzar.david@gmail.com>
164 lines
4.5 KiB
TypeScript
164 lines
4.5 KiB
TypeScript
import { defineConfig } from "vite";
|
|
import react from "@vitejs/plugin-react";
|
|
import svgrPlugin from "vite-plugin-svgr";
|
|
import { ViteEjsPlugin } from "vite-plugin-ejs";
|
|
import { VitePWA } from "vite-plugin-pwa";
|
|
import eslint from "vite-plugin-eslint";
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig({
|
|
build: {
|
|
outDir: "build",
|
|
rollupOptions: {
|
|
output: {
|
|
// Creating separate chunk for locales except for en and percentages.json so they
|
|
// can be cached at runtime and not merged with
|
|
// app precache. en.json and percentages.json are needed for first load
|
|
// or fallback hence not clubbing with locales so first load followed by offline mode works fine. This is how CRA used to work too.
|
|
manualChunks(id) {
|
|
if (
|
|
id.includes("src/locales") &&
|
|
id.match(/en.json|percentages.json/) === null
|
|
) {
|
|
const index = id.indexOf("locales/");
|
|
// Taking the substring after "locales/"
|
|
return `locales/${id.substring(index + 8)}`;
|
|
}
|
|
},
|
|
},
|
|
},
|
|
sourcemap: true,
|
|
},
|
|
plugins: [
|
|
react(),
|
|
eslint(),
|
|
svgrPlugin(),
|
|
ViteEjsPlugin(),
|
|
VitePWA({
|
|
devOptions: {
|
|
/* set this flag to true to enable in Development mode */
|
|
enabled: false,
|
|
},
|
|
|
|
workbox: {
|
|
// Don't push fonts and locales to app precache
|
|
globIgnores: ["fonts.css", "**/locales/**"],
|
|
runtimeCaching: [
|
|
{
|
|
urlPattern: new RegExp("/.+.(ttf|woff2|otf)"),
|
|
handler: "CacheFirst",
|
|
options: {
|
|
cacheName: "fonts",
|
|
expiration: {
|
|
maxEntries: 50,
|
|
maxAgeSeconds: 60 * 60 * 24 * 90, // <== 90 days
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: new RegExp("fonts.css"),
|
|
handler: "StaleWhileRevalidate",
|
|
options: {
|
|
cacheName: "fonts",
|
|
expiration: {
|
|
maxEntries: 50,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: new RegExp("locales/[^/]+.js"),
|
|
handler: "CacheFirst",
|
|
options: {
|
|
cacheName: "locales",
|
|
expiration: {
|
|
maxEntries: 50,
|
|
maxAgeSeconds: 60 * 60 * 24 * 30, // <== 30 days
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
manifest: {
|
|
short_name: "Excalidraw",
|
|
name: "Excalidraw",
|
|
description:
|
|
"Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them.",
|
|
icons: [
|
|
{
|
|
src: "logo-180x180.png",
|
|
sizes: "180x180",
|
|
type: "image/png",
|
|
},
|
|
{
|
|
src: "apple-touch-icon.png",
|
|
type: "image/png",
|
|
sizes: "256x256",
|
|
},
|
|
],
|
|
start_url: "/",
|
|
display: "standalone",
|
|
theme_color: "#121212",
|
|
background_color: "#ffffff",
|
|
file_handlers: [
|
|
{
|
|
action: "/",
|
|
accept: {
|
|
"application/vnd.excalidraw+json": [".excalidraw"],
|
|
},
|
|
},
|
|
],
|
|
share_target: {
|
|
action: "/web-share-target",
|
|
method: "POST",
|
|
enctype: "multipart/form-data",
|
|
params: {
|
|
files: [
|
|
{
|
|
name: "file",
|
|
accept: [
|
|
"application/vnd.excalidraw+json",
|
|
"application/json",
|
|
".excalidraw",
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
screenshots: [
|
|
{
|
|
src: "/screenshots/virtual-whiteboard.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
{
|
|
src: "/screenshots/wireframe.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
{
|
|
src: "/screenshots/illustration.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
{
|
|
src: "/screenshots/shapes.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
{
|
|
src: "/screenshots/collaboration.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
{
|
|
src: "/screenshots/export.png",
|
|
type: "image/png",
|
|
sizes: "462x945",
|
|
},
|
|
],
|
|
},
|
|
}),
|
|
],
|
|
publicDir: "./public",
|
|
});
|