Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/npm-conf/lib/conf.js b/node_modules/npm-conf/lib/conf.js
new file mode 100644
index 0000000..b2a8f0a
--- /dev/null
+++ b/node_modules/npm-conf/lib/conf.js
@@ -0,0 +1,174 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+const ConfigChain = require('config-chain').ConfigChain;
+const util = require('./util');
+
+class Conf extends ConfigChain {
+	// https://github.com/npm/npm/blob/latest/lib/config/core.js#L208-L222
+	constructor(base) {
+		super(base);
+		this.root = base;
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/core.js#L332-L342
+	add(data, marker) {
+		try {
+			for (const x of Object.keys(data)) {
+				data[x] = util.parseField(data[x], x);
+			}
+		} catch (err) {
+			throw err;
+		}
+
+		return super.add(data, marker);
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/core.js#L312-L325
+	addFile(file, name) {
+		name = name || file;
+
+		const marker = {__source__: name};
+
+		this.sources[name] = {path: file, type: 'ini'};
+		this.push(marker);
+		this._await();
+
+		try {
+			const contents = fs.readFileSync(file, 'utf8');
+			this.addString(contents, file, 'ini', marker);
+		} catch (err) {
+			this.add({}, marker);
+		}
+
+		return this;
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/core.js#L344-L360
+	addEnv(env) {
+		env = env || process.env;
+
+		const conf = {};
+
+		Object.keys(env)
+			.filter(x => /^npm_config_/i.test(x))
+			.forEach(x => {
+				if (!env[x]) {
+					return;
+				}
+
+				const p = x.toLowerCase()
+					.replace(/^npm_config_/, '')
+					.replace(/(?!^)_/g, '-');
+
+				conf[p] = env[x];
+			});
+
+		return super.addEnv('', conf, 'env');
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/load-prefix.js
+	loadPrefix() {
+		const cli = this.list[0];
+
+		Object.defineProperty(this, 'prefix', {
+			enumerable: true,
+			set: prefix => {
+				const g = this.get('global');
+				this[g ? 'globalPrefix' : 'localPrefix'] = prefix;
+			},
+			get: () => {
+				const g = this.get('global');
+				return g ? this.globalPrefix : this.localPrefix;
+			}
+		});
+
+		Object.defineProperty(this, 'globalPrefix', {
+			enumerable: true,
+			set: prefix => {
+				this.set('prefix', prefix);
+			},
+			get: () => {
+				return path.resolve(this.get('prefix'));
+			}
+		});
+
+		let p;
+
+		Object.defineProperty(this, 'localPrefix', {
+			enumerable: true,
+			set: prefix => {
+				p = prefix;
+			},
+			get: () => {
+				return p;
+			}
+		});
+
+		if (Object.prototype.hasOwnProperty.call(cli, 'prefix')) {
+			p = path.resolve(cli.prefix);
+		} else {
+			try {
+				const prefix = util.findPrefix(process.cwd());
+				p = prefix;
+			} catch (err) {
+				throw err;
+			}
+		}
+
+		return p;
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/load-cafile.js
+	loadCAFile(file) {
+		if (!file) {
+			return;
+		}
+
+		try {
+			const contents = fs.readFileSync(file, 'utf8');
+			const delim = '-----END CERTIFICATE-----';
+			const output = contents
+				.split(delim)
+				.filter(x => Boolean(x.trim()))
+				.map(x => x.trimLeft() + delim);
+
+			this.set('ca', output);
+		} catch (err) {
+			if (err.code === 'ENOENT') {
+				return;
+			}
+
+			throw err;
+		}
+	}
+
+	// https://github.com/npm/npm/blob/latest/lib/config/set-user.js
+	loadUser() {
+		const defConf = this.root;
+
+		if (this.get('global')) {
+			return;
+		}
+
+		if (process.env.SUDO_UID) {
+			defConf.user = Number(process.env.SUDO_UID);
+			return;
+		}
+
+		const prefix = path.resolve(this.get('prefix'));
+
+		try {
+			const stats = fs.statSync(prefix);
+			defConf.user = stats.uid;
+		} catch (err) {
+			if (err.code === 'ENOENT') {
+				return;
+			}
+
+			throw err;
+		}
+	}
+}
+
+module.exports = Conf;
diff --git a/node_modules/npm-conf/lib/defaults.js b/node_modules/npm-conf/lib/defaults.js
new file mode 100644
index 0000000..6c0db4a
--- /dev/null
+++ b/node_modules/npm-conf/lib/defaults.js
@@ -0,0 +1,169 @@
+
+	// Generated with `lib/make.js`
+	'use strict';
+	const os = require('os');
+	const path = require('path');
+
+	const temp = os.tmpdir();
+	const uidOrPid = process.getuid ? process.getuid() : process.pid;
+	const hasUnicode = () => true;
+	const isWindows = process.platform === 'win32';
+
+	const osenv = {
+		editor: () => process.env.EDITOR || process.env.VISUAL || (isWindows ? 'notepad.exe' : 'vi'),
+		shell: () => isWindows ? (process.env.COMSPEC || 'cmd.exe') : (process.env.SHELL || '/bin/bash')
+	};
+
+	const umask = {
+		fromString: () => process.umask()
+	};
+
+	let home = os.homedir();
+
+	if (home) {
+		process.env.HOME = home;
+	} else {
+		home = path.resolve(temp, 'npm-' + uidOrPid);
+	}
+
+	const cacheExtra = process.platform === 'win32' ? 'npm-cache' : '.npm';
+	const cacheRoot = process.platform === 'win32' ? process.env.APPDATA : home;
+	const cache = path.resolve(cacheRoot, cacheExtra);
+
+	let defaults;
+	let globalPrefix;
+
+	Object.defineProperty(exports, 'defaults', {
+  get: function () {
+    if (defaults) return defaults;
+
+    if (process.env.PREFIX) {
+      globalPrefix = process.env.PREFIX;
+    } else if (process.platform === 'win32') {
+      // c:\node\node.exe --> prefix=c:\node\
+      globalPrefix = path.dirname(process.execPath);
+    } else {
+      // /usr/local/bin/node --> prefix=/usr/local
+      globalPrefix = path.dirname(path.dirname(process.execPath)); // destdir only is respected on Unix
+
+      if (process.env.DESTDIR) {
+        globalPrefix = path.join(process.env.DESTDIR, globalPrefix);
+      }
+    }
+
+    defaults = {
+      access: null,
+      'allow-same-version': false,
+      'always-auth': false,
+      also: null,
+      'auth-type': 'legacy',
+      'bin-links': true,
+      browser: null,
+      ca: null,
+      cafile: null,
+      cache: cache,
+      'cache-lock-stale': 60000,
+      'cache-lock-retries': 10,
+      'cache-lock-wait': 10000,
+      'cache-max': Infinity,
+      'cache-min': 10,
+      cert: null,
+      color: true,
+      depth: Infinity,
+      description: true,
+      dev: false,
+      'dry-run': false,
+      editor: osenv.editor(),
+      'engine-strict': false,
+      force: false,
+      'fetch-retries': 2,
+      'fetch-retry-factor': 10,
+      'fetch-retry-mintimeout': 10000,
+      'fetch-retry-maxtimeout': 60000,
+      git: 'git',
+      'git-tag-version': true,
+      global: false,
+      globalconfig: path.resolve(globalPrefix, 'etc', 'npmrc'),
+      'global-style': false,
+      group: process.platform === 'win32' ? 0 : process.env.SUDO_GID || process.getgid && process.getgid(),
+      'ham-it-up': false,
+      heading: 'npm',
+      'if-present': false,
+      'ignore-prepublish': false,
+      'ignore-scripts': false,
+      'init-module': path.resolve(home, '.npm-init.js'),
+      'init-author-name': '',
+      'init-author-email': '',
+      'init-author-url': '',
+      'init-version': '1.0.0',
+      'init-license': 'ISC',
+      json: false,
+      key: null,
+      'legacy-bundling': false,
+      link: false,
+      'local-address': undefined,
+      loglevel: 'notice',
+      logstream: process.stderr,
+      'logs-max': 10,
+      long: false,
+      maxsockets: 50,
+      message: '%s',
+      'metrics-registry': null,
+      'node-version': process.version,
+      'offline': false,
+      'onload-script': false,
+      only: null,
+      optional: true,
+      'package-lock': true,
+      parseable: false,
+      'prefer-offline': false,
+      'prefer-online': false,
+      prefix: globalPrefix,
+      production: process.env.NODE_ENV === 'production',
+      'progress': !process.env.TRAVIS && !process.env.CI,
+      'proprietary-attribs': true,
+      proxy: null,
+      'https-proxy': null,
+      'user-agent': 'npm/{npm-version} ' + 'node/{node-version} ' + '{platform} ' + '{arch}',
+      'rebuild-bundle': true,
+      registry: 'https://registry.npmjs.org/',
+      rollback: true,
+      save: true,
+      'save-bundle': false,
+      'save-dev': false,
+      'save-exact': false,
+      'save-optional': false,
+      'save-prefix': '^',
+      'save-prod': false,
+      scope: '',
+      'script-shell': null,
+      'scripts-prepend-node-path': 'warn-only',
+      searchopts: '',
+      searchexclude: null,
+      searchlimit: 20,
+      searchstaleness: 15 * 60,
+      'send-metrics': false,
+      shell: osenv.shell(),
+      shrinkwrap: true,
+      'sign-git-tag': false,
+      'sso-poll-frequency': 500,
+      'sso-type': 'oauth',
+      'strict-ssl': true,
+      tag: 'latest',
+      'tag-version-prefix': 'v',
+      timing: false,
+      tmp: temp,
+      unicode: hasUnicode(),
+      'unsafe-perm': process.platform === 'win32' || process.platform === 'cygwin' || !(process.getuid && process.setuid && process.getgid && process.setgid) || process.getuid() !== 0,
+      usage: false,
+      user: process.platform === 'win32' ? 0 : 'nobody',
+      userconfig: path.resolve(home, '.npmrc'),
+      umask: process.umask ? process.umask() : umask.fromString('022'),
+      version: false,
+      versions: false,
+      viewer: process.platform === 'win32' ? 'browser' : 'man',
+      _exit: true
+    };
+    return defaults;
+  }
+})
diff --git a/node_modules/npm-conf/lib/make.js b/node_modules/npm-conf/lib/make.js
new file mode 100644
index 0000000..fb79d6c
--- /dev/null
+++ b/node_modules/npm-conf/lib/make.js
@@ -0,0 +1,91 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+const babylon = require('babylon');
+const generate = require('babel-generator').default;
+const traverse = require('babel-traverse').default;
+
+const defaultsTemplate = body => `
+	// Generated with \`lib/make.js\`
+	'use strict';
+	const os = require('os');
+	const path = require('path');
+
+	const temp = os.tmpdir();
+	const uidOrPid = process.getuid ? process.getuid() : process.pid;
+	const hasUnicode = () => true;
+	const isWindows = process.platform === 'win32';
+
+	const osenv = {
+		editor: () => process.env.EDITOR || process.env.VISUAL || (isWindows ? 'notepad.exe' : 'vi'),
+		shell: () => isWindows ? (process.env.COMSPEC || 'cmd.exe') : (process.env.SHELL || '/bin/bash')
+	};
+
+	const umask = {
+		fromString: () => process.umask()
+	};
+
+	let home = os.homedir();
+
+	if (home) {
+		process.env.HOME = home;
+	} else {
+		home = path.resolve(temp, 'npm-' + uidOrPid);
+	}
+
+	const cacheExtra = process.platform === 'win32' ? 'npm-cache' : '.npm';
+	const cacheRoot = process.platform === 'win32' ? process.env.APPDATA : home;
+	const cache = path.resolve(cacheRoot, cacheExtra);
+
+	let defaults;
+	let globalPrefix;
+
+	${body}
+`;
+
+const typesTemplate = body => `
+	// Generated with \`lib/make.js\`
+	'use strict';
+	const path = require('path');
+	const Stream = require('stream').Stream;
+	const url = require('url');
+
+	const Umask = () => {};
+	const getLocalAddresses = () => [];
+	const semver = () => {};
+
+	${body}
+`;
+
+const defaults = require.resolve('npm/lib/config/defaults');
+const ast = babylon.parse(fs.readFileSync(defaults, 'utf8'));
+
+const isDefaults = node =>
+	node.callee.type === 'MemberExpression' &&
+	node.callee.object.name === 'Object' &&
+	node.callee.property.name === 'defineProperty' &&
+	node.arguments.some(x => x.name === 'exports');
+
+const isTypes = node =>
+	node.type === 'MemberExpression' &&
+	node.object.name === 'exports' &&
+	node.property.name === 'types';
+
+let defs;
+let types;
+
+traverse(ast, {
+	CallExpression(path) {
+		if (isDefaults(path.node)) {
+			defs = path.node;
+		}
+	},
+	AssignmentExpression(path) {
+		if (path.node.left && isTypes(path.node.left)) {
+			types = path.node;
+		}
+	}
+});
+
+fs.writeFileSync(path.join(__dirname, 'defaults.js'), defaultsTemplate(generate(defs, {}, ast).code));
+fs.writeFileSync(path.join(__dirname, 'types.js'), typesTemplate(generate(types, {}, ast).code));
diff --git a/node_modules/npm-conf/lib/types.js b/node_modules/npm-conf/lib/types.js
new file mode 100644
index 0000000..ae82bc5
--- /dev/null
+++ b/node_modules/npm-conf/lib/types.js
@@ -0,0 +1,127 @@
+
+	// Generated with `lib/make.js`
+	'use strict';
+	const path = require('path');
+	const Stream = require('stream').Stream;
+	const url = require('url');
+
+	const Umask = () => {};
+	const getLocalAddresses = () => [];
+	const semver = () => {};
+
+	exports.types = {
+  access: [null, 'restricted', 'public'],
+  'allow-same-version': Boolean,
+  'always-auth': Boolean,
+  also: [null, 'dev', 'development'],
+  'auth-type': ['legacy', 'sso', 'saml', 'oauth'],
+  'bin-links': Boolean,
+  browser: [null, String],
+  ca: [null, String, Array],
+  cafile: path,
+  cache: path,
+  'cache-lock-stale': Number,
+  'cache-lock-retries': Number,
+  'cache-lock-wait': Number,
+  'cache-max': Number,
+  'cache-min': Number,
+  cert: [null, String],
+  color: ['always', Boolean],
+  depth: Number,
+  description: Boolean,
+  dev: Boolean,
+  'dry-run': Boolean,
+  editor: String,
+  'engine-strict': Boolean,
+  force: Boolean,
+  'fetch-retries': Number,
+  'fetch-retry-factor': Number,
+  'fetch-retry-mintimeout': Number,
+  'fetch-retry-maxtimeout': Number,
+  git: String,
+  'git-tag-version': Boolean,
+  global: Boolean,
+  globalconfig: path,
+  'global-style': Boolean,
+  group: [Number, String],
+  'https-proxy': [null, url],
+  'user-agent': String,
+  'ham-it-up': Boolean,
+  'heading': String,
+  'if-present': Boolean,
+  'ignore-prepublish': Boolean,
+  'ignore-scripts': Boolean,
+  'init-module': path,
+  'init-author-name': String,
+  'init-author-email': String,
+  'init-author-url': ['', url],
+  'init-license': String,
+  'init-version': semver,
+  json: Boolean,
+  key: [null, String],
+  'legacy-bundling': Boolean,
+  link: Boolean,
+  // local-address must be listed as an IP for a local network interface
+  // must be IPv4 due to node bug
+  'local-address': getLocalAddresses(),
+  loglevel: ['silent', 'error', 'warn', 'notice', 'http', 'timing', 'info', 'verbose', 'silly'],
+  logstream: Stream,
+  'logs-max': Number,
+  long: Boolean,
+  maxsockets: Number,
+  message: String,
+  'metrics-registry': [null, String],
+  'node-version': [null, semver],
+  offline: Boolean,
+  'onload-script': [null, String],
+  only: [null, 'dev', 'development', 'prod', 'production'],
+  optional: Boolean,
+  'package-lock': Boolean,
+  parseable: Boolean,
+  'prefer-offline': Boolean,
+  'prefer-online': Boolean,
+  prefix: path,
+  production: Boolean,
+  progress: Boolean,
+  'proprietary-attribs': Boolean,
+  proxy: [null, false, url],
+  // allow proxy to be disabled explicitly
+  'rebuild-bundle': Boolean,
+  registry: [null, url],
+  rollback: Boolean,
+  save: Boolean,
+  'save-bundle': Boolean,
+  'save-dev': Boolean,
+  'save-exact': Boolean,
+  'save-optional': Boolean,
+  'save-prefix': String,
+  'save-prod': Boolean,
+  scope: String,
+  'script-shell': [null, String],
+  'scripts-prepend-node-path': [false, true, 'auto', 'warn-only'],
+  searchopts: String,
+  searchexclude: [null, String],
+  searchlimit: Number,
+  searchstaleness: Number,
+  'send-metrics': Boolean,
+  shell: String,
+  shrinkwrap: Boolean,
+  'sign-git-tag': Boolean,
+  'sso-poll-frequency': Number,
+  'sso-type': [null, 'oauth', 'saml'],
+  'strict-ssl': Boolean,
+  tag: String,
+  timing: Boolean,
+  tmp: path,
+  unicode: Boolean,
+  'unsafe-perm': Boolean,
+  usage: Boolean,
+  user: [Number, String],
+  userconfig: path,
+  umask: Umask,
+  version: Boolean,
+  'tag-version-prefix': String,
+  versions: Boolean,
+  viewer: String,
+  _exit: Boolean
+}
diff --git a/node_modules/npm-conf/lib/util.js b/node_modules/npm-conf/lib/util.js
new file mode 100644
index 0000000..5cde7bc
--- /dev/null
+++ b/node_modules/npm-conf/lib/util.js
@@ -0,0 +1,147 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+const types = require('./types');
+
+// https://github.com/npm/npm/blob/latest/lib/config/core.js#L409-L423
+const envReplace = str => {
+	if (typeof str !== 'string' || !str) {
+		return str;
+	}
+
+	// Replace any ${ENV} values with the appropriate environment
+	const regex = /(\\*)\$\{([^}]+)\}/g;
+
+	return str.replace(regex, (orig, esc, name) => {
+		esc = esc.length > 0 && esc.length % 2;
+
+		if (esc) {
+			return orig;
+		}
+
+		if (process.env[name] === undefined) {
+			throw new Error(`Failed to replace env in config: ${orig}`);
+		}
+
+		return process.env[name];
+	});
+};
+
+// https://github.com/npm/npm/blob/latest/lib/config/core.js#L362-L407
+const parseField = (field, key) => {
+	if (typeof field !== 'string') {
+		return field;
+	}
+
+	const typeList = [].concat(types[key]);
+	const isPath = typeList.indexOf(path) !== -1;
+	const isBool = typeList.indexOf(Boolean) !== -1;
+	const isString = typeList.indexOf(String) !== -1;
+	const isNumber = typeList.indexOf(Number) !== -1;
+
+	field = `${field}`.trim();
+
+	if (/^".*"$/.test(field)) {
+		try {
+			field = JSON.parse(field);
+		} catch (err) {
+			throw new Error(`Failed parsing JSON config key ${key}: ${field}`);
+		}
+	}
+
+	if (isBool && !isString && field === '') {
+		return true;
+	}
+
+	switch (field) { // eslint-disable-line default-case
+		case 'true': {
+			return true;
+		}
+
+		case 'false': {
+			return false;
+		}
+
+		case 'null': {
+			return null;
+		}
+
+		case 'undefined': {
+			return undefined;
+		}
+	}
+
+	field = envReplace(field);
+
+	if (isPath) {
+		const regex = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\//;
+
+		if (regex.test(field) && process.env.HOME) {
+			field = path.resolve(process.env.HOME, field.substr(2));
+		}
+
+		field = path.resolve(field);
+	}
+
+	if (isNumber && !field.isNan()) {
+		field = Number(field);
+	}
+
+	return field;
+};
+
+// https://github.com/npm/npm/blob/latest/lib/config/find-prefix.js
+const findPrefix = name => {
+	name = path.resolve(name);
+
+	let walkedUp = false;
+
+	while (path.basename(name) === 'node_modules') {
+		name = path.dirname(name);
+		walkedUp = true;
+	}
+
+	if (walkedUp) {
+		return name;
+	}
+
+	const find = (name, original) => {
+		const regex = /^[a-zA-Z]:(\\|\/)?$/;
+
+		if (name === '/' || (process.platform === 'win32' && regex.test(name))) {
+			return original;
+		}
+
+		try {
+			const files = fs.readdirSync(name);
+
+			if (files.indexOf('node_modules') !== -1 || files.indexOf('package.json') !== -1) {
+				return name;
+			}
+
+			const dirname = path.dirname(name);
+
+			if (dirname === name) {
+				return original;
+			}
+
+			return find(dirname, original);
+		} catch (err) {
+			if (name === original) {
+				if (err.code === 'ENOENT') {
+					return original;
+				}
+
+				throw err;
+			}
+
+			return original;
+		}
+	};
+
+	return find(name, name);
+};
+
+exports.envReplace = envReplace;
+exports.findPrefix = findPrefix;
+exports.parseField = parseField;