alepha 0.19.2 → 0.19.3

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.
Files changed (61) hide show
  1. package/dist/api/jobs/index.d.ts +24 -24
  2. package/dist/api/jobs/index.d.ts.map +1 -1
  3. package/dist/api/jobs/index.js +10 -4
  4. package/dist/api/jobs/index.js.map +1 -1
  5. package/dist/api/keys/index.d.ts +5 -5
  6. package/dist/api/users/index.d.ts +9 -19
  7. package/dist/api/users/index.d.ts.map +1 -1
  8. package/dist/api/verifications/index.d.ts +13 -13
  9. package/dist/cli/config/index.d.ts +6 -28
  10. package/dist/cli/config/index.d.ts.map +1 -1
  11. package/dist/cli/config/index.js +5 -10
  12. package/dist/cli/config/index.js.map +1 -1
  13. package/dist/cli/core/index.d.ts +11653 -208
  14. package/dist/cli/core/index.d.ts.map +1 -1
  15. package/dist/cli/core/index.js +48 -12
  16. package/dist/cli/core/index.js.map +1 -1
  17. package/dist/cli/devtools/index.d.ts +5 -0
  18. package/dist/cli/devtools/index.d.ts.map +1 -1
  19. package/dist/cli/devtools/index.js +4 -0
  20. package/dist/cli/devtools/index.js.map +1 -1
  21. package/dist/cli/platform/index.d.ts +69 -64
  22. package/dist/cli/platform/index.d.ts.map +1 -1
  23. package/dist/cli/platform/index.js +6 -2
  24. package/dist/cli/platform/index.js.map +1 -1
  25. package/dist/cli/vendor/index.d.ts +7 -2
  26. package/dist/cli/vendor/index.d.ts.map +1 -1
  27. package/dist/cli/vendor/index.js +6 -2
  28. package/dist/cli/vendor/index.js.map +1 -1
  29. package/dist/core/index.browser.js.map +1 -1
  30. package/dist/core/index.d.ts.map +1 -1
  31. package/dist/core/index.js +4 -0
  32. package/dist/core/index.js.map +1 -1
  33. package/dist/core/index.native.js +4 -0
  34. package/dist/core/index.native.js.map +1 -1
  35. package/dist/core/index.workerd.js +4 -0
  36. package/dist/core/index.workerd.js.map +1 -1
  37. package/dist/logger/index.d.ts.map +1 -1
  38. package/dist/logger/index.js +1 -1
  39. package/dist/logger/index.js.map +1 -1
  40. package/dist/orm/core/index.bun.js +25 -56
  41. package/dist/orm/core/index.bun.js.map +1 -1
  42. package/dist/orm/core/index.d.ts +9 -19
  43. package/dist/orm/core/index.d.ts.map +1 -1
  44. package/dist/orm/core/index.js +25 -56
  45. package/dist/orm/core/index.js.map +1 -1
  46. package/dist/orm/postgres/index.d.ts +2 -1
  47. package/dist/orm/postgres/index.d.ts.map +1 -1
  48. package/package.json +6 -6
  49. package/src/api/jobs/providers/JobProvider.ts +10 -6
  50. package/src/cli/config/defineConfig.ts +17 -46
  51. package/src/cli/core/providers/ViteDevServerProvider.ts +45 -3
  52. package/src/cli/core/services/PackageManagerUtils.ts +3 -1
  53. package/src/cli/core/services/ProjectScaffolder.ts +5 -5
  54. package/src/cli/core/templates/agentMd.ts +14 -5
  55. package/src/cli/devtools/index.ts +21 -1
  56. package/src/cli/platform/index.ts +23 -2
  57. package/src/cli/vendor/index.ts +20 -3
  58. package/src/core/Alepha.ts +10 -0
  59. package/src/logger/index.ts +6 -1
  60. package/src/orm/core/providers/DrizzleKitProvider.ts +56 -105
  61. package/tsconfig.base.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":";;;;;cAEa,cAAA,WAAc,OAAA;SAWzB,QAAA,CAAA,OAAA;;;;;;;;;KAEU,QAAA,GAAW,MAAA,QAAc,cAAA;;;uBCbf,sBAAA;EAAA,SACJ,KAAA,CAAM,OAAA,UAAiB,KAAA,EAAO,QAAA;AAAA;;;uBCD1B,oBAAA;EAAA,SACJ,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA;;;cCSnB,MAAA,YAAkB,eAAA;EAAA,mBACV,MAAA,EAAM,MAAA;EAAA,mBACN,SAAA,EAAS,oBAAA;EAAA,mBACT,WAAA,EAAW,sBAAA;EAAA,mBACX,gBAAA,EAAgB,gBAAA;EAAA,mBAEhB,MAAA,EAAQ,MAAA;EAAA,mBASR,OAAA;EAAA,mBACA,MAAA;EAAA,mBACA,GAAA;EAAA,UAET,WAAA;EAAA,UACA,QAAA,EAAU,QAAA;cAER,OAAA,UAAiB,MAAA;EAAA,IAMlB,OAAA,CAAA;EAAA,IAIA,KAAA,CAAA;EASJ,UAAA,CAAW,KAAA,UAAe,GAAA,WAAc,QAAA;EAAA,UA4CrC,cAAA,CAAe,UAAA,UAAoB,OAAA;EAWtC,UAAA,CAAW,SAAA,WAAoB,QAAA;EAW/B,KAAA,CAAM,OAAA,UAAiB,IAAA;EAIvB,IAAA,CAAK,OAAA,UAAiB,IAAA;EAItB,IAAA,CAAK,OAAA,UAAiB,IAAA;EAItB,KAAA,CAAM,OAAA,UAAiB,IAAA;EAIvB,KAAA,CAAM,OAAA,UAAiB,IAAA;EAAA,UAIpB,GAAA,CAAI,KAAA,EAAO,QAAA,EAAU,OAAA,UAAiB,IAAA;EAAA,UAsCtC,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAA;AAAA;;;;;;AH/KlC;;;;;;;;;;;;;;;;cIoBa,OAAA;EAAA,WAAoB,sBAAA,GAA8B,MAAA;EAAA;;UAY9C,sBAAA;EACf,IAAA;AAAA;;;cCjCW,oBAAA;EAAA,gBACK,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;qBA4BG,MAAA,EAAM,MAAA;EAAA,UAEf,OAAA;;EAMH,SAAA,CAAA;EAgBA,GAAA,CACL,KAAA,eAAoB,oBAAA,CAAqB,MAAA,EACzC,IAAA,UACA,KAAA;AAAA;;;cCxDS,0BAAA,SAAmC,sBAAA;EACvC,KAAA,CAAM,OAAA;AAAA;;;cCAF,qBAAA,SAA8B,oBAAA;EAClC,MAAA,CAAO,KAAA,EAAO,QAAA;EAoBd,eAAA,CAAgB,KAAA,EAAO,KAAA;AAAA;;;cCrBnB,yBAAA,SAAkC,sBAAA;EAAA,UACnC,OAAA,EAAS,KAAA,CAAM,QAAA;IAAa,SAAA;EAAA;EAAA,SAEtB,OAAA;;;EAIT,KAAA,CAAM,SAAA,UAAmB,KAAA,EAAO,QAAA;EAAA,IAU5B,IAAA,CAAA;;;;;;;;;;;;EAIJ,KAAA,CAAA;AAAA;;;cCnBI,uBAAA,SAAgC,oBAAA;EAAA,UACjC,KAAA,EAAK,oBAAA;EAAA,UACL,MAAA,EAAM,MAAA;EAET,MAAA,CAAO,KAAA,EAAO,QAAA;EA8Ed,eAAA,CAAgB,SAAA;EAAA,UAUb,IAAA,GAAQ,CAAA;EAAA,UACR,IAAA,GAAQ,CAAA;;;;YAMR,aAAA,CAAc,OAAA;EAAA,UAQd,WAAA,CAAY,KAAA,EAAO,KAAA;AAAA;;;;;;;;;;;;;;;;;;cCrElB,YAAA,EAAY,QAAA,CAAA,OAAA,CA0GvB,QAAA,CA1GuB,MAAA;AAAA,cA8GnB,SAAA,WAAS,OAAA;;;;;;;;;;4BAwDb,QAAA,CAAA,OAAA;;;;;;AVlMF;;;;;;;;ACbA;;;;EACkB;;;;;;;;;YSmNC,GAAA,SAAY,OAAA,CAAQ,MAAA,QAAc,SAAA;EAAA,UAElC,KAAA;IRrNqB;;;IQyNpC,qBAAA;EAAA;EAAA,UAGe,KAAA;IACf,GAAA;MACE,OAAA;MACA,KAAA,EAAO,QAAA;IAAA;EAAA;AAAA"}
