protobufjs 8.7.1 → 8.8.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.
@@ -215,6 +215,9 @@ export interface IDescriptorProto {
215
215
 
216
216
  /** Reserved names */
217
217
  reservedName?: string[];
218
+
219
+ /** Declared symbol visibility */
220
+ visibility?: number;
218
221
  }
219
222
 
220
223
  /** Properties of a MessageOptions message. */
@@ -311,6 +314,9 @@ export interface IEnumDescriptorProto {
311
314
 
312
315
  /** Enum options */
313
316
  options?: IEnumOptions;
317
+
318
+ /** Declared symbol visibility */
319
+ visibility?: number;
314
320
  }
315
321
 
316
322
  /** Properties of an EnumValueDescriptorProto message. */
@@ -353,6 +359,7 @@ export interface IFeatureSet {
353
359
  jsonFormat?: number;
354
360
  enforceNamingStyle?: number;
355
361
  defaultSymbolVisibility?: number;
362
+ enforceProtoLimits?: number;
356
363
  }
357
364
 
358
365
  /** Properties of a OneofDescriptorProto message. */
package/ext/descriptor.js CHANGED
@@ -13,7 +13,7 @@ var Namespace = $protobuf.Namespace,
13
13
  Method = $protobuf.Method,
14
14
  patterns = $protobuf.util.patterns;
15
15
 
16
- var numberRe = patterns.numberRe,
16
+ var integerRe = /^[+-]?[0-9]+$/,
17
17
  typeRefRe = patterns.typeRefRe;
18
18
 
19
19
  // --- Root ---
@@ -52,6 +52,7 @@ var numberRe = patterns.numberRe,
52
52
  * @property {number} EDITION_PROTO3=999
53
53
  * @property {number} EDITION_2023=1000
54
54
  * @property {number} EDITION_2024=1001
55
+ * @property {number} EDITION_2026=1002
55
56
  * @property {number} EDITION_1_TEST_ONLY=1
56
57
  * @property {number} EDITION_2_TEST_ONLY=2
57
58
  * @property {number} EDITION_99997_TEST_ONLY=99997
