rdflib 2.2.21 → 2.2.22-b51259b5

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 (106) hide show
  1. package/dist/rdflib.min.js +1 -1
  2. package/dist/rdflib.min.js.LICENSE.txt +9 -1
  3. package/dist/rdflib.min.js.map +1 -1
  4. package/esm/blank-node.js +61 -114
  5. package/esm/class-order.js +1 -1
  6. package/esm/collection.js +70 -128
  7. package/esm/convert.js +1 -2
  8. package/esm/default-graph.js +14 -48
  9. package/esm/empty.js +8 -39
  10. package/esm/factories/canonical-data-factory.js +33 -65
  11. package/esm/factories/extended-term-factory.js +18 -25
  12. package/esm/factories/factory-types.js +3 -2
  13. package/esm/factories/rdflib-data-factory.js +9 -19
  14. package/esm/fetcher.js +1341 -1854
  15. package/esm/formula.js +639 -846
  16. package/esm/index.js +40 -76
  17. package/esm/jsonldparser.js +24 -49
  18. package/esm/jsonparser.js +1 -8
  19. package/esm/lists.js +47 -110
  20. package/esm/literal.js +120 -189
  21. package/esm/log.js +7 -7
  22. package/esm/n3parser.js +1015 -1412
  23. package/esm/named-node.js +70 -119
  24. package/esm/namespace.js +2 -5
  25. package/esm/node-internal.js +73 -110
  26. package/esm/node.js +2 -7
  27. package/esm/parse.js +12 -19
  28. package/esm/patch-parser.js +10 -30
  29. package/esm/query-to-sparql.js +0 -18
  30. package/esm/query.js +63 -147
  31. package/esm/rdfaparser.js +794 -997
  32. package/esm/rdfxmlparser.js +347 -461
  33. package/esm/serialize.js +9 -27
  34. package/esm/serializer.js +820 -1049
  35. package/esm/sparql-to-query.js +44 -134
  36. package/esm/statement.js +54 -85
  37. package/esm/store.js +830 -1103
  38. package/esm/types.js +22 -21
  39. package/esm/update-manager.js +869 -1106
  40. package/esm/updates-via.js +104 -161
  41. package/esm/uri.js +9 -53
  42. package/esm/utils/default-graph-uri.js +3 -2
  43. package/esm/utils/termValue.js +0 -1
  44. package/esm/utils/terms.js +19 -21
  45. package/esm/utils-js.js +20 -61
  46. package/esm/utils.js +10 -21
  47. package/esm/variable.js +32 -78
  48. package/esm/xsd.js +2 -2
  49. package/lib/blank-node.js +60 -113
  50. package/lib/class-order.js +1 -2
  51. package/lib/collection.js +69 -131
  52. package/lib/convert.js +3 -9
  53. package/lib/default-graph.js +13 -52
  54. package/lib/empty.js +8 -43
  55. package/lib/factories/canonical-data-factory.js +35 -79
  56. package/lib/factories/extended-term-factory.js +18 -32
  57. package/lib/factories/factory-types.d.ts +6 -6
  58. package/lib/factories/factory-types.js +1 -4
  59. package/lib/factories/rdflib-data-factory.js +9 -23
  60. package/lib/fetcher.d.ts +6 -6
  61. package/lib/fetcher.js +1370 -1843
  62. package/lib/formula.js +640 -855
  63. package/lib/index.js +66 -152
  64. package/lib/jsonldparser.js +23 -53
  65. package/lib/jsonparser.js +1 -10
  66. package/lib/lists.js +55 -112
  67. package/lib/literal.js +120 -195
  68. package/lib/log.d.ts +0 -6
  69. package/lib/log.js +7 -8
  70. package/lib/n3parser.js +1030 -1436
  71. package/lib/named-node.js +69 -126
  72. package/lib/namespace.js +2 -7
  73. package/lib/node-internal.js +74 -107
  74. package/lib/node.js +2 -12
  75. package/lib/parse.d.ts +1 -1
  76. package/lib/parse.js +12 -32
  77. package/lib/patch-parser.js +11 -34
  78. package/lib/query-to-sparql.js +0 -23
  79. package/lib/query.js +62 -167
  80. package/lib/rdfaparser.js +796 -1009
  81. package/lib/rdfxmlparser.js +349 -466
  82. package/lib/serialize.js +11 -37
  83. package/lib/serializer.js +823 -1064
  84. package/lib/sparql-to-query.js +42 -167
  85. package/lib/statement.js +55 -91
  86. package/lib/store.d.ts +1 -1
  87. package/lib/store.js +850 -1112
  88. package/lib/tf-types.d.ts +4 -4
  89. package/lib/types.d.ts +8 -8
  90. package/lib/types.js +23 -23
  91. package/lib/update-manager.d.ts +1 -1
  92. package/lib/update-manager.js +865 -1103
  93. package/lib/updates-via.js +105 -164
  94. package/lib/uri.js +8 -61
  95. package/lib/utils/default-graph-uri.js +3 -5
  96. package/lib/utils/termValue.js +0 -2
  97. package/lib/utils/terms.js +19 -40
  98. package/lib/utils-js.js +23 -88
  99. package/lib/utils.js +10 -27
  100. package/lib/variable.js +34 -85
  101. package/lib/xsd-internal.js +0 -3
  102. package/lib/xsd.js +2 -6
  103. package/package.json +35 -35
  104. package/src/fetcher.ts +2 -2
  105. package/src/update-manager.ts +12 -7
  106. package/changes.txt +0 -59
