@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 9.55 kB
Source Map (JSON)
{"version":3,"file":"logger.mjs","names":[],"sources":["../../../src/libs/cli/logger.ts"],"sourcesContent":["import picocolors from \"picocolors\";\nimport { ZodError } from \"zod\";\n\nconst symbols = {\n\ttick: { icon: \"✓\", color: picocolors.green },\n\tcross: { icon: \"×\", color: picocolors.red },\n\twarning: { icon: \"!\", color: picocolors.yellow },\n\tinfo: { icon: \"i\", color: picocolors.blue },\n\tbullet: { icon: \"•\", color: picocolors.gray },\n\tchild: { icon: \"↳\", color: picocolors.gray },\n\tline: { icon: \"┃\", color: picocolors.gray },\n\thalfCircle: { icon: \"◐\", color: picocolors.yellow },\n} as const;\n\ntype SymbolKey = keyof typeof symbols;\n\ninterface LogConfig {\n\tsymbol?: SymbolKey | string;\n\tindent?: number;\n\tspaceBefore?: boolean;\n\tspaceAfter?: boolean;\n\tsilent?: boolean;\n}\n\ninterface PrintConfig extends LogConfig {\n\tdefaultSymbol?: SymbolKey;\n\toutput?: \"stdout\" | \"stderr\";\n}\n\nconst printMessage = (parts: string[], config: PrintConfig) => {\n\tconst {\n\t\tsymbol,\n\t\tindent = 0,\n\t\tspaceBefore = false,\n\t\tspaceAfter = false,\n\t\tdefaultSymbol,\n\t\tsilent = false,\n\t\toutput = \"stdout\",\n\t} = config;\n\n\tconst print = (message?: string) => {\n\t\tif (output === \"stderr\") console.error(message ?? \"\");\n\t\telse console.log(message ?? \"\");\n\t};\n\n\tif (spaceBefore && silent !== true) print();\n\n\tconst indentStr = \" \".repeat(indent);\n\n\tconst resolvedSymbol = symbol\n\t\t? (symbols[symbol as SymbolKey] ?? {\n\t\t\t\ticon: symbol,\n\t\t\t\tcolor: (s: string) => s,\n\t\t\t})\n\t\t: defaultSymbol\n\t\t\t? symbols[defaultSymbol]\n\t\t\t: undefined;\n\n\tconst prefix = resolvedSymbol\n\t\t? `${resolvedSymbol.color(resolvedSymbol.icon)} `\n\t\t: \"\";\n\n\tconst message = parts.join(\" \");\n\n\tif (silent !== true) print(`${indentStr}${prefix}${message}`);\n\n\tif (spaceAfter && silent !== true) print();\n};\n\nconst isConfig = (arg: unknown): arg is LogConfig => {\n\treturn (\n\t\ttypeof arg === \"object\" &&\n\t\targ !== null &&\n\t\t(\"symbol\" in arg ||\n\t\t\t\"indent\" in arg ||\n\t\t\t\"spaceBefore\" in arg ||\n\t\t\t\"spaceAfter\" in arg ||\n\t\t\t\"silent\" in arg)\n\t);\n};\n\nconst info = (...args: Array<string | LogConfig>) => {\n\tconst config = args.find(isConfig) ?? {};\n\tconst parts = args.filter((arg): arg is string => typeof arg === \"string\");\n\n\tprintMessage(parts, {\n\t\t...config,\n\t\tdefaultSymbol: \"info\",\n\t});\n};\n\nconst error = (...args: Array<string | LogConfig>) => {\n\tconst config = args.find(isConfig) ?? {};\n\tconst parts = args\n\t\t.filter((arg): arg is string => typeof arg === \"string\")\n\t\t.map((part) => picocolors.red(part));\n\n\tprintMessage(parts, {\n\t\t...config,\n\t\tdefaultSymbol: \"cross\",\n\t\toutput: \"stderr\",\n\t});\n};\n\nconst warn = (...args: Array<string | LogConfig>) => {\n\tconst config = args.find(isConfig) ?? {};\n\tconst parts = args.filter((arg): arg is string => typeof arg === \"string\");\n\n\tprintMessage(parts, {\n\t\t...config,\n\t\tdefaultSymbol: \"warning\",\n\t});\n};\n\nconst log = (...args: Array<string | LogConfig>) => {\n\tconst config = args.find(isConfig) ?? {};\n\tconst parts = args.filter((arg): arg is string => typeof arg === \"string\");\n\n\tprintMessage(parts, {\n\t\t...config,\n\t});\n};\n\nconst success = (...args: Array<string | LogConfig>) => {\n\tconst config = args.find(isConfig) ?? {};\n\tconst parts = args.filter((arg): arg is string => typeof arg === \"string\");\n\n\tprintMessage(parts, {\n\t\t...config,\n\t\tdefaultSymbol: \"tick\",\n\t});\n};\n\nconst formatMilliseconds = (milliseconds: number): string => {\n\tif (milliseconds < 1000) {\n\t\treturn `${Math.round(milliseconds)}ms`;\n\t}\n\treturn `${(milliseconds / 1000).toFixed(2)}s`;\n};\n\nconst startTimer = () => {\n\tconst start = process.hrtime.bigint();\n\n\treturn () => {\n\t\tconst end = process.hrtime.bigint();\n\t\tconst diff = Number(end - start);\n\t\treturn diff / 1_000_000;\n\t};\n};\n\nconst createBadge = (\n\ttext: string,\n\tbackgroundColor?: (str: string) => string,\n\tforegroundColor?: (str: string) => string,\n): string => {\n\tconst bg = backgroundColor ?? picocolors.bgGreenBright;\n\tconst fg = foregroundColor ?? picocolors.black;\n\n\treturn bg(fg(` ${text} `));\n};\n\nconst formatBytes = (bytes: number): string => {\n\tif (bytes === 0) return \"0 B\";\n\n\tconst k = 1024;\n\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn `${(bytes / k ** i).toFixed(2)} ${sizes[i]}`;\n};\n\nconst printErrorLine = (\n\tmessage: string,\n\tconfig: Pick<PrintConfig, \"indent\" | \"symbol\">,\n) => {\n\tprintMessage([message], {\n\t\t...config,\n\t\toutput: \"stderr\",\n\t});\n};\n\nconst printErrorDetail = (message: string) => {\n\tconst [firstLine = \"\", ...remainingLines] = message.split(\"\\n\");\n\tprintErrorLine(firstLine, { indent: 2, symbol: \"child\" });\n\n\tfor (const line of remainingLines) {\n\t\tprintErrorLine(line, { indent: 4 });\n\t}\n};\n\nconst formatZodIssuePath = (path: PropertyKey[]) => {\n\treturn path.reduce<string>((formattedPath, segment) => {\n\t\tconst value = String(segment);\n\n\t\tif (typeof segment === \"number\") {\n\t\t\treturn `${formattedPath}[${value}]`;\n\t\t}\n\t\tif (formattedPath.length === 0) {\n\t\t\treturn value;\n\t\t}\n\t\treturn `${formattedPath}.${value}`;\n\t}, \"\");\n};\n\nconst errorInstance = (error: Error, heading?: string) => {\n\tif (error instanceof ZodError) {\n\t\tlogger.error(heading ?? \"Validation Error\");\n\n\t\tfor (const issue of error.issues) {\n\t\t\tconst path = formatZodIssuePath(issue.path);\n\t\t\tprintErrorDetail(path ? `${path}: ${issue.message}` : issue.message);\n\t\t}\n\t\treturn;\n\t}\n\n\tlogger.error(heading ?? error.name);\n\tprintErrorDetail(error.message);\n\n\tif (!error.stack) return;\n\n\tconst stackLines = error.stack.split(\"\\n\").slice(1, 3);\n\tfor (const line of stackLines) {\n\t\tprintErrorLine(logger.color.gray(line.trim()), { indent: 4 });\n\t}\n};\n\nconst logger = {\n\tinfo,\n\terror,\n\twarn,\n\tlog,\n\tsuccess,\n\tcolor: picocolors,\n\tsymbols,\n\tformatMilliseconds,\n\tstartTimer,\n\tcreateBadge,\n\tformatBytes,\n\terrorInstance,\n};\n\nexport type CLILogger = typeof logger;\n\nexport default logger;\n"],"mappings":"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"}