Skip to content

Commit 3803bd4

Browse files
committed
Fix issue where we don’t use short defintions for aliased types.
1 parent 54f5e5e commit 3803bd4

File tree

12 files changed

+74
-63
lines changed

12 files changed

+74
-63
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22
interface MyObject {
3-
number: number;
4-
string: string;
3+
prop: number;
54
}
65

7-
type MyAlias = MyObject;
6+
type MyAlias = MyObject;

test/programs/type-aliases-alias-ref-topref/schema.json

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@
44
"MyObject": {
55
"type": "object",
66
"properties": {
7-
"number": {
7+
"prop": {
88
"type": "number"
9-
},
10-
"string": {
11-
"type": "string"
129
}
1310
},
1411
"required": [
15-
"number",
16-
"string"
12+
"prop"
1713
]
14+
},
15+
"MyAlias": {
16+
"$ref": "#/definitions/MyObject"
1817
}
1918
},
20-
"$ref": "#/definitions/MyObject"
19+
"$ref": "#/definitions/MyAlias"
2120
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22
interface MyObject {
3-
number: number;
4-
string: string;
3+
prop: number;
54
}
65

7-
type MyAlias = MyObject;
6+
type MyAlias = MyObject;
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
{
22
"$schema": "http://json-schema.org/draft-04/schema#",
33
"properties": {
4-
"number": {
4+
"prop": {
55
"type": "number"
6-
},
7-
"string": {
8-
"type": "string"
96
}
107
},
118
"required": [
12-
"number",
13-
"string"
9+
"prop"
1410
],
1511
"type": "object"
1612
}

test/programs/type-aliases-recursive-alias-topref/main.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ interface MyObject {
44
self: MyObject;
55
}
66

7-
type MyAlias = MyObject;
7+
type MyAlias = MyObject;

test/programs/type-aliases-recursive-alias-topref/schema.json

+3-15
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,7 @@
22
"$schema": "http://json-schema.org/draft-04/schema#",
33
"definitions": {
44
"MyAlias": {
5-
"properties": {
6-
"alias": {
7-
"$ref": "#/definitions/MyAlias"
8-
},
9-
"self": {
10-
"$ref": "#/definitions/MyObject"
11-
}
12-
},
13-
"required": [
14-
"alias",
15-
"self"
16-
],
17-
"type": "object"
5+
"$ref": "#/definitions/MyObject"
186
},
197
"MyObject": {
208
"properties": {
@@ -32,5 +20,5 @@
3220
"type": "object"
3321
}
3422
},
35-
"$ref": "#/definitions/MyObject"
36-
}
23+
"$ref": "#/definitions/MyAlias"
24+
}

test/programs/type-aliases-recursive-object-topref/main.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ interface MyObject {
44
self: MyObject;
55
}
66

7-
type MyAlias = MyObject;
7+
type MyAlias = MyObject;

test/programs/type-aliases-recursive-object-topref/schema.json

+2-14
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,7 @@
22
"$schema": "http://json-schema.org/draft-04/schema#",
33
"definitions": {
44
"MyAlias": {
5-
"properties": {
6-
"alias": {
7-
"$ref": "#/definitions/MyAlias"
8-
},
9-
"self": {
10-
"$ref": "#/definitions/MyObject"
11-
}
12-
},
13-
"required": [
14-
"alias",
15-
"self"
16-
],
17-
"type": "object"
5+
"$ref": "#/definitions/MyObject"
186
},
197
"MyObject": {
208
"properties": {
@@ -33,4 +21,4 @@
3321
}
3422
},
3523
"$ref": "#/definitions/MyObject"
36-
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
interface MyObject {
3+
alias: MyAlias;
4+
self: MyObject;
5+
}
6+
7+
type MyAlias = MyObject;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$ref": "#/definitions/MyObject",
3+
"$schema": "http://json-schema.org/draft-04/schema#",
4+
"definitions": {
5+
"MyObject": {
6+
"properties": {
7+
"alias": {
8+
"$ref": "#/definitions/MyObject"
9+
},
10+
"self": {
11+
"$ref": "#/definitions/MyObject"
12+
}
13+
},
14+
"required": [
15+
"alias",
16+
"self"
17+
],
18+
"type": "object"
19+
}
20+
}
21+
}

