import { resolve } from "node:path"; import { defineConfig } from "vite"; import wasm from "vite-plugin-wasm"; export default defineConfig({ root: "website", plugins: [ wasm(), // Build service worker as a separate, unhashed JS file { name: "build-sw", apply: "build", closeBundle: { sequential: true, async handler() { const { build } = await import("vite"); await build({ configFile: false, root: resolve(__dirname, "website"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist"), lib: { entry: resolve(__dirname, "website/sw.ts"), formats: ["es"], fileName: () => "sw.js", }, rollupOptions: { output: { entryFileNames: "sw.js", }, }, }, }); // Build shell.ts as a standalone JS bundle await build({ configFile: false, root: resolve(__dirname, "website"), resolve: { alias: { "@lib": resolve(__dirname, "./lib"), "@shared": resolve(__dirname, "./shared"), }, }, build: { emptyOutDir: false, outDir: resolve(__dirname, "dist"), lib: { entry: resolve(__dirname, "website/shell.ts"), formats: ["es"], fileName: () => "shell.js", }, rollupOptions: { output: { entryFileNames: "shell.js", }, }, }, }); // Build books module components await build({ configFile: false, root: resolve(__dirname, "modules/books/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/books"), lib: { entry: resolve(__dirname, "modules/books/components/folk-book-shelf.ts"), formats: ["es"], fileName: () => "folk-book-shelf.js", }, rollupOptions: { output: { entryFileNames: "folk-book-shelf.js", }, }, }, }); await build({ configFile: false, root: resolve(__dirname, "modules/books/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/books"), lib: { entry: resolve(__dirname, "modules/books/components/folk-book-reader.ts"), formats: ["es"], fileName: () => "folk-book-reader.js", }, rollupOptions: { output: { entryFileNames: "folk-book-reader.js", }, }, }, }); // Copy books CSS const { copyFileSync, mkdirSync } = await import("node:fs"); mkdirSync(resolve(__dirname, "dist/modules/books"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/books/components/books.css"), resolve(__dirname, "dist/modules/books/books.css"), ); // Build pubs module component await build({ configFile: false, root: resolve(__dirname, "modules/pubs/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/pubs"), lib: { entry: resolve(__dirname, "modules/pubs/components/folk-pubs-editor.ts"), formats: ["es"], fileName: () => "folk-pubs-editor.js", }, rollupOptions: { output: { entryFileNames: "folk-pubs-editor.js", }, }, }, }); // Copy pubs CSS mkdirSync(resolve(__dirname, "dist/modules/pubs"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/pubs/components/pubs.css"), resolve(__dirname, "dist/modules/pubs/pubs.css"), ); // Build cart module component await build({ configFile: false, root: resolve(__dirname, "modules/cart/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/cart"), lib: { entry: resolve(__dirname, "modules/cart/components/folk-cart-shop.ts"), formats: ["es"], fileName: () => "folk-cart-shop.js", }, rollupOptions: { output: { entryFileNames: "folk-cart-shop.js", }, }, }, }); // Copy cart CSS mkdirSync(resolve(__dirname, "dist/modules/cart"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/cart/components/cart.css"), resolve(__dirname, "dist/modules/cart/cart.css"), ); // Build providers module component await build({ configFile: false, root: resolve(__dirname, "modules/providers/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/providers"), lib: { entry: resolve(__dirname, "modules/providers/components/folk-provider-directory.ts"), formats: ["es"], fileName: () => "folk-provider-directory.js", }, rollupOptions: { output: { entryFileNames: "folk-provider-directory.js", }, }, }, }); // Copy providers CSS mkdirSync(resolve(__dirname, "dist/modules/providers"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/providers/components/providers.css"), resolve(__dirname, "dist/modules/providers/providers.css"), ); // Build swag module component await build({ configFile: false, root: resolve(__dirname, "modules/swag/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/swag"), lib: { entry: resolve(__dirname, "modules/swag/components/folk-swag-designer.ts"), formats: ["es"], fileName: () => "folk-swag-designer.js", }, rollupOptions: { output: { entryFileNames: "folk-swag-designer.js", }, }, }, }); // Copy swag CSS mkdirSync(resolve(__dirname, "dist/modules/swag"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/swag/components/swag.css"), resolve(__dirname, "dist/modules/swag/swag.css"), ); // Build choices module component await build({ configFile: false, root: resolve(__dirname, "modules/choices/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/choices"), lib: { entry: resolve(__dirname, "modules/choices/components/folk-choices-dashboard.ts"), formats: ["es"], fileName: () => "folk-choices-dashboard.js", }, rollupOptions: { output: { entryFileNames: "folk-choices-dashboard.js", }, }, }, }); // Copy choices CSS mkdirSync(resolve(__dirname, "dist/modules/choices"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/choices/components/choices.css"), resolve(__dirname, "dist/modules/choices/choices.css"), ); // Build funds module component await build({ configFile: false, root: resolve(__dirname, "modules/funds/components"), resolve: { alias: { "../lib/types": resolve(__dirname, "modules/funds/lib/types.ts"), "../lib/simulation": resolve(__dirname, "modules/funds/lib/simulation.ts"), "../lib/presets": resolve(__dirname, "modules/funds/lib/presets.ts"), }, }, build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/funds"), lib: { entry: resolve(__dirname, "modules/funds/components/folk-budget-river.ts"), formats: ["es"], fileName: () => "folk-budget-river.js", }, rollupOptions: { output: { entryFileNames: "folk-budget-river.js", }, }, }, }); // Copy funds CSS mkdirSync(resolve(__dirname, "dist/modules/funds"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/funds/components/funds.css"), resolve(__dirname, "dist/modules/funds/funds.css"), ); // Build files module component await build({ configFile: false, root: resolve(__dirname, "modules/files/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/files"), lib: { entry: resolve(__dirname, "modules/files/components/folk-file-browser.ts"), formats: ["es"], fileName: () => "folk-file-browser.js", }, rollupOptions: { output: { entryFileNames: "folk-file-browser.js", }, }, }, }); // Copy files CSS mkdirSync(resolve(__dirname, "dist/modules/files"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/files/components/files.css"), resolve(__dirname, "dist/modules/files/files.css"), ); // Build forum module component await build({ configFile: false, root: resolve(__dirname, "modules/forum/components"), build: { emptyOutDir: false, outDir: resolve(__dirname, "dist/modules/forum"), lib: { entry: resolve(__dirname, "modules/forum/components/folk-forum-dashboard.ts"), formats: ["es"], fileName: () => "folk-forum-dashboard.js", }, rollupOptions: { output: { entryFileNames: "folk-forum-dashboard.js", }, }, }, }); // Copy forum CSS mkdirSync(resolve(__dirname, "dist/modules/forum"), { recursive: true }); copyFileSync( resolve(__dirname, "modules/forum/components/forum.css"), resolve(__dirname, "dist/modules/forum/forum.css"), ); }, }, }, ], resolve: { alias: { "@lib": resolve(__dirname, "./lib"), "@encryptid": resolve(__dirname, "./src/encryptid"), "@shared": resolve(__dirname, "./shared"), }, }, build: { target: "esnext", rollupOptions: { input: { index: resolve(__dirname, "./website/index.html"), canvas: resolve(__dirname, "./website/canvas.html"), }, }, modulePreload: { polyfill: false, }, outDir: "../dist", emptyOutDir: true, // Copy shell.css to dist cssCodeSplit: false, }, server: { port: 5173, }, optimizeDeps: { exclude: ["@automerge/automerge"], }, });