UNPKG

console-feed-modern

Version:

A React component that displays console logs from the current page, an iframe or transported across a server

185 lines 15.2 kB
// Taken from the source of chrome devtools: // https://github.com/ChromeDevTools/devtools-frontend/blob/master/front_end/platform/utilities.js#L805-L1006 // Copyright 2014 The Chromium Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. export var String; (function (String) { /** * @param {string} string * @param {number} index * @return {boolean} */ function isDigitAt(string, index) { var c = string.charCodeAt(index); return 48 <= c && c <= 57; } /** * @param {string} format * @param {!Object.<string, function(string, ...):*>} formatters * @return {!Array.<!Object>} */ function tokenizeFormatString(format, formatters) { var tokens = []; var substitutionIndex = 0; function addStringToken(str) { if (tokens.length && tokens[tokens.length - 1].type === 'string') tokens[tokens.length - 1].value += str; else tokens.push({ type: 'string', value: str }); } function addSpecifierToken(specifier, precision, substitutionIndex) { tokens.push({ type: 'specifier', specifier: specifier, precision: precision, substitutionIndex: substitutionIndex }); } var index = 0; for (var precentIndex = format.indexOf('%', index); precentIndex !== -1; precentIndex = format.indexOf('%', index)) { if (format.length === index) // unescaped % sign at the end of the format string. break; addStringToken(format.substring(index, precentIndex)); index = precentIndex + 1; if (format[index] === '%') { // %% escape sequence. addStringToken('%'); ++index; continue; } if (isDigitAt(format, index)) { // The first character is a number, it might be a substitution index. var number = parseInt(format.substring(index), 10); while (isDigitAt(format, index)) ++index; // If the number is greater than zero and ends with a "$", // then this is a substitution index. if (number > 0 && format[index] === '$') { substitutionIndex = number - 1; ++index; } } var precision = -1; if (format[index] === '.') { // This is a precision specifier. If no digit follows the ".", // then the precision should be zero. ++index; precision = parseInt(format.substring(index), 10); if (isNaN(precision)) precision = 0; while (isDigitAt(format, index)) ++index; } if (!(format[index] in formatters)) { addStringToken(format.substring(precentIndex, index + 1)); ++index; continue; } addSpecifierToken(format[index], precision, substitutionIndex); ++substitutionIndex; ++index; } addStringToken(format.substring(index)); return tokens; } /** * @param {string} format * @param {?ArrayLike} substitutions * @param {!Object.<string, function(string, ...):Q>} formatters * @param {!T} initialValue * @param {function(T, Q): T|undefined} append * @param {!Array.<!Object>=} tokenizedFormat * @return {!{formattedResult: T, unusedSubstitutions: ?ArrayLike}}; * @template T, Q */ function format(format, substitutions, formatters, initialValue, append, tokenizedFormat) { if (!format || !substitutions || !substitutions.length) return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions }; function prettyFunctionName() { return ('String.format("' + format + '", "' + Array.prototype.join.call(substitutions, '", "') + '")'); } function warn(msg) { console.warn(prettyFunctionName() + ': ' + msg); } function error(msg) { console.error(prettyFunctionName() + ': ' + msg); } var result = initialValue; var tokens = tokenizedFormat || tokenizeFormatString(format, formatters); var usedSubstitutionIndexes = {}; for (var i = 0; i < tokens.length; ++i) { var token = tokens[i]; if (token.type === 'string') { result = append(result, token.value); continue; } if (token.type !== 'specifier') { error('Unknown token type "' + token.type + '" found.'); continue; } if (token.substitutionIndex >= substitutions.length) { // If there are not enough substitutions for the current substitutionIndex // just output the format specifier literally and move on. error('not enough substitution arguments. Had ' + substitutions.length + ' but needed ' + (token.substitutionIndex + 1) + ', so substitution was skipped.'); result = append(result, '%' + (token.precision > -1 ? token.precision : '') + token.specifier); continue; } usedSubstitutionIndexes[token.substitutionIndex] = true; if (!(token.specifier in formatters)) { // Encountered an unsupported format character, treat as a string. warn('unsupported format character \u201C' + token.specifier + '\u201D. Treating as a string.'); result = append(result, substitutions[token.substitutionIndex]); continue; } result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token)); } var unusedSubstitutions = []; for (var i = 0; i < substitutions.length; ++i) { if (i in usedSubstitutionIndexes) continue; unusedSubstitutions.push(substitutions[i]); } return { formattedResult: result, unusedSubstitutions: unusedSubstitutions }; } String.format = format; })(String || (String = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0NvbXBvbmVudC9kZXZ0b29scy1wYXJzZXIvc3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRDQUE0QztBQUM1Qyw2R0FBNkc7QUFFN0csNERBQTREO0FBQzVELEVBQUU7QUFDRixxRUFBcUU7QUFDckUseUVBQXlFO0FBQ3pFLE9BQU87QUFDUCxFQUFFO0FBQ0Ysc0VBQXNFO0FBQ3RFLGdFQUFnRTtBQUNoRSwrREFBK0Q7QUFDL0QseUVBQXlFO0FBQ3pFLGdFQUFnRTtBQUNoRSxnQkFBZ0I7QUFDaEIsNERBQTREO0FBQzVELHVFQUF1RTtBQUN2RSwyREFBMkQ7QUFDM0QsRUFBRTtBQUNGLHNFQUFzRTtBQUN0RSxvRUFBb0U7QUFDcEUsd0VBQXdFO0FBQ3hFLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsbUVBQW1FO0FBQ25FLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUsc0VBQXNFO0FBQ3RFLHdFQUF3RTtBQUN4RSx1RUFBdUU7QUFFdkUsTUFBTSxLQUFXLE1BQU0sQ0EyTXRCO0FBM01ELFdBQWlCLE1BQU07SUFDckI7Ozs7T0FJRztJQUNILFNBQVMsU0FBUyxDQUFDLE1BQVcsRUFBRSxLQUFVO1FBQ3hDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLG9CQUFvQixDQUFDLE1BQVcsRUFBRSxVQUFlO1FBQ3hELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQTtRQUNwQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQTtRQUV6QixTQUFTLGNBQWMsQ0FBQyxHQUFRO1lBQzlCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENB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