protobufjs 7.3.0 → 7.3.2

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 (77) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +727 -740
  3. package/dist/light/protobuf.js +6264 -6264
  4. package/dist/light/protobuf.js.map +1 -1
  5. package/dist/light/protobuf.min.js +2 -2
  6. package/dist/light/protobuf.min.js.map +1 -1
  7. package/dist/minimal/protobuf.js +1928 -1928
  8. package/dist/minimal/protobuf.js.map +1 -1
  9. package/dist/minimal/protobuf.min.js +2 -2
  10. package/dist/minimal/protobuf.min.js.map +1 -1
  11. package/dist/protobuf.js +7978 -7978
  12. package/dist/protobuf.js.map +1 -1
  13. package/dist/protobuf.min.js +2 -2
  14. package/dist/protobuf.min.js.map +1 -1
  15. package/ext/debug/README.md +4 -4
  16. package/ext/debug/index.js +71 -71
  17. package/ext/descriptor/README.md +72 -72
  18. package/ext/descriptor/index.d.ts +191 -191
  19. package/ext/descriptor/index.js +1052 -1052
  20. package/ext/descriptor/test.js +54 -54
  21. package/google/LICENSE +27 -27
  22. package/google/README.md +1 -1
  23. package/google/api/annotations.json +82 -82
  24. package/google/api/annotations.proto +10 -10
  25. package/google/api/http.json +85 -85
  26. package/google/api/http.proto +30 -30
  27. package/google/protobuf/api.json +117 -117
  28. package/google/protobuf/api.proto +33 -33
  29. package/google/protobuf/descriptor.json +738 -738
  30. package/google/protobuf/descriptor.proto +286 -286
  31. package/google/protobuf/source_context.json +19 -19
  32. package/google/protobuf/source_context.proto +7 -7
  33. package/google/protobuf/type.json +201 -201
  34. package/google/protobuf/type.proto +89 -89
  35. package/index.d.ts +2741 -2741
  36. package/index.js +4 -4
  37. package/light.d.ts +2 -2
  38. package/light.js +3 -3
  39. package/minimal.d.ts +2 -2
  40. package/minimal.js +4 -4
  41. package/package.json +111 -111
  42. package/scripts/postinstall.js +32 -32
  43. package/src/common.js +399 -399
  44. package/src/converter.js +301 -301
  45. package/src/decoder.js +129 -129
  46. package/src/encoder.js +100 -100
  47. package/src/enum.js +198 -198
  48. package/src/field.js +377 -377
  49. package/src/index-light.js +104 -104
  50. package/src/index-minimal.js +36 -36
  51. package/src/index.js +12 -12
  52. package/src/mapfield.js +126 -126
  53. package/src/message.js +138 -138
  54. package/src/method.js +160 -160
  55. package/src/namespace.js +433 -433
  56. package/src/object.js +243 -243
  57. package/src/oneof.js +203 -203
  58. package/src/parse.js +889 -889
  59. package/src/reader.js +416 -416
  60. package/src/reader_buffer.js +51 -51
  61. package/src/root.js +368 -368
  62. package/src/roots.js +18 -18
  63. package/src/rpc/service.js +142 -142
  64. package/src/rpc.js +36 -36
  65. package/src/service.js +167 -167
  66. package/src/tokenize.js +416 -416
  67. package/src/type.js +589 -589
  68. package/src/types.js +196 -196
  69. package/src/typescript.jsdoc +15 -15
  70. package/src/util/longbits.js +200 -200
  71. package/src/util/minimal.js +438 -438
  72. package/src/util.js +212 -212
  73. package/src/verifier.js +176 -176
  74. package/src/wrappers.js +102 -102
  75. package/src/writer.js +465 -465
  76. package/src/writer_buffer.js +85 -85
  77. package/tsconfig.json +7 -7
