{"version":3,"sources":["meteor://💻app/packages/logging/logging.js"],"names":["module","export","Log","Meteor","link","v","hasOwn","Object","prototype","hasOwnProperty","args","info","intercept","interceptedLines","suppress","_intercept","count","_suppress","_intercepted","lines","outputFormat","LEVEL_COLORS","debug","warn","error","META_COLOR","isWin32","process","platform","platformColor","color","endsWith","RESTRICTED_KEYS","FORMATTED_KEYS","logInBrowser","obj","str","format","level","console","_debug","_getCallerDetails","getStack","err","Error","stack","line","split","slice","match","file","details","exec","forEach","arg","intercepted","RegExp","Date","message","String","toString","key","call","omitCallerDetails","time","push","EJSON","stringify","isServer","log","parse","startsWith","e","options","timeInexact","lineNumber","app","appName","originApp","program","satellite","stderr","keys","length","pad2","n","padStart","pad3","dateStamp","getFullYear","getMonth","getDate","timeStamp","getHours","getMinutes","getSeconds","getMilliseconds","utcOffsetStr","getTimezoneOffset","appInfo","sourceInfoParts","sourceInfo","join","stderrIndicator","metaPrefix","charAt","toUpperCase","prettify","require","metaColor","objFromText","override"],"mappings":"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","file":"/packages/logging.js","sourcesContent":["import { Meteor } from 'meteor/meteor';\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nfunction Log(...args) {\n Log.info(...args);\n}\n\n/// FOR TESTING\nlet intercept = 0;\nlet interceptedLines = [];\nlet suppress = 0;\n\n// Intercept the next 'count' calls to a Log function. The actual\n// lines printed to the console can be cleared and read by calling\n// Log._intercepted().\nLog._intercept = (count) => {\n intercept += count;\n};\n\n// Suppress the next 'count' calls to a Log function. Use this to stop\n// tests from spamming the console, especially with red errors that\n// might look like a failing test.\nLog._suppress = (count) => {\n suppress += count;\n};\n\n// Returns intercepted lines and resets the intercept counter.\nLog._intercepted = () => {\n const lines = interceptedLines;\n interceptedLines = [];\n intercept = 0;\n return lines;\n};\n\n// Either 'json' or 'colored-text'.\n//\n// When this is set to 'json', print JSON documents that are parsed by another\n// process ('satellite' or 'meteor run'). This other process should call\n// 'Log.format' for nice output.\n//\n// When this is set to 'colored-text', call 'Log.format' before printing.\n// This should be used for logging from within satellite, since there is no\n// other process that will be reading its standard output.\nLog.outputFormat = 'json';\n\nconst LEVEL_COLORS = {\n debug: 'green',\n // leave info as the default color\n warn: 'magenta',\n error: 'red'\n};\n\nconst META_COLOR = 'blue';\n\n// Default colors cause readability problems on Windows Powershell,\n// switch to bright variants. While still capable of millions of\n// operations per second, the benchmark showed a 25%+ increase in\n// ops per second (on Node 8) by caching \"process.platform\".\nconst isWin32 = typeof process === 'object' && process.platform === 'win32';\nconst platformColor = (color) => {\n if (isWin32 && typeof color === 'string' && !color.endsWith('Bright')) {\n return `${color}Bright`;\n }\n return color;\n};\n\n// XXX package\nconst RESTRICTED_KEYS = ['time', 'timeInexact', 'level', 'file', 'line',\n 'program', 'originApp', 'satellite', 'stderr'];\n\nconst FORMATTED_KEYS = [...RESTRICTED_KEYS, 'app', 'message'];\n\nconst logInBrowser = obj => {\n const str = Log.format(obj);\n\n // XXX Some levels should be probably be sent to the server\n const level = obj.level;\n\n if ((typeof console !== 'undefined') && console[level]) {\n console[level](str);\n } else {\n // XXX Uses of Meteor._debug should probably be replaced by Log.debug or\n // Log.info, and we should have another name for \"do your best to\n // call call console.log\".\n Meteor._debug(str);\n }\n};\n\n// @returns {Object: { line: Number, file: String }}\nLog._getCallerDetails = () => {\n const getStack = () => {\n // We do NOT use Error.prepareStackTrace here (a V8 extension that gets us a\n // pre-parsed stack) since it's impossible to compose it with the use of\n // Error.prepareStackTrace used on the server for source maps.\n const err = new Error;\n const stack = err.stack;\n return stack;\n };\n\n const stack = getStack();\n\n if (!stack) {\n return {};\n }\n\n // looking for the first line outside the logging package (or an\n // eval if we find that first)\n let line;\n const lines = stack.split('\\n').slice(1);\n for (line of lines) {\n if (line.match(/^\\s*at eval \\(eval/)) {\n return {file: \"eval\"};\n }\n\n if (!line.match(/packages\\/(?:local-test[:_])?logging(?:\\/|\\.js)/)) {\n break;\n }\n }\n\n const details = {};\n\n // The format for FF is 'functionName@filePath:lineNumber'\n // The format for V8 is 'functionName (packages/logging/logging.js:81)' or\n // 'packages/logging/logging.js:81'\n const match = /(?:[@(]| at )([^(]+?):([0-9:]+)(?:\\)|$)/.exec(line);\n if (!match) {\n return details;\n }\n\n // in case the matched block here is line:column\n details.line = match[2].split(':')[0];\n\n // Possible format: https://foo.bar.com/scripts/file.js?random=foobar\n // XXX: if you can write the following in better way, please do it\n // XXX: what about evals?\n details.file = match[1].split('/').slice(-1)[0].split('?')[0];\n\n return details;\n};\n\n['debug', 'info', 'warn', 'error'].forEach((level) => {\n // @param arg {String|Object}\n Log[level] = (arg) => {\n if (suppress) {\n suppress--;\n return;\n }\n\n let intercepted = false;\n if (intercept) {\n intercept--;\n intercepted = true;\n }\n\n let obj = (arg === Object(arg)\n && !(arg instanceof RegExp)\n && !(arg instanceof Date))\n ? arg\n : { message: new String(arg).toString() };\n\n RESTRICTED_KEYS.forEach(key => {\n if (obj[key]) {\n throw new Error(`Can't set '${key}' in log message`);\n }\n });\n\n if (hasOwn.call(obj, 'message') && typeof obj.message !== 'string') {\n throw new Error(\"The 'message' field in log objects must be a string\");\n }\n\n if (!obj.omitCallerDetails) {\n obj = { ...Log._getCallerDetails(), ...obj };\n }\n\n obj.time = new Date();\n obj.level = level;\n\n // XXX allow you to enable 'debug', probably per-package\n if (level === 'debug') {\n return;\n }\n\n if (intercepted) {\n interceptedLines.push(EJSON.stringify(obj));\n } else if (Meteor.isServer) {\n if (Log.outputFormat === 'colored-text') {\n console.log(Log.format(obj, {color: true}));\n } else if (Log.outputFormat === 'json') {\n console.log(EJSON.stringify(obj));\n } else {\n throw new Error(`Unknown logging output format: ${Log.outputFormat}`);\n }\n } else {\n logInBrowser(obj);\n }\n};\n});\n\n\n// tries to parse line as EJSON. returns object if parse is successful, or null if not\nLog.parse = (line) => {\n let obj = null;\n if (line && line.startsWith('{')) { // might be json generated from calling 'Log'\n try { obj = EJSON.parse(line); } catch (e) {}\n }\n\n // XXX should probably check fields other than 'time'\n if (obj && obj.time && (obj.time instanceof Date)) {\n return obj;\n } else {\n return null;\n }\n};\n\n// formats a log object into colored human and machine-readable text\nLog.format = (obj, options = {}) => {\n obj = { ...obj }; // don't mutate the argument\n let {\n time,\n timeInexact,\n level = 'info',\n file,\n line: lineNumber,\n app: appName = '',\n originApp,\n message = '',\n program = '',\n satellite = '',\n stderr = '',\n } = obj;\n\n if (!(time instanceof Date)) {\n throw new Error(\"'time' must be a Date object\");\n }\n\n FORMATTED_KEYS.forEach((key) => { delete obj[key]; });\n\n if (Object.keys(obj).length > 0) {\n if (message) {\n message += ' ';\n }\n message += EJSON.stringify(obj);\n }\n\n const pad2 = n => n.toString().padStart(2, '0');\n const pad3 = n => n.toString().padStart(3, '0');\n\n const dateStamp = time.getFullYear().toString() +\n pad2(time.getMonth() + 1 /*0-based*/) +\n pad2(time.getDate());\n const timeStamp = pad2(time.getHours()) +\n ':' +\n pad2(time.getMinutes()) +\n ':' +\n pad2(time.getSeconds()) +\n '.' +\n pad3(time.getMilliseconds());\n\n // eg in San Francisco in June this will be '(-7)'\n const utcOffsetStr = `(${(-(new Date().getTimezoneOffset() / 60))})`;\n\n let appInfo = '';\n if (appName) {\n appInfo += appName;\n }\n if (originApp && originApp !== appName) {\n appInfo += ` via ${originApp}`;\n }\n if (appInfo) {\n appInfo = `[${appInfo}] `;\n }\n\n const sourceInfoParts = [];\n if (program) {\n sourceInfoParts.push(program);\n }\n if (file) {\n sourceInfoParts.push(file);\n }\n if (lineNumber) {\n sourceInfoParts.push(lineNumber);\n }\n\n let sourceInfo = !sourceInfoParts.length ?\n '' : `(${sourceInfoParts.join(':')}) `;\n\n if (satellite)\n sourceInfo += `[${satellite}]`;\n\n const stderrIndicator = stderr ? '(STDERR) ' : '';\n\n const metaPrefix = [\n level.charAt(0).toUpperCase(),\n dateStamp,\n '-',\n timeStamp,\n utcOffsetStr,\n timeInexact ? '? ' : ' ',\n appInfo,\n sourceInfo,\n stderrIndicator].join('');\n\n const prettify = function (line, color) {\n return (options.color && Meteor.isServer && color) ?\n require('cli-color')[color](line) : line;\n };\n\n return prettify(metaPrefix, platformColor(options.metaColor || META_COLOR)) +\n prettify(message, platformColor(LEVEL_COLORS[level]));\n};\n\n// Turn a line of text into a loggable object.\n// @param line {String}\n// @param override {Object}\nLog.objFromText = (line, override) => {\n return {\n message: line,\n level: 'info',\n time: new Date(),\n timeInexact: true,\n ...override\n };\n};\n\nexport { Log };\n"]}