fix(web,api): lecteur PDF — options pdf.js, assets cmaps/fonts et recherche sans limite par défaut
This commit is contained in:
@ -1,8 +1,71 @@
|
||||
import { createReadStream } from "node:fs";
|
||||
import { cp, stat } from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import react from "@vitejs/plugin-react";
|
||||
import { defineConfig } from "vite";
|
||||
import { defineConfig, type Plugin } from "vite";
|
||||
|
||||
const appRoot = fileURLToPath(new URL(".", import.meta.url));
|
||||
const pdfjsRoot = path.join(appRoot, "node_modules/pdfjs-dist");
|
||||
const pdfjsAssetDirs = ["cmaps", "iccs", "standard_fonts", "wasm"];
|
||||
|
||||
function pdfjsAssetsPlugin(): Plugin {
|
||||
let outDir = path.join(appRoot, "dist");
|
||||
|
||||
function contentType(filePath: string) {
|
||||
if (filePath.endsWith(".wasm")) return "application/wasm";
|
||||
if (filePath.endsWith(".mjs")) return "text/javascript";
|
||||
if (filePath.endsWith(".bcmap")) return "application/octet-stream";
|
||||
if (filePath.endsWith(".icc")) return "application/vnd.iccprofile";
|
||||
if (filePath.endsWith(".ttf")) return "font/ttf";
|
||||
if (filePath.endsWith(".pfb")) return "application/octet-stream";
|
||||
return "application/octet-stream";
|
||||
}
|
||||
|
||||
return {
|
||||
name: "readabook-pdfjs-assets",
|
||||
configResolved(config) {
|
||||
outDir = path.resolve(config.root, config.build.outDir);
|
||||
},
|
||||
configureServer(server) {
|
||||
server.middlewares.use("/pdfjs", async (request, response, next) => {
|
||||
try {
|
||||
const requestPath = new URL(request.url ?? "", "http://localhost").pathname;
|
||||
const relativePath = decodeURIComponent(requestPath)
|
||||
.replace(/^\/+/, "")
|
||||
.replace(/^pdfjs\/+/, "");
|
||||
const assetPath = path.resolve(pdfjsRoot, relativePath);
|
||||
if (!assetPath.startsWith(pdfjsRoot)) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
const asset = await stat(assetPath);
|
||||
if (!asset.isFile()) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
response.setHeader("Content-Type", contentType(assetPath));
|
||||
createReadStream(assetPath).pipe(response);
|
||||
} catch {
|
||||
next();
|
||||
}
|
||||
});
|
||||
},
|
||||
async writeBundle() {
|
||||
await Promise.all(
|
||||
pdfjsAssetDirs.map((directory) =>
|
||||
cp(path.join(pdfjsRoot, directory), path.join(outDir, "pdfjs", directory), {
|
||||
recursive: true,
|
||||
force: true
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
plugins: [react(), pdfjsAssetsPlugin()],
|
||||
server: {
|
||||
port: 5173,
|
||||
proxy: {
|
||||
|
||||
Reference in New Issue
Block a user