diff --git a/.appveyor.yml b/.appveyor.yml index 6844247c2c87..060d7cc81186 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -15,7 +15,7 @@ test_script: - npm --version - npm run test:packages - npm run test:cli - - node tests\run_e2e.js --appveyor "--glob=tests/{basic,commands,generate,build/styles}/**" --ng-version="6.0.0-rc.2" + - node tests\run_e2e.js --appveyor "--glob=tests/{basic,commands,generate,build/styles}/**" build: off diff --git a/.circleci/config.yml b/.circleci/config.yml index 170d637bde19..9e917a2b3202 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -77,7 +77,7 @@ jobs: - attach_workspace: <<: *attach_workspace_defaults - run: cp -r /home/circleci/workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=0 --nosilent --ng-version="6.0.0-rc.2" + - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=0 --nosilent e2e-1: <<: *defaults @@ -88,7 +88,7 @@ jobs: - attach_workspace: <<: *attach_workspace_defaults - run: cp -r /home/circleci/workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=1 --nosilent --ng-version="6.0.0-rc.2" + - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=1 --nosilent e2e-2: <<: *defaults @@ -99,7 +99,7 @@ jobs: - attach_workspace: <<: *attach_workspace_defaults - run: cp -r /home/circleci/workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=2 --nosilent --ng-version="6.0.0-rc.2" + - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=2 --nosilent e2e-3: <<: *defaults @@ -110,7 +110,7 @@ jobs: - attach_workspace: <<: *attach_workspace_defaults - run: cp -r /home/circleci/workspace/dist/ ./ - - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=3 --nosilent --ng-version="6.0.0-rc.2" + - run: xvfb-run -a node tests/run_e2e.js --nobuild --reuse=/home/circleci/workspace/angular-cli-e2e-default/test-project --nb-shards=4 --shard=3 --nosilent # Master only E2E. nightly-e2e: diff --git a/.travis.yml b/.travis.yml index 180f28ede1cc..9ecc30fd0344 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,19 +36,19 @@ matrix: env: test - node_js: "8" os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=0 --nosilent --ng-version="6.0.0-rc.2" + script: node tests/run_e2e.js --nb-shards=4 --shard=0 --nosilent env: e2e-0 - node_js: "8" os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=1 --nosilent --ng-version="6.0.0-rc.2" + script: node tests/run_e2e.js --nb-shards=4 --shard=1 --nosilent env: e2e-1 - node_js: "8" os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=2 --nosilent --ng-version="6.0.0-rc.2" + script: node tests/run_e2e.js --nb-shards=4 --shard=2 --nosilent env: e2e-2 - node_js: "8" os: linux - script: node tests/run_e2e.js --nb-shards=4 --shard=3 --nosilent --ng-version="6.0.0-rc.2" + script: node tests/run_e2e.js --nb-shards=4 --shard=3 --nosilent env: e2e-3 - node_js: "8" os: linux @@ -69,7 +69,7 @@ matrix: env: nightly - node_js: "9" os: linux - script: node tests/run_e2e.js "--glob=tests/build/**" --ng-version="6.0.0-rc.2" + script: node tests/run_e2e.js "--glob=tests/build/**" env: node9 # Deploy stage diff --git a/package-lock.json b/package-lock.json index 9800be0f450c..4d3ffb410e57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,46 +5,46 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "github:angular/angular-devkit-architect-builds#af727d3e3aea43d20bf5df230068a5e837a9a868", + "version": "github:angular/angular-devkit-architect-builds#02f2b0de50864f467b6aa9cfdb3d4de5e15678d8", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", - "rxjs": "6.0.0-turbo-rc.4" + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", + "rxjs": "6.0.0" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "version": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "requires": { "ajv": "6.4.0", "chokidar": "1.7.0", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "source-map": "0.5.7" } } } }, "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "version": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "requires": { "ajv": "6.4.0", "chokidar": "1.7.0", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "source-map": "0.5.7" } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#11a3f822cedb40ded0b11a4d212a540b906f58f6", + "version": "github:angular/angular-devkit-schematics-builds#4144a9821d7016c427a41071d80af73ce9c447ba", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "@ngtools/json-schema": "1.1.0", - "rxjs": "6.0.0-turbo-rc.4" + "rxjs": "6.0.0" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "version": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "requires": { "ajv": "6.4.0", "chokidar": "1.7.0", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "source-map": "0.5.7" } } @@ -56,28 +56,28 @@ "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" }, "@schematics/angular": { - "version": "github:angular/schematics-angular-builds#a3edca1d29741245c65d0b7278ff68f04c01f277", + "version": "github:angular/schematics-angular-builds#aaf1ad281a488c6a308d2693763a55710eb025e1", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", - "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#11a3f822cedb40ded0b11a4d212a540b906f58f6", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", + "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#4144a9821d7016c427a41071d80af73ce9c447ba", "typescript": "2.7.2" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "version": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "requires": { "ajv": "6.4.0", "chokidar": "1.7.0", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "source-map": "0.5.7" } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#11a3f822cedb40ded0b11a4d212a540b906f58f6", + "version": "github:angular/angular-devkit-schematics-builds#4144a9821d7016c427a41071d80af73ce9c447ba", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "@ngtools/json-schema": "1.1.0", - "rxjs": "6.0.0-turbo-rc.4" + "rxjs": "6.0.0" } }, "typescript": { @@ -88,31 +88,31 @@ } }, "@schematics/update": { - "version": "github:angular/schematics-update-builds#79168c9d4a8701bf7c81acb38ae1ef3124403e76", + "version": "github:angular/schematics-update-builds#584d386e3022899f79919c6e08e94b340621cf19", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", - "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#11a3f822cedb40ded0b11a4d212a540b906f58f6", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", + "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds#4144a9821d7016c427a41071d80af73ce9c447ba", "npm-registry-client": "8.5.1", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "semver": "5.5.0", "semver-intersect": "1.3.1" }, "dependencies": { "@angular-devkit/core": { - "version": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "version": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "requires": { "ajv": "6.4.0", "chokidar": "1.7.0", - "rxjs": "6.0.0-turbo-rc.4", + "rxjs": "6.0.0", "source-map": "0.5.7" } }, "@angular-devkit/schematics": { - "version": "github:angular/angular-devkit-schematics-builds#11a3f822cedb40ded0b11a4d212a540b906f58f6", + "version": "github:angular/angular-devkit-schematics-builds#4144a9821d7016c427a41071d80af73ce9c447ba", "requires": { - "@angular-devkit/core": "github:angular/angular-devkit-core-builds#8f908bd80400f4d42fbe98735a356b6428d9027f", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds#4249c56ddd026599ec4800bcf2dd27df8345dbeb", "@ngtools/json-schema": "1.1.0", - "rxjs": "6.0.0-turbo-rc.4" + "rxjs": "6.0.0" } } } @@ -1681,7 +1681,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -4099,7 +4099,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -4696,9 +4696,9 @@ "dev": true }, "rxjs": { - "version": "6.0.0-turbo-rc.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.0.0-turbo-rc.4.tgz", - "integrity": "sha512-7jrBXhSa1GaIvypD0/27dHWr5BobZTJWW0UXwtM4VGPjrR2nDdKvqpRooNijHFUC5ZGjOpk0S3dh3GNUWpwhpg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.0.0.tgz", + "integrity": "sha512-2MgLQr1zvks8+Kip4T6hcJdiBhV+SIvxguoWjhwtSpNPTp/5e09HJbgclCwR/nW0yWzhubM+6Q0prl8G5RuoBA==", "requires": { "tslib": "1.9.0" } diff --git a/package.json b/package.json index 95650bf63db3..8743fb82e690 100644 --- a/package.json +++ b/package.json @@ -41,17 +41,17 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular-devkit/architect": "angular/angular-devkit-architect-builds", - "@angular-devkit/core": "angular/angular-devkit-core-builds", - "@angular-devkit/schematics": "angular/angular-devkit-schematics-builds", - "@schematics/angular": "angular/schematics-angular-builds", - "@schematics/update": "angular/schematics-update-builds", + "@angular-devkit/architect": "github:angular/angular-devkit-architect-builds", + "@angular-devkit/core": "github:angular/angular-devkit-core-builds", + "@angular-devkit/schematics": "github:angular/angular-devkit-schematics-builds", + "@schematics/angular": "github:angular/schematics-angular-builds", + "@schematics/update": "github:angular/schematics-update-builds", "chalk": "~2.2.0", "fs-extra": "^4.0.0", "node-modules-path": "^1.0.0", "opn": "~5.1.0", "resolve": "^1.1.7", - "rxjs": "^6.0.0-turbo-rc.4", + "rxjs": "^6.0.0", "semver": "^5.3.0", "silent-error": "^1.0.0", "symbol-observable": "^1.2.0", diff --git a/packages/@angular/cli/commands/e2e.ts b/packages/@angular/cli/commands/e2e.ts index 0de58ad5ed3b..0dd2a50ae3c5 100644 --- a/packages/@angular/cli/commands/e2e.ts +++ b/packages/@angular/cli/commands/e2e.ts @@ -13,6 +13,7 @@ export default class E2eCommand extends ArchitectCommand { public readonly description = 'Run e2e tests in existing project.'; public static aliases: string[] = ['e']; public readonly scope = CommandScope.inProject; + public readonly multiTarget: true; public readonly options: Option[] = [ this.prodOption, this.configurationOption diff --git a/packages/@angular/cli/commands/lint.ts b/packages/@angular/cli/commands/lint.ts index c4cb1e56b0cd..5bff44fae481 100644 --- a/packages/@angular/cli/commands/lint.ts +++ b/packages/@angular/cli/commands/lint.ts @@ -12,6 +12,7 @@ export default class LintCommand extends ArchitectCommand { public readonly description = 'Lints code in existing project.'; public static aliases = ['l']; public readonly scope = CommandScope.inProject; + public readonly multiTarget: true; public readonly options: Option[] = [ this.configurationOption ]; diff --git a/packages/@angular/cli/commands/test.ts b/packages/@angular/cli/commands/test.ts index d74548446ef2..967e0a0a2c39 100644 --- a/packages/@angular/cli/commands/test.ts +++ b/packages/@angular/cli/commands/test.ts @@ -13,6 +13,7 @@ export default class TestCommand extends ArchitectCommand { public readonly description = 'Run unit tests in existing project.'; public static aliases = ['t']; public readonly scope = CommandScope.inProject; + public readonly multiTarget: true; public readonly options: Option[] = [ this.prodOption, this.configurationOption diff --git a/packages/@angular/cli/commands/xi18n.ts b/packages/@angular/cli/commands/xi18n.ts index 35bd267f3a4a..76c2d3c41ec6 100644 --- a/packages/@angular/cli/commands/xi18n.ts +++ b/packages/@angular/cli/commands/xi18n.ts @@ -11,6 +11,7 @@ export default class Xi18nCommand extends ArchitectCommand { public readonly target = 'extract-i18n'; public readonly description = 'Extracts i18n messages from source code.'; public readonly scope = CommandScope.inProject; + public readonly multiTarget: true; public readonly options: Option[] = [ this.configurationOption ]; diff --git a/packages/@angular/cli/models/architect-command.ts b/packages/@angular/cli/models/architect-command.ts index 275870fe09c8..ff60aa99854b 100644 --- a/packages/@angular/cli/models/architect-command.ts +++ b/packages/@angular/cli/models/architect-command.ts @@ -11,16 +11,13 @@ import { concatMap, map, tap, toArray } from 'rxjs/operators'; import { WorkspaceLoader } from '../models/workspace-loader'; -export interface GenericTargetTargetSpecifier { - target: string; - configuration?: string; -} - export abstract class ArchitectCommand extends Command { private _host = new NodeJsSyncHost(); private _architect: Architect; private _workspace: experimental.workspace.Workspace; private _logger = createConsoleLogger(); + // If this command supports running multiple targets. + protected multiTarget = false; readonly Options: Option[] = [{ name: 'configuration', @@ -46,7 +43,7 @@ export abstract class ArchitectCommand extends Command { const [project, target] = options.target.split(':'); targetSpec = { project, target }; } else if (this.target) { - const projects = this.getAllProjectsForTargetName(this.target); + const projects = this.getProjectNamesByTarget(this.target); if (projects.length === 1) { // If there is a single target, use it to parse overrides. @@ -70,12 +67,12 @@ export abstract class ArchitectCommand extends Command { ); }) ).toPromise() - .then(() => {}); + .then(() => { }); } public validate(options: any) { if (!options.project && this.target) { - const projectNames = this.getAllProjectsForTargetName(this.target); + const projectNames = this.getProjectNamesByTarget(this.target); const overrides = { ...options }; delete overrides.project; delete overrides.configuration; @@ -164,7 +161,7 @@ export abstract class ArchitectCommand extends Command { if (!targetSpec.project && this.target) { // This runs each target sequentially. // Running them in parallel would jumble the log messages. - return await from(this.getAllProjectsForTargetName(this.target)).pipe( + return await from(this.getProjectNamesByTarget(this.target)).pipe( concatMap(project => runSingleTarget({ ...targetSpec, project })), toArray(), ).toPromise().then(results => results.every(res => res === 0) ? 0 : 1); @@ -197,10 +194,28 @@ export abstract class ArchitectCommand extends Command { } } - private getAllProjectsForTargetName(targetName: string) { - return this._workspace.listProjectNames().map(projectName => + private getProjectNamesByTarget(targetName: string): string[] { + const allProjectsForTargetName = this._workspace.listProjectNames().map(projectName => this._architect.listProjectTargets(projectName).includes(targetName) ? projectName : null ).filter(x => !!x); + + if (this.multiTarget) { + // For multi target commands, we always list all projects that have the target. + return allProjectsForTargetName; + } else { + // For single target commands, we try try the default project project first, + // then the full list if it has a single project, then error out. + const maybeDefaultProject = this._workspace.getDefaultProjectName(); + if (maybeDefaultProject && allProjectsForTargetName.includes(maybeDefaultProject)) { + return [maybeDefaultProject]; + } + + if (allProjectsForTargetName.length === 1) { + return allProjectsForTargetName; + } + + throw new Error(`Could not determine a single project for the '${targetName} target.`); + } } private _loadWorkspaceAndArchitect() { diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index eb56c541f538..255e1019b2cb 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -40,7 +40,7 @@ "node-modules-path": "^1.0.0", "opn": "~5.1.0", "resolve": "^1.1.7", - "rxjs": "^6.0.0-turbo-rc.4", + "rxjs": "^6.0.0", "semver": "^5.1.0", "silent-error": "^1.0.0", "symbol-observable": "^1.2.0", diff --git a/packages/@angular/cli/utilities/config.ts b/packages/@angular/cli/utilities/config.ts index 556dbd7aa194..3fe7cbc5c1f3 100644 --- a/packages/@angular/cli/utilities/config.ts +++ b/packages/@angular/cli/utilities/config.ts @@ -5,13 +5,9 @@ import { JsonAstObject, JsonParseMode, JsonValue, - Path, experimental, - isAbsolute, normalize, parseJsonAst, - resolve, - relative, virtualFs, } from '@angular-devkit/core'; import { NodeJsSyncHost } from '@angular-devkit/core/node'; @@ -139,49 +135,11 @@ export function validateWorkspace(json: JsonValue) { return true; } -export function getProjectByCwd(workspace?: experimental.workspace.Workspace): string | null { - if (!workspace) { - workspace = getWorkspace('local'); - if (!workspace) { - return null; - } - } - - const projectNames = workspace.listProjectNames(); - if (projectNames.length === 1) { - return projectNames[0]; - } - - const cwd = normalize(process.cwd()); - const isInside = (base: Path, potential: Path): boolean => { - const absoluteBase = resolve(workspace.root, base); - const absolutePotential = resolve(workspace.root, potential); - const relativePotential = relative(absoluteBase, absolutePotential); - if (!relativePotential.startsWith('..') && !isAbsolute(relativePotential)) { - return true; - } - - return false; - }; - - const projects = workspace.listProjectNames() - .map(name => [workspace.getProject(name).root, name] as [Path, string]) - .sort((a, b) => isInside(a[0], b[0]) ? 1 : 0); - - for (const project of projects) { - if (isInside(project[0], cwd)) { - return project[1]; - } - } - - return null; -} - export function getPackageManager(): string { let workspace = getWorkspace(); if (workspace) { - const project = getProjectByCwd(workspace); + const project = workspace.getProjectByPath(normalize(process.cwd())); if (project && workspace.getProjectCli(project)) { const value = workspace.getProjectCli(project)['packageManager']; if (typeof value == 'string') { @@ -210,7 +168,7 @@ export function getDefaultSchematicCollection(): string { let workspace = getWorkspace('local'); if (workspace) { - const project = getProjectByCwd(workspace); + const project = workspace.getProjectByPath(normalize(process.cwd())); if (project && workspace.getProjectCli(project)) { const value = workspace.getProjectCli(project)['defaultCollection']; if (typeof value == 'string') { @@ -267,7 +225,7 @@ export function getSchematicDefaults(collection: string, schematic: string, proj } } - project = project || getProjectByCwd(workspace); + project = project || workspace.getProjectByPath(normalize(process.cwd())); if (project && workspace.getProjectSchematics(project)) { const schematicObject = workspace.getProjectSchematics(project)[fullName]; if (schematicObject) { @@ -287,7 +245,7 @@ export function isWarningEnabled(warning: string): boolean { let workspace = getWorkspace('local'); if (workspace) { - const project = getProjectByCwd(workspace); + const project = workspace.getProjectByPath(normalize(process.cwd())); if (project && workspace.getProjectCli(project)) { const warnings = workspace.getProjectCli(project)['warnings']; if (typeof warnings == 'object' && !Array.isArray(warnings)) { diff --git a/tests/e2e/setup/015-build.ts b/tests/e2e/setup/015-build.ts index b7609479487d..275680c278e1 100644 --- a/tests/e2e/setup/015-build.ts +++ b/tests/e2e/setup/015-build.ts @@ -12,7 +12,9 @@ export default function() { return; } - return npm('run', 'build', '--', '--local', argv.devkit ? '--devkit=' + argv.devkit : undefined) + const devkitArg = argv.devkit ? '--devkit=' + argv.devkit : '--devkit-snapshots'; + + return npm('run', 'build', '--', '--local', devkitArg) .then(() => { if (!argv.nightly && !argv['ng-sha']) { return; diff --git a/tests/e2e/setup/500-create-project.ts b/tests/e2e/setup/500-create-project.ts index 26b4f76c5b54..e648c186aff2 100644 --- a/tests/e2e/setup/500-create-project.ts +++ b/tests/e2e/setup/500-create-project.ts @@ -8,6 +8,7 @@ import { useCIDefaults, useBuiltPackages, useDevKit, + useDevKitSnapshots, updateJsonFile, } from '../utils/project'; import {gitClean, gitCommit} from '../utils/git'; @@ -32,7 +33,7 @@ export default async function() { return Promise.resolve() .then(() => useBuiltPackages()) - .then(() => argv.devkit && useDevKit(argv.devkit)) + .then(() => argv.devkit ? useDevKit(argv.devkit) : useDevKitSnapshots()) .then(() => useCIChrome('e2e')) .then(() => useCIChrome('src')) .then(() => argv['ng-version'] ? useNgVersion(argv['ng-version']) : Promise.resolve()) diff --git a/tests/e2e/tests/generate/library/library-consumption.ts b/tests/e2e/tests/generate/library/library-consumption.ts index fbaac6d72ee8..ffac66a81596 100644 --- a/tests/e2e/tests/generate/library/library-consumption.ts +++ b/tests/e2e/tests/generate/library/library-consumption.ts @@ -41,6 +41,8 @@ export default function () { } } `)) + // Check that the build succeeds both with named project, unnammed (should build app), and prod. .then(() => ng('build', 'test-project')) - .then(() => ng('build', 'test-project', '--prod')); + .then(() => ng('build')) + .then(() => ng('build', '--prod')); } diff --git a/tests/e2e/utils/project.ts b/tests/e2e/utils/project.ts index 1bed0955e1aa..f514c77c6529 100644 --- a/tests/e2e/utils/project.ts +++ b/tests/e2e/utils/project.ts @@ -41,6 +41,7 @@ export function createProject(name: string, ...args: string[]) { .then(() => useBuiltPackages()) .then(() => useCIChrome('e2e')) .then(() => useCIChrome('src')) + .then(() => useDevKitSnapshots()) .then(() => argv['ng2'] ? useNg2() : Promise.resolve()) .then(() => argv['ng4'] ? useNg4() : Promise.resolve()) .then(() => argv.nightly || argv['ng-sha'] ? useSha() : Promise.resolve()) @@ -75,6 +76,18 @@ export function useDevKit(devkitRoot: string) { }); } +export function useDevKitSnapshots() { + return updateJsonFile('package.json', json => { + // TODO: actually add these. + // These were not working on any test that ran `npm i`. + // json['devDependencies']['@angular-devkit/build-angular'] = + // 'github:angular/angular-devkit-build-angular-builds'; + // // By adding build-ng-packagr preemptively, adding a lib will not update it. + // json['devDependencies']['@angular-devkit/build-ng-packagr'] = + // 'github:angular/angular-devkit-build-ng-packagr-builds'; + }); +} + export function useBuiltPackages() { return Promise.resolve() .then(() => updateJsonFile('package.json', json => { diff --git a/tools/publish/src/build.ts b/tools/publish/src/build.ts index 2a779b855bde..ca58d59c6515 100644 --- a/tools/publish/src/build.ts +++ b/tools/publish/src/build.ts @@ -58,7 +58,7 @@ function getDeps(pkg: any): any { export default function build(packagesToBuild: string[], - opts: { local: boolean, devkit: string }, + opts: { local: boolean, devkit: string, 'devkit-snapshots': boolean }, logger: logging.Logger): Promise { const { packages, tools } = require('../../../lib/packages'); @@ -269,6 +269,17 @@ export default function build(packagesToBuild: string[], json['devDependencies'][packageName] = devkitPackages[packageName].tar; } } + } else if (opts['devkit-snapshots']) { + // Use snapshots for devkit packages. + logger.info('Using snapshots of devkit packages.'); + json['dependencies']['@angular-devkit/architect'] = + 'github:angular/angular-devkit-architect-builds'; + json['dependencies']['@angular-devkit/core'] = + 'github:angular/angular-devkit-core-builds'; + json['dependencies']['@angular-devkit/schematics'] = + 'github:angular/angular-devkit-schematics-builds'; + json['dependencies']['@schematics/angular'] = 'github:angular/schematics-angular-builds'; + json['dependencies']['@schematics/update'] = 'github:angular/schematics-update-builds'; } fs.writeFileSync(pkg.distPackageJson, JSON.stringify(json, null, 2));