Demo for query storing

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