diff --git a/packages/api/dev-server.mts b/packages/api/dev-server.mts index 19006c4e..d95c55c1 100644 --- a/packages/api/dev-server.mts +++ b/packages/api/dev-server.mts @@ -20,3 +20,14 @@ process.on('SIGINT', async function () { server.close(); process.exit(); }); +if (import.meta.hot) { + import.meta.hot.on('vite:beforeFullReload', () => { + wss.close(); + server.close(); + }); + + import.meta.hot.dispose(() => { + wss.close(); + server.close(); + }); +} diff --git a/packages/api/package.json b/packages/api/package.json index de4a3fb4..25f73530 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -8,7 +8,7 @@ "dist/**" ], "scripts": { - "dev": "vite-node dev-server.mts", + "dev": "vite-node -w dev-server.mts", "test": "vitest", "prebuild": "rm -rf ./dist", "build": "tsc && cp -R ./drizzle ./dist/drizzle && cp -R ./srcbook/examples ./dist/srcbook/examples && cp -R ./prompts ./dist/prompts", diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 5d1c4c70..0bc430d8 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -4,7 +4,7 @@ "noEmit": false, "allowImportingTsExtensions": false, "outDir": "dist", - "types": ["vitest/globals"] + "types": ["vitest/globals", "vite/client"] }, "include": ["**/*.mts"], "exclude": ["node_modules", "dist"] diff --git a/packages/api/tsconfig.lint.json b/packages/api/tsconfig.lint.json index dca67157..ee7af700 100644 --- a/packages/api/tsconfig.lint.json +++ b/packages/api/tsconfig.lint.json @@ -1,4 +1,4 @@ { - "include": ["**/*.mts", "vite.config.ts", "drizzle.config.ts"], + "include": ["**/*.mts", "vite.config.ts", "drizzle.config.ts", "vite-env.d.ts"], "exclude": ["node_modules", "dist"] } diff --git a/packages/api/vite-env.d.ts b/packages/api/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/packages/api/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/configs/ts/base.json b/packages/configs/ts/base.json index c9bf2133..122e685f 100644 --- a/packages/configs/ts/base.json +++ b/packages/configs/ts/base.json @@ -9,7 +9,7 @@ "isolatedModules": true, "useDefineForClassFields": true, "lib": ["es2022", "DOM", "DOM.Iterable"], - "module": "Preserve", + "module": "esnext", "moduleDetection": "force", "moduleResolution": "bundler", "noUncheckedIndexedAccess": true, diff --git a/packages/web/package.json b/packages/web/package.json index 0a1663e8..94b4bbd7 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -60,6 +60,7 @@ "@types/react-dom": "^18.3.0", "@vitejs/plugin-react-swc": "^3.7.0", "autoprefixer": "^10.4.20", + "chokidar": "^3.6.0", "postcss": "^8.4.45", "tailwindcss": "^3.4.11", "vite": "^5.4.4" diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index c60f6f22..9d361b54 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -1,10 +1,29 @@ import path from 'path'; import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react-swc'; +import chokidar from 'chokidar'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react(), + // reload on backend change + { + name: 'backend-watch-reload', + configureServer(server) { + const watcher = chokidar.watch('../api/**/*.mts', { + ignored: /node_modules/, + persistent: true, + }); + watcher.on('change', () => { + server.ws.send({ + type: 'full-reload', + }); + }); + }, + }, + ], + resolve: { alias: { '@': path.resolve(__dirname, './src'), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce7bf363..5a9ce1e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -293,6 +293,9 @@ importers: autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.45) + chokidar: + specifier: ^3.6.0 + version: 3.6.0 postcss: specifier: ^8.4.45 version: 8.4.45 @@ -3489,7 +3492,6 @@ packages: lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lucide-react@0.439.0: resolution: {integrity: sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==} peerDependencies: