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>
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
// 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 F3–F6 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)
|
||
}
|