| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var callBound = require('call-bind/callBound'); |
| var forEach = require('../helpers/forEach'); |
| |
| var $charCodeAt = callBound('String.prototype.charCodeAt'); |
| var $numberToString = callBound('Number.prototype.toString'); |
| var $toLowerCase = callBound('String.prototype.toLowerCase'); |
| var $strSlice = callBound('String.prototype.slice'); |
| var $strSplit = callBound('String.prototype.split'); |
| |
| var Type = require('./Type'); |
| |
| // https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring |
| |
| var escapes = { |
| '\u0008': 'b', |
| '\u000C': 'f', |
| '\u000A': 'n', |
| '\u000D': 'r', |
| '\u0009': 't' |
| }; |
| |
| module.exports = function QuoteJSONString(value) { |
| if (Type(value) !== 'String') { |
| throw new $TypeError('Assertion failed: `value` must be a String'); |
| } |
| var product = '"'; |
| if (value) { |
| forEach($strSplit(value), function (C) { |
| if (C === '"' || C === '\\') { |
| product += '\u005C' + C; |
| } else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') { |
| var abbrev = escapes[C]; |
| product += '\u005C' + abbrev; |
| } else { |
| var cCharCode = $charCodeAt(C, 0); |
| if (cCharCode < 0x20) { |
| product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4)); |
| } else { |
| product += C; |
| } |
| } |
| }); |
| } |
| product += '"'; |
| return product; |
| }; |