2025-02-28 10:52:04 -05:00
|
|
|
import { readFile } from 'node:fs/promises'
|
2026-01-06 16:23:17 +02:00
|
|
|
import { dirname, resolve } from 'node:path'
|
|
|
|
|
import { fileURLToPath } from 'node:url'
|
2025-02-28 13:29:27 -05:00
|
|
|
import * as esbuild from 'esbuild'
|
2026-01-06 16:23:17 +02:00
|
|
|
import { build } from 'vite'
|
2026-06-02 22:14:13 +03:00
|
|
|
import { exactRegex } from '@rolldown/pluginutils'
|
2026-01-08 17:26:52 +02:00
|
|
|
|
2026-01-06 16:22:52 +02:00
|
|
|
import {
|
|
|
|
|
generateServiceWorkerMessages,
|
|
|
|
|
i18nFiles,
|
|
|
|
|
} from './service_worker_messages.js'
|
2025-02-28 10:52:04 -05:00
|
|
|
|
2025-02-28 13:29:27 -05:00
|
|
|
const getSWMessagesAsText = async () => {
|
|
|
|
|
const messages = await generateServiceWorkerMessages()
|
|
|
|
|
return `export default ${JSON.stringify(messages, undefined, 2)}`
|
|
|
|
|
}
|
2025-02-28 10:52:04 -05:00
|
|
|
const projectRoot = dirname(dirname(fileURLToPath(import.meta.url)))
|
|
|
|
|
|
2025-03-04 18:39:20 -05:00
|
|
|
const getDevSwEnv = () => `self.serviceWorkerOption = { assets: [] };`
|
2026-01-06 16:22:52 +02:00
|
|
|
const getProdSwEnv = ({ assets }) =>
|
|
|
|
|
`self.serviceWorkerOption = { assets: ${JSON.stringify(assets)} };`
|
2025-03-04 18:39:20 -05:00
|
|
|
|
2026-06-02 23:01:39 +03:00
|
|
|
export const devSwPlugin = ({ swSrc, swDest }) => {
|
2025-02-28 13:29:27 -05:00
|
|
|
const swFullSrc = resolve(projectRoot, swSrc)
|
|
|
|
|
|
2025-02-28 10:52:04 -05:00
|
|
|
return {
|
2026-06-02 23:01:39 +03:00
|
|
|
name: 'dev-sw-plugin', apply: 'serve',
|
2026-01-06 17:32:22 +02:00
|
|
|
configResolved() {
|
|
|
|
|
/* no-op */
|
|
|
|
|
},
|
2026-01-06 16:22:52 +02:00
|
|
|
resolveId(id) {
|
2025-02-28 10:52:04 -05:00
|
|
|
const name = id.startsWith('/') ? id.slice(1) : id
|
|
|
|
|
if (name === swDest) {
|
2025-02-28 13:29:27 -05:00
|
|
|
return swFullSrc
|
2025-02-28 10:52:04 -05:00
|
|
|
}
|
|
|
|
|
return null
|
|
|
|
|
},
|
2026-01-06 16:22:52 +02:00
|
|
|
async load(id) {
|
2025-02-28 13:29:27 -05:00
|
|
|
if (id === swFullSrc) {
|
|
|
|
|
return readFile(swFullSrc, 'utf-8')
|
2025-02-28 10:52:04 -05:00
|
|
|
}
|
|
|
|
|
return null
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const swMessagesPlugin = () => {
|
2026-06-02 22:14:13 +03:00
|
|
|
const swMessagesName = 'virtual:pleroma-fe/service_worker_messages'
|
|
|
|
|
const swMessagesNameResolved = '\0' + swMessagesName
|
|
|
|
|
|
2025-02-28 10:52:04 -05:00
|
|
|
return {
|
|
|
|
|
name: 'sw-messages-plugin',
|
2026-06-02 22:14:13 +03:00
|
|
|
resolveId: {
|
|
|
|
|
filter: { id: exactRegex(swMessagesName) },
|
|
|
|
|
handler() {
|
2025-02-28 10:52:04 -05:00
|
|
|
return swMessagesNameResolved
|
|
|
|
|
}
|
|
|
|
|
},
|
2026-06-02 22:14:13 +03:00
|
|
|
load: {
|
|
|
|
|
filter: { id: exactRegex(swMessagesNameResolved) },
|
|
|
|
|
async handler () {
|
2025-02-28 13:29:27 -05:00
|
|
|
return await getSWMessagesAsText()
|
2025-02-28 10:52:04 -05:00
|
|
|
}
|
2026-01-06 16:22:52 +02:00
|
|
|
},
|
2025-02-28 10:52:04 -05:00
|
|
|
}
|
|
|
|
|
}
|