Newer
Older
gnexus-book / ui / vite.config.js
@Eugene Sukhodolskiy Eugene Sukhodolskiy 2 days ago 1 KB Fix UI layout and font serving
import { fileURLToPath, URL } from "node:url";
import { createReadStream, existsSync, statSync } from "node:fs";
import { extname, join, normalize } from "node:path";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

const uiKitRoot = fileURLToPath(new URL("./node_modules/gnexus-ui-kit", import.meta.url));
const uiKitFontsDir = join(uiKitRoot, "dist", "assets", "fonts");

function serveUiKitFont(request, response, next) {
  if (!request.url) {
    next();
    return;
  }

  const requestedPath = normalize(decodeURIComponent(request.url.split("?", 1)[0])).replace(
    /^(\.\.[/\\])+/,
    ""
  );
  const filePath = join(uiKitFontsDir, requestedPath);
  if (!filePath.startsWith(uiKitFontsDir) || !existsSync(filePath) || !statSync(filePath).isFile()) {
    next();
    return;
  }

  const contentType = extname(filePath) === ".ttf" ? "font/ttf" : "application/octet-stream";
  response.setHeader("Content-Type", contentType);
  response.setHeader("Cache-Control", "public, max-age=3600");
  createReadStream(filePath).pipe(response);
}

function gnexusUiKitFontServer() {
  return {
    name: "gnexus-ui-kit-font-server",
    configureServer(server) {
      server.middlewares.use("/assets/fonts", serveUiKitFont);
    },
    configurePreviewServer(server) {
      server.middlewares.use("/assets/fonts", serveUiKitFont);
    }
  };
}

export default defineConfig({
  plugins: [gnexusUiKitFontServer(), vue()],
  resolve: {
    alias: {
      vue: fileURLToPath(new URL("./node_modules/vue/dist/vue.esm-bundler.js", import.meta.url))
    },
    dedupe: ["vue"]
  },
  server: {
    host: "0.0.0.0",
    port: 3006,
    proxy: {
      "/api": {
        target: "http://127.0.0.1:3005",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, "")
      }
    }
  }
});