protobufjs 8.1.6-experimental → 8.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +219 -565
  2. package/dist/light/protobuf.js +1986 -1483
  3. package/dist/light/protobuf.js.map +1 -1
  4. package/dist/light/protobuf.min.js +3 -3
  5. package/dist/light/protobuf.min.js.map +1 -1
  6. package/dist/minimal/protobuf.js +1122 -861
  7. package/dist/minimal/protobuf.js.map +1 -1
  8. package/dist/minimal/protobuf.min.js +3 -3
  9. package/dist/minimal/protobuf.min.js.map +1 -1
  10. package/dist/protobuf.js +2089 -1513
  11. package/dist/protobuf.js.map +1 -1
  12. package/dist/protobuf.min.js +3 -3
  13. package/dist/protobuf.min.js.map +1 -1
  14. package/ext/README.md +81 -0
  15. package/ext/descriptor/README.md +3 -70
  16. package/ext/descriptor/index.d.ts +1 -191
  17. package/ext/descriptor/index.js +1 -1161
  18. package/ext/descriptor.d.ts +309 -0
  19. package/ext/descriptor.js +1236 -0
  20. package/ext/textformat.d.ts +30 -0
  21. package/ext/textformat.js +1249 -0
  22. package/google/protobuf/compiler/plugin.json +126 -0
  23. package/google/protobuf/compiler/plugin.proto +47 -0
  24. package/google/protobuf/descriptor.json +2 -2
  25. package/google/protobuf/descriptor.proto +2 -1
  26. package/index.d.ts +590 -476
  27. package/package.json +23 -38
  28. package/src/converter.js +60 -24
  29. package/src/decoder.js +122 -49
  30. package/src/encoder.js +10 -2
  31. package/src/enum.js +4 -1
  32. package/src/field.js +10 -7
  33. package/src/mapfield.js +1 -0
  34. package/src/message.js +7 -6
  35. package/src/method.js +4 -3
  36. package/src/namespace.js +23 -12
  37. package/src/object.js +24 -19
  38. package/src/oneof.js +2 -0
  39. package/src/parse.js +114 -46
  40. package/src/reader.js +145 -30
  41. package/src/reader_buffer.js +24 -3
  42. package/src/root.js +7 -4
  43. package/src/service.js +12 -6
  44. package/src/tokenize.js +6 -1
  45. package/src/type.js +48 -25
  46. package/src/types.js +1 -1
  47. package/src/util/aspromise.d.ts +13 -0
  48. package/src/util/aspromise.js +52 -0
  49. package/src/util/base64.d.ts +32 -0
  50. package/src/util/base64.js +146 -0
  51. package/src/util/codegen.d.ts +31 -0
  52. package/src/util/codegen.js +113 -0
  53. package/src/util/eventemitter.d.ts +45 -0
  54. package/src/util/eventemitter.js +84 -0
  55. package/src/util/fetch.d.ts +56 -0
  56. package/src/util/fetch.js +112 -0
  57. package/src/util/float.d.ts +83 -0
  58. package/src/util/float.js +335 -0
  59. package/src/util/fs.js +11 -0
  60. package/src/util/inquire.d.ts +10 -0
  61. package/src/util/inquire.js +38 -0
  62. package/src/util/minimal.js +67 -12
  63. package/src/util/path.d.ts +22 -0
  64. package/src/util/path.js +72 -0
  65. package/src/util/patterns.js +8 -0
  66. package/src/util/pool.d.ts +32 -0
  67. package/src/util/pool.js +48 -0
  68. package/src/util/utf8.d.ts +24 -0
  69. package/src/util/utf8.js +104 -0
  70. package/src/util.js +30 -13
  71. package/src/verifier.js +7 -4
  72. package/src/wrappers.js +4 -3
  73. package/src/writer.js +27 -4
  74. package/src/writer_buffer.js +12 -0
  75. package/tsconfig.json +2 -2
  76. package/ext/descriptor/test.js +0 -54
