UNPKG

steal-tools

Version:

Futuristic build tools for ES6 Module applications.

122 lines (109 loc) 3.64 kB
var transpile = require('transpile'); var nodeDependencyMap = require("../node/dependency_map"), minify = require("../buildTypes/minifyJS"), transformActiveSource = require("../node/transform_active_source"), _ = require("lodash"); var normalizeId = 0; var cid = function(func){ if(!func._cid) { return (func._cid = (++normalizeId)); } else { return func._cid; } }; var key = function(options,format) { var clone = { useNormalizedDependencies: options.useNormalizedDependencies }; if(options.normalize) { clone.normalize = cid(options.normalize); } return "format-"+format+"-"+JSON.stringify(clone); }; var transpileNode = function(node, outputFormat, options, graph, loader){ var name = node.load.name; if( !node.load.metadata.buildType || node.load.metadata.buildType === "js" ) { // Nodes can provide their own `translate` function as part of metadata. if(loader.meta[name] && loader.meta[name].translate) { transformActiveSource(node, key({}, "[self-translate]"), function(node){ var translate = loader.meta[name].translate; return { code: translate(node.load) }; }); } transformActiveSource(node,key(options, outputFormat),function(node, source){ var opts = _.clone(options); var depMap = nodeDependencyMap(node); if(opts.useNormalizedDependencies) { opts.normalizeMap = depMap; } if(loader.transpiler) { opts.transpiler = loader.transpiler; } if(loader.babelOptions) { opts.babelOptions = loader.babelOptions; } // make sure load has activeSource var load = _.clone(node.load, true); load.source = source.code || load.source; // Minify globals prior to transpiling because they can't // be minified after they become a System.define. if(load.metadata.format === "global" && options.minify) { load.source = minify({ code: load.source }, options).code; } // I'm not sure how to handle defined. "less" is an example of something we // define. Presumably these should all be ignored. // also ignore any non js build type ... for now ...! var buildType = load.metadata.buildType || "js"; if(load.metadata.format === "defined" || buildType !== "js") { return source; } if(opts.sourceMapPath) { opts.baseURL = opts.sourceMapPath; } if(opts.normalize) { var givenNormalize = opts.normalize; opts.normalize = function(name, curName){ // if name === curName ... it's asking to normalize the current module's name // for something like define('component/component',[...]) // component/component won't be in depMap. var depLoad; if(name === curName) { depLoad = load; } else { var normalizedName = options.useNormalizedDependencies ? name : depMap[name]; var depNode = graph[normalizedName]; if(depNode) { depLoad = depNode.load; } } return givenNormalize.call(this, name, depLoad, curName, load, loader); }; } try { return transpile.to(load, outputFormat, opts); } catch(err) { var message = "Unable to transpile " + load.name + ": \n\n" + err.message; err.message = message; throw err; } }); } }; // fullGraph - if graph is a bundle ... fullGraph is the actual graph module.exports = function(graph, outputFormat, options, data){ options = options || {}; if(Array.isArray(graph)) { graph.forEach(function(node){ transpileNode(node, outputFormat, options, data.graph, data.loader); }); } else { for(var name in graph) { var node = graph[name]; // If JavaScript transpileNode(node, outputFormat, options, graph, data.loader); } } };