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