{"version":3,"file":"message.mjs","names":["dateFormat","format","prettyFormat","createTag","encode","stringParts","_len","arguments","length","substitutions","Array","_key","reduce","prev","cur","i","hasOwnProperty","obj","propName","Object","prototype","call","customKey","Symbol","quote","value","formatObject","options","replace","undefined","type","String","toString","JSON","stringify","isNaN","Infinity","isArray","Date","Number","valueOf","RegExp","Error","constructor","name","message","proto","getPrototypeOf","tag","stringRep","msgTag","msg","maxDepth","min","raw","custom"],"sources":["../../src/message.js"],"sourcesContent":["\nimport dateFormat from 'dateformat';\nimport { format as prettyFormat } from 'pretty-format';\n\n\n// Generic builder for template literal tags\nconst createTag = encode => (stringParts, ...substitutions) =>\n    substitutions.reduce(\n        (prev, cur, i) => prev + encode(cur) + stringParts[i + 1],\n        stringParts[0]\n    );\n\n// Version of `obj.hasOwnProperty()` that works regardless of prototype\nconst hasOwnProperty = (obj, propName) => Object.prototype.hasOwnProperty.call(obj, propName);\n\n\nconst customKey = Symbol('msg.custom');\n\nconst quote = value => `\\`${value}\\``;\n\nconst formatObject = (obj, options) => {\n    return prettyFormat(obj, options)\n        .replace(/^Object /, ''); // Remove 'Object' tag\n};\n\nconst format = (value, options = {}) => {\n    if (typeof value === 'object' && value && customKey in value) {\n        if (value.type === 'raw') {\n            return value.value;\n        }\n        \n        if (typeof value.options === 'object' && value.options) {\n            options = value.options;\n            value = value.value;\n        }\n    }\n    \n    if (value === undefined) {\n        return quote('undefined');\n    } else if (value === null) {\n        return quote('null');\n    } else if (typeof value === 'boolean') {\n        return quote(String(value));\n    } else if (typeof value === 'symbol') {\n        return quote(value.toString()); // `Symbol(<symbol-name>)`\n    } else if (typeof value === 'string') {\n        return JSON.stringify(value); // Don't quote, just encode as a string literal\n    } else if (typeof value === 'number') {\n        if (isNaN(value)) {\n            return 'NaN';\n        } else if (value === +Infinity) {\n            return '+Infinity';\n        } else if (value === -Infinity) {\n            return '-Infinity';\n        }\n        \n        return String(value);\n    } else if (Array.isArray(value)) {\n        // Currently just JSON encodes the entire array. We may want to format this a bit nicer.\n        return quote(JSON.stringify(value));\n    } else if (typeof value === 'function') {\n        return quote(value.toString());\n    } else if (value instanceof Date) {\n        if (Number.isNaN(value.valueOf())) {\n            return '[invalid Date]';\n        } else {\n            // Note: `dateFormat` throws a TypeError if the given Date is invalid (i.e. value is NaN)\n            return dateFormat(value, options.dateFormat || 'isoUtcDateTime');\n        }\n    } else if (value instanceof RegExp) {\n        return quote(value.toString());\n    } else if (value instanceof Error) {\n        // For error messages, print the message raw. We expect the message to be already formatted\n        // for display, so encoding it would mess up the formatting.\n        return `[${value.constructor.name}] ${value.message}`;\n    } else if (typeof value === 'object') {\n        const proto = Object.getPrototypeOf(value);\n        if (proto === null || proto === Object.prototype) {\n            // Currently just JSON encodes the entire object. We may want to format this a bit nicer.\n            return quote(formatObject(value, options.format));\n        }\n        \n        if (hasOwnProperty(proto, 'constructor') && typeof proto.constructor === 'function') {\n            const constructor = proto.constructor;\n            \n            const tag = constructor.name || 'Unknown';\n            \n            let stringRep;\n            if ('toJSON' in value) {\n                // Note: `toJSON` is not included in `Object.prototype`, so will only be present in types\n                // that explicitly implement JSON encoding.\n                stringRep = quote(formatObject(value, options.format));\n            } else if ('toString' in value && value.toString !== Object.prototype.toString) {\n                // Note: `toString` is included in `Object.prototype`. However, the default implementation is\n                // generally not very helpful (e.g. `[Object object]`). So we explicitly ignore it.\n                \n                stringRep = JSON.stringify(value.toString()); // Encode as string literal\n            } else {\n                // Fallback: take all enumerable properties and format as object\n                stringRep = quote(formatObject({ ...value }, options.format));\n            }\n            \n            return `[${tag}] ${stringRep}`;\n        }\n    }\n    \n    // Fallback\n    return JSON.stringify(value);\n};\n\nexport const msgTag = options => createTag(value => format(value, options));\n\nconst msg = msgTag({\n    format: {\n        maxDepth: 4,\n        min: true,\n    },\n    dateFormat: 'isoUtcDateTime',\n});\n\nexport const raw = msg.raw = value => ({ [customKey]: true, type: 'raw', value });\n\nexport const custom = msg.custom = (options, value) => ({ [customKey]: true, options, value });\n\nexport default msg;\n"],"mappings":"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"}