UNPKG

@graphql-hive/logger

Version:
410 lines (385 loc) 10.9 kB
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 };