package/src/root.js CHANGED
@@ -1,368 +1,368 @@
1
- "use strict";
2
- module.exports = Root;
3
-
4
- // extends Namespace
5
- var Namespace = require("./namespace");
6
- ((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = "Root";
7
-
8
- var Field = require("./field"),
9
- Enum = require("./enum"),
10
- OneOf = require("./oneof"),
11
- util = require("./util");
12
-
13
- var Type, // cyclic
14
- parse, // might be excluded
15
- common; // "
16
-
17
- /**
18
- * Constructs a new root namespace instance.
19
- * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.
20
- * @extends NamespaceBase
21
- * @constructor
22
- * @param {Object.<string,*>} [options] Top level options
23
- */
24
- function Root(options) {
25
- Namespace.call(this, "", options);
26
-
27
- /**
28
- * Deferred extension fields.
29
- * @type {Field[]}
30
- */
31
- this.deferred = [];
32
-
33
- /**
34
- * Resolved file names of loaded files.
35
- * @type {string[]}
36
- */
37
- this.files = [];
38
- }
39
-
40
- /**
41
- * Loads a namespace descriptor into a root namespace.
42
- * @param {INamespace} json Nameespace descriptor
43
- * @param {Root} [root] Root namespace, defaults to create a new one if omitted
44
- * @returns {Root} Root namespace
45
- */
46
- Root.fromJSON = function fromJSON(json, root) {
47
- if (!root)
48
- root = new Root();
49
- if (json.options)
50
- root.setOptions(json.options);
51
- return root.addJSON(json.nested);
52
- };
53
-
54
- /**
55
- * Resolves the path of an imported file, relative to the importing origin.
56
- * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.
57
- * @function
58
- * @param {string} origin The file name of the importing file
59
- * @param {string} target The file name being imported
60
- * @returns {string|null} Resolved path to `target` or `null` to skip the file
61
- */
62
- Root.prototype.resolvePath = util.path.resolve;
63
-
64
- /**
65
- * Fetch content from file path or url
66
- * This method exists so you can override it with your own logic.
67
- * @function
68
- * @param {string} path File path or url
69
- * @param {FetchCallback} callback Callback function
70
- * @returns {undefined}
71
- */
72
- Root.prototype.fetch = util.fetch;
73
-
74
- // A symbol-like function to safely signal synchronous loading
75
- /* istanbul ignore next */
76
- function SYNC() {} // eslint-disable-line no-empty-function
77
-
78
- /**
79
- * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
80
- * @param {string|string[]} filename Names of one or multiple files to load
81
- * @param {IParseOptions} options Parse options
82
- * @param {LoadCallback} callback Callback function
83
- * @returns {undefined}
84
- */
85
- Root.prototype.load = function load(filename, options, callback) {
86
- if (typeof options === "function") {
87
- callback = options;
88
- options = undefined;
89
- }
90
- var self = this;
91
- if (!callback)
92
- return util.asPromise(load, self, filename, options);
93
-
94
- var sync = callback === SYNC; // undocumented
95
-
96
- // Finishes loading by calling the callback (exactly once)
97
- function finish(err, root) {
98
- /* istanbul ignore if */
99
- if (!callback)
100
- return;
101
- if (sync)
102
- throw err;
103
- var cb = callback;
104
- callback = null;
105
- cb(err, root);
106
- }
107
-
108
- // Bundled definition existence checking
109
- function getBundledFileName(filename) {
110
- var idx = filename.lastIndexOf("google/protobuf/");
111
- if (idx > -1) {
112
- var altname = filename.substring(idx);
113
- if (altname in common) return altname;
114
- }
115
- return null;
116
- }
117
-
118
- // Processes a single file
119
- function process(filename, source) {
120
- try {
121
- if (util.isString(source) && source.charAt(0) === "{")
122
- source = JSON.parse(source);
123
- if (!util.isString(source))
124
- self.setOptions(source.options).addJSON(source.nested);
125
- else {
126
- parse.filename = filename;
127
- var parsed = parse(source, self, options),
128
- resolved,
129
- i = 0;
130
- if (parsed.imports)
131
- for (; i < parsed.imports.length; ++i)
132
- if (resolved = getBundledFileName(parsed.imports[i]) || self.resolvePath(filename, parsed.imports[i]))
133
- fetch(resolved);
134
- if (parsed.weakImports)
135
- for (i = 0; i < parsed.weakImports.length; ++i)
136
- if (resolved = getBundledFileName(parsed.weakImports[i]) || self.resolvePath(filename, parsed.weakImports[i]))
137
- fetch(resolved, true);
138
- }
139
- } catch (err) {
140
- finish(err);
141
- }
142
- if (!sync && !queued)
143
- finish(null, self); // only once anyway
144
- }
145
-
146
- // Fetches a single file
147
- function fetch(filename, weak) {
148
- filename = getBundledFileName(filename) || filename;
149
-
150
- // Skip if already loaded / attempted
151
- if (self.files.indexOf(filename) > -1)
152
- return;
153
- self.files.push(filename);
154
-
155
- // Shortcut bundled definitions
156
- if (filename in common) {
157
- if (sync)
158
- process(filename, common[filename]);
159
- else {
160
- ++queued;
161
- setTimeout(function() {
162
- --queued;
163
- process(filename, common[filename]);
164
- });
165
- }
166
- return;
167
- }
168
-
169
- // Otherwise fetch from disk or network
170
- if (sync) {
171
- var source;
172
- try {
173
- source = util.fs.readFileSync(filename).toString("utf8");
174
- } catch (err) {
175
- if (!weak)
176
- finish(err);
177
- return;
178
- }
179
- process(filename, source);
180
- } else {
181
- ++queued;
182
- self.fetch(filename, function(err, source) {
183
- --queued;
184
- /* istanbul ignore if */
185
- if (!callback)
186
- return; // terminated meanwhile
187
- if (err) {
188
- /* istanbul ignore else */
189
- if (!weak)
190
- finish(err);
191
- else if (!queued) // can't be covered reliably
192
- finish(null, self);
193
- return;
194
- }
195
- process(filename, source);
196
- });
197
- }
198
- }
199
- var queued = 0;
200
-
201
- // Assembling the root namespace doesn't require working type
202
- // references anymore, so we can load everything in parallel
203
- if (util.isString(filename))
204
- filename = [ filename ];
205
- for (var i = 0, resolved; i < filename.length; ++i)
206
- if (resolved = self.resolvePath("", filename[i]))
207
- fetch(resolved);
208
-
209
- if (sync)
210
- return self;
211
- if (!queued)
212
- finish(null, self);
213
- return undefined;
214
- };
215
- // function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined
216
-
217
- /**
218
- * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
219
- * @function Root#load
220
- * @param {string|string[]} filename Names of one or multiple files to load
221
- * @param {LoadCallback} callback Callback function
222
- * @returns {undefined}
223
- * @variation 2
224
- */
225
- // function load(filename:string, callback:LoadCallback):undefined
226
-
227
- /**
228
- * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.
229
- * @function Root#load
230
- * @param {string|string[]} filename Names of one or multiple files to load
231
- * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.
232
- * @returns {Promise<Root>} Promise
233
- * @variation 3
234
- */
235
- // function load(filename:string, [options:IParseOptions]):Promise<Root>
236
-
237
- /**
238
- * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).
239
- * @function Root#loadSync
240
- * @param {string|string[]} filename Names of one or multiple files to load
241
- * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.
242
- * @returns {Root} Root namespace
243
- * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid
244
- */
245
- Root.prototype.loadSync = function loadSync(filename, options) {
246
- if (!util.isNode)
247
- throw Error("not supported");
248
- return this.load(filename, options, SYNC);
249
- };
250
-
251
- /**
252
- * @override
253
- */
254
- Root.prototype.resolveAll = function resolveAll() {
255
- if (this.deferred.length)
256
- throw Error("unresolvable extensions: " + this.deferred.map(function(field) {
257
- return "'extend " + field.extend + "' in " + field.parent.fullName;
258
- }).join(", "));
259
- return Namespace.prototype.resolveAll.call(this);
260
- };
261
-
262
- // only uppercased (and thus conflict-free) children are exposed, see below
263
- var exposeRe = /^[A-Z]/;
264
-
265
- /**
266
- * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.
267
- * @param {Root} root Root instance
268
- * @param {Field} field Declaring extension field witin the declaring type
269
- * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise
270
- * @inner
271
- * @ignore
272
- */
273
- function tryHandleExtension(root, field) {
274
- var extendedType = field.parent.lookup(field.extend);
275
- if (extendedType) {
276
- var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);
277
- //do not allow to extend same field twice to prevent the error
278
- if (extendedType.get(sisterField.name)) {
279
- return true;
280
- }
281
- sisterField.declaringField = field;
282
- field.extensionField = sisterField;
283
- extendedType.add(sisterField);
284
- return true;
285
- }
286
- return false;
287
- }
288
-
289
- /**
290
- * Called when any object is added to this root or its sub-namespaces.
291
- * @param {ReflectionObject} object Object added
292
- * @returns {undefined}
293
- * @private
294
- */
295
- Root.prototype._handleAdd = function _handleAdd(object) {
296
- if (object instanceof Field) {
297
-
298
- if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)
299
- if (!tryHandleExtension(this, object))
300
- this.deferred.push(object);
301
-
302
- } else if (object instanceof Enum) {
303
-
304
- if (exposeRe.test(object.name))
305
- object.parent[object.name] = object.values; // expose enum values as property of its parent
306
-
307
- } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {
308
-
309
- if (object instanceof Type) // Try to handle any deferred extensions
310
- for (var i = 0; i < this.deferred.length;)
311
- if (tryHandleExtension(this, this.deferred[i]))
312
- this.deferred.splice(i, 1);
313
- else
314
- ++i;
315
- for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace
316
- this._handleAdd(object._nestedArray[j]);
317
- if (exposeRe.test(object.name))
318
- object.parent[object.name] = object; // expose namespace as property of its parent
319
- }
320
-
321
- // The above also adds uppercased (and thus conflict-free) nested types, services and enums as
322
- // properties of namespaces just like static code does. This allows using a .d.ts generated for
323
- // a static module with reflection-based solutions where the condition is met.
324
- };
325
-
326
- /**
327
- * Called when any object is removed from this root or its sub-namespaces.
328
- * @param {ReflectionObject} object Object removed
329
- * @returns {undefined}
330
- * @private
331
- */
332
- Root.prototype._handleRemove = function _handleRemove(object) {
333
- if (object instanceof Field) {
334
-
335
- if (/* an extension field */ object.extend !== undefined) {
336
- if (/* already handled */ object.extensionField) { // remove its sister field
337
- object.extensionField.parent.remove(object.extensionField);
338
- object.extensionField = null;
339
- } else { // cancel the extension
340
- var index = this.deferred.indexOf(object);
341
- /* istanbul ignore else */
342
- if (index > -1)
343
- this.deferred.splice(index, 1);
344
- }
345
- }
346
-
347
- } else if (object instanceof Enum) {
348
-
349
- if (exposeRe.test(object.name))
350
- delete object.parent[object.name]; // unexpose enum values
351
-
352
- } else if (object instanceof Namespace) {
353
-
354
- for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace
355
- this._handleRemove(object._nestedArray[i]);
356
-
357
- if (exposeRe.test(object.name))
358
- delete object.parent[object.name]; // unexpose namespaces
359
-
360
- }
361
- };
362
-
363
- // Sets up cyclic dependencies (called in index-light)
364
- Root._configure = function(Type_, parse_, common_) {
365
- Type = Type_;
366
- parse = parse_;
367
- common = common_;
368
- };
1
+ "use strict";
2
+ module.exports = Root;
3
+
4
+ // extends Namespace
5
+ var Namespace = require("./namespace");
6
+ ((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = "Root";
7
+
8
+ var Field = require("./field"),
9
+ Enum = require("./enum"),
10
+ OneOf = require("./oneof"),
11
+ util = require("./util");
12
+
13
+ var Type, // cyclic
14
+ parse, // might be excluded
15
+ common; // "
16
+
17
+ /**
18
+ * Constructs a new root namespace instance.
19
+ * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.
20
+ * @extends NamespaceBase
21
+ * @constructor
22
+ * @param {Object.<string,*>} [options] Top level options
23
+ */
24
+ function Root(options) {
25
+ Namespace.call(this, "", options);
26
+
27
+ /**
28
+ * Deferred extension fields.
29
+ * @type {Field[]}
30
+ */
31
+ this.deferred = [];
32
+
33
+ /**
34
+ * Resolved file names of loaded files.
35
+ * @type {string[]}
36
+ */
37
+ this.files = [];
38
+ }
39
+
40
+ /**
41
+ * Loads a namespace descriptor into a root namespace.
42
+ * @param {INamespace} json Nameespace descriptor
43
+ * @param {Root} [root] Root namespace, defaults to create a new one if omitted
44
+ * @returns {Root} Root namespace
45
+ */
46
+ Root.fromJSON = function fromJSON(json, root) {
47
+ if (!root)
48
+ root = new Root();
49
+ if (json.options)
50
+ root.setOptions(json.options);
51
+ return root.addJSON(json.nested);
52
+ };
53
+
54
+ /**
55
+ * Resolves the path of an imported file, relative to the importing origin.
56
+ * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.
57
+ * @function
58
+ * @param {string} origin The file name of the importing file
59
+ * @param {string} target The file name being imported
60
+ * @returns {string|null} Resolved path to `target` or `null` to skip the file
61
+ */
62
+ Root.prototype.resolvePath = util.path.resolve;
63
+
64
+ /**
65
+ * Fetch content from file path or url
66
+ * This method exists so you can override it with your own logic.
67
+ * @function
68
+ * @param {string} path File path or url
69
+ * @param {FetchCallback} callback Callback function
70
+ * @returns {undefined}
71
+ */
72
+ Root.prototype.fetch = util.fetch;
73
+
74
+ // A symbol-like function to safely signal synchronous loading
75
+ /* istanbul ignore next */
76
+ function SYNC() {} // eslint-disable-line no-empty-function
77
+
78
+ /**
79
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
80
+ * @param {string|string[]} filename Names of one or multiple files to load
81
+ * @param {IParseOptions} options Parse options
82
+ * @param {LoadCallback} callback Callback function
83
+ * @returns {undefined}
84
+ */
85
+ Root.prototype.load = function load(filename, options, callback) {
86
+ if (typeof options === "function") {
87
+ callback = options;
88
+ options = undefined;
89
+ }
90
+ var self = this;
91
+ if (!callback)
92
+ return util.asPromise(load, self, filename, options);
93
+
94
+ var sync = callback === SYNC; // undocumented
95
+
96
+ // Finishes loading by calling the callback (exactly once)
97
+ function finish(err, root) {
98
+ /* istanbul ignore if */
99
+ if (!callback)
100
+ return;
101
+ if (sync)
102
+ throw err;
103
+ var cb = callback;
104
+ callback = null;
105
+ cb(err, root);
106
+ }
107
+
108
+ // Bundled definition existence checking
109
+ function getBundledFileName(filename) {
110
+ var idx = filename.lastIndexOf("google/protobuf/");
111
+ if (idx > -1) {
112
+ var altname = filename.substring(idx);
113
+ if (altname in common) return altname;
114
+ }
115
+ return null;
116
+ }
117
+
118
+ // Processes a single file
119
+ function process(filename, source) {
120
+ try {
121
+ if (util.isString(source) && source.charAt(0) === "{")
122
+ source = JSON.parse(source);
123
+ if (!util.isString(source))
124
+ self.setOptions(source.options).addJSON(source.nested);
125
+ else {
126
+ parse.filename = filename;
127
+ var parsed = parse(source, self, options),
128
+ resolved,
129
+ i = 0;
130
+ if (parsed.imports)
131
+ for (; i < parsed.imports.length; ++i)
132
+ if (resolved = getBundledFileName(parsed.imports[i]) || self.resolvePath(filename, parsed.imports[i]))
133
+ fetch(resolved);
134
+ if (parsed.weakImports)
135
+ for (i = 0; i < parsed.weakImports.length; ++i)
136
+ if (resolved = getBundledFileName(parsed.weakImports[i]) || self.resolvePath(filename, parsed.weakImports[i]))
137
+ fetch(resolved, true);
138
+ }
139
+ } catch (err) {
140
+ finish(err);
141
+ }
142
+ if (!sync && !queued)
143
+ finish(null, self); // only once anyway
144
+ }
145
+
146
+ // Fetches a single file
147
+ function fetch(filename, weak) {
148
+ filename = getBundledFileName(filename) || filename;
149
+
150
+ // Skip if already loaded / attempted
151
+ if (self.files.indexOf(filename) > -1)
152
+ return;
153
+ self.files.push(filename);
154
+
155
+ // Shortcut bundled definitions
156
+ if (filename in common) {
157
+ if (sync)
158
+ process(filename, common[filename]);
159
+ else {
160
+ ++queued;
161
+ setTimeout(function() {
162
+ --queued;
163
+ process(filename, common[filename]);
164
+ });
165
+ }
166
+ return;
167
+ }
168
+
169
+ // Otherwise fetch from disk or network
170
+ if (sync) {
171
+ var source;
172
+ try {
173
+ source = util.fs.readFileSync(filename).toString("utf8");
174
+ } catch (err) {
175
+ if (!weak)
176
+ finish(err);
177
+ return;
178
+ }
179
+ process(filename, source);
180
+ } else {
181
+ ++queued;
182
+ self.fetch(filename, function(err, source) {
183
+ --queued;
184
+ /* istanbul ignore if */
185
+ if (!callback)
186
+ return; // terminated meanwhile
187
+ if (err) {
188
+ /* istanbul ignore else */
189
+ if (!weak)
190
+ finish(err);
191
+ else if (!queued) // can't be covered reliably
192
+ finish(null, self);
193
+ return;
194
+ }
195
+ process(filename, source);
196
+ });
197
+ }
198
+ }
199
+ var queued = 0;
200
+
201
+ // Assembling the root namespace doesn't require working type
202
+ // references anymore, so we can load everything in parallel
203
+ if (util.isString(filename))
204
+ filename = [ filename ];
205
+ for (var i = 0, resolved; i < filename.length; ++i)
206
+ if (resolved = self.resolvePath("", filename[i]))
207
+ fetch(resolved);
208
+
209
+ if (sync)
210
+ return self;
211
+ if (!queued)
212
+ finish(null, self);
213
+ return undefined;
214
+ };
215
+ // function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined
216
+
217
+ /**
218
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
219
+ * @function Root#load
220
+ * @param {string|string[]} filename Names of one or multiple files to load
221
+ * @param {LoadCallback} callback Callback function
222
+ * @returns {undefined}
223
+ * @variation 2
224
+ */
225
+ // function load(filename:string, callback:LoadCallback):undefined
226
+
227
+ /**
228
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.
229
+ * @function Root#load
230
+ * @param {string|string[]} filename Names of one or multiple files to load
231
+ * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.
232
+ * @returns {Promise<Root>} Promise
233
+ * @variation 3
234
+ */
235
+ // function load(filename:string, [options:IParseOptions]):Promise<Root>
236
+
237
+ /**
238
+ * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).
239
+ * @function Root#loadSync
240
+ * @param {string|string[]} filename Names of one or multiple files to load
241
+ * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.
242
+ * @returns {Root} Root namespace
243
+ * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid
244
+ */
245
+ Root.prototype.loadSync = function loadSync(filename, options) {
246
+ if (!util.isNode)
247
+ throw Error("not supported");
248
+ return this.load(filename, options, SYNC);
249
+ };
250
+
251
+ /**
252
+ * @override
253
+ */
254
+ Root.prototype.resolveAll = function resolveAll() {
255
+ if (this.deferred.length)
256
+ throw Error("unresolvable extensions: " + this.deferred.map(function(field) {
257
+ return "'extend " + field.extend + "' in " + field.parent.fullName;
258
+ }).join(", "));
259
+ return Namespace.prototype.resolveAll.call(this);
260
+ };
261
+
262
+ // only uppercased (and thus conflict-free) children are exposed, see below
263
+ var exposeRe = /^[A-Z]/;
264
+
265
+ /**
266
+ * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.
267
+ * @param {Root} root Root instance
268
+ * @param {Field} field Declaring extension field witin the declaring type
269
+ * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise
270
+ * @inner
271
+ * @ignore
272
+ */
273
+ function tryHandleExtension(root, field) {
274
+ var extendedType = field.parent.lookup(field.extend);
275
+ if (extendedType) {
276
+ var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);
277
+ //do not allow to extend same field twice to prevent the error
278
+ if (extendedType.get(sisterField.name)) {
279
+ return true;
280
+ }
281
+ sisterField.declaringField = field;
282
+ field.extensionField = sisterField;
283
+ extendedType.add(sisterField);
284
+ return true;
285
+ }
286
+ return false;
287
+ }
288
+
289
+ /**
290
+ * Called when any object is added to this root or its sub-namespaces.
291
+ * @param {ReflectionObject} object Object added
292
+ * @returns {undefined}
293
+ * @private
294
+ */
295
+ Root.prototype._handleAdd = function _handleAdd(object) {
296
+ if (object instanceof Field) {
297
+
298
+ if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)
299
+ if (!tryHandleExtension(this, object))
300
+ this.deferred.push(object);
301
+
302
+ } else if (object instanceof Enum) {
303
+
304
+ if (exposeRe.test(object.name))
305
+ object.parent[object.name] = object.values; // expose enum values as property of its parent
306
+
307
+ } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {
308
+
309
+ if (object instanceof Type) // Try to handle any deferred extensions
310
+ for (var i = 0; i < this.deferred.length;)
311
+ if (tryHandleExtension(this, this.deferred[i]))
312
+ this.deferred.splice(i, 1);
313
+ else
314
+ ++i;
315
+ for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace
316
+ this._handleAdd(object._nestedArray[j]);
317
+ if (exposeRe.test(object.name))
318
+ object.parent[object.name] = object; // expose namespace as property of its parent
319
+ }
320
+
321
+ // The above also adds uppercased (and thus conflict-free) nested types, services and enums as
322
+ // properties of namespaces just like static code does. This allows using a .d.ts generated for
323
+ // a static module with reflection-based solutions where the condition is met.
324
+ };
325
+
326
+ /**
327
+ * Called when any object is removed from this root or its sub-namespaces.
328
+ * @param {ReflectionObject} object Object removed
329
+ * @returns {undefined}
330
+ * @private
331
+ */
332
+ Root.prototype._handleRemove = function _handleRemove(object) {
333
+ if (object instanceof Field) {
334
+
335
+ if (/* an extension field */ object.extend !== undefined) {
336
+ if (/* already handled */ object.extensionField) { // remove its sister field
337
+ object.extensionField.parent.remove(object.extensionField);
338
+ object.extensionField = null;
339
+ } else { // cancel the extension
340
+ var index = this.deferred.indexOf(object);
341
+ /* istanbul ignore else */
342
+ if (index > -1)
343
+ this.deferred.splice(index, 1);
344
+ }
345
+ }
346
+
347
+ } else if (object instanceof Enum) {
348
+
349
+ if (exposeRe.test(object.name))
350
+ delete object.parent[object.name]; // unexpose enum values
351
+
352
+ } else if (object instanceof Namespace) {
353
+
354
+ for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace
355
+ this._handleRemove(object._nestedArray[i]);
356
+
357
+ if (exposeRe.test(object.name))
358
+ delete object.parent[object.name]; // unexpose namespaces
359
+
360
+ }
361
+ };
362
+
363
+ // Sets up cyclic dependencies (called in index-light)
364
+ Root._configure = function(Type_, parse_, common_) {
365
+ Type = Type_;
366
+ parse = parse_;
367
+ common = common_;
368
+ };