KimuApp โ
The main application class that acts as the central coordinator and entry point for the KIMU framework. KimuApp follows the Singleton pattern to ensure a single instance manages the entire application.
Overview โ
KimuApp is responsible for:
- Application initialization and configuration
- Extension loading and lifecycle management
- Global state coordination between components
- Asset management and resource loading
- Framework bootstrap and startup sequence
Class Definition โ
export class KimuApp {
private static instance: KimuApp;
private isInitialized: boolean = false;
private extensions: Map<string, any> = new Map();
private config: AppConfig = {};
private constructor() {
// Private constructor for Singleton pattern
}
public static getInstance(): KimuApp {
if (!KimuApp.instance) {
KimuApp.instance = new KimuApp();
}
return KimuApp.instance;
}
}Main Methods โ
getInstance() โ
Static method to get the singleton instance of KimuApp.
const app = KimuApp.getInstance();Returns: KimuApp - The unique application instance
initialize(config?: AppConfig) โ
Initializes the application with the provided configuration.
interface AppConfig {
debug?: boolean;
theme?: 'light' | 'dark' | 'auto';
language?: string;
apiUrl?: string;
extensions?: string[];
}
const app = KimuApp.getInstance();
await app.initialize({
debug: true,
theme: 'dark',
language: 'en',
extensions: ['kimu-home', 'notification-manager']
});Parameters:
config(optional): Application configuration
Returns: Promise<void>
loadExtension(extensionName: string) โ
Loads a specific extension into the application.
const app = KimuApp.getInstance();
await app.loadExtension('my-extension');Parameters:
extensionName: Name of the extension to load
Returns: Promise<boolean> - true if successfully loaded
getExtension(name: string) โ
Gets a loaded extension instance.
const extension = app.getExtension('notification-manager');
if (extension) {
extension.showNotification('Hello World!');
}Parameters:
name: Extension name
Returns: any | undefined - Extension instance or undefined
setConfig(key: string, value: any) โ
Sets a global configuration value.
app.setConfig('theme', 'dark');
app.setConfig('debug', true);Parameters:
key: Configuration keyvalue: Configuration value
getConfig(key: string) โ
Gets a global configuration value.
const theme = app.getConfig('theme'); // 'dark'
const isDebug = app.getConfig('debug'); // trueParameters:
key: Configuration key
Returns: any - Configuration value
Practical Usage โ
Basic Application Setup โ
import { KimuApp } from './core/kimu-app';
// Get application instance
const app = KimuApp.getInstance();
// Initialize with configuration
await app.initialize({
debug: process.env.NODE_ENV === 'development',
theme: 'auto',
language: navigator.language.split('-')[0],
apiUrl: 'https://api.example.com'
});
// Load essential extensions
await app.loadExtension('kimu-home');
await app.loadExtension('ui-components');
console.log('Application initialized successfully');Extension Loading with Error Handling โ
async function setupApplication() {
const app = KimuApp.getInstance();
try {
await app.initialize({
extensions: ['kimu-home', 'data-manager', 'ui-toolkit']
});
console.log('All extensions loaded successfully');
} catch (error) {
console.error('Error during application setup:', error);
// Fallback loading
await app.loadExtension('kimu-home'); // Load minimum
}
}Configuration Management โ
const app = KimuApp.getInstance();
// Dynamic theme switching
function switchTheme(newTheme: 'light' | 'dark') {
app.setConfig('theme', newTheme);
// Notify all components
document.dispatchEvent(new CustomEvent('theme-changed', {
detail: { theme: newTheme }
}));
}
// Language switching
function setLanguage(lang: string) {
app.setConfig('language', lang);
// Reload language-dependent extensions
const i18nExtension = app.getExtension('i18n-manager');
if (i18nExtension) {
i18nExtension.loadLanguage(lang);
}
}Extension Communication โ
// Extension A
class ExtensionA {
sendMessage(data: any) {
const app = KimuApp.getInstance();
const extensionB = app.getExtension('extension-b');
if (extensionB) {
extensionB.receiveMessage(data);
}
}
}
// Extension B
class ExtensionB {
receiveMessage(data: any) {
console.log('Received message:', data);
}
}Integration with Other Components โ
With KimuStore โ
import { KimuApp } from './core/kimu-app';
import { KimuStore } from './core/kimu-store';
const app = KimuApp.getInstance();
const store = KimuStore.getInstance();
// Sync app config with store
app.setConfig('user', { name: 'John', role: 'admin' });
store.setState('appConfig', app.getConfig());With KimuExtensionManager โ
import { KimuExtensionManager } from './core/kimu-extension-manager';
const app = KimuApp.getInstance();
const extensionManager = KimuExtensionManager.getInstance();
// Load extensions through the manager
await extensionManager.loadAllExtensions();
// Get loaded extensions in the app
const loadedExtensions = extensionManager.getLoadedExtensions();
loadedExtensions.forEach(ext => {
app.extensions.set(ext.tag, ext.instance);
});Events โ
KimuApp emits custom events during its lifecycle:
kimu:app-initialized โ
Emitted when the application has been successfully initialized.
document.addEventListener('kimu:app-initialized', (event) => {
console.log('KIMU app is ready:', event.detail);
});kimu:extension-loaded โ
Emitted when an extension is successfully loaded.
document.addEventListener('kimu:extension-loaded', (event) => {
const { extensionName, timestamp } = event.detail;
console.log(`Extension ${extensionName} loaded at ${timestamp}`);
});kimu:config-changed โ
Emitted when configuration changes.
document.addEventListener('kimu:config-changed', (event) => {
const { key, value, oldValue } = event.detail;
console.log(`Config ${key} changed from ${oldValue} to ${value}`);
});Error Handling โ
class KimuApp {
private handleError(context: string, error: Error): void {
console.error(`[KimuApp] ${context}:`, error);
// Emit error event
document.dispatchEvent(new CustomEvent('kimu:app-error', {
detail: { context, error: error.message, timestamp: Date.now() }
}));
// Send to error reporting service
if (this.getConfig('errorReporting')) {
this.reportError(context, error);
}
}
private reportError(context: string, error: Error): void {
// Implementation for error reporting
fetch('/api/errors', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
context,
message: error.message,
stack: error.stack,
userAgent: navigator.userAgent,
timestamp: Date.now()
})
});
}
}Best Practices โ
1. Initialization Order โ
// โ
Good - Proper initialization order
async function initializeApp() {
const app = KimuApp.getInstance();
// 1. Basic configuration
await app.initialize(baseConfig);
// 2. Load core extensions first
await app.loadExtension('kimu-home');
// 3. Load dependent extensions
await app.loadExtension('ui-components');
await app.loadExtension('data-manager');
// 4. Start application
app.start();
}2. Configuration Management โ
// โ
Good - Centralized configuration
const defaultConfig = {
debug: false,
theme: 'light',
language: 'en',
apiUrl: process.env.VITE_API_URL || 'http://localhost:3000'
};
const userConfig = loadUserPreferences();
const finalConfig = { ...defaultConfig, ...userConfig };
await app.initialize(finalConfig);3. Extension Dependencies โ
// โ
Good - Handle extension dependencies
async function loadExtensionWithDependencies(extensionName: string) {
const app = KimuApp.getInstance();
// Check dependencies first
const dependencies = getExtensionDependencies(extensionName);
for (const dep of dependencies) {
if (!app.getExtension(dep)) {
await app.loadExtension(dep);
}
}
// Load main extension
await app.loadExtension(extensionName);
}Common Patterns โ
Application Startup โ
// main.ts
import { KimuApp } from './core/kimu-app';
async function main() {
const app = KimuApp.getInstance();
try {
// Initialize with environment-specific config
const config = await loadConfig();
await app.initialize(config);
// Load extensions based on configuration
const extensions = config.extensions || ['kimu-home'];
for (const ext of extensions) {
await app.loadExtension(ext);
}
console.log('๐ KIMU application started successfully');
} catch (error) {
console.error('โ Failed to start KIMU application:', error);
// Fallback or error page
}
}
main();Plugin Architecture โ
interface Plugin {
name: string;
version: string;
initialize(app: KimuApp): Promise<void>;
destroy(): Promise<void>;
}
class PluginManager {
private plugins: Map<string, Plugin> = new Map();
async registerPlugin(plugin: Plugin) {
const app = KimuApp.getInstance();
await plugin.initialize(app);
this.plugins.set(plugin.name, plugin);
}
}References โ
- KimuExtensionManager - Extension loading and management
- KimuStore - Global state management
- KimuEngine - Rendering engine
- Singleton Pattern - Architectural pattern
- Extension System - Extension development guide