From 748ae85312fc7762f1cc807c68cef9ba299fe9b2 Mon Sep 17 00:00:00 2001 From: york yao Date: Wed, 16 Aug 2017 20:37:25 +0800 Subject: [PATCH] improve tslint; improve member access --- clean-scripts.config.js | 17 ++- online/file-size.json | 4 +- ...bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js | 1 + ...bundle-ca1d8e08b81084366c1445805be7e676.js | 1 - online/index.html | 2 +- online/index.ts | 5 +- package-lock.json | 6 +- package.json | 2 +- src/core.ts | 136 +++++++++--------- tslint.json | 10 +- 10 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 online/index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js delete mode 100644 online/index.bundle-ca1d8e08b81084366c1445805be7e676.js diff --git a/clean-scripts.config.js b/clean-scripts.config.js index e38a7f8..adec9ab 100644 --- a/clean-scripts.config.js +++ b/clean-scripts.config.js @@ -1,3 +1,5 @@ +const childProcess = require('child_process') + module.exports = { build: [ `rimraf dist/`, @@ -11,7 +13,20 @@ module.exports = { }, test: [ 'tsc -p spec', - 'jasmine' + 'jasmine', + () => new Promise((resolve, reject) => { + childProcess.exec('git status -s', (error, stdout, stderr) => { + if (error) { + reject(error) + } else { + if (stdout) { + reject(new Error(`generated files doesn't match.`)) + } else { + resolve() + } + } + }).stdout.pipe(process.stdout) + }) ], fix: { ts: `tslint --fix "src/**/*.ts" "online/**/*.ts"`, diff --git a/online/file-size.json b/online/file-size.json index 605c9c9..c98ff6c 100644 --- a/online/file-size.json +++ b/online/file-size.json @@ -1,6 +1,6 @@ { - "indexBundleJs": "24.5 kB 6.44 kB", + "indexBundleJs": "24.6 kB 6.47 kB", "vendorBundleJs": "1.87 MB 498 kB", "indexBundleCss": "4.15 kB 1.25 kB", - "onlineIndexHtml": "4.89 kB 1.67 kB" + "onlineIndexHtml": "4.89 kB 1.68 kB" } \ No newline at end of file diff --git a/online/index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js b/online/index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js new file mode 100644 index 0000000..3d96e64 --- /dev/null +++ b/online/index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js @@ -0,0 +1 @@ +webpackJsonp([0],{162:function(e,n,t){"use strict";t.d(n,"a",function(){return m});var r=t(40),i=t(27),m=(t.n(i),function(){function e(e){var n=this;this.sourceFile=e,this.models=[],i.forEachChild(e,function(e){if(e.kind===i.SyntaxKind.EnumDeclaration){var t=e,m=t.members;if(m.length>0){var a=m[0];if(a.initializer){var o={kind:"enum",name:t.name.text,type:a.initializer.kind===i.SyntaxKind.StringLiteral?i.ClassificationTypeNames.stringLiteral:"uint32",members:[]};try{for(var u=r.d(m),s=u.next();!s.done;s=u.next()){var p=s.value;if(p.initializer){var y=p.name;if(p.initializer.kind===i.SyntaxKind.StringLiteral){var l=p.initializer;o.members.push({name:y.text,value:l.text})}else if(p.initializer.kind===i.SyntaxKind.NumericLiteral){var l=p.initializer;o.members.push({name:y.text,value:+l.text})}}}}catch(e){h={error:e}}finally{try{s&&!s.done&&(x=u.return)&&x.call(u)}finally{if(h)throw h.error}}n.models.push(o)}else{var o={kind:"enum",name:t.name.text,type:"uint32",members:[]},c=0;try{for(var f=r.d(m),d=f.next();!d.done;d=f.next()){var p=d.value,b=p.name;if(p.initializer&&p.initializer.kind===i.SyntaxKind.NumericLiteral){var l=p.initializer,v=+l.text;o.members.push({name:b.text,value:v}),c=v+1}else o.members.push({name:b.text,value:c}),c++}}catch(e){g={error:e}}finally{try{d&&!d.done&&(k=f.return)&&k.call(f)}finally{if(g)throw g.error}}n.models.push(o)}}}var h,x,g,k}),i.forEachChild(e,function(e){n.handleSourceFile(e)})}return e.prototype.generateProtobuf=function(){var e=[];try{for(var n=r.d(this.models),t=n.next();!t.done;t=n.next()){var i=t.value;if("object"===i.kind){var m=[],a=i.members.reduce(function(e,n){return n.tag?Math.max(e,n.tag):e},0);try{for(var o=r.d(i.members),u=o.next();!u.done;u=o.next()){var s=u.value;s.tag||a++;var p=this.getProtobufProperty(s.type),y=p.modifier,l=p.propertyType;l&&m.push(" "+y+l+" "+s.name+" = "+(s.tag?s.tag:a)+";")}}catch(e){v={error:e}}finally{try{u&&!u.done&&(h=o.return)&&h.call(o)}finally{if(v)throw v.error}}e.push("message "+i.name+" {\n"+m.join("\n")+"\n}")}else if("enum"===i.kind){var m=[];try{for(var c=r.d(i.members),f=c.next();!f.done;f=c.next()){var s=f.value;"number"==typeof s.value&&m.push(" "+s.name+" = "+s.value+";")}}catch(e){x={error:e}}finally{try{f&&!f.done&&(g=c.return)&&g.call(c)}finally{if(x)throw x.error}}m.length>0&&e.push("enum "+i.name+" {\n"+m.join("\n")+"\n}")}}}catch(e){d={error:e}}finally{try{t&&!t.done&&(b=n.return)&&b.call(n)}finally{if(d)throw d.error}}return'syntax = "proto3";\n\n'+e.join("\n\n")+"\n";var d,b,v,h,x,g},e.prototype.generateJsonSchemas=function(){var e=this,n={};try{for(var t=r.d(this.models),i=t.next();!i.done;i=t.next()){var m=i.value;"object"!==m.kind&&"array"!==m.kind||(n[m.name]=this.getJsonSchemaProperty(m))}}catch(e){a={error:e}}finally{try{i&&!i.done&&(o=t.return)&&o.call(t)}finally{if(a)throw a.error}}return this.models.filter(function(e){return("object"===e.kind||"array"===e.kind)&&e.entry}).map(function(t){return{entry:t.entry,schema:{$ref:"#/definitions/"+t.name,definitions:e.getReferencedDefinitions(t.name,n)}}});var a,o},e.prototype.handleSourceFile=function(e){var n=this.getJsDocs(e),t=n.find(function(e){return"entry"===e.name});if(e.kind===i.SyntaxKind.TypeAliasDeclaration){var m=e;if(m.type.kind===i.SyntaxKind.ArrayType){var a=m.type,o=this.getType(a.elementType),u={kind:"array",name:m.name.text,type:o,entry:t?t.comment:void 0};try{for(var s=r.d(n),p=s.next();!p.done;p=s.next()){var y=p.value;this.setJsonSchemaArray(y,u)}}catch(e){N={error:e}}finally{try{p&&!p.done&&(E=s.return)&&E.call(s)}finally{if(N)throw N.error}}this.models.push(u)}else{var l=this.getMembersInfo(m.type),c=l.members,f=l.minProperties,d=l.maxProperties,u={kind:"object",name:m.name.text,members:c,minProperties:f,maxProperties:d,entry:t?t.comment:void 0};try{for(var b=r.d(n),v=b.next();!v.done;v=b.next()){var y=v.value;this.setJsonSchemaObject(y,u)}}catch(e){K={error:e}}finally{try{v&&!v.done&&(L=b.return)&&L.call(b)}finally{if(K)throw K.error}}this.models.push(u)}}else if(e.kind===i.SyntaxKind.InterfaceDeclaration){var h=e;if(this.models.some(function(e){return e.name===h.name.text}))return;var x=this.getObjectMembers(h.members),c=x.members,g=x.minProperties,k=x.maxProperties,f=g,d=k;if(h.heritageClauses)try{for(var M=r.d(h.heritageClauses),S=M.next();!S.done;S=M.next()){var T=S.value;if(T.kind===i.SyntaxKind.HeritageClause){var P=this;try{for(var I=r.d(T.types),j=I.next();!j.done;j=I.next()){var o=j.value;!function(e){if(e.kind===i.SyntaxKind.ExpressionWithTypeArguments){var n=e.expression.text;P.preHandleType(n);var t=P.models.find(function(e){return"object"===e.kind&&e.name===n});if(t&&"object"===t.kind){try{for(var m=r.d(t.members),a=m.next();!a.done;a=m.next()){var o=a.value;!function(e){c.every(function(n){return n.name!==e.name})&&(c.push(e),d++,e.optional||f++)}(o)}}catch(e){u={error:e}}finally{try{a&&!a.done&&(s=m.return)&&s.call(m)}finally{if(u)throw u.error}}}}var u,s}(o)}}catch(e){A={error:e}}finally{try{j&&!j.done&&(D=I.return)&&D.call(I)}finally{if(A)throw A.error}}}}}catch(e){J={error:e}}finally{try{S&&!S.done&&(U=M.return)&&U.call(M)}finally{if(J)throw J.error}}var u={kind:"object",name:h.name.text,members:c,minProperties:f,maxProperties:d,entry:t?t.comment:void 0};try{for(var O=r.d(n),w=O.next();!w.done;w=O.next()){var y=w.value;this.setJsonSchemaObject(y,u)}}catch(e){z={error:e}}finally{try{w&&!w.done&&(F=O.return)&&F.call(O)}finally{if(z)throw z.error}}this.models.push(u)}var N,E,K,L,J,U,A,D,z,F},e.prototype.preHandleType=function(e){var n=this;if(!this.models.some(function(n){return n.name===e})){var t=!1;i.forEachChild(this.sourceFile,function(r){if(!t)if(r.kind===i.SyntaxKind.InterfaceDeclaration){var m=r;m.name.text===e&&(t=!0,n.handleSourceFile(r))}else if(r.kind===i.SyntaxKind.TypeAliasDeclaration){var m=r;m.name.text===e&&(t=!0,n.handleSourceFile(r))}})}},e.prototype.overrideType=function(e,n){n&&n.comment&&("number"===e.kind?e.type=n.comment:"array"===e.kind&&"number"===e.type.kind&&(e.type={kind:e.type.kind,type:n.comment}))},e.prototype.getMembersInfo=function(e){var n=[],t=0,m=0;if(e.kind===i.SyntaxKind.TypeLiteral){var a=e;return this.getObjectMembers(a.members)}if(e.kind===i.SyntaxKind.UnionType){var o=e;t=1/0;try{for(var u=r.d(o.types),s=u.next();!s.done;s=u.next()){var p=s.value,y=this.getMembersInfo(p);if(t>y.minProperties&&(t=y.minProperties),m0)try{for(var i=r.d(n),m=i.next();!m.done;m=i.next()){var a=m.value;if(a.tags)try{for(var o=r.d(a.tags),u=o.next();!u.done;u=o.next()){var s=u.value;t.push({name:s.tagName.text,comment:s.comment})}}catch(e){l={error:e}}finally{try{u&&!u.done&&(c=o.return)&&c.call(o)}finally{if(l)throw l.error}}}}catch(e){p={error:e}}finally{try{m&&!m.done&&(y=i.return)&&y.call(i)}finally{if(p)throw p.error}}return t;var p,y,l,c},e.prototype.getProtobufProperty=function(e){var n="",t="";if("map"===e.kind){var r="";if("number"===e.value.kind){r=this.getProtobufProperty(e.value).propertyType}else"reference"===e.value.kind&&(r=e.value.name);r&&(t="map<"+e.key.kind+", "+r+">")}else if("array"===e.kind){n="repeated ";var i=this.getProtobufProperty(e.type).propertyType;t=i}else if("enum"===e.kind)t="string"===e.type?"string":e.name;else if("reference"===e.kind){var m=this.models.find(function(n){return"enum"===n.kind&&n.name===e.name});t=m&&"enum"===m.kind&&"string"===m.type?"string":e.name}else"number"===e.kind?t="number"===e.type?"double":"integer"===e.type?"int32":e.type:"string"===e.kind?t=e.kind:"boolean"===e.kind&&(t="bool");return{modifier:n,propertyType:t}},e.prototype.getReferencedDefinitions=function(e,n){var t={},r=n[e];if(void 0===r)return t;if(t[e]=r,"array"===r.type){if(void 0===r.items.type){var i=r.items.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}}else if("object"===r.type&&r.properties)for(var m in r.properties)if(r.properties.hasOwnProperty(m)){var a=r.properties[m];if(void 0===a.type){var i=a.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}else if("array"===a.type&&void 0===a.items.type){var i=a.items.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}}return t},e.prototype.getNumberType=function(e){var n;return n="double"===e.type||"float"===e.type?{type:"number",minimum:e.minimum,maximum:e.maximum}:"uint32"===e.type||"fixed32"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:0,maximum:void 0!==e.maximum?e.maximum:4294967295}:"int32"===e.type||"sint32"===e.type||"sfixed32"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:-2147483648,maximum:void 0!==e.maximum?e.maximum:2147483647}:"uint64"===e.type||"fixed64"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:0,maximum:void 0!==e.maximum?e.maximum:0x10000000000000000}:"int64"===e.type||"sint64"===e.type||"sfixed64"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:-0x8000000000000000,maximum:void 0!==e.maximum?e.maximum:0x8000000000000000}:"number"===e.type||"integer"===e.type?{type:e.type,minimum:e.minimum,maximum:e.maximum}:{type:e.kind,minimum:e.minimum,maximum:e.maximum},Object.assign(n,{multipleOf:e.multipleOf,exclusiveMinimum:e.exclusiveMinimum,exclusiveMaximum:e.exclusiveMaximum}),n},e.prototype.getJsonSchemaProperty=function(e){if("number"===e.kind)return this.getNumberType(e);if("boolean"===e.kind)return{type:"boolean"};if("map"===e.kind)return{type:"object",additionalProperties:this.getJsonSchemaProperty(e.value)};if("array"===e.kind)return{type:"array",items:this.getJsonSchemaProperty(e.type),uniqueItems:e.uniqueItems,minItems:e.minItems,maxItems:e.maxItems};if("enum"===e.kind){if("string"===e.type)return{type:"string",enum:e.enums};var n=this.getNumberType({kind:"number",type:e.type});return Object.assign(n,{enum:e.enums,minimum:void 0,maximum:void 0}),n}if("reference"===e.kind)return{type:void 0,$ref:"#/definitions/"+e.name};if("object"===e.kind){var t={},i=[];try{for(var m=r.d(e.members),a=m.next();!a.done;a=m.next()){var o=a.value;o.optional||i.push(o.name),t[o.name]=this.getJsonSchemaProperty(o.type)}}catch(e){u={error:e}}finally{try{a&&!a.done&&(s=m.return)&&s.call(m)}finally{if(u)throw u.error}}return{type:"object",properties:t,required:i,additionalProperties:void 0!==e.additionalProperties&&void 0,minProperties:e.minProperties>e.members.filter(function(e){return!e.optional}).length?e.minProperties:void 0,maxProperties:e.maxProperties{{protobuf}}
{{jsonSchema}}
',i='type TypeLiteral = {\n typeLiteralMember1: number;\n typeLiteralMember2: string;\n};\n\n/**\n * @minProperties 1\n * @maxProperties 1\n * @additionalProperties\n */\ninterface Interface {\n interfaceMember1?: number;\n interfaceMember2?: string;\n}\n\ntype TypeUnion1 = TypeLiteral | {\n typeUnionMember1: number;\n typeUnionMember2: string;\n};\ntype TypeUnion2 =\n {\n kind: StringEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: StringEnum.enumMember2;\n typeUnionMember2: string;\n };\ntype TypeUnion3 =\n {\n kind: NumberEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: NumberEnum.enumMember2;\n typeUnionMember2: string;\n };\ntype TypeUnion = {\n typeUnionMember1: TypeUnion1;\n typeUnionMember2: TypeUnion2;\n typeUnionMember3: TypeUnion3;\n};\n\ninterface InterfaceExtends extends Interface {\n interfaceExtendsMember1: number;\n interfaceExtendsMember2: string;\n}\n\ntype TypeIntersection1 = Interface & {\n typeIntersectionMember1: number;\n typeIntersectionMember2: string;\n};\ntype TypeIntersection2 =\n {\n typeIntersectionMember1: number;\n typeIntersectionMember2: string;\n } & {\n typeIntersectionMember3: number;\n typeIntersectionMember4: string;\n };\n\ntype TypeIntersection = {\n typeIntersectionMember1: TypeIntersection1;\n typeIntersectionMember2: TypeIntersection2;\n};\n\ntype TypeUnionAndIntersection =\n {\n typeIntersectionMember1: number;\n } & (\n {\n kind: NumberEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: NumberEnum.enumMember2;\n typeUnionMember2: string;\n }\n );\n\nexport type TaggedField = {\n /**\n * @tag 2\n */\n taggedFieldMember1: number;\n /**\n * @tag 3\n */\n taggedFieldMember2: string;\n};\n\nexport const enum StringEnum {\n enumMember1 = "enum member 1",\n enumMember2 = "enum member 2",\n}\nexport const enum NumberEnum {\n enumMember1,\n enumMember2,\n}\nexport const enum NumberEnum2 {\n enumMember1 = 3,\n enumMember2 = 4,\n}\nexport type Enum = {\n stringEnum: StringEnum;\n numberEnum: NumberEnum;\n numberEnum2: NumberEnum2;\n};\n\ntype NumberType = {\n /**\n * @multipleOf 10\n * @minimum 70\n * @maximum 90\n * @exclusiveMinimum 70\n * @exclusiveMaximum 90\n */\n numberMember: number;\n\n /**\n * @type integer\n */\n integerMember: number;\n\n /**\n * @type uint32\n */\n uint32Member: number;\n /**\n * @type int32\n */\n int32Member: number;\n /**\n * @type sint32\n */\n sint32Member: number;\n /**\n * @type fixed32\n */\n fixed32Member: number;\n /**\n * @type sfixed32\n */\n sfixed32Member: number;\n\n /**\n * @type uint64\n */\n uint64Member: number;\n /**\n * @type int64\n */\n int64Member: number;\n /**\n * @type sint64\n */\n sint64Member: number;\n /**\n * @type fixed64\n */\n fixed64Member: number;\n /**\n * @type sfixed64\n */\n sfixed64Member: number;\n\n /**\n * @type float\n */\n floatMember: number;\n /**\n * @type double\n */\n doubleMember: number;\n};\n\ntype StringType = {\n /**\n * @minLength 10\n * @maxLength 20\n * @pattern ^[A-z]{3}$\n */\n stringMember: string;\n};\n\ntype ArrayType = {\n /**\n * @itemMinLength 10\n * @itemMaxLength 20\n * @itemPattern ^[A-z]{3}$\n */\n arrayType1: string[];\n /**\n * @uniqueItems\n * @minItems 1\n * @maxItems 10\n */\n arrayType2: TypeLiteral[];\n arrayType3: { literal: number }[];\n /**\n * @itemType uint32\n * @itemMultipleOf 100\n * @itemMinimum 100\n * @itemMaximum 200\n * @itemExclusiveMinimum 300\n * @itemExclusiveMaximum 400\n */\n arrayType4: number[];\n};\n\ntype MapType = {\n mapType: { [name: string]: number };\n mapType2: { [name: string]: TypeLiteral };\n mapType3: { [name: string]: { literal: number } };\n /**\n * @mapValueType uint32\n */\n mapType4: { [name: string]: number };\n};\n\n/**\n * @entry cases.json\n */\nexport type EntryType = {\n optionalMember?: string;\n booleanMember: boolean;\n stringMember: string;\n numberType: NumberType;\n arrayType: ArrayType;\n typeLiteral: { literal: number };\n referenceType: TypeLiteral;\n interfaceType: Interface;\n typeUnion: TypeUnion;\n interfaceExtends: InterfaceExtends;\n typeIntersection: TypeIntersection;\n typeUnionAndIntersection: TypeUnionAndIntersection;\n mapType: MapType;\n taggedField: TaggedField;\n enum: Enum;\n stringNumber: StringType;\n};\n'},40:function(e,n,t){"use strict";function r(e,n){function t(){this.constructor=e}u(e,n),e.prototype=null===n?Object.create(n):(t.prototype=n.prototype,new t)}function i(e,n,t,r){var i,m=arguments.length,a=m<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,n,t,r);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(a=(m<3?i(a):m>3?i(n,t,a):i(n,t))||a);return m>3&&a&&Object.defineProperty(n,t,a),a}function m(e){var n="function"==typeof Symbol&&e[Symbol.iterator],t=0;return n?n.call(e):{next:function(){return e&&t>=e.length&&(e=void 0),{value:e&&e[t++],done:!e}}}}function a(e,n){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var r,i,m=t.call(e),a=[];try{for(;(void 0===n||n-- >0)&&!(r=m.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(t=m.return)&&t.call(m)}finally{if(i)throw i.error}}return a}function o(){for(var e=[],n=0;n0){var a=m[0];if(a.initializer){var o={kind:"enum",name:t.name.text,type:a.initializer.kind===i.SyntaxKind.StringLiteral?i.ClassificationTypeNames.stringLiteral:"uint32",members:[]};try{for(var u=r.d(m),s=u.next();!s.done;s=u.next()){var p=s.value;if(p.initializer){var y=p.name;if(p.initializer.kind===i.SyntaxKind.StringLiteral){var l=p.initializer;o.members.push({name:y.text,value:l.text})}else if(p.initializer.kind===i.SyntaxKind.NumericLiteral){var l=p.initializer;o.members.push({name:y.text,value:+l.text})}}}}catch(e){h={error:e}}finally{try{s&&!s.done&&(x=u.return)&&x.call(u)}finally{if(h)throw h.error}}n.models.push(o)}else{var o={kind:"enum",name:t.name.text,type:"uint32",members:[]},c=0;try{for(var f=r.d(m),d=f.next();!d.done;d=f.next()){var p=d.value,b=p.name;if(p.initializer&&p.initializer.kind===i.SyntaxKind.NumericLiteral){var l=p.initializer,v=+l.text;o.members.push({name:b.text,value:v}),c=v+1}else o.members.push({name:b.text,value:c}),c++}}catch(e){g={error:e}}finally{try{d&&!d.done&&(k=f.return)&&k.call(f)}finally{if(g)throw g.error}}n.models.push(o)}}}var h,x,g,k}),i.forEachChild(e,function(e){n.handleSourceFile(e)})}return e.prototype.handleSourceFile=function(e){var n=this.getJsDocs(e),t=n.find(function(e){return"entry"===e.name});if(e.kind===i.SyntaxKind.TypeAliasDeclaration){var m=e;if(m.type.kind===i.SyntaxKind.ArrayType){var a=m.type,o=this.getType(a.elementType),u={kind:"array",name:m.name.text,type:o,entry:t?t.comment:void 0};try{for(var s=r.d(n),p=s.next();!p.done;p=s.next()){var y=p.value;this.setJsonSchemaArray(y,u)}}catch(e){N={error:e}}finally{try{p&&!p.done&&(E=s.return)&&E.call(s)}finally{if(N)throw N.error}}this.models.push(u)}else{var l=this.getMembersInfo(m.type),c=l.members,f=l.minProperties,d=l.maxProperties,u={kind:"object",name:m.name.text,members:c,minProperties:f,maxProperties:d,entry:t?t.comment:void 0};try{for(var b=r.d(n),v=b.next();!v.done;v=b.next()){var y=v.value;this.setJsonSchemaObject(y,u)}}catch(e){K={error:e}}finally{try{v&&!v.done&&(L=b.return)&&L.call(b)}finally{if(K)throw K.error}}this.models.push(u)}}else if(e.kind===i.SyntaxKind.InterfaceDeclaration){var h=e;if(this.models.some(function(e){return e.name===h.name.text}))return;var x=this.getObjectMembers(h.members),c=x.members,g=x.minProperties,k=x.maxProperties,f=g,d=k;if(h.heritageClauses)try{for(var M=r.d(h.heritageClauses),S=M.next();!S.done;S=M.next()){var T=S.value;if(T.kind===i.SyntaxKind.HeritageClause){var P=this;try{for(var I=r.d(T.types),j=I.next();!j.done;j=I.next()){var o=j.value;!function(e){if(e.kind===i.SyntaxKind.ExpressionWithTypeArguments){var n=e.expression.text;P.preHandleType(n);var t=P.models.find(function(e){return"object"===e.kind&&e.name===n});if(t&&"object"===t.kind){try{for(var m=r.d(t.members),a=m.next();!a.done;a=m.next()){var o=a.value;!function(e){c.every(function(n){return n.name!==e.name})&&(c.push(e),d++,e.optional||f++)}(o)}}catch(e){u={error:e}}finally{try{a&&!a.done&&(s=m.return)&&s.call(m)}finally{if(u)throw u.error}}}}var u,s}(o)}}catch(e){A={error:e}}finally{try{j&&!j.done&&(D=I.return)&&D.call(I)}finally{if(A)throw A.error}}}}}catch(e){J={error:e}}finally{try{S&&!S.done&&(U=M.return)&&U.call(M)}finally{if(J)throw J.error}}var u={kind:"object",name:h.name.text,members:c,minProperties:f,maxProperties:d,entry:t?t.comment:void 0};try{for(var O=r.d(n),w=O.next();!w.done;w=O.next()){var y=w.value;this.setJsonSchemaObject(y,u)}}catch(e){z={error:e}}finally{try{w&&!w.done&&(F=O.return)&&F.call(O)}finally{if(z)throw z.error}}this.models.push(u)}var N,E,K,L,J,U,A,D,z,F},e.prototype.preHandleType=function(e){var n=this;if(!this.models.some(function(n){return n.name===e})){var t=!1;i.forEachChild(this.sourceFile,function(r){if(!t)if(r.kind===i.SyntaxKind.InterfaceDeclaration){var m=r;m.name.text===e&&(t=!0,n.handleSourceFile(r))}else if(r.kind===i.SyntaxKind.TypeAliasDeclaration){var m=r;m.name.text===e&&(t=!0,n.handleSourceFile(r))}})}},e.prototype.overrideType=function(e,n){n&&n.comment&&("number"===e.kind?e.type=n.comment:"array"===e.kind&&"number"===e.type.kind&&(e.type={kind:e.type.kind,type:n.comment}))},e.prototype.getMembersInfo=function(e){var n=[],t=0,m=0;if(e.kind===i.SyntaxKind.TypeLiteral){var a=e;return this.getObjectMembers(a.members)}if(e.kind===i.SyntaxKind.UnionType){var o=e;t=1/0;try{for(var u=r.d(o.types),s=u.next();!s.done;s=u.next()){var p=s.value,y=this.getMembersInfo(p);if(t>y.minProperties&&(t=y.minProperties),m0)try{for(var i=r.d(n),m=i.next();!m.done;m=i.next()){var a=m.value;if(a.tags)try{for(var o=r.d(a.tags),u=o.next();!u.done;u=o.next()){var s=u.value;t.push({name:s.tagName.text,comment:s.comment})}}catch(e){l={error:e}}finally{try{u&&!u.done&&(c=o.return)&&c.call(o)}finally{if(l)throw l.error}}}}catch(e){p={error:e}}finally{try{m&&!m.done&&(y=i.return)&&y.call(i)}finally{if(p)throw p.error}}return t;var p,y,l,c},e.prototype.getProtobufProperty=function(e){var n="",t="";if("map"===e.kind){var r="";if("number"===e.value.kind){r=this.getProtobufProperty(e.value).propertyType}else"reference"===e.value.kind&&(r=e.value.name);r&&(t="map<"+e.key.kind+", "+r+">")}else if("array"===e.kind){n="repeated ";var i=this.getProtobufProperty(e.type).propertyType;t=i}else if("enum"===e.kind)t="string"===e.type?"string":e.name;else if("reference"===e.kind){var m=this.models.find(function(n){return"enum"===n.kind&&n.name===e.name});t=m&&"enum"===m.kind&&"string"===m.type?"string":e.name}else"number"===e.kind?t="number"===e.type?"double":"integer"===e.type?"int32":e.type:"string"===e.kind?t=e.kind:"boolean"===e.kind&&(t="bool");return{modifier:n,propertyType:t}},e.prototype.generateProtobuf=function(){var e=[];try{for(var n=r.d(this.models),t=n.next();!t.done;t=n.next()){var i=t.value;if("object"===i.kind){var m=[],a=i.members.reduce(function(e,n){return n.tag?Math.max(e,n.tag):e},0);try{for(var o=r.d(i.members),u=o.next();!u.done;u=o.next()){var s=u.value;s.tag||a++;var p=this.getProtobufProperty(s.type),y=p.modifier,l=p.propertyType;l&&m.push(" "+y+l+" "+s.name+" = "+(s.tag?s.tag:a)+";")}}catch(e){v={error:e}}finally{try{u&&!u.done&&(h=o.return)&&h.call(o)}finally{if(v)throw v.error}}e.push("message "+i.name+" {\n"+m.join("\n")+"\n}")}else if("enum"===i.kind){var m=[];try{for(var c=r.d(i.members),f=c.next();!f.done;f=c.next()){var s=f.value;"number"==typeof s.value&&m.push(" "+s.name+" = "+s.value+";")}}catch(e){x={error:e}}finally{try{f&&!f.done&&(g=c.return)&&g.call(c)}finally{if(x)throw x.error}}m.length>0&&e.push("enum "+i.name+" {\n"+m.join("\n")+"\n}")}}}catch(e){d={error:e}}finally{try{t&&!t.done&&(b=n.return)&&b.call(n)}finally{if(d)throw d.error}}return'syntax = "proto3";\n\n'+e.join("\n\n")+"\n";var d,b,v,h,x,g},e.prototype.getReferencedDefinitions=function(e,n){var t={},r=n[e];if(void 0===r)return t;if(t[e]=r,"array"===r.type){if(void 0===r.items.type){var i=r.items.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}}else if("object"===r.type&&r.properties)for(var m in r.properties){var a=r.properties[m];if(void 0===a.type){var i=a.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}else if("array"===a.type&&void 0===a.items.type){var i=a.items.$ref.substring("#/definitions/".length);Object.assign(t,this.getReferencedDefinitions(i,n))}}return t},e.prototype.getNumberType=function(e){var n;return n="double"===e.type||"float"===e.type?{type:"number",minimum:e.minimum,maximum:e.maximum}:"uint32"===e.type||"fixed32"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:0,maximum:void 0!==e.maximum?e.maximum:4294967295}:"int32"===e.type||"sint32"===e.type||"sfixed32"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:-2147483648,maximum:void 0!==e.maximum?e.maximum:2147483647}:"uint64"===e.type||"fixed64"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:0,maximum:void 0!==e.maximum?e.maximum:0x10000000000000000}:"int64"===e.type||"sint64"===e.type||"sfixed64"===e.type?{type:"integer",minimum:void 0!==e.minimum?e.minimum:-0x8000000000000000,maximum:void 0!==e.maximum?e.maximum:0x8000000000000000}:"number"===e.type||"integer"===e.type?{type:e.type,minimum:e.minimum,maximum:e.maximum}:{type:e.kind,minimum:e.minimum,maximum:e.maximum},Object.assign(n,{multipleOf:e.multipleOf,exclusiveMinimum:e.exclusiveMinimum,exclusiveMaximum:e.exclusiveMaximum}),n},e.prototype.getJsonSchemaProperty=function(e){if("number"===e.kind)return this.getNumberType(e);if("boolean"===e.kind)return{type:"boolean"};if("map"===e.kind)return{type:"object",additionalProperties:this.getJsonSchemaProperty(e.value)};if("array"===e.kind)return{type:"array",items:this.getJsonSchemaProperty(e.type),uniqueItems:e.uniqueItems,minItems:e.minItems,maxItems:e.maxItems};if("enum"===e.kind){if("string"===e.type)return{type:"string",enum:e.enums};var n=this.getNumberType({kind:"number",type:e.type});return Object.assign(n,{enum:e.enums,minimum:void 0,maximum:void 0}),n}if("reference"===e.kind)return{type:void 0,$ref:"#/definitions/"+e.name};if("object"===e.kind){var t={},i=[];try{for(var m=r.d(e.members),a=m.next();!a.done;a=m.next()){var o=a.value;o.optional||i.push(o.name),t[o.name]=this.getJsonSchemaProperty(o.type)}}catch(e){u={error:e}}finally{try{a&&!a.done&&(s=m.return)&&s.call(m)}finally{if(u)throw u.error}}return{type:"object",properties:t,required:i,additionalProperties:void 0!==e.additionalProperties&&void 0,minProperties:e.minProperties>e.members.filter(function(e){return!e.optional}).length?e.minProperties:void 0,maxProperties:e.maxProperties{{protobuf}}
{{jsonSchema}}
',i='type TypeLiteral = {\n typeLiteralMember1: number;\n typeLiteralMember2: string;\n};\n\n/**\n * @minProperties 1\n * @maxProperties 1\n * @additionalProperties\n */\ninterface Interface {\n interfaceMember1?: number;\n interfaceMember2?: string;\n}\n\ntype TypeUnion1 = TypeLiteral | {\n typeUnionMember1: number;\n typeUnionMember2: string;\n};\ntype TypeUnion2 =\n {\n kind: StringEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: StringEnum.enumMember2;\n typeUnionMember2: string;\n };\ntype TypeUnion3 =\n {\n kind: NumberEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: NumberEnum.enumMember2;\n typeUnionMember2: string;\n };\ntype TypeUnion = {\n typeUnionMember1: TypeUnion1;\n typeUnionMember2: TypeUnion2;\n typeUnionMember3: TypeUnion3;\n};\n\ninterface InterfaceExtends extends Interface {\n interfaceExtendsMember1: number;\n interfaceExtendsMember2: string;\n}\n\ntype TypeIntersection1 = Interface & {\n typeIntersectionMember1: number;\n typeIntersectionMember2: string;\n};\ntype TypeIntersection2 =\n {\n typeIntersectionMember1: number;\n typeIntersectionMember2: string;\n } & {\n typeIntersectionMember3: number;\n typeIntersectionMember4: string;\n };\n\ntype TypeIntersection = {\n typeIntersectionMember1: TypeIntersection1;\n typeIntersectionMember2: TypeIntersection2;\n};\n\ntype TypeUnionAndIntersection =\n {\n typeIntersectionMember1: number;\n } & (\n {\n kind: NumberEnum.enumMember1;\n typeUnionMember1: string;\n } | {\n kind: NumberEnum.enumMember2;\n typeUnionMember2: string;\n }\n );\n\nexport type TaggedField = {\n /**\n * @tag 2\n */\n taggedFieldMember1: number;\n /**\n * @tag 3\n */\n taggedFieldMember2: string;\n};\n\nexport const enum StringEnum {\n enumMember1 = "enum member 1",\n enumMember2 = "enum member 2",\n}\nexport const enum NumberEnum {\n enumMember1,\n enumMember2,\n}\nexport const enum NumberEnum2 {\n enumMember1 = 3,\n enumMember2 = 4,\n}\nexport type Enum = {\n stringEnum: StringEnum;\n numberEnum: NumberEnum;\n numberEnum2: NumberEnum2;\n};\n\ntype NumberType = {\n /**\n * @multipleOf 10\n * @minimum 70\n * @maximum 90\n * @exclusiveMinimum 70\n * @exclusiveMaximum 90\n */\n numberMember: number;\n\n /**\n * @type integer\n */\n integerMember: number;\n\n /**\n * @type uint32\n */\n uint32Member: number;\n /**\n * @type int32\n */\n int32Member: number;\n /**\n * @type sint32\n */\n sint32Member: number;\n /**\n * @type fixed32\n */\n fixed32Member: number;\n /**\n * @type sfixed32\n */\n sfixed32Member: number;\n\n /**\n * @type uint64\n */\n uint64Member: number;\n /**\n * @type int64\n */\n int64Member: number;\n /**\n * @type sint64\n */\n sint64Member: number;\n /**\n * @type fixed64\n */\n fixed64Member: number;\n /**\n * @type sfixed64\n */\n sfixed64Member: number;\n\n /**\n * @type float\n */\n floatMember: number;\n /**\n * @type double\n */\n doubleMember: number;\n};\n\ntype StringType = {\n /**\n * @minLength 10\n * @maxLength 20\n * @pattern ^[A-z]{3}$\n */\n stringMember: string;\n};\n\ntype ArrayType = {\n /**\n * @itemMinLength 10\n * @itemMaxLength 20\n * @itemPattern ^[A-z]{3}$\n */\n arrayType1: string[];\n /**\n * @uniqueItems\n * @minItems 1\n * @maxItems 10\n */\n arrayType2: TypeLiteral[];\n arrayType3: { literal: number }[];\n /**\n * @itemType uint32\n * @itemMultipleOf 100\n * @itemMinimum 100\n * @itemMaximum 200\n * @itemExclusiveMinimum 300\n * @itemExclusiveMaximum 400\n */\n arrayType4: number[];\n};\n\ntype MapType = {\n mapType: { [name: string]: number };\n mapType2: { [name: string]: TypeLiteral };\n mapType3: { [name: string]: { literal: number } };\n /**\n * @mapValueType uint32\n */\n mapType4: { [name: string]: number };\n};\n\n/**\n * @entry cases.json\n */\nexport type EntryType = {\n optionalMember?: string;\n booleanMember: boolean;\n stringMember: string;\n numberType: NumberType;\n arrayType: ArrayType;\n typeLiteral: { literal: number };\n referenceType: TypeLiteral;\n interfaceType: Interface;\n typeUnion: TypeUnion;\n interfaceExtends: InterfaceExtends;\n typeIntersection: TypeIntersection;\n typeUnionAndIntersection: TypeUnionAndIntersection;\n mapType: MapType;\n taggedField: TaggedField;\n enum: Enum;\n stringNumber: StringType;\n};\n'},40:function(e,n,t){"use strict";function r(e,n){function t(){this.constructor=e}u(e,n),e.prototype=null===n?Object.create(n):(t.prototype=n.prototype,new t)}function i(e,n,t,r){var i,m=arguments.length,a=m<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,n,t,r);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(a=(m<3?i(a):m>3?i(n,t,a):i(n,t))||a);return m>3&&a&&Object.defineProperty(n,t,a),a}function m(e){var n="function"==typeof Symbol&&e[Symbol.iterator],t=0;return n?n.call(e):{next:function(){return e&&t>=e.length&&(e=void 0),{value:e&&e[t++],done:!e}}}}function a(e,n){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var r,i,m=t.call(e),a=[];try{for(;(void 0===n||n-- >0)&&!(r=m.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(t=m.return)&&t.call(m)}finally{if(i)throw i.error}}return a}function o(){for(var e=[],n=0;nFork me on GitHub
- \ No newline at end of file + \ No newline at end of file diff --git a/online/index.ts b/online/index.ts index d0210a2..5af36bc 100644 --- a/online/index.ts +++ b/online/index.ts @@ -11,11 +11,11 @@ const localStorageKey = "types-as-schema:source"; template: indexTemplateHtml, }) class App extends Vue { - innerSource = localStorage.getItem(localStorageKey) || demoCasesTs; protobuf = ""; - jsonSchemas: { entry: string; content: string }[] = []; options: string[] = ["protobuf"]; selectedOption = "protobuf"; + private innerSource = localStorage.getItem(localStorageKey) || demoCasesTs; + private jsonSchemas: { entry: string; content: string }[] = []; set source(value: string) { this.innerSource = value; @@ -55,5 +55,4 @@ class App extends Vue { } } -// tslint:disable-next-line:no-unused-expression new App({ el: "#container" }); diff --git a/package-lock.json b/package-lock.json index 051527f..104860d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3819,9 +3819,9 @@ } }, "no-unused-export": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/no-unused-export/-/no-unused-export-1.0.1.tgz", - "integrity": "sha512-Xb7iyOnqvekc0xZI2R2YfPXG94pIINKqDMhEt/SLwDk59JK0FLxyOyQz5DfcvJw9F5psHNB2Y649PkpTNIOfOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/no-unused-export/-/no-unused-export-1.1.0.tgz", + "integrity": "sha512-2UqgNttOHBzMOhxPeGlSe5BeCUgQ7SFZyLxMKFgjCJqT5ERQ3CLfuXofdVbHwJAGFBQJ9BZ3csUDDEjfuZ6BXw==", "dev": true, "requires": { "glob": "7.1.2", diff --git a/package.json b/package.json index 8eccc58..2b6d797 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "github-fork-ribbon-css": "0.2.1", "jasmine": "2.7.0", "less": "2.7.2", - "no-unused-export": "1.0.1", + "no-unused-export": "1.1.0", "rev-static": "3.2.2", "rimraf": "2.6.1", "standard": "10.0.2", diff --git a/src/core.ts b/src/core.ts index 26213ca..bfd01d0 100644 --- a/src/core.ts +++ b/src/core.ts @@ -73,7 +73,62 @@ export class Generator { }); } - handleSourceFile(node: ts.Node) { + generateProtobuf() { + const messages: string[] = []; + for (const model of this.models) { + if (model.kind === "object") { + const members: string[] = []; + let lastTag = model.members.reduce((p, c) => c.tag ? Math.max(p, c.tag) : p, 0); + for (const member of model.members) { + if (!member.tag) { + lastTag++; + } + const { modifier, propertyType } = this.getProtobufProperty(member.type); + if (propertyType) { + members.push(` ${modifier}${propertyType} ${member.name} = ${member.tag ? member.tag : lastTag};`); + } + } + messages.push(`message ${model.name} { +${members.join("\n")} +}`); + } else if (model.kind === "enum") { + const members: string[] = []; + for (const member of model.members) { + if (typeof member.value === "number") { + members.push(` ${member.name} = ${member.value};`); + } + } + if (members.length > 0) { + messages.push(`enum ${model.name} { +${members.join("\n")} +}`); + } + } + } + return `syntax = "proto3"; + +${messages.join("\n\n")} +`; + } + + generateJsonSchemas() { + const definitions: { [name: string]: Definition } = {}; + for (const model of this.models) { + if ((model.kind === "object" || model.kind === "array")) { + definitions[model.name] = this.getJsonSchemaProperty(model); + } + } + return this.models.filter(m => (m.kind === "object" || m.kind === "array") && m.entry) + .map((m: ObjectModel | ArrayModel) => ({ + entry: m.entry!, + schema: { + $ref: `#/definitions/${m.name}`, + definitions: this.getReferencedDefinitions(m.name, definitions), + }, + })); + } + + private handleSourceFile(node: ts.Node) { const jsDocs = this.getJsDocs(node); const entry = jsDocs.find(jsDoc => jsDoc.name === "entry"); if (node.kind === ts.SyntaxKind.TypeAliasDeclaration) { @@ -160,7 +215,7 @@ export class Generator { } } - preHandleType(typeName: string) { + private preHandleType(typeName: string) { // if the node is pre-handled, then it should be in `models` already, so don't continue if (this.models.some(m => m.name === typeName)) { return; @@ -187,7 +242,7 @@ export class Generator { }); } - overrideType(type: Type, jsDoc: JsDoc | undefined) { + private overrideType(type: Type, jsDoc: JsDoc | undefined) { if (jsDoc && jsDoc.comment) { if (type.kind === "number") { type.type = jsDoc.comment; @@ -201,7 +256,7 @@ export class Generator { } } } - getMembersInfo(node: ts.TypeNode): MembersInfo { + private getMembersInfo(node: ts.TypeNode): MembersInfo { const members: Member[] = []; let minProperties = 0; let maxProperties = 0; @@ -279,7 +334,7 @@ export class Generator { return { members, minProperties, maxProperties }; } - getObjectMembers(elements: ts.NodeArray): MembersInfo { + private getObjectMembers(elements: ts.NodeArray): MembersInfo { const members: Member[] = []; let minProperties = 0; let maxProperties = 0; @@ -355,7 +410,7 @@ export class Generator { return { members, minProperties, maxProperties }; } - setJsonSchemaArray(jsDoc: JsDoc, type: ArrayType) { + private setJsonSchemaArray(jsDoc: JsDoc, type: ArrayType) { if (jsDoc.comment) { if (jsDoc.name === "minItems") { type.minItems = +jsDoc.comment; @@ -389,7 +444,7 @@ export class Generator { } } - setJsonSchemaObject(jsDoc: JsDoc, type: ObjectType) { + private setJsonSchemaObject(jsDoc: JsDoc, type: ObjectType) { if (jsDoc.comment) { if (jsDoc.name === "minProperties") { type.minProperties = +jsDoc.comment; @@ -403,7 +458,7 @@ export class Generator { } } - getType(type: ts.TypeNode): Type { + private getType(type: ts.TypeNode): Type { if (type.kind === ts.SyntaxKind.StringKeyword) { return { kind: "string", @@ -474,7 +529,7 @@ export class Generator { }; } - getJsDocs(node: ts.Node) { + private getJsDocs(node: ts.Node) { const jsDocs: ts.JSDoc[] | undefined = (node as any).jsDoc; const result: JsDoc[] = []; if (jsDocs && jsDocs.length > 0) { @@ -492,7 +547,7 @@ export class Generator { return result; } - getProtobufProperty(memberType: Type): { modifier: string, propertyType: string } { + private getProtobufProperty(memberType: Type): { modifier: string, propertyType: string } { let modifier = ""; let propertyType = ""; if (memberType.kind === "map") { @@ -537,45 +592,7 @@ export class Generator { return { modifier, propertyType }; } - generateProtobuf() { - const messages: string[] = []; - for (const model of this.models) { - if (model.kind === "object") { - const members: string[] = []; - let lastTag = model.members.reduce((p, c) => c.tag ? Math.max(p, c.tag) : p, 0); - for (const member of model.members) { - if (!member.tag) { - lastTag++; - } - const { modifier, propertyType } = this.getProtobufProperty(member.type); - if (propertyType) { - members.push(` ${modifier}${propertyType} ${member.name} = ${member.tag ? member.tag : lastTag};`); - } - } - messages.push(`message ${model.name} { -${members.join("\n")} -}`); - } else if (model.kind === "enum") { - const members: string[] = []; - for (const member of model.members) { - if (typeof member.value === "number") { - members.push(` ${member.name} = ${member.value};`); - } - } - if (members.length > 0) { - messages.push(`enum ${model.name} { -${members.join("\n")} -}`); - } - } - } - return `syntax = "proto3"; - -${messages.join("\n\n")} -`; - } - - getReferencedDefinitions(typeName: string, definitions: { [name: string]: Definition }) { + private getReferencedDefinitions(typeName: string, definitions: { [name: string]: Definition }) { const result: { [name: string]: Definition } = {}; const definition = definitions[typeName]; if (definition === undefined) { @@ -608,7 +625,7 @@ ${messages.join("\n\n")} return result; } - getNumberType(numberType: NumberType): Definition { + private getNumberType(numberType: NumberType): Definition { let definition: Definition; if (numberType.type === "double" || numberType.type === "float") { definition = { @@ -661,7 +678,7 @@ ${messages.join("\n\n")} return definition; } - getJsonSchemaProperty(memberType: Type | ObjectModel | ArrayModel): Definition { + private getJsonSchemaProperty(memberType: Type | ObjectModel | ArrayModel): Definition { if (memberType.kind === "number") { return this.getNumberType(memberType); } else if (memberType.kind === "boolean") { @@ -734,23 +751,6 @@ ${messages.join("\n\n")} }; } } - - generateJsonSchemas() { - const definitions: { [name: string]: Definition } = {}; - for (const model of this.models) { - if ((model.kind === "object" || model.kind === "array")) { - definitions[model.name] = this.getJsonSchemaProperty(model); - } - } - return this.models.filter(m => (m.kind === "object" || m.kind === "array") && m.entry) - .map((m: ObjectModel | ArrayModel) => ({ - entry: m.entry!, - schema: { - $ref: `#/definitions/${m.name}`, - definitions: this.getReferencedDefinitions(m.name, definitions), - }, - })); - } } type MembersInfo = { diff --git a/tslint.json b/tslint.json index 102bab4..ca1bdf1 100644 --- a/tslint.json +++ b/tslint.json @@ -17,6 +17,14 @@ "max-classes-per-file": [ false ], - "interface-over-type-literal": false + "interface-over-type-literal": false, + "interface-name": [ + true, + "never-prefix" + ], + "no-unused-expression": [ + true, + "allow-new" + ] } } \ No newline at end of file