From 392a3935a757945be68dbde0c4bcc8d5b4aa7bd5 Mon Sep 17 00:00:00 2001 From: Charles Lyding Date: Mon, 10 Jul 2017 11:03:14 -0400 Subject: [PATCH 001/115] feat(@angular/cli): support inlining SVG within stylesheets --- .../cli/models/webpack-configs/styles.ts | 49 ++++++++++-------- tests/e2e/assets/images/spectrum.png | Bin 0 -> 30822 bytes tests/e2e/tests/build/css-urls.ts | 28 +++++----- tests/e2e/tests/build/deploy-url.ts | 16 +++--- tests/e2e/tests/build/output-hashing.ts | 17 +++--- tests/e2e/tests/build/styles/inline-urls.ts | 49 ++++++++++++++++++ tests/e2e/utils/assets.ts | 7 +++ 7 files changed, 113 insertions(+), 53 deletions(-) create mode 100644 tests/e2e/assets/images/spectrum.png create mode 100644 tests/e2e/tests/build/styles/inline-urls.ts diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 83392219cbdb..da05db9796c1 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -49,7 +49,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const postcssPluginCreator = function() { // safe settings based on: https://github.com/ben-eb/cssnano/issues/358#issuecomment-283696193 - const importantCommentRe = /@preserve|@license|[@#]\s*source(?:Mapping)?URL|^!/i; + const importantCommentRe = /@preserve|@licen[cs]e|[@#]\s*source(?:Mapping)?URL|^!/i; const minimizeOptions = { autoprefixer: false, // full pass with autoprefixer is run separately safe: true, @@ -58,30 +58,35 @@ export function getStylesConfig(wco: WebpackConfigOptions) { }; return [ - postcssUrl({ - url: (URL: { url: string }) => { - const { url } = URL; + postcssUrl([ + { // Only convert root relative URLs, which CSS-Loader won't process into require(). - if (!url.startsWith('/') || url.startsWith('//')) { - return URL.url; - } - - if (deployUrl.match(/:\/\//)) { - // If deployUrl contains a scheme, ignore baseHref use deployUrl as is. - return `${deployUrl.replace(/\/$/, '')}${url}`; - } else if (baseHref.match(/:\/\//)) { - // If baseHref contains a scheme, include it as is. - return baseHref.replace(/\/$/, '') + - `/${deployUrl}/${url}`.replace(/\/\/+/g, '/'); - } else { - // Join together base-href, deploy-url and the original URL. - // Also dedupe multiple slashes into single ones. - return `/${baseHref}/${deployUrl}/${url}`.replace(/\/\/+/g, '/'); + filter: ({ url }: { url: string }) => url.startsWith('/') && !url.startsWith('//'), + url: ({ url }: { url: string }) => { + if (deployUrl.match(/:\/\//)) { + // If deployUrl contains a scheme, ignore baseHref use deployUrl as is. + return `${deployUrl.replace(/\/$/, '')}${url}`; + } else if (baseHref.match(/:\/\//)) { + // If baseHref contains a scheme, include it as is. + return baseHref.replace(/\/$/, '') + + `/${deployUrl}/${url}`.replace(/\/\/+/g, '/'); + } else { + // Join together base-href, deploy-url and the original URL. + // Also dedupe multiple slashes into single ones. + return `/${baseHref}/${deployUrl}/${url}`.replace(/\/\/+/g, '/'); + } } + }, + { + // TODO: inline .cur if not supporting IE (use browserslist to check) + filter: (asset: any) => !asset.hash && !asset.absolutePath.endsWith('.cur'), + url: 'inline', + // NOTE: maxSize is in KB + maxSize: 10 } - }), + ]), autoprefixer(), - customProperties({ preserve: true}) + customProperties({ preserve: true }) ].concat( minimizeCss ? [cssnano(minimizeOptions)] : [] ); @@ -164,7 +169,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { loader: 'css-loader', options: { sourceMap: cssSourceMap, - importLoaders: 1 + importLoaders: 1, } }, { diff --git a/tests/e2e/assets/images/spectrum.png b/tests/e2e/assets/images/spectrum.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5f123afc84832cfe8d551417376e7295bc1d15 GIT binary patch literal 30822 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/tests/build/css-urls.ts b/tests/e2e/tests/build/css-urls.ts index 9bc565a428d3..06967b283167 100644 --- a/tests/e2e/tests/build/css-urls.ts +++ b/tests/e2e/tests/build/css-urls.ts @@ -1,4 +1,3 @@ -import * as fs from 'fs'; import { ng } from '../../utils/process'; import { expectFileToMatch, @@ -6,6 +5,7 @@ import { expectFileMatchToExist, writeMultipleFiles } from '../../utils/fs'; +import { copyProjectAsset } from '../../utils/assets'; import { expectToFail } from '../../utils/utils'; import { getGlobalVariable } from '../../utils/env'; @@ -26,32 +26,34 @@ export default function () { .then(() => writeMultipleFiles({ 'src/styles.css': ` h1 { background: url('/assets/global-img-absolute.svg'); } - h2 { background: url('./assets/global-img-relative.svg'); } + h2 { background: url('./assets/global-img-relative.png'); } `, 'src/app/app.component.css': ` h3 { background: url('/assets/component-img-absolute.svg'); } - h4 { background: url('../assets/component-img-relative.svg'); } + h4 { background: url('../assets/component-img-relative.png'); } `, - // Using SVGs because they are loaded via file-loader and thus never inlined. 'src/assets/global-img-absolute.svg': imgSvg, - 'src/assets/global-img-relative.svg': imgSvg, - 'src/assets/component-img-absolute.svg': imgSvg, - 'src/assets/component-img-relative.svg': imgSvg + 'src/assets/component-img-absolute.svg': imgSvg })) + // use image with file size >10KB to prevent inlining + .then(() => copyProjectAsset('images/spectrum.png', './assets/global-img-relative.png')) + .then(() => copyProjectAsset('images/spectrum.png', './assets/component-img-relative.png')) .then(() => ng('build', '--extract-css', '--aot')) // Check paths are correctly generated. .then(() => expectFileToMatch('dist/styles.bundle.css', '/assets/global-img-absolute.svg')) .then(() => expectFileToMatch('dist/styles.bundle.css', - /global-img-relative\.[0-9a-f]{20}\.svg/)) + /url\('\/assets\/global-img-absolute\.svg'\)/)) + .then(() => expectFileToMatch('dist/styles.bundle.css', + /global-img-relative\.[0-9a-f]{20}\.png/)) .then(() => expectFileToMatch('dist/main.bundle.js', '/assets/component-img-absolute.svg')) .then(() => expectFileToMatch('dist/main.bundle.js', - /component-img-relative\.[0-9a-f]{20}\.svg/)) + /component-img-relative\.[0-9a-f]{20}\.png/)) // Check files are correctly created. .then(() => expectToFail(() => expectFileToExist('dist/global-img-absolute.svg'))) .then(() => expectToFail(() => expectFileToExist('dist/component-img-absolute.svg'))) - .then(() => expectFileMatchToExist('./dist', /global-img-relative\.[0-9a-f]{20}\.svg/)) - .then(() => expectFileMatchToExist('./dist', /component-img-relative\.[0-9a-f]{20}\.svg/)) + .then(() => expectFileMatchToExist('./dist', /global-img-relative\.[0-9a-f]{20}\.png/)) + .then(() => expectFileMatchToExist('./dist', /component-img-relative\.[0-9a-f]{20}\.png/)) // Check urls with deploy-url scheme are used as is. .then(() => ng('build', '--base-href=/base/', '--deploy-url=http://deploy.url/', '--extract-css')) @@ -79,9 +81,9 @@ export default function () { .then(() => expectFileToMatch('dist/styles.bundle.css', '/base/deploy/assets/global-img-absolute.svg')) .then(() => expectFileToMatch('dist/styles.bundle.css', - /global-img-relative\.[0-9a-f]{20}\.svg/)) + /global-img-relative\.[0-9a-f]{20}\.png/)) .then(() => expectFileToMatch('dist/main.bundle.js', '/base/deploy/assets/component-img-absolute.svg')) .then(() => expectFileToMatch('dist/main.bundle.js', - /deploy\/component-img-relative\.[0-9a-f]{20}\.svg/)); + /deploy\/component-img-relative\.[0-9a-f]{20}\.png/)); } diff --git a/tests/e2e/tests/build/deploy-url.ts b/tests/e2e/tests/build/deploy-url.ts index 5882d2c8e5ba..87d294277ea0 100644 --- a/tests/e2e/tests/build/deploy-url.ts +++ b/tests/e2e/tests/build/deploy-url.ts @@ -1,8 +1,8 @@ import { ng } from '../../utils/process'; +import { copyProjectAsset } from '../../utils/assets'; import { expectFileToMatch, writeMultipleFiles } from '../../utils/fs'; import { updateJsonFile } from '../../utils/project'; import { getGlobalVariable } from '../../utils/env'; -import { stripIndents } from 'common-tags'; export default function () { @@ -14,16 +14,14 @@ export default function () { return Promise.resolve() .then(() => writeMultipleFiles({ - 'src/styles.css': 'div { background: url("./assets/more.svg"); }', - 'src/assets/more.svg': stripIndents` - - - - `})) + 'src/styles.css': 'div { background: url("./assets/more.png"); }', + })) + // use image with file size >10KB to prevent inlining + .then(() => copyProjectAsset('images/spectrum.png', './assets/more.png')) .then(() => ng('build', '--deploy-url=deployUrl/', '--extract-css')) .then(() => expectFileToMatch('dist/index.html', 'deployUrl/main.bundle.js')) // verify --deploy-url isn't applied to extracted css urls - .then(() => expectFileToMatch('dist/styles.bundle.css', /url\(more\.[0-9a-f]{20}\.svg\)/)) + .then(() => expectFileToMatch('dist/styles.bundle.css', /url\(more\.[0-9a-f]{20}\.png\)/)) .then(() => ng('build', '--deploy-url=http://example.com/some/path/', '--extract-css')) .then(() => expectFileToMatch('dist/index.html', 'http://example.com/some/path/main.bundle.js')) // verify option also works in config @@ -36,5 +34,5 @@ export default function () { // verify --deploy-url is applied to non-extracted css urls .then(() => ng('build', '--deploy-url=deployUrl/', '--extract-css=false')) .then(() => expectFileToMatch('dist/styles.bundle.js', - /__webpack_require__.p \+ \"more\.[0-9a-f]{20}\.svg\"/)); + /__webpack_require__.p \+ \"more\.[0-9a-f]{20}\.png\"/)); } diff --git a/tests/e2e/tests/build/output-hashing.ts b/tests/e2e/tests/build/output-hashing.ts index a7c091c25041..c066ea031aa4 100644 --- a/tests/e2e/tests/build/output-hashing.ts +++ b/tests/e2e/tests/build/output-hashing.ts @@ -1,5 +1,5 @@ -import {stripIndents} from 'common-tags'; import {ng} from '../../utils/process'; +import { copyProjectAsset } from '../../utils/assets'; import { writeMultipleFiles, expectFileToMatch, expectFileMatchToExist } from '../../utils/fs'; import { getGlobalVariable } from '../../utils/env'; @@ -16,32 +16,31 @@ export default function() { return Promise.resolve() .then(() => writeMultipleFiles({ - 'src/styles.css': stripIndents` - body { background-image: url("image.svg"); } - `, - 'src/image.svg': 'I would like to be an image someday.' + 'src/styles.css': 'body { background-image: url("./assets/image.png"); }' })) + // use image with file size >10KB to prevent inlining + .then(() => copyProjectAsset('images/spectrum.png', './assets/image.png')) .then(() => ng('build', '--dev', '--output-hashing=all')) .then(() => expectFileToMatch('dist/index.html', /inline\.[0-9a-f]{20}\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /main\.[0-9a-f]{20}\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /styles\.[0-9a-f]{20}\.bundle\.(css|js)/)) - .then(() => verifyMedia(/styles\.[0-9a-f]{20}\.bundle\.(css|js)/, /image\.[0-9a-f]{20}\.svg/)) + .then(() => verifyMedia(/styles\.[0-9a-f]{20}\.bundle\.(css|js)/, /image\.[0-9a-f]{20}\.png/)) .then(() => ng('build', '--prod', '--output-hashing=none')) .then(() => expectFileToMatch('dist/index.html', /inline\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /main\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /styles\.bundle\.(css|js)/)) - .then(() => verifyMedia(/styles\.bundle\.(css|js)/, /image\.svg/)) + .then(() => verifyMedia(/styles\.bundle\.(css|js)/, /image\.png/)) .then(() => ng('build', '--dev', '--output-hashing=media')) .then(() => expectFileToMatch('dist/index.html', /inline\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /main\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /styles\.bundle\.(css|js)/)) - .then(() => verifyMedia(/styles\.bundle\.(css|js)/, /image\.[0-9a-f]{20}\.svg/)) + .then(() => verifyMedia(/styles\.bundle\.(css|js)/, /image\.[0-9a-f]{20}\.png/)) .then(() => ng('build', '--dev', '--output-hashing=bundles')) .then(() => expectFileToMatch('dist/index.html', /inline\.[0-9a-f]{20}\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /main\.[0-9a-f]{20}\.bundle\.js/)) .then(() => expectFileToMatch('dist/index.html', /styles\.[0-9a-f]{20}\.bundle\.(css|js)/)) - .then(() => verifyMedia(/styles\.[0-9a-f]{20}\.bundle\.(css|js)/, /image\.svg/)); + .then(() => verifyMedia(/styles\.[0-9a-f]{20}\.bundle\.(css|js)/, /image\.png/)); } diff --git a/tests/e2e/tests/build/styles/inline-urls.ts b/tests/e2e/tests/build/styles/inline-urls.ts new file mode 100644 index 000000000000..ead6e674e05b --- /dev/null +++ b/tests/e2e/tests/build/styles/inline-urls.ts @@ -0,0 +1,49 @@ +import { ng } from '../../../utils/process'; +import { + expectFileToMatch, + expectFileToExist, + expectFileMatchToExist, + writeMultipleFiles +} from '../../../utils/fs'; +import { copyProjectAsset } from '../../../utils/assets'; +import { expectToFail } from '../../../utils/utils'; + +const imgSvg = ` + + + +`; + +export default function () { + return Promise.resolve() + .then(() => writeMultipleFiles({ + 'src/styles.css': ` + h1 { background: url('./assets/large.png'); } + h2 { background: url('./assets/small.svg'); } + p { background: url('./assets/small-id.svg#testID'); } + `, + 'src/app/app.component.css': ` + h3 { background: url('../assets/small.svg'); } + h4 { background: url('../assets/large.png'); } + `, + 'src/assets/small.svg': imgSvg, + 'src/assets/small-id.svg': imgSvg + })) + .then(() => copyProjectAsset('images/spectrum.png', './assets/large.png')) + .then(() => ng('build', '--extract-css', '--aot')) + // Check paths are correctly generated. + .then(() => expectFileToMatch('dist/styles.bundle.css', + /url\([\'"]?large\.[0-9a-f]{20}\.png[\'"]?\)/)) + .then(() => expectFileToMatch('dist/styles.bundle.css', + /url\(\\?[\'"]data:image\/svg\+xml/)) + .then(() => expectFileToMatch('dist/styles.bundle.css', + /url\([\'"]?small-id\.[0-9a-f]{20}\.svg#testID[\'"]?\)/)) + .then(() => expectFileToMatch('dist/main.bundle.js', + /url\(\\?[\'"]data:image\/svg\+xml/)) + .then(() => expectFileToMatch('dist/main.bundle.js', + /url\([\'"]?large\.[0-9a-f]{20}\.png[\'"]?\)/)) + // Check files are correctly created. + .then(() => expectToFail(() => expectFileToExist('dist/small.svg'))) + .then(() => expectFileMatchToExist('./dist', /large\.[0-9a-f]{20}\.png/)) + .then(() => expectFileMatchToExist('./dist', /small-id\.[0-9a-f]{20}\.svg/)); +} diff --git a/tests/e2e/utils/assets.ts b/tests/e2e/utils/assets.ts index d1a8e0a98ce2..72db65f90ef6 100644 --- a/tests/e2e/utils/assets.ts +++ b/tests/e2e/utils/assets.ts @@ -11,6 +11,13 @@ export function assetDir(assetName: string) { return join(__dirname, '../assets', assetName); } +export function copyProjectAsset(assetName: string, to?: string) { + const tempRoot = join(getGlobalVariable('tmp-root'), 'test-project', 'src'); + const sourcePath = assetDir(assetName); + const targetPath = join(tempRoot, to || assetName); + + return copyFile(sourcePath, targetPath); +} export function copyAssets(assetName: string) { const tempRoot = join(getGlobalVariable('tmp-root'), 'assets', assetName); From c636daf6c2b55d2d26df2c59ecb921a3d8eb1ac8 Mon Sep 17 00:00:00 2001 From: Job Date: Wed, 22 Nov 2017 11:11:02 +0100 Subject: [PATCH 002/115] fix(@angular/cli): pass sourceMap to postcss This is required per https://github.com/postcss/postcss-loader#sourcemap Closes #8588 --- packages/@angular/cli/models/webpack-configs/styles.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index da05db9796c1..122be05274a3 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -177,7 +177,8 @@ export function getStylesConfig(wco: WebpackConfigOptions) { options: { // A non-function property is required to workaround a webpack option handling bug ident: 'postcss', - plugins: postcssPluginCreator + plugins: postcssPluginCreator, + sourceMap: cssSourceMap } } ]; From b056b1d958bbe13e7999ecfa32821ed332870bd8 Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Wed, 22 Nov 2017 22:07:31 +0100 Subject: [PATCH 003/115] fix(@ngtools/webpack): do not change user's `LOCALE_ID` --- packages/@ngtools/webpack/src/angular_compiler_plugin.ts | 8 +++++--- tests/e2e/tests/i18n/build-locale.ts | 6 +++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index f0c8342791d6..ed87b72a272f 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -108,6 +108,7 @@ export class AngularCompilerPlugin implements Tapable { private _donePromise: Promise | null; private _compiler: any = null; private _compilation: any = null; + private _normalizedLocale: string; // TypeChecker process. private _forkTypeChecker = true; @@ -225,7 +226,8 @@ export class AngularCompilerPlugin implements Tapable { this._compilerOptions.i18nOutFormat = options.i18nOutFormat; } if (options.locale !== undefined) { - this._compilerOptions.i18nInLocale = this._validateLocale(options.locale); + this._compilerOptions.i18nInLocale = options.locale; + this._normalizedLocale = this._validateLocale(options.locale); } if (options.missingTranslation !== undefined) { this._compilerOptions.i18nInMissingTranslations = @@ -652,9 +654,9 @@ export class AngularCompilerPlugin implements Tapable { // If we have a locale, auto import the locale data file. // This transform must go before replaceBootstrap because it looks for the entry module // import, which will be replaced. - if (this._compilerOptions.i18nInLocale) { + if (this._normalizedLocale) { this._transformers.push(registerLocaleData(isAppPath, getEntryModule, - this._compilerOptions.i18nInLocale)); + this._normalizedLocale)); } if (!this._JitMode) { diff --git a/tests/e2e/tests/i18n/build-locale.ts b/tests/e2e/tests/i18n/build-locale.ts index 4f68d6ea37d4..cab606dd1d17 100644 --- a/tests/e2e/tests/i18n/build-locale.ts +++ b/tests/e2e/tests/i18n/build-locale.ts @@ -18,5 +18,9 @@ export default function () { .then(() => expectFileToMatch('dist/main.bundle.js', /registerLocaleData/)) .then(() => expectFileToMatch('dist/main.bundle.js', /angular_common_locales_fr/)) .then(() => rimraf('dist')) - .then(() => expectToFail(() => ng('build', '--aot', '--locale=no-locale'))) + .then(() => ng('build', '--aot', '--locale=fr_FR')) + .then(() => expectFileToMatch('dist/main.bundle.js', /registerLocaleData/)) + .then(() => expectFileToMatch('dist/main.bundle.js', /angular_common_locales_fr/)) + .then(() => rimraf('dist')) + .then(() => expectToFail(() => ng('build', '--aot', '--locale=no-locale'))); } From 233338f17073ac31ab4eaee09f90b3c7fb912a55 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Fri, 17 Nov 2017 21:47:11 -0500 Subject: [PATCH 004/115] fix(@angular/cli): Correct service worker error message Fixes #8490 --- packages/@angular/cli/utilities/service-worker/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/@angular/cli/utilities/service-worker/index.ts b/packages/@angular/cli/utilities/service-worker/index.ts index 8d8b93ac7f55..cc0b6cfa4f0e 100644 --- a/packages/@angular/cli/utilities/service-worker/index.ts +++ b/packages/@angular/cli/utilities/service-worker/index.ts @@ -1,5 +1,5 @@ import { Filesystem } from '@angular/service-worker/config'; -import { stripIndent } from 'common-tags'; +import { oneLine } from 'common-tags'; import * as crypto from 'crypto'; import * as fs from 'fs'; import * as path from 'path'; @@ -71,9 +71,9 @@ export function augmentAppWithServiceWorker(projectRoot: string, appRoot: string const configPath = path.resolve(appRoot, 'ngsw-config.json'); if (!fs.existsSync(configPath)) { - throw new Error(stripIndent`Expected to find an ngsw-config.json configuration file in the - application root. Either provide one or disable Service Worker - build support in angular-cli.json.`); + throw new Error(oneLine`Error: Expected to find an ngsw-config.json configuration + file in the ${appRoot} folder. Either provide one or disable Service Worker + in .angular-cli.json.`); } const config = fs.readFileSync(configPath, 'utf8'); From e3e04c57551040b94f6c19bf4b9fbb872d30655f Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Mon, 20 Nov 2017 15:25:56 -0800 Subject: [PATCH 005/115] fix(@ngtools/webpack): add a simple sanity check for preventing wrong styleUrls Fixes #8560. --- packages/@ngtools/webpack/src/resource_loader.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/@ngtools/webpack/src/resource_loader.ts b/packages/@ngtools/webpack/src/resource_loader.ts index 38dc019c6fbc..e914c654e6c9 100644 --- a/packages/@ngtools/webpack/src/resource_loader.ts +++ b/packages/@ngtools/webpack/src/resource_loader.ts @@ -36,6 +36,11 @@ export class WebpackResourceLoader { throw new Error('WebpackResourceLoader cannot be used without parentCompilation'); } + // Simple sanity check. + if (filePath.match(/\.[jt]s$/)) { + return Promise.reject('Cannot use a JavaScript or TypeScript file for styleUrl.'); + } + const compilerName = `compiler(${this._uniqueId++})`; const outputOptions = { filename: filePath }; const relativePath = path.relative(this._context || '', filePath); From 8c0779f6a33169ad22bb6410646f5283b399cfbe Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Thu, 14 Sep 2017 20:31:08 -0400 Subject: [PATCH 006/115] feat(@angular/cli): Add ability to build AppShell --- packages/@angular/cli/commands/build.ts | 49 +++++- packages/@angular/cli/lib/config/schema.json | 14 ++ packages/@angular/cli/models/build-options.ts | 1 + .../@angular/cli/tasks/render-universal.ts | 33 ++++ .../build/build-app-shell-with-schematic.ts | 25 +++ tests/e2e/tests/build/build-app-shell.ts | 142 ++++++++++++++++++ 6 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 packages/@angular/cli/tasks/render-universal.ts create mode 100644 tests/e2e/tests/build/build-app-shell-with-schematic.ts create mode 100644 tests/e2e/tests/build/build-app-shell.ts diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index 64bd4f823461..52687ee6501f 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -2,6 +2,9 @@ import { CliConfig } from '../models/config'; import { BuildOptions } from '../models/build-options'; import { Version } from '../upgrade/version'; import { oneLine } from 'common-tags'; +import { getAppFromConfig } from '../utilities/app-utils'; +import { join } from 'path'; +import { RenderUniversalTaskOptions } from '../tasks/render-universal'; const Command = require('../ember-cli/lib/models/command'); @@ -198,6 +201,12 @@ export const baseBuildCommandOptions: any = [ aliases: ['sw'], description: 'Generates a service worker config for production builds, if the app has ' + 'service worker enabled.' + }, + { + name: 'skip-app-shell', + type: Boolean, + description: 'Flag to prevent building an app shell', + default: false } ]; @@ -237,7 +246,45 @@ const BuildCommand = Command.extend({ ui: this.ui, }); - return buildTask.run(commandOptions); + + const buildPromise = buildTask.run(commandOptions); + + + const clientApp = getAppFromConfig(commandOptions.app); + + const doAppShell = commandOptions.target === 'production' && + (commandOptions.aot === undefined || commandOptions.aot === true) && + !commandOptions.skipAppShell; + if (!clientApp.appShell || !doAppShell) { + return buildPromise; + } + const serverApp = getAppFromConfig(clientApp.appShell.app); + + return buildPromise + .then(() => { + + const serverOptions = { + ...commandOptions, + app: clientApp.appShell.app + }; + return buildTask.run(serverOptions); + }) + .then(() => { + const RenderUniversalTask = require('../tasks/render-universal').default; + + const renderUniversalTask = new RenderUniversalTask({ + project: this.project, + ui: this.ui, + }); + const renderUniversalOptions: RenderUniversalTaskOptions = { + inputIndexPath: join(this.project.root, clientApp.outDir, clientApp.index), + route: clientApp.appShell.route, + serverOutDir: join(this.project.root, serverApp.outDir), + outputIndexPath: join(this.project.root, clientApp.outDir, clientApp.index) + }; + + return renderUniversalTask.run(renderUniversalOptions); + }); } }); diff --git a/packages/@angular/cli/lib/config/schema.json b/packages/@angular/cli/lib/config/schema.json index 6e38ae682e2f..ed76e185da45 100644 --- a/packages/@angular/cli/lib/config/schema.json +++ b/packages/@angular/cli/lib/config/schema.json @@ -38,6 +38,20 @@ "description": "Directory where app files are placed.", "default": "app" }, + "appShell": { + "type": "object", + "description": "AppShell configuration.", + "properties": { + "app": { + "type": "string", + "description": "Index or name of the related AppShell app." + }, + "route": { + "type": "string", + "description": "Default AppShell route to render." + } + } + }, "root": { "type": "string", "description": "The root directory of the app." diff --git a/packages/@angular/cli/models/build-options.ts b/packages/@angular/cli/models/build-options.ts index 13f7c23324ed..05abcfb3ee23 100644 --- a/packages/@angular/cli/models/build-options.ts +++ b/packages/@angular/cli/models/build-options.ts @@ -32,4 +32,5 @@ export interface BuildOptions { subresourceIntegrity?: boolean; forceTsCommonjs?: boolean; serviceWorker?: boolean; + skipAppShell?: boolean; } diff --git a/packages/@angular/cli/tasks/render-universal.ts b/packages/@angular/cli/tasks/render-universal.ts new file mode 100644 index 000000000000..dfb54c54ef2c --- /dev/null +++ b/packages/@angular/cli/tasks/render-universal.ts @@ -0,0 +1,33 @@ +import { requireProjectModule } from '../utilities/require-project-module'; +import { join } from 'path'; + +const fs = require('fs'); +const Task = require('../ember-cli/lib/models/task'); + +export interface RenderUniversalTaskOptions { + inputIndexPath: string; + route: string; + serverOutDir: string; + outputIndexPath: string; +} + +export default Task.extend({ + run: function(options: RenderUniversalTaskOptions): Promise { + require('zone.js/dist/zone-node'); + + const renderModuleFactory = + requireProjectModule(this.project.root, '@angular/platform-server').renderModuleFactory; + + // Get the main bundle from the server build's output directory. + const serverDir = fs.readdirSync(options.serverOutDir); + const serverMainBundle = serverDir + .filter((file: string) => /main\.[a-zA-Z0-9]{20}.bundle\.js/.test(file))[0]; + const serverBundlePath = join(options.serverOutDir, serverMainBundle); + const AppServerModuleNgFactory = require(serverBundlePath).AppServerModuleNgFactory; + + const index = fs.readFileSync(options.inputIndexPath, 'utf8'); + // Render to HTML and overwrite the client index file. + return renderModuleFactory(AppServerModuleNgFactory, {document: index, url: options.route}) + .then((html: string) => fs.writeFileSync(options.outputIndexPath, html)); + } +}); diff --git a/tests/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/e2e/tests/build/build-app-shell-with-schematic.ts new file mode 100644 index 000000000000..fc4b5d209526 --- /dev/null +++ b/tests/e2e/tests/build/build-app-shell-with-schematic.ts @@ -0,0 +1,25 @@ +import { ng, npm } from '../../utils/process'; +import { expectFileToMatch } from '../../utils/fs'; +import { getGlobalVariable } from '../../utils/env'; +import { expectToFail } from '../../utils/utils'; + + +export default function () { + // Skip this in ejected tests. + if (getGlobalVariable('argv').eject) { + return Promise.resolve(); + } + + // Skip in nightly tests. + if (getGlobalVariable('argv').nightly) { + return Promise.resolve(); + } + + return Promise.resolve() + .then(() => ng('generate', 'appShell', 'name', '--universal-app', 'universal')) + .then(() => npm('install')) + .then(() => ng('build', '--prod')) + .then(() => expectFileToMatch('dist/index.html', /app-shell works!/)) + .then(() => ng('build', '--prod', '--skip-app-shell')) + .then(() => expectToFail(() => expectFileToMatch('dist/index.html', /app-shell works!/))); +} diff --git a/tests/e2e/tests/build/build-app-shell.ts b/tests/e2e/tests/build/build-app-shell.ts new file mode 100644 index 000000000000..32cae3eb1feb --- /dev/null +++ b/tests/e2e/tests/build/build-app-shell.ts @@ -0,0 +1,142 @@ +import { ng, npm } from '../../utils/process'; +import { expectFileToMatch, writeFile } from '../../utils/fs'; +import { getGlobalVariable } from '../../utils/env'; +import { expectToFail } from '../../utils/utils'; +import { updateJsonFile } from '../../utils/project'; +import { readNgVersion } from '../../utils/version'; +import { stripIndent } from 'common-tags'; + + +export default function () { + // Skip this in ejected tests. + if (getGlobalVariable('argv').eject) { + return Promise.resolve(); + } + + let platformServerVersion = readNgVersion(); + + if (getGlobalVariable('argv').nightly) { + platformServerVersion = 'github:angular/platform-server-builds'; + } + + return Promise.resolve() + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['appShell'] = { + app: '1', + route: 'shell' + }; + configJson['apps'].push({ + platform: 'server', + root: 'src', + outDir: 'dist-server', + assets: [ + 'assets', + 'favicon.ico' + ], + index: 'index.html', + main: 'main.server.ts', + test: 'test.ts', + tsconfig: 'tsconfig.server.json', + testTsconfig: 'tsconfig.spec.json', + prefix: 'app', + styles: [ + 'styles.css' + ], + scripts: [], + environmentSource: 'environments/environment.ts', + environments: { + dev: 'environments/environment.ts', + prod: 'environments/environment.prod.ts' + } + }); + })) + .then(() => writeFile('src/app/app.module.ts', stripIndent` + import { BrowserModule } from '@angular/platform-browser'; + import { NgModule } from '@angular/core'; + import { RouterModule } from '@angular/router'; + + import { AppComponent } from './app.component'; + + @NgModule({ + imports: [ + BrowserModule.withServerTransition({ appId: 'appshell-play' }), + RouterModule + ], + declarations: [AppComponent], + bootstrap: [AppComponent] + }) + export class AppModule { } + `)) + .then(() => writeFile('src/app/app.component.html', stripIndent` + Hello World + + `)) + .then(() => writeFile('src/tsconfig.server.json', stripIndent` + { + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "commonjs", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ], + "angularCompilerOptions": { + "entryModule": "app/app.server.module#AppServerModule" + } + } + `)) + .then(() => writeFile('src/main.server.ts', stripIndent` + export {AppServerModule} from './app/app.server.module'; + `)) + .then(() => writeFile('src/app/app.server.module.ts', stripIndent` + import {NgModule} from '@angular/core'; + import {ServerModule} from '@angular/platform-server'; + import { Routes, RouterModule } from '@angular/router'; + + import { AppModule } from './app.module'; + import { AppComponent } from './app.component'; + import { ShellComponent } from './shell.component'; + + const routes: Routes = [ + { path: 'shell', component: ShellComponent } + ]; + + @NgModule({ + imports: [ + // The AppServerModule should import your AppModule followed + // by the ServerModule from @angular/platform-server. + AppModule, + ServerModule, + RouterModule.forRoot(routes), + ], + // Since the bootstrapped component is not inherited from your + // imported AppModule, it needs to be repeated here. + bootstrap: [AppComponent], + declarations: [ShellComponent], + }) + export class AppServerModule {} + `)) + .then(() => writeFile('src/app/shell.component.ts', stripIndent` + import { Component } from '@angular/core'; + @Component({ + selector: 'app-shell', + template: '

shell Works!

', + styles: [] + }) + export class ShellComponent {} + `)) + .then(() => updateJsonFile('package.json', packageJson => { + const dependencies = packageJson['dependencies']; + dependencies['@angular/platform-server'] = platformServerVersion; + }) + .then(() => npm('install'))) + .then(() => ng('build', '--prod')) + .then(() => expectFileToMatch('dist/index.html', /shell Works!/)) + .then(() => ng('build', '--prod', '--skip-app-shell')) + .then(() => expectToFail(() => expectFileToMatch('dist/index.html', /shell Works!/))); +} From c60e8af97784d13a6be8b89de82bf0f134266a8f Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Wed, 22 Nov 2017 22:52:21 -0800 Subject: [PATCH 007/115] release: 1.6.0-rc.0 --- package-lock.json | 2 +- package.json | 2 +- packages/@angular/cli/package.json | 4 ++-- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28e68ef39edb..64923713f300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-beta.2", + "version": "1.6.0-rc.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index adab4c28470f..cab8b9c6e863 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-beta.2", + "version": "1.6.0-rc.0", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 9de573893fa1..bc001441e033 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-beta.2", + "version": "1.6.0-rc.0", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -30,7 +30,7 @@ "@angular-devkit/build-optimizer": "~0.0.31", "@angular-devkit/schematics": "~0.0.34", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.0-beta.2", + "@ngtools/webpack": "1.9.0-rc.0", "@schematics/angular": "~0.1.5", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 3b7d315e8138..3a6dc486a3fb 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.0-beta.2", + "version": "1.9.0-rc.0", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 38b117872acdbba26f9454977fa00d7e330f47d7 Mon Sep 17 00:00:00 2001 From: Anthony Leveillee Date: Mon, 20 Nov 2017 21:23:23 -0500 Subject: [PATCH 008/115] docs: add sass brand variable for bootstrap 4 --- docs/documentation/stories/include-bootstrap.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/documentation/stories/include-bootstrap.md b/docs/documentation/stories/include-bootstrap.md index 3debf5d279f1..b5d244342113 100644 --- a/docs/documentation/stories/include-bootstrap.md +++ b/docs/documentation/stories/include-bootstrap.md @@ -117,7 +117,11 @@ Verify the bootstrap styled button appears. To ensure your variables are used open `_variables.scss` and add the following: ```sass +// version 3 $brand-primary: red; + +// version 4 +$primary: red; ``` Return the browser to see the font color changed. From 0773033f9e06da7e7987af76f14a28ff27915123 Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Fri, 24 Nov 2017 08:43:56 -0800 Subject: [PATCH 009/115] fix(@angular/cli): allow build output in outDir outside of project --- .../cli/models/webpack-configs/common.ts | 9 +++++---- tests/e2e/tests/build/assets.ts | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/common.ts b/packages/@angular/cli/models/webpack-configs/common.ts index ecb60283a19c..3b8751292ab3 100644 --- a/packages/@angular/cli/models/webpack-configs/common.ts +++ b/packages/@angular/cli/models/webpack-configs/common.ts @@ -99,11 +99,12 @@ export function getCommonConfig(wco: WebpackConfigOptions) { // specify a configuration flag. // Also prevent writing outside the project path. That is not overridable. const fullOutputPath = path.resolve(buildOptions.outputPath, asset.output); - if (!fullOutputPath.startsWith(projectRoot)) { - const message = 'An asset cannot be written to a location outside the project.'; - throw new SilentError(message); - } if (!fullOutputPath.startsWith(path.resolve(buildOptions.outputPath))) { + if (!fullOutputPath.startsWith(projectRoot)) { + const message = 'An asset cannot be written to a location outside the project.'; + throw new SilentError(message); + } + if (!asset.allowOutsideOutDir) { const message = 'An asset cannot be written to a location outside of the output path. ' + 'You can override this message by setting the `allowOutsideOutDir` ' diff --git a/tests/e2e/tests/build/assets.ts b/tests/e2e/tests/build/assets.ts index 9b7e91941339..4b5a9a07a9d7 100644 --- a/tests/e2e/tests/build/assets.ts +++ b/tests/e2e/tests/build/assets.ts @@ -1,3 +1,4 @@ +import * as path from 'path'; import { writeMultipleFiles, createDir, @@ -10,6 +11,10 @@ import { expectToFail } from '../../utils/utils'; import {getGlobalVariable} from '../../utils/env'; +const temp = require('temp'); +const tempDir = path.join(temp.mkdirSync('angular-cli-e2e-assets-'), 'out'); + + export default function () { // Disable parts of it in webpack tests. const ejected = getGlobalVariable('argv').eject; @@ -55,6 +60,21 @@ export default function () { })) .then(() => expectToFail(() => ng('build'))) + // This asset will not fail with the exception above. + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['outDir'] = tempDir; + app['assets'] = [ + { 'glob': '**/*', 'input': '../node_modules/some-package/', 'output': tempDir, + 'allowOutsideOutDir': true } + ]; + })) + .then(() => ng('build')) + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['outDir'] = 'dist'; + }) + // This asset should also fail from reading from outside the project. .then(() => updateJsonFile('.angular-cli.json', configJson => { const app = configJson['apps'][0]; From 4e7afcb3d69a98c0124c5c6dc9b8c9f799b01ed6 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 23 Nov 2017 11:30:20 +0000 Subject: [PATCH 010/115] docs(@angular/cli): add section on build command about build-optimizer and vendor-chunk Fix #8586 --- docs/documentation/build.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/documentation/build.md b/docs/documentation/build.md index 2aa151aff024..6fb166b1f676 100644 --- a/docs/documentation/build.md +++ b/docs/documentation/build.md @@ -83,13 +83,20 @@ Flag | `--dev` | `--prod` `--named-chunks`   | `true` | `false` `--build-optimizer` | `false` | `true` with AOT and Angular 5 -`--extract-licenses` Extract all licenses in a separate file, in the case of production builds only. -`--i18n-file` Localization file to use for i18n. `--prod` also sets the following non-flaggable settings: - Adds service worker if configured in `.angular-cli.json`. - Replaces `process.env.NODE_ENV` in modules with the `production` value (this is needed for some libraries, like react). - Runs UglifyJS on the code. +### `--build-optimizer` and `--vendor-chunk` + +When using Build Optimizer the vendor chunk will be disabled by default. +You can override this with `--vendor-chunk=true`. + +Total bundle sizes with Build Optimizer are smaller if there is no separate vendor chunk because +having vendor code in the same chunk as app code makes it possible for Uglify to remove more unused +code. + ### CSS resources Resources in CSS, such as images and fonts, will be copied over automatically as part of a build. @@ -377,3 +384,14 @@ Note: service worker support is experimental and subject to change. In a server build, state whether `all` or `none` dependencies should be bundles in the output.

+ + +
+ extract-licenses +

+ --extract-licenses default value: true +

+

+ Extract all licenses in a separate file, in the case of production builds only. +

+
From fabd4b36b756d8bd2f6e08134e785b5a592076dd Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 17 Nov 2017 16:41:52 +0000 Subject: [PATCH 011/115] fix(@angular/cli): ensure purify is before uglify --- packages/@angular/cli/models/webpack-configs/production.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index fddc7f373861..22fe8a014f79 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -136,6 +136,8 @@ export function getProdConfig(wco: WebpackConfigOptions) { }), new webpack.HashedModuleIdsPlugin(), new webpack.optimize.ModuleConcatenationPlugin(), + ...extraPlugins, + // Uglify should be the last plugin as PurifyPlugin needs to be before it. new UglifyJSPlugin({ sourceMap: buildOptions.sourcemaps, uglifyOptions: { @@ -150,7 +152,6 @@ export function getProdConfig(wco: WebpackConfigOptions) { }, } }), - ...extraPlugins ] }; } From e9abbb920dce1ddbec92e1317f633d4b26a7ac9d Mon Sep 17 00:00:00 2001 From: Saff Date: Thu, 9 Nov 2017 19:43:05 +0000 Subject: [PATCH 012/115] refactor(@angular/cli): remove eslint errors for console --- packages/@angular/cli/bin/ng | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/@angular/cli/bin/ng b/packages/@angular/cli/bin/ng index 2c265c957d4d..3f32d98ffb80 100755 --- a/packages/@angular/cli/bin/ng +++ b/packages/@angular/cli/bin/ng @@ -151,6 +151,7 @@ resolve('@angular/cli', { basedir: process.cwd() }, localVersion = _fromPackageJson(); shouldWarn = localVersion && globalVersion.compare(localVersion) > 0; } catch (e) { + // eslint-disable-next-line no-console console.error(e); shouldWarn = true; } @@ -163,14 +164,14 @@ resolve('@angular/cli', { basedir: process.cwd() }, To disable this warning use "ng set --global warnings.versionMismatch=false". `); // Don't show warning colorised on `ng completion` - if (process.argv[2] !== 'completion') { - // eslint-disable no-console - console.log(warning); - } else { - // eslint-disable no-console - console.error(warning); - process.exit(1); - } + if (process.argv[2] !== 'completion') { + // eslint-disable-next-line no-console + console.log(warning); + } else { + // eslint-disable-next-line no-console + console.error(warning); + process.exit(1); + } } // No error implies a projectLocalCli, which will load whatever From aa5656e1663d91729477e868406bc75fc9d1e3af Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 27 Nov 2017 09:09:08 -0500 Subject: [PATCH 013/115] fix(@angular/cli): support minified JS on safari 10 --- packages/@angular/cli/models/webpack-configs/production.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index 22fe8a014f79..591bf95f4fd6 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -144,11 +144,14 @@ export function getProdConfig(wco: WebpackConfigOptions) { ecma: wco.supportES2015 ? 6 : 5, warnings: buildOptions.verbose, ie8: false, - mangle: true, + mangle: { + safari10: true, + }, compress: uglifyCompressOptions, output: { ascii_only: true, - comments: false + comments: false, + webkit: true, }, } }), From 78e139500986111635b69a6ff071230add2499a9 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 27 Nov 2017 11:50:13 -0500 Subject: [PATCH 014/115] fix(@angular/cli): honor project's hmr warning option --- packages/@angular/cli/tasks/serve.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@angular/cli/tasks/serve.ts b/packages/@angular/cli/tasks/serve.ts index 18274a5c92c5..6884ea3d716d 100644 --- a/packages/@angular/cli/tasks/serve.ts +++ b/packages/@angular/cli/tasks/serve.ts @@ -119,7 +119,7 @@ export default Task.extend({ ${yellow('NOTICE')} Hot Module Replacement (HMR) is enabled for the dev server. `); - const showWarning = CliConfig.fromGlobal().get('warnings.hmrWarning'); + const showWarning = CliConfig.fromProject().get('warnings.hmrWarning'); if (showWarning) { ui.writeLine(' The project will still live reload when HMR is enabled,'); ui.writeLine(' but to take advantage of HMR additional application code is required'); @@ -127,7 +127,7 @@ export default Task.extend({ ui.writeLine(` See ${chalk.blue(webpackHmrLink)}`); ui.writeLine(' for information on working with HMR for Webpack.'); ui.writeLine(oneLine` - ${yellow('To disable this warning use "ng set --global warnings.hmrWarning=false"')} + ${yellow('To disable this warning use "ng set warnings.hmrWarning=false"')} `); } entryPoints.push('webpack/hot/dev-server'); From 4b0c7a35359effc1d93cd3bb5ddc5c441b3cf154 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 27 Nov 2017 13:05:18 +0000 Subject: [PATCH 015/115] fix(@ngtools/webpack): fallback to main thread typechecking This PR will prevent the main thread for exiting when the forked type checker exists unexpectedly. A warning will be logged on the console when this happens: ``` WARNING in AngularCompilerPlugin: Forked Type Checker exited unexpectedly. Falling back to typechecking on main thread. ``` Fix #8331 --- .../webpack/src/angular_compiler_plugin.ts | 57 +++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index ed87b72a272f..9793f658579c 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -106,9 +106,9 @@ export class AngularCompilerPlugin implements Tapable { // Webpack plugin. private _firstRun = true; private _donePromise: Promise | null; - private _compiler: any = null; - private _compilation: any = null; private _normalizedLocale: string; + private _warnings: (string | Error)[] = []; + private _errors: (string | Error)[] = []; // TypeChecker process. private _forkTypeChecker = true; @@ -447,7 +447,7 @@ export class AngularCompilerPlugin implements Tapable { if (moduleKey in this._lazyRoutes) { if (this._lazyRoutes[moduleKey] !== modulePath) { // Found a duplicate, this is an error. - this._compilation.warnings.push( + this._warnings.push( new Error(`Duplicated path in loadChildren detected during a rebuild. ` + `We will take the latest version detected and override it to save rebuild time. ` + `You should perform a full build to validate that your routes don't overlap.`) @@ -483,12 +483,32 @@ export class AngularCompilerPlugin implements Tapable { // Cleanup. const killTypeCheckerProcess = () => { - treeKill(this._typeCheckerProcess.pid, 'SIGTERM'); + if (this._typeCheckerProcess && this._typeCheckerProcess.pid) { + treeKill(this._typeCheckerProcess.pid, 'SIGTERM'); + this._typeCheckerProcess = undefined; + this._forkTypeChecker = false; + } + }; + + // Handle child process exit. + const handleChildProcessExit = () => { + killTypeCheckerProcess(); + const msg = 'AngularCompilerPlugin: Forked Type Checker exited unexpectedly. ' + + 'Falling back to typechecking on main thread.'; + this._warnings.push(msg); + }; + this._typeCheckerProcess.once('exit', handleChildProcessExit); + this._typeCheckerProcess.once('SIGINT', handleChildProcessExit); + this._typeCheckerProcess.once('uncaughtException', handleChildProcessExit); + + // Handle parent process exit. + const handleParentProcessExit = () => { + killTypeCheckerProcess(); process.exit(); }; - process.once('exit', killTypeCheckerProcess); - process.once('SIGINT', killTypeCheckerProcess); - process.once('uncaughtException', killTypeCheckerProcess); + process.once('exit', handleParentProcessExit); + process.once('SIGINT', handleParentProcessExit); + process.once('uncaughtException', handleParentProcessExit); } private _updateForkedTypeChecker(rootNames: string[], changedCompilationFiles: string[]) { @@ -498,8 +518,6 @@ export class AngularCompilerPlugin implements Tapable { // Registration hook for webpack plugin. apply(compiler: any) { - this._compiler = compiler; - // Decorate inputFileSystem to serve contents of CompilerHost. // Use decorated inputFileSystem in watchFileSystem. compiler.plugin('environment', () => { @@ -573,7 +591,6 @@ export class AngularCompilerPlugin implements Tapable { }); compiler.plugin('done', () => { this._donePromise = null; - this._compilation = null; }); // TODO: consider if it's better to remove this plugin and instead make it wait on the @@ -604,14 +621,13 @@ export class AngularCompilerPlugin implements Tapable { private _make(compilation: any, cb: (err?: any, request?: any) => void) { time('AngularCompilerPlugin._make'); - this._compilation = compilation; this._emitSkipped = true; - if (this._compilation._ngToolsWebpackPluginInstance) { + if (compilation._ngToolsWebpackPluginInstance) { return cb(new Error('An @ngtools/webpack plugin already exist for this compilation.')); } // Set a private variable for this plugin instance. - this._compilation._ngToolsWebpackPluginInstance = this; + compilation._ngToolsWebpackPluginInstance = this; // Update the resource loader with the new webpack compilation. this._resourceLoader.update(compilation); @@ -624,15 +640,24 @@ export class AngularCompilerPlugin implements Tapable { this._donePromise = Promise.resolve() .then(() => this._update()) .then(() => { + this.pushCompilationErrors(compilation); timeEnd('AngularCompilerPlugin._make'); cb(); }, (err: any) => { compilation.errors.push(err.stack); + this.pushCompilationErrors(compilation); timeEnd('AngularCompilerPlugin._make'); cb(); }); } + private pushCompilationErrors(compilation: any) { + compilation.errors.push(...this._errors); + compilation.warnings.push(...this._warnings); + this._errors = []; + this._warnings = []; + } + private _makeTransformers() { const isAppPath = (fileName: string) => @@ -730,18 +755,18 @@ export class AngularCompilerPlugin implements Tapable { if (errors.length > 0) { const message = formatDiagnostics(errors); - this._compilation.errors.push(message); + this._errors.push(message); } if (warnings.length > 0) { const message = formatDiagnostics(warnings); - this._compilation.warnings.push(message); + this._warnings.push(message); } this._emitSkipped = !emitResult || emitResult.emitSkipped; // Reset changed files on successful compilation. - if (!this._emitSkipped && this._compilation.errors.length === 0) { + if (!this._emitSkipped && this._errors.length === 0) { this._compilerHost.resetChangedFileTracker(); } timeEnd('AngularCompilerPlugin._update'); From 8821520c2af143bc5e0388a88422c7492911d6f3 Mon Sep 17 00:00:00 2001 From: Wykks Date: Wed, 4 Oct 2017 16:41:23 +0200 Subject: [PATCH 016/115] fix(@angular/cli): Disable comparisons feature in uglify compression in production --- .../@angular/cli/models/webpack-configs/production.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index 591bf95f4fd6..bde81969cffb 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -117,7 +117,13 @@ export function getProdConfig(wco: WebpackConfigOptions) { })); } - const uglifyCompressOptions: any = {}; + const uglifyCompressOptions: any = { + // Disabled because of an issue with Uglify breaking seemingly valid code: + // https://github.com/angular/angular-cli/issues/5804 + // Further investigation: + // https://github.com/mishoo/UglifyJS2/issues/2011 + comparisons: false + }; if (buildOptions.buildOptimizer) { // This plugin must be before webpack.optimize.UglifyJsPlugin. From c573d91dad47a2afbba88b892dd0e8822f0618ce Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Mon, 27 Nov 2017 11:16:11 -0500 Subject: [PATCH 017/115] fix(@angular/cli): Add app-shell error msg If configured app shell app is not configured as platform server throw an error --- packages/@angular/cli/commands/build.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index 52687ee6501f..401a2b28289c 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -7,7 +7,7 @@ import { join } from 'path'; import { RenderUniversalTaskOptions } from '../tasks/render-universal'; const Command = require('../ember-cli/lib/models/command'); - +const SilentError = require('silent-error'); const config = CliConfig.fromProject() || CliConfig.fromGlobal(); const buildConfigDefaults = config.getPaths('defaults.build', [ @@ -246,19 +246,25 @@ const BuildCommand = Command.extend({ ui: this.ui, }); - - const buildPromise = buildTask.run(commandOptions); - - const clientApp = getAppFromConfig(commandOptions.app); const doAppShell = commandOptions.target === 'production' && (commandOptions.aot === undefined || commandOptions.aot === true) && !commandOptions.skipAppShell; + + let serverApp: any = null; + if (clientApp.appShell && doAppShell) { + serverApp = getAppFromConfig(clientApp.appShell.app); + if (serverApp.platform !== 'server') { + throw new SilentError(`Shell app's platform is not "server"`); + } + } + + const buildPromise = buildTask.run(commandOptions); + if (!clientApp.appShell || !doAppShell) { return buildPromise; } - const serverApp = getAppFromConfig(clientApp.appShell.app); return buildPromise .then(() => { From 03014187ce124740c2f6857686226614ff84f7f4 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Mon, 27 Nov 2017 11:17:11 -0500 Subject: [PATCH 018/115] fix(@angular/cli): Allow app-shell build without hashing App shell builds will now work when output-hashing is none --- packages/@angular/cli/tasks/render-universal.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@angular/cli/tasks/render-universal.ts b/packages/@angular/cli/tasks/render-universal.ts index dfb54c54ef2c..113748274886 100644 --- a/packages/@angular/cli/tasks/render-universal.ts +++ b/packages/@angular/cli/tasks/render-universal.ts @@ -21,7 +21,7 @@ export default Task.extend({ // Get the main bundle from the server build's output directory. const serverDir = fs.readdirSync(options.serverOutDir); const serverMainBundle = serverDir - .filter((file: string) => /main\.[a-zA-Z0-9]{20}.bundle\.js/.test(file))[0]; + .filter((file: string) => /main\.(?:[a-zA-Z0-9]{20}\.)?bundle\.js/.test(file))[0]; const serverBundlePath = join(options.serverOutDir, serverMainBundle); const AppServerModuleNgFactory = require(serverBundlePath).AppServerModuleNgFactory; From 388cce9d25e002f152cd4626c10226d3c9fd6f22 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 29 Nov 2017 11:29:15 +0000 Subject: [PATCH 019/115] revert: test: make nightly e2e run fully on travis This reverts commit 5aa8a15997faaeadadaf2ceef0e775765eb969f6. --- .travis.yml | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9b50b6185d4c..038d74b90c0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,24 +43,6 @@ matrix: os: linux script: node tests/run_e2e.js --nb-shards=4 --shard=3 --nosilent env: e2e-3 - - - node_js: "6" - os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=0 --nosilent --nightly - env: nightly-0 - - node_js: "6" - os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=1 --nosilent --nightly - env: nightly-1 - - node_js: "6" - os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=2 --nosilent --nightly - env: nightly-2 - - node_js: "6" - os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=3 --nosilent --nightly - env: nightly-3 - - node_js: "6" os: linux script: node tests/run_e2e.js --eject "--glob=tests/build/**" @@ -72,6 +54,11 @@ matrix: before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js --ng2 "--glob=tests/{build,test,misc}/**" env: ng2 + - node_js: "6" + os: linux + before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi + script: node tests/run_e2e.js "--nightly --glob=tests/{build,test,misc}/**" + env: nightly - node_js: "7" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi From 87fc9a18dc071ed9fc2f5faacac6aa6a64e30aef Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 29 Nov 2017 12:14:29 +0000 Subject: [PATCH 020/115] ci: add separate CI track for Angular 4 --- .travis.yml | 5 +++ tests/e2e/setup/500-create-project.ts | 2 ++ tests/e2e/tests/build/aot/exclude.ts | 5 ++- .../build/build-app-shell-with-schematic.ts | 4 +-- tests/e2e/tests/build/build-app-shell.ts | 5 +++ tests/e2e/tests/build/build-errors.ts | 5 +-- tests/e2e/tests/build/build-optimizer.ts | 6 ++-- tests/e2e/tests/build/platform-server.ts | 5 +-- tests/e2e/tests/build/rebuild-error.ts | 4 +-- tests/e2e/tests/build/rebuild-ngfactories.ts | 4 +-- tests/e2e/tests/i18n/build-locale.ts | 5 ++- tests/e2e/tests/misc/typescript-warning.ts | 8 ++--- tests/e2e/utils/project.ts | 36 ++++++++++++++++++- 13 files changed, 69 insertions(+), 25 deletions(-) diff --git a/.travis.yml b/.travis.yml index 038d74b90c0a..6373584db071 100644 --- a/.travis.yml +++ b/.travis.yml @@ -54,6 +54,11 @@ matrix: before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js --ng2 "--glob=tests/{build,test,misc}/**" env: ng2 + - node_js: "6" + os: linux + before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi + script: node tests/run_e2e.js --ng4 "--glob=tests/{build,test,misc}/**" + env: ng4 - node_js: "6" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi diff --git a/tests/e2e/setup/500-create-project.ts b/tests/e2e/setup/500-create-project.ts index b4aa8f108e99..0e784d13de07 100644 --- a/tests/e2e/setup/500-create-project.ts +++ b/tests/e2e/setup/500-create-project.ts @@ -5,6 +5,7 @@ import { updateTsConfig, updateJsonFile, useNg2, + useNg4, useSha, useCIChrome, useCIDefaults, @@ -45,6 +46,7 @@ export default function() { .then(() => useCIChrome()) .then(() => useCIDefaults()) .then(() => argv['ng2'] ? useNg2() : Promise.resolve()) + .then(() => argv['ng4'] ? useNg4() : Promise.resolve()) .then(() => argv.nightly || argv['ng-sha'] ? useSha() : Promise.resolve()) // npm link on Circle CI is very noisy. .then(() => silentNpm('install')) diff --git a/tests/e2e/tests/build/aot/exclude.ts b/tests/e2e/tests/build/aot/exclude.ts index 94b474832f23..3266012f1f35 100644 --- a/tests/e2e/tests/build/aot/exclude.ts +++ b/tests/e2e/tests/build/aot/exclude.ts @@ -7,9 +7,8 @@ export default function () { // Disable parts of it in webpack tests. const ejected = getGlobalVariable('argv').eject; - // Skip this in ng5 tests, it only happens in ng2/4. - // This check should be changed once ng5 because the default. - if (getGlobalVariable('argv').nightly) { + // This test is only for Angular 2/4 projects. + if (!getGlobalVariable('argv').ng2 && !getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/e2e/tests/build/build-app-shell-with-schematic.ts index fc4b5d209526..aed5e3c7b088 100644 --- a/tests/e2e/tests/build/build-app-shell-with-schematic.ts +++ b/tests/e2e/tests/build/build-app-shell-with-schematic.ts @@ -10,8 +10,8 @@ export default function () { return Promise.resolve(); } - // Skip in nightly tests. - if (getGlobalVariable('argv').nightly) { + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/build/build-app-shell.ts b/tests/e2e/tests/build/build-app-shell.ts index 32cae3eb1feb..cc531557f1ac 100644 --- a/tests/e2e/tests/build/build-app-shell.ts +++ b/tests/e2e/tests/build/build-app-shell.ts @@ -13,6 +13,11 @@ export default function () { return Promise.resolve(); } + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { + return Promise.resolve(); + } + let platformServerVersion = readNgVersion(); if (getGlobalVariable('argv').nightly) { diff --git a/tests/e2e/tests/build/build-errors.ts b/tests/e2e/tests/build/build-errors.ts index 341debe750b0..93acf7597a37 100644 --- a/tests/e2e/tests/build/build-errors.ts +++ b/tests/e2e/tests/build/build-errors.ts @@ -15,13 +15,14 @@ export default function () { if (process.platform.startsWith('win')) { return Promise.resolve(); } + // Skip this in ejected tests. if (getGlobalVariable('argv').eject) { return Promise.resolve(); } - // Skip in non-nightly tests. Switch this check around when ng5 is out. - if (!getGlobalVariable('argv').nightly) { + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/build/build-optimizer.ts b/tests/e2e/tests/build/build-optimizer.ts index 6e0dd82b2bdf..399909bfa986 100644 --- a/tests/e2e/tests/build/build-optimizer.ts +++ b/tests/e2e/tests/build/build-optimizer.ts @@ -9,12 +9,12 @@ export default function () { .then(() => expectToFail(() => expectFileToExist('dist/vendor.js'))) .then(() => expectToFail(() => expectFileToMatch('dist/main.js', /\.decorators =/))) .then(() => { - // Check if build optimizer is on by default in ng5 prod builds - // This check should be changed once ng5 because the default. - if (!getGlobalVariable('argv').nightly) { + // Skip this part of the test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } + // Check if build optimizer is on by default in ng5 prod builds return Promise.resolve() .then(() => ng('build', '--prod')) .then(() => expectToFail(() => expectFileToExist('dist/vendor.js'))) diff --git a/tests/e2e/tests/build/platform-server.ts b/tests/e2e/tests/build/platform-server.ts index 8d7622c90c55..1420374128ad 100644 --- a/tests/e2e/tests/build/platform-server.ts +++ b/tests/e2e/tests/build/platform-server.ts @@ -26,8 +26,9 @@ export default function () { let platformServerVersion = readNgVersion(); - if (getGlobalVariable('argv').nightly) { - platformServerVersion = 'github:angular/platform-server-builds'; + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { + return Promise.resolve(); } return Promise.resolve() diff --git a/tests/e2e/tests/build/rebuild-error.ts b/tests/e2e/tests/build/rebuild-error.ts index 5da761dd1e76..a069e740e601 100644 --- a/tests/e2e/tests/build/rebuild-error.ts +++ b/tests/e2e/tests/build/rebuild-error.ts @@ -26,8 +26,8 @@ export default function () { return Promise.resolve(); } - // Skip in non-nightly tests. Switch this check around when ng5 is out. - if (!getGlobalVariable('argv').nightly) { + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/build/rebuild-ngfactories.ts b/tests/e2e/tests/build/rebuild-ngfactories.ts index 59969db5ed4b..26702d8a1156 100644 --- a/tests/e2e/tests/build/rebuild-ngfactories.ts +++ b/tests/e2e/tests/build/rebuild-ngfactories.ts @@ -70,8 +70,8 @@ export default function () { } }) .then(() => { - // Skip in non-nightly tests. Switch this check around when ng5 is out. - if (!getGlobalVariable('argv').nightly) { + // Skip this part of the test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/i18n/build-locale.ts b/tests/e2e/tests/i18n/build-locale.ts index cab606dd1d17..033e425a499e 100644 --- a/tests/e2e/tests/i18n/build-locale.ts +++ b/tests/e2e/tests/i18n/build-locale.ts @@ -5,9 +5,8 @@ import { expectToFail } from '../../utils/utils'; export default function () { - // Check if register locale works in ng5 prod builds - // This check should be changed once ng5 because the default. - if (!getGlobalVariable('argv').nightly) { + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); } diff --git a/tests/e2e/tests/misc/typescript-warning.ts b/tests/e2e/tests/misc/typescript-warning.ts index 6b8735a3de34..28f695df101b 100644 --- a/tests/e2e/tests/misc/typescript-warning.ts +++ b/tests/e2e/tests/misc/typescript-warning.ts @@ -7,11 +7,9 @@ export default function () { // Update as needed. let unsupportedTsVersion = '2.5'; - // TODO: re-enable for ng5, adjust as needed. This test fails on ng5 because the 2.5 is supported. - // When ng5 because the default this test will need to be adjusted to use 2.3 as the unsupported - // version, and to disable the experimental angular compiler (transforms need 2.4 minimum). - if (getGlobalVariable('argv').nightly) { - return; + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { + return Promise.resolve(); } return Promise.resolve() diff --git a/tests/e2e/utils/project.ts b/tests/e2e/utils/project.ts index a11784cfbd12..233e8b390336 100644 --- a/tests/e2e/utils/project.ts +++ b/tests/e2e/utils/project.ts @@ -42,6 +42,7 @@ export function createProject(name: string, ...args: string[]) { .then(() => useCIChrome()) .then(() => useCIDefaults()) .then(() => argv['ng2'] ? useNg2() : Promise.resolve()) + .then(() => argv['ng4'] ? useNg4() : Promise.resolve()) .then(() => argv.nightly || argv['ng-sha'] ? useSha() : Promise.resolve()) .then(() => console.log(`Project ${name} created... Installing npm.`)) .then(() => silentNpm('install')); @@ -172,7 +173,7 @@ export function useCIChrome() { .catch(() => null); } -// Convert a Angular 4 project to Angular 2. +// Convert a Angular 5 project to Angular 2. export function useNg2() { const ng2Deps: any = { 'dependencies': { @@ -284,3 +285,36 @@ export function useNg2() { .then(() => updateJsonFile('e2e/tsconfig.e2e.json', json => Object.assign(json, tsconfigE2eJson))); } + +// Convert a Angular 5 project to Angular 4. +export function useNg4() { + const ng4Deps: any = { + 'dependencies': { + '@angular/common': '^4.4.6', + '@angular/compiler': '^4.4.6', + '@angular/core': '^4.4.6', + '@angular/forms': '^4.4.6', + '@angular/http': '^4.4.6', + '@angular/platform-browser': '^4.4.6', + '@angular/platform-browser-dynamic': '^4.4.6', + '@angular/router': '^4.4.6', + 'zone.js': '^0.8.14' + }, + 'devDependencies': { + '@angular/compiler-cli': '^4.4.6', + 'typescript': '~2.3.3' + } + }; + + + return Promise.resolve() + .then(() => updateJsonFile('package.json', json => { + Object.keys(ng4Deps['dependencies']).forEach(pkgName => { + json['dependencies'][pkgName] = ng4Deps['dependencies'][pkgName]; + }); + Object.keys(ng4Deps['devDependencies']).forEach(pkgName => { + json['devDependencies'][pkgName] = ng4Deps['devDependencies'][pkgName]; + }); + console.log(JSON.stringify(json)) + })); +} From 06a2da5d472ab0b842241770acfcb0986f3e2757 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 29 Nov 2017 14:08:31 +0000 Subject: [PATCH 021/115] ci: run only build tests on ng2/ng4/node7 Running build/test/misc was routinely hitting the time limit (50mins). --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6373584db071..23583a3193ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,22 +52,22 @@ matrix: - node_js: "6" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi - script: node tests/run_e2e.js --ng2 "--glob=tests/{build,test,misc}/**" + script: node tests/run_e2e.js --ng2 "--glob=tests/build/**" env: ng2 - node_js: "6" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi - script: node tests/run_e2e.js --ng4 "--glob=tests/{build,test,misc}/**" + script: node tests/run_e2e.js --ng4 "--glob=tests/build/**" env: ng4 - node_js: "6" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi - script: node tests/run_e2e.js "--nightly --glob=tests/{build,test,misc}/**" + script: node tests/run_e2e.js --nightly "--glob=tests/build/**" env: nightly - node_js: "7" os: linux before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi - script: node tests/run_e2e.js "--glob=tests/{build,test,misc}/**" + script: node tests/run_e2e.js "--glob=tests/build/**" env: node7 - node_js: "8" os: linux From 4e47e9b44c1bfd4646005b1d4f442e26b80ad17e Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 28 Nov 2017 10:36:43 -0500 Subject: [PATCH 022/115] refactor(@angular/cli): cleanup unused dependencies --- package-lock.json | 32 ++++---------------------- package.json | 3 +-- packages/@angular/cli/lib/cli/index.ts | 4 ---- 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64923713f300..249cfac167e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2305,12 +2305,6 @@ "tapable": "0.2.8" } }, - "ensure-posix-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", - "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=", - "dev": true - }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -5308,15 +5302,6 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "matcher-collection": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz", - "integrity": "sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -8971,16 +8956,6 @@ "indexof": "0.0.1" } }, - "walk-sync": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz", - "integrity": "sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==", - "dev": true, - "requires": { - "ensure-posix-path": "1.0.2", - "matcher-collection": "1.0.5" - } - }, "watchpack": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", @@ -9625,9 +9600,10 @@ "dev": true }, "zone.js": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.17.tgz", - "integrity": "sha1-TF5RhahX2o2nk9rzkZNxxaNrKgs=" + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.18.tgz", + "integrity": "sha512-knKOBQM0oea3/x9pdyDuDi7RhxDlJhOIkeixXSiTKWLgs4LpK37iBc+1HaHwzlciHUKT172CymJFKo8Xgh+44Q==", + "dev": true } } } diff --git a/package.json b/package.json index cab8b9c6e863..8f421a8b2f91 100644 --- a/package.json +++ b/package.json @@ -142,8 +142,7 @@ "temp": "0.8.3", "through": "^2.3.6", "ts-node": "^3.2.0", - "tslint": "^5.1.0", - "walk-sync": "^0.3.1" + "tslint": "^5.1.0" }, "optionalDependencies": { "node-sass": "^4.3.0" diff --git a/packages/@angular/cli/lib/cli/index.ts b/packages/@angular/cli/lib/cli/index.ts index e47fe33117c9..4f6a81d09294 100644 --- a/packages/@angular/cli/lib/cli/index.ts +++ b/packages/@angular/cli/lib/cli/index.ts @@ -1,7 +1,3 @@ -// Prevent the dependency validation from tripping because we don't import these. We need -// it as a peer dependency of @angular/core. -// require('zone.js') - import * as path from 'path'; const cli = require('../../ember-cli/lib/cli'); From abbd4a67d41299231b905de12eb805872a2bedfd Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 29 Nov 2017 13:49:52 -0800 Subject: [PATCH 023/115] fix(@angular/cli): support ejection of service worker apps --- packages/@angular/cli/tasks/eject.ts | 12 +++++++++++- tests/e2e/tests/build/service-worker.ts | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index a782ac21e640..c644fa12c362 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -7,6 +7,7 @@ import { getAppFromConfig } from '../utilities/app-utils'; import { EjectTaskOptions } from '../commands/eject'; import { NgCliWebpackConfig } from '../models/webpack-config'; import { CliConfig } from '../models/config'; +import { usesServiceWorker } from '../utilities/service-worker'; import { stripBom } from '../utilities/strip-bom'; import { AotPlugin, AngularCompilerPlugin } from '@ngtools/webpack'; import { PurifyPlugin } from '@angular-devkit/build-optimizer'; @@ -484,7 +485,6 @@ class JsonWebpackSerializer { } } - export default Task.extend({ run: function (runTaskOptions: EjectTaskOptions) { const project = this.project; @@ -554,6 +554,16 @@ export default Task.extend({ packageJson['scripts']['pree2e'] = pree2eNpmScript; packageJson['scripts']['e2e'] = 'protractor ./protractor.conf.js'; + if (!!appConfig.serviceWorker && runTaskOptions.target === 'production' && + usesServiceWorker(project.root) && !!runTaskOptions.serviceWorker) { + packageJson['scripts']['build'] += ' && npm run sw-config && npm run sw-copy'; + packageJson['scripts']['sw-config'] = `ngsw-config ${outputPath} src/ngsw-config.json`; + packageJson['scripts']['sw-copy'] = + `cpx node_modules/@angular/service-worker/ngsw-worker.js ${outputPath}`; + + packageJson['devDependencies']['cpx'] = '^1.5.0'; + } + // Add new dependencies based on our dependencies. const ourPackageJson = require('../package.json'); if (!packageJson['devDependencies']) { diff --git a/tests/e2e/tests/build/service-worker.ts b/tests/e2e/tests/build/service-worker.ts index 8a2c7aebfbae..33c6bf90158a 100644 --- a/tests/e2e/tests/build/service-worker.ts +++ b/tests/e2e/tests/build/service-worker.ts @@ -1,7 +1,7 @@ import {join} from 'path'; import {getGlobalVariable} from '../../utils/env'; import {expectFileNotToExist, expectFileToExist, expectFileToMatch, writeFile} from '../../utils/fs'; -import {ng, silentNpm} from '../../utils/process'; +import {ng, npm, silentNpm} from '../../utils/process'; const MANIFEST = { index: '/index.html', @@ -42,5 +42,11 @@ export default function() { .then(() => expectFileToMatch('dist/ngsw.json', /"\/foo\/bar\/index.html"/)) .then(() => ng('build', '--prod', '--service-worker=false')) .then(() => expectFileNotToExist('dist/ngsw.json')) + .then(() => ng('eject', '--prod')) + .then(() => silentNpm('install')) + .then(() => npm('run', 'build')) + .then(() => expectFileToMatch('package.json', /"sw-config"/)) + .then(() => expectFileToExist(join(process.cwd(), 'dist/ngsw-worker.js'))) + .then(() => expectFileToExist(join(process.cwd(), 'dist/ngsw.json'))) .then(() => ng('set', 'apps.0.serviceWorker=false')); } From 930437e5dc3bbb759b2616ac50275bb1de82703c Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 29 Nov 2017 23:02:34 +0000 Subject: [PATCH 024/115] release: 1.6.0-rc.1 --- package-lock.json | 850 ++----------------------- package.json | 8 +- packages/@angular/cli/package.json | 10 +- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 51 insertions(+), 819 deletions(-) diff --git a/package-lock.json b/package-lock.json index 249cfac167e4..df9eda734264 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,37 +1,46 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.0", + "version": "1.6.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.28.tgz", - "integrity": "sha512-rG5sGV5a2F3R5E+8WRnvq/UPDY2uN5iQjMBDsId1oILjBSAUSwOZM10zQ3De+sd89CmT/R6aSkr6YtbkYn8G0Q==", + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.34.tgz", + "integrity": "sha512-uSvyKtkDnfnBt6GGJ0m1nFI9IylKq6KoQil04GobhDCXFyin6Gbr50focx3jaizwDuh4v/x11fEUi5/cSUkKhA==", "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", - "typescript": "2.4.2", + "typescript": "2.6.1", "webpack-sources": "1.0.1" - } - }, - "@angular-devkit/core": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.20.tgz", - "integrity": "sha512-lg5BvMxOfbVD//SOQvpq6TPIKTXYNMj0I9N/kfXbXkUGgiBGFLyFMf2fc+qNvDoa7lulKMPT8OJWS1YlGt93eg==", - "requires": { - "source-map": "0.5.7" + }, + "dependencies": { + "typescript": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", + "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=" + } } }, "@angular-devkit/schematics": { - "version": "0.0.35", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.35.tgz", - "integrity": "sha512-+qGUWhmMpHqHkYKMk1yKQDjXb/vqXGkzbMiRs/u5rSnlrH+/TzkCO0UsM7/p9WPcModuDxkf5FItpw/AgdcPeQ==", + "version": "0.0.38", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.38.tgz", + "integrity": "sha512-vvyn7p/t4EKLSONGIw9jot9iMM3lEvdMDfnLkgubznIiIFxH9I+aYw9BBV2AmwE7OASHrCRpwFf7K2EqJ0f9+A==", "requires": { - "@angular-devkit/core": "0.0.20", + "@angular-devkit/core": "0.0.22", "@ngtools/json-schema": "1.1.0", "minimist": "1.2.0", "rxjs": "5.5.2" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", + "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "requires": { + "source-map": "0.5.7" + } + } } }, "@angular/compiler": { @@ -79,11 +88,21 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.0.tgz", - "integrity": "sha512-+Yy72J55uImsROxwyyEMso+HJIvx7+ffT8o8HzdNOZyLg4jj7G/ZDiCsCmhRtTYOmOof4OqvF2VecJyXVi0oHA==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.8.tgz", + "integrity": "sha512-88QrOoS0gQ6BdKulP01dTPmfPwLhvzb4jCcKkp0g8kvzTkIadlORmC9bQtucJI5huPU2bglVfmPgAk2ZwMSLDA==", "requires": { - "@angular-devkit/core": "0.0.20" + "@angular-devkit/core": "0.0.22" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", + "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "requires": { + "source-map": "0.5.7" + } + } } }, "@types/common-tags": { @@ -1029,7 +1048,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3028,791 +3046,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -9602,8 +8835,7 @@ "zone.js": { "version": "0.8.18", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.18.tgz", - "integrity": "sha512-knKOBQM0oea3/x9pdyDuDi7RhxDlJhOIkeixXSiTKWLgs4LpK37iBc+1HaHwzlciHUKT172CymJFKo8Xgh+44Q==", - "dev": true + "integrity": "sha512-knKOBQM0oea3/x9pdyDuDi7RhxDlJhOIkeixXSiTKWLgs4LpK37iBc+1HaHwzlciHUKT172CymJFKo8Xgh+44Q==" } } } diff --git a/package.json b/package.json index 8f421a8b2f91..4619cae725d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.0", + "version": "1.6.0-rc.1", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -41,9 +41,9 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.28", - "@angular-devkit/schematics": "~0.0.35", - "@schematics/angular": "~0.1.0", + "@angular-devkit/build-optimizer": "~0.0.34", + "@angular-devkit/schematics": "~0.0.38", + "@schematics/angular": "~0.1.8", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^3.0.0", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index bc001441e033..64a3cd05098d 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.0", + "version": "1.6.0-rc.1", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -27,11 +27,11 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.31", - "@angular-devkit/schematics": "~0.0.34", + "@angular-devkit/build-optimizer": "~0.0.34", + "@angular-devkit/schematics": "~0.0.38", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.0-rc.0", - "@schematics/angular": "~0.1.5", + "@ngtools/webpack": "1.9.0-rc.1", + "@schematics/angular": "~0.1.8", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^3.0.0", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 3a6dc486a3fb..4a693adb440c 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.0-rc.0", + "version": "1.9.0-rc.1", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From ef1747e4108ae5c70c66b21ed9373b80f1043568 Mon Sep 17 00:00:00 2001 From: Saff Date: Tue, 28 Nov 2017 21:12:54 +0000 Subject: [PATCH 025/115] fix(@angular/cli): allow backticks in templateUrl and styleUrls --- .../transformers/replace_resources.spec.ts | 37 +++++++++++++++++++ .../src/transformers/replace_resources.ts | 5 ++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/src/transformers/replace_resources.spec.ts b/packages/@ngtools/webpack/src/transformers/replace_resources.spec.ts index 0382d746c96f..d3c454e00d33 100644 --- a/packages/@ngtools/webpack/src/transformers/replace_resources.spec.ts +++ b/packages/@ngtools/webpack/src/transformers/replace_resources.spec.ts @@ -41,6 +41,43 @@ describe('@ngtools/webpack transformers', () => { expect(oneLine`${result}`).toEqual(oneLine`${output}`); }); + it('should replace resources with backticks', () => { + const input = stripIndent` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + templateUrl: \`./app.component.html\`, + styleUrls: [\`./app.component.css\`, \`./app.component.2.css\`] + }) + export class AppComponent { + title = 'app'; + } + `; + const output = stripIndent` + import * as tslib_1 from "tslib"; + import { Component } from '@angular/core'; + let AppComponent = class AppComponent { + constructor() { + this.title = 'app'; + } + }; + AppComponent = tslib_1.__decorate([ + Component({ + selector: 'app-root', + template: require("./app.component.html"), + styles: [require("./app.component.css"), require("./app.component.2.css")] + }) + ], AppComponent); + export { AppComponent }; + `; + + const transformer = replaceResources(() => true); + const result = transformTypescript(input, [transformer]); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + it('should not replace resources if shouldTransform returns false', () => { const input = stripIndent` import { Component } from '@angular/core'; diff --git a/packages/@ngtools/webpack/src/transformers/replace_resources.ts b/packages/@ngtools/webpack/src/transformers/replace_resources.ts index 7d206e809b19..875ee464856e 100644 --- a/packages/@ngtools/webpack/src/transformers/replace_resources.ts +++ b/packages/@ngtools/webpack/src/transformers/replace_resources.ts @@ -131,7 +131,10 @@ function _getContentOfKeyLiteral(node?: ts.Node): string | null { } function _getResourceRequest(element: ts.Expression, sourceFile: ts.SourceFile) { - if (element.kind == ts.SyntaxKind.StringLiteral) { + if ( + element.kind === ts.SyntaxKind.StringLiteral || + element.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral + ) { const url = (element as ts.StringLiteral).text; // If the URL does not start with ./ or ../, prepends ./ to it. return `${/^\.?\.\//.test(url) ? '' : './'}${url}`; From ef526759ce5c78ba36e1c8df213e17185bf07c51 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 30 Nov 2017 15:16:53 +0000 Subject: [PATCH 026/115] fix(@angular/cli): use a more restrictive workaround for mapbox-gl workaround See https://github.com/angular/angular-cli/pull/7931#issuecomment-348032708 --- .../@angular/cli/models/webpack-configs/production.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index bde81969cffb..72a4d81eefdc 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -118,11 +118,11 @@ export function getProdConfig(wco: WebpackConfigOptions) { } const uglifyCompressOptions: any = { - // Disabled because of an issue with Uglify breaking seemingly valid code: - // https://github.com/angular/angular-cli/issues/5804 - // Further investigation: - // https://github.com/mishoo/UglifyJS2/issues/2011 - comparisons: false + // Disabled because of an issue with Mapbox GL when using the Webpack node global and UglifyJS: + // https://github.com/mapbox/mapbox-gl-js/issues/4359#issuecomment-303880888 + // https://github.com/angular/angular-cli/issues/5804 + // https://github.com/angular/angular-cli/pull/7931 + typeofs : false }; if (buildOptions.buildOptimizer) { From dd13e779aadc66da652a0e1de6444b356cb7576f Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 30 Nov 2017 15:49:25 +0000 Subject: [PATCH 027/115] ci: use npm5 on circleci --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 85d7be1c8ca1..2f189ca47d4a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ version: 2 anchor_1: &defaults working_directory: ~/angular-cli docker: - - image: angular/ngcontainer + - image: angular/ngcontainer:0.0.5 # Restore cache based on package-lock.json checksum for branch. anchor_2: &restore_cache_defaults @@ -25,7 +25,7 @@ jobs: <<: *restore_cache_defaults - run: node --version - run: npm --version - - run: npm install --quiet + - run: npm install --no-save - run: npm run build - save_cache: key: angular-cli-{{ checksum "package-lock.json" }} From a237113aae2b4805692b1717064122480faa2d56 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Wed, 29 Nov 2017 16:56:33 -0800 Subject: [PATCH 028/115] docs: css-preprocessors wiki - inline styles must be in CSS. Cannot write them in less, sass, or stylus See issue #8472 --- docs/documentation/stories/css-preprocessors.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/documentation/stories/css-preprocessors.md b/docs/documentation/stories/css-preprocessors.md index b897b0893af0..58bd0071deab 100644 --- a/docs/documentation/stories/css-preprocessors.md +++ b/docs/documentation/stories/css-preprocessors.md @@ -30,3 +30,5 @@ Or set the default style on an existing project: ```bash ng set defaults.styleExt scss ``` + +Style strings added to the `@Component.styles` array _must be written in CSS_ because the CLI cannot apply a pre-processor to inline styles. \ No newline at end of file From 4f1b1b44a19e31f9b281051e8c5b5f36af2c1164 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 28 Nov 2017 18:36:18 -0500 Subject: [PATCH 029/115] refactor(@angular/cli): remove unneeded custom webpack typings --- packages/@angular/cli/webpack-custom-typings.d.ts | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 packages/@angular/cli/webpack-custom-typings.d.ts diff --git a/packages/@angular/cli/webpack-custom-typings.d.ts b/packages/@angular/cli/webpack-custom-typings.d.ts deleted file mode 100644 index b57841eb3c17..000000000000 --- a/packages/@angular/cli/webpack-custom-typings.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as webpack from 'webpack'; - -declare module 'webpack' { - export class NamedChunksPlugin { - constructor(nameResolver: (chunk: any) => string | null); - } - export class HashedModuleIdsPlugin { - constructor(); - } -} From 230ab61fc841cc205d11a7b29ad110011fed2b69 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 30 Nov 2017 11:58:29 -0500 Subject: [PATCH 030/115] fix(@angular/cli): update webpack plugins --- package-lock.json | 808 ++++++++++++++++++++++++++++- package.json | 6 +- packages/@angular/cli/package.json | 6 +- 3 files changed, 805 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index df9eda734264..86dfd1ef2e51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1048,6 +1048,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1086,9 +1087,9 @@ } }, "circular-dependency-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz", - "integrity": "sha1-m2hpLjWw41EJmNAWS2rlARvqV2A=" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.2.1.tgz", + "integrity": "sha512-Ggm3s8lvFVr2aYqDK6v09D1sJN17n3E7FE3R2khWFHchNop0QLRQvJi4JYsgwX0DNf7gZvXuOQsjTcj2qIVBqg==" }, "circular-json": { "version": "0.3.3", @@ -2761,9 +2762,9 @@ } }, "extract-text-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz", - "integrity": "sha1-kMqnkHvESfM1AF46x1MrQbAN5hI=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { "async": "2.5.0", "loader-utils": "1.1.0", @@ -3046,6 +3047,795 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -8464,9 +9254,9 @@ } }, "webpack-concat-plugin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-1.4.0.tgz", - "integrity": "sha512-Ym9Qm5Sw9oXJYChNJk09I/yaXDaV3UDxsa07wcCvILzIeSJTnSUZjhS4y2YkULzgE8VHOv9X04KtlJPZGwXqMg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-1.4.2.tgz", + "integrity": "sha512-HdV2xOq4twtL2ThR9NSCCQ888v1JBMpJfm3k2mA1I5LkS2+/6rv8q/bb9yTSaR0fVaMtANZi4Wkz0xc33MAt6w==", "requires": { "md5": "2.2.1", "uglify-js": "2.8.29" diff --git a/package.json b/package.json index 4619cae725d3..f0555d946695 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@schematics/angular": "~0.1.8", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", - "circular-dependency-plugin": "^3.0.0", + "circular-dependency-plugin": "^4.2.1", "common-tags": "^1.3.1", "copy-webpack-plugin": "^4.1.1", "core-object": "^3.1.0", @@ -56,7 +56,7 @@ "ember-cli-string-utils": "^1.0.0", "enhanced-resolve": "^3.4.1", "exports-loader": "^0.6.3", - "extract-text-webpack-plugin": "3.0.0", + "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.5", "fs-extra": "^4.0.0", "glob": "^7.0.3", @@ -95,7 +95,7 @@ "uglifyjs-webpack-plugin": "1.0.0", "url-loader": "^0.6.2", "webpack": "~3.8.1", - "webpack-concat-plugin": "1.4.0", + "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", "webpack-merge": "^4.1.0", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 64a3cd05098d..99d893ab900c 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -34,7 +34,7 @@ "@schematics/angular": "~0.1.8", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", - "circular-dependency-plugin": "^3.0.0", + "circular-dependency-plugin": "^4.2.1", "common-tags": "^1.3.1", "copy-webpack-plugin": "^4.1.1", "core-object": "^3.1.0", @@ -43,7 +43,7 @@ "denodeify": "^1.2.1", "ember-cli-string-utils": "^1.0.0", "exports-loader": "^0.6.3", - "extract-text-webpack-plugin": "3.0.0", + "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.5", "fs-extra": "^4.0.0", "glob": "^7.0.3", @@ -77,7 +77,7 @@ "uglifyjs-webpack-plugin": "1.0.0", "url-loader": "^0.6.2", "webpack": "~3.8.1", - "webpack-concat-plugin": "1.4.0", + "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", "webpack-merge": "^4.1.0", From 65bba087b41de69caf652529ae45e2675055f824 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 1 Dec 2017 11:30:31 +0000 Subject: [PATCH 031/115] ci: run optionals on master only --- .travis.yml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 23583a3193ce..2d1b4286561a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,13 @@ cache: directories: - ./node_modules +stages: + - build + - test + - name: optional + if: (NOT type IN (pull_request)) AND (branch = master) + - deploy + matrix: fast_finish: true allow_failures: @@ -18,12 +25,14 @@ matrix: - node_js: "7" - node_js: "8" include: + # Build stage - stage: build script: npm run lint env: lint - script: npm run build env: build + # Test stage - stage: test script: npm run test env: test @@ -48,33 +57,30 @@ matrix: script: node tests/run_e2e.js --eject "--glob=tests/build/**" env: eject - # Optional builds. - - node_js: "6" + # Optional stage. + - stage: optional + node_js: "6" os: linux - before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js --ng2 "--glob=tests/build/**" env: ng2 - node_js: "6" os: linux - before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js --ng4 "--glob=tests/build/**" env: ng4 - node_js: "6" os: linux - before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js --nightly "--glob=tests/build/**" env: nightly - node_js: "7" os: linux - before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js "--glob=tests/build/**" env: node7 - node_js: "8" os: linux - before_script: if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then exit 0; fi script: node tests/run_e2e.js "--glob=tests/build/**" env: node8 + # Deploy stage - stage: deploy script: skip env: builds @@ -84,8 +90,7 @@ matrix: skip_cleanup: true on: all_branches: true - - stage: deploy - script: skip + - script: skip env: publish deploy: - provider: script From 83d1b0c1f978e4e9b6d4ff487c4cf6fdcc024ef7 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 30 Nov 2017 18:13:42 +0000 Subject: [PATCH 032/115] ci: use reduced appveyor on PRs --- .appveyor.yml | 6 ++++-- tests/e2e/tests/{build/aot => basic}/aot.ts | 4 ++-- tests/e2e/tests/{build => basic}/assets.ts | 0 tests/e2e/tests/{build => basic}/dev-build.ts | 0 tests/e2e/tests/{test => basic}/e2e.ts | 6 +++++- tests/e2e/tests/{build => basic}/rebuild.ts | 0 tests/e2e/tests/{build => basic}/scripts-array.ts | 0 tests/e2e/tests/{build/styles => basic}/styles-array.ts | 0 tests/e2e/tests/{test => basic}/test.ts | 0 9 files changed, 11 insertions(+), 5 deletions(-) rename tests/e2e/tests/{build/aot => basic}/aot.ts (66%) rename tests/e2e/tests/{build => basic}/assets.ts (100%) rename tests/e2e/tests/{build => basic}/dev-build.ts (100%) rename tests/e2e/tests/{test => basic}/e2e.ts (93%) rename tests/e2e/tests/{build => basic}/rebuild.ts (100%) rename tests/e2e/tests/{build => basic}/scripts-array.ts (100%) rename tests/e2e/tests/{build/styles => basic}/styles-array.ts (100%) rename tests/e2e/tests/{test => basic}/test.ts (100%) diff --git a/.appveyor.yml b/.appveyor.yml index eb3e089fd20b..04d5cc160614 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,13 +7,15 @@ matrix: install: - ps: Install-Product node $env:nodejs_version - - npm install -g npm@~5.3.0 + - npm install -g npm@~5.6.0 - npm install test_script: - node --version - npm --version - - node tests\run_e2e.js --appveyor + - npm run test:packages + - npm run test:cli + - node tests\run_e2e.js --appveyor "--glob=tests/{basic,commands,generate}/**" build: off diff --git a/tests/e2e/tests/build/aot/aot.ts b/tests/e2e/tests/basic/aot.ts similarity index 66% rename from tests/e2e/tests/build/aot/aot.ts rename to tests/e2e/tests/basic/aot.ts index bbeb6c2004d4..5ec34d6d563d 100644 --- a/tests/e2e/tests/build/aot/aot.ts +++ b/tests/e2e/tests/basic/aot.ts @@ -1,5 +1,5 @@ -import {ng} from '../../../utils/process'; -import {expectFileToMatch} from '../../../utils/fs'; +import {ng} from '../../utils/process'; +import {expectFileToMatch} from '../../utils/fs'; export default function() { return ng('build', '--aot') diff --git a/tests/e2e/tests/build/assets.ts b/tests/e2e/tests/basic/assets.ts similarity index 100% rename from tests/e2e/tests/build/assets.ts rename to tests/e2e/tests/basic/assets.ts diff --git a/tests/e2e/tests/build/dev-build.ts b/tests/e2e/tests/basic/dev-build.ts similarity index 100% rename from tests/e2e/tests/build/dev-build.ts rename to tests/e2e/tests/basic/dev-build.ts diff --git a/tests/e2e/tests/test/e2e.ts b/tests/e2e/tests/basic/e2e.ts similarity index 93% rename from tests/e2e/tests/test/e2e.ts rename to tests/e2e/tests/basic/e2e.ts index aca46ca1f624..5fad3dc36b9f 100644 --- a/tests/e2e/tests/test/e2e.ts +++ b/tests/e2e/tests/basic/e2e.ts @@ -44,5 +44,9 @@ export default function () { // Should run side-by-side with `ng serve` .then(() => execAndWaitForOutputToMatch('ng', ['serve'], /webpack: Compiled successfully./)) - .then(() => ng('e2e')); + .then(() => ng('e2e')) + .then(() => killAllProcesses(), (err: any) => { + killAllProcesses(); + throw err; + }); } diff --git a/tests/e2e/tests/build/rebuild.ts b/tests/e2e/tests/basic/rebuild.ts similarity index 100% rename from tests/e2e/tests/build/rebuild.ts rename to tests/e2e/tests/basic/rebuild.ts diff --git a/tests/e2e/tests/build/scripts-array.ts b/tests/e2e/tests/basic/scripts-array.ts similarity index 100% rename from tests/e2e/tests/build/scripts-array.ts rename to tests/e2e/tests/basic/scripts-array.ts diff --git a/tests/e2e/tests/build/styles/styles-array.ts b/tests/e2e/tests/basic/styles-array.ts similarity index 100% rename from tests/e2e/tests/build/styles/styles-array.ts rename to tests/e2e/tests/basic/styles-array.ts diff --git a/tests/e2e/tests/test/test.ts b/tests/e2e/tests/basic/test.ts similarity index 100% rename from tests/e2e/tests/test/test.ts rename to tests/e2e/tests/basic/test.ts From f936eb6dee1ee341312ecd065e1ff2a7f5c7d28d Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 1 Dec 2017 12:03:13 +0000 Subject: [PATCH 033/115] test: remove appveyor checks --- tests/e2e/tests/basic/styles-array.ts | 6 +++--- tests/e2e/tests/build/base-href.ts | 6 ------ tests/e2e/tests/build/chunk-hash.ts | 7 ------- tests/e2e/tests/build/css-urls.ts | 6 ------ tests/e2e/tests/build/delete-output-path.ts | 5 ----- tests/e2e/tests/build/deploy-url.ts | 7 ------- tests/e2e/tests/build/filename.ts | 6 ------ tests/e2e/tests/build/json.ts | 5 ----- tests/e2e/tests/build/module-id.ts | 6 ------ tests/e2e/tests/build/no-angular-router.ts | 6 ------ tests/e2e/tests/build/no-implicit-any.ts | 6 ------ tests/e2e/tests/build/output-hashing.ts | 7 +------ tests/e2e/tests/build/platform-server.ts | 5 ----- tests/e2e/tests/build/polyfills.ts | 6 ------ tests/e2e/tests/build/sourcemap.ts | 6 ------ tests/e2e/tests/build/styles/extract-css.ts | 6 ------ tests/e2e/tests/build/styles/postcss.ts | 6 ------ tests/e2e/tests/commands/new/new-routing.ts | 6 ------ tests/e2e/tests/commands/new/new-skip-commit.ts | 6 ------ tests/e2e/tests/commands/new/new-skip-tests.ts | 6 ------ tests/e2e/tests/lint/lint-no-config-section.ts | 6 ------ tests/e2e/tests/lint/lint-no-project.ts | 6 ------ tests/e2e/tests/lint/lint-with-exclude.ts | 6 ------ tests/e2e/tests/lint/lint-with-force.ts | 6 ------ tests/e2e/tests/lint/lint-with-format-by-aliases.ts | 6 ------ tests/e2e/tests/lint/lint-with-format.ts | 6 ------ tests/e2e/tests/lint/lint-with-nested-configs.ts | 7 +------ tests/e2e/tests/lint/lint-with-type-check-fail.ts | 7 +------ tests/e2e/tests/lint/lint-with-type-check.ts | 7 +------ tests/e2e/tests/misc/coverage.ts | 6 ------ tests/e2e/tests/misc/default-port.ts | 7 +------ tests/e2e/tests/misc/deploy-url.ts | 6 ------ tests/e2e/tests/misc/different-file-format.ts | 6 ------ tests/e2e/tests/misc/fallback.ts | 6 ------ tests/e2e/tests/misc/ssl-default-config.ts | 7 +------ tests/e2e/tests/misc/ssl-default.ts | 6 ------ tests/e2e/tests/misc/ssl-with-cert-config.ts | 7 +------ tests/e2e/tests/misc/ssl-with-cert.ts | 6 ------ tests/e2e/tests/test/e2e-baseurl.ts | 7 +------ tests/e2e/tests/test/test-assets.ts | 6 ------ tests/e2e/tests/test/test-backwards-compat.ts | 7 +------ tests/e2e/tests/test/test-scripts.ts | 7 +------ 42 files changed, 13 insertions(+), 248 deletions(-) diff --git a/tests/e2e/tests/basic/styles-array.ts b/tests/e2e/tests/basic/styles-array.ts index 8149363993f3..c7ac5d756e41 100644 --- a/tests/e2e/tests/basic/styles-array.ts +++ b/tests/e2e/tests/basic/styles-array.ts @@ -1,9 +1,9 @@ import { writeMultipleFiles, expectFileToMatch -} from '../../../utils/fs'; -import { ng } from '../../../utils/process'; -import { updateJsonFile } from '../../../utils/project'; +} from '../../utils/fs'; +import { ng } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; import { oneLineTrim } from 'common-tags'; export default function () { diff --git a/tests/e2e/tests/build/base-href.ts b/tests/e2e/tests/build/base-href.ts index 1f14735bf2e3..23a1633283dd 100644 --- a/tests/e2e/tests/build/base-href.ts +++ b/tests/e2e/tests/build/base-href.ts @@ -1,15 +1,9 @@ import {ng} from '../../utils/process'; import {expectFileToMatch} from '../../utils/fs'; -import {getGlobalVariable} from '../../utils/env'; import {updateJsonFile} from '../../utils/project'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return ng('build', '--base-href', '/myUrl') .then(() => expectFileToMatch('dist/index.html', //)) .then(() => updateJsonFile('.angular-cli.json', configJson => { diff --git a/tests/e2e/tests/build/chunk-hash.ts b/tests/e2e/tests/build/chunk-hash.ts index 13e5a2cb8298..57cae6db7d16 100644 --- a/tests/e2e/tests/build/chunk-hash.ts +++ b/tests/e2e/tests/build/chunk-hash.ts @@ -2,7 +2,6 @@ import * as fs from 'fs'; import {ng} from '../../utils/process'; import {writeFile, prependToFile, replaceInFile} from '../../utils/fs'; -import {getGlobalVariable} from '../../utils/env'; const OUTPUT_RE = /(main|polyfills|vendor|inline|styles|\d+)\.[a-z0-9]+\.(chunk|bundle)\.(js|css)$/; @@ -43,12 +42,6 @@ function validateHashes( } export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - - let oldHashes: Map; let newHashes: Map; // First, collect the hashes. diff --git a/tests/e2e/tests/build/css-urls.ts b/tests/e2e/tests/build/css-urls.ts index 06967b283167..1b8884903205 100644 --- a/tests/e2e/tests/build/css-urls.ts +++ b/tests/e2e/tests/build/css-urls.ts @@ -7,7 +7,6 @@ import { } from '../../utils/fs'; import { copyProjectAsset } from '../../utils/assets'; import { expectToFail } from '../../utils/utils'; -import { getGlobalVariable } from '../../utils/env'; const imgSvg = ` @@ -16,11 +15,6 @@ const imgSvg = ` `; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() // Verify absolute/relative paths in global/component css. .then(() => writeMultipleFiles({ diff --git a/tests/e2e/tests/build/delete-output-path.ts b/tests/e2e/tests/build/delete-output-path.ts index e503a67f6db7..9a5b658f8e7e 100644 --- a/tests/e2e/tests/build/delete-output-path.ts +++ b/tests/e2e/tests/build/delete-output-path.ts @@ -4,11 +4,6 @@ import {deleteFile, expectFileToExist} from '../../utils/fs'; import {getGlobalVariable} from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - // Skip this in ejected tests. if (getGlobalVariable('argv').eject) { return Promise.resolve(); diff --git a/tests/e2e/tests/build/deploy-url.ts b/tests/e2e/tests/build/deploy-url.ts index 87d294277ea0..43293efbdb32 100644 --- a/tests/e2e/tests/build/deploy-url.ts +++ b/tests/e2e/tests/build/deploy-url.ts @@ -2,16 +2,9 @@ import { ng } from '../../utils/process'; import { copyProjectAsset } from '../../utils/assets'; import { expectFileToMatch, writeMultipleFiles } from '../../utils/fs'; import { updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - - return Promise.resolve() .then(() => writeMultipleFiles({ 'src/styles.css': 'div { background: url("./assets/more.png"); }', diff --git a/tests/e2e/tests/build/filename.ts b/tests/e2e/tests/build/filename.ts index 2399e833a803..e8979648f9a6 100644 --- a/tests/e2e/tests/build/filename.ts +++ b/tests/e2e/tests/build/filename.ts @@ -2,15 +2,9 @@ import {ng} from '../../utils/process'; import {expectFileToExist} from '../../utils/fs'; import {updateJsonFile} from '../../utils/project'; import {copyFile} from '../../utils/fs'; -import {getGlobalVariable} from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => copyFile('src/index.html', 'src/config-index.html')) .then(() => updateJsonFile('.angular-cli.json', configJson => { diff --git a/tests/e2e/tests/build/json.ts b/tests/e2e/tests/build/json.ts index 71cfa32f0544..dc116f60719a 100644 --- a/tests/e2e/tests/build/json.ts +++ b/tests/e2e/tests/build/json.ts @@ -5,11 +5,6 @@ import {getGlobalVariable} from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - // Skip this in ejected tests. if (getGlobalVariable('argv').eject) { return Promise.resolve(); diff --git a/tests/e2e/tests/build/module-id.ts b/tests/e2e/tests/build/module-id.ts index 581d8bbddf1d..ad75d230a419 100644 --- a/tests/e2e/tests/build/module-id.ts +++ b/tests/e2e/tests/build/module-id.ts @@ -1,14 +1,8 @@ import { ng } from '../../utils/process'; import { replaceInFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => replaceInFile('src/app/app.component.ts', '@Component({', diff --git a/tests/e2e/tests/build/no-angular-router.ts b/tests/e2e/tests/build/no-angular-router.ts index 84eb22cd14d0..b6680e99d9f9 100644 --- a/tests/e2e/tests/build/no-angular-router.ts +++ b/tests/e2e/tests/build/no-angular-router.ts @@ -1,16 +1,10 @@ import {ng} from '../../utils/process'; import {expectFileToExist, moveFile} from '../../utils/fs'; -import {updateJsonFile} from '../../utils/project'; import {getGlobalVariable} from '../../utils/env'; import * as path from 'path'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - const tmp = getGlobalVariable('tmp-root'); return Promise.resolve() diff --git a/tests/e2e/tests/build/no-implicit-any.ts b/tests/e2e/tests/build/no-implicit-any.ts index 340f7169b698..08927a41467e 100644 --- a/tests/e2e/tests/build/no-implicit-any.ts +++ b/tests/e2e/tests/build/no-implicit-any.ts @@ -1,14 +1,8 @@ import {updateTsConfig} from '../../utils/project'; import {ng} from '../../utils/process'; -import {getGlobalVariable} from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return updateTsConfig(json => { json['compilerOptions']['noImplicitAny'] = true; }) diff --git a/tests/e2e/tests/build/output-hashing.ts b/tests/e2e/tests/build/output-hashing.ts index c066ea031aa4..aba9758f6dd5 100644 --- a/tests/e2e/tests/build/output-hashing.ts +++ b/tests/e2e/tests/build/output-hashing.ts @@ -1,7 +1,7 @@ import {ng} from '../../utils/process'; import { copyProjectAsset } from '../../utils/assets'; import { writeMultipleFiles, expectFileToMatch, expectFileMatchToExist } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; + function verifyMedia(css: RegExp, content: RegExp) { return expectFileMatchToExist('./dist', css) @@ -9,11 +9,6 @@ function verifyMedia(css: RegExp, content: RegExp) { } export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => writeMultipleFiles({ 'src/styles.css': 'body { background-image: url("./assets/image.png"); }' diff --git a/tests/e2e/tests/build/platform-server.ts b/tests/e2e/tests/build/platform-server.ts index 1420374128ad..f8da56c01b73 100644 --- a/tests/e2e/tests/build/platform-server.ts +++ b/tests/e2e/tests/build/platform-server.ts @@ -14,11 +14,6 @@ import { readNgVersion } from '../../utils/version'; import { expectToFail } from '../../utils/utils'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - // Skip this for ejected tests. if (getGlobalVariable('argv').eject) { return Promise.resolve(); diff --git a/tests/e2e/tests/build/polyfills.ts b/tests/e2e/tests/build/polyfills.ts index a00445c34843..2fae001ff3e0 100644 --- a/tests/e2e/tests/build/polyfills.ts +++ b/tests/e2e/tests/build/polyfills.ts @@ -1,14 +1,8 @@ import { expectFileToMatch } from '../../utils/fs'; import { ng } from '../../utils/process'; -import { getGlobalVariable } from '../../utils/env'; import { oneLineTrim } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => ng('build')) // files were created successfully diff --git a/tests/e2e/tests/build/sourcemap.ts b/tests/e2e/tests/build/sourcemap.ts index 4e831558d9c4..2eb1ee84793c 100644 --- a/tests/e2e/tests/build/sourcemap.ts +++ b/tests/e2e/tests/build/sourcemap.ts @@ -1,15 +1,9 @@ import {ng} from '../../utils/process'; import {expectFileToExist} from '../../utils/fs'; import {expectToFail} from '../../utils/utils'; -import {getGlobalVariable} from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return ng('build', '--sourcemaps') .then(() => expectFileToExist('dist/main.bundle.js.map')) diff --git a/tests/e2e/tests/build/styles/extract-css.ts b/tests/e2e/tests/build/styles/extract-css.ts index 834b16dbba25..828d4cce8fd3 100644 --- a/tests/e2e/tests/build/styles/extract-css.ts +++ b/tests/e2e/tests/build/styles/extract-css.ts @@ -6,15 +6,9 @@ import { import { ng } from '../../../utils/process'; import { updateJsonFile } from '../../../utils/project'; import { expectToFail } from '../../../utils/utils'; -import { getGlobalVariable } from '../../../utils/env'; import { oneLineTrim } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => writeMultipleFiles({ 'src/string-style.css': '.string-style { color: red }', diff --git a/tests/e2e/tests/build/styles/postcss.ts b/tests/e2e/tests/build/styles/postcss.ts index 08600f69d6eb..14636a95c7de 100644 --- a/tests/e2e/tests/build/styles/postcss.ts +++ b/tests/e2e/tests/build/styles/postcss.ts @@ -1,15 +1,9 @@ import * as glob from 'glob'; import { writeFile, expectFileToMatch } from '../../../utils/fs'; import { ng } from '../../../utils/process'; -import { getGlobalVariable } from '../../../utils/env'; import { stripIndents } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return writeFile('src/styles.css', stripIndents` /* normal-comment */ /*! important-comment */ diff --git a/tests/e2e/tests/commands/new/new-routing.ts b/tests/e2e/tests/commands/new/new-routing.ts index 953aa16190cc..1726abad6c21 100644 --- a/tests/e2e/tests/commands/new/new-routing.ts +++ b/tests/e2e/tests/commands/new/new-routing.ts @@ -1,14 +1,8 @@ import {ng} from '../../../utils/process'; import {createProject} from '../../../utils/project'; -import { getGlobalVariable } from '../../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => createProject('routing-project', '--routing')) diff --git a/tests/e2e/tests/commands/new/new-skip-commit.ts b/tests/e2e/tests/commands/new/new-skip-commit.ts index c57e34b67f48..95a4328f21f8 100644 --- a/tests/e2e/tests/commands/new/new-skip-commit.ts +++ b/tests/e2e/tests/commands/new/new-skip-commit.ts @@ -2,15 +2,9 @@ import {ng} from '../../../utils/process'; import {createProject} from '../../../utils/project'; import {expectToFail} from '../../../utils/utils'; import {expectGitToBeClean} from '../../../utils/git'; -import {getGlobalVariable} from '../../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => createProject('new-project', '--skip-commit')) .then(() => expectToFail(() => expectGitToBeClean())) diff --git a/tests/e2e/tests/commands/new/new-skip-tests.ts b/tests/e2e/tests/commands/new/new-skip-tests.ts index 62c5328b8575..95dde0a38e88 100644 --- a/tests/e2e/tests/commands/new/new-skip-tests.ts +++ b/tests/e2e/tests/commands/new/new-skip-tests.ts @@ -1,14 +1,8 @@ import {createProject} from '../../../utils/project'; import {expectFileNotToExist} from '../../../utils/fs'; -import {getGlobalVariable} from '../../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => createProject('new-project-skip-tests', '--skip-tests')) .then(() => expectFileNotToExist('src/app/app.component.spec.ts')); diff --git a/tests/e2e/tests/lint/lint-no-config-section.ts b/tests/e2e/tests/lint/lint-no-config-section.ts index 79378681cae1..d2bfc1e4992d 100644 --- a/tests/e2e/tests/lint/lint-no-config-section.ts +++ b/tests/e2e/tests/lint/lint-no-config-section.ts @@ -1,13 +1,7 @@ import { ng } from '../../utils/process'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => ng('set', 'lint', '[]')) .then(() => ng('lint')) diff --git a/tests/e2e/tests/lint/lint-no-project.ts b/tests/e2e/tests/lint/lint-no-project.ts index 9e374ef040e4..d558a76c8d50 100644 --- a/tests/e2e/tests/lint/lint-no-project.ts +++ b/tests/e2e/tests/lint/lint-no-project.ts @@ -1,15 +1,9 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; import { expectToFail } from '../../utils/utils'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => ng('set', 'lint.0.project', '')) .then(() => ng('lint', '--type-check')) diff --git a/tests/e2e/tests/lint/lint-with-exclude.ts b/tests/e2e/tests/lint/lint-with-exclude.ts index be792e2e9530..bcf193acc692 100644 --- a/tests/e2e/tests/lint/lint-with-exclude.ts +++ b/tests/e2e/tests/lint/lint-with-exclude.ts @@ -1,14 +1,8 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - const fileName = 'src/app/foo.ts'; return Promise.resolve() diff --git a/tests/e2e/tests/lint/lint-with-force.ts b/tests/e2e/tests/lint/lint-with-force.ts index ac3f2975e663..1f40b16a2346 100644 --- a/tests/e2e/tests/lint/lint-with-force.ts +++ b/tests/e2e/tests/lint/lint-with-force.ts @@ -1,14 +1,8 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - const fileName = 'src/app/foo.ts'; return Promise.resolve() diff --git a/tests/e2e/tests/lint/lint-with-format-by-aliases.ts b/tests/e2e/tests/lint/lint-with-format-by-aliases.ts index 067adb1640f6..cb0d76c12827 100644 --- a/tests/e2e/tests/lint/lint-with-format-by-aliases.ts +++ b/tests/e2e/tests/lint/lint-with-format-by-aliases.ts @@ -1,14 +1,8 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - const fileName = 'src/app/foo.ts'; return Promise.resolve() diff --git a/tests/e2e/tests/lint/lint-with-format.ts b/tests/e2e/tests/lint/lint-with-format.ts index ed21f1ae87a1..50ee8b5454a9 100644 --- a/tests/e2e/tests/lint/lint-with-format.ts +++ b/tests/e2e/tests/lint/lint-with-format.ts @@ -1,14 +1,8 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; import { oneLine } from 'common-tags'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - const fileName = 'src/app/foo.ts'; return Promise.resolve() diff --git a/tests/e2e/tests/lint/lint-with-nested-configs.ts b/tests/e2e/tests/lint/lint-with-nested-configs.ts index d0580fa8f114..951c9f4aaccd 100644 --- a/tests/e2e/tests/lint/lint-with-nested-configs.ts +++ b/tests/e2e/tests/lint/lint-with-nested-configs.ts @@ -1,14 +1,9 @@ import { createDir, writeFile } from '../../utils/fs'; import { ng } from '../../utils/process'; import { expectToFail } from '../../utils/utils'; -import { getGlobalVariable } from '../../utils/env'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { const fileName = 'src/app/foo/foo.ts'; const nestedConfigContent = ` { diff --git a/tests/e2e/tests/lint/lint-with-type-check-fail.ts b/tests/e2e/tests/lint/lint-with-type-check-fail.ts index 9d545f7cfec0..965a18559d07 100644 --- a/tests/e2e/tests/lint/lint-with-type-check-fail.ts +++ b/tests/e2e/tests/lint/lint-with-type-check-fail.ts @@ -1,14 +1,9 @@ import { ng } from '../../utils/process'; import { expectToFail } from '../../utils/utils'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { const fileName = 'src/app/foo.ts'; const fileContents = ` const ANIMATION_CSS_VALUE_REGEX = 'asda'; diff --git a/tests/e2e/tests/lint/lint-with-type-check.ts b/tests/e2e/tests/lint/lint-with-type-check.ts index 59b8642cf6f8..ac6dfc761ba9 100644 --- a/tests/e2e/tests/lint/lint-with-type-check.ts +++ b/tests/e2e/tests/lint/lint-with-type-check.ts @@ -1,13 +1,8 @@ import { ng } from '../../utils/process'; import { writeFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { const fileName = 'src/app/foo.ts'; const fileContents = ` const ANIMATION_CSS_VALUE_REGEX = 'asda'; diff --git a/tests/e2e/tests/misc/coverage.ts b/tests/e2e/tests/misc/coverage.ts index 280a5cca8458..f7e008b55072 100644 --- a/tests/e2e/tests/misc/coverage.ts +++ b/tests/e2e/tests/misc/coverage.ts @@ -2,15 +2,9 @@ import {expectFileToExist, expectFileToMatch} from '../../utils/fs'; import {updateJsonFile} from '../../utils/project'; import {expectToFail} from '../../utils/utils'; import {ng} from '../../utils/process'; -import {getGlobalVariable} from '../../utils/env'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return ng('test', '--single-run', '--code-coverage') .then(() => expectFileToExist('coverage/src/app')) .then(() => expectFileToExist('coverage/lcov.info')) diff --git a/tests/e2e/tests/misc/default-port.ts b/tests/e2e/tests/misc/default-port.ts index a010173f2907..a9e6ef9bc590 100644 --- a/tests/e2e/tests/misc/default-port.ts +++ b/tests/e2e/tests/misc/default-port.ts @@ -2,14 +2,9 @@ import { request } from '../../utils/http'; import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; import { updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; -export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function() { return Promise.resolve() .then(() => updateJsonFile('.angular-cli.json', configJson => { const app = configJson.defaults; diff --git a/tests/e2e/tests/misc/deploy-url.ts b/tests/e2e/tests/misc/deploy-url.ts index ef2393f3b33f..b87f94060480 100644 --- a/tests/e2e/tests/misc/deploy-url.ts +++ b/tests/e2e/tests/misc/deploy-url.ts @@ -1,15 +1,9 @@ import { killAllProcesses } from '../../utils/process'; import { request } from '../../utils/http'; import { ngServe, updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; import { writeMultipleFiles } from '../../utils/fs'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => writeMultipleFiles({ 'src/string-script.js': 'console.log(\'string-script\'); var number = 1+1;', diff --git a/tests/e2e/tests/misc/different-file-format.ts b/tests/e2e/tests/misc/different-file-format.ts index df2fe4ff4216..9f1abbb7eab5 100644 --- a/tests/e2e/tests/misc/different-file-format.ts +++ b/tests/e2e/tests/misc/different-file-format.ts @@ -1,6 +1,5 @@ import {ng} from '../../utils/process'; import * as fs from '../../utils/fs'; -import {getGlobalVariable} from '../../utils/env'; const options = { @@ -9,11 +8,6 @@ const options = { export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => fs.prependToFile('./src/tsconfig.app.json', '\ufeff', options)) .then(() => fs.prependToFile('./.angular-cli.json', '\ufeff', options)) diff --git a/tests/e2e/tests/misc/fallback.ts b/tests/e2e/tests/misc/fallback.ts index c3cf7067aa6c..6c3cefe86864 100644 --- a/tests/e2e/tests/misc/fallback.ts +++ b/tests/e2e/tests/misc/fallback.ts @@ -3,15 +3,9 @@ import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; import { updateJsonFile } from '../../utils/project'; import { moveFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - // should fallback to config.app[0].index (index.html by default) return Promise.resolve() .then(() => ngServe()) diff --git a/tests/e2e/tests/misc/ssl-default-config.ts b/tests/e2e/tests/misc/ssl-default-config.ts index c87641a54d11..4d77c22d9d88 100644 --- a/tests/e2e/tests/misc/ssl-default-config.ts +++ b/tests/e2e/tests/misc/ssl-default-config.ts @@ -2,14 +2,9 @@ import { request } from '../../utils/http'; import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; import { updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; -export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function() { return Promise.resolve() .then(() => updateJsonFile('.angular-cli.json', configJson => { const app = configJson.defaults; diff --git a/tests/e2e/tests/misc/ssl-default.ts b/tests/e2e/tests/misc/ssl-default.ts index 5f32001067ec..80c3952b16ab 100644 --- a/tests/e2e/tests/misc/ssl-default.ts +++ b/tests/e2e/tests/misc/ssl-default.ts @@ -1,15 +1,9 @@ import { request } from '../../utils/http'; import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => ngServe('--ssl', 'true')) .then(() => request('https://localhost:4200/')) diff --git a/tests/e2e/tests/misc/ssl-with-cert-config.ts b/tests/e2e/tests/misc/ssl-with-cert-config.ts index 50e03f2485ce..7d14478e0a29 100644 --- a/tests/e2e/tests/misc/ssl-with-cert-config.ts +++ b/tests/e2e/tests/misc/ssl-with-cert-config.ts @@ -3,14 +3,9 @@ import { assetDir } from '../../utils/assets'; import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; import { updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; -export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function() { return Promise.resolve() .then(() => updateJsonFile('.angular-cli.json', configJson => { const app = configJson.defaults; diff --git a/tests/e2e/tests/misc/ssl-with-cert.ts b/tests/e2e/tests/misc/ssl-with-cert.ts index de2e0c90ca17..e15aaed9d2b8 100644 --- a/tests/e2e/tests/misc/ssl-with-cert.ts +++ b/tests/e2e/tests/misc/ssl-with-cert.ts @@ -2,15 +2,9 @@ import { request } from '../../utils/http'; import { assetDir } from '../../utils/assets'; import { killAllProcesses } from '../../utils/process'; import { ngServe } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; export default function() { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => ngServe( '--ssl', 'true', diff --git a/tests/e2e/tests/test/e2e-baseurl.ts b/tests/e2e/tests/test/e2e-baseurl.ts index 8a70d4ef6197..c6a66d23e0d3 100644 --- a/tests/e2e/tests/test/e2e-baseurl.ts +++ b/tests/e2e/tests/test/e2e-baseurl.ts @@ -2,14 +2,9 @@ import { ng, killAllProcesses } from '../../utils/process'; import { expectToFail } from '../../utils/utils'; import { ngServe } from '../../utils/project'; import { updateJsonFile } from '../../utils/project'; -import { getGlobalVariable } from '../../utils/env'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { return Promise.resolve() .then(() => expectToFail(() => ng('e2e', '--no-serve'))) .then(() => updateJsonFile('.angular-cli.json', configJson => { diff --git a/tests/e2e/tests/test/test-assets.ts b/tests/e2e/tests/test/test-assets.ts index adf3ee27328c..12d247aad6ef 100644 --- a/tests/e2e/tests/test/test-assets.ts +++ b/tests/e2e/tests/test/test-assets.ts @@ -2,16 +2,10 @@ import { writeMultipleFiles } from '../../utils/fs'; import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; import { expectToFail } from '../../utils/utils'; -import { getGlobalVariable } from '../../utils/env'; import { stripIndent } from 'common-tags'; // Make sure asset files are served export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } - return Promise.resolve() .then(() => writeMultipleFiles({ 'src/assets/file.txt': 'assets-folder-content', diff --git a/tests/e2e/tests/test/test-backwards-compat.ts b/tests/e2e/tests/test/test-backwards-compat.ts index 067f19b9c31e..aaac37583e5e 100644 --- a/tests/e2e/tests/test/test-backwards-compat.ts +++ b/tests/e2e/tests/test/test-backwards-compat.ts @@ -1,13 +1,8 @@ import { ng } from '../../utils/process'; import { replaceInFile } from '../../utils/fs'; -import { getGlobalVariable } from '../../utils/env'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { // Old configs (with the cli preprocessor listed) should still supported. return Promise.resolve() .then(() => replaceInFile('karma.conf.js', diff --git a/tests/e2e/tests/test/test-scripts.ts b/tests/e2e/tests/test/test-scripts.ts index 4ca07efd65db..bf42a46d1d42 100644 --- a/tests/e2e/tests/test/test-scripts.ts +++ b/tests/e2e/tests/test/test-scripts.ts @@ -2,15 +2,10 @@ import { writeMultipleFiles } from '../../utils/fs'; import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; import { expectToFail } from '../../utils/utils'; -import { getGlobalVariable } from '../../utils/env'; import { stripIndent } from 'common-tags'; -export default function () { - // Skip this in Appveyor tests. - if (getGlobalVariable('argv').appveyor) { - return Promise.resolve(); - } +export default function () { return Promise.resolve() .then(() => ng('test', '--watch=false')) // prepare global scripts test files From e4166e28b916d7bba4141221704543566e432059 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 30 Nov 2017 13:25:20 +0000 Subject: [PATCH 034/115] ci: fix ng2 and nightly jobs --- .../build/build-app-shell-with-schematic.ts | 13 +++++++++++++ tests/e2e/tests/build/build-errors.ts | 9 +++++---- tests/e2e/tests/build/platform-server.ts | 4 ++++ tests/e2e/tests/build/rebuild-error.ts | 16 +++++++++------- tests/e2e/tests/build/script-target.ts | 6 ++++++ 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/tests/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/e2e/tests/build/build-app-shell-with-schematic.ts index aed5e3c7b088..4746493c8cc7 100644 --- a/tests/e2e/tests/build/build-app-shell-with-schematic.ts +++ b/tests/e2e/tests/build/build-app-shell-with-schematic.ts @@ -2,6 +2,8 @@ import { ng, npm } from '../../utils/process'; import { expectFileToMatch } from '../../utils/fs'; import { getGlobalVariable } from '../../utils/env'; import { expectToFail } from '../../utils/utils'; +import { updateJsonFile } from '../../utils/project'; +import { readNgVersion } from '../../utils/version'; export default function () { @@ -15,8 +17,19 @@ export default function () { return Promise.resolve(); } + let platformServerVersion = readNgVersion(); + + if (getGlobalVariable('argv').nightly) { + platformServerVersion = 'github:angular/platform-server-builds'; + } + + return Promise.resolve() .then(() => ng('generate', 'appShell', 'name', '--universal-app', 'universal')) + .then(() => updateJsonFile('package.json', packageJson => { + const dependencies = packageJson['dependencies']; + dependencies['@angular/platform-server'] = platformServerVersion; + }) .then(() => npm('install')) .then(() => ng('build', '--prod')) .then(() => expectFileToMatch('dist/index.html', /app-shell works!/)) diff --git a/tests/e2e/tests/build/build-errors.ts b/tests/e2e/tests/build/build-errors.ts index 93acf7597a37..32ce0ff98ddb 100644 --- a/tests/e2e/tests/build/build-errors.ts +++ b/tests/e2e/tests/build/build-errors.ts @@ -1,6 +1,6 @@ import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; -import { writeFile, appendToFile, readFile } from '../../utils/fs'; +import { writeFile, appendToFile, readFile, replaceInFile } from '../../utils/fs'; import { getGlobalVariable } from '../../utils/env'; import { expectToFail } from '../../utils/utils'; @@ -62,11 +62,12 @@ export default function () { } }) .then(() => writeFile('./src/app/app.component.ts', origContent)) - // Check errors when files were not emitted. - .then(() => writeFile('./src/app/app.component.ts', '')) + // Check errors when files were not emitted due to static analysis errors. + .then(() => replaceInFile('./src/app/app.component.ts', `'app-root'`, `(() => 'app-root')()`)) .then(() => expectToFail(() => ng('build', '--aot'))) .then(({ message }) => { - if (!message.includes(`Unexpected value 'AppComponent`)) { + if (!message.includes('Function calls are not supported') + && !message.includes('Function expressions are not supported in decorators')) { throw new Error(`Expected static analysis error, got this instead:\n${message}`); } if (extraErrors.some((e) => message.includes(e))) { diff --git a/tests/e2e/tests/build/platform-server.ts b/tests/e2e/tests/build/platform-server.ts index f8da56c01b73..d2943d162070 100644 --- a/tests/e2e/tests/build/platform-server.ts +++ b/tests/e2e/tests/build/platform-server.ts @@ -21,6 +21,10 @@ export default function () { let platformServerVersion = readNgVersion(); + if (getGlobalVariable('argv').nightly) { + platformServerVersion = 'github:angular/platform-server-builds'; + } + // Skip this test in Angular 2/4. if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { return Promise.resolve(); diff --git a/tests/e2e/tests/build/rebuild-error.ts b/tests/e2e/tests/build/rebuild-error.ts index a069e740e601..ea20919d3a88 100644 --- a/tests/e2e/tests/build/rebuild-error.ts +++ b/tests/e2e/tests/build/rebuild-error.ts @@ -37,13 +37,14 @@ export default function () { // Save the original contents of `./src/app/app.component.ts`. .then(() => readFile('./src/app/app.component.ts')) .then((contents) => origContent = contents) - // Add a major error on a non-main file to the initial build. - .then(() => writeFile('src/app/app.component.ts', '')) + // Add a major static analysis error on a non-main file to the initial build. + .then(() => replaceInFile('./src/app/app.component.ts', `'app-root'`, `(() => 'app-root')()`)) // Should have an error. .then(() => execAndWaitForOutputToMatch('ng', ['serve', '--aot'], failedRe)) .then((results) => { const stderr = results.stderr; - if (!stderr.includes(`Unexpected value 'AppComponent`)) { + if (!stderr.includes('Function calls are not supported') + && !stderr.includes('Function expressions are not supported in decorators')) { throw new Error(`Expected static analysis error, got this instead:\n${stderr}`); } if (extraErrors.some((e) => stderr.includes(e))) { @@ -76,18 +77,19 @@ export default function () { // have an error message in 5s. .then(() => Promise.all([ expectToFail(() => waitForAnyProcessOutputToMatch(errorRe, 5000)), - replaceInFile('src/app/app.component.ts', ']]]]]', '') + writeFile('src/app/app.component.ts', origContent) ])) .then(() => wait(2000)) - // Add a major error on a rebuild. + // Add a major static analysis error on a rebuild. // Should fail the rebuild. .then(() => Promise.all([ waitForAnyProcessOutputToMatch(failedRe, 20000), - writeFile('src/app/app.component.ts', '') + replaceInFile('./src/app/app.component.ts', `'app-root'`, `(() => 'app-root')()`) ])) .then((results) => { const stderr = results[0].stderr; - if (!stderr.includes(`Unexpected value 'AppComponent`)) { + if (!stderr.includes('Function calls are not supported') + && !stderr.includes('Function expressions are not supported in decorators')) { throw new Error(`Expected static analysis error, got this instead:\n${stderr}`); } if (extraErrors.some((e) => stderr.includes(e))) { diff --git a/tests/e2e/tests/build/script-target.ts b/tests/e2e/tests/build/script-target.ts index f3d847141d30..b3175a2f0ed5 100644 --- a/tests/e2e/tests/build/script-target.ts +++ b/tests/e2e/tests/build/script-target.ts @@ -1,9 +1,15 @@ import { expectFileToMatch } from '../../utils/fs'; import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; +import { getGlobalVariable } from '../../utils/env'; export default function () { + // Skip this test in Angular 2, it had different bundles. + if (getGlobalVariable('argv').ng2) { + return Promise.resolve(); + } + return Promise.resolve() .then(() => updateJsonFile('tsconfig.json', configJson => { const compilerOptions = configJson['compilerOptions']; From 7ef5648befd3296730d85d1b9d9c6e995af79244 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 1 Dec 2017 12:25:00 +0100 Subject: [PATCH 035/115] docs(@angular/cli): fix inline link and code formatting --- docs/documentation/e2e.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/documentation/e2e.md b/docs/documentation/e2e.md index c78606d3ae8c..e818d91c1c0c 100644 --- a/docs/documentation/e2e.md +++ b/docs/documentation/e2e.md @@ -23,7 +23,7 @@ Please note that options that are supported by `ng serve` are also supported by --config (aliases: -c)

- Use a specific config file. Defaults to the protractor config file in `.angular-cli.json`. + Use a specific config file. Defaults to the protractor config file in .angular-cli.json.

@@ -33,7 +33,7 @@ Please note that options that are supported by `ng serve` are also supported by --element-explorer (aliases: -ee) default value: false

- Start Protractor's [Element Explorer](https://github.com/angular/protractor/blob/master/docs/debugging.md#testing-out-protractor-interactively) for debugging. + Start Protractor's Element Explorer for debugging.

@@ -56,7 +56,7 @@ Please note that options that are supported by `ng serve` are also supported by --specs (aliases: -sp) default value: []

- Override specs in the protractor config. Can send in multiple specs by repeating flag (ng e2e --specs=spec1.ts --specs=spec2.ts). + Override specs in the protractor config. Can send in multiple specs by repeating flag (ng e2e --specs=spec1.ts --specs=spec2.ts).

From e62b324d3197b8e93e4405ea193c3c3f7f47943b Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 30 Nov 2017 13:59:53 +0000 Subject: [PATCH 036/115] fix(@angular/cli): update webpack, uglifyjs-webpack-plugin Partially address #5618 Fix #8571 Fix #8505 --- package-lock.json | 834 +---------------------------- package.json | 4 +- packages/@angular/cli/package.json | 4 +- 3 files changed, 27 insertions(+), 815 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86dfd1ef2e51..300a91df83d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1048,7 +1048,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3047,795 +3046,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -8737,37 +7947,39 @@ "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" }, "uglifyjs-webpack-plugin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.0.0.tgz", - "integrity": "sha512-23qmtiLm1X7O0XVSZ54W7XGHykPss+2lo3RYC9zSzK3DDT5W27woZpDFDKguDCnG1RIX8cDnmy5j+dtXxJCA/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-k07cmJTj+8vZMSc3BaQ9uW7qVl2MqDts4ti4KaNACXEcXSw2vQM2S8olSk/CODxvcSFGvUHzNSqA8JQlhgUJPw==", "requires": { "cacache": "10.0.0", "find-cache-dir": "1.0.0", "schema-utils": "0.3.0", - "source-map": "0.5.7", - "uglify-es": "3.1.5", + "source-map": "0.6.1", + "uglify-es": "3.2.0", "webpack-sources": "1.0.1", "worker-farm": "1.4.1" }, "dependencies": { + "commander": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", + "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, "uglify-es": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.1.5.tgz", - "integrity": "sha512-l2PqhvUNmD5pOKiHMuE8TmlvvsghxvLcg+ffcg/obRn/qm0fXf+1Mi8N7tZZIi6zxQS+PbIvq39VCYxmK0QMYA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.0.tgz", + "integrity": "sha512-eD4rjK4o6rzrvE1SMZJLQFEVMnWRUyIu6phJ0BXk5TIthMmP5B4QP0HI8o3bkQB5wf1N4WHA0leZAQyQBAd+Jg==", "requires": { - "commander": "2.11.0", + "commander": "2.12.1", "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } } } @@ -8998,9 +8210,9 @@ } }, "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.9.1.tgz", + "integrity": "sha512-jONJ0l8nqgiQVkqs15O9TFWLozbFkCgVodVrBXBK/PIBFeGkaOGo30Ov57iQqYRwAWNDM5vyLPZYmAIpPa5QSw==", "requires": { "acorn": "5.1.2", "acorn-dynamic-import": "2.0.2", diff --git a/package.json b/package.json index f0555d946695..1ff622f3d3c4 100644 --- a/package.json +++ b/package.json @@ -92,9 +92,9 @@ "stylus-loader": "^3.0.1", "tree-kill": "^1.0.0", "typescript": "~2.4.2", - "uglifyjs-webpack-plugin": "1.0.0", + "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", - "webpack": "~3.8.1", + "webpack": "~3.9.1", "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 99d893ab900c..03132e0995b3 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -74,9 +74,9 @@ "style-loader": "^0.13.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", - "uglifyjs-webpack-plugin": "1.0.0", + "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", - "webpack": "~3.8.1", + "webpack": "~3.9.1", "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", From d5a5fe25ad7ab5e91858e419d1236a39860e7392 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 1 Dec 2017 21:11:20 -0500 Subject: [PATCH 037/115] build: update/cleanup dev dependencies --- package-lock.json | 841 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 5 +- 2 files changed, 820 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 300a91df83d4..69fea01ca979 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1048,6 +1048,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3030,6 +3031,15 @@ } } }, + "fs-minipass": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.3.tgz", + "integrity": "sha512-u1pHCXDx+CElfM6CuIeHDTKvb1Ya9ZhsMk7xTHTh6zHSRLK6O0DTVBN+E3wg8fruxAFp4oE07owrrzQfDA0b5Q==", + "dev": true, + "requires": { + "minipass": "2.2.1" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -3046,6 +3056,795 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -4223,9 +5022,9 @@ } }, "license-checker": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-14.0.0.tgz", - "integrity": "sha512-NuPRmB/tICGaRuDwLoGp24oBW0e/dX9jnEYo5lR0hCTkIT1yx+Jm3x3hQ+qkgF+e2UJC59hDSJY1FPkjcxvQ0w==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-15.0.0.tgz", + "integrity": "sha512-HLI3BcrG1mM5Q156DAZxVlK0pE0s/I/EhSaLqWev23e+G5pBIwYXleAhgsja3qJDKcZVBezb7GJwu5pqfmK/Tg==", "dev": true, "requires": { "chalk": "0.5.1", @@ -4741,15 +5540,6 @@ } } }, - "minizlib": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.3.tgz", - "integrity": "sha1-1cGr93vhVGGZUuJTM27Mq5sqMvU=", - "dev": true, - "requires": { - "minipass": "2.2.1" - } - }, "mississippi": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", @@ -6785,12 +7575,6 @@ "onetime": "1.1.0" } }, - "rewire": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", - "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", - "dev": true - }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -7668,18 +8452,28 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" }, "tar": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-3.2.1.tgz", - "integrity": "sha512-ZSzds1E0IqutvMU8HxjMaU8eB7urw2fGwTq88ukDOVuUIh0656l7/P7LiVPxhO5kS4flcRJQk8USG+cghQbTUQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.1.1.tgz", + "integrity": "sha512-p2lLtRABOEhuC28GDpMYwxcDYRqAFfiz2AIZiQlI+fhrACPKtQ1mcF/bPY8T1h9aKlpDpd+WE33Y2PJ/hWhm8g==", "dev": true, "requires": { "chownr": "1.0.1", + "fs-minipass": "1.2.3", "minipass": "2.2.1", - "minizlib": "1.0.3", + "minizlib": "1.0.4", "mkdirp": "0.5.1", "yallist": "3.0.2" }, "dependencies": { + "minizlib": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.4.tgz", + "integrity": "sha512-sN4U9tIJtBRwKbwgFh9qJfrPIQ/GGTRr1MGqkgOeMTLy8/lM0FcWU//FqlnZ3Vb7gJ+Mxh3FOg1EklibdajbaQ==", + "dev": true, + "requires": { + "minipass": "2.2.1" + } + }, "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", @@ -7947,7 +8741,8 @@ "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true }, "uglifyjs-webpack-plugin": { "version": "1.1.2", diff --git a/package.json b/package.json index 1ff622f3d3c4..7f097317551f 100644 --- a/package.json +++ b/package.json @@ -129,16 +129,15 @@ "express": "^4.14.0", "jasmine": "^2.6.0", "jasmine-spec-reporter": "^4.1.0", - "license-checker": "^14.0.0", + "license-checker": "^15.0.0", "minimist": "^1.2.0", "mock-fs": "^4.0.0", "npm-run": "^4.1.0", "npm-run-all": "^4.0.0", "request": "^2.74.0", "resolve-bin": "^0.4.0", - "rewire": "^2.5.1", "spdx-satisfies": "^0.1.3", - "tar": "^3.1.5", + "tar": "^4.1.1", "temp": "0.8.3", "through": "^2.3.6", "ts-node": "^3.2.0", From f9d8c7aefe008dae533b541475bb68adadb57249 Mon Sep 17 00:00:00 2001 From: cexbrayat Date: Sat, 2 Dec 2017 19:05:04 -0300 Subject: [PATCH 038/115] fix(@angular/cli): allow RCs and betas for @angular/service-worker It was not possible to use `5.1.0-rc.1` previously, because of how `semver.satisfies()` works (see https://github.com/npm/node-semver#prerelease-tags). This relaxes the check by using `semver.gte()`. --- packages/@angular/cli/models/webpack-configs/production.ts | 2 +- packages/@angular/cli/utilities/service-worker/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index 72a4d81eefdc..efe85215b60c 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -47,7 +47,7 @@ export function getProdConfig(wco: WebpackConfigOptions) { const swVersion = JSON.parse(swPackageJson)['version']; const isLegacySw = semver.satisfies(swVersion, OLD_SW_VERSION); - const isModernSw = semver.satisfies(swVersion, NEW_SW_VERSION); + const isModernSw = semver.gte(swVersion, NEW_SW_VERSION); if (!isLegacySw && !isModernSw) { throw new Error(stripIndent` diff --git a/packages/@angular/cli/utilities/service-worker/index.ts b/packages/@angular/cli/utilities/service-worker/index.ts index cc0b6cfa4f0e..0d167b632776 100644 --- a/packages/@angular/cli/utilities/service-worker/index.ts +++ b/packages/@angular/cli/utilities/service-worker/index.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as semver from 'semver'; -export const NEW_SW_VERSION = '>= 5.0.0-rc.0'; +export const NEW_SW_VERSION = '5.0.0-rc.0'; class CliFilesystem implements Filesystem { constructor(private base: string) {} @@ -58,7 +58,7 @@ export function usesServiceWorker(projectRoot: string): boolean { const swPackageJson = fs.readFileSync(`${swModule}/package.json`).toString(); const swVersion = JSON.parse(swPackageJson)['version']; - return semver.satisfies(swVersion, NEW_SW_VERSION); + return semver.gte(swVersion, NEW_SW_VERSION); } export function augmentAppWithServiceWorker(projectRoot: string, appRoot: string, From 37abd8388de91f81b336cf58a48b654a0e496355 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 4 Dec 2017 21:53:58 +0000 Subject: [PATCH 039/115] fix(@angular/cli): update to webpack@3.10.0 --- package-lock.json | 6 +++--- package.json | 2 +- packages/@angular/cli/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69fea01ca979..fa0bdfa5f69e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9005,9 +9005,9 @@ } }, "webpack": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.9.1.tgz", - "integrity": "sha512-jONJ0l8nqgiQVkqs15O9TFWLozbFkCgVodVrBXBK/PIBFeGkaOGo30Ov57iQqYRwAWNDM5vyLPZYmAIpPa5QSw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", "requires": { "acorn": "5.1.2", "acorn-dynamic-import": "2.0.2", diff --git a/package.json b/package.json index 7f097317551f..4eac1cc4666a 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "typescript": "~2.4.2", "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", - "webpack": "~3.9.1", + "webpack": "~3.10.0", "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 03132e0995b3..c6ce4f709cdf 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -76,7 +76,7 @@ "stylus-loader": "^3.0.1", "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", - "webpack": "~3.9.1", + "webpack": "~3.10.0", "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", From f84742dcded7a7994cf066b1f088d9eb7de94255 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 4 Dec 2017 18:30:37 -0500 Subject: [PATCH 040/115] release: 1.6.0-rc.2 --- package-lock.json | 42 +++++++++----------------- package.json | 6 ++-- packages/@angular/cli/package.json | 8 ++--- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa0bdfa5f69e..814d8dca0ec8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.1", + "version": "1.6.0-rc.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -22,25 +22,23 @@ } } }, + "@angular-devkit/core": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", + "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "requires": { + "source-map": "0.5.7" + } + }, "@angular-devkit/schematics": { - "version": "0.0.38", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.38.tgz", - "integrity": "sha512-vvyn7p/t4EKLSONGIw9jot9iMM3lEvdMDfnLkgubznIiIFxH9I+aYw9BBV2AmwE7OASHrCRpwFf7K2EqJ0f9+A==", + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.39.tgz", + "integrity": "sha512-YoXE7mej7ARdjpiNAsg2NguIe8e3BusZRUQ7xA10AMftuPVZV2v7vV0M0j1vmH2WFEK8Tn4TqHsd5njDcvwX4g==", "requires": { "@angular-devkit/core": "0.0.22", "@ngtools/json-schema": "1.1.0", "minimist": "1.2.0", "rxjs": "5.5.2" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", - "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", - "requires": { - "source-map": "0.5.7" - } - } } }, "@angular/compiler": { @@ -88,21 +86,11 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.8.tgz", - "integrity": "sha512-88QrOoS0gQ6BdKulP01dTPmfPwLhvzb4jCcKkp0g8kvzTkIadlORmC9bQtucJI5huPU2bglVfmPgAk2ZwMSLDA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.9.tgz", + "integrity": "sha512-I9XVDbcvr0yvuM18SWcQFksjiiCGoJFTBrc0I5bMJx+++agugXftZC7oUPUM8G5Z004C+58dI7vXQfxo2SCkAA==", "requires": { "@angular-devkit/core": "0.0.22" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", - "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", - "requires": { - "source-map": "0.5.7" - } - } } }, "@types/common-tags": { diff --git a/package.json b/package.json index 4eac1cc4666a..601ff1020683 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.1", + "version": "1.6.0-rc.2", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -42,8 +42,8 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.34", - "@angular-devkit/schematics": "~0.0.38", - "@schematics/angular": "~0.1.8", + "@angular-devkit/schematics": "~0.0.39", + "@schematics/angular": "~0.1.9", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index c6ce4f709cdf..a9b3f5d9209a 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.1", + "version": "1.6.0-rc.2", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -28,10 +28,10 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.34", - "@angular-devkit/schematics": "~0.0.38", + "@angular-devkit/schematics": "~0.0.39", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.0-rc.1", - "@schematics/angular": "~0.1.8", + "@ngtools/webpack": "1.9.0-rc.2", + "@schematics/angular": "~0.1.9", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 4a693adb440c..9a3518c6ffb0 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.0-rc.1", + "version": "1.9.0-rc.2", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 091ab2c0e4fc8bd1d7f3c64f78ecf8286a85d056 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Fri, 1 Dec 2017 11:03:24 -0500 Subject: [PATCH 041/115] test: Update app-shell test --- tests/e2e/tests/build/build-app-shell-with-schematic.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/e2e/tests/build/build-app-shell-with-schematic.ts index 4746493c8cc7..db0c0e457070 100644 --- a/tests/e2e/tests/build/build-app-shell-with-schematic.ts +++ b/tests/e2e/tests/build/build-app-shell-with-schematic.ts @@ -1,5 +1,5 @@ import { ng, npm } from '../../utils/process'; -import { expectFileToMatch } from '../../utils/fs'; +import { expectFileToMatch, appendToFile } from '../../utils/fs'; import { getGlobalVariable } from '../../utils/env'; import { expectToFail } from '../../utils/utils'; import { updateJsonFile } from '../../utils/project'; @@ -25,6 +25,10 @@ export default function () { return Promise.resolve() + .then(() => expectToFail(() => { + return ng('generate', 'appShell', 'name', '--universal-app', 'universal'); + }) + .then(() => appendToFile('src/app/app.component.html', '')) .then(() => ng('generate', 'appShell', 'name', '--universal-app', 'universal')) .then(() => updateJsonFile('package.json', packageJson => { const dependencies = packageJson['dependencies']; From 746bf7af2be550d4c785052c4bafa6fcf1a7c437 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Tue, 5 Dec 2017 16:39:25 -0500 Subject: [PATCH 042/115] fix(@angular/cli): Prevent showing options with visible false --- packages/@angular/cli/tasks/schematic-get-options.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@angular/cli/tasks/schematic-get-options.ts b/packages/@angular/cli/tasks/schematic-get-options.ts index 77c300150b11..7f32a6ec51f6 100644 --- a/packages/@angular/cli/tasks/schematic-get-options.ts +++ b/packages/@angular/cli/tasks/schematic-get-options.ts @@ -30,6 +30,7 @@ export default Task.extend({ const keys = Object.keys(properties); const availableOptions = keys .map(key => ({...properties[key], ...{name: stringUtils.dasherize(key)}})) + .filter(opt => opt.visible !== false) .map(opt => { let type; const schematicType = opt.type; From 98fd25b730ff487344cf38b6d17be22366440e23 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 6 Dec 2017 16:18:55 -0500 Subject: [PATCH 043/115] release: 1.6.0 --- package-lock.json | 34 +++++++++++++++----------- package.json | 8 +++--- packages/@angular/cli/package.json | 10 ++++---- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 814d8dca0ec8..bcea24184a4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,24 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.2", + "version": "1.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.34.tgz", - "integrity": "sha512-uSvyKtkDnfnBt6GGJ0m1nFI9IylKq6KoQil04GobhDCXFyin6Gbr50focx3jaizwDuh4v/x11fEUi5/cSUkKhA==", + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.35.tgz", + "integrity": "sha512-7JxZZAYFSCc0tP6+NrRn3b2Cd1b9d+a3+OfwVNyNsNd2unelqUMko2hm0KLbC8BXcXt/OILg1E/ZgLAXSS47nw==", "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", - "typescript": "2.6.1", + "typescript": "2.6.2", "webpack-sources": "1.0.1" }, "dependencies": { "typescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", - "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" } } }, @@ -31,12 +31,13 @@ } }, "@angular-devkit/schematics": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.39.tgz", - "integrity": "sha512-YoXE7mej7ARdjpiNAsg2NguIe8e3BusZRUQ7xA10AMftuPVZV2v7vV0M0j1vmH2WFEK8Tn4TqHsd5njDcvwX4g==", + "version": "0.0.40", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.40.tgz", + "integrity": "sha512-VX5Rw0jrAIDouo8JrBz4pwCL7J9QDFiVK2ZCiYHXMsMqKo0+m7Dv6qdQAkhm37T/UOxU1hT8gdQ0l9nHYKVeAQ==", "requires": { "@angular-devkit/core": "0.0.22", "@ngtools/json-schema": "1.1.0", + "@schematics/schematics": "0.0.10", "minimist": "1.2.0", "rxjs": "5.5.2" } @@ -86,13 +87,18 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.9.tgz", - "integrity": "sha512-I9XVDbcvr0yvuM18SWcQFksjiiCGoJFTBrc0I5bMJx+++agugXftZC7oUPUM8G5Z004C+58dI7vXQfxo2SCkAA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.10.tgz", + "integrity": "sha512-ykq4FL0WTygkpvIcGDxnxHHT2uvJMWseDeAujmfyZpzdT9X22GOTURNo3LjvOIhhVUpMVZvnAYqjV46KqB702g==", "requires": { "@angular-devkit/core": "0.0.22" } }, + "@schematics/schematics": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.10.tgz", + "integrity": "sha512-9vr9W1X6oRp42pbiGRIk3L+T6SoFtHlAGrzbh6rbFQDNXT4UCHarqDigow+DEL6PR2ptXZO9WeLcad4it7zNyA==" + }, "@types/common-tags": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.4.0.tgz", diff --git a/package.json b/package.json index 601ff1020683..73a3b4932a49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.2", + "version": "1.6.0", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -41,9 +41,9 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.34", - "@angular-devkit/schematics": "~0.0.39", - "@schematics/angular": "~0.1.9", + "@angular-devkit/build-optimizer": "~0.0.35", + "@angular-devkit/schematics": "~0.0.40", + "@schematics/angular": "~0.1.10", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index a9b3f5d9209a..03d06357151e 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0-rc.2", + "version": "1.6.0", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -27,11 +27,11 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.34", - "@angular-devkit/schematics": "~0.0.39", + "@angular-devkit/build-optimizer": "~0.0.35", + "@angular-devkit/schematics": "~0.0.40", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.0-rc.2", - "@schematics/angular": "~0.1.9", + "@ngtools/webpack": "1.9.0", + "@schematics/angular": "~0.1.10", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 9a3518c6ffb0..45c65f3d37b6 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.0-rc.2", + "version": "1.9.0", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 215ba9bf184de23fb190500924cded19281287a4 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 7 Dec 2017 07:20:18 -0500 Subject: [PATCH 044/115] build: update minimum @angular-devkit/schematics version --- package-lock.json | 6 +++--- package.json | 2 +- packages/@angular/cli/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index bcea24184a4e..3517925304c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,9 +31,9 @@ } }, "@angular-devkit/schematics": { - "version": "0.0.40", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.40.tgz", - "integrity": "sha512-VX5Rw0jrAIDouo8JrBz4pwCL7J9QDFiVK2ZCiYHXMsMqKo0+m7Dv6qdQAkhm37T/UOxU1hT8gdQ0l9nHYKVeAQ==", + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.41.tgz", + "integrity": "sha512-eSXyRLM7g9NvNUwDd71iPjHEL0Zutg9PcLUSCrwFXR3Z8S6iStO2FpZACNmz5/Y7ksWLy5/1wjLuDJCHS4X/ig==", "requires": { "@angular-devkit/core": "0.0.22", "@ngtools/json-schema": "1.1.0", diff --git a/package.json b/package.json index 73a3b4932a49..bf71255ab1d9 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.35", - "@angular-devkit/schematics": "~0.0.40", + "@angular-devkit/schematics": "~0.0.41", "@schematics/angular": "~0.1.10", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 03d06357151e..4cdb5b7b40d0 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -28,7 +28,7 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.35", - "@angular-devkit/schematics": "~0.0.40", + "@angular-devkit/schematics": "~0.0.41", "@ngtools/json-schema": "1.1.0", "@ngtools/webpack": "1.9.0", "@schematics/angular": "~0.1.10", From c9389361c9fb7bbc0e3385f95e0c0a47b448a532 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 27 Nov 2017 17:31:53 -0500 Subject: [PATCH 045/115] feat(@angular/cli): enable parallel javascript minification --- packages/@angular/cli/models/webpack-configs/production.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index efe85215b60c..3f43353174e4 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -146,6 +146,7 @@ export function getProdConfig(wco: WebpackConfigOptions) { // Uglify should be the last plugin as PurifyPlugin needs to be before it. new UglifyJSPlugin({ sourceMap: buildOptions.sourcemaps, + parallel: true, uglifyOptions: { ecma: wco.supportES2015 ? 6 : 5, warnings: buildOptions.verbose, From 00bc1f090c77f2100cd203d01dc33a481dc80eee Mon Sep 17 00:00:00 2001 From: bryanrideshark Date: Wed, 6 Dec 2017 14:36:38 -0600 Subject: [PATCH 046/115] fix(@angular/cli): Fix replace('/') to work using Regex. --- packages/@angular/cli/utilities/dynamic-path-parser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@angular/cli/utilities/dynamic-path-parser.ts b/packages/@angular/cli/utilities/dynamic-path-parser.ts index b6795b928a09..7835939eb27d 100644 --- a/packages/@angular/cli/utilities/dynamic-path-parser.ts +++ b/packages/@angular/cli/utilities/dynamic-path-parser.ts @@ -12,11 +12,11 @@ export interface DynamicPathOptions { export function dynamicPathParser(options: DynamicPathOptions) { const projectRoot = options.project.root; - const sourceDir = options.appConfig.root.replace('/', path.sep); + const sourceDir = options.appConfig.root.replace(/\//g, path.sep); const p = options.appConfig.appRoot === undefined ? 'app' - : options.appConfig.appRoot.replace('/', path.sep); + : options.appConfig.appRoot.replace(/\//g, path.sep); const appRoot = path.join(sourceDir, p); const cwd = process.env.PWD; From 330079cd7cd4b08e9e4a43c8cb863a5f45e7dcbd Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Fri, 8 Dec 2017 16:18:38 -0500 Subject: [PATCH 047/115] fix(@angular/cli): Allow schematics without a name option. Fixes #8793 --- packages/@angular/cli/commands/generate.ts | 18 ++++++++++++++---- .../build/build-app-shell-with-schematic.ts | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/@angular/cli/commands/generate.ts b/packages/@angular/cli/commands/generate.ts index e9a4d79b3585..9318f9f94ad4 100644 --- a/packages/@angular/cli/commands/generate.ts +++ b/packages/@angular/cli/commands/generate.ts @@ -109,10 +109,16 @@ export default Command.extend({ schematicName, collectionName }) - .then((availableOptions: SchematicAvailableOptions) => { + .then((availableOptions: SchematicAvailableOptions[]) => { let anonymousOptions: string[] = []; + + const nameOption = availableOptions.filter(opt => opt.name === 'name')[0]; + if (nameOption) { + anonymousOptions = [...anonymousOptions, '']; + } + if (collectionName === '@schematics/angular' && schematicName === 'interface') { - anonymousOptions = ['']; + anonymousOptions = [...anonymousOptions, '']; } this.registerOptions({ @@ -127,8 +133,12 @@ export default Command.extend({ throw 'The `ng generate module` command requires a name to be specified.'; } - const entityName = rawArgs[1]; - commandOptions.name = stringUtils.dasherize(entityName.split(separatorRegEx).pop()); + let entityName = rawArgs[1]; + if (entityName) { + commandOptions.name = stringUtils.dasherize(entityName.split(separatorRegEx).pop()); + } else { + entityName = ''; + } const appConfig = getAppFromConfig(commandOptions.app); const dynamicPathOptions: DynamicPathOptions = { diff --git a/tests/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/e2e/tests/build/build-app-shell-with-schematic.ts index db0c0e457070..41f799cd90e7 100644 --- a/tests/e2e/tests/build/build-app-shell-with-schematic.ts +++ b/tests/e2e/tests/build/build-app-shell-with-schematic.ts @@ -26,10 +26,10 @@ export default function () { return Promise.resolve() .then(() => expectToFail(() => { - return ng('generate', 'appShell', 'name', '--universal-app', 'universal'); + return ng('generate', 'appShell', '--universal-app', 'universal'); }) .then(() => appendToFile('src/app/app.component.html', '')) - .then(() => ng('generate', 'appShell', 'name', '--universal-app', 'universal')) + .then(() => ng('generate', 'appShell', '--universal-app', 'universal')) .then(() => updateJsonFile('package.json', packageJson => { const dependencies = packageJson['dependencies']; dependencies['@angular/platform-server'] = platformServerVersion; From 91f3f5b6fc0d10bd7eccf192214f8ec195f5d588 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 11 Dec 2017 15:55:10 -0500 Subject: [PATCH 048/115] fix(@angular/cli): account for root relative URLs in CSS assets --- .../cli/models/webpack-configs/styles.ts | 4 ++-- tests/e2e/tests/build/css-urls.ts | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 122be05274a3..ade1f18b3da6 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -63,8 +63,8 @@ export function getStylesConfig(wco: WebpackConfigOptions) { // Only convert root relative URLs, which CSS-Loader won't process into require(). filter: ({ url }: { url: string }) => url.startsWith('/') && !url.startsWith('//'), url: ({ url }: { url: string }) => { - if (deployUrl.match(/:\/\//)) { - // If deployUrl contains a scheme, ignore baseHref use deployUrl as is. + if (deployUrl.match(/:\/\//) || deployUrl.startsWith('/')) { + // If deployUrl is absolute or root relative, ignore baseHref & use deployUrl as is. return `${deployUrl.replace(/\/$/, '')}${url}`; } else if (baseHref.match(/:\/\//)) { // If baseHref contains a scheme, include it as is. diff --git a/tests/e2e/tests/build/css-urls.ts b/tests/e2e/tests/build/css-urls.ts index 1b8884903205..e8e3e13223a1 100644 --- a/tests/e2e/tests/build/css-urls.ts +++ b/tests/e2e/tests/build/css-urls.ts @@ -79,5 +79,27 @@ export default function () { .then(() => expectFileToMatch('dist/main.bundle.js', '/base/deploy/assets/component-img-absolute.svg')) .then(() => expectFileToMatch('dist/main.bundle.js', - /deploy\/component-img-relative\.[0-9a-f]{20}\.png/)); + /deploy\/component-img-relative\.[0-9a-f]{20}\.png/)) + // Check with identical base-href and deploy-url flags. + .then(() => ng('build', '--base-href=/base/', '--deploy-url=/base/', + '--extract-css', '--aot')) + .then(() => expectFileToMatch('dist/styles.bundle.css', + '/base/assets/global-img-absolute.svg')) + .then(() => expectFileToMatch('dist/styles.bundle.css', + /global-img-relative\.[0-9a-f]{20}\.png/)) + .then(() => expectFileToMatch('dist/main.bundle.js', + '/base/assets/component-img-absolute.svg')) + .then(() => expectFileToMatch('dist/main.bundle.js', + /\/base\/component-img-relative\.[0-9a-f]{20}\.png/)) + // Check with only base-href flag. + .then(() => ng('build', '--base-href=/base/', + '--extract-css', '--aot')) + .then(() => expectFileToMatch('dist/styles.bundle.css', + '/base/assets/global-img-absolute.svg')) + .then(() => expectFileToMatch('dist/styles.bundle.css', + /global-img-relative\.[0-9a-f]{20}\.png/)) + .then(() => expectFileToMatch('dist/main.bundle.js', + '/base/assets/component-img-absolute.svg')) + .then(() => expectFileToMatch('dist/main.bundle.js', + /component-img-relative\.[0-9a-f]{20}\.png/)); } From 8cea8ffdc28908b325d8a56f06ff3d626efdeb8d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Sun, 10 Dec 2017 21:25:36 -0500 Subject: [PATCH 049/115] refactor(@angular/cli): add webpack integrated scripts plugin --- package-lock.json | 99 ++++--------- package.json | 3 +- .../cli/models/webpack-configs/common.ts | 24 +-- .../cli/models/webpack-configs/utils.ts | 4 +- packages/@angular/cli/package.json | 2 +- .../insert-concat-assets-webpack-plugin.ts | 52 ------- .../cli/plugins/scripts-webpack-plugin.ts | 140 ++++++++++++++++++ packages/@angular/cli/plugins/webpack.ts | 2 +- packages/@angular/cli/tasks/eject.ts | 19 +-- .../cli/utilities/package-chunk-sort.ts | 4 + 10 files changed, 186 insertions(+), 163 deletions(-) delete mode 100644 packages/@angular/cli/plugins/insert-concat-assets-webpack-plugin.ts create mode 100644 packages/@angular/cli/plugins/scripts-webpack-plugin.ts diff --git a/package-lock.json b/package-lock.json index 3517925304c2..184bce270c46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -174,6 +174,16 @@ "integrity": "sha1-WJKKYh0BTOarWcWpxBBx9zKLDKk=", "dev": true }, + "@types/loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha512-VR4oHG6TzhpemxtBDf0BD8xlOiPo2B6zcFEA2Jjmgf1RqSrHLAiteIksV3YvpVn0Pd4HxV1B3LQ6Mf2pGTyZ7g==", + "dev": true, + "requires": { + "@types/node": "6.0.88", + "@types/webpack": "3.0.11" + } + }, "@types/lodash": { "version": "4.14.74", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.74.tgz", @@ -239,6 +249,12 @@ "@types/mime": "2.0.0" } }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/source-map": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@types/source-map/-/source-map-0.5.1.tgz", @@ -271,6 +287,17 @@ "@types/uglify-js": "2.6.29" } }, + "@types/webpack-sources": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.3.tgz", + "integrity": "sha512-yS052yVjjyIjwcUqIEe2+JxbWsw27OM8UFb1fLUGacGYtqMRwgAx2qk41VTE/nPMjw/xfD0JiHPD0Q99dlrInA==", + "dev": true, + "requires": { + "@types/node": "6.0.88", + "@types/source-list-map": "0.1.2", + "@types/source-map": "0.5.1" + } + }, "JSONStream": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", @@ -1030,11 +1057,6 @@ } } }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1753,11 +1775,6 @@ "which": "1.3.0" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -5333,16 +5350,6 @@ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.5" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9254,58 +9261,6 @@ } } }, - "webpack-concat-plugin": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-1.4.2.tgz", - "integrity": "sha512-HdV2xOq4twtL2ThR9NSCCQ888v1JBMpJfm3k2mA1I5LkS2+/6rv8q/bb9yTSaR0fVaMtANZi4Wkz0xc33MAt6w==", - "requires": { - "md5": "2.2.1", - "uglify-js": "2.8.29" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, "webpack-core": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", diff --git a/package.json b/package.json index bf71255ab1d9..4590dc2c60db 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", "webpack": "~3.10.0", - "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", "webpack-merge": "^4.1.0", @@ -116,6 +115,7 @@ "@types/glob": "^5.0.29", "@types/jasmine": "2.5.45", "@types/lodash": "~4.14.50", + "@types/loader-utils": "^1.1.0", "@types/minimist": "^1.2.0", "@types/mock-fs": "^3.6.30", "@types/node": "^6.0.84", @@ -123,6 +123,7 @@ "@types/semver": "^5.3.30", "@types/source-map": "^0.5.0", "@types/webpack": "^3.0.5", + "@types/webpack-sources": "^0.1.3", "conventional-changelog": "1.1.0", "dtsgenerator": "^0.9.1", "eslint": "^3.11.0", diff --git a/packages/@angular/cli/models/webpack-configs/common.ts b/packages/@angular/cli/models/webpack-configs/common.ts index 3b8751292ab3..263d428e61a7 100644 --- a/packages/@angular/cli/models/webpack-configs/common.ts +++ b/packages/@angular/cli/models/webpack-configs/common.ts @@ -2,13 +2,12 @@ import * as webpack from 'webpack'; import * as path from 'path'; import * as CopyWebpackPlugin from 'copy-webpack-plugin'; import { NamedLazyChunksWebpackPlugin } from '../../plugins/named-lazy-chunks-webpack-plugin'; -import { InsertConcatAssetsWebpackPlugin } from '../../plugins/insert-concat-assets-webpack-plugin'; import { extraEntryParser, getOutputHashFormat, AssetPattern } from './utils'; import { isDirectory } from '../../utilities/is-directory'; import { requireProjectModule } from '../../utilities/require-project-module'; import { WebpackConfigOptions } from '../webpack-config'; +import { ScriptsWebpackPlugin } from '../../plugins/scripts-webpack-plugin'; -const ConcatPlugin = require('webpack-concat-plugin'); const ProgressPlugin = require('webpack/lib/ProgressPlugin'); const CircularDependencyPlugin = require('circular-dependency-plugin'); const SilentError = require('silent-error'); @@ -65,23 +64,16 @@ export function getCommonConfig(wco: WebpackConfigOptions) { // Add a new asset for each entry. globalScriptsByEntry.forEach((script) => { - const hash = hashFormat.chunk !== '' && !script.lazy ? '.[hash]' : ''; - extraPlugins.push(new ConcatPlugin({ - uglify: buildOptions.target === 'production' ? { sourceMapIncludeSources: true } : false, - sourceMap: buildOptions.sourcemaps, + // Lazy scripts don't get a hash, otherwise they can't be loaded by name. + const hash = script.lazy ? '' : hashFormat.script; + extraPlugins.push(new ScriptsWebpackPlugin({ name: script.entry, - // Lazy scripts don't get a hash, otherwise they can't be loaded by name. - fileName: `[name]${script.lazy ? '' : hash}.bundle.js`, - filesToConcat: script.paths + sourceMap: buildOptions.sourcemaps, + filename: `${script.entry}${hash}.bundle.js`, + scripts: script.paths, + basePath: projectRoot, })); }); - - // Insert all the assets created by ConcatPlugin in the right place in index.html. - extraPlugins.push(new InsertConcatAssetsWebpackPlugin( - globalScriptsByEntry - .filter((el) => !el.lazy) - .map((el) => el.entry) - )); } // process asset entries diff --git a/packages/@angular/cli/models/webpack-configs/utils.ts b/packages/@angular/cli/models/webpack-configs/utils.ts index 8679dc5a81cf..99a6b7b07271 100644 --- a/packages/@angular/cli/models/webpack-configs/utils.ts +++ b/packages/@angular/cli/models/webpack-configs/utils.ts @@ -81,8 +81,8 @@ export function getOutputHashFormat(option: string, length = 20): HashFormat { const hashFormats: { [option: string]: HashFormat } = { none: { chunk: '', extract: '', file: '' , script: '' }, media: { chunk: '', extract: '', file: `.[hash:${length}]`, script: '' }, - bundles: { chunk: `.[chunkhash:${length}]`, extract: `.[contenthash:${length}]`, file: '' , script: '.[hash]' }, - all: { chunk: `.[chunkhash:${length}]`, extract: `.[contenthash:${length}]`, file: `.[hash:${length}]`, script: '.[hash]' }, + bundles: { chunk: `.[chunkhash:${length}]`, extract: `.[contenthash:${length}]`, file: '' , script: `.[hash:${length}]` }, + all: { chunk: `.[chunkhash:${length}]`, extract: `.[contenthash:${length}]`, file: `.[hash:${length}]`, script: `.[hash:${length}]` }, }; /* tslint:enable:max-line-length */ return hashFormats[option] || hashFormats['none']; diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 4cdb5b7b40d0..468daef52f96 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -53,6 +53,7 @@ "less-loader": "^4.0.5", "license-webpack-plugin": "^1.0.0", "lodash": "^4.11.1", + "loader-utils": "1.1.0", "memory-fs": "^0.4.1", "minimatch": "^3.0.4", "node-modules-path": "^1.0.0", @@ -77,7 +78,6 @@ "uglifyjs-webpack-plugin": "~1.1.2", "url-loader": "^0.6.2", "webpack": "~3.10.0", - "webpack-concat-plugin": "^1.4.2", "webpack-dev-middleware": "~1.12.0", "webpack-dev-server": "~2.9.3", "webpack-merge": "^4.1.0", diff --git a/packages/@angular/cli/plugins/insert-concat-assets-webpack-plugin.ts b/packages/@angular/cli/plugins/insert-concat-assets-webpack-plugin.ts deleted file mode 100644 index 039c0afafd00..000000000000 --- a/packages/@angular/cli/plugins/insert-concat-assets-webpack-plugin.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Add assets from `ConcatPlugin` to index.html. - - -export class InsertConcatAssetsWebpackPlugin { - // Priority list of where to insert asset. - private insertAfter = [ - /polyfills(\.[0-9a-f]{20})?\.bundle\.js/, - /inline(\.[0-9a-f]{20})?\.bundle\.js/, - ]; - - constructor(private entryNames: string[]) { } - - apply(compiler: any): void { - compiler.plugin('compilation', (compilation: any) => { - compilation.plugin('html-webpack-plugin-before-html-generation', - (htmlPluginData: any, callback: any) => { - - const fileNames = this.entryNames.map((entryName) => { - const fileName = htmlPluginData.assets.webpackConcat - && htmlPluginData.assets.webpackConcat[entryName]; - - if (!fileName) { - // Something went wrong and the asset was not correctly added. - throw new Error(`Cannot find file for ${entryName} script.`); - } - - if (htmlPluginData.assets.publicPath) { - if (htmlPluginData.assets.publicPath.endsWith('/')) { - return htmlPluginData.assets.publicPath + fileName; - } - return htmlPluginData.assets.publicPath + '/' + fileName; - } - return fileName; - }); - - let insertAt = 0; - - // TODO: try to figure out if there are duplicate bundle names when adding and throw - for (let el of this.insertAfter) { - const jsIdx = htmlPluginData.assets.js.findIndex((js: string) => js.match(el)); - if (jsIdx !== -1) { - insertAt = jsIdx + 1; - break; - } - } - - htmlPluginData.assets.js.splice(insertAt, 0, ...fileNames); - callback(null, htmlPluginData); - }); - }); - } -} diff --git a/packages/@angular/cli/plugins/scripts-webpack-plugin.ts b/packages/@angular/cli/plugins/scripts-webpack-plugin.ts new file mode 100644 index 000000000000..32d8a2785ed5 --- /dev/null +++ b/packages/@angular/cli/plugins/scripts-webpack-plugin.ts @@ -0,0 +1,140 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import { Compiler, loader } from 'webpack'; +import { CachedSource, ConcatSource, OriginalSource, RawSource, Source } from 'webpack-sources'; +import { interpolateName } from 'loader-utils'; +import * as path from 'path'; + +const Chunk = require('webpack/lib/Chunk'); + +export interface ScriptsWebpackPluginOptions { + name: string; + sourceMap: boolean; + scripts: string[]; + filename: string; + basePath: string; +} + +interface ScriptOutput { + filename: string; + source: CachedSource; +} + +export class ScriptsWebpackPlugin { + private _lastBuildTime?: number; + private _cachedOutput?: ScriptOutput; + + constructor(private options: Partial = {}) {} + + shouldSkip(compilation: any, scripts: string[]): boolean { + if (this._lastBuildTime == undefined) { + this._lastBuildTime = Date.now(); + return false; + } + + for (let i = 0; i < scripts.length; i++) { + const scriptTime = compilation.fileTimestamps[scripts[i]]; + if (!scriptTime || scriptTime > this._lastBuildTime) { + this._lastBuildTime = Date.now(); + return false; + } + } + + return true; + } + + private _insertOutput(compilation: any, { filename, source }: ScriptOutput, cached = false) { + const chunk = new Chunk(); + chunk.rendered = !cached; + chunk.id = this.options.name; + chunk.ids = [chunk.id]; + chunk.name = this.options.name; + chunk.isInitial = () => true; + chunk.files.push(filename); + + compilation.chunks.push(chunk); + compilation.assets[filename] = source; + } + + apply(compiler: Compiler): void { + if (!this.options.scripts || this.options.scripts.length === 0) { + return; + } + + const scripts = this.options.scripts + .filter(script => !!script) + .map(script => path.resolve(this.options.basePath || '', script)); + + compiler.plugin('this-compilation', (compilation: any) => { + compilation.plugin('additional-assets', (callback: (err?: Error) => void) => { + if (this.shouldSkip(compilation, scripts)) { + if (this._cachedOutput) { + this._insertOutput(compilation, this._cachedOutput, true); + } + compilation.fileDependencies.push(...scripts); + + callback(); + + return; + } + + const sourceGetters = scripts.map(fullPath => { + return new Promise((resolve, reject) => { + compilation.inputFileSystem.readFile(fullPath, (err: Error, data: Buffer) => { + if (err) { + reject(err); + return; + } + + const content = data.toString(); + + let source; + if (this.options.sourceMap) { + // TODO: Look for source map file (for '.min' scripts, etc.) + + let adjustedPath = fullPath; + if (this.options.basePath) { + adjustedPath = path.relative(this.options.basePath, fullPath); + } + source = new OriginalSource(content, adjustedPath); + } else { + source = new RawSource(content); + } + + resolve(source); + }); + }); + }); + + Promise.all(sourceGetters) + .then(sources => { + const concatSource = new ConcatSource(); + sources.forEach(source => { + concatSource.add(source); + concatSource.add('\n'); + }); + + const combinedSource = new CachedSource(concatSource); + const filename = interpolateName( + { resourcePath: 'scripts.js' } as loader.LoaderContext, + this.options.filename, + { content: combinedSource.source() }, + ); + + const output = { filename, source: combinedSource }; + this._insertOutput(compilation, output); + this._cachedOutput = output; + compilation.fileDependencies.push(...scripts); + + callback(); + }) + .catch((err: Error) => callback(err)); + }); + }); + } +} diff --git a/packages/@angular/cli/plugins/webpack.ts b/packages/@angular/cli/plugins/webpack.ts index a51f71eff8d4..e261571f7cc8 100644 --- a/packages/@angular/cli/plugins/webpack.ts +++ b/packages/@angular/cli/plugins/webpack.ts @@ -1,6 +1,6 @@ // Exports the webpack plugins we use internally. export { BaseHrefWebpackPlugin } from '../lib/base-href-webpack/base-href-webpack-plugin'; export { GlobCopyWebpackPlugin, GlobCopyWebpackPluginOptions } from './glob-copy-webpack-plugin'; -export { InsertConcatAssetsWebpackPlugin } from './insert-concat-assets-webpack-plugin'; export { NamedLazyChunksWebpackPlugin } from './named-lazy-chunks-webpack-plugin'; +export { ScriptsWebpackPlugin, ScriptsWebpackPluginOptions } from './scripts-webpack-plugin'; export { SuppressExtractedTextChunksWebpackPlugin } from './suppress-entry-chunks-webpack-plugin'; diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index c644fa12c362..432e3f764082 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -26,7 +26,6 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const SubresourceIntegrityPlugin = require('webpack-subresource-integrity'); const SilentError = require('silent-error'); const CircularDependencyPlugin = require('circular-dependency-plugin'); -const ConcatPlugin = require('webpack-concat-plugin'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const Task = require('../ember-cli/lib/models/task'); @@ -159,18 +158,6 @@ class JsonWebpackSerializer { return plugin.options; } - private _concatPlugin(plugin: any) { - const options = plugin.settings; - if (!options || !options.filesToConcat) { - return options; - } - - const filesToConcat = options.filesToConcat - .map((file: string) => path.relative(process.cwd(), file)); - - return { ...options, filesToConcat }; - } - private _uglifyjsPlugin(plugin: any) { return plugin.options; } @@ -204,6 +191,7 @@ class JsonWebpackSerializer { break; case angularCliPlugins.BaseHrefWebpackPlugin: case angularCliPlugins.NamedLazyChunksWebpackPlugin: + case angularCliPlugins.ScriptsWebpackPlugin: case angularCliPlugins.SuppressExtractedTextChunksWebpackPlugin: this._addImport('@angular/cli/plugins/webpack', plugin.constructor.name); break; @@ -249,10 +237,6 @@ class JsonWebpackSerializer { args = this._licenseWebpackPlugin(plugin); this._addImport('license-webpack-plugin', 'LicenseWebpackPlugin'); break; - case ConcatPlugin: - args = this._concatPlugin(plugin); - this.variableImports['webpack-concat-plugin'] = 'ConcatPlugin'; - break; case UglifyJSPlugin: args = this._uglifyjsPlugin(plugin); this.variableImports['uglifyjs-webpack-plugin'] = 'UglifyJsPlugin'; @@ -594,7 +578,6 @@ export default Task.extend({ 'stylus-loader', 'url-loader', 'circular-dependency-plugin', - 'webpack-concat-plugin', 'copy-webpack-plugin', 'uglifyjs-webpack-plugin', ].forEach((packageName: string) => { diff --git a/packages/@angular/cli/utilities/package-chunk-sort.ts b/packages/@angular/cli/utilities/package-chunk-sort.ts index a7841aeb544c..67322ff20156 100644 --- a/packages/@angular/cli/utilities/package-chunk-sort.ts +++ b/packages/@angular/cli/utilities/package-chunk-sort.ts @@ -15,6 +15,10 @@ export function packageChunkSort(appConfig: any) { extraEntryParser(appConfig.styles, './', 'styles').forEach(pushExtraEntries); } + if (appConfig.scripts) { + extraEntryParser(appConfig.scripts, './', 'scripts').forEach(pushExtraEntries); + } + entryPoints.push(...['vendor', 'main']); function sort(left: any, right: any) { From 5ac3ecb643bc79cfa9b54d52233802a8d5d8bdc4 Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Wed, 13 Dec 2017 14:29:39 +0100 Subject: [PATCH 050/115] fix(@ngtools/webpack): set output locale for ng xi18n Fixes #8680 --- packages/@ngtools/webpack/src/angular_compiler_plugin.ts | 1 + tests/e2e/tests/i18n/extract-locale.ts | 8 ++------ tests/e2e/tests/i18n/extract-outfile.ts | 8 ++------ 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 9793f658579c..397d66fa79ae 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -227,6 +227,7 @@ export class AngularCompilerPlugin implements Tapable { } if (options.locale !== undefined) { this._compilerOptions.i18nInLocale = options.locale; + this._compilerOptions.i18nOutLocale = options.locale; this._normalizedLocale = this._validateLocale(options.locale); } if (options.missingTranslation !== undefined) { diff --git a/tests/e2e/tests/i18n/extract-locale.ts b/tests/e2e/tests/i18n/extract-locale.ts index 16df41a68957..1916973ed244 100644 --- a/tests/e2e/tests/i18n/extract-locale.ts +++ b/tests/e2e/tests/i18n/extract-locale.ts @@ -1,9 +1,6 @@ import { join } from 'path'; import { ng } from '../../utils/process'; -import { - expectFileToExist, writeFile, - expectFileToMatch -} from '../../utils/fs'; +import { writeFile, expectFileToMatch } from '../../utils/fs'; export default function() { @@ -14,8 +11,7 @@ export default function() { .then(() => ng('xi18n', '--locale', 'fr')) .then((output) => { if (!output.stdout.match(/starting from Angular v4/)) { - expectFileToExist(join('src', 'messages.xlf')); - expectFileToMatch(join('src', 'messages.xlf'), /source-language="fr"/); + return expectFileToMatch(join('src', 'messages.xlf'), 'source-language="fr"'); } }); } diff --git a/tests/e2e/tests/i18n/extract-outfile.ts b/tests/e2e/tests/i18n/extract-outfile.ts index 444c0e1c70fc..2948b6a17d85 100644 --- a/tests/e2e/tests/i18n/extract-outfile.ts +++ b/tests/e2e/tests/i18n/extract-outfile.ts @@ -1,9 +1,6 @@ import {join} from 'path'; import {ng} from '../../utils/process'; -import { - expectFileToExist, writeFile, - expectFileToMatch -} from '../../utils/fs'; +import { writeFile, expectFileToMatch } from '../../utils/fs'; export default function() { @@ -14,8 +11,7 @@ export default function() { .then(() => ng('xi18n', '--out-file', 'messages.fr.xlf')) .then((output) => { if (!output.stdout.match(/starting from Angular v4/)) { - expectFileToExist(join('src', 'messages.fr.xlf')); - expectFileToMatch(join('src', 'messages.fr.xlf'), /Hello world/); + return expectFileToMatch(join('src', 'messages.fr.xlf'), 'Hello world'); } }); } From eb4c9e72ed09c6b544f2dddd038099cfb6d914c8 Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Fri, 8 Dec 2017 10:28:35 -0800 Subject: [PATCH 051/115] fix(@ngtools/webpack): allow path mapping to resolve in JS files Previously we filtered our path mapping resolver to only be used on typescript. The correct behaviour is unclear; tsc does not resolve JS files, only TS. But there is a lot of value to use path mapping to resolve JavaScript files, and it replaces the webpack alias configuration option. Because of that value it was decided to fix this. Fixes #8117. --- packages/@ngtools/webpack/src/paths-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/src/paths-plugin.ts b/packages/@ngtools/webpack/src/paths-plugin.ts index 8f05721669a9..c3e05b00bd53 100644 --- a/packages/@ngtools/webpack/src/paths-plugin.ts +++ b/packages/@ngtools/webpack/src/paths-plugin.ts @@ -124,7 +124,7 @@ export class PathsPlugin implements Tapable { this._nmf.plugin('before-resolve', (request: NormalModuleFactoryRequest, callback: Callback) => { // Only work on TypeScript issuers. - if (!request.contextInfo.issuer || !request.contextInfo.issuer.endsWith('.ts')) { + if (!request.contextInfo.issuer || !request.contextInfo.issuer.match(/\.[jt]s$/)) { return callback(null, request); } From a5edc12ee83264c6a691a688970d5c3deeada717 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 13 Dec 2017 22:47:29 -0500 Subject: [PATCH 052/115] fix(@angular/cli): support eject with latest application schematic --- packages/@angular/cli/tasks/eject.ts | 54 +++++++++++++++------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index 432e3f764082..9928b47a76ef 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -505,31 +505,35 @@ export default Task.extend({ .then((packageJson: string) => JSON.parse(packageJson)) .then((packageJson: any) => { const scripts = packageJson['scripts']; - if (scripts['build'] && scripts['build'] !== 'ng build' && !force) { - throw new SilentError(oneLine` - Your package.json scripts must not contain a build script as it will be overwritten. - `); - } - if (scripts['start'] && scripts['start'] !== 'ng serve' && !force) { - throw new SilentError(oneLine` - Your package.json scripts must not contain a start script as it will be overwritten. - `); - } - if (scripts['pree2e'] && scripts['pree2e'] !== pree2eNpmScript && !force) { - throw new SilentError(oneLine` - Your package.json scripts must not contain a pree2e script as it will be - overwritten. - `); - } - if (scripts['e2e'] && scripts['e2e'] !== 'ng e2e' && !force) { - throw new SilentError(oneLine` - Your package.json scripts must not contain a e2e script as it will be overwritten. - `); - } - if (scripts['test'] && scripts['test'] !== 'ng test' && !force) { - throw new SilentError(oneLine` - Your package.json scripts must not contain a test script as it will be overwritten. - `); + if (!force) { + if (scripts['build'] + && scripts['build'] != 'ng build' + && scripts['build'] != 'ng build --prod') { + throw new SilentError(oneLine` + Your package.json scripts must not contain a build script as it will be overwritten. + `); + } + if (scripts['start'] && scripts['start'] !== 'ng serve') { + throw new SilentError(oneLine` + Your package.json scripts must not contain a start script as it will be overwritten. + `); + } + if (scripts['pree2e'] && scripts['pree2e'] !== pree2eNpmScript) { + throw new SilentError(oneLine` + Your package.json scripts must not contain a pree2e script as it will be + overwritten. + `); + } + if (scripts['e2e'] && scripts['e2e'] !== 'ng e2e') { + throw new SilentError(oneLine` + Your package.json scripts must not contain a e2e script as it will be overwritten. + `); + } + if (scripts['test'] && scripts['test'] !== 'ng test') { + throw new SilentError(oneLine` + Your package.json scripts must not contain a test script as it will be overwritten. + `); + } } packageJson['scripts']['build'] = 'webpack'; From 215b77dd0bcccdf3834f77b4ec43356bd4749f9c Mon Sep 17 00:00:00 2001 From: Cyrille Tuzi Date: Thu, 7 Dec 2017 20:44:42 +0100 Subject: [PATCH 053/115] fix(@angular/cli): allow TS 2.5 for Angular >= 5.1 fix(@angular/cli): allow TS 2.5 for Angular >= 5.1 fix(@angular/cli): allow TS 2.5 for Angular >= 5.1 --- packages/@angular/cli/upgrade/version.ts | 3 ++- tests/e2e/tests/misc/typescript-warning.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/@angular/cli/upgrade/version.ts b/packages/@angular/cli/upgrade/version.ts index 0fcf5f226642..d8620acc4b74 100644 --- a/packages/@angular/cli/upgrade/version.ts +++ b/packages/@angular/cli/upgrade/version.ts @@ -169,7 +169,8 @@ export class Version { const versionCombos = [ { compiler: '>=2.3.1 <3.0.0', typescript: '>=2.0.2 <2.3.0' }, { compiler: '>=4.0.0 <5.0.0', typescript: '>=2.1.0 <2.4.0' }, - { compiler: '>=5.0.0 <6.0.0', typescript: '>=2.4.2 <2.5.0' } + { compiler: '>=5.0.0 <5.1.0', typescript: '>=2.4.2 <2.5.0' }, + { compiler: '>=5.1.0 <6.0.0', typescript: '>=2.4.2 <2.6.0' } ]; const currentCombo = versionCombos.find((combo) => satisfies(compilerVersion, combo.compiler)); diff --git a/tests/e2e/tests/misc/typescript-warning.ts b/tests/e2e/tests/misc/typescript-warning.ts index 28f695df101b..974470d750ce 100644 --- a/tests/e2e/tests/misc/typescript-warning.ts +++ b/tests/e2e/tests/misc/typescript-warning.ts @@ -3,9 +3,9 @@ import { getGlobalVariable } from '../../utils/env'; export default function () { - // typescript@2.5 is not part of the officially supported range in latest stable. + // typescript@2.6 is not part of the officially supported range in latest stable. // Update as needed. - let unsupportedTsVersion = '2.5'; + let unsupportedTsVersion = '2.6'; // Skip this test in Angular 2/4. if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { From 883c02280734c7cc671aa1d45c786a46780cd69f Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 14 Dec 2017 13:06:12 -0500 Subject: [PATCH 054/115] feat(@angular/cli): support sourcemaps in injected stylesheets --- package-lock.json | 9 +++++---- package.json | 2 +- packages/@angular/cli/models/webpack-configs/styles.ts | 5 +---- packages/@angular/cli/package.json | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 184bce270c46..6583e5f732c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8272,11 +8272,12 @@ "dev": true }, "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", "requires": { - "loader-utils": "1.1.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "stylus": { diff --git a/package.json b/package.json index 4590dc2c60db..cbbfa3263239 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "source-map": "^0.5.6", "source-map-loader": "^0.2.0", "source-map-support": "^0.4.1", - "style-loader": "^0.13.1", + "style-loader": "^0.19.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", "tree-kill": "^1.0.0", diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index ade1f18b3da6..723cc9902e63 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -36,10 +36,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const entryPoints: { [key: string]: string[] } = {}; const globalStylePaths: string[] = []; const extraPlugins: any[] = []; - // style-loader does not support sourcemaps without absolute publicPath, so it's - // better to disable them when not extracting css - // https://github.com/webpack-contrib/style-loader#recommended-configuration - const cssSourceMap = buildOptions.extractCss && buildOptions.sourcemaps; + const cssSourceMap = buildOptions.sourcemaps; // Minify/optimize css in production. const minimizeCss = buildOptions.target === 'production'; diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 468daef52f96..85d9e349d806 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -72,7 +72,7 @@ "source-map-loader": "^0.2.0", "source-map-support": "^0.4.1", "istanbul-instrumenter-loader": "^2.0.0", - "style-loader": "^0.13.1", + "style-loader": "^0.19.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", "uglifyjs-webpack-plugin": "~1.1.2", From a39fad3b7f1e890050897d84d2654eef74ef5acd Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Dec 2017 16:34:47 +0000 Subject: [PATCH 055/115] docs: document ES2015 support --- docs/documentation/build.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/documentation/build.md b/docs/documentation/build.md index 6fb166b1f676..19fe3371f891 100644 --- a/docs/documentation/build.md +++ b/docs/documentation/build.md @@ -118,6 +118,16 @@ Remember to disable the service worker while developing to avoid stale code. Note: service worker support is experimental and subject to change. +### ES2015 support + +To build in ES2015 mode, edit `./tsconfig.json` to use `"target": "es2015"` (instead of `es5`). + +This will cause application TypeScript and Uglify be output as ES2015, and third party libraries +to be loaded through the `es2015` entry in `package.json` if available. + +Be aware that JIT does not support ES2015 and so you should build/serve your app with `--aot`. +See https://github.com/angular/angular-cli/issues/7797 for details. + ## Options
aot From 8ca3de756353df0db005a86bb77c84f296d94e78 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Sat, 9 Dec 2017 14:07:48 -0500 Subject: [PATCH 056/115] fix(@ngtools/webpack): support AngularCompilerPlugin compilerOptions --- packages/@ngtools/webpack/src/angular_compiler_plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 397d66fa79ae..10bb8819fe81 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -174,7 +174,7 @@ export class AngularCompilerPlugin implements Tapable { } this._rootNames = config.rootNames.concat(...this._singleFileIncludes); - this._compilerOptions = config.options; + this._compilerOptions = { ...config.options, ...options.compilerOptions }; this._basePath = config.options.basePath; // Overwrite outDir so we can find generated files next to their .ts origin in compilerHost. From e87209c1c0ca3ccd8863dc47067b771cfcb2154c Mon Sep 17 00:00:00 2001 From: Yaroslav Admin Date: Mon, 18 Dec 2017 16:39:44 +0100 Subject: [PATCH 057/115] fix(@angular/cli): disable progress when running Karma directly outside TTY Fixes a shortcoming of #8501. Apply same logic for setting --progress flag when running Karma directly (as opposed to running it using `ng test` command). Fixes #8148 --- packages/@angular/cli/plugins/karma.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@angular/cli/plugins/karma.ts b/packages/@angular/cli/plugins/karma.ts index ad893a5fadb5..3f813871912d 100644 --- a/packages/@angular/cli/plugins/karma.ts +++ b/packages/@angular/cli/plugins/karma.ts @@ -53,7 +53,7 @@ const init: any = (config: any, emitter: any, customFileHandlers: any) => { environment: 'dev', codeCoverage: false, sourcemaps: true, - progress: true, + progress: process.stdout.isTTY === true, preserveSymlinks: false, }, config.angularCli); From 90e2e805aae6e0bd2e00e52063221736a8d9cb0c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 14 Dec 2017 12:29:36 -0500 Subject: [PATCH 058/115] feat(@angular/cli): can disable unsupported serve path warning --- packages/@angular/cli/lib/config/schema.json | 5 +++++ packages/@angular/cli/tasks/serve.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/lib/config/schema.json b/packages/@angular/cli/lib/config/schema.json index ed76e185da45..dd34c1b389ea 100644 --- a/packages/@angular/cli/lib/config/schema.json +++ b/packages/@angular/cli/lib/config/schema.json @@ -614,6 +614,11 @@ "description": "Show a warning when the TypeScript version is incompatible", "type": "boolean", "default": true + }, + "servePathDefault": { + "description": "Show a warning when deploy-url/base-href use unsupported serve path values.", + "type": "boolean", + "default": true } } } diff --git a/packages/@angular/cli/tasks/serve.ts b/packages/@angular/cli/tasks/serve.ts index 6884ea3d716d..852eda4cd699 100644 --- a/packages/@angular/cli/tasks/serve.ts +++ b/packages/@angular/cli/tasks/serve.ts @@ -193,7 +193,8 @@ export default Task.extend({ if (!servePath && servePath !== '') { const defaultServePath = findDefaultServePath(serveTaskOptions.baseHref, serveTaskOptions.deployUrl); - if (defaultServePath == null) { + const showWarning = CliConfig.fromProject().get('warnings.servePathDefault'); + if (defaultServePath == null && showWarning) { ui.writeLine(oneLine` ${chalk.yellow('WARNING')} --deploy-url and/or --base-href contain unsupported values for ng serve. Default serve path of '/' used. From 6efd5b77463bb0fcb60ef6765ba52bf2bf561514 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 6 Dec 2017 14:32:25 -0500 Subject: [PATCH 059/115] feat(@angular/cli): optimize stylesheets after full bundling --- package.json | 2 +- .../cli/models/webpack-configs/styles.ts | 20 +--- packages/@angular/cli/package.json | 2 +- .../cli/plugins/cleancss-webpack-plugin.ts | 111 ++++++++++++++++++ packages/@angular/cli/plugins/webpack.ts | 1 + packages/@angular/cli/tasks/eject.ts | 2 +- 6 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 packages/@angular/cli/plugins/cleancss-webpack-plugin.ts diff --git a/package.json b/package.json index cbbfa3263239..88e5e6ffbb25 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,11 @@ "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", + "clean-css": "^4.1.9", "common-tags": "^1.3.1", "copy-webpack-plugin": "^4.1.1", "core-object": "^3.1.0", "css-loader": "^0.28.1", - "cssnano": "^3.10.0", "denodeify": "^1.2.1", "ember-cli-string-utils": "^1.0.0", "enhanced-resolve": "^3.4.1", diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 723cc9902e63..23d4d67e1ef1 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -6,8 +6,8 @@ import { import { extraEntryParser, getOutputHashFormat } from './utils'; import { WebpackConfigOptions } from '../webpack-config'; import { pluginArgs, postcssArgs } from '../../tasks/eject'; +import { CleanCssWebpackPlugin } from '../../plugins/cleancss-webpack-plugin'; -const cssnano = require('cssnano'); const postcssUrl = require('postcss-url'); const autoprefixer = require('autoprefixer'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); @@ -45,15 +45,6 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const deployUrl = wco.buildOptions.deployUrl || ''; const postcssPluginCreator = function() { - // safe settings based on: https://github.com/ben-eb/cssnano/issues/358#issuecomment-283696193 - const importantCommentRe = /@preserve|@licen[cs]e|[@#]\s*source(?:Mapping)?URL|^!/i; - const minimizeOptions = { - autoprefixer: false, // full pass with autoprefixer is run separately - safe: true, - mergeLonghand: false, // version 3+ should be safe; cssnano currently uses 2.x - discardComments : { remove: (comment: string) => !importantCommentRe.test(comment) } - }; - return [ postcssUrl([ { @@ -84,15 +75,12 @@ export function getStylesConfig(wco: WebpackConfigOptions) { ]), autoprefixer(), customProperties({ preserve: true }) - ].concat( - minimizeCss ? [cssnano(minimizeOptions)] : [] - ); + ]; }; (postcssPluginCreator as any)[postcssArgs] = { variableImports: { 'autoprefixer': 'autoprefixer', 'postcss-url': 'postcssUrl', - 'cssnano': 'cssnano', 'postcss-custom-properties': 'customProperties' }, variables: { minimizeCss, baseHref, deployUrl } @@ -222,6 +210,10 @@ export function getStylesConfig(wco: WebpackConfigOptions) { extraPlugins.push(new SuppressExtractedTextChunksWebpackPlugin()); } + if (minimizeCss) { + extraPlugins.push(new CleanCssWebpackPlugin({ sourceMap: cssSourceMap })); + } + return { entry: entryPoints, module: { rules }, diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 85d9e349d806..2b35a0ae47de 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -35,11 +35,11 @@ "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", + "clean-css": "^4.1.9", "common-tags": "^1.3.1", "copy-webpack-plugin": "^4.1.1", "core-object": "^3.1.0", "css-loader": "^0.28.1", - "cssnano": "^3.10.0", "denodeify": "^1.2.1", "ember-cli-string-utils": "^1.0.0", "exports-loader": "^0.6.3", diff --git a/packages/@angular/cli/plugins/cleancss-webpack-plugin.ts b/packages/@angular/cli/plugins/cleancss-webpack-plugin.ts new file mode 100644 index 000000000000..2b469c0264ba --- /dev/null +++ b/packages/@angular/cli/plugins/cleancss-webpack-plugin.ts @@ -0,0 +1,111 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import { Compiler } from 'webpack'; +import { RawSource, SourceMapSource } from 'webpack-sources'; + +const CleanCSS = require('clean-css'); + +interface Chunk { + files: string[]; +} + +export interface CleanCssWebpackPluginOptions { + sourceMap: boolean; +} + +export class CleanCssWebpackPlugin { + + constructor(private options: Partial = {}) {} + + apply(compiler: Compiler): void { + compiler.plugin('compilation', (compilation: any) => { + compilation.plugin('optimize-chunk-assets', + (chunks: Array, callback: (err?: Error) => void) => { + + const cleancss = new CleanCSS({ + compatibility: 'ie9', + level: 2, + inline: false, + returnPromise: true, + sourceMap: this.options.sourceMap, + }); + + const files: string[] = [...compilation.additionalChunkAssets]; + + chunks.forEach(chunk => { + if (chunk.files && chunk.files.length > 0) { + files.push(...chunk.files); + } + }); + + const actions = files + .filter(file => file.endsWith('.css')) + .map(file => { + const asset = compilation.assets[file]; + if (!asset) { + return Promise.resolve(); + } + + let content: string; + let map: any; + if (asset.sourceAndMap) { + const sourceAndMap = asset.sourceAndMap(); + content = sourceAndMap.source; + map = sourceAndMap.map; + } else { + content = asset.source(); + } + + if (content.length === 0) { + return Promise.resolve(); + } + + return Promise.resolve() + .then(() => cleancss.minify(content, map)) + .then((output: any) => { + let hasWarnings = false; + if (output.warnings && output.warnings.length > 0) { + compilation.warnings.push(...output.warnings); + hasWarnings = true; + } + + if (output.errors && output.errors.length > 0) { + output.errors + .forEach((error: string) => compilation.errors.push(new Error(error))); + return; + } + + // generally means invalid syntax so bail + if (hasWarnings && output.stats.minifiedSize === 0) { + return; + } + + let newSource; + if (output.sourceMap) { + newSource = new SourceMapSource( + output.styles, + file, + output.sourceMap.toString(), + content, + map, + ); + } else { + newSource = new RawSource(output.styles); + } + + compilation.assets[file] = newSource; + }); + }); + + Promise.all(actions) + .then(() => callback()) + .catch(err => callback(err)); + }); + }); + } +} diff --git a/packages/@angular/cli/plugins/webpack.ts b/packages/@angular/cli/plugins/webpack.ts index e261571f7cc8..f590c5030412 100644 --- a/packages/@angular/cli/plugins/webpack.ts +++ b/packages/@angular/cli/plugins/webpack.ts @@ -1,5 +1,6 @@ // Exports the webpack plugins we use internally. export { BaseHrefWebpackPlugin } from '../lib/base-href-webpack/base-href-webpack-plugin'; +export { CleanCssWebpackPlugin, CleanCssWebpackPluginOptions } from './cleancss-webpack-plugin'; export { GlobCopyWebpackPlugin, GlobCopyWebpackPluginOptions } from './glob-copy-webpack-plugin'; export { NamedLazyChunksWebpackPlugin } from './named-lazy-chunks-webpack-plugin'; export { ScriptsWebpackPlugin, ScriptsWebpackPluginOptions } from './scripts-webpack-plugin'; diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index 9928b47a76ef..c7a920d76512 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -190,6 +190,7 @@ class JsonWebpackSerializer { this._addImport('webpack.optimize', 'ModuleConcatenationPlugin'); break; case angularCliPlugins.BaseHrefWebpackPlugin: + case angularCliPlugins.CleanCssWebpackPlugin: case angularCliPlugins.NamedLazyChunksWebpackPlugin: case angularCliPlugins.ScriptsWebpackPlugin: case angularCliPlugins.SuppressExtractedTextChunksWebpackPlugin: @@ -565,7 +566,6 @@ export default Task.extend({ 'webpack', 'autoprefixer', 'css-loader', - 'cssnano', 'exports-loader', 'file-loader', 'html-webpack-plugin', From 9b17c43c5495cc7e04821a7f160169442ae4dd8d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 8 Dec 2017 13:45:03 -0500 Subject: [PATCH 060/115] refactor(@ngtools/webpack): restructure webpack resource loader --- packages/@ngtools/webpack/package.json | 3 +- .../@ngtools/webpack/src/resource_loader.ts | 63 +++++++++---------- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 45c65f3d37b6..326d0eae042f 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -31,7 +31,8 @@ "enhanced-resolve": "^3.1.0", "magic-string": "^0.22.3", "semver": "^5.3.0", - "source-map": "^0.5.6" + "source-map": "^0.5.6", + "webpack-sources": "^1.1.0" }, "peerDependencies": { "webpack": "^2.2.0 || ^3.0.0" diff --git a/packages/@ngtools/webpack/src/resource_loader.ts b/packages/@ngtools/webpack/src/resource_loader.ts index e914c654e6c9..62c60de414b7 100644 --- a/packages/@ngtools/webpack/src/resource_loader.ts +++ b/packages/@ngtools/webpack/src/resource_loader.ts @@ -1,5 +1,6 @@ import * as vm from 'vm'; import * as path from 'path'; +import { RawSource } from 'webpack-sources'; const NodeTemplatePlugin = require('webpack/lib/node/NodeTemplatePlugin'); const NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin'); @@ -53,12 +54,7 @@ export class WebpackResourceLoader { new LoaderTargetPlugin('node') ); - // Store the result of the parent compilation before we start the child compilation - let assetsBeforeCompilation = Object.assign( - {}, - this._parentCompilation.assets[outputOptions.filename] - ); - + // NOTE: This is not needed with webpack 3.6+ // Fix for "Uncaught TypeError: __webpack_require__(...) is not a function" // Hot module replacement requires that every child compiler has its own // cache. @see https://github.com/ampedandwired/html-webpack-plugin/pull/179 @@ -71,9 +67,25 @@ export class WebpackResourceLoader { } }); + childCompiler.plugin('this-compilation', (compilation: any) => { + compilation.plugin('additional-assets', (callback: (err?: Error) => void) => { + const asset = compilation.assets[filePath]; + if (asset) { + this._evaluate({ outputName: filePath, source: asset.source() }) + .then(output => { + compilation.assets[filePath] = new RawSource(output); + callback(); + }) + .catch(err => callback(err)); + } else { + callback(); + } + }); + }); + // Compile and return a promise return new Promise((resolve, reject) => { - childCompiler.runAsChild((err: Error, entries: any[], childCompilation: any) => { + childCompiler.compile((err: Error, childCompilation: any) => { // Resolve / reject the promise if (childCompilation && childCompilation.errors && childCompilation.errors.length) { const errorDetails = childCompilation.errors.map(function (error: any) { @@ -83,47 +95,30 @@ export class WebpackResourceLoader { } else if (err) { reject(err); } else { - // Replace [hash] placeholders in filename - const outputName = this._parentCompilation.mainTemplate.applyPluginsWaterfall( - 'asset-path', outputOptions.filename, { - hash: childCompilation.hash, - chunk: entries[0] - }); - - // Restore the parent compilation to the state like it was before the child compilation. - Object.keys(childCompilation.assets).forEach((fileName) => { - // If it wasn't there and it's a source file (absolute path) - delete it. - if (assetsBeforeCompilation[fileName] === undefined && path.isAbsolute(fileName)) { - delete this._parentCompilation.assets[fileName]; - } else { - // Otherwise, add it to the parent compilation. - this._parentCompilation.assets[fileName] = childCompilation.assets[fileName]; + Object.keys(childCompilation.assets).forEach(assetName => { + if (assetName !== filePath && this._parentCompilation.assets[assetName] == undefined) { + this._parentCompilation.assets[assetName] = childCompilation.assets[assetName]; } }); // Save the dependencies for this resource. - this._resourceDependencies.set(outputName, childCompilation.fileDependencies); + this._resourceDependencies.set(filePath, childCompilation.fileDependencies); resolve({ // Output name. - outputName, + outputName: filePath, // Compiled code. - source: childCompilation.assets[outputName].source() + source: childCompilation.assets[filePath].source() }); } }); }); } - private _evaluate(output: CompilationOutput): Promise { + private _evaluate({ outputName, source }: CompilationOutput): Promise { try { - const outputName = output.outputName; - const vmContext = vm.createContext(Object.assign({ require: require }, global)); - const vmScript = new vm.Script(output.source, { filename: outputName }); - - // Evaluate code and cast to string - let evaluatedSource: string; - evaluatedSource = vmScript.runInContext(vmContext); + // Evaluate code + const evaluatedSource = vm.runInNewContext(source, undefined, { filename: outputName }); if (typeof evaluatedSource == 'string') { return Promise.resolve(evaluatedSource); @@ -137,6 +132,6 @@ export class WebpackResourceLoader { get(filePath: string): Promise { return this._compile(filePath) - .then((result: CompilationOutput) => this._evaluate(result)); + .then((result: CompilationOutput) => result.source); } } From 64b4b03fb5dd7cb772be38709fa351315fde4455 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 20 Dec 2017 10:55:09 -0500 Subject: [PATCH 061/115] fix(@ngtools/webpack): avoid caching binary resources as UTF8 --- .../@ngtools/webpack/src/compiler_host.ts | 20 ++-------------- .../@ngtools/webpack/src/resource_loader.ts | 23 ++++++++++++++----- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/packages/@ngtools/webpack/src/compiler_host.ts b/packages/@ngtools/webpack/src/compiler_host.ts index 33cc54fe46d6..d53ba4a110bb 100644 --- a/packages/@ngtools/webpack/src/compiler_host.ts +++ b/packages/@ngtools/webpack/src/compiler_host.ts @@ -97,7 +97,6 @@ export class WebpackCompilerHost implements ts.CompilerHost { private _delegate: ts.CompilerHost; private _files: {[path: string]: VirtualFileStats | null} = Object.create(null); private _directories: {[path: string]: VirtualDirStats | null} = Object.create(null); - private _cachedResources: {[path: string]: string | undefined} = Object.create(null); private _changedFiles: {[path: string]: boolean} = Object.create(null); private _changedDirs: {[path: string]: boolean} = Object.create(null); @@ -174,8 +173,8 @@ export class WebpackCompilerHost implements ts.CompilerHost { fileName = this.resolve(fileName); if (fileName in this._files) { this._files[fileName] = null; - this._changedFiles[fileName] = true; } + this._changedFiles[fileName] = true; } fileExists(fileName: string, delegate = true): boolean { @@ -299,22 +298,7 @@ export class WebpackCompilerHost implements ts.CompilerHost { if (this._resourceLoader) { // These paths are meant to be used by the loader so we must denormalize them. const denormalizedFileName = this.denormalizePath(fileName); - const resourceDeps = this._resourceLoader.getResourceDependencies(denormalizedFileName); - - if (this._cachedResources[fileName] === undefined - || resourceDeps.some((dep) => this._changedFiles[this.resolve(dep)])) { - return this._resourceLoader.get(denormalizedFileName) - .then((resource) => { - // Add resource dependencies to the compiler host file list. - // This way we can check the changed files list to determine whether to use cache. - this._resourceLoader.getResourceDependencies(denormalizedFileName) - .forEach((dep) => this.readFile(dep)); - this._cachedResources[fileName] = resource; - return resource; - }); - } else { - return this._cachedResources[fileName]; - } + return this._resourceLoader.get(denormalizedFileName); } else { return this.readFile(fileName); } diff --git a/packages/@ngtools/webpack/src/resource_loader.ts b/packages/@ngtools/webpack/src/resource_loader.ts index 62c60de414b7..cce18e26fa77 100644 --- a/packages/@ngtools/webpack/src/resource_loader.ts +++ b/packages/@ngtools/webpack/src/resource_loader.ts @@ -18,6 +18,7 @@ export class WebpackResourceLoader { private _context: string; private _uniqueId = 0; private _resourceDependencies = new Map(); + private _cachedResources = new Map(); constructor() {} @@ -69,6 +70,11 @@ export class WebpackResourceLoader { childCompiler.plugin('this-compilation', (compilation: any) => { compilation.plugin('additional-assets', (callback: (err?: Error) => void) => { + if (this._cachedResources.has(compilation.fullHash)) { + callback(); + return; + } + const asset = compilation.assets[filePath]; if (asset) { this._evaluate({ outputName: filePath, source: asset.source() }) @@ -104,12 +110,17 @@ export class WebpackResourceLoader { // Save the dependencies for this resource. this._resourceDependencies.set(filePath, childCompilation.fileDependencies); - resolve({ - // Output name. - outputName: filePath, - // Compiled code. - source: childCompilation.assets[filePath].source() - }); + const compilationHash = childCompilation.fullHash; + if (this._cachedResources.has(compilationHash)) { + resolve({ + outputName: filePath, + source: this._cachedResources.get(compilationHash), + }); + } else { + const source = childCompilation.assets[filePath].source(); + this._cachedResources.set(compilationHash, source); + resolve({ outputName: filePath, source }); + } } }); }); From 9caa7ca0d1ab175301b60fcb5d3c42379a51a58d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 7 Dec 2017 13:29:02 -0500 Subject: [PATCH 062/115] fix(@angular/cli): support inlining stylesheet resource tilde paths --- .../cli/models/webpack-configs/styles.ts | 6 +++++- tests/e2e/tests/build/styles/inline-urls.ts | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 23d4d67e1ef1..de830c0187f2 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -46,6 +46,10 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const postcssPluginCreator = function() { return [ + postcssUrl({ + filter: ({ url }: { url: string }) => url.startsWith('~'), + url: ({ url }: { url: string }) => path.join(projectRoot, 'node_modules', url.substr(1)), + }), postcssUrl([ { // Only convert root relative URLs, which CSS-Loader won't process into require(). @@ -83,7 +87,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { 'postcss-url': 'postcssUrl', 'postcss-custom-properties': 'customProperties' }, - variables: { minimizeCss, baseHref, deployUrl } + variables: { minimizeCss, baseHref, deployUrl, projectRoot } }; // determine hashing format diff --git a/tests/e2e/tests/build/styles/inline-urls.ts b/tests/e2e/tests/build/styles/inline-urls.ts index ead6e674e05b..310ca9ab53c2 100644 --- a/tests/e2e/tests/build/styles/inline-urls.ts +++ b/tests/e2e/tests/build/styles/inline-urls.ts @@ -1,4 +1,4 @@ -import { ng } from '../../../utils/process'; +import { ng, silentNpm } from '../../../utils/process'; import { expectFileToMatch, expectFileToExist, @@ -7,6 +7,7 @@ import { } from '../../../utils/fs'; import { copyProjectAsset } from '../../../utils/assets'; import { expectToFail } from '../../../utils/utils'; +import { updateJsonFile } from '../../../utils/project'; const imgSvg = ` @@ -16,8 +17,11 @@ const imgSvg = ` export default function () { return Promise.resolve() + .then(() => silentNpm('install', 'font-awesome@4.7.0')) .then(() => writeMultipleFiles({ - 'src/styles.css': ` + 'src/styles.scss': ` + $fa-font-path: "~font-awesome/font"; + @import "~font-awesome/scss/font-awesome"; h1 { background: url('./assets/large.png'); } h2 { background: url('./assets/small.svg'); } p { background: url('./assets/small-id.svg#testID'); } @@ -30,7 +34,16 @@ export default function () { 'src/assets/small-id.svg': imgSvg })) .then(() => copyProjectAsset('images/spectrum.png', './assets/large.png')) + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['styles'] = ['styles.scss']; + })) .then(() => ng('build', '--extract-css', '--aot')) + .then(({ stdout }) => { + if (stdout.match(/postcss-url: \.+: Can't read file '\.+', ignoring/)) { + throw new Error('Expected no postcss-url file read warnings.'); + } + }) // Check paths are correctly generated. .then(() => expectFileToMatch('dist/styles.bundle.css', /url\([\'"]?large\.[0-9a-f]{20}\.png[\'"]?\)/)) From daeda6797a10d290c66a31212218dbc49b307595 Mon Sep 17 00:00:00 2001 From: Kevin Phelps Date: Mon, 18 Dec 2017 15:23:40 -0600 Subject: [PATCH 063/115] fix(@ngtools/webpack): allow typescript dev versions --- packages/@ngtools/webpack/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@ngtools/webpack/src/index.ts b/packages/@ngtools/webpack/src/index.ts index 6292e36f96f8..25689f51811d 100644 --- a/packages/@ngtools/webpack/src/index.ts +++ b/packages/@ngtools/webpack/src/index.ts @@ -1,12 +1,12 @@ // @ignoreDep typescript -import { satisfies } from 'semver'; +import { gte } from 'semver'; // Test if typescript is available. This is a hack. We should be using peerDependencies instead // but can't until we split global and local packages. // See https://github.com/angular/angular-cli/issues/8107#issuecomment-338185872 try { const version = require('typescript').version; - if (!satisfies(version, '^2.0.2')) { + if (!gte(version, '2.0.2')) { throw new Error(); } } catch (e) { From 54e58630784053ecdec719bffe7f3ef5b622b45c Mon Sep 17 00:00:00 2001 From: CaerusKaru Date: Thu, 14 Dec 2017 10:04:49 -0500 Subject: [PATCH 064/115] docs: add addons to travis yml in CI story Fixes #8840 --- docs/documentation/stories/continuous-integration.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/documentation/stories/continuous-integration.md b/docs/documentation/stories/continuous-integration.md index 1745f8cf4240..ba24aba1a07c 100644 --- a/docs/documentation/stories/continuous-integration.md +++ b/docs/documentation/stories/continuous-integration.md @@ -119,6 +119,13 @@ sudo: false language: node_js node_js: - "6" + +addons: + apt: + sources: + - google-chrome + packages: + - google-chrome-stable cache: directories: From 93c3b124461c5a83500c05c370b8c435ee8b06bf Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 21 Dec 2017 19:42:57 +0000 Subject: [PATCH 065/115] fix(@ngtools/webpack): improve missing TS file error message Related to https://github.com/angular/angular-cli/issues/8284#issuecomment-341417325 --- .../webpack/src/angular_compiler_plugin.ts | 22 +++++++++++-------- tests/e2e/tests/build/build-errors.ts | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 10bb8819fe81..1c95c4481226 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -816,16 +816,20 @@ export class AngularCompilerPlugin implements Tapable { .map((p) => this._compilerHost.denormalizePath(p)); } } else { - // Check if the TS file exists. - if (fileName.endsWith('.ts') && !this._compilerHost.fileExists(fileName, false)) { - throw new Error(`${fileName} is not part of the compilation. ` - + `Please make sure it is in your tsconfig via the 'files' or 'include' property.`); - } + // Check if the TS input file and the JS output file exist. + if ((fileName.endsWith('.ts') && !this._compilerHost.fileExists(fileName, false)) + || !this._compilerHost.fileExists(outputFile, false)) { + let msg = `${fileName} is missing from the TypeScript compilation. ` + + `Please make sure it is in your tsconfig via the 'files' or 'include' property.`; + + if (/(\\|\/)node_modules(\\|\/)/.test(fileName)) { + msg += '\nThe missing file seems to be part of a third party library. ' + + 'TS files in published libraries are often a sign of a badly packaged library. ' + + 'Please open an issue in the library repository to alert its author and ask them ' + + 'to package the library using the Angular Package Format (https://goo.gl/jB3GVv).'; + } - // Check if the output file exists. - if (!this._compilerHost.fileExists(outputFile, false)) { - throw new Error(`${fileName} is not part of the compilation output. ` - + `Please check the other error messages for details.`); + throw new Error(msg); } outputText = this._compilerHost.readFile(outputFile); diff --git a/tests/e2e/tests/build/build-errors.ts b/tests/e2e/tests/build/build-errors.ts index 32ce0ff98ddb..a5a97af7fb49 100644 --- a/tests/e2e/tests/build/build-errors.ts +++ b/tests/e2e/tests/build/build-errors.ts @@ -39,7 +39,7 @@ export default function () { })) .then(() => expectToFail(() => ng('build'))) .then(({ message }) => { - if (!message.includes('polyfills.ts is not part of the compilation')) { + if (!message.includes('polyfills.ts is missing from the TypeScript compilation')) { throw new Error(`Expected missing TS file error, got this instead:\n${message}`); } if (extraErrors.some((e) => message.includes(e))) { From a2ef7d1e036570289f0e618b92e32505c8687fae Mon Sep 17 00:00:00 2001 From: Joshua Wiens Date: Wed, 27 Dec 2017 04:36:53 -0600 Subject: [PATCH 066/115] fix(@angular/cli): Set uglify plugin minimum to 1.1.5 - Pins uglify-es dependency version on the Webpack side for #8997 --- package-lock.json | 79 +++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6583e5f732c8..6b4ae4fa28c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -930,9 +930,9 @@ "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" }, "cacache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.0.tgz", - "integrity": "sha512-s9h6I9NY3KcBjfuS28K6XNmrv/HNFSzlpVD6eYMXugZg3Y8jjI1lUzTeUMa0oKByCDtHfsIy5Ec7KgWRnC5gtg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.1.tgz", + "integrity": "sha512-dRHYcs9LvG9cHgdPzjiI+/eS7e1xRhULrcyOx04RZQsszNJXU2SL9CyG60yLnge282Qq5nwTv+ieK2fH+WPZmA==", "requires": { "bluebird": "3.5.1", "chownr": "1.0.1", @@ -2888,7 +2888,7 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { "commondir": "1.0.1", - "make-dir": "1.0.0", + "make-dir": "1.1.0", "pkg-dir": "2.0.0" } }, @@ -5321,11 +5321,18 @@ } }, "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "requires": { - "pify": "2.3.0" + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "make-error": { @@ -5552,9 +5559,9 @@ "flush-write-stream": "1.0.2", "from2": "2.3.0", "parallel-transform": "1.1.0", - "pump": "1.0.2", + "pump": "1.0.3", "pumpify": "1.3.5", - "stream-each": "1.2.0", + "stream-each": "1.2.2", "through2": "2.0.3" } }, @@ -7118,9 +7125,9 @@ } }, "pump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "requires": { "end-of-stream": "1.4.0", "once": "1.4.0" @@ -7133,7 +7140,7 @@ "requires": { "duplexify": "3.5.1", "inherits": "2.0.3", - "pump": "1.0.2" + "pump": "1.0.3" } }, "punycode": { @@ -7747,6 +7754,11 @@ } } }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=" + }, "serializerr": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/serializerr/-/serializerr-1.0.3.tgz", @@ -8172,9 +8184,9 @@ } }, "stream-each": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.0.tgz", - "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "requires": { "end-of-stream": "1.4.0", "stream-shift": "1.0.0" @@ -8747,23 +8759,24 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.2.tgz", - "integrity": "sha512-k07cmJTj+8vZMSc3BaQ9uW7qVl2MqDts4ti4KaNACXEcXSw2vQM2S8olSk/CODxvcSFGvUHzNSqA8JQlhgUJPw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.5.tgz", + "integrity": "sha512-YBGc9G7dv12Vjx8vUQs54DZgAXVf04LlG6dNNiEbTZjL3PbUqiY4uPB9Kv+fUJaqRskEGva/lS7sh08yJr7jnA==", "requires": { - "cacache": "10.0.0", + "cacache": "10.0.1", "find-cache-dir": "1.0.0", "schema-utils": "0.3.0", + "serialize-javascript": "1.4.0", "source-map": "0.6.1", - "uglify-es": "3.2.0", + "uglify-es": "3.2.2", "webpack-sources": "1.0.1", - "worker-farm": "1.4.1" + "worker-farm": "1.5.2" }, "dependencies": { "commander": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", - "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==" + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" }, "source-map": { "version": "0.6.1", @@ -8771,11 +8784,11 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "uglify-es": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.0.tgz", - "integrity": "sha512-eD4rjK4o6rzrvE1SMZJLQFEVMnWRUyIu6phJ0BXk5TIthMmP5B4QP0HI8o3bkQB5wf1N4WHA0leZAQyQBAd+Jg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.2.tgz", + "integrity": "sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug==", "requires": { - "commander": "2.12.1", + "commander": "2.12.2", "source-map": "0.6.1" } } @@ -9468,9 +9481,9 @@ "dev": true }, "worker-farm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", - "integrity": "sha512-tgFAtgOYLPutkAyzgpS6VJFL5HY+0ui1Tvua+fITgz8ByaJTMFGtazR6xxQfwfiAcbwE+2fLG/K49wc2TfwCNw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", + "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", "requires": { "errno": "0.1.4", "xtend": "4.0.1" diff --git a/package.json b/package.json index 88e5e6ffbb25..4030f2d1e540 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "stylus-loader": "^3.0.1", "tree-kill": "^1.0.0", "typescript": "~2.4.2", - "uglifyjs-webpack-plugin": "~1.1.2", + "uglifyjs-webpack-plugin": "^1.1.5", "url-loader": "^0.6.2", "webpack": "~3.10.0", "webpack-dev-middleware": "~1.12.0", From 31296c79766a8b5f4dfafd73d3533abfc544bd3b Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 13 Dec 2017 18:36:46 -0500 Subject: [PATCH 067/115] release: 1.6.3 --- package-lock.json | 34 ++++++++++++++------------ package.json | 8 +++--- packages/@angular/cli/package.json | 12 ++++----- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b4ae4fa28c2..2605a4d85c4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "@angular/cli", - "version": "1.6.0", + "version": "1.6.3", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.35", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.35.tgz", - "integrity": "sha512-7JxZZAYFSCc0tP6+NrRn3b2Cd1b9d+a3+OfwVNyNsNd2unelqUMko2hm0KLbC8BXcXt/OILg1E/ZgLAXSS47nw==", + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz", + "integrity": "sha512-EFFF7hBbVoTOzYfXuSlGhcDr8neafmwuBAIkzAekEjzik7OaTLq7LPG7As+ebed9ll+3DAGypnrpdIE1Tp/H/A==", "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", @@ -31,15 +31,22 @@ } }, "@angular-devkit/schematics": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.41.tgz", - "integrity": "sha512-eSXyRLM7g9NvNUwDd71iPjHEL0Zutg9PcLUSCrwFXR3Z8S6iStO2FpZACNmz5/Y7ksWLy5/1wjLuDJCHS4X/ig==", + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.42.tgz", + "integrity": "sha512-elTiNL0Nx9oin2pfZTvMBU/d9sgutXaZe8n3xm2p7jfqQZry5MYYFES4hq+WIJjtV/X9gAniafncEpxuF7ikYw==", "requires": { "@angular-devkit/core": "0.0.22", "@ngtools/json-schema": "1.1.0", - "@schematics/schematics": "0.0.10", + "@schematics/schematics": "0.0.11", "minimist": "1.2.0", "rxjs": "5.5.2" + }, + "dependencies": { + "@schematics/schematics": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.11.tgz", + "integrity": "sha512-HAXgAIuuAGjiIKohGlRUkmUTWYtNmclR12KHlQQxT9pHFdEb2OrpHjUp2YoV32jiU6jIZm4pf3ODwlPA0VbwnA==" + } } }, "@angular/compiler": { @@ -87,18 +94,13 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.10.tgz", - "integrity": "sha512-ykq4FL0WTygkpvIcGDxnxHHT2uvJMWseDeAujmfyZpzdT9X22GOTURNo3LjvOIhhVUpMVZvnAYqjV46KqB702g==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.11.tgz", + "integrity": "sha512-jYTantZjdYeDjxh9ZLYvGbDI0VeUxgSrcBjHvnHqMNe+YGJenY988ifWCwzjmOowj57maLrQQGrdoO7oUeNdyw==", "requires": { "@angular-devkit/core": "0.0.22" } }, - "@schematics/schematics": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.10.tgz", - "integrity": "sha512-9vr9W1X6oRp42pbiGRIk3L+T6SoFtHlAGrzbh6rbFQDNXT4UCHarqDigow+DEL6PR2ptXZO9WeLcad4it7zNyA==" - }, "@types/common-tags": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.4.0.tgz", diff --git a/package.json b/package.json index 4030f2d1e540..23323620406d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0", + "version": "1.6.3", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -41,9 +41,9 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.35", - "@angular-devkit/schematics": "~0.0.41", - "@schematics/angular": "~0.1.10", + "@angular-devkit/build-optimizer": "~0.0.36", + "@angular-devkit/schematics": "~0.0.42", + "@schematics/angular": "~0.1.11", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 2b35a0ae47de..97cafe43e788 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.0", + "version": "1.6.3", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -27,11 +27,11 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.35", - "@angular-devkit/schematics": "~0.0.41", + "@angular-devkit/build-optimizer": "~0.0.36", + "@angular-devkit/schematics": "~0.0.42", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.0", - "@schematics/angular": "~0.1.10", + "@ngtools/webpack": "1.9.3", + "@schematics/angular": "~0.1.11", "autoprefixer": "^6.5.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", @@ -75,7 +75,7 @@ "style-loader": "^0.19.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", - "uglifyjs-webpack-plugin": "~1.1.2", + "uglifyjs-webpack-plugin": "^1.1.5", "url-loader": "^0.6.2", "webpack": "~3.10.0", "webpack-dev-middleware": "~1.12.0", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 326d0eae042f..3bc90d05ae29 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.0", + "version": "1.9.3", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 238931011a7a0cefbb2eb070f20f385b0e68772e Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Thu, 28 Dec 2017 18:21:53 +0100 Subject: [PATCH 068/115] docs: update `skipCodeGeneration` section Seems like it's still widely used in https://github.com/angular/angular-cli/blob/master/packages/%40ngtools/webpack/src/angular_compiler_plugin.ts --- packages/@ngtools/webpack/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/README.md b/packages/@ngtools/webpack/README.md index fc3fc2529462..7163bc3bd2ca 100644 --- a/packages/@ngtools/webpack/README.md +++ b/packages/@ngtools/webpack/README.md @@ -64,7 +64,7 @@ The loader works with webpack plugin to compile your TypeScript. It's important * `basePath`. Optional. The root to use by the compiler to resolve file paths. By default, use the `tsConfigPath` root. * `entryModule`. Optional if specified in `angularCompilerOptions`. The path and classname of the main application module. This follows the format `path/to/file#ClassName`. * `mainPath`. Optional if `entryModule` is specified. The `main.ts` file containing the bootstrap code. The plugin will use AST to determine the `entryModule`. -* `skipCodeGeneration`. Optional, defaults to false. Disable code generation and do not refactor the code to bootstrap. This replaces `templateUrl: "string"` with `template: require("string")` (and similar for styles) to allow for webpack to properly link the resources. Only available in `AotPlugin`. +* `skipCodeGeneration`. Optional, defaults to false. Disable code generation and do not refactor the code to bootstrap. This replaces `templateUrl: "string"` with `template: require("string")` (and similar for styles) to allow for webpack to properly link the resources. * `typeChecking`. Optional, defaults to true. Enable type checking through your application. This will slow down compilation, but show syntactic and semantic errors in webpack. Only available in `AotPlugin`. * `exclude`. Optional. Extra files to exclude from TypeScript compilation. Not supported with `AngularCompilerPlugin`. * `sourceMap`. Optional. Include sourcemaps. From 6d9e02041ca89d42107593d128d699dbafb9a198 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 29 Dec 2017 09:44:39 +0000 Subject: [PATCH 069/115] fix(@angular/cli): update autoprefixer Fix #9020, related to https://travis-ci.org/angular/angular-cli/jobs/322676874#L3792 --- package-lock.json | 94 ++++++++++++++++++++++-- package.json | 2 +- packages/@angular/cli/package.json | 2 +- tests/e2e/tests/third-party/bootstrap.ts | 2 +- 4 files changed, 91 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2605a4d85c4e..6ad3b237568c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -587,16 +587,78 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.3.tgz", + "integrity": "sha512-dqzVGiz3v934+s3YZA6nk7tAs9xuTz5wMJbX1M+L4cY/MTNkOUqP61c1GWkEVlUL/PEy1pKRSCFuoRZrXYx9qA==", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000733", + "browserslist": "2.10.0", + "caniuse-lite": "1.0.30000784", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "5.2.17", + "postcss": "6.0.14", "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "browserslist": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.10.0.tgz", + "integrity": "sha512-WyvzSLsuAVPOjbljXnyeWl14Ae+ukAT8MUuagKVzIDvwBxl4UAwD1xqtyQs2eWYPGUKMeC3Ol62goqYuKqTTcw==", + "requires": { + "caniuse-lite": "1.0.30000784", + "electron-to-chromium": "1.3.28" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "electron-to-chromium": { + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz", + "integrity": "sha1-jdTmRYCGZE6fnwoc8y4qH53/2e4=" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "postcss": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } } }, "aws-sign2": { @@ -1005,6 +1067,11 @@ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000733.tgz", "integrity": "sha1-OmJbxBx6n5nVnWRVKFfdGvDt2dQ=" }, + "caniuse-lite": { + "version": "1.0.30000784", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000784.tgz", + "integrity": "sha1-EpztdOmhKApEGIC2zSvOMO9Z5sA=" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1911,6 +1978,21 @@ "postcss-unique-selectors": "2.0.2", "postcss-value-parser": "3.3.0", "postcss-zindex": "2.2.0" + }, + "dependencies": { + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000733", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + } + } } }, "csso": { diff --git a/package.json b/package.json index 23323620406d..0779e9d0b238 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@angular-devkit/build-optimizer": "~0.0.36", "@angular-devkit/schematics": "~0.0.42", "@schematics/angular": "~0.1.11", - "autoprefixer": "^6.5.3", + "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", "clean-css": "^4.1.9", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 97cafe43e788..33652e4a315e 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -32,7 +32,7 @@ "@ngtools/json-schema": "1.1.0", "@ngtools/webpack": "1.9.3", "@schematics/angular": "~0.1.11", - "autoprefixer": "^6.5.3", + "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", "clean-css": "^4.1.9", diff --git a/tests/e2e/tests/third-party/bootstrap.ts b/tests/e2e/tests/third-party/bootstrap.ts index 9be757f279e9..a86425c92f69 100644 --- a/tests/e2e/tests/third-party/bootstrap.ts +++ b/tests/e2e/tests/third-party/bootstrap.ts @@ -6,7 +6,7 @@ import {oneLineTrim} from 'common-tags'; export default function() { return Promise.resolve() - .then(() => silentNpm('install', 'bootstrap@next')) + .then(() => silentNpm('install', 'bootstrap@4.0.0-beta.3')) .then(() => updateJsonFile('.angular-cli.json', configJson => { const app = configJson['apps'][0]; app['styles'].push('../node_modules/bootstrap/dist/css/bootstrap.css'); From 07d3b931a82cc8b8b27c80be0e29d4948f0c63bf Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 29 Dec 2017 16:34:37 +0000 Subject: [PATCH 070/115] fix(@angular/cli): update to istanbul-instrumenter-loader 3.0.0 Fix #9002 --- package-lock.json | 39 ++++++++++-------------------- package.json | 2 +- packages/@angular/cli/package.json | 2 +- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ad3b237568c..7c78442c6a03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1701,9 +1701,9 @@ } }, "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, "cookie": { "version": "0.3.1", @@ -4875,27 +4875,14 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-instrumenter-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz", - "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz", + "integrity": "sha512-alLSEFX06ApU75sm5oWcaVNaiss/bgMRiWTct3g0P0ZZTKjR+6QiCcuVOKDI1kWJgwHEnIXsv/dWm783kPpmtw==", "requires": { - "convert-source-map": "1.5.0", - "istanbul-lib-instrument": "1.8.0", - "loader-utils": "0.2.17", - "object-assign": "4.1.1" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.9.1", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "istanbul-lib-coverage": { @@ -4904,9 +4891,9 @@ "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==" }, "istanbul-lib-instrument": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "requires": { "babel-generator": "6.26.0", "babel-template": "6.26.0", diff --git a/package.json b/package.json index 0779e9d0b238..517f55555c3f 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "fs-extra": "^4.0.0", "glob": "^7.0.3", "html-webpack-plugin": "^2.29.0", - "istanbul-instrumenter-loader": "^2.0.0", + "istanbul-instrumenter-loader": "^3.0.0", "karma-source-map-support": "^1.2.0", "less": "^2.7.2", "less-loader": "^4.0.5", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 33652e4a315e..07074bce7a12 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -71,7 +71,7 @@ "silent-error": "^1.0.0", "source-map-loader": "^0.2.0", "source-map-support": "^0.4.1", - "istanbul-instrumenter-loader": "^2.0.0", + "istanbul-instrumenter-loader": "^3.0.0", "style-loader": "^0.19.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", From 5eea7faf5a320e5f18c7dbef79105046819e32ea Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 29 Dec 2017 15:59:29 +0000 Subject: [PATCH 071/115] test: don't run ng5 factory test on ng2/4 --- tests/e2e/tests/build/rebuild-ngfactories.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/e2e/tests/build/rebuild-ngfactories.ts b/tests/e2e/tests/build/rebuild-ngfactories.ts index 26702d8a1156..e03ede0f9f4f 100644 --- a/tests/e2e/tests/build/rebuild-ngfactories.ts +++ b/tests/e2e/tests/build/rebuild-ngfactories.ts @@ -18,6 +18,11 @@ export default function () { return Promise.resolve(); } + // Skip this test in Angular 2/4. + if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { + return Promise.resolve(); + } + return execAndWaitForOutputToMatch('ng', ['serve', '--aot'], validBundleRegEx) .then(() => writeMultipleFiles({ 'src/app/app.component.css': ` From 813fd68f34baf3f8e9d27b9b30ec8a5a449544dd Mon Sep 17 00:00:00 2001 From: nename0 Date: Sat, 30 Dec 2017 17:19:32 +0100 Subject: [PATCH 072/115] fix(@ngtools/webpack): redo #7619 in angular_compiler_plugin --- packages/@ngtools/webpack/src/angular_compiler_plugin.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 1c95c4481226..9629dcc11c14 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -601,9 +601,9 @@ export class AngularCompilerPlugin implements Tapable { // Wait for the plugin to be done when requesting `.ts` files directly (entry points), or // when the issuer is a `.ts` or `.ngfactory.js` file. compiler.resolvers.normal.plugin('before-resolve', (request: any, cb: () => void) => { - if (request.request.endsWith('.ts') - || (request.context.issuer && /\.ts|ngfactory\.js$/.test(request.context.issuer))) { - this.done!.then(() => cb(), () => cb()); + if (this.done && (request.request.endsWith('.ts') + || (request.context.issuer && /\.ts|ngfactory\.js$/.test(request.context.issuer)))) { + this.done.then(() => cb(), () => cb()); } else { cb(); } From 97e86870376d8af70ce6120cdfe7377af81937da Mon Sep 17 00:00:00 2001 From: stockmind Date: Sun, 31 Dec 2017 01:56:30 +0100 Subject: [PATCH 073/115] docs(@angular/cli): add little note to relaunch npm after proxy.config changes --- docs/documentation/stories/proxy.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/documentation/stories/proxy.md b/docs/documentation/stories/proxy.md index 3298b5f97c79..3b7b92e29617 100644 --- a/docs/documentation/stories/proxy.md +++ b/docs/documentation/stories/proxy.md @@ -26,6 +26,8 @@ We can then edit the `package.json` file's start script to be Now in order to run our dev server with our proxy config, we can simply call `npm start`. +**After each edit to the proxy.conf.json file remember to relaunch the `npm start` process to make your changes effective.** + ### Rewriting the URL path One option that comes up a lot is rewriting the URL path for the proxy. This is supported by the `pathRewrite` option. From 5c60744127b9adaaef63391d56ddd7f02dab3a36 Mon Sep 17 00:00:00 2001 From: Thiago Almeida Date: Tue, 2 Jan 2018 01:42:49 +0000 Subject: [PATCH 074/115] fix(@angular/cli): fix old webpack's website links --- docs/documentation/stories/configure-hmr.md | 2 +- docs/documentation/stories/proxy.md | 4 ++-- packages/@angular/cli/tasks/serve.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/documentation/stories/configure-hmr.md b/docs/documentation/stories/configure-hmr.md index 85d21d6dfb77..daa0c3ca56e6 100644 --- a/docs/documentation/stories/configure-hmr.md +++ b/docs/documentation/stories/configure-hmr.md @@ -3,7 +3,7 @@ Hot Module Replacement (HMR) is a WebPack feature to update code in a running app without rebuilding it. This results in faster updates and less full page-reloads. -You can read more about HMR by visiting [this page](https://webpack.github.io/docs/hot-module-replacement.html). +You can read more about HMR by visiting [this page](https://webpack.js.org/guides/hot-module-replacement). In order to get HMR working with Angular CLI we first need to add a new environment and enable it. diff --git a/docs/documentation/stories/proxy.md b/docs/documentation/stories/proxy.md index 3b7b92e29617..12e35c9bda14 100644 --- a/docs/documentation/stories/proxy.md +++ b/docs/documentation/stories/proxy.md @@ -1,6 +1,6 @@ # Proxy To Backend -Using the [proxying support](https://webpack.github.io/docs/webpack-dev-server.html#proxy) in webpack's dev server we can highjack certain URLs and send them to a backend server. +Using the [proxying support](https://webpack.js.org/configuration/dev-server/#devserver-proxy) in webpack's dev server we can highjack certain URLs and send them to a backend server. We do this by passing a file to `--proxy-config` Say we have a server running on `http://localhost:3000/api` and we want all calls to `http://localhost:4200/api` to go to that server. @@ -16,7 +16,7 @@ We create a file next to our project's `package.json` called `proxy.conf.json` w } ``` -You can read more about what options are available [here](https://webpack.github.io/docs/webpack-dev-server.html#proxy). +You can read more about what options are available [here](https://webpack.js.org/configuration/dev-server/#devserver-proxy). We can then edit the `package.json` file's start script to be diff --git a/packages/@angular/cli/tasks/serve.ts b/packages/@angular/cli/tasks/serve.ts index 852eda4cd699..f6b389a974ef 100644 --- a/packages/@angular/cli/tasks/serve.ts +++ b/packages/@angular/cli/tasks/serve.ts @@ -108,12 +108,12 @@ export default Task.extend({ if (serveTaskOptions.liveReload) { // This allows for live reload of page when changes are made to repo. - // https://webpack.github.io/docs/webpack-dev-server.html#inline-mode + // https://webpack.js.org/configuration/dev-server/#devserver-inline let entryPoints = [ `webpack-dev-server/client?${clientAddress}` ]; if (serveTaskOptions.hmr) { - const webpackHmrLink = 'https://webpack.github.io/docs/hot-module-replacement.html'; + const webpackHmrLink = 'https://webpack.js.org/guides/hot-module-replacement'; ui.writeLine(oneLine` ${yellow('NOTICE')} Hot Module Replacement (HMR) is enabled for the dev server. From f776d3cf7982b64734c57fe4407434e9f4ec09f7 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 2 Jan 2018 16:49:27 +0000 Subject: [PATCH 075/115] ci: fix Invalid string length for process buffer on circleci --- tests/e2e/setup/100-global-cli.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/e2e/setup/100-global-cli.ts b/tests/e2e/setup/100-global-cli.ts index 5f3bc897c7a1..0db3b19c3780 100644 --- a/tests/e2e/setup/100-global-cli.ts +++ b/tests/e2e/setup/100-global-cli.ts @@ -13,7 +13,9 @@ export default function () { } // Install global Angular CLI. - return silentNpm('install', '-g', packages['@angular/cli'].tar); + // --unsafe-perm is needed for circleci + // because of https://github.com/sass/node-sass/issues/2006 + return silentNpm('install', '-g', packages['@angular/cli'].tar, '--unsafe-perm'); }) .then(() => exec(process.platform.startsWith('win') ? 'where' : 'which', 'ng')); } From 265eb96c091fde5c0340532f1c45758c121a65fd Mon Sep 17 00:00:00 2001 From: Aniruddha Das Date: Sun, 5 Nov 2017 01:54:16 -0500 Subject: [PATCH 076/115] feat(@angular/cli): override suite in the protractor config resolves: 807 Override suite in the protractor config. Can send in multiple suite by comma seperated values (ng e2e --suite=suite1.ts, suite2.ts). Issue link github.com/angular/angular-cli/issues/807 github.com/angular/angular-cli/pull/3551 --- docs/documentation/e2e.md | 10 ++++++++++ packages/@angular/cli/commands/e2e.ts | 10 ++++++++++ packages/@angular/cli/tasks/e2e.ts | 4 ++++ tests/e2e/tests/basic/e2e.ts | 21 ++++++++++++++++++--- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/docs/documentation/e2e.md b/docs/documentation/e2e.md index e818d91c1c0c..ebfaf64e8d96 100644 --- a/docs/documentation/e2e.md +++ b/docs/documentation/e2e.md @@ -60,6 +60,16 @@ Please note that options that are supported by `ng serve` are also supported by

+
+ suite +

+ --suite (aliases: -su) +

+

+ Override suite in the protractor config. Can send in multiple suite by comma separated values (ng e2e --suite=suiteA,suiteB). +

+
+
webdriver-update

diff --git a/packages/@angular/cli/commands/e2e.ts b/packages/@angular/cli/commands/e2e.ts index fc6d084816a8..3f23ee27a26d 100644 --- a/packages/@angular/cli/commands/e2e.ts +++ b/packages/@angular/cli/commands/e2e.ts @@ -13,6 +13,7 @@ export interface E2eTaskOptions extends ServeTaskOptions { serve: boolean; webdriverUpdate: boolean; specs: string[]; + suite: string; elementExplorer: boolean; } @@ -42,6 +43,15 @@ const E2eCommand = Command.extend({ Can send in multiple specs by repeating flag (ng e2e --specs=spec1.ts --specs=spec2.ts). ` }, + { + name: 'suite', + type: String, + aliases: ['su'], + description: oneLine` + Override suite in the protractor config. + Can send in multiple suite by comma separated values (ng e2e --suite=suiteA,suiteB). + ` + }, { name: 'element-explorer', type: Boolean, diff --git a/packages/@angular/cli/tasks/e2e.ts b/packages/@angular/cli/tasks/e2e.ts index 40228aafeb83..f73ab5a0d36e 100644 --- a/packages/@angular/cli/tasks/e2e.ts +++ b/packages/@angular/cli/tasks/e2e.ts @@ -59,6 +59,10 @@ export const E2eTask = Task.extend({ additionalProtractorConfig['specs'] = e2eTaskOptions.specs; } + if (e2eTaskOptions.suite && e2eTaskOptions.suite.length !== 0) { + additionalProtractorConfig['suite'] = e2eTaskOptions.suite; + } + if (e2eTaskOptions.webdriverUpdate) { // The webdriver-manager update command can only be accessed via a deep import. const webdriverDeepImport = 'webdriver-manager/built/lib/cmds/update'; diff --git a/tests/e2e/tests/basic/e2e.ts b/tests/e2e/tests/basic/e2e.ts index 5fad3dc36b9f..6558deb50909 100644 --- a/tests/e2e/tests/basic/e2e.ts +++ b/tests/e2e/tests/basic/e2e.ts @@ -4,9 +4,9 @@ import { execAndWaitForOutputToMatch, killAllProcesses } from '../../utils/process'; -import { updateJsonFile } from '../../utils/project'; -import { expectToFail } from '../../utils/utils'; -import { moveFile, copyFile } from '../../utils/fs'; +import {updateJsonFile} from '../../utils/project'; +import {expectToFail} from '../../utils/utils'; +import {moveFile, copyFile, replaceInFile} from '../../utils/fs'; export default function () { @@ -34,6 +34,21 @@ export default function () { .then(() => copyFile('./e2e/renamed-app.e2e-spec.ts', './e2e/another-app.e2e-spec.ts')) .then(() => ng('e2e', '--specs', './e2e/renamed-app.e2e-spec.ts', '--specs', './e2e/another-app.e2e-spec.ts')) + // Suites block need to be added in the protractor.conf.js file to test suites + .then(() => replaceInFile('protractor.conf.js', `allScriptsTimeout: 11000,`, + `allScriptsTimeout: 11000, + suites: { + app: './e2e/app.e2e-spec.ts' + }, + `)) + .then(() => ng('e2e', '--suite=app')) + // remove suites block from protractor.conf.js file after testing suites + .then(() => replaceInFile('protractor.conf.js', `allScriptsTimeout: 11000, + suites: { + app: './e2e/app.e2e-spec.ts' + }, + `, `allScriptsTimeout: 11000,` + )) // Should start up Element Explorer .then(() => execAndWaitForOutputToMatch('ng', ['e2e', '--element-explorer'], /Element Explorer/)) From e5e7234b32cf46a9dfb914f9e678c040ef7deae2 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 3 Jan 2018 12:37:12 +0000 Subject: [PATCH 077/115] ci: run ng2/ng4/nightly in circleci like in travis --- .circleci/config.yml | 81 +++++++++++--------------------------------- 1 file changed, 20 insertions(+), 61 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2f189ca47d4a..87aefdbfa866 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,7 +48,7 @@ jobs: <<: *restore_cache_defaults - run: npm run test -# E2E test for current Angular. + # E2E test for current Angular. e2e-setup: <<: *defaults steps: @@ -110,67 +110,30 @@ jobs: - run: cp -r /workspace/dist/ ./ - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=3 --nosilent -# E2E test for Angular nightly. - e2e-setup-nightly: + # Master only E2E. + ng2-e2e: <<: *defaults steps: - checkout - restore_cache: <<: *restore_cache_defaults - - run: mkdir /workspace - - run: mkdir /workspace/angular-cli-e2e-nightly - # Ignore all tests, we just want the setup step to persist it to the workspace. - - run: node tests/run_e2e.js --tmpdir=/workspace/angular-cli-e2e-nightly --ignore=**/* --nightly - - run: mv dist /workspace/ - - persist_to_workspace: - root: /workspace - paths: - - dist/ - - angular-cli-e2e-nightly/ + - run: xvfb-run -a node tests/run_e2e.js --ng2 "--glob=tests/build/**" - e2e-0-nightly: + ng4-e2e: <<: *defaults steps: - checkout - restore_cache: <<: *restore_cache_defaults - - attach_workspace: - <<: *attach_workspace_defaults - - run: cp -r /workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/workspace/angular-cli-e2e-nightly/test-project --nb-shards=4 --shard=0 --nosilent --nightly + - run: xvfb-run -a node tests/run_e2e.js --ng4 "--glob=tests/build/**" - e2e-1-nightly: + nightly-e2e: <<: *defaults steps: - checkout - restore_cache: <<: *restore_cache_defaults - - attach_workspace: - <<: *attach_workspace_defaults - - run: cp -r /workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/workspace/angular-cli-e2e-nightly/test-project --nb-shards=4 --shard=1 --nosilent --nightly - - e2e-2-nightly: - <<: *defaults - steps: - - checkout - - restore_cache: - <<: *restore_cache_defaults - - attach_workspace: - <<: *attach_workspace_defaults - - run: cp -r /workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/workspace/angular-cli-e2e-nightly/test-project --nb-shards=4 --shard=2 --nosilent --nightly - - e2e-3-nightly: - <<: *defaults - steps: - - checkout - - restore_cache: - <<: *restore_cache_defaults - - attach_workspace: - <<: *attach_workspace_defaults - - run: cp -r /workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/workspace/angular-cli-e2e-nightly/test-project --nb-shards=4 --shard=3 --nosilent --nightly + - run: xvfb-run -a node tests/run_e2e.js --nightly "--glob=tests/build/**" workflows: version: 2 @@ -199,23 +162,19 @@ workflows: - e2e-3: requires: - e2e-setup - # E2E test for Angular nightly. - - e2e-setup-nightly: - requires: - - build + # Master only E2E. + - ng2-e2e: + filters: + branches: + only: + - master + - ng4-e2e: + filters: + branches: + only: + - master + - nightly-e2e: filters: branches: only: - master - - e2e-0-nightly: - requires: - - e2e-setup-nightly - - e2e-1-nightly: - requires: - - e2e-setup-nightly - - e2e-2-nightly: - requires: - - e2e-setup-nightly - - e2e-3-nightly: - requires: - - e2e-setup-nightly From b1558f25127b3ac8e3253240efc5752caa5cccbe Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 3 Jan 2018 12:44:46 +0000 Subject: [PATCH 078/115] fix(@ngtools/webpack): update engine to node 6.9 minumum Fix #6608 --- packages/@ngtools/webpack/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 3bc90d05ae29..23b0d9b7d130 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -21,7 +21,7 @@ }, "homepage": "https://github.com/angular/angular-cli/tree/master/packages/@ngtools/webpack", "engines": { - "node": ">= 4.1.0", + "node": ">= 6.9.0", "npm": ">= 3.0.0" }, "dependencies": { From d53f45896ba641a98601ca87551c577f47659cd3 Mon Sep 17 00:00:00 2001 From: tomastrajan Date: Tue, 5 Dec 2017 17:27:39 +1100 Subject: [PATCH 079/115] feat(@angular/cli): add trailing slash to deployUrl when missing Closes #7295 --- packages/@angular/cli/commands/build.ts | 5 +++++ tests/e2e/tests/build/deploy-url.ts | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index 401a2b28289c..2611e66b0527 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -239,6 +239,11 @@ const BuildCommand = Command.extend({ commandOptions.forceTsCommonjs = true; } + // Add trailing slash if missing to prevent https://github.com/angular/angular-cli/issues/7295 + if (commandOptions.deployUrl && commandOptions.deployUrl.substr(-1) !== '/') { + commandOptions.deployUrl += '/'; + } + const BuildTask = require('../tasks/build').default; const buildTask = new BuildTask({ diff --git a/tests/e2e/tests/build/deploy-url.ts b/tests/e2e/tests/build/deploy-url.ts index 43293efbdb32..36acdcfdda98 100644 --- a/tests/e2e/tests/build/deploy-url.ts +++ b/tests/e2e/tests/build/deploy-url.ts @@ -2,6 +2,7 @@ import { ng } from '../../utils/process'; import { copyProjectAsset } from '../../utils/assets'; import { expectFileToMatch, writeMultipleFiles } from '../../utils/fs'; import { updateJsonFile } from '../../utils/project'; +import { getGlobalVariable } from '../../utils/env'; export default function () { @@ -27,5 +28,13 @@ export default function () { // verify --deploy-url is applied to non-extracted css urls .then(() => ng('build', '--deploy-url=deployUrl/', '--extract-css=false')) .then(() => expectFileToMatch('dist/styles.bundle.js', - /__webpack_require__.p \+ \"more\.[0-9a-f]{20}\.png\"/)); + /__webpack_require__.p \+ \"more\.[0-9a-f]{20}\.png\"/)) + .then(() => expectFileToMatch('dist/inline.bundle.js', + /__webpack_require__\.p = "deployUrl\/";/)) + // verify slash is appended to the end of --deploy-url if missing + .then(() => ng('build', '--deploy-url=deployUrl', '--extract-css=false')) + // skip this in ejected tests + .then(() => getGlobalVariable('argv').eject + ? Promise.resolve() + : expectFileToMatch('dist/inline.bundle.js', /__webpack_require__\.p = "deployUrl\/";/)); } From 1c78ff1d2fbde2763c76d4e03b5fe26ee230dc8f Mon Sep 17 00:00:00 2001 From: Clemens Himmer Date: Wed, 3 Jan 2018 16:40:57 +0100 Subject: [PATCH 080/115] fix(@angular/cli): license plugin config --- packages/@angular/cli/tasks/eject.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index c7a920d76512..5e8114fda92f 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -155,7 +155,7 @@ class JsonWebpackSerializer { } private _licenseWebpackPlugin(plugin: any) { - return plugin.options; + return this._licenseReplacer(plugin.options); } private _uglifyjsPlugin(plugin: any) { @@ -395,6 +395,13 @@ class JsonWebpackSerializer { }); } + private _licenseReplacer(value: any) { + return Object.assign({}, value, { + outputTemplate: this._relativePath( + 'process.cwd()', path.relative(this._root, value.outputTemplate)) + }); + } + private _replacer(_key: string, value: any) { if (value === undefined) { return value; From 0b890e451be36dc93f2451600e7d9cfc863790bf Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 3 Jan 2018 10:17:36 -0500 Subject: [PATCH 081/115] fix(@angular/cli): ensure stylesheet relative tilde path conversion --- package-lock.json | 32 ++++++++++++------- package.json | 2 +- .../cli/models/webpack-configs/styles.ts | 21 ++++++++---- packages/@angular/cli/package.json | 2 +- tests/e2e/tests/build/styles/inline-urls.ts | 2 +- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c78442c6a03..9de6fd647837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6664,12 +6664,12 @@ } }, "postcss-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.10.tgz", + "integrity": "sha512-xQaDcEgJ/2JqFY18zpFkik8vyYs7oS5ZRbrjvDqkP97k2wYWfPT4+qA0m4o3pTSCsz0u26PNqs8ZO9FRUWAqrA==", "requires": { "loader-utils": "1.1.0", - "postcss": "6.0.14", + "postcss": "6.0.15", "postcss-load-config": "1.2.0", "schema-utils": "0.3.0" }, @@ -6690,6 +6690,16 @@ "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", "supports-color": "4.5.0" + }, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } } }, "has-flag": { @@ -6698,13 +6708,13 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "postcss": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", - "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", + "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", "requires": { "chalk": "2.3.0", "source-map": "0.6.1", - "supports-color": "4.5.0" + "supports-color": "5.1.0" } }, "source-map": { @@ -6713,9 +6723,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", "requires": { "has-flag": "2.0.0" } diff --git a/package.json b/package.json index 517f55555c3f..f351f5760750 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "opn": "~5.1.0", "portfinder": "~1.0.12", "postcss-custom-properties": "^6.1.0", - "postcss-loader": "^2.0.8", + "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", "raw-loader": "^0.5.1", "resolve": "^1.1.7", diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index de830c0187f2..58cdff7cbe08 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -29,6 +29,12 @@ const customProperties = require('postcss-custom-properties'); * require('sass-loader') */ +interface PostcssUrlAsset { + url: string; + hash: string; + absolutePath: string; +} + export function getStylesConfig(wco: WebpackConfigOptions) { const { projectRoot, buildOptions, appConfig } = wco; @@ -44,17 +50,20 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const baseHref = wco.buildOptions.baseHref || ''; const deployUrl = wco.buildOptions.deployUrl || ''; - const postcssPluginCreator = function() { + const postcssPluginCreator = function(loader: webpack.loader.LoaderContext) { return [ postcssUrl({ - filter: ({ url }: { url: string }) => url.startsWith('~'), - url: ({ url }: { url: string }) => path.join(projectRoot, 'node_modules', url.substr(1)), + filter: ({ url }: PostcssUrlAsset) => url.startsWith('~'), + url: ({ url }: PostcssUrlAsset) => { + const fullPath = path.join(projectRoot, 'node_modules', url.substr(1)); + return path.relative(loader.context, fullPath).replace(/\\/g, '/'); + } }), postcssUrl([ { // Only convert root relative URLs, which CSS-Loader won't process into require(). - filter: ({ url }: { url: string }) => url.startsWith('/') && !url.startsWith('//'), - url: ({ url }: { url: string }) => { + filter: ({ url }: PostcssUrlAsset) => url.startsWith('/') && !url.startsWith('//'), + url: ({ url }: PostcssUrlAsset) => { if (deployUrl.match(/:\/\//) || deployUrl.startsWith('/')) { // If deployUrl is absolute or root relative, ignore baseHref & use deployUrl as is. return `${deployUrl.replace(/\/$/, '')}${url}`; @@ -71,7 +80,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { }, { // TODO: inline .cur if not supporting IE (use browserslist to check) - filter: (asset: any) => !asset.hash && !asset.absolutePath.endsWith('.cur'), + filter: (asset: PostcssUrlAsset) => !asset.hash && !asset.absolutePath.endsWith('.cur'), url: 'inline', // NOTE: maxSize is in KB maxSize: 10 diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 07074bce7a12..70cb694eac85 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -61,7 +61,7 @@ "opn": "~5.1.0", "portfinder": "~1.0.12", "postcss-custom-properties": "^6.1.0", - "postcss-loader": "^2.0.8", + "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", "raw-loader": "^0.5.1", "resolve": "^1.1.7", diff --git a/tests/e2e/tests/build/styles/inline-urls.ts b/tests/e2e/tests/build/styles/inline-urls.ts index 310ca9ab53c2..7ba0936832d1 100644 --- a/tests/e2e/tests/build/styles/inline-urls.ts +++ b/tests/e2e/tests/build/styles/inline-urls.ts @@ -20,7 +20,7 @@ export default function () { .then(() => silentNpm('install', 'font-awesome@4.7.0')) .then(() => writeMultipleFiles({ 'src/styles.scss': ` - $fa-font-path: "~font-awesome/font"; + $fa-font-path: "~font-awesome/fonts"; @import "~font-awesome/scss/font-awesome"; h1 { background: url('./assets/large.png'); } h2 { background: url('./assets/small.svg'); } From f1bfb941ad2d46f05b90a02a3f85a475a6ce4520 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 4 Jan 2018 14:51:22 +0000 Subject: [PATCH 082/115] ci: fix workflow for optional builds --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 87aefdbfa866..c460fbb14fec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -164,16 +164,22 @@ workflows: - e2e-setup # Master only E2E. - ng2-e2e: + requires: + - build filters: branches: only: - master - ng4-e2e: + requires: + - build filters: branches: only: - master - nightly-e2e: + requires: + - build filters: branches: only: From f830a8d00737216e438968ec142d58dda5c2cca2 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 4 Jan 2018 08:09:10 -0500 Subject: [PATCH 083/115] refactor(@angular/cli): use postcss to process CSS imports --- package-lock.json | 77 +++++++++++++++++++ package.json | 1 + .../cli/models/webpack-configs/styles.ts | 33 +++++++- packages/@angular/cli/package.json | 1 + packages/@angular/cli/tasks/eject.ts | 1 + 5 files changed, 111 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9de6fd647837..dafb50f4c935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6634,6 +6634,75 @@ "uniqid": "4.1.1" } }, + "postcss-import": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", + "integrity": "sha1-qWLi34LTvFptpqOGhBdHIE9B71s=", + "requires": { + "postcss": "6.0.15", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "postcss": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.15.tgz", + "integrity": "sha512-v/SpyMzLbtkmh45zUdaqLAaqXqzPdSrw8p4cQVO0/w6YiYfpj4k+Wkzhn68qk9br+H+0qfddhdPEVnbmBPfXVQ==", + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "5.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, "postcss-load-config": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", @@ -7318,6 +7387,14 @@ "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "2.3.0" + } + }, "read-installed": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", diff --git a/package.json b/package.json index f351f5760750..f7afb60a709a 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "opn": "~5.1.0", "portfinder": "~1.0.12", "postcss-custom-properties": "^6.1.0", + "postcss-import": "^11.0.0", "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", "raw-loader": "^0.5.1", diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 58cdff7cbe08..b1547bdcf500 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -12,6 +12,7 @@ const postcssUrl = require('postcss-url'); const autoprefixer = require('autoprefixer'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const customProperties = require('postcss-custom-properties'); +const postcssImports = require('postcss-import'); /** * Enumerate loaders and their dependencies from this file to let the dependency validator @@ -52,6 +53,33 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const postcssPluginCreator = function(loader: webpack.loader.LoaderContext) { return [ + postcssImports({ + resolve: (url: string, context: string) => { + return new Promise((resolve, reject) => { + loader.resolve(context, url, (err: Error, result: string) => { + if (err) { + reject(err); + return; + } + + resolve(result); + }); + }); + }, + load: (filename: string) => { + return new Promise((resolve, reject) => { + loader.fs.readFile(filename, (err: Error, data: Buffer) => { + if (err) { + reject(err); + return; + } + + const content = data.toString(); + resolve(content); + }); + }); + } + }), postcssUrl({ filter: ({ url }: PostcssUrlAsset) => url.startsWith('~'), url: ({ url }: PostcssUrlAsset) => { @@ -94,7 +122,8 @@ export function getStylesConfig(wco: WebpackConfigOptions) { variableImports: { 'autoprefixer': 'autoprefixer', 'postcss-url': 'postcssUrl', - 'postcss-custom-properties': 'customProperties' + 'postcss-custom-properties': 'customProperties', + 'postcss-import': 'postcssImports', }, variables: { minimizeCss, baseHref, deployUrl, projectRoot } }; @@ -167,7 +196,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { loader: 'css-loader', options: { sourceMap: cssSourceMap, - importLoaders: 1, + import: false, } }, { diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 70cb694eac85..26cc5eb3e5ef 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -61,6 +61,7 @@ "opn": "~5.1.0", "portfinder": "~1.0.12", "postcss-custom-properties": "^6.1.0", + "postcss-import": "^11.0.0", "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", "raw-loader": "^0.5.1", diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index 5e8114fda92f..bd475f3bd0bf 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -579,6 +579,7 @@ export default Task.extend({ 'json-loader', 'karma-sourcemap-loader', 'less-loader', + 'postcss-import', 'postcss-loader', 'postcss-url', 'raw-loader', From 9b85c07c0b8bb89d7938a61c058f23a2901a1ba9 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 5 Jan 2018 17:03:01 +0100 Subject: [PATCH 084/115] fix(@ngtools/webpack): remove message handler on main process Move the listening to messages from the type_checker.ts to a seperate type_checker_worker.ts file. Only start listening to messages when a magic 'auto start' argument is present in in the argument list, preventing undesired eaves dropping on other processes. Also rename type_checker.ts -> type_checker_messages.ts, as it now contains only the messages. --- .../webpack/src/angular_compiler_plugin.ts | 13 +++-- packages/@ngtools/webpack/src/type_checker.ts | 51 ++++-------------- .../webpack/src/type_checker_bootstrap.js | 2 +- .../webpack/src/type_checker_worker.ts | 53 +++++++++++++++++++ 4 files changed, 73 insertions(+), 46 deletions(-) create mode 100644 packages/@ngtools/webpack/src/type_checker_worker.ts diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 9629dcc11c14..0969344a2f5c 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -27,7 +27,7 @@ import { replaceResources, } from './transformers'; import { time, timeEnd } from './benchmark'; -import { InitMessage, UpdateMessage } from './type_checker'; +import { InitMessage, UpdateMessage, AUTO_START_ARG } from './type_checker'; import { gatherDiagnostics, hasErrors } from './gather_diagnostics'; import { CompilerCliIsSupported, @@ -466,7 +466,7 @@ export class AngularCompilerPlugin implements Tapable { const g: any = global; const typeCheckerFile: string = g['angularCliIsLocal'] ? './type_checker_bootstrap.js' - : './type_checker.js'; + : './type_checker_worker.js'; const debugArgRegex = /--inspect(?:-brk|-port)?|--debug(?:-brk|-port)/; @@ -475,10 +475,15 @@ export class AngularCompilerPlugin implements Tapable { // Workaround for https://github.com/nodejs/node/issues/9435 return !debugArgRegex.test(arg); }); - + // Signal the process to start listening for messages + // Solves https://github.com/angular/angular-cli/issues/9071 + const forkArgs = [AUTO_START_ARG]; const forkOptions: ForkOptions = { execArgv }; - this._typeCheckerProcess = fork(path.resolve(__dirname, typeCheckerFile), [], forkOptions); + this._typeCheckerProcess = fork( + path.resolve(__dirname, typeCheckerFile), + forkArgs, + forkOptions); this._typeCheckerProcess.send(new InitMessage(this._compilerOptions, this._basePath, this._JitMode, this._rootNames)); diff --git a/packages/@ngtools/webpack/src/type_checker.ts b/packages/@ngtools/webpack/src/type_checker.ts index e17f363b78ff..e14b8a55b88b 100644 --- a/packages/@ngtools/webpack/src/type_checker.ts +++ b/packages/@ngtools/webpack/src/type_checker.ts @@ -1,11 +1,6 @@ // @ignoreDep typescript -import * as process from 'process'; import * as ts from 'typescript'; import chalk from 'chalk'; - -import { WebpackCompilerHost } from './compiler_host'; -import { time, timeEnd } from './benchmark'; -import { CancellationToken, gatherDiagnostics } from './gather_diagnostics'; import { Program, CompilerOptions, @@ -14,12 +9,19 @@ import { createCompilerHost, formatDiagnostics, } from './ngtools_api'; +import { WebpackCompilerHost } from './compiler_host'; +import { time, timeEnd } from './benchmark'; +import { CancellationToken, gatherDiagnostics } from './gather_diagnostics'; + + +// This file should run in a child process with the AUTO_START_ARG argument // Force basic color support on terminals with no color support. // Chalk typings don't have the correct constructor parameters. const chalkCtx = new (chalk.constructor as any)(chalk.supportsColor ? {} : { level: 1 }); const { bold, red, yellow } = chalkCtx; + export enum MESSAGE_KIND { Init, Update @@ -46,43 +48,9 @@ export class UpdateMessage extends TypeCheckerMessage { } } -let typeChecker: TypeChecker; -let lastCancellationToken: CancellationToken; - -process.on('message', (message: TypeCheckerMessage) => { - time('TypeChecker.message'); - switch (message.kind) { - case MESSAGE_KIND.Init: - const initMessage = message as InitMessage; - typeChecker = new TypeChecker( - initMessage.compilerOptions, - initMessage.basePath, - initMessage.jitMode, - initMessage.rootNames, - ); - break; - case MESSAGE_KIND.Update: - if (!typeChecker) { - throw new Error('TypeChecker: update message received before initialization'); - } - if (lastCancellationToken) { - // This cancellation token doesn't seem to do much, messages don't seem to be processed - // before the diagnostics finish. - lastCancellationToken.requestCancellation(); - } - const updateMessage = message as UpdateMessage; - lastCancellationToken = new CancellationToken(); - typeChecker.update(updateMessage.rootNames, updateMessage.changedCompilationFiles, - lastCancellationToken); - break; - default: - throw new Error(`TypeChecker: Unexpected message received: ${message}.`); - } - timeEnd('TypeChecker.message'); -}); - +export const AUTO_START_ARG = '9d93e901-158a-4cf9-ba1b-2f0582ffcfeb'; -class TypeChecker { +export class TypeChecker { private _program: ts.Program | Program; private _compilerHost: WebpackCompilerHost & CompilerHost; @@ -171,3 +139,4 @@ class TypeChecker { this._diagnose(cancellationToken); } } + diff --git a/packages/@ngtools/webpack/src/type_checker_bootstrap.js b/packages/@ngtools/webpack/src/type_checker_bootstrap.js index e5a3ab002ecc..9326a42d9b4f 100644 --- a/packages/@ngtools/webpack/src/type_checker_bootstrap.js +++ b/packages/@ngtools/webpack/src/type_checker_bootstrap.js @@ -1,2 +1,2 @@ require('../../../../lib/bootstrap-local'); -require('./type_checker.ts'); +require('./type_checker_worker.ts'); diff --git a/packages/@ngtools/webpack/src/type_checker_worker.ts b/packages/@ngtools/webpack/src/type_checker_worker.ts new file mode 100644 index 000000000000..ce1cafba57cb --- /dev/null +++ b/packages/@ngtools/webpack/src/type_checker_worker.ts @@ -0,0 +1,53 @@ +import * as process from 'process'; + +import { time, timeEnd } from './benchmark'; +import { CancellationToken } from './gather_diagnostics'; + +import { + AUTO_START_ARG, + TypeCheckerMessage, + InitMessage, + MESSAGE_KIND, + UpdateMessage, + TypeChecker +} from './type_checker'; + +let typeChecker: TypeChecker; +let lastCancellationToken: CancellationToken; + +// only listen to messages if started from the AngularCompilerPlugin +if (process.argv.indexOf(AUTO_START_ARG) >= 0) { + process.on('message', (message: TypeCheckerMessage) => { + time('TypeChecker.message'); + switch (message.kind) { + case MESSAGE_KIND.Init: + const initMessage = message as InitMessage; + typeChecker = new TypeChecker( + initMessage.compilerOptions, + initMessage.basePath, + initMessage.jitMode, + initMessage.rootNames, + ); + break; + case MESSAGE_KIND.Update: + if (!typeChecker) { + throw new Error('TypeChecker: update message received before initialization'); + } + if (lastCancellationToken) { + // This cancellation token doesn't seem to do much, messages don't seem to be processed + // before the diagnostics finish. + lastCancellationToken.requestCancellation(); + } + const updateMessage = message as UpdateMessage; + lastCancellationToken = new CancellationToken(); + typeChecker.update(updateMessage.rootNames, updateMessage.changedCompilationFiles, + lastCancellationToken); + break; + default: + throw new Error(`TypeChecker: Unexpected message received: ${message}.`); + } + timeEnd('TypeChecker.message'); + }); +} + + From aa90e4241f190084f3d6fd97411599368f7f6970 Mon Sep 17 00:00:00 2001 From: FrozenPandaz Date: Wed, 20 Dec 2017 14:47:51 -0500 Subject: [PATCH 085/115] feat(@ngtools/webpack): replace bootstrap code for server apps --- .../webpack/src/angular_compiler_plugin.ts | 5 +- .../webpack/src/transformers/index.ts | 1 + .../replace_server_bootstrap.spec.ts | 215 ++++++++++++++++++ .../transformers/replace_server_bootstrap.ts | 135 +++++++++++ .../app/app.component.html | 5 + .../app/app.component.scss | 3 + .../test-server-app-ng5/app/app.component.ts | 15 ++ .../test-server-app-ng5/app/app.module.ts | 36 +++ .../app/feature/feature.module.ts | 20 ++ .../app/feature/lazy-feature.module.ts | 23 ++ .../test-server-app-ng5/app/injectable.ts | 8 + .../test-server-app-ng5/app/lazy.module.ts | 26 +++ .../test-server-app-ng5/app/main.commonjs.ts | 1 + .../webpack/test-server-app-ng5/app/main.ts | 12 + .../webpack/test-server-app-ng5/index.html | 12 + .../webpack/test-server-app-ng5/index.js | 12 + .../webpack/test-server-app-ng5/package.json | 28 +++ .../webpack/test-server-app-ng5/tsconfig.json | 24 ++ .../test-server-app-ng5/webpack.config.js | 32 +++ .../e2e/tests/packages/webpack/server-ng5.ts | 23 ++ 20 files changed, 635 insertions(+), 1 deletion(-) create mode 100644 packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.spec.ts create mode 100644 packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.html create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.scss create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/app.module.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/feature/feature.module.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/feature/lazy-feature.module.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/injectable.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/lazy.module.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/main.commonjs.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/app/main.ts create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/index.html create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/index.js create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/package.json create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/tsconfig.json create mode 100644 tests/e2e/assets/webpack/test-server-app-ng5/webpack.config.js create mode 100644 tests/e2e/tests/packages/webpack/server-ng5.ts diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 0969344a2f5c..326ef8b98044 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -19,6 +19,7 @@ import { import { resolveEntryModuleFromMain } from './entry_resolver'; import { replaceBootstrap, + replaceServerBootstrap, exportNgFactory, exportLazyModuleMap, removeDecorators, @@ -697,7 +698,9 @@ export class AngularCompilerPlugin implements Tapable { } else if (this._platform === PLATFORM.Server) { this._transformers.push(exportLazyModuleMap(isMainPath, getLazyRoutes)); if (!this._JitMode) { - this._transformers.push(exportNgFactory(isMainPath, getEntryModule)); + this._transformers.push( + exportNgFactory(isMainPath, getEntryModule), + replaceServerBootstrap(isMainPath, getEntryModule, getTypeChecker)); } } } diff --git a/packages/@ngtools/webpack/src/transformers/index.ts b/packages/@ngtools/webpack/src/transformers/index.ts index 4ee76368978c..e523cc7782e8 100644 --- a/packages/@ngtools/webpack/src/transformers/index.ts +++ b/packages/@ngtools/webpack/src/transformers/index.ts @@ -4,6 +4,7 @@ export * from './make_transform'; export * from './insert_import'; export * from './elide_imports'; export * from './replace_bootstrap'; +export * from './replace_server_bootstrap'; export * from './export_ngfactory'; export * from './export_lazy_module_map'; export * from './register_locale_data'; diff --git a/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.spec.ts b/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.spec.ts new file mode 100644 index 000000000000..5ca49b0e2ab3 --- /dev/null +++ b/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.spec.ts @@ -0,0 +1,215 @@ +import { oneLine, stripIndent } from 'common-tags'; +import { createTypescriptContext, transformTypescript } from './ast_helpers'; +import { replaceServerBootstrap } from './replace_server_bootstrap'; + +describe('@ngtools/webpack transformers', () => { + describe('replace_server_bootstrap', () => { + it('should replace bootstrap', () => { + const input = stripIndent` + import { enableProdMode } from '@angular/core'; + import { platformDynamicServer } from '@angular/platform-server'; + + import { AppModule } from './app/app.module'; + import { environment } from './environments/environment'; + + if (environment.production) { + enableProdMode(); + } + + platformDynamicServer().bootstrapModule(AppModule); + `; + + // tslint:disable:max-line-length + const output = stripIndent` + import { enableProdMode } from '@angular/core'; + import { environment } from './environments/environment'; + + import * as __NgCli_bootstrap_1 from "./app/app.module.ngfactory"; + import * as __NgCli_bootstrap_2 from "@angular/platform-server"; + + if (environment.production) { + enableProdMode(); + } + __NgCli_bootstrap_2.platformServer().bootstrapModuleFactory(__NgCli_bootstrap_1.AppModuleNgFactory); + `; + // tslint:enable:max-line-length + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = replaceServerBootstrap( + () => true, + () => ({ path: '/project/src/app/app.module', className: 'AppModule' }), + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + + it('should replace renderModule', () => { + const input = stripIndent` + import { enableProdMode } from '@angular/core'; + import { renderModule } from '@angular/platform-server'; + + import { AppModule } from './app/app.module'; + import { environment } from './environments/environment'; + + if (environment.production) { + enableProdMode(); + } + + renderModule(AppModule, { + document: '', + url: '/' + }); + `; + + // tslint:disable:max-line-length + const output = stripIndent` + import { enableProdMode } from '@angular/core'; + import { environment } from './environments/environment'; + + import * as __NgCli_bootstrap_1 from "./app/app.module.ngfactory"; + import * as __NgCli_bootstrap_2 from "@angular/platform-server"; + + if (environment.production) { + enableProdMode(); + } + __NgCli_bootstrap_2.renderModuleFactory(__NgCli_bootstrap_1.AppModuleNgFactory, { + document: '', + url: '/' + }); + `; + // tslint:enable:max-line-length + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = replaceServerBootstrap( + () => true, + () => ({ path: '/project/src/app/app.module', className: 'AppModule' }), + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + + it('should replace when the module is used in a config object', () => { + const input = stripIndent` + import * as express from 'express'; + + import { enableProdMode } from '@angular/core'; + import { ngExpressEngine } from '@nguniversal/express-engine'; + + import { AppModule } from './app/app.module'; + import { environment } from './environments/environment'; + + if (environment.production) { + enableProdMode(); + } + + const server = express(); + server.engine('html', ngExpressEngine({ + bootstrap: AppModule + })); + `; + + // tslint:disable:max-line-length + const output = stripIndent` + import * as express from 'express'; + + import { enableProdMode } from '@angular/core'; + import { ngExpressEngine } from '@nguniversal/express-engine'; + + import { environment } from './environments/environment'; + + import * as __NgCli_bootstrap_1 from "./app/app.module.ngfactory"; + + if (environment.production) { + enableProdMode(); + } + + const server = express(); + server.engine('html', ngExpressEngine({ + bootstrap: __NgCli_bootstrap_1.AppModuleNgFactory + })); + `; + // tslint:enable:max-line-length + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = replaceServerBootstrap( + () => true, + () => ({ path: '/project/src/app/app.module', className: 'AppModule' }), + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + + it('should replace bootstrap when barrel files are used', () => { + const input = stripIndent` + import { enableProdMode } from '@angular/core'; + import { platformDynamicServer } from '@angular/platform-browser-dynamic'; + + import { AppModule } from './app'; + import { environment } from './environments/environment'; + + if (environment.production) { + enableProdMode(); + } + + platformDynamicServer().bootstrapModule(AppModule); + `; + + // tslint:disable:max-line-length + const output = stripIndent` + import { enableProdMode } from '@angular/core'; + import { environment } from './environments/environment'; + + import * as __NgCli_bootstrap_1 from "./app/app.module.ngfactory"; + import * as __NgCli_bootstrap_2 from "@angular/platform-server"; + + if (environment.production) { + enableProdMode(); + } + __NgCli_bootstrap_2.platformServer().bootstrapModuleFactory(__NgCli_bootstrap_1.AppModuleNgFactory); + `; + // tslint:enable:max-line-length + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = replaceServerBootstrap( + () => true, + () => ({ path: '/project/src/app/app.module', className: 'AppModule' }), + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + + it('should not replace bootstrap when there is no entry module', () => { + const input = stripIndent` + import { enableProdMode } from '@angular/core'; + import { platformDynamicServer } from '@angular/platform-browser-dynamic'; + + import { AppModule } from './app/app.module'; + import { environment } from './environments/environment'; + + if (environment.production) { + enableProdMode(); + } + + platformDynamicServer().bootstrapModule(AppModule); + `; + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = replaceServerBootstrap( + () => true, + () => undefined, + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${input}`); + }); + }); +}); diff --git a/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.ts b/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.ts new file mode 100644 index 000000000000..a38ee8982c26 --- /dev/null +++ b/packages/@ngtools/webpack/src/transformers/replace_server_bootstrap.ts @@ -0,0 +1,135 @@ +// @ignoreDep typescript +import * as ts from 'typescript'; +import { relative, dirname } from 'path'; + +import { collectDeepNodes } from './ast_helpers'; +import { insertStarImport } from './insert_import'; +import { StandardTransform, ReplaceNodeOperation, TransformOperation } from './interfaces'; +import { makeTransform } from './make_transform'; + +export function replaceServerBootstrap( + shouldTransform: (fileName: string) => boolean, + getEntryModule: () => { path: string, className: string }, + getTypeChecker: () => ts.TypeChecker, +): ts.TransformerFactory { + + const standardTransform: StandardTransform = function (sourceFile: ts.SourceFile) { + const ops: TransformOperation[] = []; + + const entryModule = getEntryModule(); + + if (!shouldTransform(sourceFile.fileName) || !entryModule) { + return ops; + } + + // Find all identifiers. + const entryModuleIdentifiers = collectDeepNodes(sourceFile, + ts.SyntaxKind.Identifier) + .filter(identifier => identifier.text === entryModule.className); + + if (entryModuleIdentifiers.length === 0) { + return []; + } + + const relativeEntryModulePath = relative(dirname(sourceFile.fileName), entryModule.path); + const normalizedEntryModulePath = `./${relativeEntryModulePath}`.replace(/\\/g, '/'); + const factoryClassName = entryModule.className + 'NgFactory'; + const factoryModulePath = normalizedEntryModulePath + '.ngfactory'; + + // Find the bootstrap calls. + entryModuleIdentifiers.forEach(entryModuleIdentifier => { + if (!entryModuleIdentifier.parent) { + return; + } + + if (entryModuleIdentifier.parent.kind !== ts.SyntaxKind.CallExpression && + entryModuleIdentifier.parent.kind !== ts.SyntaxKind.PropertyAssignment) { + return; + } + + if (entryModuleIdentifier.parent.kind === ts.SyntaxKind.CallExpression) { + // Figure out if it's a `platformDynamicServer().bootstrapModule(AppModule)` call. + + const callExpr = entryModuleIdentifier.parent as ts.CallExpression; + + if (callExpr.expression.kind === ts.SyntaxKind.PropertyAccessExpression) { + + const propAccessExpr = callExpr.expression as ts.PropertyAccessExpression; + + if (!(propAccessExpr.name.text === 'bootstrapModule' + && propAccessExpr.expression.kind === ts.SyntaxKind.CallExpression)) { + return; + } + + const bootstrapModuleIdentifier = propAccessExpr.name; + const innerCallExpr = propAccessExpr.expression as ts.CallExpression; + + if (!( + innerCallExpr.expression.kind === ts.SyntaxKind.Identifier + && (innerCallExpr.expression as ts.Identifier).text === 'platformDynamicServer' + )) { + return; + } + + const platformDynamicServerIdentifier = innerCallExpr.expression as ts.Identifier; + + const idPlatformServer = ts.createUniqueName('__NgCli_bootstrap_'); + const idNgFactory = ts.createUniqueName('__NgCli_bootstrap_'); + + // Add the transform operations. + ops.push( + // Replace the entry module import. + ...insertStarImport(sourceFile, idNgFactory, factoryModulePath), + new ReplaceNodeOperation(sourceFile, entryModuleIdentifier, + ts.createPropertyAccess(idNgFactory, ts.createIdentifier(factoryClassName))), + // Replace the platformBrowserDynamic import. + ...insertStarImport(sourceFile, idPlatformServer, '@angular/platform-server'), + new ReplaceNodeOperation(sourceFile, platformDynamicServerIdentifier, + ts.createPropertyAccess(idPlatformServer, 'platformServer')), + new ReplaceNodeOperation(sourceFile, bootstrapModuleIdentifier, + ts.createIdentifier('bootstrapModuleFactory')), + ); + } else if (callExpr.expression.kind === ts.SyntaxKind.Identifier) { + // Figure out if it is renderModule + + const identifierExpr = callExpr.expression as ts.Identifier; + + if (identifierExpr.text !== 'renderModule') { + return; + } + + const renderModuleIdentifier = identifierExpr as ts.Identifier; + + const idPlatformServer = ts.createUniqueName('__NgCli_bootstrap_'); + const idNgFactory = ts.createUniqueName('__NgCli_bootstrap_'); + + ops.push( + // Replace the entry module import. + ...insertStarImport(sourceFile, idNgFactory, factoryModulePath), + new ReplaceNodeOperation(sourceFile, entryModuleIdentifier, + ts.createPropertyAccess(idNgFactory, ts.createIdentifier(factoryClassName))), + // Replace the renderModule import. + ...insertStarImport(sourceFile, idPlatformServer, '@angular/platform-server'), + new ReplaceNodeOperation(sourceFile, renderModuleIdentifier, + ts.createPropertyAccess(idPlatformServer, 'renderModuleFactory')), + ); + } + } else if (entryModuleIdentifier.parent.kind === ts.SyntaxKind.PropertyAssignment) { + // This is for things that accept a module as a property in a config object + // .ie the express engine + + const idNgFactory = ts.createUniqueName('__NgCli_bootstrap_'); + + ops.push( + ...insertStarImport(sourceFile, idNgFactory, factoryModulePath), + new ReplaceNodeOperation(sourceFile, entryModuleIdentifier, + ts.createPropertyAccess(idNgFactory, ts.createIdentifier(factoryClassName))) + ); + } + }); + + return ops; + }; + + return makeTransform(standardTransform, getTypeChecker); +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.html b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.html new file mode 100644 index 000000000000..5a532db9308f --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.html @@ -0,0 +1,5 @@ +

+

hello world

+ lazy + +
diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.scss b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.scss new file mode 100644 index 000000000000..5cde7b922336 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.scss @@ -0,0 +1,3 @@ +:host { + background-color: blue; +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.ts new file mode 100644 index 000000000000..82a4059565d3 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.component.ts @@ -0,0 +1,15 @@ +import {Component, ViewEncapsulation} from '@angular/core'; +import {MyInjectable} from './injectable'; + + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class AppComponent { + constructor(public inj: MyInjectable) { + console.log(inj); + } +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/app.module.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.module.ts new file mode 100644 index 000000000000..7c8a0c296448 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/app.module.ts @@ -0,0 +1,36 @@ +import { NgModule, Component } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { MyInjectable } from './injectable'; + +@Component({ + selector: 'home-view', + template: 'home!' +}) +export class HomeView {} + + +@NgModule({ + declarations: [ + AppComponent, + HomeView + ], + imports: [ + BrowserModule.withServerTransition({ + appId: 'app' + }), + ServerModule, + RouterModule.forRoot([ + {path: 'lazy', loadChildren: './lazy.module#LazyModule'}, + {path: '', component: HomeView} + ]) + ], + providers: [MyInjectable], + bootstrap: [AppComponent] +}) +export class AppModule { + static testProp: string; +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/feature.module.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/feature.module.ts new file mode 100644 index 000000000000..f464ca028b05 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/feature.module.ts @@ -0,0 +1,20 @@ +import {NgModule, Component} from '@angular/core'; +import {RouterModule} from '@angular/router'; + +@Component({ + selector: 'feature-component', + template: 'foo.html' +}) +export class FeatureComponent {} + +@NgModule({ + declarations: [ + FeatureComponent + ], + imports: [ + RouterModule.forChild([ + { path: '', component: FeatureComponent} + ]) + ] +}) +export class FeatureModule {} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/lazy-feature.module.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/lazy-feature.module.ts new file mode 100644 index 000000000000..8fafca158b24 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/feature/lazy-feature.module.ts @@ -0,0 +1,23 @@ +import {NgModule, Component} from '@angular/core'; +import {RouterModule} from '@angular/router'; +import {HttpModule, Http} from '@angular/http'; + +@Component({ + selector: 'lazy-feature-comp', + template: 'lazy feature!' +}) +export class LazyFeatureComponent {} + +@NgModule({ + imports: [ + RouterModule.forChild([ + {path: '', component: LazyFeatureComponent, pathMatch: 'full'}, + {path: 'feature', loadChildren: './feature.module#FeatureModule'} + ]), + HttpModule + ], + declarations: [LazyFeatureComponent] +}) +export class LazyFeatureModule { + constructor(http: Http) {} +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/injectable.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/injectable.ts new file mode 100644 index 000000000000..b357678ae77a --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/injectable.ts @@ -0,0 +1,8 @@ +import {Injectable, Inject, ViewContainerRef} from '@angular/core'; +import {DOCUMENT} from '@angular/platform-browser'; + + +@Injectable() +export class MyInjectable { + constructor(@Inject(DOCUMENT) public doc) {} +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/lazy.module.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/lazy.module.ts new file mode 100644 index 000000000000..96da4de7515b --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/lazy.module.ts @@ -0,0 +1,26 @@ +import {NgModule, Component} from '@angular/core'; +import {RouterModule} from '@angular/router'; +import {HttpModule, Http} from '@angular/http'; + +@Component({ + selector: 'lazy-comp', + template: 'lazy!' +}) +export class LazyComponent {} + +@NgModule({ + imports: [ + RouterModule.forChild([ + {path: '', component: LazyComponent, pathMatch: 'full'}, + {path: 'feature', loadChildren: './feature/feature.module#FeatureModule'}, + {path: 'lazy-feature', loadChildren: './feature/lazy-feature.module#LazyFeatureModule'} + ]), + HttpModule + ], + declarations: [LazyComponent] +}) +export class LazyModule { + constructor(http: Http) {} +} + +export class SecondModule {} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/main.commonjs.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/main.commonjs.ts new file mode 100644 index 000000000000..ce26d93a11de --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/main.commonjs.ts @@ -0,0 +1 @@ +export { AppModule } from './app.module'; diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/app/main.ts b/tests/e2e/assets/webpack/test-server-app-ng5/app/main.ts new file mode 100644 index 000000000000..5d57aafca8ae --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/app/main.ts @@ -0,0 +1,12 @@ +import 'core-js/es7/reflect'; +import {platformDynamicServer, renderModule} from '@angular/platform-server'; +import {AppModule} from './app.module'; + +AppModule.testProp = 'testing'; + +platformDynamicServer().bootstrapModule(AppModule); + +renderModule(AppModule, { + document: '', + url: '/' +}); diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/index.html b/tests/e2e/assets/webpack/test-server-app-ng5/index.html new file mode 100644 index 000000000000..89fb0893c35d --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/index.html @@ -0,0 +1,12 @@ + + + + Document + + + + + + + + diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/index.js b/tests/e2e/assets/webpack/test-server-app-ng5/index.js new file mode 100644 index 000000000000..bdfb2e792acd --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/index.js @@ -0,0 +1,12 @@ +const fs = require('fs'); +const { AppModuleNgFactory } = require('./dist/app.main'); +const { renderModuleFactory } = require('@angular/platform-server'); + +require('zone.js/dist/zone-node'); + +renderModuleFactory(AppModuleNgFactory, { + url: '/', + document: '' +}).then(html => { + fs.writeFileSync('dist/index.html', html); +}) diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/package.json b/tests/e2e/assets/webpack/test-server-app-ng5/package.json new file mode 100644 index 000000000000..b499eaaa4e25 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/package.json @@ -0,0 +1,28 @@ +{ + "name": "test", + "license": "MIT", + "dependencies": { + "@angular/animations": "^5.0.0", + "@angular/common": "^5.0.0", + "@angular/compiler": "^5.0.0", + "@angular/compiler-cli": "^5.0.0", + "@angular/core": "^5.0.0", + "@angular/http": "^5.0.0", + "@angular/platform-browser": "^5.0.0", + "@angular/platform-browser-dynamic": "^5.0.0", + "@angular/platform-server": "^5.0.0", + "@angular/router": "^5.0.0", + "@ngtools/webpack": "0.0.0", + "core-js": "^2.4.1", + "rxjs": "^5.4.2", + "zone.js": "^0.8.14" + }, + "devDependencies": { + "node-sass": "^4.5.0", + "performance-now": "^0.2.0", + "raw-loader": "^0.5.1", + "sass-loader": "^6.0.3", + "typescript": "~2.5.0", + "webpack": "2.2.1" + } +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/tsconfig.json b/tests/e2e/assets/webpack/test-server-app-ng5/tsconfig.json new file mode 100644 index 000000000000..5822e780bfc7 --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "baseUrl": "", + "module": "es2015", + "moduleResolution": "node", + "target": "es5", + "noImplicitAny": false, + "sourceMap": true, + "mapRoot": "", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": [ + "es2017", + "dom" + ], + "outDir": "lib", + "skipLibCheck": true, + "rootDir": "." + }, + "angularCompilerOptions": { + "genDir": "./app/ngfactory", + "entryModule": "app/app.module#AppModule" + } +} diff --git a/tests/e2e/assets/webpack/test-server-app-ng5/webpack.config.js b/tests/e2e/assets/webpack/test-server-app-ng5/webpack.config.js new file mode 100644 index 000000000000..4764b17b23dc --- /dev/null +++ b/tests/e2e/assets/webpack/test-server-app-ng5/webpack.config.js @@ -0,0 +1,32 @@ +const { AngularCompilerPlugin, PLATFORM } = require('@ngtools/webpack'); + +module.exports = { + resolve: { + extensions: ['.ts', '.js'] + }, + target: 'web', + entry: './app/main.ts', + output: { + path: './dist', + publicPath: 'dist/', + filename: 'app.main.js' + }, + plugins: [ + new AngularCompilerPlugin({ + tsConfigPath: './tsconfig.json', + mainPath: './app/main.ts', + platform: PLATFORM.Server + }) + ], + module: { + loaders: [ + { test: /\.scss$/, loaders: ['raw-loader', 'sass-loader'] }, + { test: /\.css$/, loader: 'raw-loader' }, + { test: /\.html$/, loader: 'raw-loader' }, + { test: /\.ts$/, loader: '@ngtools/webpack' } + ] + }, + devServer: { + historyApiFallback: true + } +}; diff --git a/tests/e2e/tests/packages/webpack/server-ng5.ts b/tests/e2e/tests/packages/webpack/server-ng5.ts new file mode 100644 index 000000000000..021b984508d3 --- /dev/null +++ b/tests/e2e/tests/packages/webpack/server-ng5.ts @@ -0,0 +1,23 @@ +import { normalize } from 'path'; +import { createProjectFromAsset } from '../../../utils/assets'; +import { exec } from '../../../utils/process'; +import { expectFileToMatch, rimraf } from '../../../utils/fs'; + + +export default function (skipCleaning: () => void) { + return Promise.resolve() + .then(() => createProjectFromAsset('webpack/test-server-app')) + .then(() => exec(normalize('node_modules/.bin/webpack'))) + .then(() => expectFileToMatch('dist/app.main.js', + new RegExp('MyInjectable.ctorParameters = .*' + + 'type: undefined, decorators.*Inject.*args: .*DOCUMENT.*')) + .then(() => expectFileToMatch('dist/app.main.js', + new RegExp('AppComponent.ctorParameters = .*MyInjectable')) + .then(() => expectFileToMatch('dist/app.main.js', + /AppModule \*\/\].*\.testProp = \'testing\'/)) + .then(() => expectFileToMatch('dist/app.main.js', + /platformServer \*\/\]\)\(\)\.bootstrapModuleFactory\(.*\/\* AppModuleNgFactory \*\/\]/)) + .then(() => expectFileToMatch('dist/app.main.js', + /renderModuleFactory \*\/\].*\/\* AppModuleNgFactory \*\/\]/)) + .then(() => skipCleaning()); +} From 788c8f90813717fe42000fd4e45bd7946ae1b3f3 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Dec 2017 14:56:38 +0000 Subject: [PATCH 086/115] fix(@angular/cli): show only changed chunks on build For projects with a lot of lazy modules the rebuild messages can easily fill the whole console window. This PR shows only chunks that changed instead of showing all chunks. Before: ``` $ ng serve ** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ ** Date: 2017-12-14T14:56:13.707Z Hash: 7490b2942c48ffcf0f0f Time: 7317ms chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] [rendered] chunk {main} main.bundle.js (main) 725 kB [initial] [rendered] chunk {polyfills} polyfills.bundle.js (polyfills) 577 kB [initial] [rendered] chunk {styles} styles.bundle.js (styles) 35 kB [initial] [rendered] chunk {vendor} vendor.bundle.js (vendor) 6.45 MB [initial] [rendered] webpack: Compiled successfully. webpack: Compiling... Date: 2017-12-14T14:56:17.054Z Hash: dbb03cc0994e8bf69e76 Time: 310ms chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] chunk {main} main.bundle.js (main) 725 kB [initial] [rendered] chunk {polyfills} polyfills.bundle.js (polyfills) 577 kB [initial] chunk {styles} styles.bundle.js (styles) 35 kB [initial] chunk {vendor} vendor.bundle.js (vendor) 6.45 MB [initial] webpack: Compiled successfully. webpack: Compiling... Date: 2017-12-14T14:56:20.290Z Hash: fe53cbcd529dd2508cfc Time: 267ms chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] chunk {main} main.bundle.js (main) 725 kB [initial] chunk {polyfills} polyfills.bundle.js (polyfills) 577 kB [initial] [rendered] chunk {styles} styles.bundle.js (styles) 35 kB [initial] chunk {vendor} vendor.bundle.js (vendor) 6.45 MB [initial] webpack: Compiled successfully. ``` After: ``` $ ng serve ** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ ** Date: 2017-12-14T14:53:40.216Z Hash: 44065f5ec5c4c8cf884a Time: 7312ms chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] [rendered] chunk {main} main.bundle.js (main) 724 kB [initial] [rendered] chunk {polyfills} polyfills.bundle.js (polyfills) 576 kB [initial] [rendered] chunk {styles} styles.bundle.js (styles) 35 kB [initial] [rendered] chunk {vendor} vendor.bundle.js (vendor) 6.45 MB [initial] [rendered] webpack: Compiled successfully. webpack: Compiling... Date: 2017-12-14T14:53:42.089Z Hash: 492a7350b12ec1557b61 Time: 241ms chunk {main} main.bundle.js (main) 725 kB [initial] [rendered] 4 unchanged chunks webpack: Compiled successfully. webpack: Compiling... Date: 2017-12-14T14:53:49.762Z Hash: 7490b2942c48ffcf0f0f Time: 296ms chunk {polyfills} polyfills.bundle.js (polyfills) 577 kB [initial] [rendered] 4 unchanged chunks webpack: Compiled successfully. ``` Fix #8621 --- packages/@angular/cli/utilities/stats.ts | 28 ++++++++++++++++++------ tests/e2e/tests/basic/rebuild.ts | 10 ++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/@angular/cli/utilities/stats.ts b/packages/@angular/cli/utilities/stats.ts index be9001019aca..c58f4b0bcc17 100644 --- a/packages/@angular/cli/utilities/stats.ts +++ b/packages/@angular/cli/utilities/stats.ts @@ -26,11 +26,9 @@ export function statsToString(json: any, statsConfig: any) { const g = (x: string) => colors ? bold(green(x)) : x; const y = (x: string) => colors ? bold(yellow(x)) : x; - return rs(stripIndents` - Date: ${w(new Date().toISOString())} - Hash: ${w(json.hash)} - Time: ${w('' + json.time)}ms - ${json.chunks.map((chunk: any) => { + const changedChunksStats = json.chunks + .filter((chunk: any) => chunk.rendered) + .map((chunk: any) => { const asset = json.assets.filter((x: any) => x.name == chunk.files[0])[0]; const size = asset ? ` ${_formatSize(asset.size)}` : ''; const files = chunk.files.join(', '); @@ -41,8 +39,24 @@ export function statsToString(json: any, statsConfig: any) { .join(''); return `chunk {${y(chunk.id)}} ${g(files)}${names}${size} ${initial}${flags}`; - }).join('\n')} - `); + }); + + const unchangedChunkNumber = json.chunks.length - changedChunksStats.length; + + if (unchangedChunkNumber > 0) { + return rs(stripIndents` + Date: ${w(new Date().toISOString())} • Hash: ${w(json.hash)} • Time: ${w('' + json.time)}ms + ${unchangedChunkNumber} unchanged chunks + ${changedChunksStats.join('\n')} + `); + } else { + return rs(stripIndents` + Date: ${w(new Date().toISOString())} + Hash: ${w(json.hash)} + Time: ${w('' + json.time)}ms + ${changedChunksStats.join('\n')} + `); + } } export function statsWarningsToString(json: any, statsConfig: any) { diff --git a/tests/e2e/tests/basic/rebuild.ts b/tests/e2e/tests/basic/rebuild.ts index d253e3632df0..4e4c29609578 100644 --- a/tests/e2e/tests/basic/rebuild.ts +++ b/tests/e2e/tests/basic/rebuild.ts @@ -20,14 +20,9 @@ export default function() { return Promise.resolve(); } - let oldNumberOfChunks = 0; - const chunkRegExp = /chunk\s+\{/g; + const lazyChunkRegExp = /lazy\.module\.chunk\.js/g; return execAndWaitForOutputToMatch('ng', ['serve'], validBundleRegEx) - // Count the bundles. - .then(({ stdout }) => { - oldNumberOfChunks = stdout.split(chunkRegExp).length; - }) // Add a lazy module. .then(() => ng('generate', 'module', 'lazy', '--routing')) // Should trigger a rebuild with a new bundle. @@ -65,8 +60,7 @@ export default function() { // Count the bundles. .then((results) => { const stdout = results[0].stdout; - let newNumberOfChunks = stdout.split(chunkRegExp).length; - if (oldNumberOfChunks >= newNumberOfChunks) { + if (!lazyChunkRegExp.test(stdout)) { throw new Error('Expected webpack to create a new chunk, but did not.'); } }) From c53dc67770e2a0430c0b33594dde103aa576ebb5 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Dec 2017 14:25:05 +0000 Subject: [PATCH 087/115] fix(@angular/cli): remove postcss-custom-properties We currently use a fallback for CSS custom properties on older browsers. This approach has a few problems: - does not work if the custom property declaration is not part of the same of the same file that uses it (multiple global stylesheets, component css). - does not work at all for component CSS in AOT. @clydin suggested a browserlist based approach for enabling this functionality, but that requires a new feature that we don't have. Since currently taking advantage of the custom property fallback is flaky even in the best case scenario, and potentially broken in prod (AOT), I think it's better to remove it altogether until we can actually do it right. Fix #8289 --- package-lock.json | 34 ------------------- package.json | 1 - .../cli/models/webpack-configs/styles.ts | 3 -- packages/@angular/cli/package.json | 1 - 4 files changed, 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index dafb50f4c935..079c607e9ca7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6550,40 +6550,6 @@ "postcss-value-parser": "3.3.0" } }, - "postcss-custom-properties": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.1.0.tgz", - "integrity": "sha1-nK8RUaxBsenmTTov+ezplsoYl30=", - "requires": { - "balanced-match": "1.0.0", - "postcss": "6.0.11" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "requires": { - "chalk": "2.2.0", - "source-map": "0.5.7", - "supports-color": "4.4.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, "postcss-discard-comments": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", diff --git a/package.json b/package.json index f7afb60a709a..b204efbb7f3b 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "nopt": "^4.0.1", "opn": "~5.1.0", "portfinder": "~1.0.12", - "postcss-custom-properties": "^6.1.0", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index b1547bdcf500..b5ac8df8be10 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -11,7 +11,6 @@ import { CleanCssWebpackPlugin } from '../../plugins/cleancss-webpack-plugin'; const postcssUrl = require('postcss-url'); const autoprefixer = require('autoprefixer'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); -const customProperties = require('postcss-custom-properties'); const postcssImports = require('postcss-import'); /** @@ -115,14 +114,12 @@ export function getStylesConfig(wco: WebpackConfigOptions) { } ]), autoprefixer(), - customProperties({ preserve: true }) ]; }; (postcssPluginCreator as any)[postcssArgs] = { variableImports: { 'autoprefixer': 'autoprefixer', 'postcss-url': 'postcssUrl', - 'postcss-custom-properties': 'customProperties', 'postcss-import': 'postcssImports', }, variables: { minimizeCss, baseHref, deployUrl, projectRoot } diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 26cc5eb3e5ef..54a80814b417 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -60,7 +60,6 @@ "nopt": "^4.0.1", "opn": "~5.1.0", "portfinder": "~1.0.12", - "postcss-custom-properties": "^6.1.0", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.10", "postcss-url": "^7.1.2", From 99b0f9d304dd612a4452e2315bd1e81cc77bb4b3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 9 Jan 2018 11:20:57 -0500 Subject: [PATCH 088/115] fix(@angular/cli): support no semicolon scripts --- packages/@angular/cli/plugins/scripts-webpack-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@angular/cli/plugins/scripts-webpack-plugin.ts b/packages/@angular/cli/plugins/scripts-webpack-plugin.ts index 32d8a2785ed5..e65056264bfa 100644 --- a/packages/@angular/cli/plugins/scripts-webpack-plugin.ts +++ b/packages/@angular/cli/plugins/scripts-webpack-plugin.ts @@ -116,7 +116,7 @@ export class ScriptsWebpackPlugin { const concatSource = new ConcatSource(); sources.forEach(source => { concatSource.add(source); - concatSource.add('\n'); + concatSource.add('\n;'); }); const combinedSource = new CachedSource(concatSource); From b5bac36bf032bd3d72013d1efb0a9a7d8c58d335 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 4 Jan 2018 14:13:14 -0500 Subject: [PATCH 089/115] fix(@angular/cli): copy assets with special character paths --- packages/@angular/cli/models/webpack-configs/common.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/models/webpack-configs/common.ts b/packages/@angular/cli/models/webpack-configs/common.ts index 263d428e61a7..a279b3c96048 100644 --- a/packages/@angular/cli/models/webpack-configs/common.ts +++ b/packages/@angular/cli/models/webpack-configs/common.ts @@ -121,11 +121,15 @@ export function getCommonConfig(wco: WebpackConfigOptions) { asset.glob = asset.glob + '/**/*'; } + // Escape the input in case it has special charaters and use to make glob absolute + const escapedInput = asset.input + .replace(/[\\|\*|\?|\!|\(|\)|\[|\]|\{|\}]/g, (substring) => `\\${substring}`); + return { context: asset.input, to: asset.output, from: { - glob: asset.glob, + glob: path.resolve(escapedInput, asset.glob), dot: true } }; From b6b8acc1bf9928fc8016d77980dc61e9d978876b Mon Sep 17 00:00:00 2001 From: Adam Lee Date: Tue, 2 Jan 2018 14:58:50 -0500 Subject: [PATCH 090/115] feat(@angular/cli): load deployUrl and baseHref from app config for ng serve --- packages/@angular/cli/tasks/serve.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@angular/cli/tasks/serve.ts b/packages/@angular/cli/tasks/serve.ts index f6b389a974ef..698a8fc8211e 100644 --- a/packages/@angular/cli/tasks/serve.ts +++ b/packages/@angular/cli/tasks/serve.ts @@ -73,8 +73,8 @@ export default Task.extend({ } const serveDefaults = { - // default deployUrl to '' on serve to prevent the default from .angular-cli.json - deployUrl: '' + deployUrl: appConfig.deployUrl || '', + baseHref: appConfig.baseHref || '', }; serveTaskOptions = Object.assign({}, serveDefaults, serveTaskOptions); From 5c8fef60670cba5db7901c07b69b0d136ffc397c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 11 Jan 2018 18:53:19 -0500 Subject: [PATCH 091/115] release: 1.7.0-beta.0 --- package-lock.json | 85 ++++++++++++++++++-------- package.json | 8 +-- packages/@angular/cli/package.json | 10 +-- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 69 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 079c607e9ca7..d799cec2a2f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "@angular/cli", - "version": "1.6.3", + "version": "1.7.0-beta.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz", - "integrity": "sha512-EFFF7hBbVoTOzYfXuSlGhcDr8neafmwuBAIkzAekEjzik7OaTLq7LPG7As+ebed9ll+3DAGypnrpdIE1Tp/H/A==", + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.37.tgz", + "integrity": "sha512-446XvQosYWGG7OJGTqkXg39pHwqywLv03X+sewHOfqYqlTYD4/A7PxHCDB9qnLSwVz1DBRCbY0FJCfx5aYGakA==", "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", @@ -23,30 +23,35 @@ } }, "@angular-devkit/core": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", - "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.24.tgz", + "integrity": "sha512-abYk+YbDGnt/LSCDDI2CvJpIPaQGbvHjQc9hqK9KLZP5ZoxoRAqVV4K3POjatrE6l1ok83x3dVlt7Habxm6+Xg==", "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", "source-map": "0.5.7" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "@angular-devkit/schematics": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.42.tgz", - "integrity": "sha512-elTiNL0Nx9oin2pfZTvMBU/d9sgutXaZe8n3xm2p7jfqQZry5MYYFES4hq+WIJjtV/X9gAniafncEpxuF7ikYw==", + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.45.tgz", + "integrity": "sha512-lcuOEwfwN8zqH4lf3pmGa9NIWlvADuINjxDCtXIRwQc9PieeGmN56AMVTjFGk7SN+Wu+gPDMbL9wrBFM/u9z9g==", "requires": { - "@angular-devkit/core": "0.0.22", - "@ngtools/json-schema": "1.1.0", - "@schematics/schematics": "0.0.11", - "minimist": "1.2.0", - "rxjs": "5.5.2" - }, - "dependencies": { - "@schematics/schematics": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.11.tgz", - "integrity": "sha512-HAXgAIuuAGjiIKohGlRUkmUTWYtNmclR12KHlQQxT9pHFdEb2OrpHjUp2YoV32jiU6jIZm4pf3ODwlPA0VbwnA==" - } + "@angular-devkit/core": "0.0.24", + "@ngtools/json-schema": "1.1.0" } }, "@angular/compiler": { @@ -94,11 +99,34 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.11.tgz", - "integrity": "sha512-jYTantZjdYeDjxh9ZLYvGbDI0VeUxgSrcBjHvnHqMNe+YGJenY988ifWCwzjmOowj57maLrQQGrdoO7oUeNdyw==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.12.tgz", + "integrity": "sha512-ETBjNR1gJZQvUgmpVhk4jDxVvpyOXzGFhX4SkDvmrJdQSOThQFZRL2+TdUNtT+PAtPx583i+ixxsjuK53tU5Ew==", "requires": { - "@angular-devkit/core": "0.0.22" + "@angular-devkit/core": "0.0.24" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.24.tgz", + "integrity": "sha512-abYk+YbDGnt/LSCDDI2CvJpIPaQGbvHjQc9hqK9KLZP5ZoxoRAqVV4K3POjatrE6l1ok83x3dVlt7Habxm6+Xg==", + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "source-map": "0.5.7" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "@types/common-tags": { @@ -2877,6 +2905,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", diff --git a/package.json b/package.json index b204efbb7f3b..47cac7b72044 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.3", + "version": "1.7.0-beta.0", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -41,9 +41,9 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.36", - "@angular-devkit/schematics": "~0.0.42", - "@schematics/angular": "~0.1.11", + "@angular-devkit/build-optimizer": "~0.0.37", + "@angular-devkit/schematics": "~0.0.45", + "@schematics/angular": "~0.1.12", "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 54a80814b417..f97c9f50f723 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.6.3", + "version": "1.7.0-beta.0", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -27,11 +27,11 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.36", - "@angular-devkit/schematics": "~0.0.42", + "@angular-devkit/build-optimizer": "~0.0.37", + "@angular-devkit/schematics": "~0.0.45", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.9.3", - "@schematics/angular": "~0.1.11", + "@ngtools/webpack": "1.10.0-beta.0", + "@schematics/angular": "~0.1.12", "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 23b0d9b7d130..348d70fcb485 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.9.3", + "version": "1.10.0-beta.0", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 0ccdd1e38b423e488e93e020b3f1990ab13f0f9b Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Thu, 11 Jan 2018 16:12:51 -0500 Subject: [PATCH 092/115] ci: Update Chrome for appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index 04d5cc160614..081ec34a0df5 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -9,6 +9,7 @@ install: - ps: Install-Product node $env:nodejs_version - npm install -g npm@~5.6.0 - npm install + - choco install googlechrome test_script: - node --version From aaca7d832e867e2345aa00d07c476e60dbd8b6f6 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 11 Jan 2018 22:42:26 -0500 Subject: [PATCH 093/115] fix(@angular/cli): correct CSS resource resolving --- packages/@angular/cli/models/webpack-configs/styles.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index b5ac8df8be10..e4524cb612b8 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -55,6 +55,9 @@ export function getStylesConfig(wco: WebpackConfigOptions) { postcssImports({ resolve: (url: string, context: string) => { return new Promise((resolve, reject) => { + if (url && url.startsWith('~')) { + url = url.substr(1); + } loader.resolve(context, url, (err: Error, result: string) => { if (err) { reject(err); @@ -110,7 +113,8 @@ export function getStylesConfig(wco: WebpackConfigOptions) { filter: (asset: PostcssUrlAsset) => !asset.hash && !asset.absolutePath.endsWith('.cur'), url: 'inline', // NOTE: maxSize is in KB - maxSize: 10 + maxSize: 10, + fallback: 'rebase', } ]), autoprefixer(), From 7352bcbcabe976b82b651fbd4b251fbbfebe2ba4 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 12 Jan 2018 12:39:53 -0500 Subject: [PATCH 094/115] test: add Angular Material stylesheet import test --- .../e2e/tests/build/styles/material-import.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/e2e/tests/build/styles/material-import.ts diff --git a/tests/e2e/tests/build/styles/material-import.ts b/tests/e2e/tests/build/styles/material-import.ts new file mode 100644 index 000000000000..d739502a0bc0 --- /dev/null +++ b/tests/e2e/tests/build/styles/material-import.ts @@ -0,0 +1,37 @@ +import { + writeMultipleFiles, + replaceInFile +} from '../../../utils/fs'; +import { ng, silentNpm } from '../../../utils/process'; +import { stripIndents } from 'common-tags'; +import { updateJsonFile } from '../../../utils/project'; + +export default function () { + const extensions = ['css', 'scss', 'less', 'styl']; + let promise: Promise = Promise.resolve() + .then(() => silentNpm('install', '@angular/material@5.0.4')); + + extensions.forEach(ext => { + promise = promise.then(() => { + return writeMultipleFiles({ + [`src/styles.${ext}`]: stripIndents` + @import "~@angular/material/prebuilt-themes/indigo-pink.css"; + `, + [`src/app/app.component.${ext}`]: stripIndents` + @import "~@angular/material/prebuilt-themes/indigo-pink.css"; + `, + }) + // change files to use preprocessor + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['styles'] = [`styles.${ext}`]; + })) + .then(() => replaceInFile('src/app/app.component.ts', + './app.component.css', `./app.component.${ext}`)) + // run build app + .then(() => ng('build', '--extract-css', '--sourcemap')); + }); + }); + + return promise; +} From b6f1be702e28dd15b0b59319d72271a207e57c06 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 16 Jan 2018 13:40:56 +0000 Subject: [PATCH 095/115] fix(@ngtools/webpack): don't elide identifiers that are still exported Fix #9180 --- .../@ngtools/webpack/src/transformers/elide_imports.ts | 6 +++++- .../webpack/src/transformers/remove_decorators.spec.ts | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/@ngtools/webpack/src/transformers/elide_imports.ts b/packages/@ngtools/webpack/src/transformers/elide_imports.ts index a12bb030f77b..d1cd5b640c34 100644 --- a/packages/@ngtools/webpack/src/transformers/elide_imports.ts +++ b/packages/@ngtools/webpack/src/transformers/elide_imports.ts @@ -99,7 +99,11 @@ export function elideImports( .forEach((id) => { if (removedSymbolMap.has(id.text)) { const symbol = removedSymbolMap.get(id.text); - if (typeChecker.getSymbolAtLocation(id) === symbol.symbol) { + + // Check if the symbol is the same or if it is a named export. + // Named exports don't have the same symbol but will have the same name. + if ((id.parent && id.parent.kind === ts.SyntaxKind.ExportSpecifier) + || typeChecker.getSymbolAtLocation(id) === symbol.symbol) { symbol.all.push(id); } } diff --git a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts index 3fbfe4ad7203..7b2ff1e9d682 100644 --- a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts +++ b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts @@ -111,7 +111,7 @@ describe('@ngtools/webpack transformers', () => { it('should not remove imports from types that are still used', () => { const input = stripIndent` - import { Component, EventEmitter } from '@angular/core'; + import { Component, ChangeDetectionStrategy, EventEmitter } from '@angular/core'; @Component({ selector: 'app-root', @@ -123,9 +123,11 @@ describe('@ngtools/webpack transformers', () => { notify: EventEmitter = new EventEmitter(); title = 'app'; } + + export { ChangeDetectionStrategy }; `; const output = stripIndent` - import { EventEmitter } from '@angular/core'; + import { ChangeDetectionStrategy, EventEmitter } from '@angular/core'; export class AppComponent { constructor() { @@ -133,6 +135,8 @@ describe('@ngtools/webpack transformers', () => { this.title = 'app'; } } + + export { ChangeDetectionStrategy }; `; const { program, compilerHost } = createTypescriptContext(input); From 65b97c08c7eabc6a3880e2b98d0b4c227b8655c0 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Wed, 17 Jan 2018 14:41:52 -0500 Subject: [PATCH 096/115] fix(@ngtools/webpack): Allow for usage of Angular v6.*.* --- packages/@ngtools/webpack/src/ngtools_api.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/@ngtools/webpack/src/ngtools_api.ts b/packages/@ngtools/webpack/src/ngtools_api.ts index e66ea1a71809..074ab5df2fc6 100644 --- a/packages/@ngtools/webpack/src/ngtools_api.ts +++ b/packages/@ngtools/webpack/src/ngtools_api.ts @@ -144,8 +144,9 @@ export function CompilerCliIsSupported() { + 'Please clean your node_modules and reinstall.'); } - // Throw if we're neither 2.3.1 or more, nor 4.x.y, nor 5.x.y. - if (!(version.major == '5' + // Throw if we're neither 2.3.1 or more, nor 4.x.y, nor 5.x.y, nor 6.x.y. + if (!(version.major == '6' + || version.major == '5' || version.major == '4' || (version.major == '2' && (version.minor == '4' From c41173440a6aa6b50838335ee2ab3a0b95134880 Mon Sep 17 00:00:00 2001 From: britvik Date: Sat, 13 Jan 2018 11:19:17 +0100 Subject: [PATCH 097/115] fix(@angular/cli): Fixed lint not excluding files when project folder name started with a dot --- packages/@angular/cli/tasks/lint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@angular/cli/tasks/lint.ts b/packages/@angular/cli/tasks/lint.ts index 576a2d49d035..4b747ac72bdb 100644 --- a/packages/@angular/cli/tasks/lint.ts +++ b/packages/@angular/cli/tasks/lint.ts @@ -177,7 +177,7 @@ function getFilesToLint( let programFiles = linter.getFileNames(program); if (ignore && ignore.length > 0) { - const ignoreMatchers = ignore.map(pattern => new Minimatch(pattern)); + const ignoreMatchers = ignore.map(pattern => new Minimatch(pattern, { dot: true })); programFiles = programFiles .filter(file => !ignoreMatchers.some(matcher => matcher.match(file))); From e6707bfa4f75455a7adbadbfaa40cdc805d3a3cd Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 15 Jan 2018 12:13:18 -0500 Subject: [PATCH 098/115] fix(@angular/cli): workaround TS decorator transformer defect --- .../src/transformers/make_transform.ts | 15 ++++-- .../transformers/remove_decorators.spec.ts | 48 +++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/@ngtools/webpack/src/transformers/make_transform.ts b/packages/@ngtools/webpack/src/transformers/make_transform.ts index ae6befae01bf..c2f6ed85eb59 100644 --- a/packages/@ngtools/webpack/src/transformers/make_transform.ts +++ b/packages/@ngtools/webpack/src/transformers/make_transform.ts @@ -129,11 +129,18 @@ function visitEachChildWorkaround(node: ts.Node, visitor: ts.Visitor, } -// If TS sees an empty decorator array, it will still emit a `__decorate` call. -// This seems to be a TS bug. +// 1) If TS sees an empty decorator array, it will still emit a `__decorate` call. +// This seems to be a TS bug. +// 2) Also ensure nodes with modified decorators have parents +// built in TS transformers assume certain nodes have parents (fixed in TS 2.7+) function cleanupDecorators(node: ts.Node) { - if (node.decorators && node.decorators.length == 0) { - node.decorators = undefined; + if (node.decorators) { + if (node.decorators.length == 0) { + node.decorators = undefined; + } else if (node.parent == undefined) { + const originalNode = ts.getParseTreeNode(node); + node.parent = originalNode.parent; + } } ts.forEachChild(node, node => cleanupDecorators(node)); diff --git a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts index 7b2ff1e9d682..fedf80298ca3 100644 --- a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts +++ b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts @@ -76,6 +76,54 @@ describe('@ngtools/webpack transformers', () => { expect(oneLine`${result}`).toEqual(oneLine`${output}`); }); + it('should keep other decorators on class member', () => { + const input = stripIndent` + import { Component, HostListener } from '@angular/core'; + import { AnotherDecorator } from 'another-lib'; + + @Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] + }) + export class AppComponent { + title = 'app'; + + @HostListener('document:keydown.escape') + @AnotherDecorator() + onEscape() { + console.log('run'); + } + } + `; + const output = stripIndent` + import * as tslib_1 from "tslib"; + import { AnotherDecorator } from 'another-lib'; + + export class AppComponent { + constructor() { + this.title = 'app'; + } + + onEscape() { + console.log('run'); + } + } + tslib_1.__decorate([ + AnotherDecorator() + ], AppComponent.prototype, "onEscape", null); + `; + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = removeDecorators( + () => true, + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); + it('should remove imports for identifiers within the decorator', () => { const input = stripIndent` import { Component } from '@angular/core'; From a6ce9abecf68ccb88682c8ec7931bbd84c30c8de Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 15 Jan 2018 13:25:28 -0500 Subject: [PATCH 099/115] fix(@angular/cli): standardize inline/rebase stylesheet behavior --- .../@angular/cli/models/webpack-configs/styles.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index e4524cb612b8..d85cf3df0ff1 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -44,6 +44,8 @@ export function getStylesConfig(wco: WebpackConfigOptions) { const extraPlugins: any[] = []; const cssSourceMap = buildOptions.sourcemaps; + // Maximum resource size to inline (KiB) + const maximumInlineSize = 10; // Minify/optimize css in production. const minimizeCss = buildOptions.target === 'production'; // Convert absolute resource URLs to account for base-href and deploy-url. @@ -110,12 +112,15 @@ export function getStylesConfig(wco: WebpackConfigOptions) { }, { // TODO: inline .cur if not supporting IE (use browserslist to check) - filter: (asset: PostcssUrlAsset) => !asset.hash && !asset.absolutePath.endsWith('.cur'), + filter: (asset: PostcssUrlAsset) => { + return maximumInlineSize > 0 && !asset.hash && !asset.absolutePath.endsWith('.cur'); + }, url: 'inline', // NOTE: maxSize is in KB - maxSize: 10, + maxSize: maximumInlineSize, fallback: 'rebase', - } + }, + { url: 'rebase' }, ]), autoprefixer(), ]; @@ -126,7 +131,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { 'postcss-url': 'postcssUrl', 'postcss-import': 'postcssImports', }, - variables: { minimizeCss, baseHref, deployUrl, projectRoot } + variables: { minimizeCss, baseHref, deployUrl, projectRoot, maximumInlineSize } }; // determine hashing format From 5f73a75193bc1217cbfb7f2240355679517cc8d0 Mon Sep 17 00:00:00 2001 From: Taha Di Nero Date: Wed, 17 Jan 2018 11:33:00 +0100 Subject: [PATCH 100/115] fix(@ngtools/webpack): allow # in paths --- packages/@ngtools/webpack/src/angular_compiler_plugin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts index 326ef8b98044..9aa58816a62e 100644 --- a/packages/@ngtools/webpack/src/angular_compiler_plugin.ts +++ b/packages/@ngtools/webpack/src/angular_compiler_plugin.ts @@ -135,9 +135,9 @@ export class AngularCompilerPlugin implements Tapable { if (!this._entryModule) { return undefined; } - const splitted = this._entryModule.split('#'); + const splitted = this._entryModule.split(/(#[a-zA-Z_]([\w]+))$/); const path = splitted[0]; - const className = splitted[1] || 'default'; + const className = !!splitted[1] ? splitted[1].substring(1) : 'default'; return { path, className }; } From 14b37435996544d6fb3fbb26bff01d3b787d140d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 16 Jan 2018 20:37:42 -0500 Subject: [PATCH 101/115] fix(@angular/cli): normalize asset windows paths --- .../cli/models/webpack-configs/common.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/@angular/cli/models/webpack-configs/common.ts b/packages/@angular/cli/models/webpack-configs/common.ts index a279b3c96048..3e24b93a7780 100644 --- a/packages/@angular/cli/models/webpack-configs/common.ts +++ b/packages/@angular/cli/models/webpack-configs/common.ts @@ -83,16 +83,21 @@ export function getCommonConfig(wco: WebpackConfigOptions) { asset = typeof asset === 'string' ? { glob: asset } : asset; // Add defaults. // Input is always resolved relative to the appRoot. - asset.input = path.resolve(appRoot, asset.input || ''); + asset.input = path.resolve(appRoot, asset.input || '').replace(/\\/g, '/'); asset.output = asset.output || ''; asset.glob = asset.glob || ''; // Prevent asset configurations from writing outside of the output path, except if the user // specify a configuration flag. // Also prevent writing outside the project path. That is not overridable. - const fullOutputPath = path.resolve(buildOptions.outputPath, asset.output); - if (!fullOutputPath.startsWith(path.resolve(buildOptions.outputPath))) { - if (!fullOutputPath.startsWith(projectRoot)) { + const absoluteOutputPath = path.resolve(buildOptions.outputPath); + const absoluteAssetOutput = path.resolve(absoluteOutputPath, asset.output); + const outputRelativeOutput = path.relative(absoluteOutputPath, absoluteAssetOutput); + + if (outputRelativeOutput.startsWith('..') || path.isAbsolute(outputRelativeOutput)) { + + const projectRelativeOutput = path.relative(projectRoot, absoluteAssetOutput); + if (projectRelativeOutput.startsWith('..') || path.isAbsolute(projectRelativeOutput)) { const message = 'An asset cannot be written to a location outside the project.'; throw new SilentError(message); } @@ -106,7 +111,8 @@ export function getCommonConfig(wco: WebpackConfigOptions) { } // Prevent asset configurations from reading files outside of the project. - if (!asset.input.startsWith(projectRoot)) { + const projectRelativeInput = path.relative(projectRoot, asset.input); + if (projectRelativeInput.startsWith('..') || path.isAbsolute(projectRelativeInput)) { const message = 'An asset cannot be read from a location outside the project.'; throw new SilentError(message); } From d53eb59eff22b55d6983b27c77f1c9703e97222e Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jan 2018 15:56:43 -0500 Subject: [PATCH 102/115] test: add additional tests on Windows --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 081ec34a0df5..20d541241449 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -16,7 +16,7 @@ test_script: - npm --version - npm run test:packages - npm run test:cli - - node tests\run_e2e.js --appveyor "--glob=tests/{basic,commands,generate}/**" + - node tests\run_e2e.js --appveyor "--glob=tests/{basic,commands,generate,build/styles}/**" build: off From 93e5d460b48706f286ae33e66674ab2db4d62fae Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 15 Jan 2018 09:44:53 +0000 Subject: [PATCH 103/115] feat(@angular/cli): use devkit core formats for schematics Followup to https://github.com/angular/devkit/pull/334 --- package.json | 1 + packages/@angular/cli/commands/generate.ts | 2 +- packages/@angular/cli/package.json | 1 + packages/@angular/cli/tasks/schematic-run.ts | 2 +- packages/@angular/cli/utilities/schematics.ts | 9 ++++++++- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 47cac7b72044..991f5e8367eb 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.37", + "@angular-devkit/core": "~0.0.24", "@angular-devkit/schematics": "~0.0.45", "@schematics/angular": "~0.1.12", "autoprefixer": "^7.2.3", diff --git a/packages/@angular/cli/commands/generate.ts b/packages/@angular/cli/commands/generate.ts index 9318f9f94ad4..5229cbf1756b 100644 --- a/packages/@angular/cli/commands/generate.ts +++ b/packages/@angular/cli/commands/generate.ts @@ -148,7 +148,7 @@ export default Command.extend({ dryRun: commandOptions.dryRun }; const parsedPath = dynamicPathParser(dynamicPathOptions); - commandOptions.sourceDir = parsedPath.sourceDir; + commandOptions.sourceDir = parsedPath.sourceDir.replace(separatorRegEx, '/'); const root = parsedPath.sourceDir + path.sep; commandOptions.appRoot = parsedPath.appRoot === parsedPath.sourceDir ? '' : parsedPath.appRoot.startsWith(root) diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index f97c9f50f723..f0064f93604f 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -28,6 +28,7 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/build-optimizer": "~0.0.37", + "@angular-devkit/core": "~0.0.24", "@angular-devkit/schematics": "~0.0.45", "@ngtools/json-schema": "1.1.0", "@ngtools/webpack": "1.10.0-beta.0", diff --git a/packages/@angular/cli/tasks/schematic-run.ts b/packages/@angular/cli/tasks/schematic-run.ts index f3cddcc7c49b..b5dd99170799 100644 --- a/packages/@angular/cli/tasks/schematic-run.ts +++ b/packages/@angular/cli/tasks/schematic-run.ts @@ -173,7 +173,7 @@ function prepOptions(schematic: Schematic<{}, {}>, options: SchematicOptions): S const keys = Object.keys(properties); if (['component', 'c', 'directive', 'd'].indexOf(schematic.description.name) !== -1) { options.prefix = (options.prefix === 'false' || options.prefix === '') - ? '' : options.prefix; + ? undefined : options.prefix; } let preppedOptions = { diff --git a/packages/@angular/cli/utilities/schematics.ts b/packages/@angular/cli/utilities/schematics.ts index f94067a8e42c..ff468fba4880 100644 --- a/packages/@angular/cli/utilities/schematics.ts +++ b/packages/@angular/cli/utilities/schematics.ts @@ -5,16 +5,19 @@ * require('@schematics/angular') */ +import { schema } from '@angular-devkit/core'; import { Collection, Engine, Schematic, SchematicEngine, + formats, } from '@angular-devkit/schematics'; import { FileSystemCollectionDesc, FileSystemSchematicDesc, - NodeModulesEngineHost + NodeModulesEngineHost, + validateOptionsWithSchema } from '@angular-devkit/schematics/tools'; import { SchemaClassFactory } from '@ngtools/json-schema'; import 'rxjs/add/operator/concatMap'; @@ -26,6 +29,10 @@ const engineHost = new NodeModulesEngineHost(); const engine: Engine = new SchematicEngine(engineHost); +// Add support for schemaJson. +const registry = new schema.CoreSchemaRegistry(formats.standardFormats); +engineHost.registerOptionsTransform(validateOptionsWithSchema(registry)); + export function getEngineHost() { return engineHost; From ea349c31c3297cd00ece9e9af83f55395d57b90d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 11 Jan 2018 10:21:14 -0500 Subject: [PATCH 104/115] fix(@angular/cli): ensure webpack 3 sass-loader support --- package-lock.json | 193 ++++++++++++++++++++++++++--- package.json | 4 +- packages/@angular/cli/package.json | 4 +- scripts/test-licenses.js | 1 + 4 files changed, 178 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index d799cec2a2f0..1fd943cc594e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4016,14 +4016,12 @@ "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" }, "generate-object-property": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, "requires": { "is-property": "1.0.2" } @@ -4750,7 +4748,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "dev": true, "requires": { "generate-function": "2.0.0", "generate-object-property": "1.2.0", @@ -4819,8 +4816,7 @@ "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "is-regex": { "version": "1.0.4", @@ -4964,9 +4960,9 @@ } }, "js-base64": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", - "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", + "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==" }, "js-tokens": { "version": "3.0.2", @@ -5051,8 +5047,7 @@ "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, "jsprim": { "version": "1.4.1", @@ -5888,9 +5883,9 @@ "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=" }, "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", + "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", "optional": true, "requires": { "async-foreach": "0.1.3", @@ -5908,16 +5903,42 @@ "nan": "2.7.0", "node-gyp": "3.6.2", "npmlog": "4.1.2", - "request": "2.82.0", + "request": "2.79.0", "sass-graph": "2.2.4", - "stdout-stream": "1.4.0" + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" }, "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "optional": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -5926,10 +5947,118 @@ "supports-color": "2.0.0" } }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "optional": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "optional": true } } @@ -6528,7 +6657,7 @@ "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", "requires": { "chalk": "1.1.3", - "js-base64": "2.3.2", + "js-base64": "2.4.0", "source-map": "0.5.7", "supports-color": "3.2.3" }, @@ -7851,7 +7980,7 @@ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "optional": true, "requires": { - "js-base64": "2.3.2", + "js-base64": "2.4.0", "source-map": "0.4.4" }, "dependencies": { @@ -8766,6 +8895,30 @@ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "optional": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, "tryit": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", diff --git a/package.json b/package.json index 991f5e8367eb..8a6347a4dfe4 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "raw-loader": "^0.5.1", "resolve": "^1.1.7", "rxjs": "^5.5.2", - "sass-loader": "^6.0.3", + "sass-loader": "^6.0.6", "semver": "^5.3.0", "silent-error": "^1.0.0", "source-map": "^0.5.6", @@ -146,6 +146,6 @@ "tslint": "^5.1.0" }, "optionalDependencies": { - "node-sass": "^4.3.0" + "node-sass": "^4.7.2" } } diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index f0064f93604f..e768fb5849f8 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -67,7 +67,7 @@ "raw-loader": "^0.5.1", "resolve": "^1.1.7", "rxjs": "^5.5.2", - "sass-loader": "^6.0.3", + "sass-loader": "^6.0.6", "semver": "^5.1.0", "silent-error": "^1.0.0", "source-map-loader": "^0.2.0", @@ -87,6 +87,6 @@ "zone.js": "^0.8.14" }, "optionalDependencies": { - "node-sass": "^4.3.0" + "node-sass": "^4.7.2" } } diff --git a/scripts/test-licenses.js b/scripts/test-licenses.js index b7c700c21c90..ae68d7f75d1e 100644 --- a/scripts/test-licenses.js +++ b/scripts/test-licenses.js @@ -79,6 +79,7 @@ const ignoredPackages = [ 'spdx-license-ids@2.0.1', // CC0 but it's content only (index.json, no code) and not distributed. 'map-stream@0.1.0', // MIT, license but it's not listed in package.json. 'xmldom@0.1.27', // LGPL,MIT but has a broken licenses array. + 'true-case-path@1.0.2', // Apache-2.0 but broken license in package.json 'jsonify@0.0.0', // TODO(hansl): fix this. this is not an acceptable license, but is 8 deps down // so hard to manage. In talk with owner and users to switch over. From da37cc0f134320fbb2442565e478e7b88689bfb4 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jan 2018 20:15:24 -0500 Subject: [PATCH 105/115] fix(@angular/cli): remove ES2015 live-reload requirement --- package-lock.json | 1492 +++++++++++++++++++++++++++- package.json | 2 +- packages/@angular/cli/package.json | 2 +- 3 files changed, 1450 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fd943cc594e..bc4f679c3155 100644 --- a/package-lock.json +++ b/package-lock.json @@ -490,6 +490,11 @@ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, "array-filter": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", @@ -590,6 +595,11 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", @@ -614,6 +624,11 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" + }, "autoprefixer": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.3.tgz", @@ -816,6 +831,20 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.0", + "pascalcase": "0.1.1" + } + }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", @@ -864,6 +893,38 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==" }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -1041,6 +1102,22 @@ "y18n": "3.2.1" } }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1237,6 +1314,78 @@ } } }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "clean-css": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", @@ -1304,6 +1453,15 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, "color": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", @@ -1386,6 +1544,11 @@ "dot-prop": "3.0.0" } }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, "compressible": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", @@ -1756,6 +1919,11 @@ "run-queue": "1.0.3" } }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, "copy-webpack-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.1.1.tgz", @@ -2109,6 +2277,11 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -2129,6 +2302,14 @@ "object-keys": "1.0.11" } }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", @@ -2821,6 +3002,7 @@ "version": "4.15.4", "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "dev": true, "requires": { "accepts": "1.3.4", "array-flatten": "1.1.1", @@ -2855,12 +3037,14 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, "qs": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==", + "dev": true } } }, @@ -2869,6 +3053,14 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2989,6 +3181,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.5.tgz", "integrity": "sha1-pwEwPSV6G8gv6lR6M+WuiVMXI98=", + "dev": true, "requires": { "debug": "2.6.8", "encodeurl": "1.0.1", @@ -3119,10 +3312,19 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "0.2.2" + } + }, "fresh": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "dev": true }, "from": { "version": "0.1.7", @@ -4054,6 +4256,11 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -4242,6 +4449,53 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", @@ -4455,6 +4709,11 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, "icss-replace-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", @@ -4515,15 +4774,6 @@ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "optional": true }, - "import-local": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4649,13 +4899,29 @@ "ipaddr.js": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "dev": true }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4687,11 +4953,43 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -4769,6 +5067,24 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-odd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", + "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", + "requires": { + "is-number": "3.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + } + } + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -5068,6 +5384,11 @@ "source-map-support": "0.4.18" } }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5440,6 +5761,11 @@ "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", "dev": true }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -5451,6 +5777,14 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "1.0.1" + } + }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -5664,6 +5998,25 @@ "through2": "2.0.3" } }, + "mixin-deep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", + "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -5751,6 +6104,41 @@ "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", "optional": true }, + "nanomatch": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", + "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "is-odd": "1.0.0", + "kind-of": "5.1.0", + "object.pick": "1.3.0", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6278,11 +6666,72 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + } + } + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "3.0.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -6302,6 +6751,14 @@ } } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" + } + }, "obuf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", @@ -6518,11 +6975,21 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -6651,6 +7118,11 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, "postcss": { "version": "5.2.17", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", @@ -7366,6 +7838,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "dev": true, "requires": { "forwarded": "0.1.2", "ipaddr.js": "1.4.0" @@ -7510,6 +7983,24 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, "raw-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", @@ -7692,6 +8183,14 @@ "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", + "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", + "requires": { + "extend-shallow": "2.0.1" + } + }, "regexpu-core": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", @@ -7859,6 +8358,11 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", @@ -8017,6 +8521,7 @@ "version": "0.15.4", "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", + "dev": true, "requires": { "debug": "2.6.8", "depd": "1.1.1", @@ -8036,7 +8541,8 @@ "mime": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true } } }, @@ -8072,6 +8578,7 @@ "version": "1.12.4", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", + "dev": true, "requires": { "encodeurl": "1.0.1", "escape-html": "1.0.3", @@ -8084,11 +8591,30 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "0.3.0" + } + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -8195,6 +8721,100 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "requires": { + "base": "0.11.2", + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "3.2.2" + } + }, "sntp": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", @@ -8203,22 +8823,6 @@ "hoek": "4.2.0" } }, - "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", - "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - } - } - }, "sockjs-client": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", @@ -8296,6 +8900,18 @@ } } }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -8304,6 +8920,11 @@ "source-map": "0.5.7" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, "spdx": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/spdx/-/spdx-0.5.1.tgz", @@ -8400,6 +9021,33 @@ "through": "2.3.8" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "split2": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/split2/-/split2-2.1.1.tgz", @@ -8437,6 +9085,76 @@ "safe-buffer": "5.1.1" } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -8855,6 +9573,104 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", + "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "requires": { + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "regex-not": "1.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + } + } + } + }, "toposort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", @@ -9104,6 +9920,30 @@ } } }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -9148,11 +9988,52 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -9202,6 +10083,85 @@ } } }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "0.1.0" + } + } + } + }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -9245,7 +10205,8 @@ "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true }, "uuid": { "version": "3.1.0", @@ -9622,43 +10583,109 @@ } }, "webpack-dev-server": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.3.tgz", - "integrity": "sha512-bwq7sj452FRH+oVfgOA8xXKkLYPTNsYB4dQ0Jhz3ydjNJ9MvhpGJtehFW8Z0cEcwNkRRiF4aYbReiSGQ4pbS1w==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.0.tgz", + "integrity": "sha512-lXzc36DGjKUVinETNmDWhfZFRbHMhatuF+lKex+czqY+JVe0Qf2V+Ig6/svDdbt/DmXFXuLQmSqhncYCqYf3qA==", "requires": { "ansi-html": "0.0.7", "array-includes": "3.0.3", "bonjour": "3.5.0", - "chokidar": "1.7.0", + "chokidar": "2.0.0", "compression": "1.7.0", "connect-history-api-fallback": "1.3.0", "debug": "3.1.0", "del": "3.0.0", - "express": "4.15.4", + "express": "4.16.2", "html-entities": "1.2.1", "http-proxy-middleware": "0.17.4", - "import-local": "0.1.1", + "import-local": "1.0.0", "internal-ip": "1.2.0", "ip": "1.1.5", + "killable": "1.0.0", "loglevel": "1.4.1", "opn": "5.1.0", "portfinder": "1.0.13", "selfsigned": "1.9.1", "serve-index": "1.9.0", - "sockjs": "0.3.18", + "sockjs": "0.3.19", "sockjs-client": "1.1.4", "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.4.0", - "webpack-dev-middleware": "1.12.0", + "strip-ansi": "4.0.0", + "supports-color": "5.1.0", + "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "3.1.5", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", + "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.1" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, + "chokidar": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.0.tgz", + "integrity": "sha512-OgXCNv2U6TnG04D3tth0gsvdbV4zdbxFG3sYUqcoQMoEFVd1j1pZR6TZ8iknC45o9IJ6PeQI/J6wT/+cHcniAw==", + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.0", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -9667,19 +10694,396 @@ "ms": "2.0.0" } }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "micromatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz", + "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.0", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.7", + "object.pick": "1.3.0", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", "requires": { "has-flag": "2.0.0" } }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + } + } + }, "yargs": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", diff --git a/package.json b/package.json index 8a6347a4dfe4..b5b42b244fa0 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "url-loader": "^0.6.2", "webpack": "~3.10.0", "webpack-dev-middleware": "~1.12.0", - "webpack-dev-server": "~2.9.3", + "webpack-dev-server": "~2.11.0", "webpack-merge": "^4.1.0", "webpack-sources": "^1.0.0", "webpack-subresource-integrity": "^1.0.1", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index e768fb5849f8..dcf2226e3b8f 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -80,7 +80,7 @@ "url-loader": "^0.6.2", "webpack": "~3.10.0", "webpack-dev-middleware": "~1.12.0", - "webpack-dev-server": "~2.9.3", + "webpack-dev-server": "~2.11.0", "webpack-merge": "^4.1.0", "webpack-sources": "^1.0.0", "webpack-subresource-integrity": "^1.0.1", From 2a254020350f1d6908faec911570e0c3cf91374e Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jan 2018 19:13:34 -0500 Subject: [PATCH 106/115] refactor(@angular/cli): use project's zone.js when needed --- package-lock.json | 7 ++++--- package.json | 6 +++--- packages/@angular/cli/package.json | 3 +-- packages/@angular/cli/tasks/render-universal.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc4f679c3155..8480224d11b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11307,9 +11307,10 @@ "dev": true }, "zone.js": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.18.tgz", - "integrity": "sha512-knKOBQM0oea3/x9pdyDuDi7RhxDlJhOIkeixXSiTKWLgs4LpK37iBc+1HaHwzlciHUKT172CymJFKo8Xgh+44Q==" + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==", + "dev": true } } } diff --git a/package.json b/package.json index b5b42b244fa0..cc536c47e72d 100644 --- a/package.json +++ b/package.json @@ -100,8 +100,7 @@ "webpack-dev-server": "~2.11.0", "webpack-merge": "^4.1.0", "webpack-sources": "^1.0.0", - "webpack-subresource-integrity": "^1.0.1", - "zone.js": "^0.8.14" + "webpack-subresource-integrity": "^1.0.1" }, "devDependencies": { "@angular/compiler": "^5.0.0", @@ -143,7 +142,8 @@ "temp": "0.8.3", "through": "^2.3.6", "ts-node": "^3.2.0", - "tslint": "^5.1.0" + "tslint": "^5.1.0", + "zone.js": "^0.8.20" }, "optionalDependencies": { "node-sass": "^4.7.2" diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index dcf2226e3b8f..18f2ac82c44c 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -83,8 +83,7 @@ "webpack-dev-server": "~2.11.0", "webpack-merge": "^4.1.0", "webpack-sources": "^1.0.0", - "webpack-subresource-integrity": "^1.0.1", - "zone.js": "^0.8.14" + "webpack-subresource-integrity": "^1.0.1" }, "optionalDependencies": { "node-sass": "^4.7.2" diff --git a/packages/@angular/cli/tasks/render-universal.ts b/packages/@angular/cli/tasks/render-universal.ts index 113748274886..01e3bc1d5eb2 100644 --- a/packages/@angular/cli/tasks/render-universal.ts +++ b/packages/@angular/cli/tasks/render-universal.ts @@ -13,7 +13,7 @@ export interface RenderUniversalTaskOptions { export default Task.extend({ run: function(options: RenderUniversalTaskOptions): Promise { - require('zone.js/dist/zone-node'); + requireProjectModule(this.project.root, 'zone.js/dist/zone-node'); const renderModuleFactory = requireProjectModule(this.project.root, '@angular/platform-server').renderModuleFactory; From f8dde330234be3e44d586934a9285efb06cf55cf Mon Sep 17 00:00:00 2001 From: Yaroslav Admin Date: Thu, 4 Jan 2018 21:37:16 +0100 Subject: [PATCH 107/115] fix(@angular/cli): allow TS 2.6 for Angular >= 5.2 --- packages/@angular/cli/upgrade/version.ts | 3 ++- tests/e2e/tests/misc/typescript-warning.ts | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/@angular/cli/upgrade/version.ts b/packages/@angular/cli/upgrade/version.ts index d8620acc4b74..9234eb3b1908 100644 --- a/packages/@angular/cli/upgrade/version.ts +++ b/packages/@angular/cli/upgrade/version.ts @@ -170,7 +170,8 @@ export class Version { { compiler: '>=2.3.1 <3.0.0', typescript: '>=2.0.2 <2.3.0' }, { compiler: '>=4.0.0 <5.0.0', typescript: '>=2.1.0 <2.4.0' }, { compiler: '>=5.0.0 <5.1.0', typescript: '>=2.4.2 <2.5.0' }, - { compiler: '>=5.1.0 <6.0.0', typescript: '>=2.4.2 <2.6.0' } + { compiler: '>=5.1.0 <5.2.0', typescript: '>=2.4.2 <2.6.0' }, + { compiler: '>=5.2.0 <6.0.0', typescript: '>=2.4.2 <2.7.0' } ]; const currentCombo = versionCombos.find((combo) => satisfies(compilerVersion, combo.compiler)); diff --git a/tests/e2e/tests/misc/typescript-warning.ts b/tests/e2e/tests/misc/typescript-warning.ts index 974470d750ce..1b247eea264a 100644 --- a/tests/e2e/tests/misc/typescript-warning.ts +++ b/tests/e2e/tests/misc/typescript-warning.ts @@ -3,9 +3,8 @@ import { getGlobalVariable } from '../../utils/env'; export default function () { - // typescript@2.6 is not part of the officially supported range in latest stable. - // Update as needed. - let unsupportedTsVersion = '2.6'; + // typescript@2.7.0-dev.20180104 is not part of the officially supported range in latest stable. + let unsupportedTsVersion = '2.7.0-dev.20180104'; // Skip this test in Angular 2/4. if (getGlobalVariable('argv').ng2 || getGlobalVariable('argv').ng4) { From 23fee3d5d9df925c73f3f8d3c248c5e3d7cb7cc8 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jan 2018 14:54:24 -0500 Subject: [PATCH 108/115] test(@angular/cli): improve third-party bootstrap styles test --- tests/e2e/tests/third-party/bootstrap.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/e2e/tests/third-party/bootstrap.ts b/tests/e2e/tests/third-party/bootstrap.ts index a86425c92f69..c3fadd070b7c 100644 --- a/tests/e2e/tests/third-party/bootstrap.ts +++ b/tests/e2e/tests/third-party/bootstrap.ts @@ -23,5 +23,19 @@ export default function() { + `)) + .then(() => ng( + 'build', + '--prod', + '--extract-css', + '--output-hashing=none' + )) + .then(() => expectFileToMatch('dist/scripts.bundle.js', 'jQuery')) + .then(() => expectFileToMatch('dist/styles.bundle.css', '* Bootstrap')) + .then(() => expectFileToMatch('dist/index.html', oneLineTrim` + + + + `)); } From 9c871b003a8d91051e9d7affc63206aef4b71e20 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Wed, 13 Dec 2017 16:54:33 -0500 Subject: [PATCH 109/115] feat(@angular/cli): Ability to specify budgets for your apps Closes #7139 --- docs/documentation/stories.md | 1 + docs/documentation/stories/budgets.md | 61 ++++++ packages/@angular/cli/lib/config/schema.json | 47 ++++ .../cli/models/webpack-configs/production.ts | 5 + .../@angular/cli/plugins/bundle-budget.ts | 129 +++++++++++ packages/@angular/cli/plugins/webpack.ts | 1 + packages/@angular/cli/tasks/eject.ts | 13 ++ .../cli/utilities/bundle-calculator.ts | 204 ++++++++++++++++++ tests/acceptance/bundle-calculator.spec.ts | 86 ++++++++ tests/e2e/tests/build/bundle-budgets.ts | 74 +++++++ 10 files changed, 621 insertions(+) create mode 100644 docs/documentation/stories/budgets.md create mode 100644 packages/@angular/cli/plugins/bundle-budget.ts create mode 100644 packages/@angular/cli/utilities/bundle-calculator.ts create mode 100644 tests/acceptance/bundle-calculator.spec.ts create mode 100644 tests/e2e/tests/build/bundle-budgets.ts diff --git a/docs/documentation/stories.md b/docs/documentation/stories.md index babf2802e116..7b5d3f6703d0 100644 --- a/docs/documentation/stories.md +++ b/docs/documentation/stories.md @@ -14,6 +14,7 @@ - [Angular Material](stories/include-angular-material) - [AngularFire](stories/include-angularfire) - [Bootstrap](stories/include-bootstrap) + - [Budgets](stories/budgets) - [Font Awesome](stories/include-font-awesome) - [Moving Into the CLI](stories/moving-into-the-cli) - [Moving Out of the CLI](stories/moving-out-of-the-cli) diff --git a/docs/documentation/stories/budgets.md b/docs/documentation/stories/budgets.md new file mode 100644 index 000000000000..33c863465078 --- /dev/null +++ b/docs/documentation/stories/budgets.md @@ -0,0 +1,61 @@ +# Budgets + +As applications grow in functionality, they also grow in size. Budgets is a feature in the +Angular CLI which allows you to set budget thresholds in your configuration to ensure parts +of your application stay within boundries which you set. + +**.angular-cli.json** +``` +{ + ... + apps: [ + { + ... + budgets: [] + } + ] +} +``` + +## Budget Definition + +- type + - The type of budget. + - Possible values: + - bundle - The size of a specific bundle. + - initial - The initial size of the app. + - allScript - The size of all scripts. + - all - The size of the entire app. + - anyScript - The size of any one script. + - any - The size of any file. +- name + - The name of the bundle. + - Required only for type of "bundle" +- baseline + - The baseline size for comparison. +- maximumWarning + - The maximum threshold for warning relative to the baseline. +- maximumError + - The maximum threshold for error relative to the baseline. +- minimumWarning + - The minimum threshold for warning relative to the baseline. +- minimumError + - The minimum threshold for error relative to the baseline. +- warning + - The threshold for warning relative to the baseline (min & max). +- error + - The threshold for error relative to the baseline (min & max). + +## Specifying sizes + +Available formats: +123 - size in bytes +123b - size in bytes +123kb - size in kilobytes +123mb - size in megabytes +12% - percentage + +## NOTES + +All sizes are relative to baseline. +Percentages are not valid for baseline values. diff --git a/packages/@angular/cli/lib/config/schema.json b/packages/@angular/cli/lib/config/schema.json index dd34c1b389ea..7359d5d348d8 100644 --- a/packages/@angular/cli/lib/config/schema.json +++ b/packages/@angular/cli/lib/config/schema.json @@ -99,6 +99,53 @@ }, "default": [] }, + "budgets": { + "type": "array", + "description": "Threshold definitions for bundle sizes.", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["bundle", "initial", "allScript", "all", "anyScript", "any"], + "description": "The type of budget" + }, + "name": { + "type": "string", + "description": "The name of the bundle" + }, + "baseline": { + "type": "string", + "description": "The baseline size for comparison." + }, + "maximumWarning": { + "type": "string", + "description": "The maximum threshold for warning relative to the baseline." + }, + "maximumError": { + "type": "string", + "description": "The maximum threshold for error relative to the baseline." + }, + "minimumWarning": { + "type": "string", + "description": "The minimum threshold for warning relative to the baseline." + }, + "minimumError": { + "type": "string", + "description": "The minimum threshold for error relative to the baseline." + }, + "warning": { + "type": "string", + "description": "The threshold for warning relative to the baseline (min & max)." + }, + "error": { + "type": "string", + "description": "The threshold for error relative to the baseline (min & max)." + } + } + }, + "default": [] + }, "deployUrl": { "type": "string", "description": "URL where files will be deployed." diff --git a/packages/@angular/cli/models/webpack-configs/production.ts b/packages/@angular/cli/models/webpack-configs/production.ts index 3f43353174e4..5b6be4dfd754 100644 --- a/packages/@angular/cli/models/webpack-configs/production.ts +++ b/packages/@angular/cli/models/webpack-configs/production.ts @@ -5,6 +5,7 @@ import * as semver from 'semver'; import { stripIndent } from 'common-tags'; import { LicenseWebpackPlugin } from 'license-webpack-plugin'; import { PurifyPlugin } from '@angular-devkit/build-optimizer'; +import { BundleBudgetPlugin } from '../../plugins/bundle-budget'; import { StaticAssetPlugin } from '../../plugins/static-asset'; import { GlobCopyWebpackPlugin } from '../../plugins/glob-copy-webpack-plugin'; import { WebpackConfigOptions } from '../webpack-config'; @@ -108,6 +109,10 @@ export function getProdConfig(wco: WebpackConfigOptions) { } } + extraPlugins.push(new BundleBudgetPlugin({ + budgets: appConfig.budgets + })); + if (buildOptions.extractLicenses) { extraPlugins.push(new LicenseWebpackPlugin({ pattern: /^(MIT|ISC|BSD.*)$/, diff --git a/packages/@angular/cli/plugins/bundle-budget.ts b/packages/@angular/cli/plugins/bundle-budget.ts new file mode 100644 index 000000000000..3ce0b7f77ee0 --- /dev/null +++ b/packages/@angular/cli/plugins/bundle-budget.ts @@ -0,0 +1,129 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import { Budget, calculateBytes, calculateSizes } from '../utilities/bundle-calculator'; + +interface Thresholds { + maximumWarning?: number; + maximumError?: number; + minimumWarning?: number; + minimumError?: number; + warningLow?: number; + warningHigh?: number; + errorLow?: number; + errorHigh?: number; +} + +export interface BundleBudgetPluginOptions { + budgets: Budget[]; +} + +export class BundleBudgetPlugin { + constructor(private options: BundleBudgetPluginOptions) {} + + apply(compiler: any): void { + const { budgets } = this.options; + compiler.plugin('after-emit', (compilation: any, cb: Function) => { + if (!budgets || budgets.length === 0) { + cb(); + return; + } + + budgets.map(budget => { + const thresholds = this.calcualte(budget); + return { + budget, + thresholds, + sizes: calculateSizes(budget, compilation) + }; + }) + .forEach(budgetCheck => { + budgetCheck.sizes.forEach(size => { + if (budgetCheck.thresholds.maximumWarning) { + if (budgetCheck.thresholds.maximumWarning < size.size) { + compilation.warnings.push(`budgets, maximum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.maximumError) { + if (budgetCheck.thresholds.maximumError < size.size) { + compilation.errors.push(`budgets, maximum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.minimumWarning) { + if (budgetCheck.thresholds.minimumWarning > size.size) { + compilation.warnings.push(`budgets, minimum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.minimumError) { + if (budgetCheck.thresholds.minimumError > size.size) { + compilation.errors.push(`budgets, minimum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.warningLow) { + if (budgetCheck.thresholds.warningLow > size.size) { + compilation.warnings.push(`budgets, minimum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.warningHigh) { + if (budgetCheck.thresholds.warningHigh < size.size) { + compilation.warnings.push(`budgets, maximum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.errorLow) { + if (budgetCheck.thresholds.errorLow > size.size) { + compilation.errors.push(`budgets, minimum exceeded for ${size.label}.`); + } + } + if (budgetCheck.thresholds.errorHigh) { + if (budgetCheck.thresholds.errorHigh < size.size) { + compilation.errors.push(`budgets, maximum exceeded for ${size.label}.`); + } + } + }); + + }); + cb(); + }); + } + + private calcualte(budget: Budget): Thresholds { + let thresholds: Thresholds = {}; + if (budget.maximumWarning) { + thresholds.maximumWarning = calculateBytes(budget.maximumWarning, budget.baseline, 'pos'); + } + + if (budget.maximumError) { + thresholds.maximumError = calculateBytes(budget.maximumError, budget.baseline, 'pos'); + } + + if (budget.minimumWarning) { + thresholds.minimumWarning = calculateBytes(budget.minimumWarning, budget.baseline, 'neg'); + } + + if (budget.minimumError) { + thresholds.minimumError = calculateBytes(budget.minimumError, budget.baseline, 'neg'); + } + + if (budget.warning) { + thresholds.warningLow = calculateBytes(budget.warning, budget.baseline, 'neg'); + } + + if (budget.warning) { + thresholds.warningHigh = calculateBytes(budget.warning, budget.baseline, 'pos'); + } + + if (budget.error) { + thresholds.errorLow = calculateBytes(budget.error, budget.baseline, 'neg'); + } + + if (budget.error) { + thresholds.errorHigh = calculateBytes(budget.error, budget.baseline, 'pos'); + } + + return thresholds; + } +} diff --git a/packages/@angular/cli/plugins/webpack.ts b/packages/@angular/cli/plugins/webpack.ts index f590c5030412..c834b494a23d 100644 --- a/packages/@angular/cli/plugins/webpack.ts +++ b/packages/@angular/cli/plugins/webpack.ts @@ -2,6 +2,7 @@ export { BaseHrefWebpackPlugin } from '../lib/base-href-webpack/base-href-webpack-plugin'; export { CleanCssWebpackPlugin, CleanCssWebpackPluginOptions } from './cleancss-webpack-plugin'; export { GlobCopyWebpackPlugin, GlobCopyWebpackPluginOptions } from './glob-copy-webpack-plugin'; +export { BundleBudgetPlugin, BundleBudgetPluginOptions } from './bundle-budget'; export { NamedLazyChunksWebpackPlugin } from './named-lazy-chunks-webpack-plugin'; export { ScriptsWebpackPlugin, ScriptsWebpackPluginOptions } from './scripts-webpack-plugin'; export { SuppressExtractedTextChunksWebpackPlugin } from './suppress-entry-chunks-webpack-plugin'; diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index bd475f3bd0bf..b89b1ee2d0f1 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -90,6 +90,15 @@ class JsonWebpackSerializer { }; } + private _bundleBudgetPluginSerialize(value: any): any { + console.log('VALUE!!!'); + console.log(value); + let budgets = value.options.budgets; + return { + budgets + }; + } + private _insertConcatAssetsWebpackPluginSerialize(value: any): any { return value.entryNames; } @@ -200,6 +209,10 @@ class JsonWebpackSerializer { args = this._globCopyWebpackPluginSerialize(plugin); this._addImport('@angular/cli/plugins/webpack', 'GlobCopyWebpackPlugin'); break; + case angularCliPlugins.BundleBudgetPlugin: + args = this._bundleBudgetPluginSerialize(plugin); + this._addImport('@angular/cli/plugins/webpack', 'BundleBudgetPlugin'); + break; case angularCliPlugins.InsertConcatAssetsWebpackPlugin: args = this._insertConcatAssetsWebpackPluginSerialize(plugin); this._addImport('@angular/cli/plugins/webpack', 'InsertConcatAssetsWebpackPlugin'); diff --git a/packages/@angular/cli/utilities/bundle-calculator.ts b/packages/@angular/cli/utilities/bundle-calculator.ts new file mode 100644 index 000000000000..6a048f6f51ea --- /dev/null +++ b/packages/@angular/cli/utilities/bundle-calculator.ts @@ -0,0 +1,204 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +export type BudgetType = 'all' | 'allScript' | 'any' | 'anyScript' | 'bundle' | 'initial'; + +export interface Budget { + /** + * The type of budget + */ + type: BudgetType; + /** + * The name of the bundle + */ + name?: string; + /** + * The baseline size for comparison. + */ + baseline?: string; + /** + * The maximum threshold for warning relative to the baseline. + */ + maximumWarning?: string; + /** + * The maximum threshold for error relative to the baseline. + */ + maximumError?: string; + /** + * The minimum threshold for warning relative to the baseline. + */ + minimumWarning?: string; + /** + * The minimum threshold for error relative to the baseline. + */ + minimumError?: string; + /** + * The threshold for warning relative to the baseline (min & max). + */ + warning?: string; + /** + * The threshold for error relative to the baseline (min & max). + */ + error?: string; +} + +export interface Compilation { + assets: any; + chunks: any[]; + warnings: string[]; + errors: string[]; +} + +export interface Size { + size: number; + label?: string; +} + +export function calculateSizes(budget: Budget, compilation: Compilation): Size[] { + const calculatorMap = { + all: AllCalculator, + allScript: AllScriptCalculator, + any: AnyCalculator, + anyScript: AnyScriptCalculator, + bundle: BundleCalculator, + initial: InitialCalculator, + }; + const ctor = calculatorMap[budget.type]; + const calculator = new ctor(budget, compilation); + return calculator.calculate(); +} + +export abstract class Calculator { + constructor (protected budget: Budget, protected compilation: Compilation) {} + + abstract calculate(): Size[]; +} + +/** + * A named bundle. + */ +class BundleCalculator extends Calculator { + calculate() { + const size: number = this.compilation.chunks + .filter(chunk => chunk.name === this.budget.name) + .reduce((files, chunk) => [...files, ...chunk.files], []) + .map((file: string) => this.compilation.assets[file].size()) + .reduce((total: number, size: number) => total + size, 0); + return [{size, label: this.budget.name}]; + } +} + +/** + * The sum of all initial chunks (marked as initial by webpack). + */ +class InitialCalculator extends Calculator { + calculate() { + const initialChunks = this.compilation.chunks.filter(chunk => chunk.isInitial); + const size: number = initialChunks + .reduce((files, chunk) => [...files, ...chunk.files], []) + .map((file: string) => this.compilation.assets[file].size()) + .reduce((total: number, size: number) => total + size, 0); + return [{size, label: 'initial'}]; + } +} + +/** + * The sum of all the scripts portions. + */ +class AllScriptCalculator extends Calculator { + calculate() { + const size: number = Object.keys(this.compilation.assets) + .filter(key => /\.js$/.test(key)) + .map(key => this.compilation.assets[key]) + .map(asset => asset.size()) + .reduce((total: number, size: number) => total + size, 0); + return [{size, label: 'total scripts'}]; + } +} + +/** + * All scripts and assets added together. + */ +class AllCalculator extends Calculator { + calculate() { + const size: number = Object.keys(this.compilation.assets) + .map(key => this.compilation.assets[key].size()) + .reduce((total: number, size: number) => total + size, 0); + return [{size, label: 'total'}]; + } +} + +/** + * Any script, individually. + */ +class AnyScriptCalculator extends Calculator { + calculate() { + return Object.keys(this.compilation.assets) + .filter(key => /\.js$/.test(key)) + .map(key => { + const asset = this.compilation.assets[key]; + return { + size: asset.size(), + label: key + }; + }); + } +} + +/** + * Any script or asset (images, css, etc). + */ +class AnyCalculator extends Calculator { + calculate() { + return Object.keys(this.compilation.assets) + .map(key => { + const asset = this.compilation.assets[key]; + return { + size: asset.size(), + label: key + }; + }); + } +} + +/** + * Calculate the bytes given a string value. + */ +export function calculateBytes(val: string, baseline?: string, factor?: ('pos' | 'neg')): number { + if (/^\d+$/.test(val)) { + return parseFloat(val); + } + + if (/^(\d+)%$/.test(val)) { + return calculatePercentBytes(val, baseline, factor); + } + + const multiplier = getMultiplier(val); + + const numberVal = parseFloat(val.replace(/((k|m|M|)b?)$/, '')); + const baselineVal = baseline ? parseFloat(baseline.replace(/((k|m|M|)b?)$/, '')) : 0; + const baselineMultiplier = baseline ? getMultiplier(baseline) : 1; + const factorMultiplier = factor ? (factor === 'pos' ? 1 : -1) : 1; + + return numberVal * multiplier + baselineVal * baselineMultiplier * factorMultiplier; +} + +function getMultiplier(val?: string): number { + if (/^(\d+)b?$/.test(val)) { + return 1; + } else if (/^(\d+)kb$/.test(val)) { + return 1000; + } else if (/^(\d+)(m|M)b$/.test(val)) { + return 1000 * 1000; + } +} + +function calculatePercentBytes(val: string, baseline?: string, factor?: ('pos' | 'neg')): number { + const baselineBytes = calculateBytes(baseline); + const percentage = parseFloat(val.replace(/%/g, '')); + return baselineBytes + baselineBytes * percentage / 100 * (factor === 'pos' ? 1 : -1); +} diff --git a/tests/acceptance/bundle-calculator.spec.ts b/tests/acceptance/bundle-calculator.spec.ts new file mode 100644 index 000000000000..d60ac083ac3a --- /dev/null +++ b/tests/acceptance/bundle-calculator.spec.ts @@ -0,0 +1,86 @@ +import * as path from 'path'; +import { calculateBytes, calculateSizes } from '@angular/cli/utilities/bundle-calculator'; +import mockFs = require('mock-fs'); + + +describe('bundle calculator', () => { + describe('calculateBytes', () => { + const kb = (n: number) => n * 1000; + const mb = (n: number) => n * 1000 * 1000; + const scenarios: any[] = [ + { expect: 1, val: '1' }, + { expect: 1, val: '1b' }, + { expect: kb(1), val: '1kb' }, + { expect: mb(1), val: '1mb' }, + { expect: 110, val: '100b', baseline: '10', factor: 'pos' }, + { expect: 110, val: '100b', baseline: '10b', factor: 'pos' }, + { expect: 90, val: '100b', baseline: '10', factor: 'neg' }, + { expect: 90, val: '100b', baseline: '10b', factor: 'neg' }, + { expect: 15, val: '50%', baseline: '10', factor: 'pos' }, + { expect: 5, val: '50%', baseline: '10', factor: 'neg' }, + { expect: kb(50) + mb(1), val: '50kb', baseline: '1mb', factor: 'pos' }, + { expect: mb(1.25), val: '25%', baseline: '1mb', factor: 'pos' }, + { expect: mb(0.75), val: '25%', baseline: '1mb', factor: 'neg' }, + ]; + scenarios.forEach(s => { + const specMsg = `${s.val} => ${s.expect}`; + const baselineMsg = s.baseline ? ` (baseline: ${s.baseline})` : ``; + const factor = s.factor ? ` (factor: ${s.factor})` : ``; + it(`should calculateBytes ${specMsg}${baselineMsg}${factor}`, () => { + const result = calculateBytes(s.val, s.baseline, s.factor); + expect(s.expect).toEqual(result); + }); + }); + }); + + describe('calculateSizes', () => { + let compilation: any; + beforeEach(() => { + compilation = { + assets: { + 'asset1.js': { size: () => 1 }, + 'asset2': { size: () => 2 }, + 'asset3.js': { size: () => 4 }, + 'asset4': { size: () => 8 }, + 'asset5': { size: () => 16 }, + }, + chunks: [ + { name: 'chunk1', files: ['asset1.js'], isInitial: true }, + { name: 'chunk2', files: ['asset2'], isInitial: false }, + { name: 'chunk3', files: ['asset3.js', 'asset4'], isInitial: false } + ] + }; + }); + + const scenarios: any[] = [ + { expect: [{size: 31, label: 'total'}], budget: { type: 'all' } }, + { expect: [{size: 5, label: 'total scripts'}], budget: { type: 'allScript' } }, + { expect: [ + {size: 1, label: 'asset1.js'}, + {size: 2, label: 'asset2'}, + {size: 4, label: 'asset3.js'}, + {size: 8, label: 'asset4'}, + {size: 16, label: 'asset5'}, + ], budget: { type: 'any' } }, + { expect: [ + {size: 1, label: 'asset1.js'}, + {size: 4, label: 'asset3.js'}, + ], budget: { type: 'anyScript' } }, + { expect: [{size: 2, label: 'chunk2'}], budget: { type: 'bundle', name: 'chunk2' } }, + { expect: [{size: 12, label: 'chunk3'}], budget: { type: 'bundle', name: 'chunk3' } }, + { expect: [{size: 1, label: 'initial'}], budget: { type: 'initial' } }, + ]; + + scenarios.forEach(s => { + const budgetName = s.budget.name ? ` (${s.budget.name})` : ''; + it(`should calulate sizes for ${s.budget.type}${budgetName}`, () => { + const sizes = calculateSizes(s.budget, compilation); + expect(sizes.length).toEqual(s.expect.length); + for (let i = 0; i < sizes.length; i++) { + expect(sizes[i].size).toEqual((s.expect[i].size)); + expect(sizes[i].label).toEqual((s.expect[i].label)); + } + }); + }); + }); +}); diff --git a/tests/e2e/tests/build/bundle-budgets.ts b/tests/e2e/tests/build/bundle-budgets.ts new file mode 100644 index 000000000000..92d35a51b557 --- /dev/null +++ b/tests/e2e/tests/build/bundle-budgets.ts @@ -0,0 +1,74 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { getGlobalVariable } from '../../utils/env'; +import { ng } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; +import { expectToFail } from '../../utils/utils'; + +// tslint:disable:max-line-length +export default function () { + const budgetConfigs = [ + { + expectation: 'pass', + message: 'BIG max for all, should not error', + budget: { type: 'allScript', maximumError: '100mb' }, + }, + { + expectation: 'error', + message: 'Budget error: all, max error', + budget: { type: 'all', maximumError: '100b' }, + }, + { + expectation: 'warning', + message: 'Budget warning: all, min warning', + budget: { type: 'all', minimumWarning: '100mb' }, + } + ]; + + const promiseFactories = budgetConfigs.map(cfg => { + if (cfg.expectation === 'error') { + return () => { + return updateJsonFile('.angular-cli.json', (json) => { json.apps[0].budgets = [cfg.budget]; }) + .then(() => expectToFail(() => ng('build', '--prod'))) + .then(errorMessage => { + if (!/ERROR in budgets/.test(errorMessage)) { + throw new Error(cfg.message); + } + }); + }; + } else if (cfg.expectation === 'warning') { + return () => { + return updateJsonFile('.angular-cli.json', (json) => { json.apps[0].budgets = [cfg.budget]; }) + .then(() => ng('build', '--prod')) + .then(({ stdout }) => { + if (!/WARNING in budgets/.test(stdout)) { + throw new Error(cfg.message); + } + }); + }; + } else { // pass + return () => { + return updateJsonFile('.angular-cli.json', (json) => { json.apps[0].budgets = [cfg.budget]; }) + .then(() => ng('build', '--prod')) + .then(({ stdout }) => { + if (/(WARNING|ERROR)/.test(stdout)) { + throw new Error(cfg.message); + } + }); + }; + } + }); + + let promiseChain = Promise.resolve(); + for (let i = 0; i < promiseFactories.length; i++) { + promiseChain = promiseChain.then(promiseFactories[i]); + } + + return promiseChain; +} From cd4eb34177e3f47753cec02cccae4617452f67e8 Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Thu, 18 Jan 2018 16:23:32 -0800 Subject: [PATCH 110/115] fix(@angular/cli): fix dependencies to devkit to known working versions --- package-lock.json | 69 ++++++++++++------------------ package.json | 10 ++--- packages/@angular/cli/package.json | 8 ++-- 3 files changed, 36 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8480224d11b8..f4d6c8bef1db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.37.tgz", - "integrity": "sha512-446XvQosYWGG7OJGTqkXg39pHwqywLv03X+sewHOfqYqlTYD4/A7PxHCDB9qnLSwVz1DBRCbY0FJCfx5aYGakA==", + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.41.tgz", + "integrity": "sha512-TYolYpR3cb3rZGMqHBc1Q4r6SwhvuTF9sDt3gARy9Tli5R3BwY8bRA3evHQhhM0cb4AbBaJVgQYdJm5FURNn6g==", "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", @@ -23,12 +23,13 @@ } }, "@angular-devkit/core": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.24.tgz", - "integrity": "sha512-abYk+YbDGnt/LSCDDI2CvJpIPaQGbvHjQc9hqK9KLZP5ZoxoRAqVV4K3POjatrE6l1ok83x3dVlt7Habxm6+Xg==", + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.28.tgz", + "integrity": "sha512-rfGRVdpx080zZq9NGZ3RNG+cmoq/ZPaCzpM4dAbosEM46ficUkwr/JKjhjZUUoSyb9ItrT1lp9C33GfE/YpSVQ==", "requires": { "ajv": "5.5.2", "chokidar": "1.7.0", + "rxjs": "5.5.6", "source-map": "0.5.7" }, "dependencies": { @@ -46,12 +47,12 @@ } }, "@angular-devkit/schematics": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.45.tgz", - "integrity": "sha512-lcuOEwfwN8zqH4lf3pmGa9NIWlvADuINjxDCtXIRwQc9PieeGmN56AMVTjFGk7SN+Wu+gPDMbL9wrBFM/u9z9g==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.51.tgz", + "integrity": "sha512-KGYiJpPgLqPvXeJzaHw/9JHAt8dL3EzyeYOAZ/gMKnPDA+7WypAta2n9ZuPVchY3G9p1XcqB5STJLvk7HQw3Cw==", "requires": { - "@angular-devkit/core": "0.0.24", - "@ngtools/json-schema": "1.1.0" + "@ngtools/json-schema": "1.1.0", + "rxjs": "5.5.6" } }, "@angular/compiler": { @@ -99,33 +100,17 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.12.tgz", - "integrity": "sha512-ETBjNR1gJZQvUgmpVhk4jDxVvpyOXzGFhX4SkDvmrJdQSOThQFZRL2+TdUNtT+PAtPx583i+ixxsjuK53tU5Ew==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.16.tgz", + "integrity": "sha512-SLzs5TmDLEO2/oU83uDw/x9jgBQTktNlO202kbawcqDKLekqgcZXnsl7UhoNdeCFOU9BE9dw07wWwuIzAhj9gQ==", "requires": { - "@angular-devkit/core": "0.0.24" + "typescript": "2.6.2" }, "dependencies": { - "@angular-devkit/core": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.24.tgz", - "integrity": "sha512-abYk+YbDGnt/LSCDDI2CvJpIPaQGbvHjQc9hqK9KLZP5ZoxoRAqVV4K3POjatrE6l1ok83x3dVlt7Habxm6+Xg==", - "requires": { - "ajv": "5.5.2", - "chokidar": "1.7.0", - "source-map": "0.5.7" - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" } } }, @@ -8422,11 +8407,11 @@ "dev": true }, "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", "requires": { - "symbol-observable": "1.0.4" + "symbol-observable": "1.0.1" } }, "safe-buffer": { @@ -9370,9 +9355,9 @@ } }, "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "sync-exec": { "version": "0.6.2", diff --git a/package.json b/package.json index cc536c47e72d..85a5c3c8dcea 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,10 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.37", - "@angular-devkit/core": "~0.0.24", - "@angular-devkit/schematics": "~0.0.45", - "@schematics/angular": "~0.1.12", + "@angular-devkit/build-optimizer": "~0.0.41", + "@angular-devkit/core": "~0.0.28", + "@angular-devkit/schematics": "~0.0.51", + "@schematics/angular": "~0.1.16", "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", @@ -81,7 +81,7 @@ "postcss-url": "^7.1.2", "raw-loader": "^0.5.1", "resolve": "^1.1.7", - "rxjs": "^5.5.2", + "rxjs": "^5.5.6", "sass-loader": "^6.0.6", "semver": "^5.3.0", "silent-error": "^1.0.0", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 18f2ac82c44c..55cca1e2ad63 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -27,12 +27,12 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/build-optimizer": "~0.0.37", - "@angular-devkit/core": "~0.0.24", - "@angular-devkit/schematics": "~0.0.45", + "@angular-devkit/build-optimizer": "~0.0.41", + "@angular-devkit/core": "~0.0.28", + "@angular-devkit/schematics": "~0.0.51", "@ngtools/json-schema": "1.1.0", "@ngtools/webpack": "1.10.0-beta.0", - "@schematics/angular": "~0.1.12", + "@schematics/angular": "~0.1.16", "autoprefixer": "^7.2.3", "chalk": "~2.2.0", "circular-dependency-plugin": "^4.2.1", From 1300ee74f0f82b096d981446fa2bd5b2fc23af39 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Thu, 18 Jan 2018 20:59:11 -0500 Subject: [PATCH 111/115] release: 1.7.0-beta.1 --- package-lock.json | 2 +- package.json | 2 +- packages/@angular/cli/package.json | 4 ++-- packages/@ngtools/webpack/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4d6c8bef1db..a5c1e1c01d45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.7.0-beta.0", + "version": "1.7.0-beta.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 85a5c3c8dcea..000a793edd7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.7.0-beta.0", + "version": "1.7.0-beta.1", "description": "CLI tool for Angular", "main": "packages/@angular/cli/lib/cli/index.js", "trackingCode": "UA-8594346-19", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index 55cca1e2ad63..4e4fc1d4bcd5 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -1,6 +1,6 @@ { "name": "@angular/cli", - "version": "1.7.0-beta.0", + "version": "1.7.0-beta.1", "description": "CLI tool for Angular", "main": "lib/cli/index.js", "trackingCode": "UA-8594346-19", @@ -31,7 +31,7 @@ "@angular-devkit/core": "~0.0.28", "@angular-devkit/schematics": "~0.0.51", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.10.0-beta.0", + "@ngtools/webpack": "1.10.0-beta.1", "@schematics/angular": "~0.1.16", "autoprefixer": "^7.2.3", "chalk": "~2.2.0", diff --git a/packages/@ngtools/webpack/package.json b/packages/@ngtools/webpack/package.json index 348d70fcb485..4b4b155b98ba 100644 --- a/packages/@ngtools/webpack/package.json +++ b/packages/@ngtools/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@ngtools/webpack", - "version": "1.10.0-beta.0", + "version": "1.10.0-beta.1", "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", From 66a376a0eb1d4bfdac2d5ba6ad4d7c3d0ba437e3 Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Fri, 19 Jan 2018 11:48:35 -0500 Subject: [PATCH 112/115] fix(@angular/cli): Remove testing log message. --- packages/@angular/cli/tasks/eject.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/@angular/cli/tasks/eject.ts b/packages/@angular/cli/tasks/eject.ts index b89b1ee2d0f1..9f9ac2b171c4 100644 --- a/packages/@angular/cli/tasks/eject.ts +++ b/packages/@angular/cli/tasks/eject.ts @@ -91,8 +91,6 @@ class JsonWebpackSerializer { } private _bundleBudgetPluginSerialize(value: any): any { - console.log('VALUE!!!'); - console.log(value); let budgets = value.options.budgets; return { budgets From d3db0f6c6c2c0970bbea43985a98012629ef3f22 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 18 Jan 2018 21:02:34 -0500 Subject: [PATCH 113/115] test: fix ng2 test with new test.ts --- tests/e2e/utils/project.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/e2e/utils/project.ts b/tests/e2e/utils/project.ts index 233e8b390336..446375fab4fd 100644 --- a/tests/e2e/utils/project.ts +++ b/tests/e2e/utils/project.ts @@ -140,7 +140,7 @@ export function useCIDefaults() { sourcemaps: false, progress: false }; - }) + }); } export function useCIChrome() { @@ -276,14 +276,22 @@ export function useNg2() { Object.keys(ng2Deps['devDependencies']).forEach(pkgName => { json['devDependencies'][pkgName] = ng2Deps['devDependencies'][pkgName]; }); - console.log(JSON.stringify(json)) + console.log(JSON.stringify(json)); })) .then(() => updateJsonFile('src/tsconfig.app.json', json => Object.assign(json, tsconfigAppJson))) .then(() => updateJsonFile('src/tsconfig.spec.json', json => Object.assign(json, tsconfigSpecJson))) .then(() => updateJsonFile('e2e/tsconfig.e2e.json', json => - Object.assign(json, tsconfigE2eJson))); + Object.assign(json, tsconfigE2eJson))) + .then(() => replaceInFile('src/test.ts', 'import \'zone.js/dist/zone-testing\';', ` + import 'zone.js/dist/long-stack-trace-zone'; + import 'zone.js/dist/proxy.js'; + import 'zone.js/dist/sync-test'; + import 'zone.js/dist/jasmine-patch'; + import 'zone.js/dist/async-test'; + import 'zone.js/dist/fake-async-test'; + `)); } // Convert a Angular 5 project to Angular 4. @@ -315,6 +323,6 @@ export function useNg4() { Object.keys(ng4Deps['devDependencies']).forEach(pkgName => { json['devDependencies'][pkgName] = ng4Deps['devDependencies'][pkgName]; }); - console.log(JSON.stringify(json)) + console.log(JSON.stringify(json)); })); } From 554908e2459d60ee4988703667fb826b26cabcec Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Mon, 22 Jan 2018 11:36:02 -0800 Subject: [PATCH 114/115] fix(@angular/cli): allow for schema-less schematics to be generated --- packages/@angular/cli/commands/generate.ts | 10 +++++++--- .../@angular/cli/tasks/schematic-get-help-output.ts | 9 +++++++-- packages/@angular/cli/tasks/schematic-get-options.ts | 6 +++++- packages/@angular/cli/tasks/schematic-run.ts | 4 +++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/@angular/cli/commands/generate.ts b/packages/@angular/cli/commands/generate.ts index 5229cbf1756b..3e2a3a198fb7 100644 --- a/packages/@angular/cli/commands/generate.ts +++ b/packages/@angular/cli/commands/generate.ts @@ -112,8 +112,12 @@ export default Command.extend({ .then((availableOptions: SchematicAvailableOptions[]) => { let anonymousOptions: string[] = []; - const nameOption = availableOptions.filter(opt => opt.name === 'name')[0]; - if (nameOption) { + if (availableOptions) { + const nameOption = availableOptions.filter(opt => opt.name === 'name')[0]; + if (nameOption) { + anonymousOptions = [...anonymousOptions, '']; + } + } else { anonymousOptions = [...anonymousOptions, '']; } @@ -123,7 +127,7 @@ export default Command.extend({ this.registerOptions({ anonymousOptions: anonymousOptions, - availableOptions: availableOptions + availableOptions: availableOptions || [] }); }); }, diff --git a/packages/@angular/cli/tasks/schematic-get-help-output.ts b/packages/@angular/cli/tasks/schematic-get-help-output.ts index 5b3e2b2171f4..2bdd9c054d34 100644 --- a/packages/@angular/cli/tasks/schematic-get-help-output.ts +++ b/packages/@angular/cli/tasks/schematic-get-help-output.ts @@ -1,7 +1,7 @@ import chalk from 'chalk'; const Task = require('../ember-cli/lib/models/task'); -const { cyan, grey } = chalk; +const { cyan, green, grey } = chalk; export interface SchematicGetHelpOptions { collectionName: string; @@ -40,7 +40,7 @@ export default Task.extend({ }), nonSchematicOptions]) .then(([availableOptions, nonSchematicOptions]: [SchematicAvailableOptions[], any[]]) => { const output: string[] = []; - [...(nonSchematicOptions || []), ...availableOptions] + [...(nonSchematicOptions || []), ...availableOptions || []] .filter(opt => hiddenOptions.indexOf(opt.name) === -1) .forEach(opt => { let text = cyan(` --${opt.name}`); @@ -63,6 +63,11 @@ export default Task.extend({ output.push(grey(` aliases: ${aliasText}`)); } }); + if (availableOptions === null) { + output.push(green('This schematic accept additional options, but did not provide ' + + 'documentation.')); + } + return output; }); } diff --git a/packages/@angular/cli/tasks/schematic-get-options.ts b/packages/@angular/cli/tasks/schematic-get-options.ts index 7f32a6ec51f6..44c28e580270 100644 --- a/packages/@angular/cli/tasks/schematic-get-options.ts +++ b/packages/@angular/cli/tasks/schematic-get-options.ts @@ -18,7 +18,7 @@ export interface SchematicAvailableOptions { } export default Task.extend({ - run: function (options: SchematicGetOptions): Promise { + run: function (options: SchematicGetOptions): Promise { const collectionName = options.collectionName || CliConfig.getValue('defaults.schematics.collection'); @@ -26,6 +26,10 @@ export default Task.extend({ const schematic = getSchematic(collection, options.schematicName); + if (!schematic.description.schemaJson) { + return Promise.resolve(null); + } + const properties = schematic.description.schemaJson.properties; const keys = Object.keys(properties); const availableOptions = keys diff --git a/packages/@angular/cli/tasks/schematic-run.ts b/packages/@angular/cli/tasks/schematic-run.ts index b5dd99170799..b49ddee6fa71 100644 --- a/packages/@angular/cli/tasks/schematic-run.ts +++ b/packages/@angular/cli/tasks/schematic-run.ts @@ -168,8 +168,10 @@ export default Task.extend({ }); function prepOptions(schematic: Schematic<{}, {}>, options: SchematicOptions): SchematicOptions { + const properties = (schematic.description).schemaJson + ? (schematic.description).schemaJson.properties + : options; - const properties = (schematic.description).schemaJson.properties; const keys = Object.keys(properties); if (['component', 'c', 'directive', 'd'].indexOf(schematic.description.name) !== -1) { options.prefix = (options.prefix === 'false' || options.prefix === '') From ca8e8344f7dbd074ba9fff3bbf177093dfff42f3 Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Mon, 22 Jan 2018 11:46:03 -0800 Subject: [PATCH 115/115] fix(@angular/cli): allow colon separated schematic name in generate --- packages/@angular/cli/commands/generate.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/@angular/cli/commands/generate.ts b/packages/@angular/cli/commands/generate.ts index 3e2a3a198fb7..b8337be48a5b 100644 --- a/packages/@angular/cli/commands/generate.ts +++ b/packages/@angular/cli/commands/generate.ts @@ -65,15 +65,24 @@ export default Command.extend({ '' ], - getCollectionName(rawArgs: string[]) { + getCollectionName(rawArgs: string[], parsedOptions?: { collection?: string }): [string, string] { + let schematicName = rawArgs[0]; let collectionName = CliConfig.getValue('defaults.schematics.collection'); - if (rawArgs) { + + if (schematicName.match(/:/)) { + [collectionName, schematicName] = schematicName.split(':', 2); + } else if (parsedOptions) { + if (parsedOptions.collection) { + collectionName = parsedOptions.collection; + } + } else { const parsedArgs = this.parseArgs(rawArgs, false); if (parsedArgs.options.collection) { collectionName = parsedArgs.options.collection; } } - return collectionName; + + return [collectionName, schematicName]; }, beforeRun: function(rawArgs: string[]) { @@ -83,7 +92,7 @@ export default Command.extend({ return; } - const schematicName = rawArgs[0]; + const [collectionName, schematicName] = this.getCollectionName(rawArgs); if (!schematicName) { return Promise.reject(new SilentError(oneLine` The "ng generate" command requires a @@ -103,7 +112,6 @@ export default Command.extend({ ui: this.ui, project: this.project }); - const collectionName = this.getCollectionName(rawArgs); return getOptionsTask.run({ schematicName, @@ -166,7 +174,7 @@ export default Command.extend({ : commandOptions.path; const cwd = this.project.root; - const schematicName = rawArgs[0]; + const [collectionName, schematicName] = this.getCollectionName(rawArgs, commandOptions); if (['component', 'c', 'directive', 'd'].indexOf(schematicName) !== -1) { if (commandOptions.prefix === undefined) { @@ -185,8 +193,6 @@ export default Command.extend({ ui: this.ui, project: this.project }); - const collectionName = commandOptions.collection || - CliConfig.getValue('defaults.schematics.collection'); if (collectionName === '@schematics/angular' && schematicName === 'interface' && rawArgs[2]) { commandOptions.type = rawArgs[2];