From a1bc9f08d0e4f8ab4e718040bc3ae0eddac4a764 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 9 May 2018 20:35:03 +0100 Subject: [PATCH] fix(@angular/cli): clean up architect options Fix https://github.com/angular/angular-cli/issues/10699 --- package-lock.json | 184 +++++++++--------- packages/@angular/cli/commands/build.ts | 29 +-- packages/@angular/cli/commands/e2e.ts | 25 +-- packages/@angular/cli/commands/lint.ts | 17 +- packages/@angular/cli/commands/run.ts | 17 +- packages/@angular/cli/commands/serve.ts | 28 +-- packages/@angular/cli/commands/test.ts | 26 +-- packages/@angular/cli/commands/xi18n.ts | 17 +- .../@angular/cli/models/architect-command.ts | 88 ++++++--- 9 files changed, 178 insertions(+), 253 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1b68da9059c..9b4667b6288a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,14 +5,14 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "github:angular/angular-devkit-architect-builds#a4a9c4ee85a00cd64af51a6676df3bdfc7cd8f1e", + "version": "github:angular/angular-devkit-architect-builds#6a0dd41749f6f875170dd781e3b78df20f018b9f", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "rxjs": "6.0.0" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", @@ -23,13 +23,13 @@ } }, "@angular-devkit/build-angular": { - "version": "github:angular/angular-devkit-build-angular-builds#c50cf32655e1823aed09595695748ea84833ec8d", + "version": "github:angular/angular-devkit-build-angular-builds#005cd682fb3146c5252d60074593f1058d0fddf6", "dev": true, "requires": { - "@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#a4a9c4ee85a00cd64af51a6676df3bdfc7cd8f1e", - "@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#315a47db4f794c7d51ecc02eb984a3bb688cc905", - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", - "@ngtools/webpack": "github:angular/ngtools-webpack-builds#393b3863668a8c0503191a46f292c0ba874a81dd", + "@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#6a0dd41749f6f875170dd781e3b78df20f018b9f", + "@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#dfaf3599b14317f4dc8b09f3f938ba15a11399cd", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", + "@ngtools/webpack": "github:angular/ngtools-webpack-builds#f19099f7ee6071799222f1f54f3687916afd9ba4", "ajv": "6.4.0", "autoprefixer": "8.4.1", "cache-loader": "1.2.2", @@ -42,8 +42,8 @@ "html-webpack-plugin": "3.2.0", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "3.0.1", - "karma-source-map-support": "1.2.0", - "less": "3.0.2", + "karma-source-map-support": "1.3.0", + "less": "3.0.4", "less-loader": "4.1.0", "license-webpack-plugin": "1.3.1", "lodash": "4.17.5", @@ -56,7 +56,7 @@ "portfinder": "1.0.13", "postcss": "6.0.22", "postcss-import": "11.1.0", - "postcss-loader": "2.1.4", + "postcss-loader": "2.1.5", "postcss-url": "7.3.2", "raw-loader": "0.5.1", "resolve": "1.6.0", @@ -80,15 +80,15 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "github:angular/angular-devkit-architect-builds#a4a9c4ee85a00cd64af51a6676df3bdfc7cd8f1e", + "version": "github:angular/angular-devkit-architect-builds#6a0dd41749f6f875170dd781e3b78df20f018b9f", "dev": true, "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "rxjs": "6.0.0" } }, "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "dev": true, "requires": { "ajv": "6.4.0", @@ -100,7 +100,7 @@ } }, "@angular-devkit/build-optimizer": { - "version": "github:angular/angular-devkit-build-optimizer-builds#315a47db4f794c7d51ecc02eb984a3bb688cc905", + "version": "github:angular/angular-devkit-build-optimizer-builds#dfaf3599b14317f4dc8b09f3f938ba15a11399cd", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -118,7 +118,7 @@ } }, "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", @@ -127,14 +127,14 @@ } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#3027cbb09585defd80c4a8fe17f0a4c21878d843", + "version": "github:angular/angular-devkit-schematics-builds#a1dc7c3c8c4343d4f8202d56f16965f6a41bf551", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "rxjs": "6.0.0" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", @@ -151,16 +151,16 @@ "dev": true }, "@ngtools/webpack": { - "version": "github:angular/ngtools-webpack-builds#393b3863668a8c0503191a46f292c0ba874a81dd", + "version": "github:angular/ngtools-webpack-builds#f19099f7ee6071799222f1f54f3687916afd9ba4", "dev": true, "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "tree-kill": "1.2.0", "webpack-sources": "1.1.0" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "dev": true, "requires": { "ajv": "6.4.0", @@ -172,15 +172,15 @@ } }, "@schematics/angular": { - "version": "github:angular/schematics-angular-builds#8f384b4c5c7d84d1bc7a4988212c8831540d81d8", + "version": "github:angular/schematics-angular-builds#ebc68cee7933622c9c6b9c14c3c411d59c115f8f", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", - "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#3027cbb09585defd80c4a8fe17f0a4c21878d843", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", + "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#a1dc7c3c8c4343d4f8202d56f16965f6a41bf551", "typescript": "2.7.2" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", @@ -189,9 +189,9 @@ } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#3027cbb09585defd80c4a8fe17f0a4c21878d843", + "version": "github:angular/angular-devkit-schematics-builds#a1dc7c3c8c4343d4f8202d56f16965f6a41bf551", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "rxjs": "6.0.0" } }, @@ -203,10 +203,10 @@ } }, "@schematics/update": { - "version": "github:angular/schematics-update-builds#d970bbfa1640ccaf0d05316e61e0d3ae11b8e2c1", + "version": "github:angular/schematics-update-builds#04436bfd52e85172c7c809c8511aaa24887c1d34", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", - "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#3027cbb09585defd80c4a8fe17f0a4c21878d843", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", + "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#a1dc7c3c8c4343d4f8202d56f16965f6a41bf551", "npm-registry-client": "8.5.1", "rxjs": "6.0.0", "semver": "5.5.0", @@ -214,7 +214,7 @@ }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "version": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", @@ -223,9 +223,9 @@ } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#3027cbb09585defd80c4a8fe17f0a4c21878d843", + "version": "github:angular/angular-devkit-schematics-builds#a1dc7c3c8c4343d4f8202d56f16965f6a41bf551", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#1a111c8bcb1bc9a2eb0899b768eb2074ba174eb9", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#e209ba708b628f33d858a6913244e5aa39afa882", "rxjs": "6.0.0" } } @@ -693,7 +693,7 @@ "dev": true, "requires": { "browserslist": "3.2.6", - "caniuse-lite": "1.0.30000833", + "caniuse-lite": "1.0.30000836", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "6.0.22", @@ -1116,7 +1116,7 @@ "integrity": "sha512-XCsMSg9V4S1VRdcp265dJ+8kBRjfuFXcavbisY7G6T9QI0H1Z24PP53vvs0WDYWqm38Mco1ILDtafcS8ZR4xiw==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000833", + "caniuse-lite": "1.0.30000836", "electron-to-chromium": "1.3.45" } }, @@ -1268,9 +1268,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000833", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000833.tgz", - "integrity": "sha512-tKNuKu4WLImh4NxoTgntxFpDrRiA0Q6Q1NycNhuMST0Kx+Pt8YnRDW6V8xsyH6AtO2CpAoibatEk5eaEhP3O1g==", + "version": "1.0.30000836", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000836.tgz", + "integrity": "sha512-DlVR8sVTKDgd7t95U0shX3g7MeJ/DOjKOhUcaiXqnVmnO5sG4Tn2rLVOkVfPUJgnQNxnGe8/4GK0dGSI+AagQw==", "dev": true }, "caseless": { @@ -2005,9 +2005,9 @@ } }, "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -2078,7 +2078,7 @@ "requires": { "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", + "create-ecdh": "4.0.3", "create-hash": "1.2.0", "create-hmac": "1.1.7", "diffie-hellman": "5.0.3", @@ -2534,9 +2534,9 @@ "dev": true }, "ejs": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", - "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", "dev": true }, "electron-to-chromium": { @@ -4586,7 +4586,7 @@ "he": "1.1.1", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.3.23" + "uglify-js": "3.3.24" }, "dependencies": { "source-map": { @@ -4596,9 +4596,9 @@ "dev": true }, "uglify-js": { - "version": "3.3.23", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz", - "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==", + "version": "3.3.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", + "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", "dev": true, "requires": { "commander": "2.15.1", @@ -5501,23 +5501,12 @@ } }, "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "source-map-support": "0.4.18" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - } + "source-map-support": "0.5.5" } }, "killable": { @@ -5551,9 +5540,9 @@ } }, "less": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.0.2.tgz", - "integrity": "sha512-konnFwWXpUQwzuwyN3Zfw/2Ziah2BKzqTfGoHBZjJdQWCmR+yrjmIG3QLwnlXNFWz27QetOmhGNSbHgGRdqhYQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/less/-/less-3.0.4.tgz", + "integrity": "sha512-q3SyEnPKbk9zh4l36PGeW2fgynKu+FpbhiUNx/yaiBUQ3V0CbACCgb9FzYWcRgI2DJlP6eI4jc8XPrCTi55YcQ==", "dev": true, "requires": { "errno": "0.1.7", @@ -5563,7 +5552,16 @@ "mkdirp": "0.5.1", "promise": "7.3.1", "request": "2.85.0", - "source-map": "0.5.7" + "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==", + "dev": true, + "optional": true + } } }, "less-loader": { @@ -5702,7 +5700,7 @@ "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", "dev": true, "requires": { - "ejs": "2.5.9" + "ejs": "2.6.1" } }, "load-json-file": { @@ -7366,9 +7364,9 @@ } }, "postcss-loader": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.4.tgz", - "integrity": "sha512-L2p654oK945B/gDFUGgOhh7uzj19RWoY1SVMeJVoKno1H2MdbQ0RppR/28JGju4pMb22iRC7BJ9aDzbxXSLf4A==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz", + "integrity": "sha512-pV7kB5neJ0/1tZ8L1uGOBNTVBCSCXQoIsZMsrwvO8V2rKGa2tBl/f80GGVxow2jJnRJ2w1ocx693EKhZAb9Isg==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -9350,6 +9348,30 @@ "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", "dev": true }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -9385,27 +9407,11 @@ "worker-farm": "1.6.0" }, "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - } } } }, diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index 744f405f191f..5851a7448ba2 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -1,12 +1,6 @@ -import { ArchitectCommand } from '../models/architect-command'; import { Option, CommandScope } from '../models/command'; import { Version } from '../upgrade/version'; - -export interface Options { - project?: string; - configuration?: string; - prod: boolean; -} +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; export default class BuildCommand extends ArchitectCommand { public readonly name = 'build'; @@ -20,29 +14,14 @@ export default class BuildCommand extends ArchitectCommand { this.configurationOption ]; - public validate(options: Options) { + public validate(options: ArchitectCommandOptions) { // Check Angular and TypeScript versions. Version.assertCompatibleAngularVersion(this.project.root); Version.assertTypescriptVersion(this.project.root); return super.validate(options); } - public async run(options: Options) { - let configuration = options.configuration; - if (!configuration && options.prod) { - configuration = 'production'; - } - - const overrides = { ...options }; - delete overrides.project; - delete overrides.configuration; - delete overrides.prod; - - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration, - overrides - }, options); + public async run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/commands/e2e.ts b/packages/@angular/cli/commands/e2e.ts index d53752c66730..42ca1028324c 100644 --- a/packages/@angular/cli/commands/e2e.ts +++ b/packages/@angular/cli/commands/e2e.ts @@ -1,11 +1,6 @@ import { CommandScope, Option } from '../models/command'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface Options { - project?: string; - configuration?: string; - prod: boolean; -} export default class E2eCommand extends ArchitectCommand { public readonly name = 'e2e'; @@ -19,21 +14,7 @@ export default class E2eCommand extends ArchitectCommand { this.configurationOption ]; - public run(options: Options) { - let configuration = options.configuration; - if (!configuration && options.prod) { - configuration = 'production'; - } - - const overrides = { ...options }; - delete overrides.project; - delete overrides.prod; - - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration, - overrides - }, options); + public run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/commands/lint.ts b/packages/@angular/cli/commands/lint.ts index d2af2950242b..d9fdec855e8e 100644 --- a/packages/@angular/cli/commands/lint.ts +++ b/packages/@angular/cli/commands/lint.ts @@ -1,10 +1,6 @@ import { CommandScope, Option } from '../models/command'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface Options { - project?: string; - configuration?: string; -} export default class LintCommand extends ArchitectCommand { public readonly name = 'lint'; @@ -17,14 +13,7 @@ export default class LintCommand extends ArchitectCommand { this.configurationOption ]; - public async run(options: Options) { - const overrides = { ...options }; - delete overrides.project; - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration: options.configuration, - overrides - }, options); + public async run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/commands/run.ts b/packages/@angular/cli/commands/run.ts index bb69faf3ace9..bcb948a32d19 100644 --- a/packages/@angular/cli/commands/run.ts +++ b/packages/@angular/cli/commands/run.ts @@ -1,9 +1,6 @@ import { CommandScope, Option } from '../models/command'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface RunOptions { - target: string; -} export default class RunCommand extends ArchitectCommand { public readonly name = 'run'; @@ -14,17 +11,9 @@ export default class RunCommand extends ArchitectCommand { this.configurationOption ]; - public async run(options: RunOptions) { + public async run(options: ArchitectCommandOptions) { if (options.target) { - const [project, target, configuration] = options.target.split(':'); - const overrides = { ...options }; - delete overrides.target; - return this.runArchitectTarget({ - project, - target, - configuration, - overrides - }, options); + return this.runArchitectTarget(options); } else { throw new Error('Invalid architect target.'); } diff --git a/packages/@angular/cli/commands/serve.ts b/packages/@angular/cli/commands/serve.ts index a8ac908c1609..3e0ccf89627a 100644 --- a/packages/@angular/cli/commands/serve.ts +++ b/packages/@angular/cli/commands/serve.ts @@ -1,12 +1,7 @@ import { CommandScope, Option } from '../models/command'; import { Version } from '../upgrade/version'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface Options { - project?: string; - configuration?: string; - prod: boolean; -} export default class ServeCommand extends ArchitectCommand { public readonly name = 'serve'; @@ -19,29 +14,14 @@ export default class ServeCommand extends ArchitectCommand { this.configurationOption ]; - public validate(_options: Options) { + public validate(_options: ArchitectCommandOptions) { // Check Angular and TypeScript versions. Version.assertCompatibleAngularVersion(this.project.root); Version.assertTypescriptVersion(this.project.root); return true; } - public async run(options: Options) { - let configuration = options.configuration; - if (!configuration && options.prod) { - configuration = 'production'; - } - - const overrides = { ...options }; - delete overrides.project; - delete overrides.configuration; - delete overrides.prod; - - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration, - overrides - }, options); + public async run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/commands/test.ts b/packages/@angular/cli/commands/test.ts index c2fb3e77b3cf..562a8c186575 100644 --- a/packages/@angular/cli/commands/test.ts +++ b/packages/@angular/cli/commands/test.ts @@ -1,11 +1,6 @@ import { CommandScope, Option } from '../models/command'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface Options { - project?: string; - configuration?: string; - prod: boolean; -} export default class TestCommand extends ArchitectCommand { public readonly name = 'test'; @@ -19,22 +14,7 @@ export default class TestCommand extends ArchitectCommand { this.configurationOption ]; - public async run(options: Options) { - let configuration = options.configuration; - if (!configuration && options.prod) { - configuration = 'production'; - } - - const overrides = { ...options }; - delete overrides.project; - delete overrides.configuration; - delete overrides.prod; - - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration, - overrides - }, options); + public async run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/commands/xi18n.ts b/packages/@angular/cli/commands/xi18n.ts index 76c2d3c41ec6..56b30c5f2f01 100644 --- a/packages/@angular/cli/commands/xi18n.ts +++ b/packages/@angular/cli/commands/xi18n.ts @@ -1,10 +1,6 @@ import { CommandScope, Option } from '../models/command'; -import { ArchitectCommand } from '../models/architect-command'; +import { ArchitectCommand, ArchitectCommandOptions } from '../models/architect-command'; -export interface Options { - project?: string; - configuration?: string; -} export default class Xi18nCommand extends ArchitectCommand { public readonly name = 'xi18n'; @@ -16,14 +12,7 @@ export default class Xi18nCommand extends ArchitectCommand { this.configurationOption ]; - public async run(options: Options) { - const overrides = { ...options }; - delete overrides.project; - return this.runArchitectTarget({ - project: options.project, - target: this.target, - configuration: options.configuration, - overrides - }, options); + public async run(options: ArchitectCommandOptions) { + return this.runArchitectTarget(options); } } diff --git a/packages/@angular/cli/models/architect-command.ts b/packages/@angular/cli/models/architect-command.ts index 0e7d289d6400..597c950577d8 100644 --- a/packages/@angular/cli/models/architect-command.ts +++ b/packages/@angular/cli/models/architect-command.ts @@ -1,4 +1,4 @@ -import { experimental, schema, strings } from '@angular-devkit/core'; +import { JsonObject, experimental, schema, strings } from '@angular-devkit/core'; import { NodeJsSyncHost, createConsoleLogger } from '@angular-devkit/core/node'; import { Architect, BuilderDescription, BuildEvent, @@ -11,7 +11,20 @@ import { concatMap, map, tap, toArray } from 'rxjs/operators'; import { WorkspaceLoader } from '../models/workspace-loader'; -export abstract class ArchitectCommand extends Command { +export interface ProjectAndConfigurationOptions { + project?: string; + configuration?: string; + prod: boolean; +} + +export interface TargetOptions { + target?: string; +} + +export type ArchitectCommandOptions = ProjectAndConfigurationOptions & TargetOptions & JsonObject; + +export abstract class ArchitectCommand extends Command { + private _host = new NodeJsSyncHost(); private _architect: Architect; private _workspace: experimental.workspace.Workspace; @@ -30,33 +43,25 @@ export abstract class ArchitectCommand extends Command { target: string | undefined; - public async initialize(options: any): Promise { + public async initialize(options: ArchitectCommandOptions): Promise { return this._loadWorkspaceAndArchitect().pipe( concatMap(() => { - let targetSpec: TargetSpecifier; - if (options.project) { - targetSpec = { - project: options.project, - target: this.target - }; - } else if (options.target) { - const [project, target] = options.target.split(':'); - targetSpec = { project, target }; - } else if (this.target) { + const targetSpec: TargetSpecifier = this._makeTargetSpecifier(options); + + if (this.target && !targetSpec.project) { const projects = this.getProjectNamesByTarget(this.target); if (projects.length === 1) { // If there is a single target, use it to parse overrides. - targetSpec = { - project: projects[0], - target: this.target - }; + targetSpec.project = projects[0]; } else { // Multiple targets can have different, incompatible options. // We only lookup options for single targets. return of(null); } - } else { + } + + if (!targetSpec.project || !targetSpec.target) { throw new Error('Cannot determine project or target for Architect command.'); } @@ -70,13 +75,10 @@ export abstract class ArchitectCommand extends Command { .then(() => { }); } - public validate(options: any) { + public validate(options: ArchitectCommandOptions) { if (!options.project && this.target) { const projectNames = this.getProjectNamesByTarget(this.target); - const overrides = { ...options }; - delete overrides.project; - delete overrides.configuration; - delete overrides.prod; + const { overrides } = this._makeTargetSpecifier(options); if (projectNames.length > 1 && Object.keys(overrides).length > 0) { throw new Error('Architect commands with multiple targets cannot specify overrides.' + `'${this.target}' would be run on the following projects: ${projectNames.join()}`); @@ -146,10 +148,9 @@ export abstract class ArchitectCommand extends Command { aliases: ['c'] }; - protected async runArchitectTarget( - targetSpec: TargetSpecifier, - commandOptions: T, - ): Promise { + protected async runArchitectTarget(options: ArchitectCommandOptions): Promise { + const targetSpec = this._makeTargetSpecifier(options); + const runSingleTarget = (targetSpec: TargetSpecifier) => this._architect.run( this._architect.getBuilderConfiguration(targetSpec), { logger: this._logger } @@ -174,7 +175,7 @@ export abstract class ArchitectCommand extends Command { e.errors.forEach(schemaError => { if (schemaError.keyword === 'additionalProperties') { const unknownProperty = schemaError.params.additionalProperty; - if (unknownProperty in commandOptions) { + if (unknownProperty in options) { const dashes = unknownProperty.length === 1 ? '-' : '--'; this.logger.fatal(`Unknown option: '${dashes}${unknownProperty}'`); @@ -229,4 +230,35 @@ export abstract class ArchitectCommand extends Command { tap((architect: Architect) => this._architect = architect), ); } + + private _makeTargetSpecifier(options: ArchitectCommandOptions): TargetSpecifier { + let project, target, configuration, overrides; + + if (options.target) { + [project, target, configuration] = options.target.split(':'); + + overrides = { ...options }; + delete overrides.target; + } else { + project = options.project; + target = this.target; + configuration = options.configuration; + if (!configuration && options.prod) { + configuration = 'production'; + } + + overrides = { ...options }; + + delete overrides.configuration; + delete overrides.prod; + delete overrides.project; + } + + return { + project, + configuration, + target, + overrides + }; + } }