| '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; | 
| }; |