Skip to content

Commit

Permalink
fix(@angular-devkit/core): correctly resolve schema references defaults
Browse files Browse the repository at this point in the history
Closes #22600

(cherry picked from commit bf733d6)
  • Loading branch information
alan-agius4 authored and dgp1130 committed Feb 2, 2022
1 parent 76c08e2 commit c8826a9
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 3 deletions.
3 changes: 0 additions & 3 deletions packages/angular_devkit/core/src/json/schema/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,6 @@ export class CoreSchemaRegistry implements SchemaRegistry {
}
}

if (fullReference.startsWith('#')) {
fullReference = fullReference.slice(0, -1);
}
const resolvedSchema = this._ajv.getSchema(fullReference);

return {
Expand Down
2 changes: 2 additions & 0 deletions packages/angular_devkit/core/src/json/schema/transforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export function addUndefinedDefaults(
return value;
}

value ??= schema.default;

const types = getTypesOfSchema(schema);
if (types.size === 0) {
return value;
Expand Down
38 changes: 38 additions & 0 deletions packages/angular_devkit/core/src/json/schema/transforms_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,4 +218,42 @@ describe('addUndefinedDefaults', () => {
expect(dataObj.obj.b).toBeTrue();
expect(dataObj.obj.c).toBeFalse();
});

it('should add defaults to undefined properties when using $refs', async () => {
const registry = new CoreSchemaRegistry();
registry.addPreTransform(addUndefinedDefaults);
const dataNoObj: Record<string, boolean> = {};

const dataObj: Record<string, boolean> = {
boolRef: true,
};

const validator = registry.compile({
definitions: {
boolRef: {
default: false,
type: 'boolean',
},
},
properties: {
bool: {
default: false,
type: 'boolean',
},
boolRef: {
$ref: '#/definitions/boolRef',
},
},
});

const result1 = await validator.pipe(mergeMap((validator) => validator(dataNoObj))).toPromise();
expect(result1.success).toBeTrue();
expect(dataNoObj['bool']).toBeFalse();
expect(dataNoObj['boolRef']).toBeFalse();

const result2 = await validator.pipe(mergeMap((validator) => validator(dataObj))).toPromise();
expect(result2.success).toBeTrue();
expect(dataObj['bool']).toBeFalse();
expect(dataObj['boolRef']).toBeTrue();
});
});

0 comments on commit c8826a9

Please sign in to comment.