@@ -452,7 +452,7 @@ const AlephaLogger = $module({
452
452
  lifetime: "transient",
453
453
  args: ["Alepha", "alepha.core"]
454
454
  }));
455
- alepha.store.set("alepha.logger.level", logLevel ?? (alepha.isTest() ? "trace" : "info"));
455
+ alepha.store.set("alepha.logger.level", logLevel ?? (alepha.isTest() ? "trace" : alepha.isProduction() && alepha.isBrowser() ? "warn" : "info"));
456
456
  }
457
457
  });
458
458
  const envSchema = t.object({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n if (env.DEBUG === \"1\" || env.DEBUG === \"true\") {\n logLevel ??= \"trace\";\n } else {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n }\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ?? (alepha.isTest() ? \"trace\" : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n if (env.DEBUG === \"1\" || env.DEBUG === \"true\") {\n logLevel ??= \"trace\";\n } else {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n }\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ??\n (alepha.isTest()\n ? \"trace\"\n : alepha.isProduction() && alepha.isBrowser()\n ? \"warn\"\n : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}
@@ -162,7 +162,7 @@ var DrizzleKitProvider = class {
162
162
  }
163
163
  if (this.alepha.isTest()) {
164
164
  const { statements } = await this.generateMigration(provider);
165
- await this.executeFallbackStatements(statements, provider);
165
+ await this.executeStatements(statements.map((s) => s.replace(/^CREATE SCHEMA /i, "CREATE SCHEMA IF NOT EXISTS ")), provider);
166
166
  return;
167
167
  }
168
168
  const now = this.dateTime.nowMillis();
@@ -178,7 +178,7 @@ var DrizzleKitProvider = class {
178
178
  } catch (error) {
179
179
  this.log.debug("Push sync not available, falling back to migration generation", { error });
180
180
  const { statements } = await this.generateMigration(provider);
181
- await this.executeFallbackStatements(statements, provider);
181
+ await this.executeStatementsLenient(statements, provider);
182
182
  }
183
183
  this.log.info(`Synchronization of '${provider.name}' OK [${this.dateTime.nowMillis() - now}ms]`);
184
184
  }
@@ -279,10 +279,10 @@ var DrizzleKitProvider = class {
279
279
  hasDataLoss: false
280
280
  };
281
281
  let result;
282
- if (provider.dialect === "sqlite") result = await this.muteSpinner(() => kit.pushSQLiteSchema(models, provider.db));
282
+ if (provider.dialect === "sqlite") result = await kit.pushSQLiteSchema(models, provider.db);
283
283
  else {
284
284
  const wrappedDb = this.wrapDbForDrizzleKit(provider.db);
285
- result = await this.muteSpinner(() => kit.pushSchema(models, wrappedDb, [provider.schema]));
285
+ result = await kit.pushSchema(models, wrappedDb, [provider.schema]);
286
286
  }
287
287
  return {
288
288
  statements: result.statementsToExecute,
@@ -291,8 +291,8 @@ var DrizzleKitProvider = class {
291
291
  };
292
292
  }
293
293
  async pushSqlite(kit, models, provider) {
294
- const result = await this.muteSpinner(() => kit.pushSQLiteSchema(models, provider.db));
295
- await this.runPushResult(result, provider);
294
+ const { statementsToExecute } = await kit.pushSQLiteSchema(models, provider.db);
295
+ await this.executeStatements(statementsToExecute, provider);
296
296
  }
297
297
  /**
298
298
  * Push schema changes to PostgreSQL using Drizzle Kit's pushSchema with schema filters.
@@ -300,39 +300,32 @@ var DrizzleKitProvider = class {
300
300
  async pushPostgres(kit, models, provider) {
301
301
  if (provider.schema !== "public") await this.createSchemaIfNotExists(provider, provider.schema);
302
302
  const wrappedDb = this.wrapDbForDrizzleKit(provider.db);
303
- const result = await this.muteSpinner(() => kit.pushSchema(models, wrappedDb, [provider.schema]));
304
- await this.runPushResult(result, provider);
303
+ const { statementsToExecute } = await kit.pushSchema(models, wrappedDb, [provider.schema]);
304
+ await this.executeStatements(statementsToExecute, provider);
305
305
  }
306
306
  /**
307
- * Run the statements returned by Drizzle Kit's pushSchema, with safety filters and logging.
307
+ * Execute a list of SQL statements against the provider.
308
308
  */
309
- async runPushResult(result, provider) {
310
- const safe = result.statementsToExecute.filter((s) => {
311
- const upper = s.trimStart().toUpperCase();
312
- if (upper.startsWith("DROP SCHEMA") || upper.startsWith("DROP TABLE")) {
313
- this.log.warn("Skipping destructive statement", { statement: s });
314
- return false;
315
- }
316
- return true;
317
- });
318
- if (result.hasDataLoss) this.log.warn("Push would cause data loss", {
319
- warnings: result.warnings,
320
- statements: result.statementsToExecute
321
- });
322
- if (safe.length > 0) {
323
- this.log.debug(`Pushing ${safe.length} statements ...`, { statements: safe });
324
- for (const statement of safe) await provider.execute(sql$1.raw(statement));
325
- }
309
+ async executeStatements(statements, provider) {
310
+ if (statements.length > 0) this.log.debug(`Executing ${statements.length} statements ...`, { statements });
311
+ for (const statement of statements) await provider.execute(sql$1.raw(statement));
326
312
  }
327
313
  /**
328
- * Execute migration statements as a fallback when push sync is not available.
329
- * Used for drivers that don't support Drizzle Kit introspection (e.g. PgLite).
314
+ * Execute SQL statements, ignoring "already exists" errors.
315
+ *
316
+ * Used by the fallback migration path where push may have partially
317
+ * applied changes before erroring, leaving some objects already created.
330
318
  */
331
- async executeFallbackStatements(statements, provider) {
332
- for (const statement of statements) {
333
- const upper = statement.trimStart().toUpperCase();
334
- if (upper.startsWith("DROP SCHEMA") || upper.startsWith("CREATE SCHEMA")) continue;
319
+ async executeStatementsLenient(statements, provider) {
320
+ if (statements.length > 0) this.log.debug(`Executing ${statements.length} statements (lenient) ...`, { statements });
321
+ for (const statement of statements) try {
335
322
  await provider.execute(sql$1.raw(statement));
323
+ } catch (error) {
324
+ if ((error?.message ?? "").includes("already exists")) {
325
+ this.log.debug(`Skipped (already exists): ${statement.slice(0, 80)}`);
326
+ continue;
327
+ }
328
+ throw error;
336
329
  }
337
330
  }
338
331
  async createSchemaIfNotExists(provider, schemaName) {
@@ -363,30 +356,6 @@ var DrizzleKitProvider = class {
363
356
  } });
364
357
  }
365
358
  /**
366
- * Suppress Drizzle Kit's spinner output during a callback.
367
- *
368
- * Drizzle Kit uses hanji's renderWithTask with a setInterval-based spinner.
369
- * If the wrapped task throws, the interval is never cleared and leaks
370
- * spinner frames to stdout. We keep the filter active until the next
371
- * tick after the promise settles to catch any straggling writes.
372
- */
373
- async muteSpinner(fn) {
374
- const originalWrite = process.stdout.write;
375
- const filter = (chunk, ...args) => {
376
- const str = typeof chunk === "string" ? chunk : chunk?.toString?.() ?? "";
377
- if (str.includes("Pulling schema from database")) return true;
378
- if (str.includes("\x1B[1A")) return true;
379
- return originalWrite.call(process.stdout, chunk, ...args);
380
- };
381
- process.stdout.write = filter;
382
- try {
383
- return await fn();
384
- } finally {
385
- await new Promise((r) => setTimeout(r, 200));
386
- process.stdout.write = originalWrite;
387
- }
388
- }
389
- /**
390
359
  * Try to load the official Drizzle Kit API.
391
360
  */
392
361
  importDrizzleKit() {