Skip to content

Commit 24b293c

Browse files
committed
CLI: Slightly beautify statically generated code
1 parent 65637ff commit 24b293c

File tree

10 files changed

+3960
-5198
lines changed

10 files changed

+3960
-5198
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,10 @@ Generates TypeScript definitions from annotated JavaScript files.
397397
398398
-o, --out Saves to a file instead of writing to stdout.
399399
400+
-m, --main Whether building the main library without any imports.
401+
402+
-g, --global Name of the global object in browser environments, if any.
403+
400404
--no-comments Does not output any JSDoc comments.
401405
402406
usage: pbts [options] file1.js file2.js ...

cli/pbts.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,13 @@ exports.main = function(args, callback) {
4646
"Generates TypeScript definitions from annotated JavaScript files.",
4747
"",
4848
" -n, --name Wraps everything in a module of the specified name.",
49+
"",
4950
" -o, --out Saves to a file instead of writing to stdout.",
51+
"",
5052
" -m, --main Whether building the main library without any imports.",
53+
"",
5154
" -g, --global Name of the global object in browser environments, if any.",
55+
"",
5256
" --no-comments Does not output any JSDoc comments.",
5357
"",
5458
"usage: " + chalk.bold.green("pbts") + " [options] file1.js file2.js ..."

cli/targets/static.js

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -133,33 +133,47 @@ function buildNamespace(ref, ns) {
133133
}
134134
}
135135

