Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
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));