weavebot-core
Version:
Generic content processing framework for web scraping and AI extraction
266 lines (265 loc) • 7.74 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/utils/index.ts
var utils_exports = {};
__export(utils_exports, {
LogLevel: () => LogLevel,
Logger: () => Logger,
createLogger: () => createLogger,
defaultLogger: () => defaultLogger,
formatDuration: () => formatDuration,
isValidUrl: () => isValidUrl,
retry: () => retry,
sanitizeInput: () => sanitizeInput,
sleep: () => sleep,
truncateText: () => truncateText
});
module.exports = __toCommonJS(utils_exports);
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
return LogLevel2;
})(LogLevel || {});
var Logger = class {
logLevel;
constructor(level = "info") {
this.logLevel = this.parseLogLevel(level);
if (process.env.NODE_ENV === "production") {
this.setupProductionLogging();
}
}
parseLogLevel(level) {
switch (level.toLowerCase()) {
case "debug":
return 0 /* DEBUG */;
case "info":
return 1 /* INFO */;
case "warn":
return 2 /* WARN */;
case "error":
return 3 /* ERROR */;
default:
return 1 /* INFO */;
}
}
setupProductionLogging() {
const originalLog = console.log;
const originalWarn = console.warn;
const originalError = console.error;
console.log = (...args) => {
if (typeof args[0] === "object" && args[0].level !== void 0) {
originalLog(JSON.stringify(args[0]));
} else {
originalLog(...args);
}
};
console.warn = (...args) => {
if (typeof args[0] === "object" && args[0].level !== void 0) {
originalWarn(JSON.stringify(args[0]));
} else {
originalWarn(...args);
}
};
console.error = (...args) => {
if (typeof args[0] === "object" && args[0].level !== void 0) {
originalError(JSON.stringify(args[0]));
} else {
originalError(...args);
}
};
}
shouldLog(level) {
return level >= this.logLevel;
}
createLogEntry(level, message, context, error) {
return {
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
level,
message,
context: context ? this.sanitizeContext(context) : void 0,
error: error ? {
name: error.name,
message: error.message,
stack: error.stack
} : void 0
};
}
sanitizeContext(context) {
const sanitized = { ...context };
const sensitiveKeys = ["password", "token", "key", "secret", "apikey"];
Object.keys(sanitized).forEach((key) => {
if (sensitiveKeys.some((sensitive) => key.toLowerCase().includes(sensitive))) {
sanitized[key] = "[REDACTED]";
}
});
return sanitized;
}
formatLogEntry(entry) {
const levelNames = {
[0 /* DEBUG */]: "DEBUG",
[1 /* INFO */]: "INFO",
[2 /* WARN */]: "WARN",
[3 /* ERROR */]: "ERROR"
};
let formatted = `[${entry.timestamp}] ${levelNames[entry.level]}: ${entry.message}`;
if (entry.context && Object.keys(entry.context).length > 0) {
formatted += ` | Context: ${JSON.stringify(entry.context)}`;
}
if (entry.error) {
formatted += ` | Error: ${entry.error.message}`;
if (entry.error.stack && this.logLevel === 0 /* DEBUG */) {
formatted += `
Stack: ${entry.error.stack}`;
}
}
return formatted;
}
output(entry) {
if (process.env.NODE_ENV === "production") {
const structuredLog = {
timestamp: entry.timestamp,
level: entry.level,
message: entry.message,
...entry.context,
error: entry.error
};
switch (entry.level) {
case 3 /* ERROR */:
console.error(structuredLog);
break;
case 2 /* WARN */:
console.warn(structuredLog);
break;
default:
console.log(structuredLog);
}
} else {
const formatted = this.formatLogEntry(entry);
switch (entry.level) {
case 3 /* ERROR */:
console.error(`\x1B[31m${formatted}\x1B[0m`);
break;
case 2 /* WARN */:
console.warn(`\x1B[33m${formatted}\x1B[0m`);
break;
case 1 /* INFO */:
console.log(`\x1B[36m${formatted}\x1B[0m`);
break;
case 0 /* DEBUG */:
console.log(`\x1B[90m${formatted}\x1B[0m`);
break;
}
}
}
debug(message, context) {
if (this.shouldLog(0 /* DEBUG */)) {
const entry = this.createLogEntry(0 /* DEBUG */, message, context);
this.output(entry);
}
}
info(message, context) {
if (this.shouldLog(1 /* INFO */)) {
const entry = this.createLogEntry(1 /* INFO */, message, context);
this.output(entry);
}
}
warn(message, context) {
if (this.shouldLog(2 /* WARN */)) {
const entry = this.createLogEntry(2 /* WARN */, message, context);
this.output(entry);
}
}
error(message, contextOrError, error) {
if (this.shouldLog(3 /* ERROR */)) {
let context;
let actualError;
if (contextOrError instanceof Error) {
actualError = contextOrError;
} else {
context = contextOrError;
actualError = error;
}
const entry = this.createLogEntry(3 /* ERROR */, message, context, actualError);
this.output(entry);
}
}
// Performance logging utility
time(label, context) {
const startTime = Date.now();
this.debug(`Timer started: ${label}`, context);
return () => {
const duration = Date.now() - startTime;
this.info(`Timer ended: ${label}`, { ...context, duration });
};
}
};
var createLogger = (level) => {
return new Logger(level || process.env.LOG_LEVEL || "info");
};
var defaultLogger = createLogger();
var isValidUrl = (string) => {
try {
new URL(string);
return true;
} catch (_) {
return false;
}
};
var sanitizeInput = (input) => {
return input.replace(/[<>]/g, "").replace(/javascript:/gi, "").trim();
};
var sleep = (ms) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
var retry = async (fn, retries = 3, delay = 1e3) => {
try {
return await fn();
} catch (error) {
if (retries > 0) {
await sleep(delay);
return retry(fn, retries - 1, delay * 2);
}
throw error;
}
};
var formatDuration = (ms) => {
if (ms < 1e3) return `${ms}ms`;
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
return `${(ms / 6e4).toFixed(1)}m`;
};
var truncateText = (text, maxLength = 100) => {
if (text.length <= maxLength) return text;
return text.substring(0, maxLength - 3) + "...";
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
LogLevel,
Logger,
createLogger,
defaultLogger,
formatDuration,
isValidUrl,
retry,
sanitizeInput,
sleep,
truncateText
});
//# sourceMappingURL=utils.js.map