logsdx
Version:
log streaming with dx on the ðŸ§
861 lines (858 loc) • 27 kB
JavaScript
// src/themes/asci/loader.ts
import { readFileSync } from "fs";
import { resolve } from "path";
import { homedir } from "os";
// src/themes/asci/styles.ts
import chalk from "chalk";
import JSON5 from "json5";
chalk.level = 3;
var THEMES = {
default: {
name: "default",
levels: {
error: { color: "red", bold: true },
warn: { color: "yellow" },
info: { color: "blue" },
debug: { color: "gray", dim: true },
success: { color: "green" },
trace: { color: "white", dim: true }
},
fields: {
timestamp: { color: "gray" },
service: { color: "cyan" },
action: { color: "magenta" },
user: { color: "blue" },
duration: { color: "yellow" },
requestId: { color: "gray" },
correlationId: { color: "gray" },
environment: { color: "green" },
version: { color: "magenta" },
method: { color: "cyan" },
path: { color: "white" },
statusCode: { color: "yellow" },
ip: { color: "gray" },
userAgent: { color: "gray", dim: true }
},
status: {
success: { color: "green" },
failure: { color: "red" },
error: { color: "red" },
pending: { color: "yellow" },
cancelled: { color: "gray" },
timeout: { color: "red" }
},
patterns: {
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "red",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "yellow" },
success: { regex: /\b(success|succeeded|completed)\b/i, color: "green" },
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "cyan"
},
url: { regex: /https?:\/\/[^\s]+/, color: "blue", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "gray" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "blue" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "magenta"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "gray"
},
json: { regex: /\{.*\}|\[.*\]/, color: "white" }
},
elements: {
brackets: { color: "yellow" },
keyValue: {
key: { color: "cyan" },
separator: { color: "gray" },
value: { color: "white" }
}
}
},
dark: {
name: "dark",
levels: {
error: { color: "#ff5555", bold: true },
warn: { color: "#ffb86c" },
info: { color: "#8be9fd" },
debug: { color: "#6272a4", dim: true },
success: { color: "#50fa7b" },
trace: { color: "#f8f8f2", dim: true }
},
fields: {
timestamp: { color: "#6272a4" },
service: { color: "#8be9fd" },
action: { color: "#bd93f9" },
user: { color: "#8be9fd" },
duration: { color: "#ffb86c" },
requestId: { color: "#6272a4" },
correlationId: { color: "#6272a4" },
environment: { color: "#50fa7b" },
version: { color: "#bd93f9" },
method: { color: "#8be9fd" },
path: { color: "#f8f8f2" },
statusCode: { color: "#ffb86c" },
ip: { color: "#6272a4" },
userAgent: { color: "#6272a4", dim: true }
},
status: {
success: { color: "#50fa7b" },
failure: { color: "#ff5555" },
error: { color: "#ff5555" },
pending: { color: "#ffb86c" },
cancelled: { color: "#6272a4" },
timeout: { color: "#ff5555" }
},
patterns: {
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "#ff5555",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "#ffb86c" },
success: {
regex: /\b(success|succeeded|completed)\b/i,
color: "#50fa7b"
},
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "#8be9fd"
},
url: { regex: /https?:\/\/[^\s]+/, color: "#8be9fd", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "#6272a4" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "#8be9fd" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "#bd93f9"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "#6272a4"
},
json: { regex: /\{.*\}|\[.*\]/, color: "#f8f8f2" }
},
elements: {
brackets: { color: "#6272a4" },
keyValue: {
key: { color: "#8be9fd" },
separator: { color: "#6272a4" },
value: { color: "#f8f8f2" }
}
}
},
light: {
name: "light",
levels: {
error: { color: "#d32f2f", bold: true },
warn: { color: "#f57c00" },
info: { color: "#1976d2" },
debug: { color: "#757575", dim: true },
success: { color: "#388e3c" },
trace: { color: "#212121", dim: true }
},
fields: {
timestamp: { color: "#757575" },
service: { color: "#0097a7" },
action: { color: "#7b1fa2" },
user: { color: "#1976d2" },
duration: { color: "#f57c00" },
requestId: { color: "#757575" },
correlationId: { color: "#757575" },
environment: { color: "#388e3c" },
version: { color: "#7b1fa2" },
method: { color: "#0097a7" },
path: { color: "#212121" },
statusCode: { color: "#f57c00" },
ip: { color: "#757575" },
userAgent: { color: "#757575", dim: true }
},
status: {
success: { color: "#388e3c" },
failure: { color: "#d32f2f" },
error: { color: "#d32f2f" },
pending: { color: "#f57c00" },
cancelled: { color: "#757575" },
timeout: { color: "#d32f2f" }
},
patterns: {
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "#d32f2f",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "#f57c00" },
success: {
regex: /\b(success|succeeded|completed)\b/i,
color: "#388e3c"
},
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "#0097a7"
},
url: { regex: /https?:\/\/[^\s]+/, color: "#1976d2", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "#757575" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "#1976d2" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "#7b1fa2"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "#757575"
},
json: { regex: /\{.*\}|\[.*\]/, color: "#212121" }
},
elements: {
brackets: { color: "#757575" },
keyValue: {
key: { color: "#0097a7" },
separator: { color: "#757575" },
value: { color: "#212121" }
}
}
},
minimal: {
name: "minimal",
levels: {
error: { color: "red" },
warn: { color: "yellow" },
info: { color: "white" },
debug: { color: "gray", dim: true },
success: { color: "green" },
trace: { color: "gray", dim: true }
},
fields: {
timestamp: { color: "gray" },
service: { color: "white" },
action: { color: "white" },
user: { color: "white" },
duration: { color: "white" },
requestId: { color: "gray" },
correlationId: { color: "gray" },
environment: { color: "white" },
version: { color: "white" },
method: { color: "white" },
path: { color: "white" },
statusCode: { color: "white" },
ip: { color: "gray" },
userAgent: { color: "gray", dim: true }
},
status: {
success: { color: "green" },
failure: { color: "red" },
error: { color: "red" },
pending: { color: "yellow" },
cancelled: { color: "gray" },
timeout: { color: "red" }
},
patterns: {
error: { regex: /\b(error|exception|failed|failure)\b/i, color: "red" },
warning: { regex: /\b(warning|warn|caution)\b/i, color: "yellow" },
success: { regex: /\b(success|succeeded|completed)\b/i, color: "green" },
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "white"
},
url: { regex: /https?:\/\/[^\s]+/, color: "white" },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "gray" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "white" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "white"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "gray"
},
json: { regex: /\{.*\}|\[.*\]/, color: "white" }
},
elements: {
brackets: { color: "gray" },
keyValue: {
key: { color: "white" },
separator: { color: "gray" },
value: { color: "white" }
}
}
},
dracula: {
name: "dracula",
levels: {
error: { color: "#ff5555", bold: true },
// Red
warn: { color: "#f1fa8c" },
// Yellow
info: { color: "#8be9fd" },
// Cyan
debug: { color: "#6272a4", dim: true },
// Comment Purple
success: { color: "#50fa7b" },
// Green
trace: { color: "#f8f8f2", dim: true }
// Foreground
},
fields: {
timestamp: { color: "#6272a4" },
service: { color: "#ff79c6" },
// Pink
action: { color: "#bd93f9" },
// Purple
user: { color: "#8be9fd" },
// Cyan (Placeholder - adjust if needed)
duration: { color: "#f1fa8c" },
// Yellow
requestId: { color: "#6272a4" },
correlationId: { color: "#6272a4" },
environment: { color: "#50fa7b" },
// Green
version: { color: "#bd93f9" },
// Purple
method: { color: "#8be9fd" },
// Cyan
path: { color: "#f8f8f2" },
// Foreground
statusCode: { color: "#ffb86c" },
// Orange
ip: { color: "#6272a4" },
userAgent: { color: "#6272a4", dim: true }
},
status: {
success: { color: "#50fa7b" },
failure: { color: "#ff5555" },
error: { color: "#ff5555" },
pending: { color: "#f1fa8c" },
cancelled: { color: "#6272a4" },
timeout: { color: "#ff5555" }
},
patterns: {
// Colors adjusted to match Dracula
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "#ff5555",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "#f1fa8c" },
success: {
regex: /\b(success|succeeded|completed)\b/i,
color: "#50fa7b"
},
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "#8be9fd"
},
url: { regex: /https?:\/\/[^\s]+/, color: "#8be9fd", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "#6272a4" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "#8be9fd" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "#bd93f9"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "#6272a4"
},
json: { regex: /\{.*\}|\[.*\]/, color: "#f8f8f2" }
},
elements: {
brackets: { color: "#f8f8f2" },
// Foreground for {}, [], "
keyValue: {
key: { color: "#8be9fd" },
// Cyan for keys
separator: { color: "#ff79c6" },
// Pink for :
value: { color: "#f8f8f2" }
// Foreground for values
}
}
},
githubLight: {
name: "githubLight",
levels: {
error: { color: "#d73a49", bold: true },
// Red-600
warn: { color: "#b08800" },
// Yellow-700
info: { color: "#0366d6" },
// Blue-600
debug: { color: "#586069", dim: true },
// Gray-600
success: { color: "#22863a" },
// Green-600
trace: { color: "#24292e", dim: true }
// Gray-900 (Default Text)
},
fields: {
timestamp: { color: "#586069" },
service: { color: "#6f42c1" },
// Purple-600
action: { color: "#005cc5" },
// Blue-700
user: { color: "#0366d6" },
// Blue-600
duration: { color: "#e36209" },
// Orange-600
requestId: { color: "#586069" },
correlationId: { color: "#586069" },
environment: { color: "#22863a" },
// Green-600
version: { color: "#6f42c1" },
// Purple-600
method: { color: "#005cc5" },
// Blue-700
path: { color: "#24292e" },
// Gray-900
statusCode: { color: "#b08800" },
// Yellow-700
ip: { color: "#586069" },
userAgent: { color: "#586069", dim: true }
},
status: {
success: { color: "#22863a" },
failure: { color: "#d73a49" },
error: { color: "#d73a49" },
pending: { color: "#b08800" },
cancelled: { color: "#586069" },
timeout: { color: "#d73a49" }
},
patterns: {
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "#d73a49",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "#b08800" },
success: {
regex: /\b(success|succeeded|completed)\b/i,
color: "#22863a"
},
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "#005cc5"
},
url: { regex: /https?:\/\/[^\s]+/, color: "#0366d6", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "#586069" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "#0366d6" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "#6f42c1"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "#586069"
},
json: { regex: /\{.*\}|\[.*\]/, color: "#24292e" }
},
elements: {
brackets: { color: "#586069" },
keyValue: {
key: { color: "#005cc5" },
separator: { color: "#586069" },
value: { color: "#24292e" }
}
}
},
githubDark: {
name: "githubDark",
levels: {
error: { color: "#f97583", bold: true },
warn: { color: "#dbab09" },
info: { color: "#79b8ff" },
debug: { color: "#6a737d", dim: true },
success: { color: "#85e89d" },
trace: { color: "#d1d5da", dim: true }
},
fields: {
timestamp: { color: "#6a737d" },
service: { color: "#b392f0" },
action: { color: "#58a6ff" },
user: { color: "#79b8ff" },
duration: { color: "#ffab70" },
requestId: { color: "#6a737d" },
correlationId: { color: "#6a737d" },
environment: { color: "#85e89d" },
version: { color: "#b392f0" },
method: { color: "#58a6ff" },
path: { color: "#d1d5da" },
statusCode: { color: "#dbab09" },
ip: { color: "#6a737d" },
userAgent: { color: "#6a737d", dim: true }
},
status: {
success: { color: "#85e89d" },
failure: { color: "#f97583" },
error: { color: "#f97583" },
pending: { color: "#dbab09" },
cancelled: { color: "#6a737d" },
timeout: { color: "#f97583" }
},
patterns: {
error: {
regex: /\b(error|exception|failed|failure)\b/i,
color: "#f97583",
bold: true
},
warning: { regex: /\b(warning|warn|caution)\b/i, color: "#dbab09" },
success: {
regex: /\b(success|succeeded|completed)\b/i,
color: "#85e89d"
},
http: {
regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/,
color: "#58a6ff"
},
url: { regex: /https?:\/\/[^\s]+/, color: "#79b8ff", italic: true },
ip: { regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, color: "#6a737d" },
email: { regex: /\b[\w\.-]+@[\w\.-]+\.\w+\b/, color: "#79b8ff" },
uuid: {
regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
color: "#b392f0"
},
timestamp: {
regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?\b/,
color: "#6a737d"
},
json: { regex: /\{.*\}|\[.*\]/, color: "#d1d5da" }
},
elements: {
brackets: { color: "#6a737d" },
keyValue: {
key: { color: "#79b8ff" },
separator: { color: "#6a737d" },
value: { color: "#d1d5da" }
}
}
}
};
function createStyle(config) {
if (!config) return chalk.white;
const color = config.color;
let style;
if (color.startsWith("#")) {
style = chalk.hex(color);
} else {
style = chalk[color] || chalk.white;
}
if (config.bold) style = style.bold;
if (config.dim) style = style.dim;
if (config.italic) style = style.italic;
return style;
}
var StyleManager = class _StyleManager {
static instance;
currentTheme;
styleCache;
patternCache;
constructor() {
this.currentTheme = THEMES.default;
this.styleCache = /* @__PURE__ */ new Map();
this.patternCache = /* @__PURE__ */ new Map();
this.initializeCache();
}
static getInstance() {
if (!_StyleManager.instance) {
_StyleManager.instance = new _StyleManager();
}
return _StyleManager.instance;
}
initializeCache() {
Object.entries(this.currentTheme.levels).forEach(([level, config]) => {
this.styleCache.set(`level:${level}`, createStyle(config));
});
Object.entries(this.currentTheme.fields).forEach(([field, config]) => {
this.styleCache.set(`field:${field}`, createStyle(config));
});
Object.entries(this.currentTheme.status).forEach(([status, config]) => {
this.styleCache.set(`status:${status}`, createStyle(config));
});
this.styleCache.set(
"brackets",
createStyle(this.currentTheme.elements.brackets)
);
this.styleCache.set(
"keyValue:key",
createStyle(this.currentTheme.elements.keyValue.key)
);
this.styleCache.set(
"keyValue:separator",
createStyle(this.currentTheme.elements.keyValue.separator)
);
this.styleCache.set(
"keyValue:value",
createStyle(this.currentTheme.elements.keyValue.value)
);
Object.entries(this.currentTheme.patterns).forEach(([pattern, config]) => {
this.patternCache.set(pattern, {
regex: typeof config.regex === "string" ? new RegExp(config.regex) : config.regex,
style: createStyle(config)
});
});
}
setTheme(themeName) {
if (typeof themeName === "string") {
if (themeName in THEMES) {
this.currentTheme = THEMES[themeName];
} else {
const config = loadConfig();
if (config?.customThemes && themeName in config.customThemes && config.customThemes[themeName]) {
const customTheme = {
...THEMES.default,
...config.customThemes[themeName],
name: themeName
};
this.currentTheme = customTheme;
} else {
this.currentTheme = THEMES.default;
}
}
} else {
this.currentTheme = {
name: themeName.name || "custom",
levels: { ...THEMES.default.levels, ...themeName.levels },
fields: { ...THEMES.default.fields, ...themeName.fields },
status: { ...THEMES.default.status, ...themeName.status },
patterns: { ...THEMES.default.patterns, ...themeName.patterns },
elements: {
brackets: {
...THEMES.default.elements.brackets,
...themeName.elements?.brackets
},
keyValue: {
key: {
...THEMES.default.elements.keyValue.key,
...themeName.elements?.keyValue?.key
},
separator: {
...THEMES.default.elements.keyValue.separator,
...themeName.elements?.keyValue?.separator
},
value: {
...THEMES.default.elements.keyValue.value,
...themeName.elements?.keyValue?.value
}
}
}
};
}
this.styleCache.clear();
this.patternCache.clear();
this.initializeCache();
}
getLevelStyle(level) {
return this.styleCache.get(`level:${level}`) || chalk.white;
}
getFieldStyle(field) {
return this.styleCache.get(`field:${field}`) || chalk.white;
}
getStatusStyle(status) {
return this.styleCache.get(`status:${status}`) || chalk.white;
}
getBracketStyle() {
return this.styleCache.get("brackets") || chalk.gray;
}
getKeyValueStyles() {
return {
key: this.styleCache.get("keyValue:key") || chalk.cyan,
separator: this.styleCache.get("keyValue:separator") || chalk.gray,
value: this.styleCache.get("keyValue:value") || chalk.white
};
}
applyPatternStyles(text) {
let result = text;
const sortedPatterns = Array.from(this.patternCache.entries()).sort(
(a, b) => {
const aLength = a[1].regex.toString().length;
const bLength = b[1].regex.toString().length;
return bLength - aLength;
}
);
for (const [_, { regex, style }] of sortedPatterns) {
result = result.replace(regex, (match) => style(match));
}
return result;
}
formatJson(obj) {
const lines = [];
const bracketStyle = this.getBracketStyle();
const {
key: keyStyle,
separator: separatorStyle,
value: valueStyle
} = this.getKeyValueStyles();
lines.push(bracketStyle("{"));
const entries = Object.entries(obj);
const lastEntry = entries[entries.length - 1];
for (const [key, val] of entries) {
const formattedValue = typeof val === "object" ? JSON.stringify(val, null, 2) : String(val);
const isLast = lastEntry && lastEntry[0] === key;
lines.push(
` ${bracketStyle('"')}${keyStyle(key)}${bracketStyle('"')}${separatorStyle(":")} ${valueStyle(formattedValue)}${isLast ? "" : separatorStyle(",")}`
);
}
lines.push(bracketStyle("}"));
return lines.join("\n");
}
styleLine(line, parsed, parserName) {
if (parserName === "json") {
try {
const json = JSON5.parse(line);
return formatJsonCompact(json, this);
} catch (error) {
const level2 = parsed?.level || "info";
const style2 = this.getLevelStyle(level2);
return this.applyPatternStyles(style2(line));
}
}
const level = parsed?.level || "info";
const style = this.getLevelStyle(level);
const styledLine = style(line);
return this.applyPatternStyles(styledLine);
}
};
var styleManager = StyleManager.getInstance();
var setTheme = (theme) => {
if (typeof theme === "string") {
if (theme in THEMES) {
styleManager.setTheme(theme);
} else {
const config = loadConfig();
if (config?.customThemes && theme in config.customThemes && config.customThemes[theme]) {
const customTheme = {
...THEMES.default,
...config.customThemes[theme],
name: theme
};
styleManager.setTheme(customTheme);
} else {
styleManager.setTheme("default");
}
}
} else {
styleManager.setTheme(theme);
}
};
var getTheme = () => styleManager.currentTheme;
function formatJsonCompact(obj, styleManager2, isRoot = true) {
const bracketStyle = styleManager2.getBracketStyle();
const {
key: keyStyle,
separator: separatorStyle,
value: valueStyle
} = styleManager2.getKeyValueStyles();
if (obj === null) {
return valueStyle("null");
}
if (typeof obj === "string") {
return `${bracketStyle('"')}${valueStyle(obj)}${bracketStyle('"')}`;
}
if (typeof obj === "number" || typeof obj === "boolean") {
return valueStyle(String(obj));
}
if (Array.isArray(obj)) {
const items = obj.map((item) => formatJsonCompact(item, styleManager2, false)).join(separatorStyle(", "));
return `${bracketStyle("[")}${items}${bracketStyle("]")}`;
}
if (typeof obj === "object") {
const entries = Object.entries(obj).map(([key, value]) => {
const formattedKey = `${bracketStyle('"')}${keyStyle(key)}${bracketStyle('"')}`;
const formattedValue = formatJsonCompact(value, styleManager2, false);
return `${formattedKey}${separatorStyle(":")}${formattedValue}`;
}).join(separatorStyle(", "));
return `${bracketStyle("{")}${entries}${bracketStyle("}")}`;
}
return valueStyle(String(obj));
}
// src/themes/asci/loader.ts
var CONFIG_FILES = [
".logsdxrc",
// Project root
".logsdxrc.json",
// Project root (explicit JSON)
".config/logsdx/config.json"
// User config (XDG)
];
function loadConfig() {
const home = homedir();
for (const configFile of CONFIG_FILES) {
try {
const projectPath = resolve(process.cwd(), configFile);
try {
const content = readFileSync(projectPath, "utf-8");
return JSON.parse(content);
} catch (e) {
}
const homePath = resolve(home, configFile);
try {
const content = readFileSync(homePath, "utf-8");
return JSON.parse(content);
} catch (e) {
}
} catch (error) {
}
}
return null;
}
function loadThemeFromFile(themePath) {
try {
const content = readFileSync(themePath, "utf-8");
return JSON.parse(content);
} catch (error) {
return null;
}
}
function getAllThemes(config) {
const themes = /* @__PURE__ */ new Map();
Object.entries(THEMES).forEach(([name, theme]) => {
themes.set(name, theme);
});
if (config?.customThemes) {
Object.entries(config.customThemes).forEach(([name, theme]) => {
themes.set(name, {
name,
levels: { ...THEMES.default.levels, ...theme.levels },
fields: { ...THEMES.default.fields, ...theme.fields },
status: { ...THEMES.default.status, ...theme.status },
patterns: { ...THEMES.default.patterns, ...theme.patterns },
elements: {
brackets: {
...THEMES.default.elements.brackets,
...theme.elements?.brackets
},
keyValue: {
key: {
...THEMES.default.elements.keyValue.key,
...theme.elements?.keyValue?.key
},
separator: {
...THEMES.default.elements.keyValue.separator,
...theme.elements?.keyValue?.separator
},
value: {
...THEMES.default.elements.keyValue.value,
...theme.elements?.keyValue?.value
}
}
}
});
});
}
return themes;
}
export {
loadConfig,
loadThemeFromFile,
getAllThemes,
THEMES,
createStyle,
styleManager,
setTheme,
getTheme,
formatJsonCompact
};
//# sourceMappingURL=chunk-T6FLUOTW.js.map