freezmo/scripts/copy-pdf-worker.mjs
Martin Dvorak 3ea2cea100 Freezmo: self-hosted notes-to-activities study app
Next.js 15 app that turns photos, PDFs, DOCX/PPTX and text into a swipeable
feed of AI-generated activities (flashcards, multiple choice, true/false,
fill-in-the-blank, matching, ordering, short answer) using the user's own
Ollama models.

Highlights:
- All AI calls run in server route handlers; the browser never talks to Ollama.
- Bring-your-own-key mode (default): the key lives only in the browser and is
  sent per-request; server, local-daemon and shared-key modes also supported.
- Client-side document extraction (pdf.js, mammoth, jszip) with scanned-PDF
  page rendering for the vision model; notes stay in their original language.
- ChatGPT-style shell: collapsible sidebar / mobile drawer, neutral token-based
  light + dark themes, folder organisation, PWA (manifest, SW, offline page).
- Strict JSON validation with zod + auto-repair, rate limiting, and request
  guards (cross-origin, body-size, API-key sanitising).
- setup.sh bootstraps deps, .env.local and a production build.

Gitignore excludes .env*, the generated pdf.js worker and local scratch files.
2026-10-06 20:56:55 +00:00

32 lines
1.1 KiB
JavaScript

/**
* Copies the pdf.js worker into /public so the browser can load it as a plain
* asset. Running pdf.js on the main thread is not supported, and bundler asset
* handling for workers differs between webpack and Turbopack, so an explicit
* copy is the most predictable option.
*
* Wired to `predev` and `prebuild` in package.json.
*/
import { copyFileSync, existsSync, mkdirSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
const candidates = [
"pdfjs-dist/build/pdf.worker.min.mjs",
"pdfjs-dist/build/pdf.worker.mjs",
];
const destination = join(root, "public", "pdf.worker.min.mjs");
mkdirSync(join(root, "public"), { recursive: true });
for (const candidate of candidates) {
const source = join(root, "node_modules", candidate);
if (existsSync(source)) {
copyFileSync(source, destination);
console.log(`[freezmo] copied ${candidate} -> public/pdf.worker.min.mjs`);
process.exit(0);
}
}
console.error("[freezmo] could not find the pdf.js worker — run `npm install` first");
process.exit(1);