You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					55 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					55 lines
				
				1.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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 $strSplit = callBound('String.prototype.split');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Type = require('./Type');
							 | 
						||
| 
								 | 
							
								var UnicodeEscape = require('./UnicodeEscape');
							 | 
						||
| 
								 | 
							
								var UTF16Encoding = require('./UTF16Encoding');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var has = require('has');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// https://262.ecma-international.org/10.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($strSplit(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 += UTF16Encoding(cCharCode);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										});
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									product += '"';
							 | 
						||
| 
								 | 
							
									return product;
							 | 
						||
| 
								 | 
							
								};
							 |