Skip to content

Commit

Permalink
improve tslint; improve member access
Browse files Browse the repository at this point in the history
  • Loading branch information
plantain-00 committed Aug 16, 2017
1 parent 274dced commit 748ae85
Show file tree
Hide file tree
Showing 10 changed files with 103 additions and 81 deletions.
17 changes: 16 additions & 1 deletion clean-scripts.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const childProcess = require('child_process')

module.exports = {
build: [
`rimraf dist/`,
Expand All @@ -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"`,
Expand Down
4 changes: 2 additions & 2 deletions online/file-size.json
Original file line number Diff line number Diff line change
@@ -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"
}
1 change: 1 addition & 0 deletions online/index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion online/index.bundle-ca1d8e08b81084366c1445805be7e676.js

This file was deleted.

2 changes: 1 addition & 1 deletion online/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
<a class="github-fork-ribbon right-bottom" href="https://github.com/plantain-00/types-as-schema" title="Fork me on GitHub" target="_blank">Fork me on GitHub</a>
<div id="container"></div>
<script src="./vendor.bundle-e0f49fd5a9f43b0f2324f9219c7dc438.js" crossOrigin="anonymous" integrity="sha256-54SCiJnefHXbSEt94yBklTkdm3WzARl+MIX3Tzh7b8E="></script>
<script src="./index.bundle-ca1d8e08b81084366c1445805be7e676.js" crossOrigin="anonymous" integrity="sha256-eAktim2Y9bvdd+qbBF3OKAuytWD2lQ+hOxfLltk8qiA="></script>
<script src="./index.bundle-6fb88909c78f7b31f2f3ad035ee36ba7.js" crossOrigin="anonymous" integrity="sha256-zwIsGWUhBJtSNoOLOGlzaMuVobGTqL7WoakuC61XGGs="></script>
5 changes: 2 additions & 3 deletions online/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -55,5 +55,4 @@ class App extends Vue {
}
}

// tslint:disable-next-line:no-unused-expression
new App({ el: "#container" });
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
136 changes: 68 additions & 68 deletions src/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -279,7 +334,7 @@ export class Generator {
return { members, minProperties, maxProperties };
}

getObjectMembers(elements: ts.NodeArray<ts.TypeElement>): MembersInfo {
private getObjectMembers(elements: ts.NodeArray<ts.TypeElement>): MembersInfo {
const members: Member[] = [];
let minProperties = 0;
let maxProperties = 0;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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",
Expand Down Expand Up @@ -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) {
Expand All @@ -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") {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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") {
Expand Down Expand Up @@ -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 = {
Expand Down
10 changes: 9 additions & 1 deletion tslint.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
]
}
}

0 comments on commit 748ae85

Please sign in to comment.