d5544a7731
Replace the client-side PDF.js viewer with server-side rendering using PyMuPDF. This avoids CSP worker restrictions and ES private field access issues that affected Chromium browsers. Changes: - Add /api/v1/pdf-preview endpoint to MCP server (management.py) - Add pdf-preview route and controller action in Astrolabe PHP backend - Refactor PDFViewer.vue to display server-rendered PNG images - Remove pdfjs-dist dependency and client-side PDF loading code - Use @nextcloud/axios for CSRF token handling in PDFViewer The server downloads the PDF via WebDAV, renders the requested page with PyMuPDF at the specified scale, and returns a base64-encoded PNG image. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
44 lines
1.5 KiB
JavaScript
44 lines
1.5 KiB
JavaScript
import { defineConfig } from 'vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
import { resolve } from 'path'
|
|
import { readFileSync } from 'fs'
|
|
|
|
// Read app info from info.xml for @nextcloud/vue
|
|
const infoXml = readFileSync(resolve(__dirname, 'appinfo/info.xml'), 'utf-8')
|
|
const appName = infoXml.match(/<id>([^<]+)<\/id>/)?.[1] || 'astrolabe'
|
|
const appVersion = infoXml.match(/<version>([^<]+)<\/version>/)?.[1] || ''
|
|
|
|
export default defineConfig({
|
|
plugins: [vue()],
|
|
define: {
|
|
appName: JSON.stringify(appName),
|
|
appVersion: JSON.stringify(appVersion),
|
|
},
|
|
build: {
|
|
outDir: '.',
|
|
emptyOutDir: false,
|
|
cssCodeSplit: false, // Bundle all CSS into entry points (Nextcloud doesn't load CSS chunks)
|
|
rollupOptions: {
|
|
input: {
|
|
'astrolabe-main': resolve(__dirname, 'src/main.js'),
|
|
'astrolabe-adminSettings': resolve(__dirname, 'src/adminSettings.js'),
|
|
'astrolabe-personalSettings': resolve(__dirname, 'src/personalSettings.js'),
|
|
},
|
|
output: {
|
|
entryFileNames: 'js/[name].mjs',
|
|
chunkFileNames: 'js/[name]-[hash].chunk.mjs',
|
|
assetFileNames: (assetInfo) => {
|
|
// With cssCodeSplit:false, all CSS goes to a single file
|
|
// Name it astrolabe-main.css to match Nextcloud's Util::addStyle expectation
|
|
if (assetInfo.name && assetInfo.name.endsWith('.css')) {
|
|
return 'css/astrolabe-main.css';
|
|
}
|
|
return 'js/[name][extname]';
|
|
},
|
|
},
|
|
},
|
|
sourcemap: true,
|
|
minify: 'terser',
|
|
},
|
|
})
|