Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/es-abstract/2018/StringGetOwnProperty.js b/node_modules/es-abstract/2018/StringGetOwnProperty.js
new file mode 100644
index 0000000..b6f904e
--- /dev/null
+++ b/node_modules/es-abstract/2018/StringGetOwnProperty.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var $charAt = callBound('String.prototype.charAt');
+var $stringToString = callBound('String.prototype.toString');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+var isNegativeZero = require('is-negative-zero');
+
+// https://262.ecma-international.org/8.0/#sec-stringgetownproperty
+
+module.exports = function StringGetOwnProperty(S, P) {
+	var str;
+	if (Type(S) === 'Object') {
+		try {
+			str = $stringToString(S);
+		} catch (e) { /**/ }
+	}
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+	var index = CanonicalNumericIndexString(P);
+	var len = str.length;
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
+		return void undefined;
+	}
+	var resultStr = $charAt(S, index);
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};