From b5eb8cfdefe839ff577f14f8ce677e4b37927a57 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 7 May 2019 20:25:42 -0400 Subject: [PATCH] fix(@angular/cli): honor builder schema additional properties option Fixes #14354 --- .../angular/cli/models/architect-command.ts | 5 +++- .../tests/commands/additional-properties.ts | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 tests/legacy-cli/e2e/tests/commands/additional-properties.ts diff --git a/packages/angular/cli/models/architect-command.ts b/packages/angular/cli/models/architect-command.ts index ee1df7dc085e..fabef4411846 100644 --- a/packages/angular/cli/models/architect-command.ts +++ b/packages/angular/cli/models/architect-command.ts @@ -239,7 +239,10 @@ export abstract class ArchitectCommand< ); const overrides = parseArguments(targetOptions, targetOptionArray, this.logger); - if (overrides['--']) { + const allowAdditionalProperties = typeof builderDesc.optionSchema === 'object' + && builderDesc.optionSchema.additionalProperties; + + if (overrides['--'] && !allowAdditionalProperties) { (overrides['--'] || []).forEach(additional => { this.logger.fatal(`Unknown option: '${additional.split(/=/)[0]}'`); }); diff --git a/tests/legacy-cli/e2e/tests/commands/additional-properties.ts b/tests/legacy-cli/e2e/tests/commands/additional-properties.ts new file mode 100644 index 000000000000..b9a477c7cff6 --- /dev/null +++ b/tests/legacy-cli/e2e/tests/commands/additional-properties.ts @@ -0,0 +1,28 @@ +import { createDir, rimraf, writeMultipleFiles } from '../../utils/fs'; +import { execAndWaitForOutputToMatch } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; + +export default async function() { + await createDir('example-builder'); + await writeMultipleFiles({ + 'example-builder/package.json': '{ "builders": "./builders.json" }', + 'example-builder/schema.json': '{ "$schema": "http://json-schema.org/draft-07/schema", "type": "object", "additionalProperties": true }', + 'example-builder/builders.json': '{ "$schema": "@angular-devkit/architect/src/builders-schema.json", "builders": { "example": { "implementation": "./example", "schema": "./schema.json" } } }', + 'example-builder/example.js': 'module.exports.default = require("@angular-devkit/architect").createBuilder((options) => { console.log(options); return { success: true }; });', + }); + + await updateJsonFile('angular.json', json => { + const appArchitect = json.projects['test-project'].architect; + appArchitect.example = { + builder: './example-builder:example', + }; + }); + + await execAndWaitForOutputToMatch( + 'ng', + ['run', 'test-project:example', '--additional', 'property'], + /'{ '--': \[ '--additional', 'property' \] }'/, + ); + + await rimraf('example-builder'); +}