import { createRequire } from 'node:module' import { readFileSync, readdirSync } from 'node:fs' import path from 'node:path' import { transformWithEsbuild } from 'vite' import { installCryptoRandomUUID } from '../../src/utils/cryptoRandomUUID.js' const moduleId = 'virtual:superdoc-http-worker-url' const resolvedId = '\0' + moduleId // 为 SuperDoc 官方 Worker 添加 HTTP 下的 UUID 兼容入口。 // emitFile 按最终内容生成 hash,发布后不会复用旧 Worker 的浏览器缓存。 export default function superdocHttpWorker() { let base let building let source const route = '__superdoc_http_worker.js' return { name: 'superdoc-http-worker', configResolved(config) { base = config.base building = config.command === 'build' const require = createRequire(import.meta.url) const assetDir = path.join(path.dirname(require.resolve('@superdoc/docx-engine/package.json')), 'dist/assets') const entries = readdirSync(assetDir).filter(name => /^dom-worker-entry-.*\.js$/.test(name)) if (entries.length !== 1) throw new Error('无法确定 SuperDoc 文档 Worker,请检查依赖版本') source = `;(${installCryptoRandomUUID.toString()})();\n` + readFileSync(path.join(assetDir, entries[0]), 'utf8') }, resolveId(id) { if (id === moduleId) return resolvedId }, async load(id) { if (id !== resolvedId) return if (!building) return `export default ${JSON.stringify(base + route)}` const minified = await transformWithEsbuild(source, 'superdoc-http-worker.js', { minify: true, legalComments: 'inline' }) const reference = this.emitFile({ type: 'asset', name: 'superdoc-http-worker.js', source: minified.code }) return `export default import.meta.ROLLUP_FILE_URL_${reference}` }, configureServer(server) { server.middlewares.use((req, res, next) => { if (req.url?.split('?')[0] !== base + route) return next() res.setHeader('Content-Type', 'text/javascript; charset=utf-8') res.setHeader('Cache-Control', 'no-cache') res.end(source) }) } } }