// Copyright 2013 Traceur
Authors. // // Licensed under the Apache License, Version 2.0 (the “License”); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an “AS IS” BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License.
// Node.js API // // This is what you get when you `require('traceur')`. // It's suppose to be used by custom scripts or tools such as Grunt or Karma.
'use strict';
var path = require('path'); var traceur = require('./traceur.js'); var AttachModuleNameTransformer =
traceur.codegeneration.module.AttachModuleNameTransformer;
var ErrorReporter = traceur.util.TestErrorReporter; var FromOptionsTransformer = traceur.codegeneration.FromOptionsTransformer; var PureES6Transformer = traceur.codegeneration.PureES6Transformer; var Parser = traceur.syntax.Parser; var SourceFile = traceur.syntax.SourceFile; var SourceMapGenerator = traceur.outputgeneration.SourceMapGenerator; var TreeWriter = traceur.outputgeneration.TreeWriter; var traceurOptions = traceur.options;
function merge(dest) {
var src, i; for (i = 1; i < arguments.length; i++) { src = arguments[i]; Object.keys(src).forEach(function(key) { dest[key] = src[key]; }); } return dest;
}
// The absolute path to traceur-runtime.js – the file that should be executed // if you want to run Traceur-compiled scripts when the compiler isn't present. var RUNTIME_PATH = path.join(__dirname, '../../bin/traceur-runtime.js');
/**
* Compile ES6 source code with Traceur. * * TODO(vojta): Support source maps. * * @param {string} content ES6 source code. * @param {Object=} options Traceur options. * @return {string} Transpiled ES5 code. */
function compile(content, options) {
options = merge({ outputLanguage: 'es5', modules: 'commonjs', filename: '<unknown file>', sourceMap: false, cwd: process.cwd(), moduleName: false }, options || {}); var moduleName = options.moduleName; traceurOptions.reset(); merge(traceurOptions, options); var errorReporter = new ErrorReporter(); var sourceFile = new SourceFile(options.filename, content); var parser = new Parser(sourceFile, errorReporter); var tree = parser.parseModule(); var transformer; if (moduleName === true || options.modules == 'register' || options.modules == 'inline') { moduleName = options.filename.replace(/\.js$/, ''); moduleName = path.relative(options.cwd, moduleName).replace(/\\/g,'/'); } if (moduleName) { transformer = new AttachModuleNameTransformer(moduleName); tree = transformer.transformAny(tree); } if (options.outputLanguage.toLowerCase() === 'es6') { transformer = new PureES6Transformer(errorReporter); } else { transformer = new FromOptionsTransformer(errorReporter); } var transformedTree = transformer.transform(tree); if (errorReporter.hadError()) { return { js: null, errors: errorReporter.errors, sourceMap: null }; } var treeWriterOptions = {}; if (options.sourceMap) { treeWriterOptions.sourceMapGenerator = new SourceMapGenerator({ file: options.filename, sourceRoot: null }); } return { js: TreeWriter.write(transformedTree, treeWriterOptions), errors: errorReporter.errors, sourceMap: treeWriterOptions.sourceMap || null };
};
// extend traceur module module.exports = Object.create(traceur); module.exports.compile = compile; module.exports.RUNTIME_PATH = RUNTIME_PATH;