rdflib 2.2.37 → 2.3.0-08f819ce

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.
package/esm/fetcher.js CHANGED
@@ -142,7 +142,9 @@ class XHTMLHandler extends Handler {
142
142
  return 'XHTMLHandler';
143
143
  }
144
144
  static register(fetcher) {
145
- fetcher.mediatypes[XHTMLContentType] = {};
145
+ fetcher.mediatypes[XHTMLContentType] = {
146
+ 'q': 0.8
147
+ };
146
148
  }
147
149
  parse(fetcher, responseText, options) {
148
150
  let relation, reverse;
@@ -275,7 +277,7 @@ class HTMLHandler extends Handler {
275
277
  }
276
278
  static register(fetcher) {
277
279
  fetcher.mediatypes['text/html'] = {
278
- 'q': 0.9
280
+ 'q': 0.8
279
281
  };
280
282
  }
281
283
  parse(fetcher, responseText, options) {
@@ -324,21 +326,19 @@ class JsonLdHandler extends Handler {
324
326
  'q': 0.9
325
327
  };
326
328
  }
327
- parse(fetcher, responseText, options, response) {
329
+ async parse(fetcher, responseText, options, response) {
328
330
  const kb = fetcher.store;
329
- return new Promise((resolve, reject) => {
330
- try {
331
- jsonldParser(responseText, kb, options.original.value, () => {
332
- resolve(fetcher.doneFetch(options, response));
333
- });
334
- } catch (err) {
335
- const msg = 'Error trying to parse ' + options.resource + ' as JSON-LD:\n' + err; // not err.stack -- irrelevant
336
- resolve(fetcher.failFetch(options, msg, 'parse_error', response));
337
- }
338
- });
331
+ try {
332
+ await jsonldParser(responseText, kb, options.original.value);
333
+ fetcher.store.add(options.original, ns.rdf('type'), ns.link('RDFDocument'), fetcher.appNode);
334
+ return fetcher.doneFetch(options, response);
335
+ } catch (err) {
336
+ const msg = 'Error trying to parse ' + options.resource + ' as JSON-LD:\n' + err; // not err.stack -- irrelevant
337
+ return fetcher.failFetch(options, msg, 'parse_error', response);
338
+ }
339
339
  }
340
340
  }
341
- JsonLdHandler.pattern = /application\/ld\+json/;
341
+ JsonLdHandler.pattern = /application\/(ld\+json|activity\+json)/;
342
342
  class TextHandler extends Handler {
343
343
  static toString() {
344
344
  return 'TextHandler';
@@ -376,17 +376,8 @@ class N3Handler extends Handler {
376
376
  return 'N3Handler';
377
377
  }
378
378
  static register(fetcher) {
379
- fetcher.mediatypes['text/n3'] = {
380
- 'q': '1.0'
381
- }; // as per 2008 spec
382
- /*
383
- fetcher.mediatypes['application/x-turtle'] = {
384
- 'q': 1.0
385
- } // pre 2008
386
- */
387
- fetcher.mediatypes['text/turtle'] = {
388
- 'q': 1.0
389
- }; // post 2008
379
+ fetcher.mediatypes['text/n3'] = {};
380
+ fetcher.mediatypes['text/turtle'] = {};
390
381
  }
391
382
  parse(fetcher, responseText, options, response) {
392
383
  // Parse the text of this N3 file
@@ -736,7 +727,7 @@ export default class Fetcher {
736
727
  options.baseURI = options.baseURI || uri; // Preserve though proxying etc
737
728
  options.original = kb.rdfFactory.namedNode(options.baseURI);
738
729
  options.req = kb.bnode();
739
- options.headers = options.headers || new Headers();
730
+ options.headers = options.headers || {};
740
731
  if (options.contentType) {
741
732
  // @ts-ignore
742
733
  options.headers['content-type'] = options.contentType;
@@ -53,16 +53,15 @@ function listToCollection(kb, obj) {
53
53
  *
54
54
  * Ensure that {kb.rdfFactory} is a DataFactory.
55
55
  */
56
- export default function jsonldParser(str, kb, base, callback) {
56
+ export default async function jsonldParser(str, kb, base) {
57
57
  const baseString = base && Object.prototype.hasOwnProperty.call(base, 'termType') ? base.value : base;
58
- return import('jsonld').then(jsonld => {
59
- return jsonld.flatten(JSON.parse(str), null, {
60
- base: baseString
61
- });
62
- }).then(flattened => flattened.reduce((store, flatResource) => {
63
- kb = processResource(kb, base, flatResource);
64
- return kb;
65
- }, kb)).then(callback).catch(callback);
58
+ const jsonld = await import('jsonld');
59
+ // ⚠ Unit tests also work without accessing `jsonld.default` explicitly, but real browser usage will fail with
60
+ // just calling `jsonld.flatten`, so please do not remove `default`
61
+ const flattened = await jsonld.default.flatten(JSON.parse(str), null, {
62
+ base: baseString
63
+ });
64
+ return flattened.reduce((store, flatResource) => processResource(store, base, flatResource), kb);
66
65
  }
67
66
  function nodeType(kb, obj) {
68
67
  if (obj['@id'].startsWith('_:')) {
package/esm/n3parser.js CHANGED
@@ -183,9 +183,19 @@ var ws = new RegExp("^[ \\t]*", 'g');
183
183
  var signed_integer = new RegExp("^[-+]?[0-9]+", 'g');
184
184
  var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?([eE][-+]?[0-9]+)?", 'g');
185
185
  var datetime_syntax = new RegExp('^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9](T[0-9][0-9]:[0-9][0-9](:[0-9][0-9](\\.[0-9]*)?)?)?Z?');
186
+
187
+ // Reused in tight loops to detect whitespace or comment after a dot
188
+ var wsOrHash = new RegExp("[\\s#]");
186
189
  var digitstring = new RegExp("^[0-9]+", 'g');
187
190
  var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g');
188
191
  var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*", 'g');
192
+
193
+ // Returns true when a dot at position i should terminate a name,
194
+ // i.e., when the next character is whitespace, a comment start, or EOF
195
+ function dotTerminatesName(str, i) {
196
+ var next = str.charAt(i + 1);
197
+ return next === '' || wsOrHash.test(next);
198
+ }
189
199
  function createSinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) {
190
200
  return new SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why);
191
201
  }
@@ -674,6 +684,16 @@ export class SinkParser {
674
684
  if (j < 0) {
675
685
  throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when ']' expected after [ <propertyList>");
676
686
  }
687
+ if (str.slice(j, j + 1) == ".") {
688
+ // If a dot is found after a blank node, treat it as a statement terminator.
689
+ // Do NOT consume the '.' here: statement terminators are handled centrally by
690
+ // checkDot() (called by directiveOrStatement after statement()). Consuming the dot
691
+ // locally would bypass that unified logic and could cause inconsistencies.
692
+ // We do consume ']' below because it is a structural closer of the blank node,
693
+ // not a statement terminator.
694
+ res.push(subj);
695
+ return j; // leave '.' for checkDot()
696
+ }
677
697
  if (str.slice(j, j + 1) != "]") {
678
698
  throw BadSyntax(this._thisDoc, this.lines, str, j, "']' expected");
679
699
  }
@@ -1122,7 +1142,17 @@ export class SinkParser {
1122
1142
  return -1;
1123
1143
  }
1124
1144
  var i = j;
1125
- while (i < pyjslib_len(str) && _notNameChars.indexOf(str.charAt(i)) < 0) {
1145
+ while (i < pyjslib_len(str)) {
1146
+ var c = str.charAt(i);
1147
+ if (c === '.') {
1148
+ if (dotTerminatesName(str, i)) {
1149
+ break; // treat as statement terminator, not part of name
1150
+ }
1151
+ // else: accept '.' as part of name
1152
+ } else if (_notNameChars.indexOf(c) >= 0) {
1153
+ // Other invalid characters terminate the name
1154
+ break;
1155
+ }
1126
1156
  var i = i + 1;
1127
1157
  }
1128
1158
  res.push(str.slice(j, i));
@@ -1148,12 +1178,15 @@ export class SinkParser {
1148
1178
  var i = i + 1;
1149
1179
  while (i < pyjslib_len(str)) {
1150
1180
  var c = str.charAt(i);
1151
- if (_notNameChars.indexOf(c) < 0) {
1152
- var ln = ln + c;
1153
- var i = i + 1;
1154
- } else {
1181
+ if (c === '.') {
1182
+ if (dotTerminatesName(str, i)) {
1183
+ break; // dot ends the name here
1184
+ }
1185
+ } else if (_notNameChars.indexOf(c) >= 0) {
1155
1186
  break;
1156
1187
  }
1188
+ var ln = ln + c;
1189
+ var i = i + 1;
1157
1190
  }
1158
1191
  } else {
1159
1192
  var ln = "";
@@ -1164,12 +1197,15 @@ export class SinkParser {
1164
1197
  var ln = "";
1165
1198
  while (i < pyjslib_len(str)) {
1166
1199
  var c = str.charAt(i);
1167
- if (_notNameChars.indexOf(c) < 0) {
1168
- var ln = ln + c;
1169
- var i = i + 1;
1170
- } else {
1200
+ if (c === '.') {
1201
+ if (dotTerminatesName(str, i)) {
1202
+ break; // dot ends the name here
1203
+ }
1204
+ } else if (_notNameChars.indexOf(c) >= 0) {
1171
1205
  break;
1172
1206
  }
1207
+ var ln = ln + c;
1208
+ var i = i + 1;
1173
1209
  }
1174
1210
  res.push(new pyjslib_Tuple([pfx, ln]));
1175
1211
  return i;
package/esm/parse.js CHANGED
@@ -12,7 +12,7 @@ import { TurtleContentType, N3ContentType, RDFXMLContentType, XHTMLContentType,
12
12
  * Parse a string and put the result into the graph kb.
13
13
  * Normal method is sync.
14
14
  * Unfortunately jsdonld is currently written to need to be called async.
15
- * Hence the mess below with executeCallback.
15
+ * If you are parsing JSON-LD and want to know when and whether it succeeded, you need to use the callback param.
16
16
  * @param str - The input string to parse
17
17
  * @param kb - The store to use
18
18
  * @param base - The base URI to use
@@ -48,7 +48,10 @@ export default function parse(str, kb, base) {
48
48
  sparqlUpdateParser(str, kb, base);
49
49
  executeCallback();
50
50
  } else if (contentType === JSONLDContentType) {
51
- jsonldParser(str, kb, base, executeCallback);
51
+ // since we do not await the promise here, rejections will not be covered by the surrounding try catch
52
+ // we do not use await, because parse() should stay sync
53
+ // so, to not lose the async error, we need to catch the rejection and call the error callback here too
54
+ jsonldParser(str, kb, base).then(executeCallback).catch(executeErrorCallback);
52
55
  } else if (contentType === NQuadsContentType || contentType === NQuadsAltContentType) {
53
56
  var n3Parser = new N3jsParser({
54
57
  factory: DataFactory
package/esm/serializer.js CHANGED
@@ -21,6 +21,7 @@ export default function createSerializer(store) {
21
21
  export class Serializer {
22
22
  constructor(store) {
23
23
  _defineProperty(this, "_notQNameChars", '\t\r\n !"#$%&\'()*.,+/;<=>?@[\\]^`{|}~');
24
+ // issue#228
24
25
  _defineProperty(this, "_notNameChars", this._notQNameChars + ':');
25
26
  // stringToN3: String escaping for N3
26
27
  _defineProperty(this, "validPrefix", new RegExp(/^[a-zA-Z][a-zA-Z0-9]*$/));
package/esm/store.js CHANGED
@@ -129,7 +129,9 @@ export default class IndexedFormula extends Formula {
129
129
  /** Function to remove quads from the store arrays with */
130
130
  _defineProperty(this, "rdfArrayRemove", void 0);
131
131
  /** Callbacks which are triggered after a statement has been added to the store */
132
- _defineProperty(this, "dataCallbacks", void 0);
132
+ _defineProperty(this, "dataCallbacks", []);
133
+ /** Callbacks which are triggered after a statement has been removed from the store */
134
+ _defineProperty(this, "dataRemovalCallbacks", []);
133
135
  this.propertyActions = {};
134
136
  this.classActions = {};
135
137
  this.redirections = [];
@@ -151,6 +153,9 @@ export default class IndexedFormula extends Formula {
151
153
  if (opts.dataCallback) {
152
154
  this.dataCallbacks = [opts.dataCallback];
153
155
  }
156
+ if (opts.dataRemovalCallback) {
157
+ this.dataRemovalCallbacks = [opts.dataRemovalCallback];
158
+ }
154
159
  this.initPropertyActions(this.features);
155
160
  }
156
161
 
@@ -179,11 +184,11 @@ export default class IndexedFormula extends Formula {
179
184
  * @param cb
180
185
  */
181
186
  addDataCallback(cb) {
182
- if (!this.dataCallbacks) {
183
- this.dataCallbacks = [];
184
- }
185
187
  this.dataCallbacks.push(cb);
186
188
  }
189
+ addDataRemovalCallback(cb) {
190
+ this.dataRemovalCallbacks.push(cb);
191
+ }
187
192
 
188
193
  /**
189
194
  * Apply a set of statements to be deleted and to be inserted
@@ -397,10 +402,8 @@ export default class IndexedFormula extends Formula {
397
402
 
398
403
  // log.debug("ADDING {"+subj+" "+pred+" "+objNode+"} "+why)
399
404
  this.statements.push(st);
400
- if (this.dataCallbacks) {
401
- for (const callback of this.dataCallbacks) {
402
- callback(st);
403
- }
405
+ for (const callback of this.dataCallbacks) {
406
+ callback(st);
404
407
  }
405
408
  return st;
406
409
  }
@@ -850,6 +853,9 @@ export default class IndexedFormula extends Formula {
850
853
  }
851
854
  }
852
855
  this.rdfArrayRemove(this.statements, st);
856
+ for (const callback of this.dataRemovalCallbacks) {
857
+ callback(st);
858
+ }
853
859
  return this;
854
860
  }
855
861
 
package/lib/fetcher.js CHANGED
@@ -22,8 +22,7 @@ var _crossFetch = _interopRequireWildcard(require("cross-fetch"));
22
22
  var _types = require("./types");
23
23
  var _termValue = require("./utils/termValue");
24
24
  var _jsonldparser = _interopRequireDefault(require("./jsonldparser"));
25
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
26
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
27
26
  /* global $SolidTestEnvironment */
28
27
  /**
29
28
  *
@@ -152,7 +151,9 @@ class XHTMLHandler extends Handler {
152
151
  return 'XHTMLHandler';
153
152
  }
154
153
  static register(fetcher) {
155
- fetcher.mediatypes[_types.XHTMLContentType] = {};
154
+ fetcher.mediatypes[_types.XHTMLContentType] = {
155
+ 'q': 0.8
156
+ };
156
157
  }
157
158
  parse(fetcher, responseText, options) {
158
159
  let relation, reverse;
@@ -285,7 +286,7 @@ class HTMLHandler extends Handler {
285
286
  }
286
287
  static register(fetcher) {
287
288
  fetcher.mediatypes['text/html'] = {
288
- 'q': 0.9
289
+ 'q': 0.8
289
290
  };
290
291
  }
291
292
  parse(fetcher, responseText, options) {
@@ -334,21 +335,19 @@ class JsonLdHandler extends Handler {
334
335
  'q': 0.9
335
336
  };
336
337
  }
337
- parse(fetcher, responseText, options, response) {
338
+ async parse(fetcher, responseText, options, response) {
338
339
  const kb = fetcher.store;
339
- return new Promise((resolve, reject) => {
340
- try {
341
- (0, _jsonldparser.default)(responseText, kb, options.original.value, () => {
342
- resolve(fetcher.doneFetch(options, response));
343
- });
344
- } catch (err) {
345
- const msg = 'Error trying to parse ' + options.resource + ' as JSON-LD:\n' + err; // not err.stack -- irrelevant
346
- resolve(fetcher.failFetch(options, msg, 'parse_error', response));
347
- }
348
- });
340
+ try {
341
+ await (0, _jsonldparser.default)(responseText, kb, options.original.value);
342
+ fetcher.store.add(options.original, ns.rdf('type'), ns.link('RDFDocument'), fetcher.appNode);
343
+ return fetcher.doneFetch(options, response);
344
+ } catch (err) {
345
+ const msg = 'Error trying to parse ' + options.resource + ' as JSON-LD:\n' + err; // not err.stack -- irrelevant
346
+ return fetcher.failFetch(options, msg, 'parse_error', response);
347
+ }
349
348
  }
350
349
  }
351
- JsonLdHandler.pattern = /application\/ld\+json/;
350
+ JsonLdHandler.pattern = /application\/(ld\+json|activity\+json)/;
352
351
  class TextHandler extends Handler {
353
352
  static toString() {
354
353
  return 'TextHandler';
@@ -386,17 +385,8 @@ class N3Handler extends Handler {
386
385
  return 'N3Handler';
387
386
  }
388
387
  static register(fetcher) {
389
- fetcher.mediatypes['text/n3'] = {
390
- 'q': '1.0'
391
- }; // as per 2008 spec
392
- /*
393
- fetcher.mediatypes['application/x-turtle'] = {
394
- 'q': 1.0
395
- } // pre 2008
396
- */
397
- fetcher.mediatypes['text/turtle'] = {
398
- 'q': 1.0
399
- }; // post 2008
388
+ fetcher.mediatypes['text/n3'] = {};
389
+ fetcher.mediatypes['text/turtle'] = {};
400
390
  }
401
391
  parse(fetcher, responseText, options, response) {
402
392
  // Parse the text of this N3 file
@@ -746,7 +736,7 @@ class Fetcher {
746
736
  options.baseURI = options.baseURI || uri; // Preserve though proxying etc
747
737
  options.original = kb.rdfFactory.namedNode(options.baseURI);
748
738
  options.req = kb.bnode();
749
- options.headers = options.headers || new _crossFetch.Headers();
739
+ options.headers = options.headers || {};
750
740
  if (options.contentType) {
751
741
  // @ts-ignore
752
742
  options.headers['content-type'] = options.contentType;
package/lib/formula.d.ts CHANGED
@@ -12,6 +12,7 @@ import BlankNode from './blank-node';
12
12
  import NamedNode from './named-node';
13
13
  export interface FormulaOpts {
14
14
  dataCallback?: (q: Quad) => void;
15
+ dataRemovalCallback?: (q: Quad) => void;
15
16
  rdfArrayRemove?: (arr: Quad[], q: Quad) => void;
16
17
  rdfFactory?: RdfJsDataFactory;
17
18
  }
package/lib/index.js CHANGED
@@ -290,8 +290,7 @@ Object.keys(_terms).forEach(function (key) {
290
290
  });
291
291
  });
292
292
  var _termValue = require("./utils/termValue");
293
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
294
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
293
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
295
294
  // Prepare bound versions of data factory methods for export
296
295
  const boundDataFactory = {};
297
296
  for (const name in _rdflibDataFactory.default) {
@@ -10,4 +10,4 @@ export function jsonldObjectToTerm(kb: any, obj: any): Literal | NamedNode | Bla
10
10
  *
11
11
  * Ensure that {kb.rdfFactory} is a DataFactory.
12
12
  */
13
- export default function jsonldParser(str: any, kb: any, base: any, callback: any): Promise<any>;
13
+ export default function jsonldParser(str: any, kb: any, base: any): Promise<any>;
@@ -6,8 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = jsonldParser;
7
7
  exports.jsonldObjectToTerm = jsonldObjectToTerm;
8
8
  var _utils = require("./utils");
9
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
9
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
10
  /**
12
11
  * Parses json-ld formatted JS objects to a rdf Term.
13
12
  * @param kb - The DataFactory to use.
@@ -61,16 +60,15 @@ function listToCollection(kb, obj) {
61
60
  *
62
61
  * Ensure that {kb.rdfFactory} is a DataFactory.
63
62
  */
64
- function jsonldParser(str, kb, base, callback) {
63
+ async function jsonldParser(str, kb, base) {
65
64
  const baseString = base && Object.prototype.hasOwnProperty.call(base, 'termType') ? base.value : base;
66
- return Promise.resolve().then(() => _interopRequireWildcard(require('jsonld'))).then(jsonld => {
67
- return jsonld.flatten(JSON.parse(str), null, {
68
- base: baseString
69
- });
70
- }).then(flattened => flattened.reduce((store, flatResource) => {
71
- kb = processResource(kb, base, flatResource);
72
- return kb;
73
- }, kb)).then(callback).catch(callback);
65
+ const jsonld = await Promise.resolve().then(() => _interopRequireWildcard(require('jsonld')));
66
+ // ⚠ Unit tests also work without accessing `jsonld.default` explicitly, but real browser usage will fail with
67
+ // just calling `jsonld.flatten`, so please do not remove `default`
68
+ const flattened = await jsonld.default.flatten(JSON.parse(str), null, {
69
+ base: baseString
70
+ });
71
+ return flattened.reduce((store, flatResource) => processResource(store, base, flatResource), kb);
74
72
  }
75
73
  function nodeType(kb, obj) {
76
74
  if (obj['@id'].startsWith('_:')) {
package/lib/literal.d.ts CHANGED
@@ -33,7 +33,7 @@ export default class Literal extends Node implements TFLiteral {
33
33
  * Gets whether two literals are the same
34
34
  * @param other The other statement
35
35
  */
36
- equals(other: Term): boolean;
36
+ equals(other: Term | null | undefined): boolean;
37
37
  /**
38
38
  * The language for the literal
39
39
  * @deprecated use {language} instead
package/lib/n3parser.js CHANGED
@@ -7,8 +7,7 @@ exports.default = exports.SinkParser = void 0;
7
7
  var Uri = _interopRequireWildcard(require("./uri"));
8
8
  var _utils = require("./utils");
9
9
  var _lists = require("./lists");
10
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
11
  /**
13
12
  *
14
13
  * UTF-8 data encode / decode
@@ -192,9 +191,19 @@ var ws = new RegExp("^[ \\t]*", 'g');
192
191
  var signed_integer = new RegExp("^[-+]?[0-9]+", 'g');
193
192
  var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?([eE][-+]?[0-9]+)?", 'g');
194
193
  var datetime_syntax = new RegExp('^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9](T[0-9][0-9]:[0-9][0-9](:[0-9][0-9](\\.[0-9]*)?)?)?Z?');
194
+
195
+ // Reused in tight loops to detect whitespace or comment after a dot
196
+ var wsOrHash = new RegExp("[\\s#]");
195
197
  var digitstring = new RegExp("^[0-9]+", 'g');
196
198
  var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g');
197
199
  var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*", 'g');
200
+
201
+ // Returns true when a dot at position i should terminate a name,
202
+ // i.e., when the next character is whitespace, a comment start, or EOF
203
+ function dotTerminatesName(str, i) {
204
+ var next = str.charAt(i + 1);
205
+ return next === '' || wsOrHash.test(next);
206
+ }
198
207
  function createSinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) {
199
208
  return new SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why);
200
209
  }
@@ -683,6 +692,16 @@ class SinkParser {
683
692
  if (j < 0) {
684
693
  throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when ']' expected after [ <propertyList>");
685
694
  }
695
+ if (str.slice(j, j + 1) == ".") {
696
+ // If a dot is found after a blank node, treat it as a statement terminator.
697
+ // Do NOT consume the '.' here: statement terminators are handled centrally by
698
+ // checkDot() (called by directiveOrStatement after statement()). Consuming the dot
699
+ // locally would bypass that unified logic and could cause inconsistencies.
700
+ // We do consume ']' below because it is a structural closer of the blank node,
701
+ // not a statement terminator.
702
+ res.push(subj);
703
+ return j; // leave '.' for checkDot()
704
+ }
686
705
  if (str.slice(j, j + 1) != "]") {
687
706
  throw BadSyntax(this._thisDoc, this.lines, str, j, "']' expected");
688
707
  }
@@ -1131,7 +1150,17 @@ class SinkParser {
1131
1150
  return -1;
1132
1151
  }
1133
1152
  var i = j;
1134
- while (i < pyjslib_len(str) && _notNameChars.indexOf(str.charAt(i)) < 0) {
1153
+ while (i < pyjslib_len(str)) {
1154
+ var c = str.charAt(i);
1155
+ if (c === '.') {
1156
+ if (dotTerminatesName(str, i)) {
1157
+ break; // treat as statement terminator, not part of name
1158
+ }
1159
+ // else: accept '.' as part of name
1160
+ } else if (_notNameChars.indexOf(c) >= 0) {
1161
+ // Other invalid characters terminate the name
1162
+ break;
1163
+ }
1135
1164
  var i = i + 1;
1136
1165
  }
1137
1166
  res.push(str.slice(j, i));
@@ -1157,12 +1186,15 @@ class SinkParser {
1157
1186
  var i = i + 1;
1158
1187
  while (i < pyjslib_len(str)) {
1159
1188
  var c = str.charAt(i);
1160
- if (_notNameChars.indexOf(c) < 0) {
1161
- var ln = ln + c;
1162
- var i = i + 1;
1163
- } else {
1189
+ if (c === '.') {
1190
+ if (dotTerminatesName(str, i)) {
1191
+ break; // dot ends the name here
1192
+ }
1193
+ } else if (_notNameChars.indexOf(c) >= 0) {
1164
1194
  break;
1165
1195
  }
1196
+ var ln = ln + c;
1197
+ var i = i + 1;
1166
1198
  }
1167
1199
  } else {
1168
1200
  var ln = "";
@@ -1173,12 +1205,15 @@ class SinkParser {
1173
1205
  var ln = "";
1174
1206
  while (i < pyjslib_len(str)) {
1175
1207
  var c = str.charAt(i);
1176
- if (_notNameChars.indexOf(c) < 0) {
1177
- var ln = ln + c;
1178
- var i = i + 1;
1179
- } else {
1208
+ if (c === '.') {
1209
+ if (dotTerminatesName(str, i)) {
1210
+ break; // dot ends the name here
1211
+ }
1212
+ } else if (_notNameChars.indexOf(c) >= 0) {
1180
1213
  break;
1181
1214
  }
1215
+ var ln = ln + c;
1216
+ var i = i + 1;
1182
1217
  }
1183
1218
  res.push(new pyjslib_Tuple([pfx, ln]));
1184
1219
  return i;
@@ -33,7 +33,7 @@ export default abstract class Node {
33
33
  * Compares whether the two nodes are equal
34
34
  * @param other The other node
35
35
  */
36
- equals(other: Term): boolean;
36
+ equals(other: Term | null | undefined): boolean;
37
37
  /**
38
38
  * Creates a hash for this node
39
39
  * @deprecated use {rdfFactory.id} instead if possible
package/lib/parse.d.ts CHANGED
@@ -5,7 +5,7 @@ type CallbackFunc = (error: any, kb: Formula | null) => void;
5
5
  * Parse a string and put the result into the graph kb.
6
6
  * Normal method is sync.
7
7
  * Unfortunately jsdonld is currently written to need to be called async.
8
- * Hence the mess below with executeCallback.
8
+ * If you are parsing JSON-LD and want to know when and whether it succeeded, you need to use the callback param.
9
9
  * @param str - The input string to parse
10
10
  * @param kb - The store to use
11
11
  * @param base - The base URI to use
package/lib/parse.js CHANGED
@@ -14,8 +14,7 @@ var _rdfxmlparser = _interopRequireDefault(require("./rdfxmlparser"));
14
14
  var _patchParser = _interopRequireDefault(require("./patch-parser"));
15
15
  var Util = _interopRequireWildcard(require("./utils-js"));
16
16
  var _types = require("./types");
17
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
18
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
18
  // @ts-ignore is this injected?
20
19
  // @@ Goal: remove this dependency
21
20
 
@@ -23,7 +22,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
23
22
  * Parse a string and put the result into the graph kb.
24
23
  * Normal method is sync.
25
24
  * Unfortunately jsdonld is currently written to need to be called async.
26
- * Hence the mess below with executeCallback.
25
+ * If you are parsing JSON-LD and want to know when and whether it succeeded, you need to use the callback param.
27
26
  * @param str - The input string to parse
28
27
  * @param kb - The store to use
29
28
  * @param base - The base URI to use
@@ -59,7 +58,10 @@ function parse(str, kb, base) {
59
58
  (0, _patchParser.default)(str, kb, base);
60
59
  executeCallback();
61
60
  } else if (contentType === _types.JSONLDContentType) {
62
- (0, _jsonldparser.default)(str, kb, base, executeCallback);
61
+ // since we do not await the promise here, rejections will not be covered by the surrounding try catch
62
+ // we do not use await, because parse() should stay sync
63
+ // so, to not lose the async error, we need to catch the rejection and call the error callback here too
64
+ (0, _jsonldparser.default)(str, kb, base).then(executeCallback).catch(executeErrorCallback);
63
65
  } else if (contentType === _types.NQuadsContentType || contentType === _types.NQuadsAltContentType) {
64
66
  var n3Parser = new _n.Parser({
65
67
  factory: _extendedTermFactory.default
package/lib/rdfaparser.js CHANGED
@@ -11,8 +11,7 @@ var _namedNode = _interopRequireDefault(require("./named-node"));
11
11
  var Uri = _interopRequireWildcard(require("./uri"));
12
12
  var Util = _interopRequireWildcard(require("./utils-js"));
13
13
  var _canonicalDataFactory = _interopRequireDefault(require("./factories/canonical-data-factory"));
14
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
15
  // RDFa Parser for rdflib.js
17
16
 
18
17
  // Originally by: Alex Milowski