test/schema.test.ts

+21-10
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,18 @@ describe("schema", function () {
6363

6464
assertSchema("namespace", "main.ts", "Type");
6565

66-
assertSchema("type-union", "main.ts", "MyObject");
67-
assertSchema("type-intersection", "main.ts", "MyObject");
66+
assertSchema("type-anonymous", "main.ts", "MyObject");
67+
assertSchema("type-primitives", "main.ts", "MyObject");
68+
assertSchema("type-nullable", "main.ts", "MyObject");
69+
70+
assertSchema("optionals", "main.ts", "MyObject");
71+
72+
assertSchema("comments", "main.ts", "MyObject");
73+
assertSchema("comments-override", "main.ts", "MyObject");
74+
75+
/**
76+
* Type aliases
77+
*/
6878

6979
assertSchema("type-alias-single", "main.ts", "MyString");
7080
assertSchema("type-aliases", "main.ts", "MyObject", {
@@ -92,16 +102,17 @@ describe("schema", function () {
92102
useTypeAliasRef: true,
93103
useRootRef: true
94104
});
105+
assertSchema("type-no-aliases-recursive-topref", "main.ts", "MyAlias", {
106+
useTypeAliasRef: false,
107+
useRootRef: true
108+
});
95109

96-
assertSchema("type-anonymous", "main.ts", "MyObject");
97-
assertSchema("type-primitives", "main.ts", "MyObject");
98-
assertSchema("type-nullable", "main.ts", "MyObject");
99-
100-
assertSchema("optionals", "main.ts", "MyObject");
101-
102-
assertSchema("comments", "main.ts", "MyObject");
103-
assertSchema("comments-override", "main.ts", "MyObject");
110+
/**
111+
* unions and intersections
112+
*/
104113

114+
assertSchema("type-union", "main.ts", "MyObject");
115+
assertSchema("type-intersection", "main.ts", "MyObject");
105116
assertSchema("type-union-tagged", "main.ts", "Shape");
106117
assertSchema("type-aliases-union-namespace", "main.ts", "MyModel");
107118

typescript-json-schema.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,9 @@ export class JsonSchemaGenerator {
615615
// if it will be a $ref and it is not yet created
616616
if (!asRef || !this.reffedDefinitions[fullTypeName]) {
617617
if (asRef) { // must be here to prevent recursivity problems
618-
this.reffedDefinitions[fullTypeName] = definition;
618+
this.reffedDefinitions[fullTypeName] = this.args.useTypeAliasRef && symbol && reffedType && reffedType.getFlags() & ts.TypeFlags.IndexedAccess ? {
619+
"$ref": "#/definitions/" + symbol.getName()
620+
} : definition;
619621
if (this.args.useTitle && fullTypeName) {
620622
definition.title = fullTypeName;
621623
}
@@ -659,7 +661,6 @@ export class JsonSchemaGenerator {
659661
def.definitions = this.reffedDefinitions;
660662
}
661663
def["$schema"] = "http://json-schema.org/draft-04/schema#";
662-
// console.log(JSON.stringify(def, null, 4) + "\n");
663664
return def;
664665
}
665666

@@ -709,8 +710,10 @@ export function generateSchema(program: ts.Program, fullTypeName: string, args =
709710
|| node.kind === ts.SyntaxKind.EnumDeclaration
710711
|| node.kind === ts.SyntaxKind.TypeAliasDeclaration
711712
) {
713+
const symbol: ts.Symbol = (<any>node).symbol;
714+
let fullName = tc.getFullyQualifiedName(symbol);
715+
712716
const nodeType = tc.getTypeAtLocation(node);
713-
let fullName = tc.getFullyQualifiedName((<any>node).symbol);
714717

715718
// remove file name
716719
// TODO: we probably don't want this eventually,

0 commit comments

Comments
 (0)