@rb-games/core 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-DOHQE2YZ.js → chunk-C45KDREE.js} +46 -50
- package/dist/chunk-C45KDREE.js.map +1 -0
- package/dist/{chunk-RAEOBW6E.js → chunk-P4GCINNA.js} +3 -3
- package/dist/{chunk-RAEOBW6E.js.map → chunk-P4GCINNA.js.map} +1 -1
- package/dist/{chunk-YSLGJAV6.js → chunk-XHUPUPPW.js} +3 -5
- package/dist/chunk-XHUPUPPW.js.map +1 -0
- package/dist/engine/index.js +5 -6
- package/dist/engine/index.js.map +1 -1
- package/dist/helpers/index.js +4 -4
- package/dist/helpers/index.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/particle/index.js +109 -476
- package/dist/particle/index.js.map +1 -1
- package/dist/plugins/index.js +157 -202
- package/dist/plugins/index.js.map +1 -1
- package/dist/state-machine/index.js +7 -9
- package/dist/state-machine/index.js.map +1 -1
- package/dist/store/index.js +3 -4
- package/dist/store/index.js.map +1 -1
- package/dist/ui/components/Skinable.d.ts.map +1 -1
- package/dist/ui/index.js +142 -191
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-DOHQE2YZ.js.map +0 -1
- package/dist/chunk-YSLGJAV6.js.map +0 -1
|
@@ -8,56 +8,54 @@ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
|
8
8
|
return LogLevel2;
|
|
9
9
|
})(LogLevel || {});
|
|
10
10
|
var Logger = class _Logger {
|
|
11
|
-
static instance;
|
|
12
|
-
config;
|
|
13
|
-
// Terminal colors (for Node.js environment)
|
|
14
|
-
terminalColors = {
|
|
15
|
-
reset: "\x1B[0m",
|
|
16
|
-
red: "\x1B[31m",
|
|
17
|
-
yellow: "\x1B[33m",
|
|
18
|
-
blue: "\x1B[34m",
|
|
19
|
-
green: "\x1B[32m",
|
|
20
|
-
gray: "\x1B[90m",
|
|
21
|
-
cyan: "\x1B[36m",
|
|
22
|
-
magenta: "\x1B[35m",
|
|
23
|
-
white: "\x1B[37m"
|
|
24
|
-
};
|
|
25
|
-
// Browser console colors (using CSS)
|
|
26
|
-
browserColors = {
|
|
27
|
-
timestamp: "color: gray",
|
|
28
|
-
context: "color: cyan; font-weight: bold",
|
|
29
|
-
message: "color: white",
|
|
30
|
-
error: "color: red; font-weight: bold",
|
|
31
|
-
warn: "color: orange; font-weight: bold",
|
|
32
|
-
info: "color: dodgerblue; font-weight: bold",
|
|
33
|
-
debug: "color: green",
|
|
34
|
-
trace: "color: gray"
|
|
35
|
-
};
|
|
36
|
-
levelLabels = {
|
|
37
|
-
[0 /* ERROR */]: "ERROR",
|
|
38
|
-
[1 /* WARN */]: "WARN",
|
|
39
|
-
[2 /* INFO */]: "INFO",
|
|
40
|
-
[3 /* DEBUG */]: "DEBUG",
|
|
41
|
-
[4 /* TRACE */]: "TRACE"
|
|
42
|
-
};
|
|
43
|
-
levelColors = {
|
|
44
|
-
[0 /* ERROR */]: this.terminalColors.red,
|
|
45
|
-
[1 /* WARN */]: this.terminalColors.yellow,
|
|
46
|
-
[2 /* INFO */]: this.terminalColors.blue,
|
|
47
|
-
[3 /* DEBUG */]: this.terminalColors.green,
|
|
48
|
-
[4 /* TRACE */]: this.terminalColors.gray
|
|
49
|
-
};
|
|
50
|
-
levelBrowserColors = {
|
|
51
|
-
[0 /* ERROR */]: this.browserColors.error,
|
|
52
|
-
[1 /* WARN */]: this.browserColors.warn,
|
|
53
|
-
[2 /* INFO */]: this.browserColors.info,
|
|
54
|
-
[3 /* DEBUG */]: this.browserColors.debug,
|
|
55
|
-
[4 /* TRACE */]: this.browserColors.trace
|
|
56
|
-
};
|
|
57
11
|
/**
|
|
58
12
|
* Private constructor for singleton pattern
|
|
59
13
|
*/
|
|
60
14
|
constructor() {
|
|
15
|
+
// Terminal colors (for Node.js environment)
|
|
16
|
+
this.terminalColors = {
|
|
17
|
+
reset: "\x1B[0m",
|
|
18
|
+
red: "\x1B[31m",
|
|
19
|
+
yellow: "\x1B[33m",
|
|
20
|
+
blue: "\x1B[34m",
|
|
21
|
+
green: "\x1B[32m",
|
|
22
|
+
gray: "\x1B[90m",
|
|
23
|
+
cyan: "\x1B[36m",
|
|
24
|
+
magenta: "\x1B[35m",
|
|
25
|
+
white: "\x1B[37m"
|
|
26
|
+
};
|
|
27
|
+
// Browser console colors (using CSS)
|
|
28
|
+
this.browserColors = {
|
|
29
|
+
timestamp: "color: gray",
|
|
30
|
+
context: "color: cyan; font-weight: bold",
|
|
31
|
+
message: "color: white",
|
|
32
|
+
error: "color: red; font-weight: bold",
|
|
33
|
+
warn: "color: orange; font-weight: bold",
|
|
34
|
+
info: "color: dodgerblue; font-weight: bold",
|
|
35
|
+
debug: "color: green",
|
|
36
|
+
trace: "color: gray"
|
|
37
|
+
};
|
|
38
|
+
this.levelLabels = {
|
|
39
|
+
[0 /* ERROR */]: "ERROR",
|
|
40
|
+
[1 /* WARN */]: "WARN",
|
|
41
|
+
[2 /* INFO */]: "INFO",
|
|
42
|
+
[3 /* DEBUG */]: "DEBUG",
|
|
43
|
+
[4 /* TRACE */]: "TRACE"
|
|
44
|
+
};
|
|
45
|
+
this.levelColors = {
|
|
46
|
+
[0 /* ERROR */]: this.terminalColors.red,
|
|
47
|
+
[1 /* WARN */]: this.terminalColors.yellow,
|
|
48
|
+
[2 /* INFO */]: this.terminalColors.blue,
|
|
49
|
+
[3 /* DEBUG */]: this.terminalColors.green,
|
|
50
|
+
[4 /* TRACE */]: this.terminalColors.gray
|
|
51
|
+
};
|
|
52
|
+
this.levelBrowserColors = {
|
|
53
|
+
[0 /* ERROR */]: this.browserColors.error,
|
|
54
|
+
[1 /* WARN */]: this.browserColors.warn,
|
|
55
|
+
[2 /* INFO */]: this.browserColors.info,
|
|
56
|
+
[3 /* DEBUG */]: this.browserColors.debug,
|
|
57
|
+
[4 /* TRACE */]: this.browserColors.trace
|
|
58
|
+
};
|
|
61
59
|
var _a;
|
|
62
60
|
this.config = {
|
|
63
61
|
level: 3 /* DEBUG */,
|
|
@@ -329,8 +327,6 @@ var Logger = class _Logger {
|
|
|
329
327
|
}
|
|
330
328
|
};
|
|
331
329
|
var ContextLogger = class {
|
|
332
|
-
logger;
|
|
333
|
-
context;
|
|
334
330
|
constructor(logger2, context) {
|
|
335
331
|
this.logger = logger2;
|
|
336
332
|
this.context = context;
|
|
@@ -388,5 +384,5 @@ function getLogger(context) {
|
|
|
388
384
|
}
|
|
389
385
|
|
|
390
386
|
export { ContextLogger, LogLevel, Logger, getLogger, logger };
|
|
391
|
-
//# sourceMappingURL=chunk-
|
|
392
|
-
//# sourceMappingURL=chunk-
|
|
387
|
+
//# sourceMappingURL=chunk-C45KDREE.js.map
|
|
388
|
+
//# sourceMappingURL=chunk-C45KDREE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils/Logger.ts"],"names":["LogLevel","logger"],"mappings":"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","file":"chunk-C45KDREE.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Log levels for filtering log output.\n *\n * Lower numeric values have higher priority.\n * Setting a log level will show that level and all higher priority levels.\n *\n * @example\n * ```typescript\n * // Set to INFO level\n * logger.setLevel(LogLevel.INFO);\n * // Will show: ERROR, WARN, INFO\n * // Will hide: DEBUG, TRACE\n * ```\n *\n * @public\n */\nexport enum LogLevel {\n /** Critical errors (always shown) */\n ERROR = 0,\n /** Warnings (shown at WARN level and above) */\n WARN = 1,\n /** Informational messages (shown at INFO level and above) */\n INFO = 2,\n /** Debug messages (shown at DEBUG level and above) */\n DEBUG = 3,\n /** Trace messages (most verbose, shown only at TRACE level) */\n TRACE = 4,\n}\n\nexport type LoggerFilterMatcher = string | RegExp;\n\nexport interface LoggerFilterConfig {\n contexts?: LoggerFilterMatcher[];\n messages?: LoggerFilterMatcher[];\n mode?: 'include' | 'exclude';\n}\n\n/**\n * Configuration options for the Logger.\n *\n * @public\n */\nexport interface LoggerConfig {\n /** Minimum log level to display */\n level: LogLevel;\n /** Whether logging is enabled */\n enabled: boolean;\n /** Whether to show timestamps in logs */\n showTimestamp: boolean;\n /** Whether to show colors in logs */\n showColors: boolean;\n filter?: LoggerFilterConfig;\n}\n\n/**\n * Singleton logger for centralized logging.\n *\n * Logger provides a unified logging system with:\n * - Multiple log levels (ERROR, WARN, INFO, DEBUG, TRACE)\n * - Colored output (browser and terminal)\n * - Timestamps\n * - Context-based sub-loggers\n * - Environment detection (browser vs Node.js)\n *\n * ## Features\n *\n * - **Singleton Pattern**: Single instance across the application\n * - **Log Levels**: Filter logs by severity\n * - **Colored Output**: CSS colors in browser, ANSI colors in terminal\n * - **Context Loggers**: Create sub-loggers with context prefixes\n * - **Timestamps**: Optional ISO timestamp display\n * - **Environment Aware**: Automatically detects browser vs Node.js\n *\n * ## Log Levels\n *\n * - **ERROR** (0): Critical errors\n * - **WARN** (1): Warnings\n * - **INFO** (2): Informational messages (default)\n * - **DEBUG** (3): Debug information\n * - **TRACE** (4): Detailed trace information\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { logger, LogLevel } from '@rb-games/core/utils';\n *\n * // Configure logger\n * logger.configure({\n * level: LogLevel.DEBUG,\n * showTimestamp: true,\n * showColors: true\n * });\n *\n * // Log messages\n * logger.error('Critical error occurred');\n * logger.warn('This is a warning');\n * logger.info('Application started');\n * logger.debug('Debug information', { data: 'value' });\n * logger.trace('Detailed trace');\n * ```\n *\n * @example\n * Context loggers (used in plugins):\n * ```typescript\n * class MyPlugin {\n * private logger = logger.createContextLogger('MyPlugin');\n *\n * initialize() {\n * this.logger.info('Plugin initialized');\n * // Output: [2024-01-01T12:00:00.000Z] [INFO] [MyPlugin] Plugin initialized\n * }\n *\n * doSomething() {\n * this.logger.debug('Doing something', { value: 42 });\n * // Output: [2024-01-01T12:00:00.000Z] [DEBUG] [MyPlugin] Doing something { value: 42 }\n * }\n * }\n * ```\n *\n * @example\n * Production configuration:\n * ```typescript\n * // In production, only show errors and warnings\n * if (process.env.NODE_ENV === 'production') {\n * logger.setLevel(LogLevel.WARN);\n * } else {\n * logger.setLevel(LogLevel.DEBUG);\n * }\n * ```\n *\n * @example\n * Disable logging:\n * ```typescript\n * logger.setEnabled(false);\n * ```\n *\n * @category Utils\n * @public\n */\nexport class Logger {\n private static instance: Logger;\n private config: LoggerConfig;\n\n // Terminal colors (for Node.js environment)\n private readonly terminalColors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n green: '\\x1b[32m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n white: '\\x1b[37m',\n };\n\n // Browser console colors (using CSS)\n private readonly browserColors = {\n timestamp: 'color: gray',\n context: 'color: cyan; font-weight: bold',\n message: 'color: white',\n error: 'color: red; font-weight: bold',\n warn: 'color: orange; font-weight: bold',\n info: 'color: dodgerblue; font-weight: bold',\n debug: 'color: green',\n trace: 'color: gray',\n };\n\n private readonly levelLabels = {\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.TRACE]: 'TRACE',\n };\n\n private readonly levelColors = {\n [LogLevel.ERROR]: this.terminalColors.red,\n [LogLevel.WARN]: this.terminalColors.yellow,\n [LogLevel.INFO]: this.terminalColors.blue,\n [LogLevel.DEBUG]: this.terminalColors.green,\n [LogLevel.TRACE]: this.terminalColors.gray,\n };\n\n private readonly levelBrowserColors = {\n [LogLevel.ERROR]: this.browserColors.error,\n [LogLevel.WARN]: this.browserColors.warn,\n [LogLevel.INFO]: this.browserColors.info,\n [LogLevel.DEBUG]: this.browserColors.debug,\n [LogLevel.TRACE]: this.browserColors.trace,\n };\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Default configuration\n this.config = {\n level: LogLevel.DEBUG, // Default log level\n enabled: true, // Logging enabled by default\n showTimestamp: false, // Show timestamps by default\n showColors: true, // Show colors by default\n };\n\n if ((import.meta as { env?: { DEV?: boolean } }).env?.DEV) {\n console.warn(\n '[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\\n' +\n 'DevTools → Settings (F1) → Ignore List → Add pattern: /Logger\\\\.ts$',\n );\n }\n }\n\n /**\n * Get the singleton instance of the Logger\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n /**\n * Configure the logger\n * @param config Configuration options\n */\n public configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Enable or disable logging\n * @param enabled Whether logging is enabled\n */\n public setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n }\n\n /**\n * Set the log level\n * @param level The log level to set\n */\n public setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get the current log level\n */\n public getLevel(): LogLevel {\n return this.config.level;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.log(LogLevel.TRACE, message, ...args);\n }\n\n /**\n * Log a message with a specific log level\n * @param level The log level\n * @param message The message to log\n * @param args Additional arguments to log\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n // Only log if enabled and the log level is sufficient\n if (!this.config.enabled || level > this.config.level) {\n return;\n }\n\n if (!this.shouldLogMessage(message)) {\n return;\n }\n\n // Check if we're in a browser environment\n const isBrowser = typeof window !== 'undefined';\n\n if (isBrowser && this.config.showColors) {\n this.logBrowser(level, message, ...args);\n } else {\n this.logTerminal(level, message, ...args);\n }\n }\n\n private extractContext(message: string): { context: string; messageContent: string } {\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n\n if (!contextMatch) {\n return {\n context: '',\n messageContent: message,\n };\n }\n\n return {\n context: contextMatch[1],\n messageContent: contextMatch[2],\n };\n }\n\n private matchesFilter(value: string, matchers?: LoggerFilterMatcher[]): boolean {\n if (!matchers?.length) {\n return false;\n }\n\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n\n matcher.lastIndex = 0;\n return matcher.test(value);\n });\n }\n\n private shouldLogMessage(message: string): boolean {\n const filter = this.config.filter;\n\n if (!filter) {\n return true;\n }\n\n const hasFilters = Boolean(filter.contexts?.length || filter.messages?.length);\n\n if (!hasFilters) {\n return true;\n }\n\n const { context, messageContent } = this.extractContext(message);\n const contextMatches = this.matchesFilter(context, filter.contexts);\n const messageMatches = this.matchesFilter(messageContent, filter.messages);\n const matches = contextMatches || messageMatches;\n\n return filter.mode === 'exclude' ? !matches : matches;\n }\n\n /**\n * Log a message in terminal/node environment\n */\n private logTerminal(level: LogLevel, message: string, ...args: any[]): void {\n // Prepare log prefix\n let timestamp = '';\n let levelStr = '';\n let contextPart = '';\n\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let messageContent = message;\n\n if (contextMatch) {\n contextPart = `[${contextMatch[1]}] `;\n messageContent = contextMatch[2];\n }\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n timestamp = `[${now}] `;\n }\n\n // Add log level\n levelStr = `[${this.levelLabels[level]}] `;\n\n // Format with colors if enabled\n if (this.config.showColors) {\n const levelColor = this.levelColors[level];\n const contextColor = this.terminalColors.cyan;\n const timestampColor = this.terminalColors.gray;\n const messageColor = this.terminalColors.white;\n\n timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;\n levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;\n\n if (contextPart) {\n contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;\n }\n\n messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;\n }\n\n const formattedMessage = timestamp + levelStr + contextPart + messageContent;\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(formattedMessage, ...args);\n break;\n }\n }\n\n /**\n * Log a message in browser environment with CSS styling\n */\n private logBrowser(level: LogLevel, message: string, ...args: any[]): void {\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let context = '';\n let messageContent = message;\n\n if (contextMatch) {\n context = contextMatch[1];\n messageContent = contextMatch[2];\n }\n\n // Create CSS styled format string\n let format = '';\n const formatArgs: string[] = [];\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n format += '%c[' + now + '] ';\n formatArgs.push(this.browserColors.timestamp);\n }\n\n // Add log level with style\n format += '%c[' + this.levelLabels[level] + '] ';\n formatArgs.push(this.levelBrowserColors[level]);\n\n // Add context if present\n if (context) {\n format += '%c[' + context + '] ';\n formatArgs.push(this.browserColors.context);\n }\n\n // Add the actual message\n format += '%c' + messageContent;\n formatArgs.push(this.browserColors.message);\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(format, ...formatArgs, ...args);\n break;\n case LogLevel.WARN:\n console.warn(format, ...formatArgs, ...args);\n break;\n case LogLevel.INFO:\n console.info(format, ...formatArgs, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(format, ...formatArgs, ...args);\n break;\n }\n }\n\n /**\n * Creates a context-specific logger.\n *\n * Context loggers automatically prefix all log messages with a context tag.\n * Commonly used in plugins and classes to identify log sources.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns ContextLogger instance\n *\n * @example\n * ```typescript\n * class DisplayPlugin {\n * private logger = logger.createContextLogger('DisplayPlugin');\n *\n * initialize() {\n * this.logger.info('Initializing display');\n * // Output: [INFO] [DisplayPlugin] Initializing display\n * }\n * }\n * ```\n */\n public createContextLogger(context: string): ContextLogger {\n return new ContextLogger(this, context);\n }\n}\n\n/**\n * Context-specific logger that prefixes all messages.\n *\n * ContextLogger wraps the main Logger and automatically adds a context prefix\n * to all log messages. This makes it easy to identify which component or plugin\n * generated a log message.\n *\n * ## Usage\n *\n * Create context loggers using `logger.createContextLogger(context)`.\n * All log methods (error, warn, info, debug, trace) are available.\n *\n * @example\n * ```typescript\n * class ResourcePlugin {\n * private logger = logger.createContextLogger('ResourcePlugin');\n *\n * async loadAssets() {\n * this.logger.info('Loading assets...');\n * // Output: [INFO] [ResourcePlugin] Loading assets...\n *\n * try {\n * await this.load();\n * this.logger.info('Assets loaded successfully');\n * } catch (error) {\n * this.logger.error('Failed to load assets', error);\n * }\n * }\n * }\n * ```\n *\n * @category Utils\n * @public\n */\nexport class ContextLogger {\n private logger: Logger;\n private context: string;\n\n constructor(logger: Logger, context: string) {\n this.logger = logger;\n this.context = context;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.logger.error(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.logger.warn(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.logger.info(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.logger.debug(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.logger.trace(`[${this.context}] ${message}`, ...args);\n }\n}\n\n// Export a default instance for convenience\nexport const logger = Logger.getInstance();\n\n// Cached context loggers for inline usage\nconst contextLoggers = new Map<string, ContextLogger>();\n\n/**\n * Get or create a cached context logger.\n * Same context string always returns the same instance.\n *\n * Preferred over class property pattern for easier tree-shaking\n * and production stripping.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns Cached ContextLogger instance\n *\n * @example\n * ```typescript\n * import { getLogger } from '@rb-games/core/utils';\n *\n * // No class property needed - use inline\n * getLogger('MyClass').info('message');\n * getLogger('MyClass').debug('data', { x: 1 });\n * ```\n */\nexport function getLogger(context: string): ContextLogger {\n let cached = contextLoggers.get(context);\n if (!cached) {\n cached = new ContextLogger(logger, context);\n contextLoggers.set(context, cached);\n }\n return cached;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolvePublicPath } from './chunk-NQMORMNP.js';
|
|
2
|
-
import { getLogger } from './chunk-
|
|
2
|
+
import { getLogger } from './chunk-C45KDREE.js';
|
|
3
3
|
import i18next from 'i18next';
|
|
4
4
|
import Backend from 'i18next-http-backend';
|
|
5
5
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
|
@@ -129,5 +129,5 @@ function getI18nInstance() {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
export { changeLanguage, getCurrentLanguage, getI18nInstance, initSlotI18n, isI18nReady, onLanguageChanged, resolveLanguageFromUrl, t };
|
|
132
|
-
//# sourceMappingURL=chunk-
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
132
|
+
//# sourceMappingURL=chunk-P4GCINNA.js.map
|
|
133
|
+
//# sourceMappingURL=chunk-P4GCINNA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../i18n/sharedI18n.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../i18n/sharedI18n.ts"],"names":[],"mappings":"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","file":"chunk-P4GCINNA.js","sourcesContent":["import i18next from 'i18next';\nimport Backend from 'i18next-http-backend';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { resolvePublicPath } from '../helpers/resolvePublicPath';\nimport { getLogger } from '../utils/Logger';\n\nconst DEFAULT_LANGUAGE = 'en';\n\nlet initPromise: Promise<void> | null = null;\nconst languageChangedListeners = new Set<(lng: string) => void>();\n\nfunction normalizeLanguageCode(lng: string | null | undefined): string {\n if (!lng) return DEFAULT_LANGUAGE;\n return lng.trim().toLowerCase().split('-')[0] || DEFAULT_LANGUAGE;\n}\n\n/** Reads `?lng=TR` (case-insensitive) and returns ISO code e.g. `tr`. */\nexport function resolveLanguageFromUrl(search = window.location.search): string {\n const raw = new URLSearchParams(search).get('lng');\n return normalizeLanguageCode(raw);\n}\n\nfunction createInterpolationFormat() {\n return (value: unknown, format: string | undefined): unknown => {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (format === 'optional' && (value === null || value === undefined || value === '')) {\n return '';\n }\n\n switch (format) {\n case 'percentage':\n if (typeof value === 'number' && Number.isNaN(value)) return value;\n return `${Number(value)}%`;\n case 'uppercase':\n return (value || '').toString().toLocaleUpperCase();\n case 'lowercase':\n return (value || '').toString().toLocaleLowerCase();\n case 'firstchar':\n return (value || '')\n .toString()\n .split(/([.?!]+\\s*|\\n+)/g)\n .map((part: string) => {\n if (/^[.?!]+/.test(part) || /^\\s*$/.test(part)) {\n return part;\n }\n return part\n .toLocaleLowerCase()\n .replace(\n /^(\\s*)(\\S)/,\n (_, spaces, firstChar) => spaces + firstChar.toLocaleUpperCase(),\n );\n })\n .join('');\n case 'camel':\n return (value || '')\n .toString()\n .split(' ')\n .map((word: string) => {\n return word.charAt(0).toLocaleUpperCase() + (word || '').slice(1).toLocaleLowerCase();\n })\n .join(' ');\n default:\n return value;\n }\n };\n}\n\n/** One-time i18next init shared by Svelte shell and I18NextPlugin. */\nexport async function initSlotI18n(): Promise<void> {\n if (i18next.isInitialized) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n const requestedLng = resolveLanguageFromUrl();\n\n await i18next\n .use(Backend)\n .use(LanguageDetector)\n .use({\n type: 'postProcessor',\n name: 'trimProcessor',\n process(value: unknown) {\n if (typeof value === 'string') {\n return value.trim();\n }\n return value;\n },\n })\n .init({\n lng: requestedLng,\n preload: [DEFAULT_LANGUAGE],\n fallbackLng: [DEFAULT_LANGUAGE],\n load: 'currentOnly',\n debug: false,\n detection: {\n order: ['querystring', 'localStorage', 'cookie', 'navigator'],\n lookupQuerystring: 'lng',\n caches: ['localStorage', 'cookie'],\n },\n backend: {\n loadPath: resolvePublicPath('locales/{{lng}}.json'),\n queryStringParams: { v: '1.0.0' },\n },\n interpolation: {\n escapeValue: false,\n format: createInterpolationFormat(),\n },\n postProcess: ['trimProcessor'],\n });\n\n i18next.on('languageChanged', (lng) => {\n const normalized = normalizeLanguageCode(lng);\n for (const listener of languageChangedListeners) {\n listener(normalized);\n }\n });\n\n getLogger('SharedI18n').info('i18n initialized', { language: getCurrentLanguage() });\n })();\n\n try {\n await initPromise;\n } catch (error) {\n initPromise = null;\n getLogger('SharedI18n').error('Failed to initialize i18n', error);\n throw error;\n }\n}\n\nexport function t(key: string, options?: Record<string, unknown>): string {\n return i18next.t(key, options) as string;\n}\n\nexport async function changeLanguage(lng: string): Promise<void> {\n const normalized = normalizeLanguageCode(lng);\n await i18next.changeLanguage(normalized);\n}\n\nexport function getCurrentLanguage(): string {\n return normalizeLanguageCode(i18next.language);\n}\n\nexport function isI18nReady(): boolean {\n return i18next.isInitialized;\n}\n\nexport function onLanguageChanged(listener: (lng: string) => void): () => void {\n languageChangedListeners.add(listener);\n return () => {\n languageChangedListeners.delete(listener);\n };\n}\n\nexport function getI18nInstance() {\n return i18next;\n}\n"]}
|
|
@@ -48,13 +48,11 @@ var DEFAULT_CONFIG = {
|
|
|
48
48
|
roundedSymbol: "+"
|
|
49
49
|
};
|
|
50
50
|
var NumberFormatter = class _NumberFormatter {
|
|
51
|
-
static instance;
|
|
52
|
-
config;
|
|
53
|
-
maskCache = /* @__PURE__ */ new Map();
|
|
54
51
|
/**
|
|
55
52
|
* Private constructor for singleton pattern
|
|
56
53
|
*/
|
|
57
54
|
constructor(config) {
|
|
55
|
+
this.maskCache = /* @__PURE__ */ new Map();
|
|
58
56
|
this.config = config;
|
|
59
57
|
}
|
|
60
58
|
/**
|
|
@@ -488,5 +486,5 @@ function throttle(func, wait, options = {}) {
|
|
|
488
486
|
}
|
|
489
487
|
|
|
490
488
|
export { DataInjector, NumberFormatter, __arrayUtilsLoaded, applyAnchor, applyCommonProperties, applyScale, calculateAnimationSpeed, darkenColor, debounce, lightenColor, throttle, updateBounds };
|
|
491
|
-
//# sourceMappingURL=chunk-
|
|
492
|
-
//# sourceMappingURL=chunk-
|
|
489
|
+
//# sourceMappingURL=chunk-XHUPUPPW.js.map
|
|
490
|
+
//# sourceMappingURL=chunk-XHUPUPPW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils/DataInjector.ts","../utils/ColorUtils.ts","../utils/NumberFormatter.ts","../utils/ArrayUtils.ts","../utils/PixiUtils.ts","../utils/Throttle.ts"],"names":[],"mappings":"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","file":"chunk-XHUPUPPW.js","sourcesContent":["import { cloneDeep, get, merge, set } from 'lodash';\n\n/**\n * Injects data into a nested object path.\n *\n * DataInjector is a utility function for safely modifying nested object properties.\n * It creates a deep clone of the original object and injects data at the specified path.\n *\n * ## Features\n *\n * - **Deep Cloning**: Original object is never mutated\n * - **Nested Path Support**: Use dot notation (e.g., 'ui.button.color')\n * - **Merge or Replace**: Choose to merge with existing data or replace it\n * - **Type-Safe**: Preserves TypeScript types\n *\n * ## Usage with Skins\n *\n * Commonly used to patch skin data with specific values while keeping the rest intact.\n *\n * @typeParam T - The type of the object being modified\n * @param obj - Source object to modify\n * @param path - Dot-notation path to the property (e.g., 'options.buttonSkin.up')\n * @param data - Data to inject at the path\n * @param replace - If true, replaces the value; if false, merges with existing (default: false)\n * @returns New object with injected data\n *\n * @example\n * Merge data (default):\n * ```typescript\n * const skinData = {\n * button: { color: 0xFF0000, size: 100 },\n * text: { fontSize: 24 }\n * };\n *\n * const updated = DataInjector(skinData, 'button', { size: 150 });\n * // Result: { button: { color: 0xFF0000, size: 150 }, text: { fontSize: 24 } }\n * ```\n *\n * @example\n * Replace data:\n * ```typescript\n * const updated = DataInjector(skinData, 'button', { size: 150 }, true);\n * // Result: { button: { size: 150 }, text: { fontSize: 24 } }\n * // Note: color is removed because we replaced the entire button object\n * ```\n *\n * @example\n * Real-world example:\n * ```typescript\n * let autoplaySkin = defaultAutoplayMenuSkin;\n *\n * // Inject checkbox textures\n * autoplaySkin = DataInjector(autoplaySkin, 'options.buttonSkin', {\n * up: { background: { texture: 'btn_checkbox_up' } },\n * over: { background: { texture: 'btn_checkbox_over' } },\n * down: { background: { texture: 'btn_checkbox_down' } }\n * });\n *\n * // Inject slider textures\n * autoplaySkin = DataInjector(autoplaySkin, 'count.sliderSkin', {\n * up: { knob: { texture: 'icon_autoplay_slider_up' } },\n * over: { knob: { texture: 'icon_autoplay_slider_over' } }\n * });\n * ```\n *\n * @public\n */\nexport function DataInjector<T extends object>(\n obj: T,\n path: string,\n data: unknown,\n replace = false,\n): T {\n const result = cloneDeep(obj);\n\n // Handle empty path - merge at root level\n if (path === '' || path === undefined || path === null) {\n return merge({}, result, cloneDeep(data)) as T;\n }\n\n if (replace) {\n set(result, path, cloneDeep(data));\n return result;\n }\n const current = get(result, path);\n const merged = merge({}, current ?? {}, data);\n set(result, path, merged);\n return result;\n}\n","import { Color, type ColorSource } from 'pixi.js';\n\n/**\n * Utility functions for color manipulation.\n *\n * Provides functions for lightening and darkening colors.\n * Uses PixiJS Color and ColorSource for better type safety and compatibility with PixiJS v8.\n *\n * @example\n * ```typescript\n * import { lightenColor, darkenColor } from '@rb-games/core/utils';\n *\n * // Lighten a color\n * const lighter = lightenColor('#4CAF50', 0.2);\n * const lighter2 = lightenColor(0x4CAF50, 0.2);\n *\n * // Darken a color\n * const darker = darkenColor('#4CAF50', 0.2);\n *\n * // Use with PixiJS\n * sprite.tint = lighter; // Direct usage\n * const hex = lighter.toHex(); // Convert to hex if needed\n * const num = lighter.toNumber(); // Convert to number if needed\n * ```\n *\n * @public\n */\n\n/**\n * Adjusts a color's brightness by a specified percentage.\n * Internal helper function used by lightenColor and darkenColor.\n *\n * @param color - Color value (hex string, number, or any PixiJS ColorSource)\n * @param amount - Amount to adjust (0-1)\n * @param sign - Direction of adjustment (1 for lighten, -1 for darken)\n * @returns Adjusted color as PixiJS Color instance\n */\nfunction adjustColor(color: ColorSource, amount: number, sign: 1 | -1): Color {\n const colorObj = new Color(color);\n const rgb = {\n r: colorObj.red * 255,\n g: colorObj.green * 255,\n b: colorObj.blue * 255,\n };\n\n const delta = 255 * amount * sign;\n const newR = Math.max(0, Math.min(255, rgb.r + delta));\n const newG = Math.max(0, Math.min(255, rgb.g + delta));\n const newB = Math.max(0, Math.min(255, rgb.b + delta));\n\n return new Color([newR / 255, newG / 255, newB / 255]);\n}\n\n/**\n * Lightens a color by a specified percentage.\n *\n * @param color - Color value (hex string, number, or any PixiJS ColorSource)\n * @param amount - Amount to lighten (0-1, where 0.2 = 20% lighter)\n * @returns Lightened color as PixiJS Color instance\n *\n * @example\n * ```typescript\n * const lighter = lightenColor('#4CAF50', 0.15);\n * const lighter2 = lightenColor(0x4CAF50, 0.15);\n * // Can be used directly with PixiJS: sprite.tint = lighter;\n * // Or as hex string: lighter.toHex()\n * ```\n */\nexport function lightenColor(color: ColorSource, amount: number): Color {\n return adjustColor(color, amount, 1);\n}\n\n/**\n * Darkens a color by a specified percentage.\n *\n * @param color - Color value (hex string, number, or any PixiJS ColorSource)\n * @param amount - Amount to darken (0-1, where 0.2 = 20% darker)\n * @returns Darkened color as PixiJS Color instance\n *\n * @example\n * ```typescript\n * const darker = darkenColor('#4CAF50', 0.15);\n * const darker2 = darkenColor(0x4CAF50, 0.15);\n * // Can be used directly with PixiJS: sprite.tint = darker;\n * // Or as hex string: darker.toHex()\n * ```\n */\nexport function darkenColor(color: ColorSource, amount: number): Color {\n return adjustColor(color, amount, -1);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Configuration options for NumberFormatter.\n *\n * @public\n */\nexport interface NumberFormatterConfig {\n /** Number format mask (e.g., '$ #,##0.##', '#,##0.00 TL') */\n mask: string;\n /** Denomination multiplier for currency conversion */\n denom: number;\n /** Threshold for express mode (values above this will be shortened) */\n expressThreshold: number;\n /** Units for express mode (K, M, B, T, etc.) */\n expressUnits: string[];\n /** Decimal precision for express mode */\n decimalPrecision: number;\n /** Symbol to show when number is rounded in express mode */\n roundedSymbol: string;\n}\n\n/**\n * Options for format and express methods.\n *\n * @public\n */\nexport interface FormatOptions {\n /** Prefix to add before the formatted number */\n prefix?: string;\n /** Force showing decimal places even for whole numbers */\n forceDecimals?: boolean;\n /** Ignore denomination multiplier */\n ignoreDenom?: boolean;\n /** Custom threshold for express mode (overrides config) */\n threshold?: number;\n}\n\n/**\n * Parsed mask information.\n *\n * @internal\n */\ninterface ParsedMask {\n /** Mask pattern without prefix/suffix */\n pattern: string;\n /** Currency symbol or prefix */\n prefix: string;\n /** Currency symbol or suffix */\n suffix: string;\n /** Decimal separator */\n decimal: string;\n /** Group separator (thousands) */\n group: string;\n /** Decimal places */\n decimalPlaces: number;\n /** Position of leading zeros */\n posLeadZero: number;\n /** Group size (e.g., 3 for thousands) */\n groupSize: number;\n}\n\n/**\n * Number formatter for slot games with denomination and express mode support.\n *\n * NumberFormatter provides a unified number formatting system with:\n * - Mask-based formatting (e.g., '$ #,##0.##', '#,##0.00 TL')\n * - Denomination support for currency conversion\n * - Express mode for large numbers (1.5K, 2.3M, etc.)\n * - Configurable decimal precision and separators\n * - Type-safe API with TypeScript\n *\n * ## Features\n *\n * - **Mask-Based Formatting**: Industry-standard mask patterns\n * - **Denomination Support**: Automatic currency conversion with denom multiplier\n * - **Express Mode**: Shorten large numbers (1000 → 1K, 1500000 → 1.5M)\n * - **Flexible Configuration**: Configure globally or per-call\n * - **Type-Safe**: Full TypeScript support\n * - **Performance**: Mask parsing is cached for efficiency\n *\n * ## Mask Format\n *\n * - `#` - Optional digit\n * - `0` - Required digit (shows leading/trailing zeros)\n * - `,` - Group separator (thousands)\n * - `.` - Decimal separator\n * - Any other characters are treated as prefix/suffix\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { NumberFormatter } from '@rb-games/core/utils';\n *\n * // Configure formatter\n * const formatter = NumberFormatter.configure({\n * mask: '$ #,##0.##',\n * denom: 100,\n * expressThreshold: 1000,\n * expressUnits: ['K', 'M', 'B', 'T'],\n * decimalPrecision: 2\n * });\n *\n * // Format numbers\n * formatter.format(1500); // \"$ 15.00\"\n * formatter.format(250000); // \"$ 2,500.00\"\n *\n * // Express mode for large numbers\n * formatter.express(150000); // \"$ 1.5K\"\n * formatter.express(2500000); // \"$ 2.5M\"\n * ```\n *\n * @example\n * Different currency formats:\n * ```typescript\n * // USD format\n * const usdFormatter = NumberFormatter.configure({\n * mask: '$ #,##0.00',\n * denom: 100\n * });\n * usdFormatter.format(1000); // \"$ 10.00\"\n *\n * // TRY format (suffix)\n * const tryFormatter = NumberFormatter.configure({\n * mask: '#,##0.## TL',\n * denom: 100\n * });\n * tryFormatter.format(1000); // \"10.00 TL\"\n *\n * // IDR format (high denom)\n * const idrFormatter = NumberFormatter.configure({\n * mask: 'Rp #,##0',\n * denom: 1000,\n * expressThreshold: 100000\n * });\n * idrFormatter.express(15000000); // \"Rp 15K\"\n * ```\n *\n * @example\n * Per-call options:\n * ```typescript\n * const formatter = NumberFormatter.configure({\n * mask: '$ #,##0.##',\n * denom: 100\n * });\n *\n * // Force decimals\n * formatter.format(1000, { forceDecimals: true }); // \"$ 10.00\"\n *\n * // Ignore denom\n * formatter.format(1000, { ignoreDenom: true }); // \"$ 1,000.00\"\n *\n * // Custom threshold\n * formatter.express(500, { threshold: 100 }); // \"$ 0.5K\"\n * ```\n *\n * @category Utils\n * @public\n */\n/**\n * Default configuration for NumberFormatter.\n * @internal\n */\nconst DEFAULT_CONFIG: NumberFormatterConfig = {\n mask: '#,##0.##',\n denom: 1,\n expressThreshold: 1000,\n expressUnits: ['K', 'M', 'B', 'T', 'Q'],\n decimalPrecision: 2,\n roundedSymbol: '+',\n};\n\nexport class NumberFormatter {\n private static instance: NumberFormatter;\n private config: NumberFormatterConfig;\n private maskCache: Map<string, ParsedMask> = new Map();\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor(config: NumberFormatterConfig) {\n this.config = config;\n }\n\n /**\n * Configure the NumberFormatter singleton.\n *\n * @param config - Configuration options\n * @returns NumberFormatter instance\n */\n public static configure(config: Partial<NumberFormatterConfig>): NumberFormatter {\n const finalConfig = { ...DEFAULT_CONFIG, ...config };\n\n if (!NumberFormatter.instance) {\n NumberFormatter.instance = new NumberFormatter(finalConfig);\n } else {\n NumberFormatter.instance.config = finalConfig;\n NumberFormatter.instance.maskCache.clear();\n }\n\n return NumberFormatter.instance;\n }\n\n /**\n * Get the singleton instance.\n *\n * If not configured yet, initializes with default configuration.\n *\n * @returns NumberFormatter instance\n */\n public static getInstance(): NumberFormatter {\n if (!NumberFormatter.instance) {\n NumberFormatter.instance = new NumberFormatter(DEFAULT_CONFIG);\n }\n return NumberFormatter.instance;\n }\n\n /**\n * Format a number using the configured mask.\n *\n * @param value - Number to format\n * @param options - Optional formatting options\n * @returns Formatted string\n *\n * @example\n * ```typescript\n * formatter.format(1500); // \"$ 15.00\"\n * formatter.format(1500, { forceDecimals: true }); // \"$ 15.00\"\n * formatter.format(1500, { ignoreDenom: true }); // \"$ 1,500.00\"\n * ```\n */\n public format(value: number, options: FormatOptions = {}): string {\n const { prefix = '', forceDecimals = false, ignoreDenom = false } = options;\n\n const actualValue = ignoreDenom ? value : value * this.config.denom;\n\n let mask = this.config.mask;\n\n if (forceDecimals) {\n mask = mask.replace(/\\.##/g, '.00');\n }\n\n return this.applyMask(mask, actualValue) + prefix;\n }\n\n /**\n * Format a number in express mode (shortened with K/M/B/T).\n *\n * @param value - Number to format\n * @param options - Optional formatting options\n * @returns Formatted string with unit suffix\n *\n * @example\n * ```typescript\n * formatter.express(150000); // \"$ 1.5K\"\n * formatter.express(2500000); // \"$ 2.5M\"\n * formatter.express(500, { threshold: 100 }); // \"$ 0.5K\"\n * ```\n */\n public express(value: number, options: FormatOptions = {}): string {\n const {\n prefix = '',\n forceDecimals = false,\n ignoreDenom = false,\n threshold = this.config.expressThreshold,\n } = options;\n\n const actualValue = ignoreDenom ? value : value * this.config.denom;\n\n if (actualValue < threshold) {\n return this.format(value, { prefix, forceDecimals, ignoreDenom });\n }\n\n let unitIndex = -1;\n let shortenedNum = actualValue;\n\n while (shortenedNum >= 1000 && unitIndex < this.config.expressUnits.length - 1) {\n shortenedNum /= 1000;\n unitIndex++;\n }\n\n const factor = Math.pow(10, this.config.decimalPrecision);\n const roundedNum = Math.floor(shortenedNum * factor) / factor;\n const isRounded = roundedNum < shortenedNum;\n\n let mask = this.config.mask;\n\n if (forceDecimals) {\n mask = mask.replace(/\\.##/g, '.00');\n }\n\n const parsed = this.parseMask(mask);\n const formattedNumber =\n this.applyMask(parsed.pattern, roundedNum) +\n (this.config.expressUnits[unitIndex] || '') +\n (isRounded ? this.config.roundedSymbol : '');\n\n return parsed.prefix + formattedNumber + parsed.suffix + prefix;\n }\n\n /**\n * Parse a mask string into its components.\n *\n * @param mask - Mask string to parse\n * @returns Parsed mask information\n * @internal\n */\n private parseMask(mask: string): ParsedMask {\n if (this.maskCache.has(mask)) {\n return this.maskCache.get(mask)!;\n }\n\n const maskCharacters = /[#0-9,.]/;\n const len = mask.length;\n const start = mask.search(/[0-9\\-\\+#]/);\n const prefix = start > 0 ? mask.substring(0, start).trim() : '';\n\n const str = mask.split('').reverse().join('');\n const end = str.search(/[0-9\\-\\+#]/);\n const offset = len - end;\n const indx = offset + (mask.substring(offset, offset + 1) === '.' ? 1 : 0);\n const suffix = end > 0 ? mask.substring(indx, len).trim() : '';\n\n const pattern = mask.substring(start, indx);\n\n const result = pattern.match(/[^\\d\\-\\+#]/g);\n const decimal = (result && result[result.length - 1]) || '.';\n const group = (result && result[1] && result[0]) || ',';\n\n const parts = pattern.split(decimal);\n const decimalPlaces = parts[1] ? parts[1].length : 0;\n\n const szSep = parts[0].split(group);\n const groupSize = szSep[1] ? szSep[szSep.length - 1].length : 0;\n\n const cleanPattern = parts[0].replace(new RegExp(`\\\\${group}`, 'g'), '');\n const posLeadZero = cleanPattern.indexOf('0');\n\n const parsed: ParsedMask = {\n pattern,\n prefix,\n suffix,\n decimal,\n group,\n decimalPlaces,\n posLeadZero,\n groupSize,\n };\n\n this.maskCache.set(mask, parsed);\n return parsed;\n }\n\n /**\n * Apply a mask to a number value.\n *\n * @param mask - Mask pattern\n * @param value - Number to format\n * @returns Formatted string\n * @internal\n */\n private applyMask(mask: string, value: any): string {\n if (!mask || isNaN(+value) || value === '') return value;\n\n const parsed = this.parseMask(mask);\n let isNegative = value < 0;\n value = Math.abs(value);\n\n const maskParts = parsed.pattern.split(parsed.decimal);\n value = value.toFixed(maskParts[1] ? maskParts[1].length : 0);\n value = +value + '';\n\n const posTrailZero = maskParts[1] ? maskParts[1].lastIndexOf('0') : -1;\n let parts = value.split('.');\n\n if (!parts[1] || (parts[1] && parts[1].length <= posTrailZero)) {\n value = (+value).toFixed(posTrailZero + 1);\n }\n\n const szSep = maskParts[0].split(parsed.group);\n const cleanMask = szSep.join('');\n\n if (parsed.posLeadZero > -1) {\n while (parts[0].length < cleanMask.length - parsed.posLeadZero) {\n parts[0] = '0' + parts[0];\n }\n } else if (+parts[0] === 0) {\n parts[0] = '';\n }\n\n const valueParts = value.split('.');\n valueParts[0] = parts[0];\n\n if (parsed.groupSize) {\n const integer = valueParts[0];\n let str = '';\n const offset = integer.length % parsed.groupSize;\n const len = integer.length;\n\n for (let i = 0; i < len; i++) {\n str += integer.charAt(i);\n if (!((i - offset + 1) % parsed.groupSize) && i < len - parsed.groupSize) {\n str += parsed.group;\n }\n }\n valueParts[0] = str;\n }\n\n valueParts[1] = maskParts[1] && valueParts[1] ? parsed.decimal + valueParts[1] : '';\n\n const result = valueParts.join('');\n if (result === '0' || result === '') {\n isNegative = false;\n }\n\n return parsed.prefix + (isNegative ? '-' : '') + result + parsed.suffix;\n }\n\n /**\n * Decimal/group separators and fraction length from the configured mask.\n * Use for free-form numeric inputs (e.g. bet multipliers) that are not currency amounts.\n */\n public getMaskLocale(): { decimal: string; group: string; decimalPlaces: number } {\n const parsed = this.parseMask(this.config.mask);\n return {\n decimal: parsed.decimal,\n group: parsed.group,\n decimalPlaces:\n parsed.decimalPlaces > 0 ? parsed.decimalPlaces : this.config.decimalPrecision,\n };\n }\n\n /**\n * Format a number using only the numeric portion of the mask (no prefix/suffix, no denom).\n * Suitable for multipliers and limits (e.g. autoplay 10.5× bet).\n */\n public formatPlainNumber(value: number, options: Pick<FormatOptions, 'forceDecimals'> = {}): string {\n const { forceDecimals = false } = options;\n const parsed = this.parseMask(this.config.mask);\n let pattern = parsed.pattern;\n if (forceDecimals) {\n pattern = pattern.replace(/\\.##/g, '.00');\n }\n return this.applyMask(pattern, value);\n }\n\n /**\n * Get current configuration.\n *\n * @returns Current configuration\n */\n public getConfig(): Readonly<NumberFormatterConfig> {\n return { ...this.config };\n }\n}\n","/**\n * Array prototype extensions for game utilities.\n *\n * ⚠️ WARNING: This file modifies Array.prototype globally.\n * It must be imported early in the application lifecycle.\n *\n * Usage:\n * - array.shuffle() - Returns shuffled copy\n * - array.random() - Returns random element\n * - array.clone() - Returns shallow copy\n * - array.exclude(1, 2) - Returns array without indices 1, 2\n */\n\nObject.defineProperty(Array.prototype, 'exclude', {\n value: function <T>(this: T[], ...indexToExclude: number[]): T[] {\n return this.filter((_, index) => !indexToExclude.includes(index));\n },\n enumerable: false,\n});\n\nObject.defineProperty(Array.prototype, 'random', {\n value: function <T>(): T {\n const randomIndex = Math.floor(Math.random() * this.length);\n return this[randomIndex];\n },\n enumerable: false,\n});\n\nObject.defineProperty(Array.prototype, 'lastItem', {\n value: function <T>(): T {\n return this[this.length - 1];\n },\n enumerable: false,\n});\n\nObject.defineProperty(Array.prototype, 'firstItem', {\n value: function <T>(): T {\n return this[0];\n },\n enumerable: false,\n});\n\nObject.defineProperty(Array.prototype, 'clone', {\n value: function <T>(): T[] {\n return [...this];\n },\n enumerable: false,\n});\n\nObject.defineProperty(Array.prototype, 'shuffle', {\n value: function <T>(this: T[]): T[] {\n const array = [...this];\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n },\n enumerable: false,\n});\n\ndeclare global {\n interface Array<T> {\n random(): T;\n clone(): T[];\n exclude(...indexToExclude: number[]): T[];\n shuffle(): T[];\n lastItem(): T | undefined;\n firstItem(): T | undefined;\n }\n}\n\n// Export a dummy value to ensure this module is not tree-shaken\nexport const __arrayUtilsLoaded = true;\n","import { Container, Rectangle } from 'pixi.js';\n\n/**\n * Type helper for elements that have an anchor property\n */\nexport type HasAnchor<T> = T & { anchor: { set(x: number, y: number): void } };\n\n/**\n * Calculate animation speed from FPS for PixiJS AnimatedSprite\n *\n * Converts animation FPS to PixiJS animationSpeed value. Default is 12 FPS because\n * animation sequences are typically exported from animation tools at 12 FPS,\n * while PixiJS runs at 60 FPS (requiring conversion: exportedFps / 60).\n *\n * @param exportedFps - Frames per second of the exported animation sequence (default: 12)\n * @param speed - Speed multiplier for playback (default: 1)\n * @returns Animation speed value for PixiJS AnimatedSprite (exportedFps / 60 * speed)\n *\n * @example\n * ```ts\n * const animSprite = new AnimatedSprite(frames);\n * // For 12 FPS animation (standard export)\n * animSprite.animationSpeed = calculateAnimationSpeed(12); // 0.2\n * // For 24 FPS animation\n * animSprite.animationSpeed = calculateAnimationSpeed(24); // 0.4\n * // For 12 FPS animation with 2x playback speed\n * animSprite.animationSpeed = calculateAnimationSpeed(12, 2); // 0.4\n * ```\n */\nexport function calculateAnimationSpeed(exportedFps: number = 12, speed: number = 1): number {\n return (exportedFps / 60) * speed;\n}\n\n/**\n * Apply anchor to a PixiJS element that supports anchor property\n *\n * @param element - Container element (Sprite, AnimatedSprite, Text, etc.)\n * @param anchor - Anchor point to set\n * @param defaultAnchor - Default anchor if anchor is not provided\n *\n * @example\n * ```ts\n * const sprite = new Sprite(texture);\n * applyAnchor(sprite, { x: 0.5, y: 0.5 });\n * ```\n */\nexport function applyAnchor(\n element: Container,\n anchor?: { x: number; y: number },\n defaultAnchor?: { x: number; y: number },\n): void {\n if (!('anchor' in element)) return;\n\n const elementWithAnchor = element as HasAnchor<Container>;\n\n if (anchor) {\n elementWithAnchor.anchor.set(anchor.x, anchor.y);\n } else if (defaultAnchor) {\n elementWithAnchor.anchor.set(defaultAnchor.x, defaultAnchor.y);\n }\n}\n\n/**\n * Apply scale to a PixiJS Container element\n * Supports both uniform (number) and non-uniform ({ x, y }) scaling\n *\n * @param element - Container element to scale\n * @param scale - Scale value (number for uniform, object for non-uniform)\n *\n * @example\n * ```ts\n * // Uniform scale\n * applyScale(sprite, 2);\n *\n * // Non-uniform scale\n * applyScale(sprite, { x: 2, y: 1.5 });\n * ```\n */\nexport function applyScale(element: Container, scale?: number | { x: number; y: number }): void {\n if (scale === undefined) return;\n\n if (typeof scale === 'number') {\n element.scale.set(scale);\n } else {\n element.scale.set(scale.x, scale.y);\n }\n}\n\n/**\n * Apply common visual properties to a PixiJS Container element\n * Includes alpha, blendMode, and scale\n *\n * @param element - Container element\n * @param config - Configuration object with optional properties\n *\n * @example\n * ```ts\n * applyCommonProperties(sprite, {\n * alpha: 0.8,\n * blendMode: 'add',\n * scale: 1.5\n * });\n * ```\n */\nexport function applyCommonProperties(\n element: Container,\n config: {\n alpha?: number;\n blendMode?: string;\n scale?: number | { x: number; y: number };\n },\n): void {\n if (config.alpha !== undefined) {\n element.alpha = config.alpha;\n }\n\n if (config.blendMode) {\n element.blendMode = config.blendMode as any;\n }\n\n applyScale(element, config.scale);\n}\n\n/**\n * Update or create a Rectangle for bounds\n * Reuses existing Rectangle instance to prevent memory leaks\n *\n * @param existingBounds - Existing Rectangle instance or undefined\n * @param x - X position\n * @param y - Y position\n * @param width - Width\n * @param height - Height\n * @returns Updated or new Rectangle instance\n *\n * @example\n * ```ts\n * // First call - creates new Rectangle\n * this.boundsArea = updateBounds(this.boundsArea, 0, 0, 100, 100);\n *\n * // Subsequent calls - reuses existing Rectangle\n * this.boundsArea = updateBounds(this.boundsArea, 0, 0, 200, 200);\n * ```\n */\nexport function updateBounds(\n existingBounds: Rectangle | undefined,\n x: number,\n y: number,\n width: number,\n height: number,\n): Rectangle {\n if (existingBounds instanceof Rectangle) {\n existingBounds.x = x;\n existingBounds.y = y;\n existingBounds.width = width;\n existingBounds.height = height;\n return existingBounds;\n }\n return new Rectangle(x, y, width, height);\n}\n","interface DebounceSettings {\n /** Specify invoking on the leading edge of the timeout. */\n leading?: boolean | undefined;\n /** The maximum time func is allowed to be delayed before it's invoked. */\n maxWait?: number | undefined;\n /** Specify invoking on the trailing edge of the timeout. */\n trailing?: boolean | undefined;\n}\n\ninterface DebounceSettingsLeading extends DebounceSettings {\n leading: true;\n}\n\nexport interface DebouncedFunc<T extends (...args: any[]) => any> {\n /**\n * Call the original function, but applying the debounce rules.\n *\n * If the debounced function can be run immediately, this calls it and returns\n * its return value.\n *\n * Otherwise, it returns the return value of the last invocation, or undefined\n * if the debounced function was not invoked yet.\n */\n (...args: Parameters<T>): ReturnType<T> | undefined;\n\n /** Throw away any pending invocation of the debounced function. */\n cancel(): void;\n\n /**\n * If there is a pending invocation of the debounced function, invoke it\n * immediately and return its return value.\n *\n * Otherwise, return the value from the last invocation, or undefined if the\n * debounced function was never invoked.\n */\n flush(): ReturnType<T> | undefined;\n\n /** Check if there is a pending invocation. */\n pending(): boolean;\n}\n\ninterface DebouncedFuncLeading<T extends (...args: any[]) => any> extends DebouncedFunc<T> {\n (...args: Parameters<T>): ReturnType<T>;\n flush(): ReturnType<T>;\n}\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked, or until the next browser frame is drawn. The debounced function\n * comes with a `cancel` method to cancel delayed `func` invocations and a\n * `flush` method to immediately invoke them. Provide `options` to indicate\n * whether `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. The `func` is invoked with the last arguments provided to the\n * debounced function. Subsequent calls to the debounced function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the debounced function is invoked\n * more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`\n * invocation will be deferred until the next frame is drawn (typically about\n * 16ms).\n *\n * @param func The function to debounce.\n * @param wait The number of milliseconds to delay. Default is `0`.\n * @param options The options object. Default is `{}`.\n * @returns Returns the new debounced function.\n */\nexport function debounce<T extends (...args: any) => any>(\n func: T,\n wait: number | undefined,\n options: DebounceSettingsLeading,\n): DebouncedFuncLeading<T>;\nexport function debounce<T extends (...args: any) => any>(\n func: T,\n wait?: number,\n options?: DebounceSettings,\n): DebouncedFunc<T>;\nexport function debounce<T extends (...args: any) => any>(\n func: T,\n wait = 0,\n options: DebounceSettingsLeading | DebounceSettings = {},\n): DebouncedFunc<T> | DebouncedFuncLeading<T> {\n let lastArgs: Parameters<T> | undefined;\n let lastThis: any;\n const maxWait = options.maxWait ? options.maxWait : wait;\n let result: ReturnType<T> | undefined;\n let timerId: ReturnType<typeof setTimeout> | ReturnType<typeof globalThis.requestAnimationFrame> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const leading = !!options.leading;\n const maxing = 'maxWait' in options;\n const trailing = options.trailing ?? true;\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = wait !== 0 && typeof globalThis.requestAnimationFrame === 'function';\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function');\n }\n\n function invokeFunc(time: number) {\n const args = lastArgs;\n const thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args!);\n\n return result;\n }\n\n function startTimer(pendingFunc: () => ReturnType<T> | undefined, milliseconds: number) {\n if (useRAF) {\n if (typeof timerId === 'number') {\n globalThis.cancelAnimationFrame(timerId);\n }\n\n return globalThis.requestAnimationFrame(pendingFunc);\n }\n\n return setTimeout(pendingFunc, milliseconds);\n }\n\n function cancelTimer(id: number | ReturnType<typeof setTimeout>) {\n if (useRAF) {\n globalThis.cancelAnimationFrame(id as number);\n\n return;\n }\n clearTimeout(id);\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait);\n\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n const timeSinceLastCall = time - (lastCallTime || 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n const timeSinceLastCall = time - (lastCallTime || 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (\n lastCallTime === undefined ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (maxing && timeSinceLastInvoke >= maxWait)\n );\n }\n\n function timerExpired() {\n const time = Date.now();\n\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time));\n\n return undefined;\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n cancelTimer(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function pending() {\n return timerId !== undefined;\n }\n\n function debounced(this: any, ...args: Parameters<T>) {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait);\n\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait);\n }\n\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n debounced.pending = pending;\n\n return debounced;\n}\n\nexport interface ThrottleSettings {\n /** Specify invoking on the leading edge of the timeout. */\n leading?: boolean | undefined;\n /** Specify invoking on the trailing edge of the timeout. */\n trailing?: boolean | undefined;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per every\n * `wait` milliseconds (or once per browser frame). The throttled function comes\n * with a `cancel` method to cancel delayed `func` invocations and a `flush`\n * method to immediately invoke them. Provide `options` to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the throttled function is invoked\n * more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`\n * invocation will be deferred until the next frame is drawn (typically about\n * 16ms).\n *\n * @param func The function to throttle.\n * @param wait The number of milliseconds to throttle invocations to. Default is `0`.\n * @param options The options object. Default is `{}`.\n * @returns Returns the new throttled function.\n */\nexport function throttle<T extends (...args: any) => any>(\n func: T,\n wait?: number,\n options: ThrottleSettings = {},\n): DebouncedFunc<T> {\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? true;\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function');\n }\n\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait,\n });\n}\n"]}
|
package/dist/engine/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import '../chunk-UE7T7Z45.js';
|
|
2
2
|
import { ENGINE_HOOKS } from '../chunk-MI6BP7A6.js';
|
|
3
|
-
import { getLogger } from '../chunk-
|
|
3
|
+
import { getLogger } from '../chunk-C45KDREE.js';
|
|
4
4
|
import '../chunk-G3PMV62Z.js';
|
|
5
5
|
import '@pixi/layout';
|
|
6
6
|
import '@pixi/layout/devtools';
|
|
@@ -37,15 +37,14 @@ var PixiEngine = class {
|
|
|
37
37
|
*/
|
|
38
38
|
constructor(config) {
|
|
39
39
|
this.config = config;
|
|
40
|
+
this.plugins = /* @__PURE__ */ new Map();
|
|
41
|
+
this.isInitialized = false;
|
|
42
|
+
this.pluginStates = /* @__PURE__ */ new Map();
|
|
43
|
+
this.readyPlugins = /* @__PURE__ */ new Set();
|
|
40
44
|
getLogger("PixiEngine").info("PixiEngine initializing with config", config);
|
|
41
45
|
this._pixiApp = new Application();
|
|
42
46
|
getLogger("PixiEngine").info("PixiEngine initialized successfully");
|
|
43
47
|
}
|
|
44
|
-
_pixiApp;
|
|
45
|
-
plugins = /* @__PURE__ */ new Map();
|
|
46
|
-
isInitialized = false;
|
|
47
|
-
pluginStates = /* @__PURE__ */ new Map();
|
|
48
|
-
readyPlugins = /* @__PURE__ */ new Set();
|
|
49
48
|
/**
|
|
50
49
|
* Registers a plugin with the engine.
|
|
51
50
|
*
|
package/dist/engine/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../engine/PixiEngine.ts"],"names":["PixiApplication"],"mappings":"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","file":"index.js","sourcesContent":["import '@pixi/layout';\n\n// This part will be removed on production\n// -------------------------------------------------------------------\nimport '@pixi/layout/devtools';\nimport '../devtools';\n\nconst devtools = (globalThis as any).__PIXI_DEVTOOLS__;\nif (devtools?.extensions) {\n devtools.extensions = devtools.extensions.filter(\n (e: any) => e?.extension?.name !== 'layout-scene-overlay'\n );\n}\n// -------------------------------------------------------------------\n\n\nimport { Application as PixiApplication, ApplicationOptions, Container, Renderer } from 'pixi.js';\nimport { getLogger } from '../utils/Logger';\nimport { EnginePlugin, PluginState, ENGINE_HOOKS } from '../plugins/Plugin.types';\nimport { isMobile } from 'pixi.js';\n\n\nexport type PlatformType = 'mobile' | 'desktop';\n\n/**\n * Configuration interface for the PixiEngine.\n * Extends PixiJS ApplicationOptions to provide additional engine-specific settings.\n *\n * @public\n */\nexport interface EngineConfig extends ApplicationOptions {\n appendTo?: HTMLElement;\n}\n\n/**\n * Core game engine built on top of PixiJS with a plugin-based architecture.\n *\n * PixiEngine provides a robust foundation for building casino games by managing:\n * - PixiJS application lifecycle\n * - Plugin registration and initialization with dependency resolution\n * - Data storage and retrieval\n * - Automatic window resizing\n * - Frame update loop integration\n *\n * ## Architecture\n *\n * The engine follows a plugin-based architecture where functionality is added through\n * plugins that implement the {@link EnginePlugin} interface. Plugins can:\n * - Depend on other plugins (dependency resolution)\n * - Have initialization priorities\n * - Hook into lifecycle events (initialize, ready, update, resize)\n *\n * ## Plugin Lifecycle\n *\n * 1. **REGISTERED** - Plugin is registered but not initialized\n * 2. **INITIALIZING** - Plugin's initialize() method is being called\n * 3. **INITIALIZED** - Plugin initialization complete\n * 4. **READY** - Plugin's onReady() called, fully operational\n * 5. **ERROR** - Plugin failed to initialize\n *\n * ## Usage Example\n *\n * ```typescript\n * // Create engine instance\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true\n * });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n * engine.registerPlugin(new GameStatePlugin());\n *\n * // Initialize engine (initializes all plugins)\n * await engine.initialize();\n *\n * // Access plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n *\n * // Store/retrieve data\n * engine.setData('playerScore', 1000);\n * const score = engine.getData<number>('playerScore');\n *\n * // Update loop (typically called by GSAP ticker)\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @category Engine\n * @public\n */\nexport class PixiEngine {\n private _pixiApp: PixiApplication;\n private plugins: Map<string, EnginePlugin> = new Map();\n private isInitialized: boolean = false;\n private pluginStates: Map<string, PluginState> = new Map();\n private readyPlugins: Set<string> = new Set();\n\n /**\n * Creates a new PixiEngine instance.\n *\n * The constructor creates the underlying PixiJS application but does not initialize it.\n * Call {@link initialize} after registering all plugins to start the engine.\n *\n * @param config - Engine configuration options extending PixiJS ApplicationOptions\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true,\n * resolution: window.devicePixelRatio\n * });\n * ```\n */\n constructor(protected config: Partial<EngineConfig>) {\n getLogger('PixiEngine').info('PixiEngine initializing with config', config);\n\n // Create Pixi Application\n this._pixiApp = new PixiApplication();\n\n getLogger('PixiEngine').info('PixiEngine initialized successfully');\n }\n\n /**\n * Registers a plugin with the engine.\n *\n * Plugins must be registered before calling {@link initialize}. If the engine is already\n * initialized, the plugin will be initialized immediately upon registration.\n *\n * The plugin's state is set to {@link PluginState.REGISTERED} and it will be initialized\n * during the engine's initialization phase based on its priority and dependencies.\n *\n * @param plugin - The plugin instance to register\n * @returns `true` if the plugin was successfully registered, `false` if a plugin with the same name already exists\n *\n * @example\n * ```typescript\n * const scenePlugin = new ScenePlugin();\n * const success = engine.registerPlugin(scenePlugin);\n *\n * if (!success) {\n * console.warn('Plugin already registered');\n * }\n * ```\n *\n * @see {@link EnginePlugin} for plugin interface details\n * @see {@link getPlugin} to retrieve registered plugins\n */\n public registerPlugin(plugin: EnginePlugin): boolean {\n if (this.plugins.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Plugin with name \"${plugin.name}\" is already registered.`);\n return false;\n }\n\n // Set initial state\n plugin.state = PluginState.REGISTERED;\n this.pluginStates.set(plugin.name, PluginState.REGISTERED);\n\n this.plugins.set(plugin.name, plugin);\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" registered`);\n\n // If the engine is already initialized, initialize the plugin immediately\n if (this.isInitialized) {\n this.initializePlugin(plugin);\n }\n\n return true;\n }\n\n /**\n * Checks if a plugin has completed initialization and is ready to use.\n *\n * A plugin is considered ready when it has successfully completed both its\n * `initialize()` and `onReady()` lifecycle methods.\n *\n * @param name - The name of the plugin to check\n * @returns `true` if the plugin is in the {@link PluginState.READY} state, `false` otherwise\n *\n * @example\n * ```typescript\n * if (engine.isPluginReady('ScenePlugin')) {\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * }\n * ```\n */\n public isPluginReady(name: string): boolean {\n return this.readyPlugins.has(name);\n }\n\n /**\n * Waits asynchronously for specific plugins to reach the ready state.\n *\n * This method is useful when you need to ensure certain plugins are fully initialized\n * before proceeding with game logic. It polls every 10ms until all specified plugins\n * are ready.\n *\n * @param pluginNames - Array of plugin names to wait for\n * @returns A promise that resolves when all specified plugins are ready\n *\n * @example\n * ```typescript\n * // Wait for multiple plugins before starting the game\n * await engine.waitForPlugins(['ScenePlugin', 'AudioPlugin', 'GameStatePlugin']);\n *\n * // Now safe to use these plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * ```\n *\n * @remarks\n * If any of the specified plugins are not registered, this method will wait indefinitely.\n * Ensure all required plugins are registered before calling this method.\n */\n public async waitForPlugins(pluginNames: string[]): Promise<void> {\n const checkPlugins = () => {\n return pluginNames.every((name) => this.isPluginReady(name));\n };\n\n if (checkPlugins()) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (checkPlugins()) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 10); // Check every 10ms\n });\n }\n\n /**\n * Initialize a single plugin with dependency checking\n */\n private async initializePlugin(plugin: EnginePlugin): Promise<void> {\n // Skip if already processed\n if (this.pluginStates.get(plugin.name) !== PluginState.REGISTERED) {\n return;\n }\n\n try {\n getLogger('PixiEngine').debug(`Initializing plugin: ${plugin.name}`);\n\n // Set state to initializing\n plugin.state = PluginState.INITIALIZING;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZING);\n\n // Initialize the plugin\n await plugin.initialize(this);\n\n // Set state to initialized\n plugin.state = PluginState.INITIALIZED;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZED);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" initialized successfully`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to initialize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n\n /**\n * Call onReady for all plugins after initialization is complete\n */\n private async finalizePlugins(): Promise<void> {\n const plugins = this.getPluginsSortedByPriorityAndDependencies();\n\n for (const plugin of plugins) {\n try {\n if (plugin.onReady) {\n getLogger('PixiEngine').debug(`Calling onReady for plugin: ${plugin.name}`);\n await plugin.onReady(this);\n }\n\n // Mark as ready\n plugin.state = PluginState.READY;\n this.pluginStates.set(plugin.name, PluginState.READY);\n this.readyPlugins.add(plugin.name);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" is now ready`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to finalize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n }\n\n /**\n * Initializes all plugins.\n */\n private async initializePlugins(): Promise<void> {\n // Initialize plugins in order based on their priority\n const sortedPlugins = this.getPluginsSortedByPriorityAndDependencies();\n getLogger('PixiEngine').info(`Initializing ${sortedPlugins.length} plugins`);\n\n // Initialize plugins sequentially based on dependencies\n for (const plugin of sortedPlugins) {\n await this.initializePlugin(plugin);\n }\n\n getLogger('PixiEngine').info('All plugins initialized and ready');\n }\n\n /**\n * Get plugins sorted by priority and dependency order\n */\n private getPluginsSortedByPriorityAndDependencies(): EnginePlugin[] {\n const plugins = Array.from(this.plugins.values());\n const resolved: EnginePlugin[] = [];\n const resolving = new Set<string>();\n const missingDependencies: string[] = [];\n\n const resolve = (plugin: EnginePlugin): void => {\n if (resolved.includes(plugin)) return;\n\n if (resolving.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Circular dependency detected for plugin: ${plugin.name}`);\n return;\n }\n\n resolving.add(plugin.name);\n\n // Resolve dependencies first\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n plugin.dependencies.forEach((depName) => {\n const depPlugin = this.plugins.get(depName);\n if (depPlugin) {\n resolve(depPlugin);\n } else {\n missingDependencies.push(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it's not registered`,\n );\n }\n });\n }\n\n resolving.delete(plugin.name);\n resolved.push(plugin);\n };\n\n // Sort by priority first (higher priority = lower number)\n const sortedByPriority = plugins.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n // Resolve dependencies\n sortedByPriority.forEach((plugin) => resolve(plugin));\n\n // Handle missing dependencies\n if (missingDependencies.length > 0) {\n const errorMessage = [\n '❌ Plugin dependency validation failed:',\n ...missingDependencies.map((msg) => ` • ${msg}`),\n '',\n '💡 Solutions:',\n ' • Register missing plugins before calling engine.initialize()',\n ' • Remove dependencies from plugin configuration',\n ' • Make dependencies optional in plugin code',\n ].join('\\n');\n\n getLogger('PixiEngine').error(errorMessage);\n throw new Error(`Missing plugin dependencies. Check console for details.`);\n }\n\n getLogger('PixiEngine').debug(\n 'Plugin initialization order:',\n resolved.map((p) => `${p.name}(priority:${p.priority})`),\n );\n\n return resolved;\n }\n\n /**\n * Initializes the engine and all registered plugins.\n *\n * This method performs the complete engine startup sequence:\n * 1. Initializes the PixiJS application with the provided configuration\n * 2. Appends the canvas to the document body\n * 3. Initializes all plugins in dependency order (respecting priorities)\n * 4. Calls `onReady()` on all plugins after initialization\n * 5. Sets up window resize event handling\n *\n * Plugins are initialized in order based on:\n * - Dependencies (plugins wait for their dependencies)\n * - Priority (lower numbers = higher priority)\n *\n * @returns A promise that resolves when the engine and all plugins are fully initialized\n * @throws {Error} If plugin dependencies are missing or circular dependencies are detected\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({ width: 1920, height: 1080 });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n *\n * // Initialize everything\n * await engine.initialize();\n *\n * // Engine is now ready to use\n * console.log('Engine initialized successfully');\n * ```\n *\n * @remarks\n * - This method should only be called once\n * - All plugins should be registered before calling this method\n * - The canvas will be automatically appended to `document.body`\n * - Window resize events are automatically handled\n */\n public async initialize(): Promise<void> {\n const width = this.config.width ?? 1920;\n const height = this.config.height ?? 1080;\n\n await this._pixiApp.init({\n width,\n height,\n antialias: true,\n autoStart: false,\n sharedTicker: false,\n useBackBuffer: true,\n autoDensity: false,\n ...this.config,\n });\n\n if (this.config.resizeTo || this.config.appendTo) {\n ((this.config.resizeTo || this.config.appendTo) as HTMLElement).appendChild(this._pixiApp.canvas);\n } else {\n document.body.appendChild(this._pixiApp.canvas);\n }\n\n getLogger('PixiEngine').info('Starting engine initialization');\n\n // Initialize all plugins (async)\n await this.initializePlugins();\n\n // Call onReady for all plugins after initialization\n await this.finalizePlugins();\n\n // Register window resize event handler\n window.onresize = () => {\n this.onResize();\n }\n\n // const resizeObserver = new ResizeObserver((entries) => {\n // for (const entry of entries) {\n // const { width, height } = entry.contentRect;\n // this.onResize(width, height);\n // }\n // });\n // resizeObserver.observe((this.config.resizeTo || this.config.appendTo || window.document.body) as Element);\n\n // Initialize the resize handling to set initial size\n this.onResize();\n\n getLogger('PixiEngine').info('Engine initialization completed');\n\n this.isInitialized = true;\n\n // Call onEngineReady hook for all plugins\n await this.notifyEngineReady();\n\n getLogger('PixiEngine').info('PixiEngine initialized');\n }\n\n /**\n * Handles window resize events and notifies plugins.\n *\n * This method is automatically called when the window is resized and during\n * engine initialization. It updates the renderer size and notifies all plugins\n * about the resize event in priority order.\n *\n * If a plugin's `onResize` method returns `true`, it indicates that the plugin\n * has handled the resize and propagation stops. Otherwise, the engine will\n * resize the renderer to match the window dimensions.\n *\n * @remarks\n * This is a private method called automatically by the engine.\n * Plugins can implement `onResize(width, height)` to handle custom resize logic.\n */\n private onResize(_width?: number, _height?: number): void {\n // Update renderer size\n const renderer = this._pixiApp.renderer as Renderer;\n\n // this._pixiApp.canvas.style.display = \"none\";\n\n // Simple responsive approach\n const width = _width ?? window.innerWidth;\n const height = _height ?? window.innerHeight;\n\n // this._pixiApp.canvas.style.display = \"block\";\n\n // Notify plugins about resize and control propagation\n const sortedPlugins = this.getPlugins();\n let handled = false;\n\n getLogger('PixiEngine').info(`Window resized: ${width}x${height}, dpr: ${renderer.resolution}`);\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onResize] && plugin[ENGINE_HOOKS.onResize](width, height, this.devicePixelRatio)) {\n // Plugin reported it has handled the resize, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Resize handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n // If no plugin handles the resize, the engine will handle it itself\n if (!handled) {\n renderer.resize(width, height);\n getLogger('PixiEngine').info(`Resized renderer to ${width}x${height}`);\n }\n }\n\n /**\n * Notifies all plugins that the engine is fully ready\n * This is called after all plugins are initialized and ready\n */\n private async notifyEngineReady(): Promise<void> {\n const sortedPlugins = this.getPlugins();\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onEngineReady]) {\n try {\n await plugin[ENGINE_HOOKS.onEngineReady](this);\n getLogger('PixiEngine').debug(`Plugin ${plugin.name} onEngineReady completed`);\n } catch (error) {\n getLogger('PixiEngine').error(`Plugin ${plugin.name} onEngineReady failed:`, error);\n }\n }\n }\n }\n\n /**\n * Retrieves a registered plugin by name with type safety.\n *\n * This method allows you to access registered plugins with proper TypeScript typing.\n * Returns `undefined` if the plugin is not found.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance if found, `undefined` otherwise\n *\n * @example\n * ```typescript\n * // Get plugin with type safety\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n *\n * if (scenePlugin) {\n * scenePlugin.loadScene('MainMenu');\n * } else {\n * console.warn('ScenePlugin not found');\n * }\n * ```\n *\n * @see {@link getPluginThrow} for a version that throws an error if plugin is not found\n */\n public getPlugin<T extends EnginePlugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /**\n * Retrieves a registered plugin by name, throwing an error if not found.\n *\n * This is a convenience method for cases where you expect the plugin to exist\n * and want to avoid null checks.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance\n * @throws {Error} If the plugin is not registered\n *\n * @example\n * ```typescript\n * // Get plugin or throw error\n * const scenePlugin = engine.getPluginThrow<ScenePlugin>('ScenePlugin');\n * scenePlugin.loadScene('MainMenu'); // No null check needed\n * ```\n *\n * @see {@link getPlugin} for a version that returns undefined instead of throwing\n */\n public getPluginThrow<T extends EnginePlugin>(name: string): T {\n const plugin = this.getPlugin<T>(name);\n if (!plugin) {\n throw new Error(`Plugin with name \"${name}\" is not registered.`);\n }\n return plugin;\n }\n\n\n\n /**\n * Gets all registered plugins sorted by priority.\n *\n * Returns an array of all plugins currently registered with the engine,\n * sorted by priority in descending order (highest priority first).\n *\n * @returns Array of all registered plugins sorted by priority\n *\n * @example\n * ```typescript\n * // List all registered plugins\n * const plugins = engine.getPlugins();\n * plugins.forEach(plugin => {\n * console.log(`Plugin: ${plugin.name}, Priority: ${plugin.priority}, State: ${plugin.state}`);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Find plugins by type\n * const plugins = engine.getPlugins();\n * const scenePlugins = plugins.filter(p => p.name.includes('Scene'));\n * ```\n *\n * @remarks\n * Plugins with undefined priority are treated as having priority 0.\n * Lower priority numbers mean higher priority (e.g., priority 1 comes before priority 10).\n */\n public getPlugins(): EnginePlugin[] {\n return Array.from(this.plugins.values()).sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n /**\n * Updates the plugins\n * @param deltaTime Frame duration\n */\n private updatePlugins(deltaTime: number): void {\n // Call plugins in order of their priority\n const sortedPlugins = this.getPlugins();\n\n let handled = false;\n for (const plugin of sortedPlugins) {\n if (plugin.onUpdate && plugin.onUpdate(deltaTime)) {\n // Plugin reported it has handled the update, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Update cycle handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n if (!handled) {\n // If no plugin handled the update, default behavior could be placed here\n // Currently there is no need for special handling\n }\n }\n\n /**\n * Main update loop called every frame.\n *\n * This method should be called from your game's main loop (typically GSAP ticker)\n * to update all plugins. Plugins are updated in priority order, and update\n * propagation stops if a plugin returns `true` from its `onUpdate` method.\n *\n * @param deltaTime - Time elapsed since the last frame in seconds\n *\n * @example\n * ```typescript\n * // Integrate with GSAP ticker\n * import { gsap } from 'gsap';\n *\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Manual update loop\n * let lastTime = performance.now();\n *\n * function gameLoop() {\n * const currentTime = performance.now();\n * const deltaTime = (currentTime - lastTime) / 1000;\n * lastTime = currentTime;\n *\n * engine.onUpdate(deltaTime);\n * requestAnimationFrame(gameLoop);\n * }\n *\n * gameLoop();\n * ```\n *\n * @remarks\n * The deltaTime is typically provided in seconds by GSAP ticker.\n * Plugins with higher priority (lower priority number) are updated first.\n */\n public onUpdate(deltaTime: number): void {\n // Update the plugins with the given delta time\n this.updatePlugins(deltaTime);\n }\n\n /**\n * Gets the underlying PixiJS Application instance.\n *\n * Provides direct access to the PixiJS application for advanced use cases\n * such as accessing the renderer, ticker, or other PixiJS-specific features.\n *\n * @returns The PixiJS Application instance\n *\n * @example\n * ```typescript\n * // Access the renderer\n * const renderer = engine.pixiApp.renderer;\n * console.log('Renderer type:', renderer.type);\n *\n * // Access the ticker\n * engine.pixiApp.ticker.add((delta) => {\n * console.log('Ticker delta:', delta);\n * });\n * ```\n *\n * @remarks\n * Use this getter sparingly. Most functionality should be accessed through\n * plugins or the engine's public API.\n */\n public get pixiApp(): PixiApplication {\n return this._pixiApp;\n }\n\n public get platform(): PlatformType {\n return isMobile.any ? 'mobile' : 'desktop';\n }\n\n /**\n * Gets the device pixel ratio, capped at 2 for performance reasons.\n * \n * @returns The device pixel ratio, capped at 2\n */\n public get devicePixelRatio() {\n return Math.min(window.devicePixelRatio ?? 1, 2);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../engine/PixiEngine.ts"],"names":["PixiApplication"],"mappings":"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","file":"index.js","sourcesContent":["import '@pixi/layout';\n\n// This part will be removed on production\n// -------------------------------------------------------------------\nimport '@pixi/layout/devtools';\nimport '../devtools';\n\nconst devtools = (globalThis as any).__PIXI_DEVTOOLS__;\nif (devtools?.extensions) {\n devtools.extensions = devtools.extensions.filter(\n (e: any) => e?.extension?.name !== 'layout-scene-overlay'\n );\n}\n// -------------------------------------------------------------------\n\n\nimport { Application as PixiApplication, ApplicationOptions, Container, Renderer } from 'pixi.js';\nimport { getLogger } from '../utils/Logger';\nimport { EnginePlugin, PluginState, ENGINE_HOOKS } from '../plugins/Plugin.types';\nimport { isMobile } from 'pixi.js';\n\n\nexport type PlatformType = 'mobile' | 'desktop';\n\n/**\n * Configuration interface for the PixiEngine.\n * Extends PixiJS ApplicationOptions to provide additional engine-specific settings.\n *\n * @public\n */\nexport interface EngineConfig extends ApplicationOptions {\n appendTo?: HTMLElement;\n}\n\n/**\n * Core game engine built on top of PixiJS with a plugin-based architecture.\n *\n * PixiEngine provides a robust foundation for building casino games by managing:\n * - PixiJS application lifecycle\n * - Plugin registration and initialization with dependency resolution\n * - Data storage and retrieval\n * - Automatic window resizing\n * - Frame update loop integration\n *\n * ## Architecture\n *\n * The engine follows a plugin-based architecture where functionality is added through\n * plugins that implement the {@link EnginePlugin} interface. Plugins can:\n * - Depend on other plugins (dependency resolution)\n * - Have initialization priorities\n * - Hook into lifecycle events (initialize, ready, update, resize)\n *\n * ## Plugin Lifecycle\n *\n * 1. **REGISTERED** - Plugin is registered but not initialized\n * 2. **INITIALIZING** - Plugin's initialize() method is being called\n * 3. **INITIALIZED** - Plugin initialization complete\n * 4. **READY** - Plugin's onReady() called, fully operational\n * 5. **ERROR** - Plugin failed to initialize\n *\n * ## Usage Example\n *\n * ```typescript\n * // Create engine instance\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true\n * });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n * engine.registerPlugin(new GameStatePlugin());\n *\n * // Initialize engine (initializes all plugins)\n * await engine.initialize();\n *\n * // Access plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n *\n * // Store/retrieve data\n * engine.setData('playerScore', 1000);\n * const score = engine.getData<number>('playerScore');\n *\n * // Update loop (typically called by GSAP ticker)\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @category Engine\n * @public\n */\nexport class PixiEngine {\n private _pixiApp: PixiApplication;\n private plugins: Map<string, EnginePlugin> = new Map();\n private isInitialized: boolean = false;\n private pluginStates: Map<string, PluginState> = new Map();\n private readyPlugins: Set<string> = new Set();\n\n /**\n * Creates a new PixiEngine instance.\n *\n * The constructor creates the underlying PixiJS application but does not initialize it.\n * Call {@link initialize} after registering all plugins to start the engine.\n *\n * @param config - Engine configuration options extending PixiJS ApplicationOptions\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true,\n * resolution: window.devicePixelRatio\n * });\n * ```\n */\n constructor(protected config: Partial<EngineConfig>) {\n getLogger('PixiEngine').info('PixiEngine initializing with config', config);\n\n // Create Pixi Application\n this._pixiApp = new PixiApplication();\n\n getLogger('PixiEngine').info('PixiEngine initialized successfully');\n }\n\n /**\n * Registers a plugin with the engine.\n *\n * Plugins must be registered before calling {@link initialize}. If the engine is already\n * initialized, the plugin will be initialized immediately upon registration.\n *\n * The plugin's state is set to {@link PluginState.REGISTERED} and it will be initialized\n * during the engine's initialization phase based on its priority and dependencies.\n *\n * @param plugin - The plugin instance to register\n * @returns `true` if the plugin was successfully registered, `false` if a plugin with the same name already exists\n *\n * @example\n * ```typescript\n * const scenePlugin = new ScenePlugin();\n * const success = engine.registerPlugin(scenePlugin);\n *\n * if (!success) {\n * console.warn('Plugin already registered');\n * }\n * ```\n *\n * @see {@link EnginePlugin} for plugin interface details\n * @see {@link getPlugin} to retrieve registered plugins\n */\n public registerPlugin(plugin: EnginePlugin): boolean {\n if (this.plugins.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Plugin with name \"${plugin.name}\" is already registered.`);\n return false;\n }\n\n // Set initial state\n plugin.state = PluginState.REGISTERED;\n this.pluginStates.set(plugin.name, PluginState.REGISTERED);\n\n this.plugins.set(plugin.name, plugin);\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" registered`);\n\n // If the engine is already initialized, initialize the plugin immediately\n if (this.isInitialized) {\n this.initializePlugin(plugin);\n }\n\n return true;\n }\n\n /**\n * Checks if a plugin has completed initialization and is ready to use.\n *\n * A plugin is considered ready when it has successfully completed both its\n * `initialize()` and `onReady()` lifecycle methods.\n *\n * @param name - The name of the plugin to check\n * @returns `true` if the plugin is in the {@link PluginState.READY} state, `false` otherwise\n *\n * @example\n * ```typescript\n * if (engine.isPluginReady('ScenePlugin')) {\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * }\n * ```\n */\n public isPluginReady(name: string): boolean {\n return this.readyPlugins.has(name);\n }\n\n /**\n * Waits asynchronously for specific plugins to reach the ready state.\n *\n * This method is useful when you need to ensure certain plugins are fully initialized\n * before proceeding with game logic. It polls every 10ms until all specified plugins\n * are ready.\n *\n * @param pluginNames - Array of plugin names to wait for\n * @returns A promise that resolves when all specified plugins are ready\n *\n * @example\n * ```typescript\n * // Wait for multiple plugins before starting the game\n * await engine.waitForPlugins(['ScenePlugin', 'AudioPlugin', 'GameStatePlugin']);\n *\n * // Now safe to use these plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * ```\n *\n * @remarks\n * If any of the specified plugins are not registered, this method will wait indefinitely.\n * Ensure all required plugins are registered before calling this method.\n */\n public async waitForPlugins(pluginNames: string[]): Promise<void> {\n const checkPlugins = () => {\n return pluginNames.every((name) => this.isPluginReady(name));\n };\n\n if (checkPlugins()) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (checkPlugins()) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 10); // Check every 10ms\n });\n }\n\n /**\n * Initialize a single plugin with dependency checking\n */\n private async initializePlugin(plugin: EnginePlugin): Promise<void> {\n // Skip if already processed\n if (this.pluginStates.get(plugin.name) !== PluginState.REGISTERED) {\n return;\n }\n\n try {\n getLogger('PixiEngine').debug(`Initializing plugin: ${plugin.name}`);\n\n // Set state to initializing\n plugin.state = PluginState.INITIALIZING;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZING);\n\n // Initialize the plugin\n await plugin.initialize(this);\n\n // Set state to initialized\n plugin.state = PluginState.INITIALIZED;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZED);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" initialized successfully`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to initialize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n\n /**\n * Call onReady for all plugins after initialization is complete\n */\n private async finalizePlugins(): Promise<void> {\n const plugins = this.getPluginsSortedByPriorityAndDependencies();\n\n for (const plugin of plugins) {\n try {\n if (plugin.onReady) {\n getLogger('PixiEngine').debug(`Calling onReady for plugin: ${plugin.name}`);\n await plugin.onReady(this);\n }\n\n // Mark as ready\n plugin.state = PluginState.READY;\n this.pluginStates.set(plugin.name, PluginState.READY);\n this.readyPlugins.add(plugin.name);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" is now ready`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to finalize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n }\n\n /**\n * Initializes all plugins.\n */\n private async initializePlugins(): Promise<void> {\n // Initialize plugins in order based on their priority\n const sortedPlugins = this.getPluginsSortedByPriorityAndDependencies();\n getLogger('PixiEngine').info(`Initializing ${sortedPlugins.length} plugins`);\n\n // Initialize plugins sequentially based on dependencies\n for (const plugin of sortedPlugins) {\n await this.initializePlugin(plugin);\n }\n\n getLogger('PixiEngine').info('All plugins initialized and ready');\n }\n\n /**\n * Get plugins sorted by priority and dependency order\n */\n private getPluginsSortedByPriorityAndDependencies(): EnginePlugin[] {\n const plugins = Array.from(this.plugins.values());\n const resolved: EnginePlugin[] = [];\n const resolving = new Set<string>();\n const missingDependencies: string[] = [];\n\n const resolve = (plugin: EnginePlugin): void => {\n if (resolved.includes(plugin)) return;\n\n if (resolving.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Circular dependency detected for plugin: ${plugin.name}`);\n return;\n }\n\n resolving.add(plugin.name);\n\n // Resolve dependencies first\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n plugin.dependencies.forEach((depName) => {\n const depPlugin = this.plugins.get(depName);\n if (depPlugin) {\n resolve(depPlugin);\n } else {\n missingDependencies.push(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it's not registered`,\n );\n }\n });\n }\n\n resolving.delete(plugin.name);\n resolved.push(plugin);\n };\n\n // Sort by priority first (higher priority = lower number)\n const sortedByPriority = plugins.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n // Resolve dependencies\n sortedByPriority.forEach((plugin) => resolve(plugin));\n\n // Handle missing dependencies\n if (missingDependencies.length > 0) {\n const errorMessage = [\n '❌ Plugin dependency validation failed:',\n ...missingDependencies.map((msg) => ` • ${msg}`),\n '',\n '💡 Solutions:',\n ' • Register missing plugins before calling engine.initialize()',\n ' • Remove dependencies from plugin configuration',\n ' • Make dependencies optional in plugin code',\n ].join('\\n');\n\n getLogger('PixiEngine').error(errorMessage);\n throw new Error(`Missing plugin dependencies. Check console for details.`);\n }\n\n getLogger('PixiEngine').debug(\n 'Plugin initialization order:',\n resolved.map((p) => `${p.name}(priority:${p.priority})`),\n );\n\n return resolved;\n }\n\n /**\n * Initializes the engine and all registered plugins.\n *\n * This method performs the complete engine startup sequence:\n * 1. Initializes the PixiJS application with the provided configuration\n * 2. Appends the canvas to the document body\n * 3. Initializes all plugins in dependency order (respecting priorities)\n * 4. Calls `onReady()` on all plugins after initialization\n * 5. Sets up window resize event handling\n *\n * Plugins are initialized in order based on:\n * - Dependencies (plugins wait for their dependencies)\n * - Priority (lower numbers = higher priority)\n *\n * @returns A promise that resolves when the engine and all plugins are fully initialized\n * @throws {Error} If plugin dependencies are missing or circular dependencies are detected\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({ width: 1920, height: 1080 });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n *\n * // Initialize everything\n * await engine.initialize();\n *\n * // Engine is now ready to use\n * console.log('Engine initialized successfully');\n * ```\n *\n * @remarks\n * - This method should only be called once\n * - All plugins should be registered before calling this method\n * - The canvas will be automatically appended to `document.body`\n * - Window resize events are automatically handled\n */\n public async initialize(): Promise<void> {\n const width = this.config.width ?? 1920;\n const height = this.config.height ?? 1080;\n\n await this._pixiApp.init({\n width,\n height,\n antialias: true,\n autoStart: false,\n sharedTicker: false,\n useBackBuffer: true,\n autoDensity: false,\n ...this.config,\n });\n\n if (this.config.resizeTo || this.config.appendTo) {\n ((this.config.resizeTo || this.config.appendTo) as HTMLElement).appendChild(this._pixiApp.canvas);\n } else {\n document.body.appendChild(this._pixiApp.canvas);\n }\n\n getLogger('PixiEngine').info('Starting engine initialization');\n\n // Initialize all plugins (async)\n await this.initializePlugins();\n\n // Call onReady for all plugins after initialization\n await this.finalizePlugins();\n\n // Register window resize event handler\n window.onresize = () => {\n this.onResize();\n }\n\n // const resizeObserver = new ResizeObserver((entries) => {\n // for (const entry of entries) {\n // const { width, height } = entry.contentRect;\n // this.onResize(width, height);\n // }\n // });\n // resizeObserver.observe((this.config.resizeTo || this.config.appendTo || window.document.body) as Element);\n\n // Initialize the resize handling to set initial size\n this.onResize();\n\n getLogger('PixiEngine').info('Engine initialization completed');\n\n this.isInitialized = true;\n\n // Call onEngineReady hook for all plugins\n await this.notifyEngineReady();\n\n getLogger('PixiEngine').info('PixiEngine initialized');\n }\n\n /**\n * Handles window resize events and notifies plugins.\n *\n * This method is automatically called when the window is resized and during\n * engine initialization. It updates the renderer size and notifies all plugins\n * about the resize event in priority order.\n *\n * If a plugin's `onResize` method returns `true`, it indicates that the plugin\n * has handled the resize and propagation stops. Otherwise, the engine will\n * resize the renderer to match the window dimensions.\n *\n * @remarks\n * This is a private method called automatically by the engine.\n * Plugins can implement `onResize(width, height)` to handle custom resize logic.\n */\n private onResize(_width?: number, _height?: number): void {\n // Update renderer size\n const renderer = this._pixiApp.renderer as Renderer;\n\n // this._pixiApp.canvas.style.display = \"none\";\n\n // Simple responsive approach\n const width = _width ?? window.innerWidth;\n const height = _height ?? window.innerHeight;\n\n // this._pixiApp.canvas.style.display = \"block\";\n\n // Notify plugins about resize and control propagation\n const sortedPlugins = this.getPlugins();\n let handled = false;\n\n getLogger('PixiEngine').info(`Window resized: ${width}x${height}, dpr: ${renderer.resolution}`);\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onResize] && plugin[ENGINE_HOOKS.onResize](width, height, this.devicePixelRatio)) {\n // Plugin reported it has handled the resize, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Resize handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n // If no plugin handles the resize, the engine will handle it itself\n if (!handled) {\n renderer.resize(width, height);\n getLogger('PixiEngine').info(`Resized renderer to ${width}x${height}`);\n }\n }\n\n /**\n * Notifies all plugins that the engine is fully ready\n * This is called after all plugins are initialized and ready\n */\n private async notifyEngineReady(): Promise<void> {\n const sortedPlugins = this.getPlugins();\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onEngineReady]) {\n try {\n await plugin[ENGINE_HOOKS.onEngineReady](this);\n getLogger('PixiEngine').debug(`Plugin ${plugin.name} onEngineReady completed`);\n } catch (error) {\n getLogger('PixiEngine').error(`Plugin ${plugin.name} onEngineReady failed:`, error);\n }\n }\n }\n }\n\n /**\n * Retrieves a registered plugin by name with type safety.\n *\n * This method allows you to access registered plugins with proper TypeScript typing.\n * Returns `undefined` if the plugin is not found.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance if found, `undefined` otherwise\n *\n * @example\n * ```typescript\n * // Get plugin with type safety\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n *\n * if (scenePlugin) {\n * scenePlugin.loadScene('MainMenu');\n * } else {\n * console.warn('ScenePlugin not found');\n * }\n * ```\n *\n * @see {@link getPluginThrow} for a version that throws an error if plugin is not found\n */\n public getPlugin<T extends EnginePlugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /**\n * Retrieves a registered plugin by name, throwing an error if not found.\n *\n * This is a convenience method for cases where you expect the plugin to exist\n * and want to avoid null checks.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance\n * @throws {Error} If the plugin is not registered\n *\n * @example\n * ```typescript\n * // Get plugin or throw error\n * const scenePlugin = engine.getPluginThrow<ScenePlugin>('ScenePlugin');\n * scenePlugin.loadScene('MainMenu'); // No null check needed\n * ```\n *\n * @see {@link getPlugin} for a version that returns undefined instead of throwing\n */\n public getPluginThrow<T extends EnginePlugin>(name: string): T {\n const plugin = this.getPlugin<T>(name);\n if (!plugin) {\n throw new Error(`Plugin with name \"${name}\" is not registered.`);\n }\n return plugin;\n }\n\n\n\n /**\n * Gets all registered plugins sorted by priority.\n *\n * Returns an array of all plugins currently registered with the engine,\n * sorted by priority in descending order (highest priority first).\n *\n * @returns Array of all registered plugins sorted by priority\n *\n * @example\n * ```typescript\n * // List all registered plugins\n * const plugins = engine.getPlugins();\n * plugins.forEach(plugin => {\n * console.log(`Plugin: ${plugin.name}, Priority: ${plugin.priority}, State: ${plugin.state}`);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Find plugins by type\n * const plugins = engine.getPlugins();\n * const scenePlugins = plugins.filter(p => p.name.includes('Scene'));\n * ```\n *\n * @remarks\n * Plugins with undefined priority are treated as having priority 0.\n * Lower priority numbers mean higher priority (e.g., priority 1 comes before priority 10).\n */\n public getPlugins(): EnginePlugin[] {\n return Array.from(this.plugins.values()).sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n /**\n * Updates the plugins\n * @param deltaTime Frame duration\n */\n private updatePlugins(deltaTime: number): void {\n // Call plugins in order of their priority\n const sortedPlugins = this.getPlugins();\n\n let handled = false;\n for (const plugin of sortedPlugins) {\n if (plugin.onUpdate && plugin.onUpdate(deltaTime)) {\n // Plugin reported it has handled the update, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Update cycle handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n if (!handled) {\n // If no plugin handled the update, default behavior could be placed here\n // Currently there is no need for special handling\n }\n }\n\n /**\n * Main update loop called every frame.\n *\n * This method should be called from your game's main loop (typically GSAP ticker)\n * to update all plugins. Plugins are updated in priority order, and update\n * propagation stops if a plugin returns `true` from its `onUpdate` method.\n *\n * @param deltaTime - Time elapsed since the last frame in seconds\n *\n * @example\n * ```typescript\n * // Integrate with GSAP ticker\n * import { gsap } from 'gsap';\n *\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Manual update loop\n * let lastTime = performance.now();\n *\n * function gameLoop() {\n * const currentTime = performance.now();\n * const deltaTime = (currentTime - lastTime) / 1000;\n * lastTime = currentTime;\n *\n * engine.onUpdate(deltaTime);\n * requestAnimationFrame(gameLoop);\n * }\n *\n * gameLoop();\n * ```\n *\n * @remarks\n * The deltaTime is typically provided in seconds by GSAP ticker.\n * Plugins with higher priority (lower priority number) are updated first.\n */\n public onUpdate(deltaTime: number): void {\n // Update the plugins with the given delta time\n this.updatePlugins(deltaTime);\n }\n\n /**\n * Gets the underlying PixiJS Application instance.\n *\n * Provides direct access to the PixiJS application for advanced use cases\n * such as accessing the renderer, ticker, or other PixiJS-specific features.\n *\n * @returns The PixiJS Application instance\n *\n * @example\n * ```typescript\n * // Access the renderer\n * const renderer = engine.pixiApp.renderer;\n * console.log('Renderer type:', renderer.type);\n *\n * // Access the ticker\n * engine.pixiApp.ticker.add((delta) => {\n * console.log('Ticker delta:', delta);\n * });\n * ```\n *\n * @remarks\n * Use this getter sparingly. Most functionality should be accessed through\n * plugins or the engine's public API.\n */\n public get pixiApp(): PixiApplication {\n return this._pixiApp;\n }\n\n public get platform(): PlatformType {\n return isMobile.any ? 'mobile' : 'desktop';\n }\n\n /**\n * Gets the device pixel ratio, capped at 2 for performance reasons.\n * \n * @returns The device pixel ratio, capped at 2\n */\n public get devicePixelRatio() {\n return Math.min(window.devicePixelRatio ?? 1, 2);\n }\n}\n"]}
|