UNPKG

veffect

Version:

powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha

277 lines (276 loc) 9.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.zipRight = exports.zipLeft = exports.zip = exports.sync = exports.succeed = exports.structuredMessage = exports.structuredLogger = exports.stringLogger = exports.simple = exports.none = exports.mapInputOptions = exports.mapInput = exports.map = exports.makeLogger = exports.logfmtLogger = exports.jsonLogger = exports.isLogger = exports.filterLogLevel = exports.LoggerTypeId = void 0; var _Function = /*#__PURE__*/require("../Function.js"); var HashMap = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../HashMap.js")); var Inspectable = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Inspectable.js")); var List = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../List.js")); var LogSpan = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../LogSpan.js")); var Option = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Option.js")); var _Pipeable = /*#__PURE__*/require("../Pipeable.js"); var Cause = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./cause.js")); var _fiberId = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./fiberId.js")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /** @internal */ const LoggerSymbolKey = "effect/Logger"; /** @internal */ const LoggerTypeId = exports.LoggerTypeId = /*#__PURE__*/Symbol.for(LoggerSymbolKey); const loggerVariance = { /* c8 ignore next */ _Message: _ => _, /* c8 ignore next */ _Output: _ => _ }; /** @internal */ const makeLogger = log => ({ [LoggerTypeId]: loggerVariance, log, pipe() { return (0, _Pipeable.pipeArguments)(this, arguments); } }); /** @internal */ exports.makeLogger = makeLogger; const mapInput = exports.mapInput = /*#__PURE__*/(0, _Function.dual)(2, (self, f) => makeLogger(options => self.log({ ...options, message: f(options.message) }))); /** @internal */ const mapInputOptions = exports.mapInputOptions = /*#__PURE__*/(0, _Function.dual)(2, (self, f) => makeLogger(options => self.log(f(options)))); /** @internal */ const filterLogLevel = exports.filterLogLevel = /*#__PURE__*/(0, _Function.dual)(2, (self, f) => makeLogger(options => f(options.logLevel) ? Option.some(self.log(options)) : Option.none())); /** @internal */ const map = exports.map = /*#__PURE__*/(0, _Function.dual)(2, (self, f) => makeLogger(options => f(self.log(options)))); /** @internal */ const none = exports.none = { [LoggerTypeId]: loggerVariance, log: _Function.constVoid, pipe() { return (0, _Pipeable.pipeArguments)(this, arguments); } }; /** @internal */ const simple = log => ({ [LoggerTypeId]: loggerVariance, log: ({ message }) => log(message), pipe() { return (0, _Pipeable.pipeArguments)(this, arguments); } }); /** @internal */ exports.simple = simple; const succeed = value => { return simple(() => value); }; /** @internal */ exports.succeed = succeed; const sync = evaluate => { return simple(evaluate); }; /** @internal */ exports.sync = sync; const zip = exports.zip = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => makeLogger(options => [self.log(options), that.log(options)])); /** @internal */ const zipLeft = exports.zipLeft = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => map(zip(self, that), tuple => tuple[0])); /** @internal */ const zipRight = exports.zipRight = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => map(zip(self, that), tuple => tuple[1])); /** @internal */ const stringLogger = exports.stringLogger = /*#__PURE__*/makeLogger(({ annotations, cause, date, fiberId, logLevel, message, spans }) => { const nowMillis = date.getTime(); const outputArray = [`timestamp=${date.toISOString()}`, `level=${logLevel.label}`, `fiber=${_fiberId.threadName(fiberId)}`]; let output = outputArray.join(" "); const stringMessage = Inspectable.toStringUnknown(message); if (stringMessage.length > 0) { output = output + " message="; output = appendQuoted(stringMessage, output); } if (cause != null && cause._tag !== "Empty") { output = output + " cause="; output = appendQuoted(Cause.pretty(cause), output); } if (List.isCons(spans)) { output = output + " "; let first = true; for (const span of spans) { if (first) { first = false; } else { output = output + " "; } output = output + (0, _Function.pipe)(span, LogSpan.render(nowMillis)); } } if ((0, _Function.pipe)(annotations, HashMap.size) > 0) { output = output + " "; let first = true; for (const [key, value] of annotations) { if (first) { first = false; } else { output = output + " "; } output = output + filterKeyName(key); output = output + "="; output = appendQuoted(Inspectable.toStringUnknown(value), output); } } return output; }); /** @internal */ const escapeDoubleQuotes = str => `"${str.replace(/\\([\s\S])|(")/g, "\\$1$2")}"`; const textOnly = /^[^\s"=]+$/; /** @internal */ const appendQuoted = (label, output) => output + (label.match(textOnly) ? label : escapeDoubleQuotes(label)); /** @internal */ const logfmtLogger = exports.logfmtLogger = /*#__PURE__*/makeLogger(({ annotations, cause, date, fiberId, logLevel, message, spans }) => { const nowMillis = date.getTime(); const outputArray = [`timestamp=${date.toISOString()}`, `level=${logLevel.label}`, `fiber=${_fiberId.threadName(fiberId)}`]; let output = outputArray.join(" "); const stringMessage = Inspectable.toStringUnknown(message, 0); if (stringMessage.length > 0) { output = output + " message="; output = appendQuotedLogfmt(stringMessage, output); } if (cause != null && cause._tag !== "Empty") { output = output + " cause="; output = appendQuotedLogfmt(Cause.pretty(cause), output); } if (List.isCons(spans)) { output = output + " "; let first = true; for (const span of spans) { if (first) { first = false; } else { output = output + " "; } output = output + (0, _Function.pipe)(span, renderLogSpanLogfmt(nowMillis)); } } if ((0, _Function.pipe)(annotations, HashMap.size) > 0) { output = output + " "; let first = true; for (const [key, value] of annotations) { if (first) { first = false; } else { output = output + " "; } output = output + filterKeyName(key); output = output + "="; output = appendQuotedLogfmt(Inspectable.toStringUnknown(value, 0), output); } } return output; }); /** @internal */ const structuredLogger = exports.structuredLogger = /*#__PURE__*/makeLogger(({ annotations, cause, date, fiberId, logLevel, message, spans }) => { const now = date.getTime(); const annotationsObj = {}; const spansObj = {}; if (HashMap.size(annotations) > 0) { for (const [k, v] of annotations) { annotationsObj[k] = structuredMessage(v); } } if (List.isCons(spans)) { for (const span of spans) { spansObj[span.label] = now - span.startTime; } } return { message: structuredMessage(message), logLevel: logLevel.label, timestamp: date.toISOString(), cause: Cause.isEmpty(cause) ? undefined : Cause.pretty(cause), annotations: annotationsObj, spans: spansObj, fiberId: _fiberId.threadName(fiberId) }; }); const structuredMessage = u => { switch (typeof u) { case "bigint": case "function": case "symbol": { return String(u); } default: { return u; } } }; /** @internal */ exports.structuredMessage = structuredMessage; const jsonLogger = exports.jsonLogger = /*#__PURE__*/map(structuredLogger, Inspectable.stringifyCircular); /** @internal */ const filterKeyName = key => key.replace(/[\s="]/g, "_"); /** @internal */ const escapeDoubleQuotesLogfmt = str => JSON.stringify(str); /** @internal */ const appendQuotedLogfmt = (label, output) => output + (label.match(textOnly) ? label : escapeDoubleQuotesLogfmt(label)); /** @internal */ const renderLogSpanLogfmt = now => self => { const label = filterKeyName(self.label); return `${label}=${now - self.startTime}ms`; }; /** @internal */ const isLogger = u => { return typeof u === "object" && u != null && LoggerTypeId in u; }; exports.isLogger = isLogger; //# sourceMappingURL=logger.js.map