From 67c301294830e54f0f6c84320c74c585deac091b Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 10 Apr 2017 11:38:46 -0700 Subject: [PATCH] build: create sourcemap files * Creates sourceMap files for all bundles inside of the release. Fixes #852 --- package.json | 1 + tools/gulp/util/package-build.ts | 36 ++++++++++++++++++++++++++++---- tools/gulp/util/rollup-helper.ts | 1 + tools/gulp/util/ts-compiler.ts | 4 ++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index ad4745123364..e41900335135 100644 --- a/package.json +++ b/package.json @@ -106,6 +106,7 @@ "sass": "^0.5.0", "scss-bundle": "^1.0.1", "selenium-webdriver": "^3.1.0", + "sorcery": "^0.10.0", "stylelint": "^7.8.0", "travis-after-modes": "0.0.7", "ts-node": "^3.0.0", diff --git a/tools/gulp/util/package-build.ts b/tools/gulp/util/package-build.ts index 7613d00c68fc..930bf892f702 100644 --- a/tools/gulp/util/package-build.ts +++ b/tools/gulp/util/package-build.ts @@ -13,6 +13,7 @@ import { // There are no type definitions available for these imports. const uglify = require('uglify-js'); +const sorcery = require('sorcery'); /** * Copies different output files into a folder structure that follows the `angular/angular` @@ -28,8 +29,8 @@ export function composeRelease(packageName: string) { inlinePackageMetadataFiles(packagePath); copyFiles(packagePath, '**/*.+(d.ts|metadata.json)', join(releasePath, 'typings')); - copyFiles(DIST_BUNDLES, `${packageName}.umd?(.min).js`, join(releasePath, 'bundles')); - copyFiles(DIST_BUNDLES, `${packageName}?(.es5).js`, join(releasePath, '@angular')); + copyFiles(DIST_BUNDLES, `${packageName}.umd?(.min).js?(.map)`, join(releasePath, 'bundles')); + copyFiles(DIST_BUNDLES, `${packageName}?(.es5).js?(.map)`, join(releasePath, '@angular')); copyFiles(PROJECT_ROOT, 'LICENSE', releasePath); copyFiles(SOURCE_ROOT, 'README.md', releasePath); copyFiles(sourcePath, 'package.json', releasePath); @@ -57,6 +58,8 @@ export async function buildModuleEntry(entryFile: string, entryName = 'material' format: 'es', }); + await remapSourcemap(fesm2015File); + // Downlevel FESM-2015 file to ES5. transpileFile(fesm2015File, fesm2014File, { target: ScriptTarget.ES5, @@ -64,6 +67,8 @@ export async function buildModuleEntry(entryFile: string, entryName = 'material' allowJs: true }); + await remapSourcemap(fesm2014File); + // Create UMD bundle of FESM-2014 output. await createRollupBundle({ moduleName: moduleName, @@ -72,8 +77,31 @@ export async function buildModuleEntry(entryFile: string, entryName = 'material' format: 'umd' }); - // Output a minified version of the UMD bundle - writeFileSync(umdMinFile, uglify.minify(umdFile, { preserveComments: 'license' }).code); + await remapSourcemap(umdFile); + + uglifyFile(umdFile, umdMinFile); + + await remapSourcemap(umdMinFile); +} + +/** + * Finds the original sourcemap of the file and maps it to the current file. + * This is useful when multiple transformation happen (e.g TSC -> Rollup -> Uglify) + **/ +async function remapSourcemap(sourceFile: string) { + (await sorcery.load(sourceFile)).write(); +} + +/** Minifies a JavaScript file using UglifyJS2. Also writes sourcemaps to the output. */ +function uglifyFile(inputPath: string, outputPath: string) { + let sourcemapOut = `${outputPath}.map`; + let result = uglify.minify(inputPath, { + preserveComments: 'license', + outSourceMap: sourcemapOut + }); + + writeFileSync(outputPath, result.code); + writeFileSync(sourcemapOut, result.map); } function copyFiles(fromPath: string, fileGlob: string, outDir: string) { diff --git a/tools/gulp/util/rollup-helper.ts b/tools/gulp/util/rollup-helper.ts index 296782fb23f0..e766b2b7b993 100644 --- a/tools/gulp/util/rollup-helper.ts +++ b/tools/gulp/util/rollup-helper.ts @@ -60,6 +60,7 @@ export function createRollupBundle(config: BundleConfig): Promise { format: config.format, dest: config.dest, globals: ROLLUP_GLOBALS, + sourceMap: true }; return rollup.rollup(bundleOptions).then((bundle: any) => bundle.write(writeOptions)); diff --git a/tools/gulp/util/ts-compiler.ts b/tools/gulp/util/ts-compiler.ts index 1e875d706d8b..44f5f4e1d8d9 100644 --- a/tools/gulp/util/ts-compiler.ts +++ b/tools/gulp/util/ts-compiler.ts @@ -25,6 +25,10 @@ export function transpileFile(inputPath: string, outputPath: string, options: ts reportDiagnostics(transpiled.diagnostics); fs.writeFileSync(outputPath, transpiled.outputText); + + if (transpiled.sourceMapText) { + fs.writeFileSync(`${outputPath}.map`, transpiled.sourceMapText); + } } /** Parses a TypeScript project configuration. */