Skip to content

Commit

Permalink
fix: can inherit additional properties from heritage clauses
Browse files Browse the repository at this point in the history
  • Loading branch information
plantain-00 committed May 3, 2018
1 parent b89ac31 commit 57f0ac9
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 14 deletions.
6 changes: 3 additions & 3 deletions demo/cases.json
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
"defaultType",
"anyType"
],
"additionalProperties": false
"additionalProperties": true
},
"NumberType": {
"type": "object",
Expand Down Expand Up @@ -392,7 +392,7 @@
}
},
"required": [],
"additionalProperties": true,
"additionalProperties": {},
"minProperties": 1,
"maxProperties": 1
},
Expand Down Expand Up @@ -572,7 +572,7 @@
"interfaceExtendsMember1",
"interfaceExtendsMember2"
],
"additionalProperties": false
"additionalProperties": {}
},
"TypeIntersection": {
"type": "object",
Expand Down
4 changes: 3 additions & 1 deletion demo/cases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ type TypeLiteral = {
/**
* @minProperties 1
* @maxProperties 1
* @additionalProperties
*/
interface Interface {
interfaceMember1?: number
interfaceMember2?: string

[name: string]: any
}

type TypeUnion1 = TypeLiteral | {
Expand Down Expand Up @@ -285,6 +286,7 @@ type ReferenceType = {

/**
* @entry cases.json
* @additionalProperties
*/
export type EntryType = {
optionalMember?: string;
Expand Down
5 changes: 3 additions & 2 deletions demo/debug.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
],
"minProperties": 1,
"maxProperties": 1,
"additionalProperties": true
"additionalProperties": {}
},
{
"kind": "object",
Expand Down Expand Up @@ -361,7 +361,7 @@
}
],
"minProperties": 2,
"maxProperties": 4
"additionalProperties": {}
},
{
"kind": "object",
Expand Down Expand Up @@ -1322,6 +1322,7 @@
],
"minProperties": 20,
"maxProperties": 22,
"additionalProperties": true,
"entry": "cases.json"
}
]
4 changes: 3 additions & 1 deletion online/variables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ export const demoCasesTs = `type TypeLiteral = {
/**
* @minProperties 1
* @maxProperties 1
* @additionalProperties
*/
interface Interface {
interfaceMember1?: number
interfaceMember2?: string
[name: string]: any
}
type TypeUnion1 = TypeLiteral | {
Expand Down Expand Up @@ -292,6 +293,7 @@ type ReferenceType = {
/**
* @entry cases.json
* @additionalProperties
*/
export type EntryType = {
optionalMember?: string;
Expand Down
21 changes: 14 additions & 7 deletions src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,13 @@ export class Parser {
return
}

let { members, minProperties, maxProperties, additionalProperties } = this.getObjectMembers(declaration.members);
let { members, minProperties, maxProperties, additionalProperties } = this.getObjectMembers(declaration.members)

({ minProperties, maxProperties } = this.handleHeritageClauses(declaration, members, minProperties, maxProperties))
let additionalPropertiesFromHeritageClauses: Type | undefined | boolean
({ minProperties, maxProperties, additionalProperties: additionalPropertiesFromHeritageClauses } = this.handleHeritageClauses(declaration, members, minProperties, maxProperties))
if (additionalPropertiesFromHeritageClauses) {
additionalProperties = additionalPropertiesFromHeritageClauses
}

const model: Model = {
kind: 'object',
Expand All @@ -130,25 +134,28 @@ export class Parser {
}

private handleHeritageClauses(declaration: ts.InterfaceDeclaration, members: Member[], minProperties: number, maxProperties: number) {
let additionalProperties: Type | undefined | boolean
if (declaration.heritageClauses) {
for (const clause of declaration.heritageClauses) {
if (clause.kind === ts.SyntaxKind.HeritageClause) {
for (const type of clause.types) {
if (type.kind === ts.SyntaxKind.ExpressionWithTypeArguments) {
({ minProperties, maxProperties } = this.handleExpressionWithTypeArguments(type.expression as ts.Identifier, members, minProperties, maxProperties))
({ minProperties, maxProperties, additionalProperties } = this.handleExpressionWithTypeArguments(type.expression as ts.Identifier, members, minProperties, maxProperties))
}
}
}
}
}
return { minProperties, maxProperties }
return { minProperties, maxProperties, additionalProperties }
}

private handleExpressionWithTypeArguments(declaration: ts.Identifier, members: Member[], minProperties: number, maxProperties: number) {
const interfaceName = declaration.text
this.preHandleType(interfaceName)
let additionalProperties: Type | undefined | boolean
const clauseModel = this.models.find(m => m.kind === 'object' && m.name === interfaceName)
if (clauseModel && clauseModel.kind === 'object') {
additionalProperties = clauseModel.additionalProperties
for (const member of clauseModel.members) {
if (members.every(m => m.name !== member.name)) {
members.push(member)
Expand All @@ -159,7 +166,7 @@ export class Parser {
}
}
}
return { minProperties, maxProperties }
return { minProperties, maxProperties, additionalProperties }
}

private handleTypeAliasDeclaration(declaration: ts.TypeAliasDeclaration, jsDocs: JsDoc[], entry: JsDoc | undefined) {
Expand Down Expand Up @@ -634,7 +641,7 @@ export class Parser {
const members: Member[] = []
let minProperties = 0
let maxProperties = 0
let additionalProperties: Type | undefined
let additionalProperties: Type | undefined | boolean
for (const element of elements) {
if (element.kind === ts.SyntaxKind.PropertySignature) {
const property = element as ts.PropertySignature
Expand Down Expand Up @@ -906,5 +913,5 @@ type MembersInfo = {
members: Member[];
minProperties: number;
maxProperties: number;
additionalProperties?: Type;
additionalProperties?: Type | boolean;
}

0 comments on commit 57f0ac9

Please sign in to comment.