diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md index fe8b609ccf68..802ed4569719 100644 --- a/goldens/public-api/angular_devkit/core/index.api.md +++ b/goldens/public-api/angular_devkit/core/index.api.md @@ -18,6 +18,9 @@ import { ValidateFunction } from 'ajv'; // @public (undocumented) function addUndefinedDefaults(value: JsonValue, _pointer: JsonPointer, schema?: JsonSchema): JsonValue; +// @public (undocumented) +function addUndefinedObjectDefaults(value: JsonValue, _pointer: JsonPointer, schema?: JsonSchema): JsonValue; + // @public class AliasHost extends ResolverHost { // (undocumented) @@ -1297,6 +1300,7 @@ class TransformLogger extends Logger { declare namespace transforms { export { + addUndefinedObjectDefaults, addUndefinedDefaults } } diff --git a/modules/testing/builder/src/builder-harness.ts b/modules/testing/builder/src/builder-harness.ts index 9fdca970a277..ecee882739d8 100644 --- a/modules/testing/builder/src/builder-harness.ts +++ b/modules/testing/builder/src/builder-harness.ts @@ -104,7 +104,11 @@ export class BuilderHarness { ...builderInfo, }; - this.schemaRegistry.addPostTransform(json.schema.transforms.addUndefinedDefaults); + if (builderInfo?.builderName?.startsWith('@angular/build:')) { + this.schemaRegistry.addPostTransform(json.schema.transforms.addUndefinedObjectDefaults); + } else { + this.schemaRegistry.addPostTransform(json.schema.transforms.addUndefinedDefaults); + } } private resolvePath(path: string): string { diff --git a/packages/angular/build/src/builders/application/tests/setup.ts b/packages/angular/build/src/builders/application/tests/setup.ts index 93a5cda2a1df..ca8a54a0bf31 100644 --- a/packages/angular/build/src/builders/application/tests/setup.ts +++ b/packages/angular/build/src/builders/application/tests/setup.ts @@ -13,7 +13,7 @@ import { Schema } from '../schema'; export * from '../../../../../../../modules/testing/builder/src'; export const APPLICATION_BUILDER_INFO = Object.freeze({ - name: '@angular-devkit/build-angular:application', + name: '@angular/build:application', schemaPath: __dirname + '/../schema.json', }); diff --git a/packages/angular/cli/src/command-builder/architect-base-command-module.ts b/packages/angular/cli/src/command-builder/architect-base-command-module.ts index 9ce2230fd5ee..566e0e62b209 100644 --- a/packages/angular/cli/src/command-builder/architect-base-command-module.ts +++ b/packages/angular/cli/src/command-builder/architect-base-command-module.ts @@ -52,10 +52,16 @@ export abstract class ArchitectBaseCommandModule return this.onMissingTarget(e.message); } + const isAngularBuild = builderName.startsWith('@angular/build:'); + const { logger } = this.context; - const run = await this.getArchitect().scheduleTarget(target, options as json.JsonObject, { - logger, - }); + const run = await this.getArchitect(isAngularBuild).scheduleTarget( + target, + options as json.JsonObject, + { + logger, + }, + ); const analytics = isPackageNameSafeForAnalytics(builderName) ? await this.getAnalytics() @@ -150,13 +156,17 @@ export abstract class ArchitectBaseCommandModule } private _architect: Architect | undefined; - protected getArchitect(): Architect { + protected getArchitect(skipUndefinedArrayTransform: boolean): Architect { if (this._architect) { return this._architect; } const registry = new json.schema.CoreSchemaRegistry(); - registry.addPostTransform(json.schema.transforms.addUndefinedDefaults); + if (skipUndefinedArrayTransform) { + registry.addPostTransform(json.schema.transforms.addUndefinedObjectDefaults); + } else { + registry.addPostTransform(json.schema.transforms.addUndefinedDefaults); + } registry.useXDeprecatedProvider((msg) => this.context.logger.warn(msg)); const architectHost = this.getArchitectHost(); diff --git a/packages/angular_devkit/core/src/json/schema/transforms.ts b/packages/angular_devkit/core/src/json/schema/transforms.ts index d5052a60a966..1c97b7d1e9cc 100644 --- a/packages/angular_devkit/core/src/json/schema/transforms.ts +++ b/packages/angular_devkit/core/src/json/schema/transforms.ts @@ -11,10 +11,27 @@ import { JsonPointer } from './interface'; import { JsonSchema } from './schema'; import { getTypesOfSchema } from './utility'; +export function addUndefinedObjectDefaults( + value: JsonValue, + _pointer: JsonPointer, + schema?: JsonSchema, +): JsonValue { + return transformUndefined(value, _pointer, schema, true); +} + export function addUndefinedDefaults( value: JsonValue, _pointer: JsonPointer, schema?: JsonSchema, +): JsonValue { + return transformUndefined(value, _pointer, schema, false); +} + +function transformUndefined( + value: JsonValue, + _pointer: JsonPointer, + schema?: JsonSchema, + onlyObjects?: boolean, ): JsonValue { if (typeof schema === 'boolean' || schema === undefined) { return value; @@ -45,7 +62,7 @@ export function addUndefinedDefaults( return value; } - if (type === 'array') { + if (!onlyObjects && type === 'array') { return value == undefined ? [] : value; } @@ -94,7 +111,7 @@ export function addUndefinedDefaults( }); if (adjustedSchema && isJsonObject(adjustedSchema)) { - newValue[propName] = addUndefinedDefaults(value, _pointer, adjustedSchema); + newValue[propName] = transformUndefined(value, _pointer, adjustedSchema, onlyObjects); } } }