136+
function slightlyBeautify(generatedCode) {
137+
return generatedCode
138+
.replace(/(!?[=<>|&%?:]+)([^\s])/g, " $1 $2") // a!==b, a&&b, a?b:c etc.
139+
.replace(/\b([+-])\b/g," $1 ") // a+b
140+
.replace(/\b(if|else|else if|for|while|do|switch)\(/g, "$1 (") // if(a)
141+
.replace(/\breturn"/g, "return \"") // return"error"
142+
.replace(/([;,])([^\s])/g, "$1 $2") // cond(var a=0;a<b;++b), var a=1,b;
143+
.replace(/{$/mg, " {")
144+
.replace(/\br\b/g, "reader")
145+
.replace(/\bw\b/g, "writer")
146+
.replace(/\bm\b/g, "message")
147+
.replace(/\bt\b/g, "tag")
148+
.replace(/\bl\b/g, "length")
149+
.replace(/\bc\b/g, "end")
150+
.replace(/\bk\b/g, "key")
151+
.replace(/\bks\b/g, "keys");
152+
}
153+
136154
function buildFunction(type, functionName, gen, scope) {
137-
var lines = gen.str(functionName)
138-
.replace("(this.getCtor())", " $root" + type.fullName)
139-
.split(/\n/g);
140-
push(name(type.name) + "." + functionName + " = (function() {");
141-
++indent;
142-
push("/* eslint-disable */");
143-
Object.keys(scope).forEach(function(key) {
144-
push("var " + key + " = " + scope[key] + ";");
145-
});
146-
push("var types; $lazyTypes.push(types = [" + type.fieldsArray.map(function(field) {
155+
var lines = slightlyBeautify(gen.str(functionName)
156+
.replace("(this.getCtor())", " $root" + type.fullName))
157+
.split(/\n/g);
158+
159+
// add referenced types to scope
160+
scope["types"] = "[" + type.fieldsArray.map(function(field) {
147161
return field.resolve().resolvedType
148162
? JSON.stringify(field.resolvedType.fullName.substring(1))
149163
: "null";
150-
}).join(",") + "]);");
151-
push("return " + lines[0]);
152-
lines.slice(1).forEach(function(line) {
164+
}).join(", ") + "]";
165+
166+
// enclose all but the first and last line in an iife returning our properly scoped function
167+
push(name(type.name) + "." + functionName + " = /* eslint-disable */ (function(" + Object.keys(scope).join(", ") + ") { $lazyTypes.push(types); return " + lines[0]);
168+
lines.slice(1, lines.length - 1).forEach(function(line) {
153169
var prev = indent;
154170
var i = 0;
155171
while (line.charAt(i++) === "\t")
156172
++indent;
157173
push(line.trim());
158174
indent = prev;
159175
});
160-
push("/* eslint-enable */");
161-
--indent;
162-
push("})();");
176+
push("}})(" + Object.keys(scope).map(function(key) { return scope[key]; }).join(", ") + "); /* eslint-enable */");
163177
}
164178

165179
function buildType(ref, type) {

src/verifier.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ function genVerifyValue(gen, field, fieldIndex, ref) {
2323
("break")
2424
("}");
2525
} else if (field.resolvedType instanceof Type) gen
26-
("var r;")
27-
("if(r=types[%d].verify(%s))", fieldIndex, ref)
28-
("return r");
26+
("var s;")
27+
("if(s=types[%d].verify(%s))", fieldIndex, ref)
28+
("return s");
2929
} else {
3030
switch (field.type) {
3131
case "int32":

tests/data/ambiguous-names.js

Lines changed: 53 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,12 @@ $root.A = (function() {
4949
* @param {$protobuf.Writer} [writer] Writer to encode to
5050
* @returns {$protobuf.Writer} Writer
5151
*/
52-
A.encode = (function() {
53-
/* eslint-disable */
54-
var Writer = $protobuf.Writer;
55-
var util = $protobuf.util;
56-
var types; $lazyTypes.push(types = [null]);
57-
return function encode(m, w) {
58-
w||(w=Writer.create())
59-
if(m.whatever!==undefined&&m.whatever!=="")
60-
w.uint32(10).string(m.whatever)
61-
return w
62-
}
63-
/* eslint-enable */
64-
})();
52+
A.encode = /* eslint-disable */ (function(Writer, util, types) { $lazyTypes.push(types); return function encode(message, writer) {
53+
writer || (writer = Writer.create())
54+
if (message.whatever !== undefined && message.whatever !== "")
55+
writer.uint32(10).string(message.whatever)
56+
return writer
57+
}})($protobuf.Writer, $protobuf.util, [null]); /* eslint-enable */
6558

6659
/**
6760
* Encodes the specified A, length delimited.
@@ -80,29 +73,22 @@ $root.A = (function() {
8073
* @param {number} [length] Message length if known beforehand
8174
* @returns {A} A
8275
*/
83-
A.decode = (function() {
84-
/* eslint-disable */
85-
var Reader = $protobuf.Reader;
86-
var util = $protobuf.util;
87-
var types; $lazyTypes.push(types = [null]);
88-
return function decode(r, l) {
89-
r instanceof Reader||(r=Reader.create(r))
90-
var c=l===undefined?r.len:r.pos+l,m=new $root.A
91-
while(r.pos<c){
92-
var t=r.uint32()
93-
switch(t>>>3){
94-
case 1:
95-
m.whatever=r.string()
96-
break
97-
default:
98-
r.skipType(t&7)
99-
break
100-
}
76+
A.decode = /* eslint-disable */ (function(Reader, util, types) { $lazyTypes.push(types); return function decode(reader, length) {
77+
reader instanceof Reader || (reader = Reader.create(reader))
78+
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.A
79+
while (reader.pos < end) {
80+
var tag = reader.uint32()
81+
switch (tag >>> 3) {
82+
case 1:
83+
message.whatever = reader.string()
84+
break
85+
default:
86+
reader.skipType(tag & 7)
87+
break
10188
}
102-
return m
10389
}
104-
/* eslint-enable */
105-
})();
90+
return message
91+
}})($protobuf.Reader, $protobuf.util, [null]); /* eslint-enable */
10692

10793
/**
10894
* Decodes a A from the specified reader or buffer, length delimited.
@@ -120,19 +106,13 @@ $root.A = (function() {
120106
* @param {A|Object} message A or plain object to verify
121107
* @returns {?string} `null` if valid, otherwise the reason why it is not
122108
*/
123-
A.verify = (function() {
124-
/* eslint-disable */
125-
var util = $protobuf.util;
126-
var types; $lazyTypes.push(types = [null]);
127-
return function verify(m) {
128-
if(m.whatever!==undefined){
129-
if(!util.isString(m.whatever))
130-
return"invalid value for field .A.whatever (string expected)"
131-
}
132-
return null
109+
A.verify = /* eslint-disable */ (function(util, types) { $lazyTypes.push(types); return function verify(message) {
110+
if (message.whatever !== undefined) {
111+
if (!util.isString(message.whatever))
112+
return "invalid value for field .A.whatever (string expected)"
133113
}
134-
/* eslint-enable */
135-
})();
114+
return null
115+
}})($protobuf.util, [null]); /* eslint-enable */
136116

137117
return A;
138118
})();
@@ -178,19 +158,12 @@ $root.B = (function() {
178158
* @param {$protobuf.Writer} [writer] Writer to encode to
179159
* @returns {$protobuf.Writer} Writer
180160
*/
181-
B.encode = (function() {
182-
/* eslint-disable */
183-
var Writer = $protobuf.Writer;
184-
var util = $protobuf.util;
185-
var types; $lazyTypes.push(types = ["A"]);
186-
return function encode(m, w) {
187-
w||(w=Writer.create())
188-
if(m.A!==undefined&&m.A!==null)
189-
types[0].encode(m.A,w.uint32(10).fork()).ldelim()
190-
return w
191-
}
192-
/* eslint-enable */
193-
})();
161+
B.encode = /* eslint-disable */ (function(Writer, util, types) { $lazyTypes.push(types); return function encode(message, writer) {
162+
writer || (writer = Writer.create())
163+
if (message.A !== undefined && message.A !== null)
164+
types[0].encode(message.A, writer.uint32(10).fork()).ldelim()
165+
return writer
166+
}})($protobuf.Writer, $protobuf.util, ["A"]); /* eslint-enable */
194167

195168
/**
196169
* Encodes the specified B, length delimited.
@@ -209,29 +182,22 @@ $root.B = (function() {
209182
* @param {number} [length] Message length if known beforehand
210183
* @returns {B} B
211184
*/
212-
B.decode = (function() {
213-
/* eslint-disable */
214-
var Reader = $protobuf.Reader;
215-
var util = $protobuf.util;
216-
var types; $lazyTypes.push(types = ["A"]);
217-
return function decode(r, l) {
218-
r instanceof Reader||(r=Reader.create(r))
219-
var c=l===undefined?r.len:r.pos+l,m=new $root.B
220-
while(r.pos<c){
221-
var t=r.uint32()
222-
switch(t>>>3){
223-
case 1:
224-
m.A=types[0].decode(r,r.uint32())
225-
break
226-
default:
227-
r.skipType(t&7)
228-
break
229-
}
185+
B.decode = /* eslint-disable */ (function(Reader, util, types) { $lazyTypes.push(types); return function decode(reader, length) {
186+
reader instanceof Reader || (reader = Reader.create(reader))
187+
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.B
188+
while (reader.pos < end) {
189+
var tag = reader.uint32()
190+
switch (tag >>> 3) {
191+
case 1:
192+
message.A = types[0].decode(reader, reader.uint32())
193+
break
194+
default:
195+
reader.skipType(tag & 7)
196+
break
230197
}
231-
return m
232198
}
233-
/* eslint-enable */
234-
})();
199+
return message
200+
}})($protobuf.Reader, $protobuf.util, ["A"]); /* eslint-enable */
235201

236202
/**
237203
* Decodes a B from the specified reader or buffer, length delimited.
@@ -249,20 +215,14 @@ $root.B = (function() {
249215
* @param {B|Object} message B or plain object to verify
250216
* @returns {?string} `null` if valid, otherwise the reason why it is not
251217
*/
252-
B.verify = (function() {
253-
/* eslint-disable */
254-
var util = $protobuf.util;
255-
var types; $lazyTypes.push(types = ["A"]);
256-
return function verify(m) {
257-
if(m.A!==undefined&&m.A!==null){
258-
var r;
259-
if(r=types[0].verify(m.A))
260-
return r
261-
}
262-
return null
218+
B.verify = /* eslint-disable */ (function(util, types) { $lazyTypes.push(types); return function verify(message) {
219+
if (message.A !== undefined && message.A !== null) {
220+
var s;
221+
if (s = types[0].verify(message.A))
222+
return s
263223
}
264-
/* eslint-enable */
265-
})();
224+
return null
225+
}})($protobuf.util, ["A"]); /* eslint-enable */
266226

267227
return B;
268228
})();

0 commit comments

Comments
 (0)