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 30c55cd002..c0010196a4 100644 --- a/etc/api/angular_devkit/core/src/_golden-api.d.ts +++ b/etc/api/angular_devkit/core/src/_golden-api.d.ts @@ -226,6 +226,7 @@ export declare class CoreSchemaRegistry implements SchemaRegistry { flatten(schema: JsonObject): Observable; registerUriHandler(handler: UriHandler): void; usePromptProvider(provider: PromptProvider): void; + useXDeprecatedProvider(onUsage: (message: string) => void): void; } export declare function createWorkspaceHost(host: virtualFs.Host): WorkspaceHost; @@ -904,6 +905,7 @@ export interface SchemaRegistry { compile(schema: Object): Observable; flatten(schema: JsonObject | string): Observable; usePromptProvider(provider: PromptProvider): void; + useXDeprecatedProvider(onUsage: (message: string) => void): void; } export declare class SchemaValidationException extends BaseException { diff --git a/packages/angular_devkit/core/src/json/schema/interface.ts b/packages/angular_devkit/core/src/json/schema/interface.ts index 59e0530714..610e8d013d 100644 --- a/packages/angular_devkit/core/src/json/schema/interface.ts +++ b/packages/angular_devkit/core/src/json/schema/interface.ts @@ -117,6 +117,7 @@ export interface SchemaRegistry { addFormat(format: SchemaFormat): void; addSmartDefaultProvider(source: string, provider: SmartDefaultProvider): void; usePromptProvider(provider: PromptProvider): void; + useXDeprecatedProvider(onUsage: (message: string) => void): void; /** * Add a transformation step before the validation of any Json. diff --git a/packages/angular_devkit/core/src/json/schema/registry.ts b/packages/angular_devkit/core/src/json/schema/registry.ts index cb98ffade8..49529c98e8 100644 --- a/packages/angular_devkit/core/src/json/schema/registry.ts +++ b/packages/angular_devkit/core/src/json/schema/registry.ts @@ -461,9 +461,7 @@ export class CoreSchemaRegistry implements SchemaRegistry { this._ajv.addFormat(format.name, { async: format.formatter.async, validate, - // AJV typings list `compare` as required, but it is optional. - // tslint:disable-next-line:no-any - } as any); + }); } addSmartDefaultProvider(source: string, provider: SmartDefaultProvider) { @@ -755,4 +753,17 @@ export class CoreSchemaRegistry implements SchemaRegistry { }), ); } + + useXDeprecatedProvider(onUsage: (message: string) => void): void { + this._ajv.addKeyword('x-deprecated', { + validate: (schema, _data, _parentSchema, _dataPath, _parentDataObject, propertyName) => { + if (schema) { + onUsage(`Option "${propertyName}" is deprecated${typeof schema == 'string' ? ': ' + schema : '.'}`); + } + + return true; + }, + errors: false, + }); + } } 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 bcc902c53d..2a770bf438 100644 --- a/packages/angular_devkit/core/src/json/schema/registry_spec.ts +++ b/packages/angular_devkit/core/src/json/schema/registry_spec.ts @@ -481,4 +481,35 @@ describe('CoreSchemaRegistry', () => { .toPromise().then(done, done.fail); }); + it('adds deprecated options usage', done => { + const registry = new CoreSchemaRegistry(); + const deprecatedMessages: string[] = []; + registry.useXDeprecatedProvider(m => deprecatedMessages.push(m)); + + const data = { + foo: true, + bar: true, + bat: true, + }; + + registry + .compile({ + properties: { + foo: { type: 'boolean', 'x-deprecated': 'Use bar instead.' }, + bar: { type: 'boolean', 'x-deprecated': true }, + buz: { type: 'boolean', 'x-deprecated': true }, + bat: { type: 'boolean', 'x-deprecated': false }, + }, + }) + .pipe( + mergeMap(validator => validator(data)), + map(result => { + expect(deprecatedMessages.length).toBe(2); + expect(deprecatedMessages[0]).toBe('Option "foo" is deprecated: Use bar instead.'); + expect(deprecatedMessages[1]).toBe('Option "bar" is deprecated.'); + expect(result.success).toBe(true, result.errors); + }), + ) + .toPromise().then(done, done.fail); +}); }); diff --git a/packages/angular_devkit/schematics_cli/bin/schematics.ts b/packages/angular_devkit/schematics_cli/bin/schematics.ts index e416303e04..51f0e52564 100644 --- a/packages/angular_devkit/schematics_cli/bin/schematics.ts +++ b/packages/angular_devkit/schematics_cli/bin/schematics.ts @@ -259,6 +259,10 @@ export async function main({ parsedArgs[key] = argv2[key]; } + + // Show usage of deprecated options + workflow.registry.useXDeprecatedProvider(msg => logger.warn(msg)); + // Pass the rest of the arguments as the smart default "argv". Then delete it. workflow.registry.addSmartDefaultProvider('argv', (schema: JsonObject) => { if ('index' in schema) {