Skip to content

Commit c8826a9

Browse files
alan-agius4dgp1130
authored andcommittedFeb 2, 2022
fix(@angular-devkit/core): correctly resolve schema references defaults
Closes #22600 (cherry picked from commit bf733d6)
1 parent 76c08e2 commit c8826a9

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed
 

Diff for: ‎packages/angular_devkit/core/src/json/schema/registry.ts

-3
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,6 @@ export class CoreSchemaRegistry implements SchemaRegistry {
209209
}
210210
}
211211

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

217214
return {

Diff for: ‎packages/angular_devkit/core/src/json/schema/transforms.ts

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export function addUndefinedDefaults(
2020
return value;
2121
}
2222

23+
value ??= schema.default;
24+
2325
const types = getTypesOfSchema(schema);
2426
if (types.size === 0) {
2527
return value;

Diff for: ‎packages/angular_devkit/core/src/json/schema/transforms_spec.ts

+38
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,42 @@ describe('addUndefinedDefaults', () => {
218218
expect(dataObj.obj.b).toBeTrue();
219219
expect(dataObj.obj.c).toBeFalse();
220220
});
221+
222+
it('should add defaults to undefined properties when using $refs', async () => {
223+
const registry = new CoreSchemaRegistry();
224+
registry.addPreTransform(addUndefinedDefaults);
225+
const dataNoObj: Record<string, boolean> = {};
226+
227+
const dataObj: Record<string, boolean> = {
228+
boolRef: true,
229+
};
230+
231+
const validator = registry.compile({
232+
definitions: {
233+
boolRef: {
234+
default: false,
235+
type: 'boolean',
236+
},
237+
},
238+
properties: {
239+
bool: {
240+
default: false,
241+
type: 'boolean',
242+
},
243+
boolRef: {
244+
$ref: '#/definitions/boolRef',
245+
},
246+
},
247+
});
248+
249+
const result1 = await validator.pipe(mergeMap((validator) => validator(dataNoObj))).toPromise();
250+
expect(result1.success).toBeTrue();
251+
expect(dataNoObj['bool']).toBeFalse();
252+
expect(dataNoObj['boolRef']).toBeFalse();
253+
254+
const result2 = await validator.pipe(mergeMap((validator) => validator(dataObj))).toPromise();
255+
expect(result2.success).toBeTrue();
256+
expect(dataObj['bool']).toBeFalse();
257+
expect(dataObj['boolRef']).toBeTrue();
258+
});
221259
});

0 commit comments

Comments
 (0)
Please sign in to comment.