UNPKG

2.43 kBPlain TextView Raw
1import * as webpack from 'webpack';
2
3const searchValue = /^\n*\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,/;
4const replaceValue = '\n//# sourceMappingURL=data:application/json;base64,';
5
6/**
7 * Wraps Webpack's built-in SourceMapDevToolPlugin with a post-processing step that makes inline source maps
8 * work with Visual Studio's native debugger.
9 *
10 * The issue this fixes is that VS doesn't like to see 'charset=utf-8;' in the 'sourceMappingURL'. If that string
11 * is present, VS will ignore the source map entirely. Until that VS bug is fixed, we can just strip out the charset
12 * specifier from the URL. It's not needed because tools assume it's utf-8 anyway.
13 */
14export class SourceMapDevToolPlugin {
15 /**
16 * Constructs an instance of SourceMapDevToolPlugin.
17 *
18 * @param options Options that will be passed through to Webpack's native SourceMapDevToolPlugin.
19 */
20 constructor(private options?: any) {}
21
22 protected apply(compiler: any) {
23 // First, attach Webpack's native SourceMapDevToolPlugin, passing through the options
24 const underlyingPlugin: any = new webpack.SourceMapDevToolPlugin(this.options);
25 underlyingPlugin.apply(compiler);
26
27 // Hook into the compilation right after the native SourceMapDevToolPlugin does
28 compiler.plugin('compilation', compilation => {
29 compilation.plugin('after-optimize-chunk-assets', chunks => {
30 // Look for any compiled assets that might be an inline 'sourceMappingURL' source segment
31 if (compilation.assets) {
32 Object.getOwnPropertyNames(compilation.assets).forEach(assetName => {
33 const asset = compilation.assets[assetName];
34 if (asset && asset.children instanceof Array) {
35 for (let index = 0; index < asset.children.length; index++) {
36 const assetChild = asset.children[index];
37 if (typeof assetChild === 'string') {
38 // This asset is a source segment, so if it matches our regex, update it
39 asset.children[index] = assetChild.replace(searchValue, replaceValue);
40 }
41 }
42 }
43 });
44 }
45 });
46 });
47 }
48}