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;
							 |