Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/es-abstract/2019/QuoteJSONString.js b/node_modules/es-abstract/2019/QuoteJSONString.js
new file mode 100644
index 0000000..350fd51
--- /dev/null
+++ b/node_modules/es-abstract/2019/QuoteJSONString.js
@@ -0,0 +1,54 @@
+'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;
+};