92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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));
 |