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
JavaScript
"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