All files / tasks repl.ts

100% Statements 21/21
100% Branches 0/0
100% Functions 5/5
100% Lines 16/16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46    42x   42x   42x   42x 42x 1x   1x   1x   1x   1x       1x       1x 1x 1x   1x 1x                            
import ITask = grunt.task.ITask;
 
const repl = require('repl');
 
import loadDojoLoader from '../lib/load-dojo-loader';
 
const resolveFrom = require('resolve-from');
 
export = function(grunt: IGrunt, packageJson: any) {
	grunt.registerTask('repl', 'Bootstrap dojo-loader and start a Node.js REPL', function (this: ITask) {
		this.async(); // Ensure Grunt doesn't exit the process.
 
		const { baseUrl, packages, require: dojoRequire } = loadDojoLoader(packageJson);
 
		const nodeRequire = function (mid: string) {
			// Require relative to the baseUrl, not this module.
			return require(resolveFrom(baseUrl, mid));
		};
		Object.defineProperty(nodeRequire, 'resolve', {
			configurable: false,
			enumerable: true,
			value (mid: string) {
				return resolveFrom(baseUrl, mid);
			}
		});
 
		grunt.log.ok(`Available packages: ${packages.map(({ name }) => name).join(', ')}`);
		grunt.log.ok('require() is now powered by dojo-loader');
		grunt.log.ok('Node.js\' require() is available under nodeRequire()');
 
		const { context } = repl.start();
		Object.defineProperties(context, {
			nodeRequire: {
				configurable: false,
				enumerable: true,
				value: nodeRequire
			},
			require: {
				configurable: false,
				enumerable: true,
				value: dojoRequire
			}
		});
	});
};