Skip to content

Commit 797bcf9

Browse files
committed
feat(@angular-devkit/core): add useXDeprecatedProvider to SchemaRegistry
Use the new provider to record usage of options which have the `x-deprecated` keyword.
1 parent f3d54ee commit 797bcf9

File tree

5 files changed

+52
-3
lines changed

5 files changed

+52
-3
lines changed

etc/api/angular_devkit/core/src/_golden-api.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ export declare class CoreSchemaRegistry implements SchemaRegistry {
226226
flatten(schema: JsonObject): Observable<JsonObject>;
227227
registerUriHandler(handler: UriHandler): void;
228228
usePromptProvider(provider: PromptProvider): void;
229+
useXDeprecatedProvider(onUsage: (message: string) => void): void;
229230
}
230231

231232
export declare function createWorkspaceHost(host: virtualFs.Host): WorkspaceHost;
@@ -904,6 +905,7 @@ export interface SchemaRegistry {
904905
compile(schema: Object): Observable<SchemaValidator>;
905906
flatten(schema: JsonObject | string): Observable<JsonObject>;
906907
usePromptProvider(provider: PromptProvider): void;
908+
useXDeprecatedProvider(onUsage: (message: string) => void): void;
907909
}
908910

909911
export declare class SchemaValidationException extends BaseException {

packages/angular_devkit/core/src/json/schema/interface.ts

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export interface SchemaRegistry {
117117
addFormat(format: SchemaFormat): void;
118118
addSmartDefaultProvider<T>(source: string, provider: SmartDefaultProvider<T>): void;
119119
usePromptProvider(provider: PromptProvider): void;
120+
useXDeprecatedProvider(onUsage: (message: string) => void): void;
120121

121122
/**
122123
* Add a transformation step before the validation of any Json.

packages/angular_devkit/core/src/json/schema/registry.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,7 @@ export class CoreSchemaRegistry implements SchemaRegistry {
461461
this._ajv.addFormat(format.name, {
462462
async: format.formatter.async,
463463
validate,
464-
// AJV typings list `compare` as required, but it is optional.
465-
// tslint:disable-next-line:no-any
466-
} as any);
464+
});
467465
}
468466

469467
addSmartDefaultProvider<T>(source: string, provider: SmartDefaultProvider<T>) {
@@ -755,4 +753,17 @@ export class CoreSchemaRegistry implements SchemaRegistry {
755753
}),
756754
);
757755
}
756+
757+
useXDeprecatedProvider(onUsage: (message: string) => void): void {
758+
this._ajv.addKeyword('x-deprecated', {
759+
validate: (schema, _data, _parentSchema, _dataPath, _parentDataObject, propertyName) => {
760+
if (schema) {
761+
onUsage(`Option "${propertyName}" is deprecated${typeof schema == 'string' ? ': ' + schema : '.'}`);
762+
}
763+
764+
return true;
765+
},
766+
errors: false,
767+
});
768+
}
758769
}

packages/angular_devkit/core/src/json/schema/registry_spec.ts

+31
Original file line numberDiff line numberDiff line change
@@ -481,4 +481,35 @@ describe('CoreSchemaRegistry', () => {
481481
.toPromise().then(done, done.fail);
482482
});
483483

484+
it('adds deprecated options usage', done => {
485+
const registry = new CoreSchemaRegistry();
486+
const deprecatedMessages: string[] = [];
487+
registry.useXDeprecatedProvider(m => deprecatedMessages.push(m));
488+
489+
const data = {
490+
foo: true,
491+
bar: true,
492+
bat: true,
493+
};
494+
495+
registry
496+
.compile({
497+
properties: {
498+
foo: { type: 'boolean', 'x-deprecated': 'Use bar instead.' },
499+
bar: { type: 'boolean', 'x-deprecated': true },
500+
buz: { type: 'boolean', 'x-deprecated': true },
501+
bat: { type: 'boolean', 'x-deprecated': false },
502+
},
503+
})
504+
.pipe(
505+
mergeMap(validator => validator(data)),
506+
map(result => {
507+
expect(deprecatedMessages.length).toBe(2);
508+
expect(deprecatedMessages[0]).toBe('Option "foo" is deprecated: Use bar instead.');
509+
expect(deprecatedMessages[1]).toBe('Option "bar" is deprecated.');
510+
expect(result.success).toBe(true, result.errors);
511+
}),
512+
)
513+
.toPromise().then(done, done.fail);
514+
});
484515
});

packages/angular_devkit/schematics_cli/bin/schematics.ts

+4
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ export async function main({
259259
parsedArgs[key] = argv2[key];
260260
}
261261

262+
263+
// Show usage of deprecated options
264+
workflow.registry.useXDeprecatedProvider(msg => logger.warn(msg));
265+
262266
// Pass the rest of the arguments as the smart default "argv". Then delete it.
263267
workflow.registry.addSmartDefaultProvider('argv', (schema: JsonObject) => {
264268
if ('index' in schema) {

0 commit comments

Comments
 (0)