From 24fe07f39da8e4225f4bc4f797331930d8405ec2 Mon Sep 17 00:00:00 2001 From: Kitson Kelly Date: Tue, 30 Oct 2018 23:05:57 +1100 Subject: [PATCH] Support excluding sources from sourcemaps (#2531) --- src/Chunk.ts | 11 ++++++++-- src/rollup/types.d.ts | 1 + src/utils/collapseSourcemaps.ts | 5 ++++- src/utils/mergeOptions.ts | 1 + test/form/index.js | 8 +++++-- .../sourcemaps-excludesources/_config.js | 7 ++++++ .../_expected/amd.js | 17 ++++++++++++++ .../_expected/amd.js.map | 1 + .../_expected/cjs.js | 15 +++++++++++++ .../_expected/cjs.js.map | 1 + .../sourcemaps-excludesources/_expected/es.js | 13 +++++++++++ .../_expected/es.js.map | 1 + .../_expected/iife.js | 18 +++++++++++++++ .../_expected/iife.js.map | 1 + .../_expected/system.js | 22 +++++++++++++++++++ .../_expected/system.js.map | 1 + .../_expected/umd.js | 21 ++++++++++++++++++ .../_expected/umd.js.map | 1 + .../samples/sourcemaps-excludesources/bar.js | 3 +++ .../samples/sourcemaps-excludesources/foo.js | 3 +++ .../samples/sourcemaps-excludesources/main.js | 7 ++++++ test/misc/optionList.js | 4 ++-- 22 files changed, 155 insertions(+), 7 deletions(-) create mode 100644 test/form/samples/sourcemaps-excludesources/_config.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/amd.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/amd.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/cjs.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/cjs.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/es.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/es.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/iife.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/iife.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/system.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/system.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/umd.js create mode 100644 test/form/samples/sourcemaps-excludesources/_expected/umd.js.map create mode 100644 test/form/samples/sourcemaps-excludesources/bar.js create mode 100644 test/form/samples/sourcemaps-excludesources/foo.js create mode 100644 test/form/samples/sourcemaps-excludesources/main.js diff --git a/src/Chunk.ts b/src/Chunk.ts index 9a788d3f4e5..807f5190cab 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -1147,9 +1147,16 @@ export default class Chunk { if (this.graph.pluginDriver.hasLoadersOrTransforms) { const decodedMap = magicString.generateDecodedMap({}); - map = collapseSourcemaps(this, file, decodedMap, this.usedModules, chunkSourcemapChain); + map = collapseSourcemaps( + this, + file, + decodedMap, + this.usedModules, + chunkSourcemapChain, + options.sourcemapExcludeSources + ); } else { - map = magicString.generateMap({ file, includeContent: true }); + map = magicString.generateMap({ file, includeContent: !options.sourcemapExcludeSources }); } map.sources = map.sources.map(sourcePath => diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 9f850556175..bf0d0be823a 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -283,6 +283,7 @@ export interface OutputOptions { intro?: string | (() => string | Promise); outro?: string | (() => string | Promise); sourcemap?: boolean | 'inline'; + sourcemapExcludeSources?: boolean; sourcemapFile?: string; sourcemapPathTransform?: (sourcePath: string) => string; interop?: boolean; diff --git a/src/utils/collapseSourcemaps.ts b/src/utils/collapseSourcemaps.ts index bab774d2d2b..5514bece039 100644 --- a/src/utils/collapseSourcemaps.ts +++ b/src/utils/collapseSourcemaps.ts @@ -140,7 +140,8 @@ export default function collapseSourcemaps( file: string, map: DecodedSourceMap, modules: Module[], - bundleSourcemapChain: RawSourceMap[] + bundleSourcemapChain: RawSourceMap[], + excludeContent: boolean ) { const moduleSources = modules.filter(module => !module.excludeFromSourcemap).map(module => { let sourcemapChain = module.sourcemapChain; @@ -206,5 +207,7 @@ export default function collapseSourcemaps( file = basename(file); } + sourcesContent = excludeContent ? null : sourcesContent; + return new SourceMap({ file, sources, sourcesContent, names, mappings }); } diff --git a/src/utils/mergeOptions.ts b/src/utils/mergeOptions.ts index 223437f2ab0..dba8c27d8eb 100644 --- a/src/utils/mergeOptions.ts +++ b/src/utils/mergeOptions.ts @@ -271,6 +271,7 @@ function getOutputOptions( outro: getOption('outro'), paths: getOption('paths'), sourcemap: getOption('sourcemap'), + sourcemapExcludeSources: getOption('sourcemapExcludeSources'), sourcemapFile: getOption('sourcemapFile'), sourcemapPathTransform: getOption('sourcemapPathTransform'), strict: getOption('strict', true) diff --git a/test/form/index.js b/test/form/index.js index d462fc88fb0..382fee17f4d 100644 --- a/test/form/index.js +++ b/test/form/index.js @@ -78,14 +78,18 @@ function generateAndTestBundle(bundle, outputOptions, expectedFile, { show }) { try { actualMap = JSON.parse(sander.readFileSync(outputOptions.file + '.map').toString()); - actualMap.sourcesContent = actualMap.sourcesContent.map(normaliseOutput); + actualMap.sourcesContent = actualMap.sourcesContent + ? actualMap.sourcesContent.map(normaliseOutput) + : null; } catch (err) { assert.equal(err.code, 'ENOENT'); } try { expectedMap = JSON.parse(sander.readFileSync(expectedFile + '.map').toString()); - expectedMap.sourcesContent = expectedMap.sourcesContent.map(normaliseOutput); + expectedMap.sourcesContent = actualMap.sourcesContent + ? expectedMap.sourcesContent.map(normaliseOutput) + : null; } catch (err) { assert.equal(err.code, 'ENOENT'); } diff --git a/test/form/samples/sourcemaps-excludesources/_config.js b/test/form/samples/sourcemaps-excludesources/_config.js new file mode 100644 index 00000000000..491a8fe6f95 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'correct sourcemaps are written (excluding sourceContent)', + skipIfWindows: true, + options: { + output: { sourcemap: true, sourcemapExcludeSources: true } + } +}; diff --git a/test/form/samples/sourcemaps-excludesources/_expected/amd.js b/test/form/samples/sourcemaps-excludesources/_expected/amd.js new file mode 100644 index 00000000000..e142f3ab9fe --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/amd.js @@ -0,0 +1,17 @@ +define(function () { 'use strict'; + + function foo () { + console.log( 'hello from foo.js' ); + } + + function bar () { + console.log( 'hello from bar.js' ); + } + + console.log( 'hello from main.js' ); + + foo(); + bar(); + +}); +//# sourceMappingURL=amd.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/amd.js.map b/test/form/samples/sourcemaps-excludesources/_expected/amd.js.map new file mode 100644 index 00000000000..002793c470d --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/amd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"amd.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":";;CAAe,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCFc,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;CAEpC,GAAG,EAAE,CAAC;CACN,GAAG,EAAE,CAAC;;;;"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/_expected/cjs.js b/test/form/samples/sourcemaps-excludesources/_expected/cjs.js new file mode 100644 index 00000000000..d0b846e7ea3 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/cjs.js @@ -0,0 +1,15 @@ +'use strict'; + +function foo () { + console.log( 'hello from foo.js' ); +} + +function bar () { + console.log( 'hello from bar.js' ); +} + +console.log( 'hello from main.js' ); + +foo(); +bar(); +//# sourceMappingURL=cjs.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/cjs.js.map b/test/form/samples/sourcemaps-excludesources/_expected/cjs.js.map new file mode 100644 index 00000000000..714cd4c79a1 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cjs.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":";;AAAe,SAAS,GAAG,IAAI;CAC9B,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACnC;;ACFc,SAAS,GAAG,IAAI;CAC9B,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACnC;;ACCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;AAEpC,GAAG,EAAE,CAAC;AACN,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/_expected/es.js b/test/form/samples/sourcemaps-excludesources/_expected/es.js new file mode 100644 index 00000000000..c7263f8b99d --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/es.js @@ -0,0 +1,13 @@ +function foo () { + console.log( 'hello from foo.js' ); +} + +function bar () { + console.log( 'hello from bar.js' ); +} + +console.log( 'hello from main.js' ); + +foo(); +bar(); +//# sourceMappingURL=es.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/es.js.map b/test/form/samples/sourcemaps-excludesources/_expected/es.js.map new file mode 100644 index 00000000000..49ee9879152 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/es.js.map @@ -0,0 +1 @@ +{"version":3,"file":"es.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":"AAAe,SAAS,GAAG,IAAI;CAC9B,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACnC;;ACFc,SAAS,GAAG,IAAI;CAC9B,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACnC;;ACCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;AAEpC,GAAG,EAAE,CAAC;AACN,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/_expected/iife.js b/test/form/samples/sourcemaps-excludesources/_expected/iife.js new file mode 100644 index 00000000000..9d10bae7f14 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/iife.js @@ -0,0 +1,18 @@ +(function () { + 'use strict'; + + function foo () { + console.log( 'hello from foo.js' ); + } + + function bar () { + console.log( 'hello from bar.js' ); + } + + console.log( 'hello from main.js' ); + + foo(); + bar(); + +}()); +//# sourceMappingURL=iife.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/iife.js.map b/test/form/samples/sourcemaps-excludesources/_expected/iife.js.map new file mode 100644 index 00000000000..ea4ed9512f6 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/iife.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iife.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":";;;CAAe,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCFc,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;CAEpC,GAAG,EAAE,CAAC;CACN,GAAG,EAAE,CAAC;;;;"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/_expected/system.js b/test/form/samples/sourcemaps-excludesources/_expected/system.js new file mode 100644 index 00000000000..8aecfb6e3c7 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/system.js @@ -0,0 +1,22 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + function foo () { + console.log( 'hello from foo.js' ); + } + + function bar () { + console.log( 'hello from bar.js' ); + } + + console.log( 'hello from main.js' ); + + foo(); + bar(); + + } + }; +}); +//# sourceMappingURL=system.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/system.js.map b/test/form/samples/sourcemaps-excludesources/_expected/system.js.map new file mode 100644 index 00000000000..801cfc09b70 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/system.js.map @@ -0,0 +1 @@ +{"version":3,"file":"system.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":";;;;;GAAe,SAAS,GAAG,IAAI;GAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;GACpC,CAAC;;GCFc,SAAS,GAAG,IAAI;GAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;GACpC,CAAC;;GCCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;GAEpC,GAAG,EAAE,CAAC;GACN,GAAG,EAAE,CAAC;;;;;;"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/_expected/umd.js b/test/form/samples/sourcemaps-excludesources/_expected/umd.js new file mode 100644 index 00000000000..66c188170a8 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/umd.js @@ -0,0 +1,21 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + (factory()); +}(this, (function () { 'use strict'; + + function foo () { + console.log( 'hello from foo.js' ); + } + + function bar () { + console.log( 'hello from bar.js' ); + } + + console.log( 'hello from main.js' ); + + foo(); + bar(); + +}))); +//# sourceMappingURL=umd.js.map diff --git a/test/form/samples/sourcemaps-excludesources/_expected/umd.js.map b/test/form/samples/sourcemaps-excludesources/_expected/umd.js.map new file mode 100644 index 00000000000..14076ea6ad2 --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/_expected/umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"umd.js","sources":["../foo.js","../bar.js","../main.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;CAAe,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCFc,SAAS,GAAG,IAAI;CAC/B,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;;CCCD,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;;CAEpC,GAAG,EAAE,CAAC;CACN,GAAG,EAAE,CAAC;;;;"} \ No newline at end of file diff --git a/test/form/samples/sourcemaps-excludesources/bar.js b/test/form/samples/sourcemaps-excludesources/bar.js new file mode 100644 index 00000000000..dcb017c734e --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/bar.js @@ -0,0 +1,3 @@ +export default function bar () { + console.log( 'hello from bar.js' ); +} diff --git a/test/form/samples/sourcemaps-excludesources/foo.js b/test/form/samples/sourcemaps-excludesources/foo.js new file mode 100644 index 00000000000..a80d173b0cf --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/foo.js @@ -0,0 +1,3 @@ +export default function foo () { + console.log( 'hello from foo.js' ); +} diff --git a/test/form/samples/sourcemaps-excludesources/main.js b/test/form/samples/sourcemaps-excludesources/main.js new file mode 100644 index 00000000000..4cb88bab0cf --- /dev/null +++ b/test/form/samples/sourcemaps-excludesources/main.js @@ -0,0 +1,7 @@ +import foo from './foo'; +import bar from './bar'; + +console.log( 'hello from main.js' ); + +foo(); +bar(); diff --git a/test/misc/optionList.js b/test/misc/optionList.js index d7397e7deff..ef786cb1d18 100644 --- a/test/misc/optionList.js +++ b/test/misc/optionList.js @@ -1,3 +1,3 @@ exports.input = 'acorn, acornInjectPlugins, cache, chunkGroupingSize, context, entry, experimentalCacheExpiry, experimentalCodeSplitting, experimentalPreserveModules, experimentalTopLevelAwait, external, inlineDynamicImports, input, manualChunks, moduleContext, onwarn, optimizeChunks, perf, plugins, preferConst, preserveSymlinks, shimMissingExports, treeshake, watch'; -exports.flags = 'acorn, acornInjectPlugins, amd, assetFileNames, banner, c, cache, chunkFileNames, chunkGroupingSize, compact, config, context, dir, e, entry, entryFileNames, environment, esModule, experimentalCacheExpiry, experimentalCodeSplitting, experimentalPreserveModules, experimentalTopLevelAwait, exports, extend, external, f, file, footer, format, freeze, g, globals, h, i, indent, inlineDynamicImports, input, interop, intro, m, manualChunks, moduleContext, n, name, namespaceToStringTag, noConflict, o, onwarn, optimizeChunks, outro, paths, perf, plugins, preferConst, preserveSymlinks, shimMissingExports, silent, sourcemap, sourcemapFile, strict, treeshake, v, w, watch'; -exports.output = 'amd, assetFileNames, banner, dir, chunkFileNames, compact, entryFileNames, esModule, exports, extend, file, footer, format, freeze, globals, indent, interop, intro, name, namespaceToStringTag, noConflict, outro, paths, sourcemap, sourcemapFile, sourcemapPathTransform, strict'; +exports.flags = 'acorn, acornInjectPlugins, amd, assetFileNames, banner, c, cache, chunkFileNames, chunkGroupingSize, compact, config, context, dir, e, entry, entryFileNames, environment, esModule, experimentalCacheExpiry, experimentalCodeSplitting, experimentalPreserveModules, experimentalTopLevelAwait, exports, extend, external, f, file, footer, format, freeze, g, globals, h, i, indent, inlineDynamicImports, input, interop, intro, m, manualChunks, moduleContext, n, name, namespaceToStringTag, noConflict, o, onwarn, optimizeChunks, outro, paths, perf, plugins, preferConst, preserveSymlinks, shimMissingExports, silent, sourcemap, sourcemapExcludeSources, sourcemapFile, strict, treeshake, v, w, watch'; +exports.output = 'amd, assetFileNames, banner, dir, chunkFileNames, compact, entryFileNames, esModule, exports, extend, file, footer, format, freeze, globals, indent, interop, intro, name, namespaceToStringTag, noConflict, outro, paths, sourcemap, sourcemapExcludeSources, sourcemapFile, sourcemapPathTransform, strict';