Skip to content

Commit 010adce

Browse files
authored
fix: return overrides schema in getSchemaForSymbol (YousefED#590)
1 parent 0a963ca commit 010adce

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

test/schema.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,52 @@ describe("interfaces", () => {
168168
assert.deepEqual(schema.definitions!["MySubObject"], schemaOverride);
169169
}
170170
});
171+
it("should output the schemas set by setSchemaOverride with getSchemaForSymbol", () => {
172+
const program = TJS.getProgramFromFiles([resolve(BASE + "interface-multi/main.ts")]);
173+
const generator = TJS.buildGenerator(program);
174+
assert(generator !== null);
175+
176+
const schemaOverride1: TJS.Definition = { type: "string" };
177+
const schemaOverride2: TJS.Definition = { type: "integer" };
178+
179+
generator?.setSchemaOverride("MySubObject", schemaOverride1);
180+
generator?.setSchemaOverride("MySubObject2", schemaOverride2);
181+
const schema = generator?.getSchemaForSymbol("MySubObject");
182+
183+
// Should not change original schema object.
184+
assert.deepEqual(schemaOverride1, { type: "string" });
185+
assert.deepEqual(schemaOverride2, { type: "integer" });
186+
187+
assert.deepEqual(schema, { ...schemaOverride1, $schema: "http://json-schema.org/draft-07/schema#" });
188+
});
189+
it("should output the schemas set by setSchemaOverride with getSchemaForSymbol and other overrides", () => {
190+
const program = TJS.getProgramFromFiles([resolve(BASE + "interface-multi/main.ts")]);
191+
const generator = TJS.buildGenerator(program);
192+
assert(generator !== null);
193+
const schemaOverride1: TJS.Definition = { type: "string" };
194+
const schemaOverride2: TJS.Definition = { type: "integer" };
195+
196+
generator?.setSchemaOverride("MySubObject1", schemaOverride1);
197+
generator?.setSchemaOverride("MySubObject2", schemaOverride2);
198+
const schema = generator?.getSchemaForSymbol("MySubObject1", true, true);
199+
200+
// Should not change original schema object.
201+
assert.deepEqual(schemaOverride1, { type: "string" });
202+
assert.deepEqual(schemaOverride2, { type: "integer" });
203+
204+
assert.deepEqual(schema, {
205+
...schemaOverride1,
206+
$schema: "http://json-schema.org/draft-07/schema#",
207+
definitions: {
208+
MySubObject1: {
209+
type: "string"
210+
},
211+
MySubObject2: {
212+
type: "integer"
213+
}
214+
}
215+
});
216+
});
171217
it("should ignore type aliases that have schema overrides", () => {
172218
const program = TJS.getProgramFromFiles([resolve(BASE + "type-alias-schema-override/main.ts")]);
173219
const generator = TJS.buildGenerator(program);

typescript-json-schema.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,20 +1518,26 @@ export class JsonSchemaGenerator {
15181518
}
15191519

15201520
public getSchemaForSymbol(symbolName: string, includeReffedDefinitions: boolean = true, includeAllOverrides: boolean = false): Definition {
1521-
if (!this.allSymbols[symbolName]) {
1521+
const overrideDefinition = this.schemaOverrides.get(symbolName);
1522+
if (!this.allSymbols[symbolName] && !overrideDefinition) {
15221523
throw new Error(`type ${symbolName} not found`);
15231524
}
15241525

15251526
this.resetSchemaSpecificProperties(includeAllOverrides);
15261527

1527-
const def = this.getTypeDefinition(
1528-
this.allSymbols[symbolName],
1529-
this.args.topRef,
1530-
undefined,
1531-
undefined,
1532-
undefined,
1533-
this.userSymbols[symbolName] || undefined
1534-
);
1528+
let def;
1529+
if (overrideDefinition) {
1530+
def = { ...overrideDefinition };
1531+
} else {
1532+
def = overrideDefinition ? overrideDefinition : this.getTypeDefinition(
1533+
this.allSymbols[symbolName],
1534+
this.args.topRef,
1535+
undefined,
1536+
undefined,
1537+
undefined,
1538+
this.userSymbols[symbolName] || undefined
1539+
);
1540+
}
15351541

15361542
if (this.args.ref && includeReffedDefinitions && Object.keys(this.reffedDefinitions).length > 0) {
15371543
def.definitions = this.reffedDefinitions;

0 commit comments

Comments
 (0)