blob: 884afef25d008d8adfeade7ed6af8af416bea133 [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var GetIntrinsic = require('get-intrinsic');
4
5var $TypeError = GetIntrinsic('%TypeError%');
6
7var callBound = require('call-bind/callBound');
8var forEach = require('../helpers/forEach');
9
10var $charCodeAt = callBound('String.prototype.charCodeAt');
11var $numberToString = callBound('Number.prototype.toString');
12var $toLowerCase = callBound('String.prototype.toLowerCase');
13var $strSlice = callBound('String.prototype.slice');
14var $strSplit = callBound('String.prototype.split');
15
16var Type = require('./Type');
17
18// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring
19
20var escapes = {
21 '\u0008': 'b',
22 '\u000C': 'f',
23 '\u000A': 'n',
24 '\u000D': 'r',
25 '\u0009': 't'
26};
27
28module.exports = function QuoteJSONString(value) {
29 if (Type(value) !== 'String') {
30 throw new $TypeError('Assertion failed: `value` must be a String');
31 }
32 var product = '"';
33 if (value) {
34 forEach($strSplit(value), function (C) {
35 if (C === '"' || C === '\\') {
36 product += '\u005C' + C;
37 } else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
38 var abbrev = escapes[C];
39 product += '\u005C' + abbrev;
40 } else {
41 var cCharCode = $charCodeAt(C, 0);
42 if (cCharCode < 0x20) {
43 product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
44 } else {
45 product += C;
46 }
47 }
48 });
49 }
50 product += '"';
51 return product;
52};