Buid and package EmbedPDF.js using Github workflow

This commit is contained in:
EmeraldPi
2025-12-14 19:02:53 -05:00
parent 438ae4466f
commit d07d12a975
8 changed files with 2800 additions and 21 deletions

View File

@@ -0,0 +1,135 @@
name: Update EmbedPDF Snippet
on:
workflow_dispatch:
schedule:
- cron: '0 3 * * 1' # Weekly; adjust as needed
jobs:
update-snippet:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Read current upstream version marker
id: current-version
run: |
if [ -f vendor/embedpdf/.upstream-version ]; then
CUR=$(cat vendor/embedpdf/.upstream-version)
else
CUR=""
fi
echo "version=$CUR" >> "$GITHUB_OUTPUT"
- name: Read latest upstream version (@embedpdf/core)
id: upstream-version
run: |
LATEST=$(npm view @embedpdf/core version)
echo "version=$LATEST" >> "$GITHUB_OUTPUT"
- name: Should update?
id: gate
run: |
if [ "${{ steps.upstream-version.outputs.version }}" = "${{ steps.current-version.outputs.version }}" ]; then
echo "run=false" >> "$GITHUB_OUTPUT"
echo "No upstream version change detected."
else
echo "run=true" >> "$GITHUB_OUTPUT"
echo "Updating from '${{ steps.current-version.outputs.version }}' to '${{ steps.upstream-version.outputs.version }}'"
fi
- name: Setup Node
if: steps.gate.outputs.run == 'true'
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: Enable corepack (pnpm)
if: steps.gate.outputs.run == 'true'
run: corepack enable
- name: Prepare workspace
if: steps.gate.outputs.run == 'true'
run: |
mkdir -p vendor/embedpdf
npm config set cache ./\.npm-cache
- name: Clone upstream embed-pdf-viewer
if: steps.gate.outputs.run == 'true'
run: git clone https://github.com/embedpdf/embed-pdf-viewer ../embed-pdf-viewer
- name: Install upstream deps
if: steps.gate.outputs.run == 'true'
working-directory: ../embed-pdf-viewer
run: pnpm install --frozen-lockfile
- name: Build snippet
if: steps.gate.outputs.run == 'true'
working-directory: ../embed-pdf-viewer
run: pnpm run build:snippet
- name: Pack snippet tarball
if: steps.gate.outputs.run == 'true'
working-directory: ../embed-pdf-viewer
run: |
npm pack ./snippet --pack-destination ../bentopdf/vendor/embedpdf
ls -l ../bentopdf/vendor/embedpdf
- name: Sanitize tarball (rename pkg and pin deps)
if: steps.gate.outputs.run == 'true'
env:
UPSTREAM_VERSION: ${{ steps.upstream-version.outputs.version }}
run: |
TARBALL=$(ls vendor/embedpdf/*.tgz | sort | tail -n1)
TMP=$(mktemp -d)
tar -xzf "$TARBALL" -C "$TMP"
PKG="$TMP/package/package.json"
PKG="$PKG" node - <<'NODE'
const fs = require("fs");
const path = process.env.PKG;
const ver = process.env.UPSTREAM_VERSION || "1.4.1";
const pkg = JSON.parse(fs.readFileSync(path, "utf8"));
pkg.name = "embedpdf-snippet";
pkg.dependencies = pkg.dependencies || {};
for (const k of Object.keys(pkg.dependencies)) {
if (k.startsWith("@embedpdf/")) pkg.dependencies[k] = `^${ver}`;
if (k === "preact") pkg.dependencies[k] = "^10.17.0";
}
fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n");
NODE
NEW=vendor/embedpdf/embedpdf-snippet-${UPSTREAM_VERSION}.tgz
tar -czf "$NEW" -C "$TMP" package
# Remove any older snippet tarballs, keep only the new one
find vendor/embedpdf -maxdepth 1 -name 'embedpdf-snippet-*.tgz' ! -name "$(basename "$NEW")" -delete
rm -rf "$TMP"
ls -l vendor/embedpdf
- name: Update package.json dependency path
if: steps.gate.outputs.run == 'true'
run: |
TARBALL=$(ls vendor/embedpdf/embedpdf-snippet-*.tgz | sort | tail -n1)
node -e "const fs=require('fs');const pkg=require('./package.json');const tar=process.argv[1];pkg.dependencies['embedpdf-snippet']='file:'+tar;fs.writeFileSync('package.json',JSON.stringify(pkg,null,2)+'\n');" "$TARBALL"
- name: Refresh lockfile
if: steps.gate.outputs.run == 'true'
run: npm install --package-lock-only
- name: Write upstream version marker
if: steps.gate.outputs.run == 'true'
run: |
echo "${{ steps.upstream-version.outputs.version }}" > vendor/embedpdf/.upstream-version
- name: Create Pull Request
if: steps.gate.outputs.run == 'true'
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore: update embedpdf snippet'
title: 'Update vendored EmbedPDF snippet'
body: |
- Build snippet from upstream embed-pdf-viewer via `npm run build:snippet`
- Pack tarball into `vendor/embedpdf/` and point dependency to it
- Refresh package-lock.json
branch: chore/update-embedpdf-snippet
delete-branch: true

1
.gitignore vendored
View File

@@ -11,6 +11,7 @@ node_modules
dist
dist-ssr
*.local
.npm-cache
# Editor directories and files
.vscode/*

View File

@@ -6,6 +6,7 @@ ARG BASE_URL=
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
COPY vendor ./vendor
RUN npm ci
COPY . .

2641
package-lock.json generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -70,6 +70,7 @@
"terser": "^5.44.0",
"tesseract.js": "^6.0.1",
"tiff": "^7.1.2",
"utif": "^3.1.0"
"utif": "^3.1.0",
"embedpdf-snippet": "file:vendor/embedpdf/embedpdf-snippet-1.5.0.tgz"
}
}

View File

@@ -23,6 +23,11 @@ import * as pdfjsLib from 'pdfjs-dist';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();
const embedPdfWasmUrl = new URL(
'embedpdf-snippet/dist/pdfium.wasm',
import.meta.url
).href;
// Re-export rotation state utilities
export { getRotationState, updateRotationState, resetRotationState, initializeRotationState } from '../utils/rotation-state.js';
@@ -821,6 +826,40 @@ export function setupFileInputHandler(toolId) {
}
};
}
} else if (toolId === 'edit') {
const file = state.files[0];
if (!file) return;
const pdfWrapper = document.getElementById('embed-pdf-wrapper');
const pdfContainer = document.getElementById('embed-pdf-container');
if (!pdfContainer) return;
pdfContainer.textContent = ''; // Clear safely
if (state.currentPdfUrl) {
URL.revokeObjectURL(state.currentPdfUrl);
}
pdfWrapper.classList.remove('hidden');
const fileURL = URL.createObjectURL(file);
state.currentPdfUrl = fileURL;
const { default: EmbedPDF } = await import('embedpdf-snippet');
EmbedPDF.init({
type: 'container',
target: pdfContainer,
src: fileURL,
worker: true,
wasmUrl: embedPdfWasmUrl,
});
const backBtn = document.getElementById('back-to-grid');
const urlRevoker = () => {
URL.revokeObjectURL(fileURL);
state.currentPdfUrl = null;
backBtn.removeEventListener('click', urlRevoker);
};
backBtn.addEventListener('click', urlRevoker);
}
};

1
vendor/embedpdf/.upstream-version vendored Normal file
View File

@@ -0,0 +1 @@
1.5.0

View File

Binary file not shown.