diff --git a/lib/build/transform.js b/lib/build/transform.js index 15a9d40d..217da6e4 100644 --- a/lib/build/transform.js +++ b/lib/build/transform.js @@ -148,7 +148,8 @@ var transformImport = function(config, transformOptions){ var concatOptions = { excludePlugins: options.format === "global", sourceProp: "activeSource", - format: options.concatFormat + format: options.concatFormat, + removeDevelopmentCode: options.removeDevelopmentCode }; return concatSource(bundle, concatOptions); }) diff --git a/lib/bundle/concat_source.js b/lib/bundle/concat_source.js index d44e589b..960033e5 100644 --- a/lib/bundle/concat_source.js +++ b/lib/bundle/concat_source.js @@ -2,15 +2,12 @@ var concatAMD = require("./concat_source_amd"); var concatES = require("./concat_source_es"); module.exports = function(bundle, options = {}){ - var sourceProp = options.sourceProp; - var excludePlugins = options.excludePlugins; - var result; - + if(options.format === "es") { - result = concatES(bundle, sourceProp, excludePlugins); + result = concatES(bundle, options); } else if(options.format === "amd") { - result = concatAMD(bundle, sourceProp, excludePlugins); + result = concatAMD(bundle, options); } else { return Promise.reject(new Error(`Unsupported concat format: ${options.format}`)); } diff --git a/lib/bundle/concat_source_amd.js b/lib/bundle/concat_source_amd.js index c05cc419..078740f7 100644 --- a/lib/bundle/concat_source_amd.js +++ b/lib/bundle/concat_source_amd.js @@ -3,7 +3,10 @@ var concat = require("../source-map-concat"); var sourceNode = require("../node/source").node; var removeSourceMapUrl = require("../remove_source_map_url"); -module.exports = function(bundle, sourceProp, excludePlugins){ +module.exports = function(bundle, options){ + var sourceProp = options.sourceProp; + var excludePlugins = options.excludePlugins; + var output = fileName(bundle); var makeCode = function(name) { diff --git a/lib/bundle/concat_source_es.js b/lib/bundle/concat_source_es.js index 1970bbff..558984de 100644 --- a/lib/bundle/concat_source_es.js +++ b/lib/bundle/concat_source_es.js @@ -1,12 +1,16 @@ +const cleanSource = require("../node/clean"); const dependencyResolver = require("../node/dependency_resolver"); const isProcessShim = require("../node/is_process_shim"); +const nodeSource = require("../node/source"); const pluginCommonjs = require("rollup-plugin-commonjs"); +const removeActiveSourceKeys = require("../node/remove_active_source_keys"); const rollup = require("steal-rollup"); const moduleNameFromSpecifier = dependencyResolver.moduleNameFromSpecifier; const CJS_PROXY_PREFIX = '\0commonjs-proxy:'; -module.exports = function(bundle) { +module.exports = function(bundle, options) { + let removeDevelopmentCode = options.removeDevelopmentCode; let main = bundle.bundles[0]; let firstNode = bundle.nodes[0]; @@ -20,7 +24,7 @@ module.exports = function(bundle) { input: main, plugins: [ - loadFromGraph(getNode), + loadFromGraph(getNode, removeDevelopmentCode), pluginCommonjs({}) ] }) @@ -43,7 +47,7 @@ module.exports = function(bundle) { }); }; -function loadFromGraph(getNode) { +function loadFromGraph(getNode, removeDevelopmentCode) { return { resolveId: function(id, importer) { if(id.startsWith(CJS_PROXY_PREFIX)) { @@ -68,8 +72,13 @@ function loadFromGraph(getNode) { return undefined; } - let source = node.load.source; - return source; + removeActiveSourceKeys(node); + + if(removeDevelopmentCode) { + cleanSource(node, {}); + } + + return nodeSource(node); } }; } diff --git a/lib/graph/clean.js b/lib/graph/clean.js index 3becd9ee..e8d52d1f 100644 --- a/lib/graph/clean.js +++ b/lib/graph/clean.js @@ -1,32 +1,4 @@ -var clone = require("lodash/clone"); -var findLineColumn = require("find-line-column"); -var makeTagRegEx = require("../build/clean").makeTagRegEx; -var SourceMapConsumer = require("bitovi-source-map").SourceMapConsumer; -var transformActiveSource = require("../node/transform_active_source"); - -var clean = function(node, options){ - var removeTags = (options.removeTags || []).slice(0); - - if(!removeTags.length) { - removeTags.push("steal-remove"); - removeTags.push(/steal.dev.(?:log|warn|assert)\(.*\);?/g); - } - - if(!node.load.metadata.buildType || node.load.metadata.buildType === "js") { - transformActiveSource(node, "clean-true", function(node, source){ - source = clone(source); - var empty = makeUpdater(source); - removeTags.forEach(function(tag) { - if (tag instanceof RegExp) { - source.code = source.code.replace(tag, empty); - } else { - source.code = source.code.replace(makeTagRegEx(tag), empty); - } - }); - return source; - }); - } -}; +var clean = require("../node/clean"); module.exports = function(graph, options) { options = options || {}; @@ -42,64 +14,3 @@ module.exports = function(graph, options) { } } }; - -var REGEX_NEWLINE = /(\r?\n)/g; -/** - * @function makeUpdater - * @description Creates function that acts as a callback to String.prototype.replace. - * Calculates the offset caused by the removal of a match and applies new mappings to - * the source map. - * @return {Function} - */ -function makeUpdater(source) { - var map = source.map; - - if(!map) { - return function() { return ""; }; - } - - function offsetFor(string){ - var parts = string.split(REGEX_NEWLINE); - return { - lines: 0 - (parts.length - 1), - columns: 0 - parts[parts.length - 1].length - }; - } - - var consumer; - return function(match) { - var string = arguments[arguments.length - 1]; - var offset = arguments[arguments.length - 2]; - consumer = consumer || new SourceMapConsumer(map.toJSON()); - - var position = findLineColumn(string, offset); - offset = offsetFor(match); - - consumer.eachMapping(function(mapping) { - // Skip mappings that precede the change. - if(mapping.generatedLine < position.line || - (mapping.generatedLine === position.line && - mapping.generatedColumn < position.column)) { - return; - } - - var offsetColumns = mapping.generatedColumn > Math.abs(offset.columns) ? - offset.columns : 0; - if(offset.lines > 0 && offsetColumns > 0) { - map.addMapping({ - generated: { - line: offset.lines + mapping.generatedLine, - column: offsetColumns + mapping.generatedColumn - }, - original: { - line: mapping.originalLine, - column: mapping.originalColumn - }, - source: mapping.source - }); - } - }); - - return ""; - }; -} diff --git a/lib/graph/remove_active_source_keys.js b/lib/graph/remove_active_source_keys.js index 8a02c555..1e4d87db 100644 --- a/lib/graph/remove_active_source_keys.js +++ b/lib/graph/remove_active_source_keys.js @@ -1,12 +1,4 @@ -var clean = function(node, options){ - delete node.activeSourceKeys; - node.activeSource = { - code: node.load.source - }; - if(options.removeSourceNodes) { - delete node.sourceNode; - } -}; +var clean = require("../node/remove_active_source_keys"); module.exports = function(graph, options) { options = options || {}; @@ -22,4 +14,3 @@ module.exports = function(graph, options) { } } }; - diff --git a/lib/node/clean.js b/lib/node/clean.js new file mode 100644 index 00000000..94e2cd17 --- /dev/null +++ b/lib/node/clean.js @@ -0,0 +1,92 @@ +var clone = require("lodash/clone"); +var findLineColumn = require("find-line-column"); +var makeTagRegEx = require("../build/clean").makeTagRegEx; +var SourceMapConsumer = require("bitovi-source-map").SourceMapConsumer; +var transformActiveSource = require("../node/transform_active_source"); + +var clean = function(node, options){ + var removeTags = (options.removeTags || []).slice(0); + + if(!removeTags.length) { + removeTags.push("steal-remove"); + removeTags.push(/steal.dev.(?:log|warn|assert)\(.*\);?/g); + } + + if(!node.load.metadata.buildType || node.load.metadata.buildType === "js") { + transformActiveSource(node, "clean-true", function(node, source){ + source = clone(source); + var empty = makeUpdater(source); + removeTags.forEach(function(tag) { + if (tag instanceof RegExp) { + source.code = source.code.replace(tag, empty); + } else { + source.code = source.code.replace(makeTagRegEx(tag), empty); + } + }); + return source; + }); + } +}; + +module.exports = clean; + +var REGEX_NEWLINE = /(\r?\n)/g; +/** + * @function makeUpdater + * @description Creates function that acts as a callback to String.prototype.replace. + * Calculates the offset caused by the removal of a match and applies new mappings to + * the source map. + * @return {Function} + */ +function makeUpdater(source) { + var map = source.map; + + if(!map) { + return function() { return ""; }; + } + + function offsetFor(string){ + var parts = string.split(REGEX_NEWLINE); + return { + lines: 0 - (parts.length - 1), + columns: 0 - parts[parts.length - 1].length + }; + } + + var consumer; + return function(match) { + var string = arguments[arguments.length - 1]; + var offset = arguments[arguments.length - 2]; + consumer = consumer || new SourceMapConsumer(map.toJSON()); + + var position = findLineColumn(string, offset); + offset = offsetFor(match); + + consumer.eachMapping(function(mapping) { + // Skip mappings that precede the change. + if(mapping.generatedLine < position.line || + (mapping.generatedLine === position.line && + mapping.generatedColumn < position.column)) { + return; + } + + var offsetColumns = mapping.generatedColumn > Math.abs(offset.columns) ? + offset.columns : 0; + if(offset.lines > 0 && offsetColumns > 0) { + map.addMapping({ + generated: { + line: offset.lines + mapping.generatedLine, + column: offsetColumns + mapping.generatedColumn + }, + original: { + line: mapping.originalLine, + column: mapping.originalColumn + }, + source: mapping.source + }); + } + }); + + return ""; + }; +} diff --git a/lib/node/remove_active_source_keys.js b/lib/node/remove_active_source_keys.js new file mode 100644 index 00000000..1913a253 --- /dev/null +++ b/lib/node/remove_active_source_keys.js @@ -0,0 +1,10 @@ + +module.exports = function(node, options = {}){ + delete node.activeSourceKeys; + node.activeSource = { + code: node.load.source + }; + if(options.removeSourceNodes) { + delete node.sourceNode; + } +}; diff --git a/test/export_bundled_es_test.js b/test/export_bundled_es_test.js index d85ea21a..742ccdc6 100644 --- a/test/export_bundled_es_test.js +++ b/test/export_bundled_es_test.js @@ -1,4 +1,5 @@ var assert = require("assert"); +var fs = require("fs"); var stealExport = require("../lib/build/export"); var rmdir = require("rimraf"); var testHelpers = require("./helpers"); @@ -72,4 +73,26 @@ describe("+bundled-es", function(){ done(); }, done); }); + + it("Removes dev code", function(done){ + this.timeout(10000); + stealExport({ + steal: { + config: __dirname+"/exports_basics/package.json!npm", + main: "app/index_es" + }, + options: { quiet: true }, + "outputs": { + "+bundled-es": { + dest: __dirname + "/exports_basics/dist/es.js" + } + } + }) + .then(function() { + var code = fs.readFileSync(__dirname + "/exports_basics/dist/es.js", "utf8"); + assert.ok(!/window\.REMOVEME/.test(code), "Removed the dev code"); + done(); + }) + .catch(done); + }); }); diff --git a/test/exports_basics/index_es.js b/test/exports_basics/index_es.js index d8a09603..0a6722b8 100644 --- a/test/exports_basics/index_es.js +++ b/test/exports_basics/index_es.js @@ -2,6 +2,10 @@ import foo from "foo"; let name = "index"; +//!steal-remove-start +window.REMOVEME = true; +//!steal-remove-end + export { name, foo