import path from 'node:path'; import react from '@vitejs/plugin-react'; import glob from 'glob'; import { nodeExternals } from 'rollup-plugin-node-externals'; import type { Plugin } from 'vite'; import { defineConfig } from 'vite'; import dts from 'vite-plugin-dts'; import { WebSocketServer } from 'ws'; const excludeFiles = [ '**/components/playground/*', '**/main.tsx', '**/vite-env.d.ts', ]; const devWebSocketPlugin = (): Plugin => ({ name: 'dev-y-websocket', apply: 'serve', configureServer(server) { if (!server.httpServer) return; // eslint-disable-next-line @typescript-eslint/no-require-imports const { setupWSConnection } = require('y-websocket/bin/utils'); const wss = new WebSocketServer({ noServer: true }); server.httpServer.on('upgrade', (request, socket, head) => { const url = request.url ?? ''; if (!url.startsWith('/yjs/')) return; const pageId = url.slice('/yjs/'.length).split('?')[0]; wss.handleUpgrade(request, socket, head, (ws) => { wss.emit('connection', ws, request); setupWSConnection(ws, request, { docName: pageId }); }); }); }, }); // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), devWebSocketPlugin(), dts({ entryRoot: 'src', exclude: [...excludeFiles], copyDtsFiles: true, }), { ...nodeExternals({ devDeps: true, builtinsPrefix: 'ignore', }), enforce: 'pre', }, ], build: { outDir: 'dist', sourcemap: true, lib: { entry: glob.sync(path.resolve(__dirname, 'src/**/*.{ts,tsx}'), { ignore: [...excludeFiles, '**/*.spec.ts'], }), name: 'editor-libs', formats: ['es'], }, rollupOptions: { output: { preserveModules: true, preserveModulesRoot: 'src', }, }, }, });