diff --git a/vite-branding.ts b/vite-branding.ts index abcb841..4480f15 100644 --- a/vite-branding.ts +++ b/vite-branding.ts @@ -1,5 +1,7 @@ +import { spawnSync } from 'node:child_process' import { readFileSync } from 'node:fs' import { resolve } from 'node:path' +import type { Plugin } from 'vite' /** * Absolute path to the active brand kit. Deployers point this at their @@ -51,3 +53,28 @@ export const brandAlias = { export function brandManifestName(appLabel?: string): string { return appLabel ? `${brand.name} ${appLabel}` : brand.name } + +/** + * Vite plugin: regenerate PWA icons under public/icons/ once per build + * / dev-server start, so vite..config.ts's includeAssets + + * manifest.icons always have something to include. Source resolution + * lives in pwa-assets.config.ts. + */ +export function brandAssetsPlugin(): Plugin { + let generated = false + return { + name: 'brand-assets-generator', + buildStart() { + if (generated) return + const { status } = spawnSync( + 'node', + [resolve('scripts/generate-pwa-assets.mjs')], + { stdio: 'inherit' }, + ) + if (status !== 0) { + throw new Error('pwa-assets-generator failed; see output above') + } + generated = true + }, + } +} diff --git a/vite.chat.config.ts b/vite.chat.config.ts index f2f9fcf..afa3416 100644 --- a/vite.chat.config.ts +++ b/vite.chat.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' function chatHtmlPlugin(): Plugin { return { @@ -46,6 +46,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), chatHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.config.ts b/vite.config.ts index 68cc1aa..6363a0b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,7 +5,7 @@ import { defineConfig } from 'vite' import Inspect from 'vite-plugin-inspect' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' // https://vite.dev/config/ // @@ -26,6 +26,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), vue(), tailwindcss(), Inspect(), diff --git a/vite.events.config.ts b/vite.events.config.ts index 3f623a6..9882456 100644 --- a/vite.events.config.ts +++ b/vite.events.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias, brandManifestName } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin, brandManifestName } from './vite-branding' /** * Plugin to rewrite dev server requests to events.html @@ -58,6 +58,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), eventsHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.forum.config.ts b/vite.forum.config.ts index e6e9ade..3dcc6e4 100644 --- a/vite.forum.config.ts +++ b/vite.forum.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' function forumHtmlPlugin(): Plugin { return { @@ -46,6 +46,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), forumHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.libra.config.ts b/vite.libra.config.ts index 77c2aee..8fb1ca5 100644 --- a/vite.libra.config.ts +++ b/vite.libra.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' /** * Plugin to rewrite dev server requests to libra.html @@ -51,6 +51,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), libraHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.market.config.ts b/vite.market.config.ts index 1dccddc..01d22b6 100644 --- a/vite.market.config.ts +++ b/vite.market.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' function marketHtmlPlugin(): Plugin { return { @@ -46,6 +46,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), marketHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.restaurant.config.ts b/vite.restaurant.config.ts index c2e35e1..23f27ef 100644 --- a/vite.restaurant.config.ts +++ b/vite.restaurant.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' function restaurantHtmlPlugin(): Plugin { return { @@ -51,6 +51,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), restaurantHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.tasks.config.ts b/vite.tasks.config.ts index 4386138..e903844 100644 --- a/vite.tasks.config.ts +++ b/vite.tasks.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' function tasksHtmlPlugin(): Plugin { return { @@ -46,6 +46,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), tasksHtmlPlugin(), vue(), tailwindcss(), diff --git a/vite.wallet.config.ts b/vite.wallet.config.ts index 7931e79..cc9fc9a 100644 --- a/vite.wallet.config.ts +++ b/vite.wallet.config.ts @@ -5,7 +5,7 @@ import { defineConfig, type Plugin } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' import { visualizer } from 'rollup-plugin-visualizer' -import { brand, brandAlias } from './vite-branding' +import { brand, brandAlias, brandAssetsPlugin } from './vite-branding' /** * Plugin to rewrite dev server requests to wallet.html @@ -50,6 +50,7 @@ export default defineConfig(({ mode }) => ({ strictPort: true, }, plugins: [ + brandAssetsPlugin(), walletHtmlPlugin(), vue(), tailwindcss(),