@graphql-hive/logger
Version:
410 lines (385 loc) • 10.9 kB
JavaScript
function getDefaultExportFromCjs (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
var fastSafeStringify = stringify;
stringify.default = stringify;
stringify.stable = deterministicStringify;
stringify.stableStringify = deterministicStringify;
var LIMIT_REPLACE_NODE = '[...]';
var CIRCULAR_REPLACE_NODE = '[Circular]';
var arr = [];
var replacerStack = [];
function defaultOptions () {
return {
depthLimit: Number.MAX_SAFE_INTEGER,
edgesLimit: Number.MAX_SAFE_INTEGER
}
}
// Regular stringify
function stringify (obj, replacer, spacer, options) {
if (typeof options === 'undefined') {
options = defaultOptions();
}
decirc(obj, '', 0, [], undefined, 0, options);
var res;
try {
if (replacerStack.length === 0) {
res = JSON.stringify(obj, replacer, spacer);
} else {
res = JSON.stringify(obj, replaceGetterValues(replacer), spacer);
}
} catch (_) {
return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]')
} finally {
while (arr.length !== 0) {
var part = arr.pop();
if (part.length === 4) {
Object.defineProperty(part[0], part[1], part[3]);
} else {
part[0][part[1]] = part[2];
}
}
}
return res
}
function setReplace (replace, val, k, parent) {
var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k);
if (propertyDescriptor.get !== undefined) {
if (propertyDescriptor.configurable) {
Object.defineProperty(parent, k, { value: replace });
arr.push([parent, k, val, propertyDescriptor]);
} else {
replacerStack.push([val, k, replace]);
}
} else {
parent[k] = replace;
arr.push([parent, k, val]);
}
}
function decirc (val, k, edgeIndex, stack, parent, depth, options) {
depth += 1;
var i;
if (typeof val === 'object' && val !== null) {
for (i = 0; i < stack.length; i++) {
if (stack[i] === val) {
setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);
return
}
}
if (
typeof options.depthLimit !== 'undefined' &&
depth > options.depthLimit
) {
setReplace(LIMIT_REPLACE_NODE, val, k, parent);
return
}
if (
typeof options.edgesLimit !== 'undefined' &&
edgeIndex + 1 > options.edgesLimit
) {
setReplace(LIMIT_REPLACE_NODE, val, k, parent);
return
}
stack.push(val);
// Optimize for Arrays. Big arrays could kill the performance otherwise!
if (Array.isArray(val)) {
for (i = 0; i < val.length; i++) {
decirc(val[i], i, i, stack, val, depth, options);
}
} else {
var keys = Object.keys(val);
for (i = 0; i < keys.length; i++) {
var key = keys[i];
decirc(val[key], key, i, stack, val, depth, options);
}
}
stack.pop();
}
}
// Stable-stringify
function compareFunction (a, b) {
if (a < b) {
return -1
}
if (a > b) {
return 1
}
return 0
}
function deterministicStringify (obj, replacer, spacer, options) {
if (typeof options === 'undefined') {
options = defaultOptions();
}
var tmp = deterministicDecirc(obj, '', 0, [], undefined, 0, options) || obj;
var res;
try {
if (replacerStack.length === 0) {
res = JSON.stringify(tmp, replacer, spacer);
} else {
res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer);
}
} catch (_) {
return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]')
} finally {
// Ensure that we restore the object as it was.
while (arr.length !== 0) {
var part = arr.pop();
if (part.length === 4) {
Object.defineProperty(part[0], part[1], part[3]);
} else {
part[0][part[1]] = part[2];
}
}
}
return res
}
function deterministicDecirc (val, k, edgeIndex, stack, parent, depth, options) {
depth += 1;
var i;
if (typeof val === 'object' && val !== null) {
for (i = 0; i < stack.length; i++) {
if (stack[i] === val) {
setReplace(CIRCULAR_REPLACE_NODE, val, k, parent);
return
}
}
try {
if (typeof val.toJSON === 'function') {
return
}
} catch (_) {
return
}
if (
typeof options.depthLimit !== 'undefined' &&
depth > options.depthLimit
) {
setReplace(LIMIT_REPLACE_NODE, val, k, parent);
return
}
if (
typeof options.edgesLimit !== 'undefined' &&
edgeIndex + 1 > options.edgesLimit
) {
setReplace(LIMIT_REPLACE_NODE, val, k, parent);
return
}
stack.push(val);
// Optimize for Arrays. Big arrays could kill the performance otherwise!
if (Array.isArray(val)) {
for (i = 0; i < val.length; i++) {
deterministicDecirc(val[i], i, i, stack, val, depth, options);
}
} else {
// Create a temporary object in the required way
var tmp = {};
var keys = Object.keys(val).sort(compareFunction);
for (i = 0; i < keys.length; i++) {
var key = keys[i];
deterministicDecirc(val[key], key, i, stack, val, depth, options);
tmp[key] = val[key];
}
if (typeof parent !== 'undefined') {
arr.push([parent, k, val]);
parent[k] = tmp;
} else {
return tmp
}
}
stack.pop();
}
}
// wraps replacer function to handle values we couldn't replace
// and mark them as replaced value
function replaceGetterValues (replacer) {
replacer =
typeof replacer !== 'undefined'
? replacer
: function (k, v) {
return v
};
return function (key, val) {
if (replacerStack.length > 0) {
for (var i = 0; i < replacerStack.length; i++) {
var part = replacerStack[i];
if (part[1] === key && part[0] === val) {
val = part[2];
replacerStack.splice(i, 1);
break
}
}
}
return replacer.call(this, key, val)
}
}
var fastSafeStringify$1 = /*@__PURE__*/getDefaultExportFromCjs(fastSafeStringify);
const logLevel = {
trace: 0,
debug: 1,
info: 2,
warn: 3,
error: 4
};
function shouldLog(setLevel, loggingLevel) {
setLevel = typeof setLevel === "function" ? setLevel() : setLevel;
return setLevel !== false && // logging is not disabled
logLevel[setLevel] <= logLevel[loggingLevel];
}
function logLevelToString(level) {
switch (level) {
case "trace":
return "TRC";
case "debug":
return "DBG";
case "info":
return "INF";
case "warn":
return "WRN";
case "error":
return "ERR";
default:
throw new Error(`Unknown log level "${level}"`);
}
}
function isPromise(val) {
const obj = Object(val);
return typeof obj.then === "function" && typeof obj.catch === "function" && typeof obj.finally === "function";
}
function parseAttrs(attrs, functionUnwrapDepth = 0) {
if (functionUnwrapDepth > 3) {
throw new Error("Too much recursion while unwrapping function attributes");
}
if (!attrs) {
return void 0;
}
if (typeof attrs === "function") {
return parseAttrs(attrs(), functionUnwrapDepth + 1);
}
if (Array.isArray(attrs)) {
return attrs.map((val) => unwrapAttrVal(val));
}
if (isPlainObject(attrs)) {
const unwrapped = {};
for (const key of Object.keys(attrs)) {
const val = attrs[key];
unwrapped[key] = unwrapAttrVal(val);
}
return unwrapped;
}
return objectifyClass(attrs);
}
function unwrapAttrVal(attr, visited = /* @__PURE__ */ new WeakSet()) {
if (!attr) {
return attr;
}
if (isPrimitive(attr)) {
return attr;
}
if (typeof attr === "function") {
return `[Function: ${attr.name || "(anonymous)"}]`;
}
if (visited.has(attr)) {
return "[Circular]";
}
visited.add(attr);
if (Array.isArray(attr)) {
return attr.map((val) => unwrapAttrVal(val));
}
if (isPlainObject(attr)) {
const unwrapped = {};
for (const key of Object.keys(attr)) {
const val = attr[key];
unwrapped[key] = unwrapAttrVal(val, visited);
}
return unwrapped;
}
return objectifyClass(attr);
}
function isPrimitive(val) {
return val !== Object(val);
}
const nodejsCustomInspectSy = Symbol.for("nodejs.util.inspect.custom");
function objectifyClass(val) {
if (
// simply empty
!val || // Object.create(null)
Object(val).__proto__ == null
) {
return {};
}
if (typeof val === "object" && "toJSON" in val && typeof val.toJSON === "function") {
return val.toJSON();
}
if (typeof val === "object" && nodejsCustomInspectSy in val && typeof val[nodejsCustomInspectSy] === "function") {
return {
[nodejsCustomInspectSy.toString()]: unwrapAttrVal(
val[nodejsCustomInspectSy](Infinity, {})
),
class: val.constructor.name
};
}
const props = {};
for (const propName of Object.getOwnPropertyNames(val)) {
props[propName] = unwrapAttrVal(val[propName]);
}
for (const protoPropName of Object.getOwnPropertyNames(
Object.getPrototypeOf(val)
)) {
const propVal = val[protoPropName];
if (typeof propVal === "function") {
continue;
}
props[protoPropName] = unwrapAttrVal(propVal);
}
return {
...props,
class: val.constructor.name
};
}
function getEnv(key) {
return globalThis.process?.env?.[key] || // @ts-expect-error can exist in wrangler and maybe other runtimes
globalThis.env?.[key] || // @ts-expect-error can exist in deno
globalThis.Deno?.env?.get(key) || // @ts-expect-error could be
globalThis[key];
}
function truthyEnv(key) {
return ["1", "t", "true", "y", "yes"].includes(
getEnv(key)?.toLowerCase() || ""
);
}
function shallowMergeAttributes(target, source) {
switch (true) {
case (Array.isArray(source) && Array.isArray(target)):
return [...target, ...source];
case Array.isArray(source):
return target ? [target, ...source] : source;
case Array.isArray(target):
return source ? [...target, source] : target;
case !!(target || source):
return { ...target, ...source };
default:
return void 0;
}
}
function isPlainObject(val) {
return Object(val).constructor === Object && Object.getPrototypeOf(val) === Object.prototype;
}
function jsonStringify(val, pretty) {
return fastSafeStringify$1(val, void 0, pretty ? 2 : void 0);
}
class JSONLogWriter {
write(level, attrs, msg) {
console.log(
jsonStringify(
{
...attrs,
level,
...msg ? { msg } : {},
timestamp: (/* @__PURE__ */ new Date()).toISOString()
},
truthyEnv("LOG_JSON_PRETTY")
)
);
}
}
export { JSONLogWriter as J, getEnv as a, logLevel as b, shouldLog as c, fastSafeStringify$1 as f, getDefaultExportFromCjs as g, isPromise as i, jsonStringify as j, logLevelToString as l, parseAttrs as p, shallowMergeAttributes as s, truthyEnv as t };