diff --git a/etc/api/angular_devkit/core/src/_golden-api.d.ts b/etc/api/angular_devkit/core/src/_golden-api.d.ts index e07a427eb66f..7dab611a0ced 100644 --- a/etc/api/angular_devkit/core/src/_golden-api.d.ts +++ b/etc/api/angular_devkit/core/src/_golden-api.d.ts @@ -5,7 +5,7 @@ export interface AdditionalPropertiesValidatorError extends SchemaValidatorError }; } -export declare function addUndefinedDefaults(value: JsonValue, _pointer: JsonPointer, schema?: JsonObject): JsonValue; +export declare function addUndefinedDefaults(value: JsonValue, _pointer: JsonPointer, schema?: JsonSchema): JsonValue; export declare class AliasHost extends ResolverHost { protected _aliases: Map; @@ -989,7 +989,7 @@ export declare class UnsupportedPlatformException extends BaseException { export declare type UriHandler = (uri: string) => Observable | Promise | null | undefined; -export declare function visitJson(json: JsonValue, visitor: JsonVisitor, schema?: JsonObject, refResolver?: ReferenceResolver, context?: ContextT): Observable; +export declare function visitJson(json: JsonValue, visitor: JsonVisitor, schema?: JsonSchema, refResolver?: ReferenceResolver, context?: ContextT): Observable; export declare function visitJsonSchema(schema: JsonSchema, visitor: JsonSchemaVisitor): void; diff --git a/packages/angular_devkit/core/src/json/schema/registry.ts b/packages/angular_devkit/core/src/json/schema/registry.ts index aa98bac3e18c..b04bbc8c7b82 100644 --- a/packages/angular_devkit/core/src/json/schema/registry.ts +++ b/packages/angular_devkit/core/src/json/schema/registry.ts @@ -347,10 +347,6 @@ export class CoreSchemaRegistry implements SchemaRegistry { // tslint:disable-next-line:no-any https://github.com/ReactiveX/rxjs/issues/3989 result = (result as any).pipe( ...[...this._pre].map(visitor => concatMap((data: JsonValue) => { - if (schema === false || schema === true) { - return of(data); - } - return visitJson(data, visitor, schema, this._resolver, validate); })), ); @@ -418,10 +414,6 @@ export class CoreSchemaRegistry implements SchemaRegistry { // tslint:disable-next-line:no-any https://github.com/ReactiveX/rxjs/issues/3989 result = (result as any).pipe( ...[...this._post].map(visitor => concatMap((data: JsonValue) => { - if (schema === false || schema === true) { - return of(schema); - } - return visitJson(data, visitor, schema, this._resolver, validate); })), ); diff --git a/packages/angular_devkit/core/src/json/schema/registry_spec.ts b/packages/angular_devkit/core/src/json/schema/registry_spec.ts index fa512977605f..337e82e719df 100644 --- a/packages/angular_devkit/core/src/json/schema/registry_spec.ts +++ b/packages/angular_devkit/core/src/json/schema/registry_spec.ts @@ -382,6 +382,18 @@ describe('CoreSchemaRegistry', () => { .toPromise().then(done, done.fail); }); + it('works with true as a schema and post-transforms', async () => { + const registry = new CoreSchemaRegistry(); + registry.addPostTransform(addUndefinedDefaults); + const data: any = { a: 1, b: 2 }; // tslint:disable-line:no-any + + const validate = await registry.compile(true).toPromise(); + const result = await validate(data).toPromise(); + + expect(result.success).toBe(true); + expect(result.data).toBe(data); + }); + it('adds undefined properties', done => { const registry = new CoreSchemaRegistry(); registry.addPostTransform(addUndefinedDefaults); diff --git a/packages/angular_devkit/core/src/json/schema/transforms.ts b/packages/angular_devkit/core/src/json/schema/transforms.ts index 9c6694e4e32e..e047d3c38f2a 100644 --- a/packages/angular_devkit/core/src/json/schema/transforms.ts +++ b/packages/angular_devkit/core/src/json/schema/transforms.ts @@ -7,14 +7,18 @@ */ import { JsonObject, JsonValue, isJsonObject } from '../interface'; import { JsonPointer } from './interface'; +import { JsonSchema } from './schema'; import { getTypesOfSchema } from './utility'; export function addUndefinedDefaults( value: JsonValue, _pointer: JsonPointer, - schema?: JsonObject, + schema?: JsonSchema, ): JsonValue { - if (!schema) { + if (schema === true || schema === false) { + return value; + } + if (schema === undefined) { return value; } diff --git a/packages/angular_devkit/core/src/json/schema/visitor.ts b/packages/angular_devkit/core/src/json/schema/visitor.ts index 130ef4925846..b3b46c40df9f 100644 --- a/packages/angular_devkit/core/src/json/schema/visitor.ts +++ b/packages/angular_devkit/core/src/json/schema/visitor.ts @@ -19,7 +19,7 @@ export interface ReferenceResolver { } function _getObjectSubSchema( - schema: JsonObject | undefined, + schema: JsonSchema | undefined, key: string, ): JsonObject | undefined { if (typeof schema !== 'object' || schema === null) { @@ -51,11 +51,15 @@ function _visitJsonRecursive( json: JsonValue, visitor: JsonVisitor, ptr: JsonPointer, - schema?: JsonObject, + schema?: JsonSchema, refResolver?: ReferenceResolver, context?: ContextT, // tslint:disable-line:no-any root?: JsonObject | JsonArray, ): Observable { + if (schema === true || schema === false) { + // There's no schema definition, so just visit the JSON recursively. + schema = undefined; + } if (schema && schema.hasOwnProperty('$ref') && typeof schema['$ref'] == 'string') { if (refResolver) { const resolved = refResolver(schema['$ref'] as string, context); @@ -132,7 +136,7 @@ function _visitJsonRecursive( export function visitJson( json: JsonValue, visitor: JsonVisitor, - schema?: JsonObject, + schema?: JsonSchema, refResolver?: ReferenceResolver, context?: ContextT, // tslint:disable-line:no-any ): Observable {