Files
InvoiceShelf/resources/scripts/InvoiceShelf.ts
Darko Gjorgjijoski 71388ec6a5 Rename resources/scripts-v2 to resources/scripts and drop @v2 alias
Now that the legacy v1 frontend (commit 064bdf53) is gone, the v2 directory is the only frontend and the v2 suffix is just noise. Renames resources/scripts-v2 to resources/scripts via git mv (so git records the move as renames, preserving blame and log --follow), then bulk-rewrites the 152 files that imported via @v2/... to use @/scripts/... instead. The existing @ alias (resources/) covers the new path with no extra config needed.

Drops the now-unused @v2 alias from vite.config.js and points the laravel-vite-plugin entry at resources/scripts/main.ts. Updates the only blade reference (resources/views/app.blade.php) to match. The package.json test script (eslint ./resources/scripts) automatically targets the right place after the rename without any edit.

Verified: npm run build exits clean and the Vite warning lines now reference resources/scripts/plugins/i18n.ts, confirming every import resolved through the new path. git log --follow on any moved file walks back through its scripts-v2 history.
2026-04-07 12:50:16 +02:00

101 lines
2.6 KiB
TypeScript

import { createApp } from 'vue'
import type { App } from 'vue'
import type { Router } from 'vue-router'
import App_ from './App.vue'
import router from './router'
import { createAppI18n, setI18nLanguage } from './plugins/i18n'
import type { AppI18n } from './plugins/i18n'
import { createAppPinia } from './plugins/pinia'
import { installTooltipDirective } from './plugins/tooltip'
import { defineGlobalComponents } from './global-components'
/**
* Callback signature for the `booting` hook.
* Receives the Vue app instance and the router so that modules /
* plugins can register additional routes, components, or providers.
*/
type BootCallback = (app: App, router: Router) => void
/**
* Bootstrap class for InvoiceShelf.
*
* External code (e.g. dynamically loaded modules) can call
* `window.InvoiceShelf.booting(callback)` to hook into the app
* before it mounts.
*
* Call `start()` to install all plugins, execute boot callbacks,
* and mount the application.
*/
export default class InvoiceShelf {
private bootingCallbacks: BootCallback[] = []
private messages: Record<string, Record<string, unknown>> = {}
private i18n: AppI18n | null = null
private app: App
constructor() {
this.app = createApp(App_)
}
/**
* Register a callback that will be invoked before the app mounts.
*/
booting(callback: BootCallback): void {
this.bootingCallbacks.push(callback)
}
/**
* Merge additional i18n message bundles (typically from modules).
*/
addMessages(moduleMessages: Record<string, Record<string, unknown>>): void {
for (const [locale, msgs] of Object.entries(moduleMessages)) {
this.messages[locale] = {
...this.messages[locale],
...msgs,
}
}
}
/**
* Dynamically load and activate a language.
*/
async loadLanguage(locale: string): Promise<void> {
if (this.i18n) {
await setI18nLanguage(this.i18n, locale)
}
}
/**
* Execute all registered boot callbacks, install plugins,
* and mount the app to `document.body`.
*/
start(): void {
// Execute boot callbacks so modules can register routes / components
this.executeCallbacks()
// Register global components
defineGlobalComponents(this.app)
// i18n
this.i18n = createAppI18n(this.messages)
// Install plugins
this.app.use(router)
this.app.use(this.i18n)
this.app.use(createAppPinia())
// Directives
installTooltipDirective(this.app)
// Mount
this.app.mount('body')
}
// ---- private ----
private executeCallbacks(): void {
for (const callback of this.bootingCallbacks) {
callback(this.app, router)
}
}
}