diff --git a/README.md b/README.md index 179065f..0fb6170 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Genetate json scheme or protobuf file from types. + type array + tagged field + marked as more precise type ++ enum #### supported types features diff --git a/demo/cases-debug.json b/demo/cases-debug.json index 5e38c38..0e10d3e 100644 --- a/demo/cases-debug.json +++ b/demo/cases-debug.json @@ -1,4 +1,13 @@ [ + { + "kind": "enum", + "name": "StringEnum", + "type": "string", + "members": { + "enumMember1": "enum member 1", + "enumMember2": "enum member 2" + } + }, { "kind": "object", "name": "TypeLiteral", @@ -62,6 +71,67 @@ "minProperties": 0, "maxProperties": 2 }, + { + "kind": "object", + "name": "TypeUnion2", + "members": [ + { + "name": "kind", + "type": { + "kind": "enum", + "type": "string", + "enums": [ + "enum member 1", + "enum member 2" + ] + } + }, + { + "name": "typeUnionMember1", + "type": { + "kind": "string" + }, + "optional": true + }, + { + "name": "typeUnionMember2", + "type": { + "kind": "string" + }, + "optional": true + } + ], + "minProperties": 2, + "maxProperties": 2 + }, + { + "kind": "object", + "name": "TypeUnion3", + "members": [ + { + "name": "kind", + "type": { + "kind": "unknown" + } + }, + { + "name": "typeUnionMember1", + "type": { + "kind": "string" + }, + "optional": true + }, + { + "name": "typeUnionMember2", + "type": { + "kind": "string" + }, + "optional": true + } + ], + "minProperties": 2, + "maxProperties": 2 + }, { "kind": "object", "name": "InterfaceExtends", @@ -118,19 +188,73 @@ "maxProperties": 2 }, { - "kind": "array", - "name": "TypeArray", - "type": { - "kind": "reference", - "name": "TypeLiteral" - } + "kind": "object", + "name": "TypeIntersection2", + "members": [ + { + "name": "typeIntersectionMember1", + "type": { + "kind": "number", + "type": "number" + } + }, + { + "name": "typeIntersectionMember2", + "type": { + "kind": "string" + } + }, + { + "name": "typeIntersectionMember3", + "type": { + "kind": "number", + "type": "number" + } + }, + { + "name": "typeIntersectionMember4", + "type": { + "kind": "string" + } + } + ], + "minProperties": 4, + "maxProperties": 4 }, { "kind": "object", - "name": "MapType", - "members": [], - "minProperties": 0, - "maxProperties": 0 + "name": "TypeUnionAndIntersection", + "members": [ + { + "name": "typeIntersectionMember1", + "type": { + "kind": "number", + "type": "number" + } + }, + { + "name": "kind", + "type": { + "kind": "unknown" + } + }, + { + "name": "typeUnionMember1", + "type": { + "kind": "string" + }, + "optional": true + }, + { + "name": "typeUnionMember2", + "type": { + "kind": "string" + }, + "optional": true + } + ], + "minProperties": 3, + "maxProperties": 3 }, { "kind": "object", @@ -160,162 +284,301 @@ "name": "PreciseType", "members": [ { - "name": "booleanBar", + "name": "optionalMember", + "type": { + "kind": "string" + }, + "optional": true + }, + { + "name": "booleanMember", "type": { "kind": "boolean" } }, { - "name": "stringBar", + "name": "stringMember", "type": { "kind": "string" } }, { - "name": "numberBar", + "name": "numberMember", "type": { "kind": "number", "type": "number" } }, { - "name": "integerBar", + "name": "integerMember", "type": { "kind": "number", "type": "integer" } }, { - "name": "uint32Bar", + "name": "uint32Member", "type": { "kind": "number", "type": "uint32" } }, { - "name": "int32Bar", + "name": "int32Member", "type": { "kind": "number", "type": "int32" } }, { - "name": "sint32Bar", + "name": "sint32Member", "type": { "kind": "number", "type": "sint32" } }, { - "name": "fixed32Bar", + "name": "fixed32Member", "type": { "kind": "number", "type": "fixed32" } }, { - "name": "sfixed32Bar", + "name": "sfixed32Member", "type": { "kind": "number", "type": "sfixed32" } }, { - "name": "uint64Bar", + "name": "uint64Member", "type": { "kind": "number", "type": "uint64" } }, { - "name": "int64Bar", + "name": "int64Member", "type": { "kind": "number", "type": "int64" } }, { - "name": "sint64Bar", + "name": "sint64Member", "type": { "kind": "number", "type": "sint64" } }, { - "name": "fixed64Bar", + "name": "fixed64Member", "type": { "kind": "number", "type": "fixed64" } }, { - "name": "sfixed64Bar", + "name": "sfixed64Member", "type": { "kind": "number", "type": "sfixed64" } }, { - "name": "floatBar", + "name": "floatMember", "type": { "kind": "number", "type": "float" } }, { - "name": "doubleBar", + "name": "doubleMember", "type": { "kind": "number", "type": "double" } }, + { + "name": "arrayType", + "type": { + "kind": "array", + "type": { + "kind": "string" + } + } + }, + { + "name": "arrayType2", + "type": { + "kind": "array", + "type": { + "kind": "reference", + "name": "TypeLiteral" + } + } + }, + { + "name": "arrayType3", + "type": { + "kind": "array", + "type": { + "kind": "object", + "members": [ + { + "name": "literal", + "type": { + "kind": "number", + "type": "number" + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + } + }, { "name": "typeLiteral", + "type": { + "kind": "object", + "members": [ + { + "name": "literal", + "type": { + "kind": "number", + "type": "number" + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + }, + { + "name": "referenceType", "type": { "kind": "reference", "name": "TypeLiteral" } }, { - "name": "interface", + "name": "referenceType2", "type": { "kind": "reference", "name": "Interface" } }, { - "name": "typeUnion", + "name": "referenceType3", "type": { "kind": "reference", "name": "TypeUnion" } }, { - "name": "interfaceExtends", + "name": "referenceType4", + "type": { + "kind": "reference", + "name": "TypeUnion2" + } + }, + { + "name": "referenceType5", + "type": { + "kind": "reference", + "name": "TypeUnion3" + } + }, + { + "name": "referenceType6", "type": { "kind": "reference", "name": "InterfaceExtends" } }, { - "name": "typeIntersection", + "name": "referenceType7", "type": { "kind": "reference", "name": "TypeIntersection" } }, { - "name": "typeArray", + "name": "referenceType8", "type": { "kind": "reference", - "name": "TypeArray" + "name": "TypeIntersection2" } }, { - "name": "mapType", + "name": "referenceType9", "type": { "kind": "reference", - "name": "MapType" + "name": "TypeUnionAndIntersection" + } + }, + { + "name": "mapType", + "type": { + "kind": "map", + "key": { + "kind": "string" + }, + "value": { + "kind": "number", + "type": "number" + } + } + }, + { + "name": "mapType2", + "type": { + "kind": "map", + "key": { + "kind": "string" + }, + "value": { + "kind": "reference", + "name": "TypeLiteral" + } + } + }, + { + "name": "mapType3", + "type": { + "kind": "map", + "key": { + "kind": "string" + }, + "value": { + "kind": "object", + "members": [ + { + "name": "literal", + "type": { + "kind": "number", + "type": "number" + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + } + }, + { + "name": "mapType4", + "type": { + "kind": "map", + "key": { + "kind": "string" + }, + "value": { + "kind": "number", + "type": "uint32" + } } }, { @@ -324,10 +587,24 @@ "kind": "reference", "name": "TaggedField" } + }, + { + "name": "stringEnum", + "type": { + "kind": "reference", + "name": "StringEnum" + } + }, + { + "name": "enum", + "type": { + "kind": "reference", + "name": "Enum" + } } ], - "minProperties": 24, - "maxProperties": 24, + "minProperties": 36, + "maxProperties": 37, "entry": "cases.json" } ] \ No newline at end of file diff --git a/demo/cases.json b/demo/cases.json index 5d4e7cb..4e9bfaf 100644 --- a/demo/cases.json +++ b/demo/cases.json @@ -4,124 +4,225 @@ "PreciseType": { "type": "object", "properties": { - "booleanBar": { + "optionalMember": { + "type": "string" + }, + "booleanMember": { "type": "boolean" }, - "stringBar": { + "stringMember": { "type": "string" }, - "numberBar": { + "numberMember": { "type": "number" }, - "integerBar": { + "integerMember": { "type": "integer" }, - "uint32Bar": { + "uint32Member": { "type": "integer", "minimum": 0, "maximum": 4294967295 }, - "int32Bar": { + "int32Member": { "type": "integer", "minimum": -2147483648, "maximum": 2147483647 }, - "sint32Bar": { + "sint32Member": { "type": "integer", "minimum": -2147483648, "maximum": 2147483647 }, - "fixed32Bar": { + "fixed32Member": { "type": "integer", "minimum": 0, "maximum": 4294967295 }, - "sfixed32Bar": { + "sfixed32Member": { "type": "integer", "minimum": -2147483648, "maximum": 2147483647 }, - "uint64Bar": { + "uint64Member": { "type": "integer", "minimum": 0, "maximum": 18446744073709552000 }, - "int64Bar": { + "int64Member": { "type": "integer", "minimum": -9223372036854776000, "maximum": 9223372036854776000 }, - "sint64Bar": { + "sint64Member": { "type": "integer", "minimum": -9223372036854776000, "maximum": 9223372036854776000 }, - "fixed64Bar": { + "fixed64Member": { "type": "integer", "minimum": 0, "maximum": 18446744073709552000 }, - "sfixed64Bar": { + "sfixed64Member": { "type": "integer", "minimum": -9223372036854776000, "maximum": 9223372036854776000 }, - "floatBar": { + "floatMember": { "type": "number" }, - "doubleBar": { + "doubleMember": { "type": "number" }, + "arrayType": { + "type": "array", + "items": { + "type": "string" + } + }, + "arrayType2": { + "type": "array", + "items": { + "$ref": "#/definitions/TypeLiteral" + } + }, + "arrayType3": { + "type": "array", + "items": { + "type": "object", + "properties": { + "literal": { + "type": "number" + } + }, + "required": [ + "literal" + ], + "additionalProperties": false + } + }, "typeLiteral": { + "type": "object", + "properties": { + "literal": { + "type": "number" + } + }, + "required": [ + "literal" + ], + "additionalProperties": false + }, + "referenceType": { "$ref": "#/definitions/TypeLiteral" }, - "interface": { + "referenceType2": { "$ref": "#/definitions/Interface" }, - "typeUnion": { + "referenceType3": { "$ref": "#/definitions/TypeUnion" }, - "interfaceExtends": { + "referenceType4": { + "$ref": "#/definitions/TypeUnion2" + }, + "referenceType5": { + "$ref": "#/definitions/TypeUnion3" + }, + "referenceType6": { "$ref": "#/definitions/InterfaceExtends" }, - "typeIntersection": { + "referenceType7": { "$ref": "#/definitions/TypeIntersection" }, - "typeArray": { - "$ref": "#/definitions/TypeArray" + "referenceType8": { + "$ref": "#/definitions/TypeIntersection2" + }, + "referenceType9": { + "$ref": "#/definitions/TypeUnionAndIntersection" }, "mapType": { - "$ref": "#/definitions/MapType" + "type": "object", + "additionalProperties": { + "type": "number" + } + }, + "mapType2": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/TypeLiteral" + } + }, + "mapType3": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "literal": { + "type": "number" + } + }, + "required": [ + "literal" + ], + "additionalProperties": false + } + }, + "mapType4": { + "type": "object", + "additionalProperties": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } }, "taggedField": { "$ref": "#/definitions/TaggedField" + }, + "stringEnum": { + "$ref": "#/definitions/StringEnum" + }, + "enum": { + "$ref": "#/definitions/Enum" } }, "required": [ - "booleanBar", - "stringBar", - "numberBar", - "integerBar", - "uint32Bar", - "int32Bar", - "sint32Bar", - "fixed32Bar", - "sfixed32Bar", - "uint64Bar", - "int64Bar", - "sint64Bar", - "fixed64Bar", - "sfixed64Bar", - "floatBar", - "doubleBar", + "booleanMember", + "stringMember", + "numberMember", + "integerMember", + "uint32Member", + "int32Member", + "sint32Member", + "fixed32Member", + "sfixed32Member", + "uint64Member", + "int64Member", + "sint64Member", + "fixed64Member", + "sfixed64Member", + "floatMember", + "doubleMember", + "arrayType", + "arrayType2", + "arrayType3", "typeLiteral", - "interface", - "typeUnion", - "interfaceExtends", - "typeIntersection", - "typeArray", + "referenceType", + "referenceType2", + "referenceType3", + "referenceType4", + "referenceType5", + "referenceType6", + "referenceType7", + "referenceType8", + "referenceType9", "mapType", - "taggedField" + "mapType2", + "mapType3", + "mapType4", + "taggedField", + "stringEnum", + "enum" ], "additionalProperties": false }, @@ -173,6 +274,50 @@ ], "additionalProperties": false }, + "TypeUnion2": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "enum member 1", + "enum member 2" + ] + }, + "typeUnionMember1": { + "type": "string" + }, + "typeUnionMember2": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "additionalProperties": false, + "minProperties": 2, + "maxProperties": 2 + }, + "TypeUnion3": { + "type": "object", + "properties": { + "kind": { + "type": "unknown" + }, + "typeUnionMember1": { + "type": "string" + }, + "typeUnionMember2": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "additionalProperties": false, + "minProperties": 2, + "maxProperties": 2 + }, "InterfaceExtends": { "type": "object", "properties": { @@ -213,18 +358,54 @@ ], "additionalProperties": false }, - "TypeArray": { - "type": "array", - "items": { - "$ref": "#/definitions/TypeLiteral" - } - }, - "MapType": { + "TypeIntersection2": { "type": "object", - "properties": {}, - "required": [], + "properties": { + "typeIntersectionMember1": { + "type": "number" + }, + "typeIntersectionMember2": { + "type": "string" + }, + "typeIntersectionMember3": { + "type": "number" + }, + "typeIntersectionMember4": { + "type": "string" + } + }, + "required": [ + "typeIntersectionMember1", + "typeIntersectionMember2", + "typeIntersectionMember3", + "typeIntersectionMember4" + ], "additionalProperties": false }, + "TypeUnionAndIntersection": { + "type": "object", + "properties": { + "typeIntersectionMember1": { + "type": "number" + }, + "kind": { + "type": "unknown" + }, + "typeUnionMember1": { + "type": "string" + }, + "typeUnionMember2": { + "type": "string" + } + }, + "required": [ + "typeIntersectionMember1", + "kind" + ], + "additionalProperties": false, + "minProperties": 3, + "maxProperties": 3 + }, "TaggedField": { "type": "object", "properties": { diff --git a/demo/cases.proto b/demo/cases.proto index db03ac8..7444528 100644 --- a/demo/cases.proto +++ b/demo/cases.proto @@ -15,6 +15,18 @@ message TypeUnion { string typeUnionMember2 = 2; } +message TypeUnion2 { + string kind = 1; + string typeUnionMember1 = 2; + string typeUnionMember2 = 3; +} + +message TypeUnion3 { + kind = 1; + string typeUnionMember1 = 2; + string typeUnionMember2 = 3; +} + message InterfaceExtends { double interfaceExtendsMember1 = 1; string interfaceExtendsMember2 = 2; @@ -27,8 +39,18 @@ message TypeIntersection { string typeIntersectionMember2 = 2; } -message MapType { +message TypeIntersection2 { + double typeIntersectionMember1 = 1; + string typeIntersectionMember2 = 2; + double typeIntersectionMember3 = 3; + string typeIntersectionMember4 = 4; +} +message TypeUnionAndIntersection { + double typeIntersectionMember1 = 1; + kind = 2; + string typeUnionMember1 = 3; + string typeUnionMember2 = 4; } message TaggedField { @@ -37,28 +59,41 @@ message TaggedField { } message PreciseType { - bool booleanBar = 1; - string stringBar = 2; - double numberBar = 3; - int32 integerBar = 4; - uint32 uint32Bar = 5; - int32 int32Bar = 6; - sint32 sint32Bar = 7; - fixed32 fixed32Bar = 8; - sfixed32 sfixed32Bar = 9; - uint64 uint64Bar = 10; - int64 int64Bar = 11; - sint64 sint64Bar = 12; - fixed64 fixed64Bar = 13; - sfixed64 sfixed64Bar = 14; - float floatBar = 15; - double doubleBar = 16; - TypeLiteral typeLiteral = 17; - Interface interface = 18; - TypeUnion typeUnion = 19; - InterfaceExtends interfaceExtends = 20; - TypeIntersection typeIntersection = 21; - TypeArray typeArray = 22; - MapType mapType = 23; - TaggedField taggedField = 24; + string optionalMember = 1; + bool booleanMember = 2; + string stringMember = 3; + double numberMember = 4; + int32 integerMember = 5; + uint32 uint32Member = 6; + int32 int32Member = 7; + sint32 sint32Member = 8; + fixed32 fixed32Member = 9; + sfixed32 sfixed32Member = 10; + uint64 uint64Member = 11; + int64 int64Member = 12; + sint64 sint64Member = 13; + fixed64 fixed64Member = 14; + sfixed64 sfixed64Member = 15; + float floatMember = 16; + double doubleMember = 17; + repeated string arrayType = 18; + repeated TypeLiteral arrayType2 = 19; + repeated arrayType3 = 20; + typeLiteral = 21; + TypeLiteral referenceType = 22; + Interface referenceType2 = 23; + TypeUnion referenceType3 = 24; + TypeUnion2 referenceType4 = 25; + TypeUnion3 referenceType5 = 26; + InterfaceExtends referenceType6 = 27; + TypeIntersection referenceType7 = 28; + TypeIntersection2 referenceType8 = 29; + TypeUnionAndIntersection referenceType9 = 30; + map mapType = 31; + map mapType2 = 32; + map mapType3 = 33; + map mapType4 = 34; + TaggedField taggedField = 35; + StringEnum stringEnum = 36; + Enum enum = 37; } diff --git a/demo/cases.ts b/demo/cases.ts index 77d0295..3eee6e5 100644 --- a/demo/cases.ts +++ b/demo/cases.ts @@ -1,40 +1,65 @@ -// type literal type TypeLiteral = { typeLiteralMember1: number; typeLiteralMember2: string; }; -// interface interface Interface { interfaceMember1: number; interfaceMember2: string; } -// type union type TypeUnion = TypeLiteral | { typeUnionMember1: number; typeUnionMember2: string; }; +type TypeUnion2 = + { + kind: StringEnum.enumMember1; + typeUnionMember1: string; + } | { + kind: StringEnum.enumMember2; + typeUnionMember2: string; + }; +type TypeUnion3 = + { + kind: Enum.enumMember1; + typeUnionMember1: string; + } | { + kind: Enum.enumMember2; + typeUnionMember2: string; + }; -// interface extends interface InterfaceExtends extends Interface { interfaceExtendsMember1: number; interfaceExtendsMember2: string; } -// type intersection type TypeIntersection = Interface & { typeIntersectionMember1: number; typeIntersectionMember2: string; }; +type TypeIntersection2 = + { + typeIntersectionMember1: number; + typeIntersectionMember2: string; + } & { + typeIntersectionMember3: number; + typeIntersectionMember4: string; + }; -// type array -type TypeArray = TypeLiteral[]; +type TypeUnionAndIntersection = + { + typeIntersectionMember1: number; + } & ( + { + kind: Enum.enumMember1; + typeUnionMember1: string; + } | { + kind: Enum.enumMember2; + typeUnionMember2: string; + } + ); -// map type -type MapType = { [name: string]: TypeLiteral }; - -// tagged field export type TaggedField = { /** * @tag 2 @@ -46,79 +71,110 @@ export type TaggedField = { taggedFieldMember2: string; }; -// marked as more precise type +export const enum StringEnum { + enumMember1 = "enum member 1", + enumMember2 = "enum member 2", +} + +export const enum Enum { + enumMember1, + enumMember2, +} + /** * @entry cases.json */ export type PreciseType = { - booleanBar: boolean; + optionalMember?: string; + + booleanMember: boolean; - stringBar: string; + stringMember: string; - numberBar: number; + numberMember: number; /** * @type integer */ - integerBar: number; + integerMember: number; /** * @type uint32 */ - uint32Bar: number; + uint32Member: number; /** * @type int32 */ - int32Bar: number; + int32Member: number; /** * @type sint32 */ - sint32Bar: number; + sint32Member: number; /** * @type fixed32 */ - fixed32Bar: number; + fixed32Member: number; /** * @type sfixed32 */ - sfixed32Bar: number; + sfixed32Member: number; /** * @type uint64 */ - uint64Bar: number; + uint64Member: number; /** * @type int64 */ - int64Bar: number; + int64Member: number; /** * @type sint64 */ - sint64Bar: number; + sint64Member: number; /** * @type fixed64 */ - fixed64Bar: number; + fixed64Member: number; /** * @type sfixed64 */ - sfixed64Bar: number; + sfixed64Member: number; /** * @type float */ - floatBar: number; + floatMember: number; /** * @type double */ - doubleBar: number; + doubleMember: number; + + arrayType: string[]; + arrayType2: TypeLiteral[]; + arrayType3: { literal: number }[]; + + typeLiteral: { literal: number }; + + referenceType: TypeLiteral; + referenceType2: Interface; + referenceType3: TypeUnion; + referenceType4: TypeUnion2; + referenceType5: TypeUnion3; + referenceType6: InterfaceExtends; + referenceType7: TypeIntersection; + referenceType8: TypeIntersection2; + referenceType9: TypeUnionAndIntersection; + + mapType: { [name: string]: number }; + mapType2: { [name: string]: TypeLiteral }; + mapType3: { [name: string]: { literal: number } }; + /** + * @mapValueType uint32 + */ + mapType4: { [name: string]: number }; - typeLiteral: TypeLiteral; - interface: Interface; - typeUnion: TypeUnion; - interfaceExtends: InterfaceExtends; - typeIntersection: TypeIntersection; - typeArray: TypeArray; - mapType: MapType; taggedField: TaggedField; + + stringEnum: StringEnum; + enum: Enum; }; diff --git a/src/index.ts b/src/index.ts index a2fc6b0..c26a50c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -616,6 +616,9 @@ type Definition = function getReferencedDefinitions(typeName: string, definitions: { [name: string]: Definition }) { const result: { [name: string]: Definition } = {}; const definition = definitions[typeName]; + if (definition === undefined) { + return result; + } result[typeName] = definition; if (definition.type === "array") { if (definition.items.type === undefined) {