Z ZPI 文档 v0.3.8
介绍页

源码

packages/desktop/pdf-assets-plugin.ts

typescript44 行查看原文
import { readdir, readFile } from "node:fs/promises";
import { resolve, sep } from "node:path";
import type { Plugin } from "vite";

// Keep PDF fonts, CMaps and decoders local in development and packaged builds.
export function pdfAssetsPlugin(): Plugin {
  const root = resolve("node_modules/pdfjs-dist");
  const directories = ["cmaps", "standard_fonts", "wasm"];
  return {
    name: "zpi-pdf-assets",
    configureServer(server) {
      server.middlewares.use(async (req, res, next) => {
        const pathname = req.url?.split("?")[0];
        if (!pathname?.startsWith("/pdfjs/")) return next();
        const relative = pathname.slice("/pdfjs/".length);
        if (!directories.includes(relative.split("/")[0] ?? "")) return next();
        const path = resolve(root, relative);
        if (!path.startsWith(`${root}${sep}`)) return next();
        try {
          res.setHeader(
            "Content-Type",
            path.endsWith(".wasm") ? "application/wasm" : "application/octet-stream",
          );
          res.end(await readFile(path));
        } catch {
          next();
        }
      });
    },
    async generateBundle() {
      for (const directory of directories) {
        for (const entry of await readdir(resolve(root, directory), { withFileTypes: true })) {
          if (!entry.isFile()) continue;
          this.emitFile({
            type: "asset",
            fileName: `pdfjs/${directory}/${entry.name}`,
            source: await readFile(resolve(root, directory, entry.name)),
          });
        }
      }
    },
  };
}