@@ -1,31 +1,23 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.UpdatesVia = exports.UpdatesSocket = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
8
  var _rdflibDataFactory = _interopRequireDefault(require("./factories/rdflib-data-factory"));
15
-
16
9
  /*
17
10
  * Updates-Via
18
11
  */
19
- var UpdatesSocket = /*#__PURE__*/function () {
20
- function UpdatesSocket(parent, via) {
21
- (0, _classCallCheck2.default)(this, UpdatesSocket);
12
+
13
+ class UpdatesSocket {
14
+ constructor(parent, via) {
22
15
  this.parent = parent;
23
16
  this.via = via;
24
17
  this.connected = false;
25
18
  this.pending = {};
26
19
  this.subscribed = {};
27
20
  this.socket = {};
28
-
29
21
  try {
30
22
  this.socket = new WebSocket(via);
31
23
  this.socket.onopen = this.onOpen;
@@ -36,174 +28,123 @@ var UpdatesSocket = /*#__PURE__*/function () {
36
28
  this.onError(error);
37
29
  }
38
30
  }
39
-
40
- (0, _createClass2.default)(UpdatesSocket, [{
41
- key: "_decode",
42
- value: function _decode(q) {
43
- var elt;
44
- var i;
45
- var k;
46
- var r;
47
- var ref;
48
- var ref1;
49
- var v;
50
- r = {};
51
-
52
- ref = function () {
53
- var j, len, ref, results;
54
- ref = q.split('&');
55
- results = [];
56
-
57
- for (j = 0, len = ref.length; j < len; j++) {
58
- elt = ref[j];
59
- results.push(elt.split('='));
60
- }
61
-
62
- return results;
63
- }();
64
-
65
- for (i in ref) {
66
- elt = ref[i];
67
- ref1 = [decodeURIComponent(elt[0]), decodeURIComponent(elt[1])];
68
- k = ref1[0];
69
- v = ref1[1];
70
-
71
- if (r[k] == null) {
72
- r[k] = [];
73
- }
74
-
75
- r[k].push(v);
31
+ _decode(q) {
32
+ var elt;
33
+ var i;
34
+ var k;
35
+ var r;
36
+ var ref;
37
+ var ref1;
38
+ var v;
39
+ r = {};
40
+ ref = function () {
41
+ var j, len, ref, results;
42
+ ref = q.split('&');
43
+ results = [];
44
+ for (j = 0, len = ref.length; j < len; j++) {
45
+ elt = ref[j];
46
+ results.push(elt.split('='));
76
47
  }
77
-
78
- return r;
79
- }
80
- }, {
81
- key: "_send",
82
- value: function _send(method, uri, data) {
83
- var base, message;
84
- message = [method, uri, data].join(' ');
85
- return typeof (base = this.socket).send === 'function' ? base.send(message) : void 0;
86
- }
87
- }, {
88
- key: "_subscribe",
89
- value: function _subscribe(uri) {
90
- this._send('sub', uri, '');
91
-
92
- this.subscribed[uri] = true;
93
- return this.subscribed[uri];
94
- }
95
- }, {
96
- key: "onClose",
97
- value: function onClose(e) {
98
- var uri;
99
- this.connected = false;
100
-
101
- for (uri in this.subscribed) {
102
- this.pending[uri] = true;
48
+ return results;
49
+ }();
50
+ for (i in ref) {
51
+ elt = ref[i];
52
+ ref1 = [decodeURIComponent(elt[0]), decodeURIComponent(elt[1])];
53
+ k = ref1[0];
54
+ v = ref1[1];
55
+ if (r[k] == null) {
56
+ r[k] = [];
103
57
  }
104
-
105
- this.subscribed = {};
106
- return this.subscribed;
58
+ r[k].push(v);
107
59
  }
108
- }, {
109
- key: "onError",
110
- value: function onError(e) {
111
- throw new Error('onError' + e);
60
+ return r;
61
+ }
62
+ _send(method, uri, data) {
63
+ var base, message;
64
+ message = [method, uri, data].join(' ');
65
+ return typeof (base = this.socket).send === 'function' ? base.send(message) : void 0;
66
+ }
67
+ _subscribe(uri) {
68
+ this._send('sub', uri, '');
69
+ this.subscribed[uri] = true;
70
+ return this.subscribed[uri];
71
+ }
72
+ onClose(e) {
73
+ var uri;
74
+ this.connected = false;
75
+ for (uri in this.subscribed) {
76
+ this.pending[uri] = true;
112
77
  }
113
- }, {
114
- key: "onMessage",
115
- value: function onMessage(e) {
116
- var base, message;
117
- message = e.data.split(' ');
118
-
119
- if (message[0] === 'ping') {
120
- return typeof (base = this.socket).send === 'function' ? base.send('pong ' + message.slice(1).join(' ')) : void 0;
121
- } else if (message[0] === 'pub') {
122
- return this.parent.onUpdate(message[1], this._decode(message[2]));
123
- }
78
+ this.subscribed = {};
79
+ return this.subscribed;
80
+ }
81
+ onError(e) {
82
+ throw new Error('onError' + e);
83
+ }
84
+ onMessage(e) {
85
+ var base, message;
86
+ message = e.data.split(' ');
87
+ if (message[0] === 'ping') {
88
+ return typeof (base = this.socket).send === 'function' ? base.send('pong ' + message.slice(1).join(' ')) : void 0;
89
+ } else if (message[0] === 'pub') {
90
+ return this.parent.onUpdate(message[1], this._decode(message[2]));
124
91
  }
125
- }, {
126
- key: "onOpen",
127
- value: function onOpen(e) {
128
- var results, uri;
129
- this.connected = true;
130
- results = [];
131
-
132
- for (uri in this.pending) {
133
- delete this.pending[uri];
134
- results.push(this._subscribe(uri));
135
- }
136
-
137
- return results;
92
+ }
93
+ onOpen(e) {
94
+ var results, uri;
95
+ this.connected = true;
96
+ results = [];
97
+ for (uri in this.pending) {
98
+ delete this.pending[uri];
99
+ results.push(this._subscribe(uri));
138
100
  }
139
- }, {
140
- key: "subscribe",
141
- value: function subscribe(uri) {
142
- if (this.connected) {
143
- return this._subscribe(uri);
144
- } else {
145
- this.pending[uri] = true;
146
- return this.pending[uri];
147
- }
101
+ return results;
102
+ }
103
+ subscribe(uri) {
104
+ if (this.connected) {
105
+ return this._subscribe(uri);
106
+ } else {
107
+ this.pending[uri] = true;
108
+ return this.pending[uri];
148
109
  }
149
- }]);
150
- return UpdatesSocket;
151
- }();
152
-
110
+ }
111
+ }
153
112
  exports.UpdatesSocket = UpdatesSocket;
154
-
155
- var UpdatesVia = /*#__PURE__*/function () {
156
- function UpdatesVia(fetcher) {
157
- (0, _classCallCheck2.default)(this, UpdatesVia);
113
+ class UpdatesVia {
114
+ constructor(fetcher) {
158
115
  this.fetcher = fetcher;
159
116
  this.graph = {};
160
117
  this.via = {};
161
118
  this.fetcher.addCallback('headers', this.onHeaders);
162
119
  }
163
-
164
- (0, _createClass2.default)(UpdatesVia, [{
165
- key: "onHeaders",
166
- value: function onHeaders(d) {
167
- var etag, uri, via;
168
-
169
- if (d.headers == null) {
170
- return true;
171
- }
172
-
173
- if (typeof WebSocket === 'undefined' || WebSocket === null) {
174
- return true;
175
- }
176
-
177
- etag = d.headers['etag'];
178
- via = d.headers['updates-via'];
179
- uri = d.uri;
180
-
181
- if (etag && via) {
182
- this.graph[uri] = {
183
- etag: etag,
184
- via: via
185
- };
186
- this.register(via, uri);
187
- }
188
-
120
+ onHeaders(d) {
121
+ var etag, uri, via;
122
+ if (d.headers == null) {
189
123
  return true;
190
124
  }
191
- }, {
192
- key: "onUpdate",
193
- value: function onUpdate(uri, d) {
194
- return this.fetcher.refresh(_rdflibDataFactory.default.namedNode(uri));
125
+ if (typeof WebSocket === 'undefined' || WebSocket === null) {
126
+ return true;
195
127
  }
196
- }, {
197
- key: "register",
198
- value: function register(via, uri) {
199
- if (this.via[via] == null) {
200
- this.via[via] = new UpdatesSocket(this, via);
201
- }
202
-
203
- return this.via[via].subscribe(uri);
128
+ etag = d.headers['etag'];
129
+ via = d.headers['updates-via'];
130
+ uri = d.uri;
131
+ if (etag && via) {
132
+ this.graph[uri] = {
133
+ etag: etag,
134
+ via: via
135
+ };
136
+ this.register(via, uri);
204
137
  }
205
- }]);
206
- return UpdatesVia;
207
- }();
208
-
138
+ return true;
139
+ }
140
+ onUpdate(uri, d) {
141
+ return this.fetcher.refresh(_rdflibDataFactory.default.namedNode(uri));
142
+ }
143
+ register(via, uri) {
144
+ if (this.via[via] == null) {
145
+ this.via[via] = new UpdatesSocket(this, via);
146
+ }
147
+ return this.via[via].subscribe(uri);
148
+ }
149
+ }
209
150
  exports.UpdatesVia = UpdatesVia;
package/lib/uri.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -11,9 +10,7 @@ exports.hostpart = hostpart;
11
10
  exports.join = join;
12
11
  exports.protocol = protocol;
13
12
  exports.refTo = refTo;
14
-
15
13
  var _namedNode = _interopRequireDefault(require("./named-node"));
16
-
17
14
  /*
18
15
  * Implements URI-specific functions
19
16
  *
@@ -25,7 +22,6 @@ var _namedNode = _interopRequireDefault(require("./named-node"));
25
22
  *
26
23
  */
27
24
  var alert = alert || console.log;
28
-
29
25
  /**
30
26
  * Gets the document part of an URI
31
27
  * @param uri The URI
@@ -33,87 +29,70 @@ var alert = alert || console.log;
33
29
  function docpart(uri) {
34
30
  var i;
35
31
  i = uri.indexOf('#');
36
-
37
32
  if (i < 0) {
38
33
  return uri;
39
34
  } else {
40
35
  return uri.slice(0, i);
41
36
  }
42
37
  }
38
+
43
39
  /**
44
40
  * Gets the document part of an URI as a named node
45
41
  * @param x - The URI
46
42
  */
47
-
48
-
49
43
  function document(x) {
50
44
  return new _namedNode.default(docpart(x));
51
45
  }
46
+
52
47
  /**
53
48
  * Gets the hostname in an URI
54
49
  * @param u The URI
55
50
  */
56
-
57
-
58
51
  function hostpart(u) {
59
52
  var m = /[^\/]*\/\/([^\/]*)\//.exec(u);
60
-
61
53
  if (m) {
62
54
  return m[1];
63
55
  } else {
64
56
  return '';
65
57
  }
66
58
  }
59
+
67
60
  /**
68
61
  * Joins an URI with a base
69
62
  * @param given - The relative part
70
63
  * @param base - The base URI
71
64
  */
72
-
73
-
74
65
  function join(given, base) {
75
66
  var baseColon, baseScheme, baseSingle;
76
67
  var colon, lastSlash, path;
77
68
  var baseHash = base.indexOf('#');
78
-
79
69
  if (baseHash > 0) {
80
70
  base = base.slice(0, baseHash);
81
71
  }
82
-
83
72
  if (given.length === 0) {
84
73
  return base;
85
74
  }
86
-
87
75
  if (given.indexOf('#') === 0) {
88
76
  return base + given;
89
77
  }
90
-
91
78
  colon = given.indexOf(':');
92
-
93
79
  if (colon >= 0) {
94
80
  return given;
95
81
  }
96
-
97
82
  baseColon = base.indexOf(':');
98
-
99
83
  if (base.length === 0) {
100
84
  return given;
101
85
  }
102
-
103
86
  if (baseColon < 0) {
104
87
  alert('Invalid base: ' + base + ' in join with given: ' + given);
105
88
  return given;
106
89
  }
107
-
108
90
  baseScheme = base.slice(0, +baseColon + 1 || 9e9);
109
-
110
91
  if (given.indexOf('//') === 0) {
111
92
  return baseScheme + given;
112
93
  }
113
-
114
94
  if (base.indexOf('//', baseColon) === baseColon + 1) {
115
95
  baseSingle = base.indexOf('/', baseColon + 3);
116
-
117
96
  if (baseSingle < 0) {
118
97
  if (base.length - baseColon - 3 > 0) {
119
98
  return base + '/' + given;
@@ -123,7 +102,6 @@ function join(given, base) {
123
102
  }
124
103
  } else {
125
104
  baseSingle = base.indexOf('/', baseColon + 1);
126
-
127
105
  if (baseSingle < 0) {
128
106
  if (base.length - baseColon - 1 > 0) {
129
107
  return base + '/' + given;
@@ -132,134 +110,103 @@ function join(given, base) {
132
110
  }
133
111
  }
134
112
  }
135
-
136
113
  if (given.indexOf('/') === 0) {
137
114
  return base.slice(0, baseSingle) + given;
138
115
  }
139
-
140
116
  path = base.slice(baseSingle);
141
117
  lastSlash = path.lastIndexOf('/');
142
-
143
118
  if (lastSlash < 0) {
144
119
  return baseScheme + given;
145
120
  }
146
-
147
121
  if (lastSlash >= 0 && lastSlash < path.length - 1) {
148
122
  path = path.slice(0, +lastSlash + 1 || 9e9);
149
123
  }
150
-
151
124
  path += given;
152
-
153
125
  while (path.match(/[^\/]*\/\.\.\//)) {
154
126
  path = path.replace(/[^\/]*\/\.\.\//, '');
155
127
  }
156
-
157
128
  path = path.replace(/\.\//g, '');
158
129
  path = path.replace(/\/\.$/, '/');
159
130
  return base.slice(0, baseSingle) + path;
160
131
  }
132
+
161
133
  /**
162
134
  * Gets the protocol part of an URI
163
135
  * @param uri The URI
164
136
  */
165
-
166
-
167
137
  function protocol(uri) {
168
- var i = uri.indexOf(':');
169
-
138
+ const i = uri.indexOf(':');
170
139
  if (i < 0) {
171
140
  return null;
172
141
  } else {
173
142
  return uri.slice(0, i);
174
143
  }
175
144
  }
145
+
176
146
  /**
177
147
  * Gets a relative uri
178
148
  * @param base The base URI
179
149
  * @param uri The absolute URI
180
150
  */
181
-
182
-
183
151
  function refTo(base, uri) {
184
152
  var c, i, k, l, len, len1, n, o, p, q, ref, ref1, s;
185
153
  var commonHost = new RegExp('^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$');
186
-
187
154
  if (!base) {
188
155
  return uri;
189
156
  }
190
-
191
157
  if (base === uri) {
192
158
  return '';
193
159
  }
194
-
195
160
  for (i = o = 0, len = uri.length; o < len; i = ++o) {
196
- var _c = uri[i];
197
-
198
- if (_c !== base[i]) {
161
+ const c = uri[i];
162
+ if (c !== base[i]) {
199
163
  break;
200
164
  }
201
165
  }
202
-
203
166
  if (base.slice(0, i).match(commonHost)) {
204
167
  k = uri.indexOf('//');
205
-
206
168
  if (k < 0) {
207
169
  k = -2;
208
170
  }
209
-
210
171
  l = uri.indexOf('/', k + 2);
211
-
212
172
  if (uri[l + 1] !== '/' && base[l + 1] !== '/' && uri.slice(0, l) === base.slice(0, l)) {
213
173
  return uri.slice(l);
214
174
  }
215
175
  }
216
-
217
176
  if (uri[i] === '#' && base.length === i) {
218
177
  return uri.slice(i);
219
178
  }
220
-
221
179
  while (i > 0 && uri[i - 1] !== '/') {
222
180
  i--;
223
181
  }
224
-
225
182
  if (i < 3) {
226
183
  return uri;
227
184
  }
228
-
229
185
  if (base.indexOf('//', i - 2) > 0 || uri.indexOf('//', i - 2) > 0) {
230
186
  return uri;
231
187
  }
232
-
233
188
  if (base.indexOf(':', i) > 0) {
234
189
  return uri;
235
190
  }
236
-
237
191
  n = 0;
238
192
  ref = base.slice(i);
239
-
240
193
  for (p = 0, len1 = ref.length; p < len1; p++) {
241
194
  c = ref[p];
242
-
243
195
  if (c === '/') {
244
196
  n++;
245
197
  }
246
198
  }
247
-
248
199
  if (n === 0 && i < uri.length && uri[i] === '#') {
249
200
  return './' + uri.slice(i);
250
201
  }
251
-
252
202
  if (n === 0 && i === uri.length) {
253
203
  return './';
254
204
  }
255
-
256
205
  s = '';
257
-
258
206
  if (n > 0) {
259
207
  for (q = 1, ref1 = n; ref1 >= 1 ? q <= ref1 : q >= ref1; ref1 >= 1 ? ++q : --q) {
260
208
  s += '../';
261
209
  }
262
210
  }
263
-
264
211
  return s + uri.slice(i);
265
212
  }
@@ -1,16 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.defaultGraphURI = exports.defaultGraphNode = void 0;
9
-
10
8
  var _namedNode = _interopRequireDefault(require("../named-node"));
11
-
12
9
  // Prevents circular dependencies between data-factory-internal and statement
13
- var defaultGraphURI = 'chrome:theSession';
10
+
11
+ const defaultGraphURI = 'chrome:theSession';
14
12
  exports.defaultGraphURI = defaultGraphURI;
15
- var defaultGraphNode = new _namedNode.default(defaultGraphURI);
13
+ const defaultGraphNode = new _namedNode.default(defaultGraphURI);
16
14
  exports.defaultGraphNode = defaultGraphNode;
@@ -4,12 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.termValue = termValue;
7
-
8
7
  /** Retrieve the value of a term, or self if already a string. */
9
8
  function termValue(node) {
10
9
  if (typeof node === 'string') {
11
10
  return node;
12
11
  }
13
-
14
12
  return node.value;
15
13
  }