Files
bert.hausmans f218ac6e69 fix(primevue): switch installer to named export to stop double-registration
main.ts explicitly calls installPrimeVue(app) AFTER registerPlugins(app)
per the comment in main.ts ("so PrimeVue lives outside the Vuexy @core
machine"). The intent was a single registration site outside the
auto-discovery loop.

Bug: registerPlugins (src/@core/utils/plugins.ts) globs
plugins/*/index.{ts,js} eagerly and invokes the `default` export of
each match. plugins/primevue/index.ts was exporting installPrimeVue
as the default, so registerPlugins also picked it up and called it.
End result: PrimeVue and its three services (Toast, Confirmation,
Dialog) were each registered twice on every app boot. Visible
symptoms: duplicate Toast emissions on a single Toast.add() call,
and ConfirmationService callbacks firing twice for one user
confirmation.

Fix: convert `export default function installPrimeVue` to a NAMED
export, and update main.ts's import to `{ installPrimeVue }`. The
registerPlugins glob still picks up the module path but the
`pluginImportModule.default?.(app)` invocation becomes a no-op via
optional chaining (no default export to call). main.ts remains the
single registration site.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:35:59 +02:00

47 lines
1.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// PrimeVue plugin installer. Registers PrimeVue with the Crewli Aura
// preset (theme.ts), the Dutch locale (primelocale/nl), and the three
// service modules (Toast, Confirmation, Dialog) the SPA mounts at
// App.vue top level.
//
// Per RFC-WS-FRONTEND-PRIMEVUE AD-2: darkModeSelector matches Vuexy's
// `.dark` class convention so existing skin-toggle plumbing continues
// to work during the F3F6 parallel-mode window.
//
// Exported as a NAMED function (no `export default`) on purpose: the
// Vuexy registerPlugins() helper (src/@core/utils/plugins.ts) globs
// plugins/*/index.{ts,js} and invokes the `default` export of each
// match. A default export here would cause PrimeVue + its three
// services to register twice — once via registerPlugins, once via the
// explicit installPrimeVue(app) call in main.ts. The named export
// keeps the explicit installer in main.ts as the single registration
// site, which is the design intent (decouple PrimeVue from the Vuexy
// @core machine so F6 can delete @core/ without affecting PrimeVue).
import type { App } from 'vue'
import PrimeVue from 'primevue/config'
import ConfirmationService from 'primevue/confirmationservice'
import DialogService from 'primevue/dialogservice'
import ToastService from 'primevue/toastservice'
import nl from 'primelocale/nl.json'
import { CrewliPreset } from './theme'
import { ptDefaults } from './defaults'
export function installPrimeVue(app: App) {
app.use(PrimeVue, {
theme: {
preset: CrewliPreset,
options: {
darkModeSelector: '.dark',
cssLayer: false,
},
},
locale: nl.nl,
pt: ptDefaults,
})
app.use(ToastService)
app.use(ConfirmationService)
app.use(DialogService)
}