You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					88 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					88 lines
				
				2.3 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const { | ||
|  | 	VMError | ||
|  | } = require('./bridge'); | ||
|  | 
 | ||
|  | let cacheCoffeeScriptCompiler; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Returns the cached coffee script compiler or loads it | ||
|  |  * if it is not found in the cache. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @return {compileCallback} The coffee script compiler. | ||
|  |  * @throws {VMError} If the coffee-script module can't be found. | ||
|  |  */ | ||
|  | function getCoffeeScriptCompiler() { | ||
|  | 	if (!cacheCoffeeScriptCompiler) { | ||
|  | 		try { | ||
|  | 			// The warning generated by webpack can be disabled by setting:
 | ||
|  | 			// ignoreWarnings[].message = /Can't resolve 'coffee-script'/
 | ||
|  | 			/* eslint-disable-next-line global-require */ | ||
|  | 			const coffeeScript = require('coffee-script'); | ||
|  | 			cacheCoffeeScriptCompiler = (code, filename) => { | ||
|  | 				return coffeeScript.compile(code, {header: false, bare: true}); | ||
|  | 			}; | ||
|  | 		} catch (e) { | ||
|  | 			throw new VMError('Coffee-Script compiler is not installed.'); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return cacheCoffeeScriptCompiler; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Remove the shebang from source code. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @param {string} code - Code from which to remove the shebang. | ||
|  |  * @return {string} code without the shebang. | ||
|  |  */ | ||
|  | function removeShebang(code) { | ||
|  | 	if (!code.startsWith('#!')) return code; | ||
|  | 	return '//' + code.substring(2); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * The JavaScript compiler, just a identity function. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @type {compileCallback} | ||
|  |  * @param {string} code - The JavaScript code. | ||
|  |  * @param {string} filename - Filename of this script. | ||
|  |  * @return {string} The code. | ||
|  |  */ | ||
|  | function jsCompiler(code, filename) { | ||
|  | 	return removeShebang(code); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Look up the compiler for a specific name. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @param {(string|compileCallback)} compiler - A compile callback or the name of the compiler. | ||
|  |  * @return {compileCallback} The resolved compiler. | ||
|  |  * @throws {VMError} If the compiler is unknown or the coffee script module was needed and couldn't be found. | ||
|  |  */ | ||
|  | function lookupCompiler(compiler) { | ||
|  | 	if ('function' === typeof compiler) return compiler; | ||
|  | 	switch (compiler) { | ||
|  | 		case 'coffeescript': | ||
|  | 		case 'coffee-script': | ||
|  | 		case 'cs': | ||
|  | 		case 'text/coffeescript': | ||
|  | 			return getCoffeeScriptCompiler(); | ||
|  | 		case 'javascript': | ||
|  | 		case 'java-script': | ||
|  | 		case 'js': | ||
|  | 		case 'text/javascript': | ||
|  | 			return jsCompiler; | ||
|  | 		default: | ||
|  | 			throw new VMError(`Unsupported compiler '${compiler}'.`); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | exports.removeShebang = removeShebang; | ||
|  | exports.lookupCompiler = lookupCompiler; |