@@ -208,6 +209,7 @@ function Root_toDescriptorRecursive(ns, files, edition) {
208
209
  * @property {IMessageOptions} [options] Not supported
209
210
  * @property {IDescriptorProtoReservedRange[]} [reservedRange] Reserved ranges
210
211
  * @property {string[]} [reservedName] Reserved names
212
+ * @property {number} [visibility] Declared symbol visibility
211
213
  */
212
214
 
213
215
  /**
@@ -252,6 +254,7 @@ function Type_fromDescriptor(descriptor, ctx, nested, depth) {
252
254
  var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)),
253
255
  i,
254
256
  mapEntries = Object.create(null);
257
+ type.visibility = visibilityFromDescriptor(descriptor.visibility);
255
258
 
256
259
  if (!nested) {
257
260
  type._edition = ctx.edition;
@@ -317,6 +320,9 @@ Type.prototype.toDescriptor = function toDescriptor(edition) {
317
320
  var descriptor = exports.DescriptorProto.create({ name: this.name }),
318
321
  i;
319
322
 
323
+ if (this.visibility)
324
+ descriptor.visibility = visibilityToDescriptor(this.visibility);
325
+
320
326
  /* Fields */ for (i = 0; i < this.fieldsArray.length; ++i) {
321
327
  var fieldDescriptor;
322
328
  descriptor.field.push(fieldDescriptor = this._fieldsArray[i].toDescriptor(edition));
@@ -519,17 +525,33 @@ function Field_fromDescriptor(descriptor, ctx, nested) {
519
525
 
520
526
  if (descriptor.defaultValue && descriptor.defaultValue.length) {
521
527
  var defaultValue = descriptor.defaultValue;
522
- switch (defaultValue) {
523
- case "true": case "TRUE":
524
- defaultValue = true;
528
+ switch (fieldType) {
529
+ case "double": case "float":
530
+ switch (defaultValue.toLowerCase()) {
531
+ case "inf": defaultValue = Infinity; break;
532
+ case "-inf": defaultValue = -Infinity; break;
533
+ case "nan": case "-nan": defaultValue = NaN; break;
534
+ default:
535
+ defaultValue = Number(defaultValue);
536
+ if (Number.isNaN(defaultValue))
537
+ throw Error("illegal default value for " + fieldType);
538
+ break;
539
+ }
525
540
  break;
526
- case "false": case "FALSE":
527
- defaultValue = false;
541
+ case "int32": case "uint32": case "sint32": case "fixed32": case "sfixed32":
542
+ if (!integerRe.test(defaultValue))
543
+ throw Error("illegal default value for " + fieldType);
544
+ defaultValue = parseInt(defaultValue, 10);
528
545
  break;
529
- default:
530
- var match = numberRe.exec(defaultValue);
531
- if (match)
532
- defaultValue = parseInt(defaultValue); // eslint-disable-line radix
546
+ case "int64": case "uint64": case "sint64": case "fixed64": case "sfixed64":
547
+ if (!integerRe.test(defaultValue))
548
+ throw Error("illegal default value for " + fieldType);
549
+ break;
550
+ case "bool":
551
+ switch (defaultValue) {
552
+ case "true": case "TRUE": defaultValue = true; break;
553
+ case "false": case "FALSE": defaultValue = false; break;
554
+ }
533
555
  break;
534
556
  }
535
557
  field.setOption("default", defaultValue);
@@ -639,6 +661,7 @@ Field.prototype.toDescriptor = function toDescriptor(edition) {
639
661
  * @property {string} [name] Enum name
640
662
  * @property {IEnumValueDescriptorProto[]} [value] Enum values
641
663
  * @property {IEnumOptions} [options] Enum options
664
+ * @property {number} [visibility] Declared symbol visibility
642
665
  */
643
666
 
644
667
  /**
@@ -677,6 +700,7 @@ Field.prototype.toDescriptor = function toDescriptor(edition) {
677
700
  * @property {number} [jsonFormat]
678
701
  * @property {number} [enforceNamingStyle]
679
702
  * @property {number} [defaultSymbolVisibility]
703
+ * @property {number} [enforceProtoLimits]
680
704
  */
681
705
 
682
706
  var unnamedEnumIndex = 0;
@@ -719,6 +743,7 @@ function Enum_fromDescriptor(descriptor, ctx, nested) {
719
743
  undefined,
720
744
  valuesOptions
721
745
  );
746
+ enm.visibility = visibilityFromDescriptor(descriptor.visibility);
722
747
 
723
748
  if (!nested) {
724
749
  enm._edition = ctx.edition;
@@ -760,6 +785,8 @@ Enum.prototype.toDescriptor = function toDescriptor() {
760
785
  value: values,
761
786
  options: toDescriptorOptions(this.options, exports.EnumOptions)
762
787
  });
788
+ if (this.visibility)
789
+ descriptor.visibility = visibilityToDescriptor(this.visibility);
763
790
 
764
791
  /* Reserved... */ if (this.reserved)
765
792
  for (i = 0; i < this.reserved.length; ++i)
@@ -984,6 +1011,14 @@ function applyContextFeatures(object, ctx) {
984
1011
  return object;
985
1012
  }
986
1013
 
1014
+ function visibilityFromDescriptor(visibility) {
1015
+ return visibility === 1 ? "local" : visibility === 2 ? "export" : undefined;
1016
+ }
1017
+
1018
+ function visibilityToDescriptor(visibility) {
1019
+ return visibility === "local" ? 1 : visibility === "export" ? 2 : 0;
1020
+ }
1021
+
987
1022
  // Converts a descriptor type to a protobuf.js basic type
988
1023
  function fromDescriptorType(type) {
989
1024
  switch (type) {
@@ -1142,6 +1177,8 @@ function editionFromDescriptor(fileDescriptor) {
1142
1177
  return "2023";
1143
1178
  case exports.Edition.EDITION_2024:
1144
1179
  return "2024";
1180
+ case exports.Edition.EDITION_2026:
1181
+ return "2026";
1145
1182
  default:
1146
1183
  throw new Error("Unsupported edition " + fileDescriptor.edition);
1147
1184
  }
@@ -1165,6 +1202,9 @@ function editionToDescriptor(edition, fileDescriptor) {
1165
1202
  case "2024":
1166
1203
  fileDescriptor.edition = exports.Edition.EDITION_2024;
1167
1204
  break;
1205
+ case "2026":
1206
+ fileDescriptor.edition = exports.Edition.EDITION_2026;
1207
+ break;
1168
1208
  default:
1169
1209
  throw new Error("Unsupported edition " + edition);
1170
1210
  }
package/ext/protojson.js CHANGED
@@ -91,6 +91,15 @@ function invalid(name, value, what) {
91
91
  return Error(name + ": " + what + ": " + JSON.stringify(value));
92
92
  }
93
93
 
94
+ function normalizeIntegerString(str, name, what) {
95
+ str = str.replace(/^\+/, "").replace(/^(-?)0+(?=\d)/, "$1");
96
+ if (str === "-0")
97
+ str = "0";
98
+ if (str.length > 20) // max uint64 and min int64
99
+ throw Error(name + ": out of range for " + what);
100
+ return str;
101
+ }
102
+
94
103
  function parseIntegerString(value, type, name) {
95
104
  var str;
96
105
  if (typeof value === "number") {
@@ -113,6 +122,7 @@ function parseIntegerString(value, type, name) {
113
122
  throw invalid(name, value, "expected integer (number or string)");
114
123
 
115
124
  var range = INT_RANGE[type];
125
+ str = normalizeIntegerString(str, name, type);
116
126
  if (LONG_TYPE[type]) {
117
127
  if (hasBigInt) {
118
128
  var big = BigInt(str);
@@ -128,17 +138,17 @@ function parseMapIntegerKey(key, type, name) {
128
138
  var unsigned = type === "uint32" || type === "fixed32" || type === "uint64" || type === "fixed64";
129
139
  if (!(unsigned ? /^[0-9]+$/ : /^-?[0-9]+$/).test(key))
130
140
  throw invalid(name, key, "invalid " + type + " map key");
141
+ var range = INT_RANGE[type];
142
+ key = normalizeIntegerString(key, name, type + " map key");
131
143
  if (hasBigInt) {
132
- var big = BigInt(key),
133
- range = INT_RANGE[type];
144
+ var big = BigInt(key);
134
145
  if (big < BigInt(range[0]) || big > BigInt(range[1]))
135
146
  throw invalid(name, key, "out of range for " + type + " map key");
136
147
  return big.toString();
137
148
  }
138
149
  parseIntegerString(key, type, name);
139
150
  if (LONG_TYPE[type]) {
140
- var normalized = key.replace(/^-?0+(?=\d)/, key.charAt(0) === "-" ? "-" : "");
141
- return normalized === "-0" ? "0" : normalized;
151
+ return key;
142
152
  }
143
153
  return String(Number(key));
144
154
  }
package/ext/textformat.js CHANGED
@@ -586,14 +586,14 @@ Parser.prototype.parseScalar = function parseScalar(field) {
586
586
  };
587
587
 
588
588
  Parser.prototype.readStringBytes = function readStringBytes() {
589
- var token = this.tn.next(),
590
- bytes = [];
589
+ var token = this.tn.next();
591
590
  if (!token || token.type !== "string")
592
591
  this.error("expected string");
593
- Array.prototype.push.apply(bytes, token.value);
592
+ var bytes = token.value;
594
593
  while ((token = this.tn.peek()) && token.type === "string") {
595
594
  token = this.tn.next();
596
- Array.prototype.push.apply(bytes, token.value);
595
+ for (var i = 0; i < token.value.length; ++i)
596
+ bytes.push(token.value[i]);
597
597
  }
598
598
  return bytes;
599
599
  };
@@ -842,6 +842,10 @@ function parseInteger(token, sign, unsigned, bits) {
842
842
  } else if (!/^(?:0|[1-9][0-9]*)$/.test(raw))
843
843
  throw Error("integer value expected");
844
844
 
845
+ digits = digits.replace(/^0+(?=.)/, "");
846
+ if (digits.length > Math.ceil(bits / 3)) // 3 bits per octal digit
847
+ throw Error((unsigned ? "unsigned " : "") + "integer value out of range");
848
+
845
849
  if (typeof util.global.BigInt === "function")
846
850
  return parseIntegerBigInt(digits, radix, sign, unsigned, bits);
847
851
 
@@ -29,6 +29,7 @@
29
29
  "EDITION_PROTO3": 999,
30
30
  "EDITION_2023": 1000,
31
31
  "EDITION_2024": 1001,
32
+ "EDITION_2026": 1002,
32
33
  "EDITION_1_TEST_ONLY": 1,
33
34
  "EDITION_2_TEST_ONLY": 2,
34
35
  "EDITION_99997_TEST_ONLY": 99997,
@@ -1199,6 +1200,11 @@
1199
1200
  "edition_defaults.edition": "EDITION_2024",
1200
1201
  "edition_defaults.value": "EXPORT_TOP_LEVEL"
1201
1202
  }
1203
+ },
1204
+ "enforceProtoLimits": {
1205
+ "type": "ProtoLimitsFeature.EnforceProtoLimits",
1206
+ "id": 9,
1207
+ "protoName": "enforce_proto_limits"
1202
1208
  }
1203
1209
  },
1204
1210
  "extensions": [
@@ -1269,7 +1275,8 @@
1269
1275
  "values": {
1270
1276
  "ENFORCE_NAMING_STYLE_UNKNOWN": 0,
1271
1277
  "STYLE2024": 1,
1272
- "STYLE_LEGACY": 2
1278
+ "STYLE_LEGACY": 2,
1279
+ "STYLE2026": 3
1273
1280
  }
1274
1281
  },
1275
1282
  "VisibilityFeature": {
@@ -1291,6 +1298,18 @@
1291
1298
  }
1292
1299
  }
1293
1300
  }
1301
+ },
1302
+ "ProtoLimitsFeature": {
1303
+ "fields": {},
1304
+ "nested": {
1305
+ "EnforceProtoLimits": {
1306
+ "values": {
1307
+ "PROTO_LIMITS_UNKNOWN": 0,
1308
+ "LEGACY_NO_EXPLICIT_LIMITS": 1,
1309
+ "PROTO_LIMITS2026": 2
1310
+ }
1311
+ }
1312
+ }
1294
1313
  }
1295
1314
  }
1296
1315
  },
@@ -17,6 +17,7 @@ enum Edition {
17
17
  EDITION_PROTO3 = 999;
18
18
  EDITION_2023 = 1000;
19
19
  EDITION_2024 = 1001;
20
+ EDITION_2026 = 1002;
20
21
  EDITION_1_TEST_ONLY = 1;
21
22
  EDITION_2_TEST_ONLY = 2;
22
23
  EDITION_99997_TEST_ONLY = 99997;
@@ -396,6 +397,7 @@ message FeatureSet {
396
397
  optional JsonFormat json_format = 6 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_PROTO3", edition_defaults.value="ALLOW"];
397
398
  optional EnforceNamingStyle enforce_naming_style = 7 [retention="RETENTION_SOURCE", targets="TARGET_TYPE_METHOD", feature_support.edition_introduced="EDITION_2024", edition_defaults.edition="EDITION_2024", edition_defaults.value="STYLE2024"];
398
399
  optional VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention="RETENTION_SOURCE", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2024", edition_defaults.edition="EDITION_2024", edition_defaults.value="EXPORT_TOP_LEVEL"];
400
+ optional ProtoLimitsFeature.EnforceProtoLimits enforce_proto_limits = 9;
399
401
 
400
402
  enum FieldPresence {
401
403
 
@@ -445,6 +447,7 @@ message FeatureSet {
445
447
  ENFORCE_NAMING_STYLE_UNKNOWN = 0;
446
448
  STYLE2024 = 1;
447
449
  STYLE_LEGACY = 2;
450
+ STYLE2026 = 3;
448
451
  }
449
452
 
450
453
  message VisibilityFeature {
@@ -461,6 +464,16 @@ message FeatureSet {
461
464
  reserved 1 to max;
462
465
  }
463
466
 
467
+ message ProtoLimitsFeature {
468
+
469
+ enum EnforceProtoLimits {
470
+
471
+ PROTO_LIMITS_UNKNOWN = 0;
472
+ LEGACY_NO_EXPLICIT_LIMITS = 1;
473
+ PROTO_LIMITS2026 = 2;
474
+ }
475
+ }
476
+
464
477
  extensions 1000 to 9994, 9995 to 9999, 10000;
465
478
 
466
479
  reserved 999;
@@ -524,4 +537,4 @@ enum SymbolVisibility {
524
537
  VISIBILITY_UNSET = 0;
525
538
  VISIBILITY_LOCAL = 1;
526
539
  VISIBILITY_EXPORT = 2;
527
- }
540
+ }
package/index.d.ts CHANGED
@@ -190,6 +190,9 @@ export class Enum extends ReflectionObject {
190
190
  /** Reserved ranges, if any. */
191
191
  reserved: (number[]|string)[];
192
192
 
193
+ /** Declared symbol visibility, if any. */
194
+ visibility?: ("local"|"export");
195
+
193
196
  /**
194
197
  * Constructs an enum from an enum descriptor.
195
198
  * @param name Enum name
@@ -260,6 +263,9 @@ export interface IEnum {
260
263
  /** Reserved ranges */
261
264
  reserved?: (number[]|string)[];
262
265
 
266
+ /** Declared symbol visibility */
267
+ visibility?: ("local"|"export");
268
+
263
269
  /** Enum comment */
264
270
  comment?: (string|null);
265
271
 
@@ -1804,6 +1810,9 @@ export class Type extends NamespaceBase {
1804
1810
  /** Reserved ranges, if any. */
1805
1811
  reserved: (number[]|string)[];
1806
1812
 
1813
+ /** Declared symbol visibility, if any. */
1814
+ visibility?: ("local"|"export");
1815
+
1807
1816
  /** Message fields by id. */
1808
1817
  readonly fieldsById: { [k: number]: Field };
1809
1818
 
@@ -1982,6 +1991,9 @@ export interface IType extends INamespace {
1982
1991
  /** Whether a legacy group or not */
1983
1992
  group?: boolean;
1984
1993
 
1994
+ /** Declared symbol visibility */
1995
+ visibility?: ("local"|"export");
1996
+
1985
1997
  /** Message type comment */
1986
1998
  comment?: (string|null);
1987
1999
  }
@@ -2918,6 +2930,9 @@ export class Writer {
2918
2930
  /** Stack of forked length-prefix positions. */
2919
2931
  states: (number[]|null);
2920
2932
 
2933
+ /** Initial backing buffer size in bytes. Defaults to 128. */
2934
+ static initialBufferSize: number;
2935
+
2921
2936
  /**
2922
2937
  * Current write position.
2923
2938
  * @deprecated Use {@link Writer#pos} instead.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "protobufjs",
3
- "version": "8.7.1",
3
+ "version": "8.8.0",
4
4
  "description": "Protocol Buffers for JavaScript & TypeScript.",
5
5
  "author": "Daniel Wirtz <dcode+protobufjs@dcode.io>",
6
6
  "license": "BSD-3-Clause",
package/src/converter.js CHANGED
@@ -303,7 +303,11 @@ converter.toObject = function toObject(mtype) {
303
303
  ("d%s=%j", prop, arrayDefault)
304
304
  ("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)
305
305
  ("}");
306
- } else gen
306
+ } else if ((field.type === "double" || field.type === "float") && typeof field.typeDefault === "number"
307
+ && (!isFinite(field.typeDefault) || Object.is(field.typeDefault, -0))) gen
308
+ ("d%s=%f", prop, field.typeDefault)
309
+ ("if(o.json&&!isFinite(d%s))d%s=String(d%s)", prop, prop, prop);
310
+ else gen
307
311
  ("d%s=%j", prop, field.typeDefault); // also messages (=null)
308
312
  } gen
309
313
  ("}");
package/src/decoder.js CHANGED
@@ -46,7 +46,17 @@ function decoder(mtype) {
46
46
  ("if(q===undefined)q=0")
47
47
  ("if(q>Reader.recursionLimit)")
48
48
  ("throw Error(\"max depth exceeded\")")
49
- ("var c=l===undefined?r.len:r.pos+l,m=g||new C" + (hasMapField ? ",k,v" : needsValueVar ? ",v" : ""))
49
+ ("var c,m" + (hasMapField ? ",k,v" : needsValueVar ? ",v" : ""))
50
+ ("if(l===undefined)")
51
+ ("c=r.len")
52
+ ("else{")
53
+ ("c=r.pos+l")
54
+ ("if(c>r.len)")
55
+ ("throw RangeError(\"index out of range\")")
56
+ ("l=r.len")
57
+ ("r.len=c")
58
+ ("}")
59
+ ("m=g||new C")
50
60
  ("while(r.pos<c){")
51
61
  ("var s=r.pos")
52
62
  ("var t=r.tag()")
@@ -73,7 +83,10 @@ function decoder(mtype) {
73
83
  ("if(%s===util.emptyObject)", ref)
74
84
  ("%s={}", ref);
75
85
  gen
76
- ("var c2=r.uint32()+r.pos");
86
+ ("var c2=r.uint32()+r.pos")
87
+ ("if(c2>r.len)")
88
+ ("throw RangeError(\"index out of range\")")
89
+ ("r.len=c2");
77
90
 
78
91
  if (types.defaults[field.keyType] !== undefined) gen
79
92
  ("k=%j", types.defaults[field.keyType]);
@@ -111,6 +124,10 @@ function decoder(mtype) {
111
124
  ("}")
112
125
  ("r.skipType(u,q,t2)")
113
126
  ("}");
127
+ gen
128
+ ("if(r.pos!==c2)")
129
+ ("throw RangeError(\"index out of range\")")
130
+ ("r.len=c");
114
131
 
115
132
  if (closed) { gen
116
133
  ("if(types[%i].valuesById[v]===undefined){", i);
@@ -144,6 +161,9 @@ function decoder(mtype) {
144
161
  if (closed) {
145
162
  gen
146
163
  ("var c2=r.uint32()+r.pos")
164
+ ("if(c2>r.len)")
165
+ ("throw RangeError(\"index out of range\")")
166
+ ("r.len=c2")
147
167
  ("while(r.pos<c2){")
148
168
  ("s=r.pos")
149
169
  ("v=r.%s()", type)
@@ -154,6 +174,10 @@ function decoder(mtype) {
154
174
  ("}else");
155
175
  genPreserveUnknown(gen, "util.rawField(" + field.id + ",0,r.raw(s,r.pos))")
156
176
  ("}");
177
+ gen
178
+ ("if(r.pos!==c2)")
179
+ ("throw RangeError(\"index out of range\")")
180
+ ("r.len=c");
157
181
  } else gen
158
182
  ("if(!(%s&&%s.length))", ref, ref)
159
183
  ("%s=[]", ref)
@@ -262,6 +286,11 @@ function decoder(mtype) {
262
286
  ("r.skipType(%s,q,t)", i ? "u" : "t&7");
263
287
  genPreserveUnknown(gen, "r.raw(s,r.pos)")
264
288
  ("}")
289
+ ("if(l!==undefined){")
290
+ ("if(r.pos!==c)")
291
+ ("throw RangeError(\"index out of range\")")
292
+ ("r.len=l")
293
+ ("}")
265
294
  ("if(z!==undefined)")
266
295
  ("throw Error(\"missing end group\")");
267
296
 
package/src/enum.js CHANGED
@@ -76,14 +76,23 @@ function Enum(name, values, options, comment, comments, valuesOptions) {
76
76
  */
77
77
  this.reserved = undefined; // toJSON
78
78
 
79
+ /**
80
+ * Declared symbol visibility, if any.
81
+ * @type {"local"|"export"|undefined}
82
+ */
83
+ this.visibility = undefined; // toJSON
84
+
79
85
  // Note that values inherit valuesById on their prototype which makes them a TypeScript-
80
86
  // compatible enum. This is used by pbts to write actual enum definitions that work for
81
87
  // static and reflection code alike instead of emitting generic object definitions.
82
88
 
83
89
  if (values)
84
90
  for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)
85
- if (keys[i] !== "__proto__" && typeof values[keys[i]] === "number") // use forward entries only
86
- this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];
91
+ if (keys[i] !== "__proto__" && typeof values[keys[i]] === "number") { // use forward entries only
92
+ this.values[keys[i]] = values[keys[i]];
93
+ if (this.valuesById[values[keys[i]]] === undefined)
94
+ this.valuesById[values[keys[i]]] = keys[i];
95
+ }
87
96
  }
88
97
 
89
98
  /**
@@ -109,6 +118,7 @@ Enum.prototype._resolveFeatures = function _resolveFeatures(edition) {
109
118
  * @property {Object.<string,*>} [options] Enum options
110
119
  * @property {Object.<string,Object.<string,*>>} [valuesOptions] Enum value options
111
120
  * @property {Array.<number[]|string>} [reserved] Reserved ranges
121
+ * @property {"local"|"export"} [visibility] Declared symbol visibility
112
122
  * @property {string|null} [comment] Enum comment
113
123
  * @property {Object.<string,string|null>} [comments] Value comments
114
124
  */
@@ -123,6 +133,8 @@ Enum.prototype._resolveFeatures = function _resolveFeatures(edition) {
123
133
  Enum.fromJSON = function fromJSON(name, json) {
124
134
  var enm = new Enum(name, json.values, json.options, json.comment, json.comments, json.valuesOptions);
125
135
  enm.reserved = json.reserved;
136
+ if (json.visibility)
137
+ enm.visibility = json.visibility;
126
138
  if (json.edition)
127
139
  enm._edition = json.edition;
128
140
  enm._defaultEdition = "proto3"; // For backwards-compatibility.
@@ -142,6 +154,7 @@ Enum.prototype.toJSON = function toJSON(toJSONOptions) {
142
154
  "valuesOptions" , this.valuesOptions,
143
155
  "values" , this.values,
144
156
  "reserved" , this.reserved && this.reserved.length ? this.reserved : undefined,
157
+ "visibility" , this.visibility,
145
158
  "comment" , keepComments ? this.comment : undefined,
146
159
  "comments" , keepComments ? this.comments : undefined
147
160
  ]);
package/src/field.js CHANGED
@@ -371,12 +371,17 @@ Field.prototype.resolve = function resolve() {
371
371
 
372
372
  // convert to internal data type if necesssary
373
373
  if (this.long) {
374
- this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type === "uint64" || this.type === "fixed64");
374
+ var unsigned = this.type === "uint64" || this.type === "fixed64";
375
+ this.typeDefault = typeof this.typeDefault === "string"
376
+ ? util.Long.fromString(this.typeDefault, unsigned)
377
+ : util.Long.fromNumber(this.typeDefault, unsigned);
375
378
 
376
379
  /* istanbul ignore else */
377
380
  if (Object.freeze)
378
381
  Object.freeze(this.typeDefault); // long instances are meant to be immutable anyway (i.e. use small int cache that even requires it)
379
382
 
383
+ } else if (types.long[this.type] !== undefined && typeof this.typeDefault === "string") {
384
+ this.typeDefault = parseInt(this.typeDefault, 10);
380
385
  } else if (this.bytes && typeof this.typeDefault === "string") {
381
386
  var buf;
382
387
  if (util.base64.test(this.typeDefault))
package/src/object.js CHANGED
@@ -10,10 +10,11 @@ var Root; // cyclic
10
10
 
11
11
  /* eslint-disable no-warning-comments */
12
12
  // TODO: Replace with embedded proto.
13
- var editions2024Defaults = {enum_type: "OPEN", field_presence: "EXPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE2024", default_symbol_visibility: "EXPORT_TOP_LEVEL" };
14
- var editions2023Defaults = {enum_type: "OPEN", field_presence: "EXPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE_LEGACY", default_symbol_visibility: "EXPORT_ALL" };
15
13
  var proto2Defaults = {enum_type: "CLOSED", field_presence: "EXPLICIT", json_format: "LEGACY_BEST_EFFORT", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "EXPANDED", utf8_validation: "NONE", enforce_naming_style: "STYLE_LEGACY", default_symbol_visibility: "EXPORT_ALL" };
16
14
  var proto3Defaults = {enum_type: "OPEN", field_presence: "IMPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE_LEGACY", default_symbol_visibility: "EXPORT_ALL" };
15
+ var editions2023Defaults = {enum_type: "OPEN", field_presence: "EXPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE_LEGACY", default_symbol_visibility: "EXPORT_ALL" };
16
+ var editions2024Defaults = {enum_type: "OPEN", field_presence: "EXPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE2024", default_symbol_visibility: "EXPORT_TOP_LEVEL" };
17
+ var editions2026Defaults = {enum_type: "OPEN", field_presence: "EXPLICIT", json_format: "ALLOW", message_encoding: "LENGTH_PREFIXED", repeated_field_encoding: "PACKED", utf8_validation: "VERIFY", enforce_naming_style: "STYLE2026", default_symbol_visibility: "STRICT", enforce_proto_limits: "PROTO_LIMITS2026" };
17
18
 
18
19
  /**
19
20
  * Constructs a new reflection object instance.
@@ -227,6 +228,8 @@ ReflectionObject.prototype._resolveFeatures = function _resolveFeatures(edition)
227
228
  defaults = Object.assign({}, editions2023Defaults);
228
229
  } else if (edition === "2024") {
229
230
  defaults = Object.assign({}, editions2024Defaults);
231
+ } else if (edition === "2026") {
232
+ defaults = Object.assign({}, editions2026Defaults);
230
233
  } else {
231
234
  throw new Error("Unknown edition: " + edition);
232
235
  }