| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var callBound = require('call-bind/callBound'); |
| var forEach = require('../helpers/forEach'); |
| var isLeadingSurrogate = require('../helpers/isLeadingSurrogate'); |
| var isTrailingSurrogate = require('../helpers/isTrailingSurrogate'); |
| |
| var $charCodeAt = callBound('String.prototype.charCodeAt'); |
| |
| var StringToCodePoints = require('./StringToCodePoints'); |
| var Type = require('./Type'); |
| var UnicodeEscape = require('./UnicodeEscape'); |
| var UTF16EncodeCodePoint = require('./UTF16EncodeCodePoint'); |
| |
| var has = require('has'); |
| |
| // https://ecma-international.org/ecma-262/12.0/#sec-quotejsonstring |
| |
| var escapes = { |
| '\u0008': '\\b', |
| '\u0009': '\\t', |
| '\u000A': '\\n', |
| '\u000C': '\\f', |
| '\u000D': '\\r', |
| '\u0022': '\\"', |
| '\u005c': '\\\\' |
| }; |
| |
| module.exports = function QuoteJSONString(value) { |
| if (Type(value) !== 'String') { |
| throw new $TypeError('Assertion failed: `value` must be a String'); |
| } |
| var product = '"'; |
| if (value) { |
| forEach(StringToCodePoints(value), function (C) { |
| if (has(escapes, C)) { |
| product += escapes[C]; |
| } else { |
| var cCharCode = $charCodeAt(C, 0); |
| if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) { |
| product += UnicodeEscape(C); |
| } else { |
| product += UTF16EncodeCodePoint(cCharCode); |
| } |
| } |
| }); |
| } |
| product += '"'; |
| return product; |
| }; |