package/package.json CHANGED
@@ -1,24 +1,15 @@
1
1
  {
2
2
  "name": "protobufjs",
3
- "version": "8.1.6-experimental",
3
+ "version": "8.2.0",
4
4
  "versionScheme": "~",
5
- "description": "Protocol Buffers for JavaScript (& TypeScript).",
5
+ "description": "Protocol Buffers for JavaScript & TypeScript.",
6
6
  "author": "Daniel Wirtz <dcode+protobufjs@dcode.io>",
7
7
  "license": "BSD-3-Clause",
8
8
  "repository": "protobufjs/protobuf.js",
9
9
  "bugs": "https://github.com/protobufjs/protobuf.js/issues",
10
- "homepage": "https://protobufjs.github.io/protobuf.js/",
11
10
  "engines": {
12
11
  "node": ">=12.0.0"
13
12
  },
14
- "eslintConfig": {
15
- "env": {
16
- "es6": true
17
- },
18
- "parserOptions": {
19
- "ecmaVersion": 6
20
- }
21
- },
22
13
  "keywords": [
23
14
  "protobuf",
24
15
  "protocol-buffers",
@@ -26,74 +17,68 @@
26
17
  "typescript"
27
18
  ],
28
19
  "main": "index.js",
20
+ "type": "commonjs",
29
21
  "types": "index.d.ts",
22
+ "browser": {
23
+ "fs": false
24
+ },
30
25
  "scripts": {
31
26
  "bench": "node bench",
32
27
  "build": "npm run build:bundle && npm run build:types",
33
28
  "build:bundle": "gulp --gulpfile scripts/gulpfile.js",
34
- "build:types": "node cli/bin/pbts --main --global protobuf --out index.d.ts src/ lib/aspromise/index.js lib/base64/index.js lib/codegen/index.js lib/eventemitter/index.js lib/float/index.js lib/fetch/index.js lib/inquire/index.js lib/path/index.js lib/pool/index.js lib/utf8/index.js",
35
- "changelog": "node scripts/changelog -w",
29
+ "build:types": "node cli/bin/pbts --main --global protobuf --out index.d.ts src/",
36
30
  "coverage": "npm run coverage:test && npm run coverage:report",
37
31
  "coverage:test": "nyc --silent tape -r ./lib/tape-adapter tests/*.js tests/node/*.js",
38
32
  "coverage:report": "nyc report --reporter=lcov --reporter=text",
39
- "docs": "jsdoc -c config/jsdoc.json -R README.md --verbose --pedantic",
33
+ "docs": "npm run docs:build",
34
+ "docs:build": "jsdoc -c config/jsdoc.json -R README.md --verbose --pedantic",
35
+ "docs:publish": "npm run docs:build && node scripts/pages",
40
36
  "lint": "npm run lint:sources && npm run lint:types",
41
- "lint:sources": "eslint \"**/*.js\" -c config/eslint.json",
37
+ "lint:sources": "eslint \"**/*.js\"",
42
38
  "lint:types": "tslint \"**/*.d.ts\" -e \"**/node_modules/**\" -t stylish -c config/tslint.json",
43
- "pages": "node scripts/pages",
44
39
  "prepublish": "cd cli && npm install && cd .. && npm run build",
45
40
  "prepublishOnly": "cd cli && npm install && cd .. && npm run build",
46
41
  "postinstall": "node scripts/postinstall",
47
42
  "prof": "node bench/prof",
48
43
  "test": "npm run test:sources && npm run test:types",
49
44
  "test:sources": "tape -r ./lib/tape-adapter tests/*.js tests/node/*.js",
50
- "test:types": "tsc tests/comp_typescript.ts --lib es2015 --esModuleInterop --strictNullChecks --experimentalDecorators --emitDecoratorMetadata && tsc tests/data/test.js.ts --lib es2015 --esModuleInterop --noEmit --strictNullChecks && tsc tests/data/*.ts --lib es2015 --esModuleInterop --noEmit --strictNullChecks",
45
+ "test:types": "tsc tests/comp_typescript.ts --types node --lib es2015 --esModuleInterop --strictNullChecks --experimentalDecorators --emitDecoratorMetadata && tsc tests/comp_descriptor.ts --types node --lib es2015 --esModuleInterop --noEmit --strictNullChecks && tsc tests/comp_textformat.ts --types node --lib es2015 --esModuleInterop --noEmit --strictNullChecks && tsc tests/data/test.js.ts --types node --lib es2015 --esModuleInterop --noEmit --strictNullChecks && tsc tests/data/*.ts --types node --lib es2015 --esModuleInterop --noEmit --strictNullChecks",
51
46
  "make": "npm run lint:sources && npm run build && npm run lint:types && node ./scripts/gentests.js && npm test"
52
47
  },
53
48
  "dependencies": {
54
- "@protobufjs/aspromise": "^1.1.2",
55
- "@protobufjs/base64": "^1.1.2",
56
- "@protobufjs/codegen": "^2.0.4",
57
- "@protobufjs/eventemitter": "^1.1.0",
58
- "@protobufjs/fetch": "^1.1.0",
59
- "@protobufjs/float": "^1.0.2",
60
- "@protobufjs/inquire": "^1.1.0",
61
- "@protobufjs/path": "^1.1.2",
62
- "@protobufjs/pool": "^1.1.0",
63
- "@protobufjs/utf8": "^1.1.0",
64
49
  "@types/node": ">=13.7.0",
65
50
  "long": "^5.0.0"
66
51
  },
67
52
  "devDependencies": {
53
+ "@eslint/js": "^10.0.0",
68
54
  "benchmark": "^2.1.4",
69
55
  "browserify": "^17.0.0",
70
56
  "browserify-wrap": "^1.0.2",
71
57
  "bundle-collapser": "^1.3.0",
72
58
  "chalk": "^4.0.0",
73
59
  "escodegen": "^1.13.0",
74
- "eslint": "^8.15.0",
60
+ "eslint": "^10.0.0",
61
+ "eslint-plugin-jsdoc": "^62.9.0",
75
62
  "espree": "^9.0.0",
76
63
  "estraverse": "^5.1.0",
77
- "gh-pages": "^4.0.0",
78
- "git-raw-commits": "^2.0.3",
79
- "git-semver-tags": "^4.0.0",
80
- "google-protobuf": "^3.11.3",
81
- "gulp": "^4.0.2",
64
+ "gh-pages": "^6.0.0",
65
+ "globals": "^17.0.0",
66
+ "google-protobuf": "^4.0.0",
67
+ "gulp": "^5.0.0",
82
68
  "gulp-header": "^2.0.9",
83
69
  "gulp-if": "^3.0.0",
84
70
  "gulp-sourcemaps": "^3.0.0",
85
71
  "gulp-uglify": "^3.0.2",
86
- "jaguarjs-jsdoc": "github:dcodeIO/jaguarjs-jsdoc",
87
72
  "jsdoc": "^4.0.0",
88
- "minimist": "^1.2.0",
89
- "nyc": "^15.0.0",
90
- "reflect-metadata": "^0.1.13",
73
+ "minimist": "^1.2.8",
74
+ "nyc": "^18.0.0",
75
+ "reflect-metadata": "^0.2.0",
91
76
  "tape": "^5.0.0",
92
77
  "tslint": "^6.0.0",
93
78
  "typescript": "^3.7.5",
94
79
  "uglify-js": "^3.7.7",
95
80
  "vinyl-buffer": "^1.0.1",
96
- "vinyl-fs": "^3.0.3",
81
+ "vinyl-fs": "^4.0.0",
97
82
  "vinyl-source-stream": "^2.0.0"
98
83
  },
99
84
  "files": [
package/src/converter.js CHANGED
@@ -5,8 +5,9 @@
5
5
  */
6
6
  var converter = exports;
7
7
 
8
- var Enum = require("./enum"),
9
- util = require("./util");
8
+ var Enum = require("./enum"),
9
+ types = require("./types"),
10
+ util = require("./util");
10
11
 
11
12
  /**
12
13
  * Generates a partial value fromObject conveter.
@@ -27,7 +28,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
27
28
  // enum unknown values passthrough
28
29
  if (values[keys[i]] === field.typeDefault && !defaultAlreadyEmitted) { gen
29
30
  ("default:")
30
- ("if(typeof(d%s)===\"number\"){m%s=d%s;break}", prop, prop, prop);
31
+ ("if(typeof d%s===\"number\"){m%s=d%s;break}", prop, prop, prop);
31
32
  if (!field.repeated) gen // fallback to default value only for
32
33
  // arrays, to avoid leaving holes.
33
34
  ("break"); // for non-repeated fields, just ignore
@@ -43,7 +44,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
43
44
  } else gen
44
45
  ("if(typeof d%s!==\"object\")", prop)
45
46
  ("throw TypeError(%j)", field.fullName + ": object expected")
46
- ("m%s=types[%i].fromObject(d%s)", prop, fieldIndex, prop);
47
+ ("m%s=types[%i].fromObject(d%s,q+1)", prop, fieldIndex, prop);
47
48
  } else {
48
49
  var isUnsigned = false;
49
50
  switch (field.type) {
@@ -79,7 +80,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
79
80
  case "bytes": gen
80
81
  ("if(typeof d%s===\"string\")", prop)
81
82
  ("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)
82
- ("else if(d%s.length >= 0)", prop)
83
+ ("else if(d%s.length>=0)", prop)
83
84
  ("m%s=d%s", prop, prop);
84
85
  break;
85
86
  case "string": gen
@@ -105,16 +106,21 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
105
106
  converter.fromObject = function fromObject(mtype) {
106
107
  /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */
107
108
  var fields = mtype.fieldsArray;
108
- var gen = util.codegen(["d"], mtype.name + "$fromObject")
109
+ var gen = util.codegen(["d", "q"], mtype.name + "$fromObject")
109
110
  ("if(d instanceof this.ctor)")
110
- ("return d");
111
+ ("return d")
112
+ ("if(q===undefined)q=0")
113
+ ("if(q>util.recursionLimit)")
114
+ ("throw Error(\"max depth exceeded\")");
111
115
  if (!fields.length) return gen
112
116
  ("return new this.ctor");
113
117
  gen
114
118
  ("var m=new this.ctor");
115
119
  for (var i = 0; i < fields.length; ++i) {
116
120
  var field = fields[i].resolve(),
117
- prop = util.safeProp(field.name);
121
+ prop = util.safeProp(field.name),
122
+ implicitPresence = !field.hasPresence && !field.repeated && !field.map
123
+ && (field.resolvedType instanceof Enum || types.basic[field.type] !== undefined);
118
124
 
119
125
  // Map fields
120
126
  if (field.map) { gen
@@ -123,6 +129,9 @@ converter.fromObject = function fromObject(mtype) {
123
129
  ("throw TypeError(%j)", field.fullName + ": object expected")
124
130
  ("m%s={}", prop)
125
131
  ("for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){", prop);
132
+ gen
133
+ ("if(ks[i]===\"__proto__\")")
134
+ ("util.makeProp(m%s,ks[i])", prop);
126
135
  genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + "[ks[i]]")
127
136
  ("}")
128
137
  ("}");
@@ -132,7 +141,7 @@ converter.fromObject = function fromObject(mtype) {
132
141
  ("if(d%s){", prop)
133
142
  ("if(!Array.isArray(d%s))", prop)
134
143
  ("throw TypeError(%j)", field.fullName + ": array expected")
135
- ("m%s=[]", prop)
144
+ ("m%s=Array(d%s.length)", prop, prop)
136
145
  ("for(var i=0;i<d%s.length;++i){", prop);
137
146
  genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + "[i]")
138
147
  ("}")
@@ -142,7 +151,23 @@ converter.fromObject = function fromObject(mtype) {
142
151
  } else {
143
152
  if (!(field.resolvedType instanceof Enum)) gen // no need to test for null/undefined if an enum (uses switch)
144
153
  ("if(d%s!=null){", prop); // !== undefined && !== null
154
+ if (implicitPresence) {
155
+ if (field.resolvedType instanceof Enum) gen
156
+ ("if(d%s!==%j&&(typeof d%s!==\"string\"||types[%i].values[d%s]!==%j)){", prop, field.typeDefault, prop, i, prop, field.typeDefault);
157
+ else if (field.type === "string") gen
158
+ ("if(typeof d%s!==\"string\"||d%s.length){", prop, prop);
159
+ else if (field.type === "bytes") gen
160
+ ("if(d%s.length){", prop);
161
+ else if (field.type === "bool") gen
162
+ ("if(d%s){", prop);
163
+ else if (types.long[field.type] !== undefined) gen
164
+ ("if(typeof d%s===\"object\"?d%s.low||d%s.high:Number(d%s)!==0){", prop, prop, prop, prop);
165
+ else gen
166
+ ("if(Number(d%s)!==0){", prop);
167
+ }
145
168
  genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);
169
+ if (implicitPresence) gen
170
+ ("}");
146
171
  if (!(field.resolvedType instanceof Enum)) gen
147
172
  ("}");
148
173
  }
@@ -156,23 +181,26 @@ converter.fromObject = function fromObject(mtype) {
156
181
  * @param {Codegen} gen Codegen instance
157
182
  * @param {Field} field Reflected field
158
183
  * @param {number} fieldIndex Field index
159
- * @param {string} prop Property reference
184
+ * @param {string} dstProp Destination property reference
185
+ * @param {string} [srcProp] Source property reference
160
186
  * @returns {Codegen} Codegen instance
161
187
  * @ignore
162
188
  */
163
- function genValuePartial_toObject(gen, field, fieldIndex, prop) {
189
+ function genValuePartial_toObject(gen, field, fieldIndex, dstProp, srcProp) {
164
190
  /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */
191
+ if (!srcProp)
192
+ srcProp = dstProp;
165
193
  if (field.resolvedType) {
166
194
  if (field.resolvedType instanceof Enum) gen
167
- ("d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s", prop, fieldIndex, prop, prop, fieldIndex, prop, prop);
195
+ ("d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s", dstProp, fieldIndex, srcProp, srcProp, fieldIndex, srcProp, srcProp);
168
196
  else gen
169
- ("d%s=types[%i].toObject(m%s,o)", prop, fieldIndex, prop);
197
+ ("d%s=types[%i].toObject(m%s,o)", dstProp, fieldIndex, srcProp);
170
198
  } else {
171
199
  var isUnsigned = false;
172
200
  switch (field.type) {
173
201
  case "double":
174
202
  case "float": gen
175
- ("d%s=o.json&&!isFinite(m%s)?String(m%s):m%s", prop, prop, prop, prop);
203
+ ("d%s=o.json&&!isFinite(m%s)?String(m%s):m%s", dstProp, srcProp, srcProp, srcProp);
176
204
  break;
177
205
  case "uint64":
178
206
  isUnsigned = true;
@@ -181,16 +209,16 @@ function genValuePartial_toObject(gen, field, fieldIndex, prop) {
181
209
  case "sint64":
182
210
  case "fixed64":
183
211
  case "sfixed64": gen
184
- ("if(typeof m%s===\"number\")", prop)
185
- ("d%s=o.longs===String?String(m%s):m%s", prop, prop, prop)
212
+ ("if(typeof m%s===\"number\")", srcProp)
213
+ ("d%s=o.longs===String?String(m%s):m%s", dstProp, srcProp, srcProp)
186
214
  ("else") // Long-like
187
- ("d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s", prop, prop, prop, prop, isUnsigned ? "true": "", prop);
215
+ ("d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s", dstProp, srcProp, srcProp, srcProp, isUnsigned ? "true": "", srcProp);
188
216
  break;
189
217
  case "bytes": gen
190
- ("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", prop, prop, prop, prop, prop);
218
+ ("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", dstProp, srcProp, srcProp, srcProp, srcProp);
191
219
  break;
192
220
  default: gen
193
- ("d%s=m%s", prop, prop);
221
+ ("d%s=m%s", dstProp, srcProp);
194
222
  break;
195
223
  }
196
224
  }
@@ -253,11 +281,11 @@ converter.toObject = function toObject(mtype) {
253
281
  ("}else")
254
282
  ("d%s=o.longs===String?%j:%i", prop, field.typeDefault.toString(), field.typeDefault.toNumber());
255
283
  else if (field.bytes) {
256
- var arrayDefault = "[" + Array.prototype.slice.call(field.typeDefault).join(",") + "]";
284
+ var arrayDefault = Array.prototype.slice.call(field.typeDefault);
257
285
  gen
258
286
  ("if(o.bytes===String)d%s=%j", prop, String.fromCharCode.apply(String, field.typeDefault))
259
287
  ("else{")
260
- ("d%s=%s", prop, arrayDefault)
288
+ ("d%s=%j", prop, arrayDefault)
261
289
  ("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)
262
290
  ("}");
263
291
  } else gen
@@ -275,13 +303,21 @@ converter.toObject = function toObject(mtype) {
275
303
  ("var ks2");
276
304
  } gen
277
305
  ("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)
278
- ("d%s={}", prop)
306
+ ("d%s={}", prop);
307
+ var longKey = types.long[field.keyType] !== undefined,
308
+ srcProp = prop + "[ks2[j]]";
309
+ gen
279
310
  ("for(var j=0;j<ks2.length;++j){");
280
- genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[ks2[j]]")
311
+ if (longKey) gen
312
+ ("var k2=util.longFromKey(ks2[j],%j).toString()", field.keyType === "uint64" || field.keyType === "fixed64");
313
+ gen
314
+ ("if(ks2[j]===\"__proto__\")")
315
+ ("util.makeProp(d%s,ks2[j])", prop);
316
+ genValuePartial_toObject(gen, field, /* sorted */ index, longKey ? prop + "[k2]" : srcProp, srcProp)
281
317
  ("}");
282
318
  } else if (field.repeated) { gen
283
319
  ("if(m%s&&m%s.length){", prop, prop)
284
- ("d%s=[]", prop)
320
+ ("d%s=Array(m%s.length)", prop, prop)
285
321
  ("for(var j=0;j<m%s.length;++j){", prop);
286
322
  genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[j]")
287
323
  ("}");
package/src/decoder.js CHANGED
@@ -16,28 +16,47 @@ function missing(field) {
16
16
  */
17
17
  function decoder(mtype) {
18
18
  /* eslint-disable no-unexpected-multiline */
19
- var gen = util.codegen(["r", "l", "e"], mtype.name + "$decode")
19
+ var hasMapField = false,
20
+ hasImplicitPresenceField = false,
21
+ i = 0;
22
+ for (; i < mtype.fieldsArray.length; ++i) {
23
+ var pfield = mtype._fieldsArray[i];
24
+ if (pfield.map)
25
+ hasMapField = true;
26
+ if (!pfield.repeated && !pfield.map && !pfield.hasPresence)
27
+ hasImplicitPresenceField = true;
28
+ }
29
+ var gen = util.codegen(["r", "l", "z", "q", "g"], mtype.name + "$decode")
20
30
  ("if(!(r instanceof Reader))")
21
31
  ("r=Reader.create(r)")
22
- ("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? ",k,value" : ""))
32
+ ("if(q===undefined)q=0")
33
+ ("if(q>Reader.recursionLimit)")
34
+ ("throw Error(\"max depth exceeded\")")
35
+ ("var c=l===undefined?r.len:r.pos+l,m=g||new this.ctor" + (hasMapField ? ",k,v" : hasImplicitPresenceField ? ",v" : ""))
23
36
  ("while(r.pos<c){")
24
- ("var t=r.uint32()")
25
- ("if(t===e)")
37
+ ("var s=r.pos")
38
+ ("var t=r.tag()")
39
+ ("if(t===z){")
40
+ ("z=undefined")
26
41
  ("break")
27
- ("switch(t>>>3){");
28
-
29
- var i = 0;
30
- for (; i < /* initializes */ mtype.fieldsArray.length; ++i) {
42
+ ("}");
43
+ if (mtype.fieldsArray.length) gen
44
+ ("var u=t&7")
45
+ ("switch(t>>>=3){");
46
+ for (i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
31
47
  var field = mtype._fieldsArray[i].resolve(),
32
48
  type = field.resolvedType instanceof Enum ? "int32" : field.type,
33
- ref = "m" + util.safeProp(field.name); gen
34
- ("case %i: {", field.id);
49
+ ref = "m" + util.safeProp(field.name);
35
50
 
36
51
  // Map fields
37
- if (field.map) { gen
52
+ if (field.map) {
53
+ gen
54
+ ("case %i:{", field.id)
55
+ ("if(u!==2)")
56
+ ("break")
38
57
  ("if(%s===util.emptyObject)", ref)
39
58
  ("%s={}", ref)
40
- ("var c2 = r.uint32()+r.pos");
59
+ ("var c2=r.uint32()+r.pos");
41
60
 
42
61
  if (types.defaults[field.keyType] !== undefined) gen
43
62
  ("k=%j", types.defaults[field.keyType]);
@@ -45,73 +64,127 @@ function decoder(mtype) {
45
64
  ("k=null");
46
65
 
47
66
  if (types.defaults[type] !== undefined) gen
48
- ("value=%j", types.defaults[type]);
67
+ ("v=%j", types.defaults[type]);
49
68
  else gen
50
- ("value=null");
69
+ ("v=null");
51
70
 
52
71
  gen
53
72
  ("while(r.pos<c2){")
54
- ("var tag2=r.uint32()")
55
- ("switch(tag2>>>3){")
56
- ("case 1: k=r.%s(); break", field.keyType)
57
- ("case 2:");
73
+ ("var t2=r.tag()")
74
+ ("u=t2&7")
75
+ ("switch(t2>>>=3){")
76
+ ("case 1:")
77
+ ("if(u!==%i)", types.mapKey[field.keyType])
78
+ ("break")
79
+ ("k=r.%s()", field.keyType)
80
+ ("continue")
81
+ ("case 2:")
82
+ ("if(u!==%i)", types.basic[type] === undefined ? 2 : types.basic[type])
83
+ ("break");
58
84
 
59
85
  if (types.basic[type] === undefined) gen
60
- ("value=types[%i].decode(r,r.uint32())", i); // can't be groups
86
+ ("v=types[%i].decode(r,r.uint32(),undefined,q+1)", i); // can't be groups
61
87
  else gen
62
- ("value=r.%s()", type);
88
+ ("v=r.%s()", type);
63
89
 
64
90
  gen
65
- ("break")
66
- ("default:")
67
- ("r.skipType(tag2&7)")
68
- ("break")
91
+ ("continue")
69
92
  ("}")
93
+ ("r.skipType(u,q,t2)")
70
94
  ("}");
71
95
 
96
+ var val = types.basic[type] === undefined ? "v||new types[" + i + "].ctor" : "v";
72
97
  if (types.long[field.keyType] !== undefined) gen
73
- ("%s[typeof k===\"object\"?util.longToHash(k):k]=value", ref);
74
- else gen
75
- ("%s[k]=value", ref);
98
+ ("%s[typeof k===\"object\"?util.longToHash(k):k]=%s", ref, val);
99
+ else {
100
+ if (field.keyType === "string") gen
101
+ ("if(k===\"__proto__\")")
102
+ ("util.makeProp(%s,k)", ref);
103
+ gen
104
+ ("%s[k]=%s", ref, val);
105
+ }
76
106
 
77
107
  // Repeated fields
78
108
  } else if (field.repeated) { gen
79
-
80
- ("if(!(%s&&%s.length))", ref, ref)
81
- ("%s=[]", ref);
109
+ ("case %i:", field.id)
110
+ ("{");
82
111
 
83
112
  // Packable (always check for forward and backward compatiblity)
84
113
  if (types.packed[type] !== undefined) gen
85
- ("if((t&7)===2){")
114
+ ("if(u===2){")
115
+ ("if(!(%s&&%s.length))", ref, ref)
116
+ ("%s=[]", ref)
86
117
  ("var c2=r.uint32()+r.pos")
87
118
  ("while(r.pos<c2)")
88
119
  ("%s.push(r.%s())", ref, type)
89
- ("}else");
120
+ ("continue")
121
+ ("}");
90
122
 
91
123
  // Non-packed
92
- if (types.basic[type] === undefined) gen(field.delimited
93
- ? "%s.push(types[%i].decode(r,undefined,((t&~7)|4)))"
94
- : "%s.push(types[%i].decode(r,r.uint32()))", ref, i);
95
- else gen
124
+ gen
125
+ ("if(u!==%i)", types.basic[type] === undefined ? field.delimited ? 3 : 2 : types.basic[type])
126
+ ("break")
127
+ ("if(!(%s&&%s.length))", ref, ref)
128
+ ("%s=[]", ref);
129
+ if (types.basic[type] === undefined) {
130
+ if (field.delimited) gen
131
+ ("%s.push(types[%i].decode(r,undefined,%i,q+1))", ref, i, field.id * 8 + 4);
132
+ else gen
133
+ ("%s.push(types[%i].decode(r,r.uint32(),undefined,q+1))", ref, i);
134
+ } else gen
96
135
  ("%s.push(r.%s())", ref, type);
97
136
 
98
137
  // Non-repeated
99
- } else if (types.basic[type] === undefined) gen(field.delimited
100
- ? "%s=types[%i].decode(r,undefined,((t&~7)|4))"
101
- : "%s=types[%i].decode(r,r.uint32())", ref, i);
102
- else gen
138
+ } else if (types.basic[type] === undefined) {
139
+ gen
140
+ ("case %i:{", field.id)
141
+ ("if(u!==%i)", field.delimited ? 3 : 2)
142
+ ("break");
143
+ if (field.delimited) gen
144
+ ("%s=types[%i].decode(r,undefined,%i,q+1,%s)", ref, i, field.id * 8 + 4, ref);
145
+ else gen
146
+ ("%s=types[%i].decode(r,r.uint32(),undefined,q+1,%s)", ref, i, ref);
147
+ }
148
+ else if (field.hasPresence) {
149
+ gen
150
+ ("case %i:{", field.id)
151
+ ("if(u!==%i)", types.basic[type])
152
+ ("break")
103
153
  ("%s=r.%s()", ref, type);
154
+ } else {
155
+ gen
156
+ ("case %i:{", field.id)
157
+ ("if(u!==%i)", types.basic[type])
158
+ ("break");
159
+ if (type === "string" || type === "bytes") gen
160
+ ("if((v=r.%s()).length)", type);
161
+ else if (types.long[type] !== undefined) gen
162
+ ("if(typeof(v=r.%s())===\"object\"?v.low||v.high:v!==0)", type);
163
+ else if (type === "double" || type === "float") gen
164
+ ("if((v=r.%s())!==0)", type);
165
+ else gen
166
+ ("if(v=r.%s())", type);
167
+ gen
168
+ ("%s=v", ref)
169
+ ("else")
170
+ ("delete %s", ref); // rare/odd case: later default clears earlier non-default
171
+ }
172
+ if (field.partOf) gen
173
+ ("m%s=%j", util.safeProp(field.partOf.name), field.name);
104
174
  gen
105
- ("break")
175
+ ("continue")
106
176
  ("}");
107
- // Unknown fields
108
- } gen
109
- ("default:")
110
- ("r.skipType(t&7)")
111
- ("break")
112
-
113
- ("}")
114
- ("}");
177
+ }
178
+ if (i) gen
179
+ ("}");
180
+ // Unknown fields
181
+ gen
182
+ ("r.skipType(%s,q,t)", i ? "u" : "t&7")
183
+ ("util.makeProp(m,\"$unknowns\",false);")
184
+ ("(m.$unknowns||(m.$unknowns=[])).push(r.raw(s,r.pos))")
185
+ ("}")
186
+ ("if(z!==undefined)")
187
+ ("throw Error(\"missing end group\")");
115
188
 
116
189
  // Field presence
117
190
  for (i = 0; i < mtype._fieldsArray.length; ++i) {
package/src/encoder.js CHANGED
@@ -47,7 +47,12 @@ function encoder(mtype) {
47
47
  if (field.map) {
48
48
  gen
49
49
  ("if(%s!=null&&Object.hasOwnProperty.call(m,%j)){", ref, field.name) // !== undefined && !== null
50
- ("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref)
50
+ ("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref);
51
+ if (field.keyType === "bool") gen
52
+ ("w.uint32(%i).fork().uint32(%i).bool(util.boolFromKey(ks[i]))", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType]);
53
+ else if (types.long[field.keyType] !== undefined) gen
54
+ ("w.uint32(%i).fork().uint32(%i).%s(util.longFromKey(ks[i],%j))", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType, field.keyType === "uint64" || field.keyType === "fixed64");
55
+ else gen
51
56
  ("w.uint32(%i).fork().uint32(%i).%s(ks[i])", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);
52
57
  if (wireType === undefined) gen
53
58
  ("types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", index, ref); // can't be groups
@@ -83,7 +88,7 @@ function encoder(mtype) {
83
88
 
84
89
  // Non-repeated
85
90
  } else {
86
- if (field.optional) gen
91
+ if (!field.required) gen
87
92
  ("if(%s!=null&&Object.hasOwnProperty.call(m,%j))", ref, field.name); // !== undefined && !== null
88
93
 
89
94
  if (wireType === undefined)
@@ -95,6 +100,9 @@ function encoder(mtype) {
95
100
  }
96
101
 
97
102
  return gen
103
+ ("if(m.$unknowns!=null&&Object.hasOwnProperty.call(m,\"$unknowns\"))")
104
+ ("for(var i=0;i<m.$unknowns.length;++i)")
105
+ ("w.raw(m.$unknowns[i])")
98
106
  ("return w");
99
107
  /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */
100
108
  }
package/src/enum.js CHANGED
@@ -74,7 +74,7 @@ function Enum(name, values, options, comment, comments, valuesOptions) {
74
74
 
75
75
  if (values)
76
76
  for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)
77
- if (typeof values[keys[i]] === "number") // use forward entries only
77
+ if (keys[i] !== "__proto__" && typeof values[keys[i]] === "number") // use forward entries only
78
78
  this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];
79
79
  }
80
80
 
@@ -153,6 +153,9 @@ Enum.prototype.add = function add(name, id, comment, options) {
153
153
  if (!util.isInteger(id))
154
154
  throw TypeError("id must be an integer");
155
155
 
156
+ if (name === "__proto__")
157
+ return this;
158
+
156
159
  if (this.values[name] !== undefined)
157
160
  throw Error("duplicate name '" + name + "' in " + this);
158
161
 
package/src/field.js CHANGED
@@ -352,8 +352,8 @@ Field.prototype.resolve = function resolve() {
352
352
  this.defaultValue = this.typeDefault;
353
353
 
354
354
  // ensure proper value on prototype
355
- if (this.parent instanceof Type)
356
- this.parent.ctor.prototype[this.name] = this.defaultValue;
355
+ if (this.parent instanceof Type && this.parent._ctor)
356
+ this.parent._ctor.prototype[this.name] = this.defaultValue;
357
357
 
358
358
  return ReflectionObject.prototype.resolve.call(this);
359
359
  };
@@ -405,6 +405,7 @@ Field.prototype._resolveFeatures = function _resolveFeatures(edition) {
405
405
  * @param {Object} prototype Target prototype
406
406
  * @param {string} fieldName Field name
407
407
  * @returns {undefined}
408
+ * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.
408
409
  */
409
410
 
410
411
  /**
@@ -417,6 +418,7 @@ Field.prototype._resolveFeatures = function _resolveFeatures(edition) {
417
418
  * @param {T} [defaultValue] Default value
418
419
  * @returns {FieldDecorator} Decorator function
419
420
  * @template T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]
421
+ * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.
420
422
  */
421
423
  Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {
422
424
 
@@ -434,6 +436,11 @@ Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {
434
436
  };
435
437
  };
436
438
 
439
+ // Sets up cyclic dependencies (called in index-light)
440
+ Field._configure = function configure(Type_) {
441
+ Type = Type_;
442
+ };
443
+
437
444
  /**
438
445
  * Field decorator (TypeScript).
439
446
  * @name Field.d
@@ -444,10 +451,6 @@ Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {
444
451
  * @returns {FieldDecorator} Decorator function
445
452
  * @template T extends Message<T>
446
453
  * @variation 2
454
+ * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.
447
455
  */
448
456
  // like Field.d but without a default value
449
-
450
- // Sets up cyclic dependencies (called in index-light)
451
- Field._configure = function configure(Type_) {
452
- Type = Type_;
453
- };