protobufjs 7.3.2 → 7.3.3

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 -727
  3. package/ext/debug/README.md +4 -4
  4. package/ext/debug/index.js +71 -71
  5. package/ext/descriptor/README.md +72 -72
  6. package/ext/descriptor/index.d.ts +191 -191
  7. package/ext/descriptor/index.js +1052 -1052
  8. package/ext/descriptor/test.js +54 -54
  9. package/google/LICENSE +27 -27
  10. package/google/README.md +1 -1
  11. package/google/api/annotations.json +82 -82
  12. package/google/api/annotations.proto +10 -10
  13. package/google/api/http.json +85 -85
  14. package/google/api/http.proto +30 -30
  15. package/google/protobuf/api.json +117 -117
  16. package/google/protobuf/api.proto +33 -33
  17. package/google/protobuf/descriptor.json +738 -738
  18. package/google/protobuf/descriptor.proto +286 -286
  19. package/google/protobuf/source_context.json +19 -19
  20. package/google/protobuf/source_context.proto +7 -7
  21. package/google/protobuf/type.json +201 -201
  22. package/google/protobuf/type.proto +89 -89
  23. package/index.d.ts +2741 -2741
  24. package/index.js +4 -4
  25. package/light.d.ts +2 -2
  26. package/light.js +3 -3
  27. package/minimal.d.ts +2 -2
  28. package/minimal.js +4 -4
  29. package/package.json +111 -111
  30. package/scripts/postinstall.js +32 -32
  31. package/src/common.js +399 -399
  32. package/src/converter.js +301 -301
  33. package/src/decoder.js +129 -129
  34. package/src/encoder.js +100 -100
  35. package/src/enum.js +198 -198
  36. package/src/field.js +377 -377
  37. package/src/index-light.js +104 -104
  38. package/src/index-minimal.js +36 -36
  39. package/src/index.js +12 -12
  40. package/src/mapfield.js +126 -126
  41. package/src/message.js +138 -138
  42. package/src/method.js +160 -160
  43. package/src/namespace.js +433 -433
  44. package/src/object.js +243 -243
  45. package/src/oneof.js +203 -203
  46. package/src/parse.js +893 -889
  47. package/src/reader.js +416 -416
  48. package/src/reader_buffer.js +51 -51
  49. package/src/root.js +368 -368
  50. package/src/roots.js +18 -18
  51. package/src/rpc/service.js +142 -142
  52. package/src/rpc.js +36 -36
  53. package/src/service.js +167 -167
  54. package/src/tokenize.js +416 -416
  55. package/src/type.js +589 -589
  56. package/src/types.js +196 -196
  57. package/src/typescript.jsdoc +15 -15
  58. package/src/util/longbits.js +200 -200
  59. package/src/util/minimal.js +438 -438
  60. package/src/util.js +212 -212
  61. package/src/verifier.js +176 -176
  62. package/src/wrappers.js +102 -102
  63. package/src/writer.js +465 -465
  64. package/src/writer_buffer.js +85 -85
  65. package/tsconfig.json +7 -7
  66. package/dist/light/protobuf.js +0 -7381
  67. package/dist/light/protobuf.js.map +0 -1
  68. package/dist/light/protobuf.min.js +0 -8
  69. package/dist/light/protobuf.min.js.map +0 -1
  70. package/dist/minimal/protobuf.js +0 -2736
  71. package/dist/minimal/protobuf.js.map +0 -1
  72. package/dist/minimal/protobuf.min.js +0 -8
  73. package/dist/minimal/protobuf.min.js.map +0 -1
  74. package/dist/protobuf.js +0 -9105
  75. package/dist/protobuf.js.map +0 -1
  76. package/dist/protobuf.min.js +0 -8
  77. package/dist/protobuf.min.js.map +0 -1
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
+ };