rdflib 2.3.8 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/fetcher.js CHANGED
@@ -977,27 +977,27 @@ export default class Fetcher {
977
977
  linkData(originalUri, rel, uri, why, reverse) {
978
978
  if (!uri) return;
979
979
  let kb = this.store;
980
- let predicate;
981
980
  // See http://www.w3.org/TR/powder-dr/#httplink for describedby 2008-12-10
982
981
  let obj = kb.rdfFactory.namedNode(Uri.join(uri, originalUri.value));
982
+ let predicates;
983
983
  if (rel === 'alternate' || rel === 'seeAlso' || rel === 'meta' || rel === 'describedby') {
984
984
  if (obj.value === originalUri.value) {
985
985
  return;
986
986
  }
987
- predicate = this.ns.rdfs('seeAlso');
987
+ // Also emit the IANA relation predicate triple (issue #741)
988
+ predicates = [kb.rdfFactory.namedNode(this.ianaLinkRelation(rel)), this.ns.rdfs('seeAlso')];
988
989
  } else if (rel === 'type') {
989
- predicate = kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type');
990
+ predicates = [kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')];
990
991
  } else {
991
992
  // See https://www.iana.org/assignments/link-relations/link-relations.xml
992
993
  // Alas not yet in RDF yet for each predicate
993
994
  // encode space in e.g. rel="shortcut icon"
994
- predicate = kb.rdfFactory.namedNode(Uri.join(encodeURIComponent(rel), 'http://www.iana.org/assignments/link-relations/'));
995
- }
996
- if (reverse) {
997
- kb.add(obj, predicate, originalUri, why);
998
- } else {
999
- kb.add(originalUri, predicate, obj, why);
995
+ predicates = [kb.rdfFactory.namedNode(this.ianaLinkRelation(rel))];
1000
996
  }
997
+ kb.addAll(predicates.map(predicate => reverse ? kb.rdfFactory.quad(obj, predicate, originalUri, why) : kb.rdfFactory.quad(originalUri, predicate, obj, why)));
998
+ }
999
+ ianaLinkRelation(rel) {
1000
+ return Uri.join(encodeURIComponent(rel), 'http://www.iana.org/assignments/link-relations/');
1001
1001
  }
1002
1002
  parseLinkHeader(linkHeader, originalUri, reqNode) {
1003
1003
  if (!linkHeader) {
@@ -58,7 +58,11 @@ export default async function jsonldParser(str, kb, base) {
58
58
  const jsonld = await import('jsonld');
59
59
  // ⚠ Unit tests also work without accessing `jsonld.default` explicitly, but real browser usage will fail with
60
60
  // just calling `jsonld.flatten`, so please do not remove `default`
61
- const flattened = await jsonld.default.flatten(JSON.parse(str), null, {
61
+ // Handle both ESM (browser) and CommonJS (Node.js) module formats
62
+ // Browser ESM: jsonld.default.flatten
63
+ // Node.js CommonJS: jsonld.flatten
64
+ const jsonldLib = jsonld.default || jsonld;
65
+ const flattened = await jsonldLib.flatten(JSON.parse(str), null, {
62
66
  base: baseString
63
67
  });
64
68
  return flattened.reduce((store, flatResource) => processResource(store, base, flatResource), kb);
package/esm/store.js CHANGED
@@ -33,7 +33,6 @@ import Variable from './variable';
33
33
  import { Query, indexedFormulaQuery } from './query';
34
34
  import { BlankNodeTermType, CollectionTermType, DefaultGraphTermType, EmptyTermType, GraphTermType, LiteralTermType, NamedNodeTermType, VariableTermType } from './types';
35
35
  import NamedNode from './named-node';
36
- import { namedNode } from './index';
37
36
  import serialize from "./serialize";
38
37
  import BlankNode from './blank-node';
39
38
  import DefaultGraph from './default-graph';
@@ -247,7 +246,7 @@ export default class IndexedFormula extends Formula {
247
246
  var query = new Query('patch');
248
247
  query.pat = patch.where;
249
248
  query.pat.statements.map(function (st) {
250
- st.graph = namedNode(target.value);
249
+ st.graph = new NamedNode(target.value);
251
250
  });
252
251
  //@ts-ignore TODO: add sync property to Query when converting Query to typescript
253
252
  query.sync = true;
package/lib/fetcher.d.ts CHANGED
@@ -340,6 +340,7 @@ export default class Fetcher implements CallbackifyInterface {
340
340
  original: Quad_Subject;
341
341
  } & Options, errorMessage: string, statusCode: StatusValues, response?: ExtendedResponse): Promise<FetchError>;
342
342
  linkData(originalUri: NamedNode, rel: string, uri: string, why: Quad_Graph, reverse?: boolean): void;
343
+ private ianaLinkRelation;
343
344
  parseLinkHeader(linkHeader: string, originalUri: NamedNode, reqNode: Quad_Graph): void;
344
345
  doneFetch(options: {
345
346
  req: Quad_Subject;
package/lib/fetcher.js CHANGED
@@ -986,27 +986,27 @@ class Fetcher {
986
986
  linkData(originalUri, rel, uri, why, reverse) {
987
987
  if (!uri) return;
988
988
  let kb = this.store;
989
- let predicate;
990
989
  // See http://www.w3.org/TR/powder-dr/#httplink for describedby 2008-12-10
991
990
  let obj = kb.rdfFactory.namedNode(Uri.join(uri, originalUri.value));
991
+ let predicates;
992
992
  if (rel === 'alternate' || rel === 'seeAlso' || rel === 'meta' || rel === 'describedby') {
993
993
  if (obj.value === originalUri.value) {
994
994
  return;
995
995
  }
996
- predicate = this.ns.rdfs('seeAlso');
996
+ // Also emit the IANA relation predicate triple (issue #741)
997
+ predicates = [kb.rdfFactory.namedNode(this.ianaLinkRelation(rel)), this.ns.rdfs('seeAlso')];
997
998
  } else if (rel === 'type') {
998
- predicate = kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type');
999
+ predicates = [kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')];
999
1000
  } else {
1000
1001
  // See https://www.iana.org/assignments/link-relations/link-relations.xml
1001
1002
  // Alas not yet in RDF yet for each predicate
1002
1003
  // encode space in e.g. rel="shortcut icon"
1003
- predicate = kb.rdfFactory.namedNode(Uri.join(encodeURIComponent(rel), 'http://www.iana.org/assignments/link-relations/'));
1004
- }
1005
- if (reverse) {
1006
- kb.add(obj, predicate, originalUri, why);
1007
- } else {
1008
- kb.add(originalUri, predicate, obj, why);
1004
+ predicates = [kb.rdfFactory.namedNode(this.ianaLinkRelation(rel))];
1009
1005
  }
1006
+ kb.addAll(predicates.map(predicate => reverse ? kb.rdfFactory.quad(obj, predicate, originalUri, why) : kb.rdfFactory.quad(originalUri, predicate, obj, why)));
1007
+ }
1008
+ ianaLinkRelation(rel) {
1009
+ return Uri.join(encodeURIComponent(rel), 'http://www.iana.org/assignments/link-relations/');
1010
1010
  }
1011
1011
  parseLinkHeader(linkHeader, originalUri, reqNode) {
1012
1012
  if (!linkHeader) {
@@ -65,7 +65,11 @@ async function jsonldParser(str, kb, base) {
65
65
  const jsonld = await Promise.resolve().then(() => _interopRequireWildcard(require('jsonld')));
66
66
  // ⚠ Unit tests also work without accessing `jsonld.default` explicitly, but real browser usage will fail with
67
67
  // just calling `jsonld.flatten`, so please do not remove `default`
68
- const flattened = await jsonld.default.flatten(JSON.parse(str), null, {
68
+ // Handle both ESM (browser) and CommonJS (Node.js) module formats
69
+ // Browser ESM: jsonld.default.flatten
70
+ // Node.js CommonJS: jsonld.flatten
71
+ const jsonldLib = jsonld.default || jsonld;
72
+ const flattened = await jsonldLib.flatten(JSON.parse(str), null, {
69
73
  base: baseString
70
74
  });
71
75
  return flattened.reduce((store, flatResource) => processResource(store, base, flatResource), kb);
package/lib/store.js CHANGED
@@ -23,7 +23,6 @@ var _variable = _interopRequireDefault(require("./variable"));
23
23
  var _query = require("./query");
24
24
  var _types = require("./types");
25
25
  var _namedNode = _interopRequireDefault(require("./named-node"));
26
- var _index = require("./index");
27
26
  var _serialize = _interopRequireDefault(require("./serialize"));
28
27
  var _blankNode = _interopRequireDefault(require("./blank-node"));
29
28
  var _defaultGraph = _interopRequireDefault(require("./default-graph"));
@@ -255,7 +254,7 @@ class IndexedFormula extends _formula.default {
255
254
  var query = new _query.Query('patch');
256
255
  query.pat = patch.where;
257
256
  query.pat.statements.map(function (st) {
258
- st.graph = (0, _index.namedNode)(target.value);
257
+ st.graph = new _namedNode.default(target.value);
259
258
  });
260
259
  //@ts-ignore TODO: add sync property to Query when converting Query to typescript
261
260
  query.sync = true;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rdflib",
3
3
  "description": "an RDF library for node.js. Suitable for client and server side.",
4
- "version": "2.3.8",
4
+ "version": "2.4.0",
5
5
  "private": false,
6
6
  "browserslist": [
7
7
  "> 0.5%"
@@ -68,27 +68,27 @@
68
68
  "@types/express": "^5.0.6",
69
69
  "@types/jsonld": "^1.5.15",
70
70
  "@types/mocha": "^10.0.10",
71
- "@types/node": "^25.8.0",
71
+ "@types/node": "^25.9.1",
72
72
  "@types/sinon-chai": "^4.0.0",
73
73
  "babel-loader": "^10.1.1",
74
74
  "chai": "^6.2.2",
75
75
  "colors": "^1.4.0",
76
- "diff": "^8.0.4",
77
- "eslint": "^10.3.0",
76
+ "diff": "^9.0.0",
77
+ "eslint": "^10.4.0",
78
78
  "globals": "^17.6.0",
79
79
  "locate-path": "^8.0.0",
80
- "mocha": "^11.7.5",
80
+ "mocha": "^11.7.6",
81
81
  "nock": "^14.0.15",
82
82
  "node-fetch": "^3.3.2",
83
83
  "node-polyfill-webpack-plugin": "^4.1.0",
84
84
  "rimraf": "^6.1.3",
85
- "sinon": "^21.1.2",
85
+ "sinon": "^22.0.0",
86
86
  "sinon-chai": "^4.0.1",
87
87
  "source-map-loader": "^5.0.0",
88
88
  "ts-node": "^10.9.2",
89
89
  "typedoc": "^0.28.19",
90
90
  "typescript": "^5.9.3",
91
- "webpack": "^5.106.2",
91
+ "webpack": "^5.107.1",
92
92
  "webpack-cli": "^7.0.2",
93
93
  "webpack-dev-server": "^5.2.4"
94
94
  },
package/src/fetcher.ts CHANGED
@@ -1346,30 +1346,40 @@ export default class Fetcher implements CallbackifyInterface {
1346
1346
  ) {
1347
1347
  if (!uri) return
1348
1348
  let kb = this.store
1349
- let predicate
1350
1349
  // See http://www.w3.org/TR/powder-dr/#httplink for describedby 2008-12-10
1351
1350
  let obj = kb.rdfFactory.namedNode(Uri.join(uri, originalUri.value))
1352
1351
 
1352
+ let predicates: Quad_Predicate[]
1353
1353
  if (rel === 'alternate' || rel === 'seeAlso' || rel === 'meta' ||
1354
1354
  rel === 'describedby') {
1355
1355
  if (obj.value === originalUri.value) { return }
1356
- predicate = this.ns.rdfs('seeAlso')
1356
+ // Also emit the IANA relation predicate triple (issue #741)
1357
+ predicates = [
1358
+ kb.rdfFactory.namedNode(this.ianaLinkRelation(rel)),
1359
+ this.ns.rdfs('seeAlso')
1360
+ ]
1357
1361
  } else if (rel === 'type') {
1358
- predicate = kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
1362
+ predicates = [kb.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')]
1359
1363
  } else {
1360
1364
  // See https://www.iana.org/assignments/link-relations/link-relations.xml
1361
1365
  // Alas not yet in RDF yet for each predicate
1362
1366
  // encode space in e.g. rel="shortcut icon"
1363
- predicate = kb.rdfFactory.namedNode(
1364
- Uri.join(encodeURIComponent(rel),
1365
- 'http://www.iana.org/assignments/link-relations/')
1367
+ predicates = [kb.rdfFactory.namedNode(
1368
+ this.ianaLinkRelation(rel)
1369
+ )]
1370
+ }
1371
+ kb.addAll(
1372
+ predicates.map(predicate =>
1373
+ reverse
1374
+ ? kb.rdfFactory.quad(obj, predicate, originalUri, why)
1375
+ : kb.rdfFactory.quad(originalUri, predicate, obj, why)
1366
1376
  )
1367
- }
1368
- if (reverse) {
1369
- kb.add(obj, predicate, originalUri, why)
1370
- } else {
1371
- kb.add(originalUri, predicate, obj, why)
1372
- }
1377
+ )
1378
+ }
1379
+
1380
+ private ianaLinkRelation(rel: string) {
1381
+ return Uri.join(encodeURIComponent(rel),
1382
+ 'http://www.iana.org/assignments/link-relations/');
1373
1383
  }
1374
1384
 
1375
1385
  parseLinkHeader (
@@ -71,7 +71,11 @@ export default async function jsonldParser(str, kb, base) {
71
71
  const jsonld = await import('jsonld')
72
72
  // ⚠ Unit tests also work without accessing `jsonld.default` explicitly, but real browser usage will fail with
73
73
  // just calling `jsonld.flatten`, so please do not remove `default`
74
- const flattened = await jsonld.default.flatten(JSON.parse(str), null, {base: baseString})
74
+ // Handle both ESM (browser) and CommonJS (Node.js) module formats
75
+ // Browser ESM: jsonld.default.flatten
76
+ // Node.js CommonJS: jsonld.flatten
77
+ const jsonldLib = jsonld.default || jsonld
78
+ const flattened = await jsonldLib.flatten(JSON.parse(str), null, {base: baseString})
75
79
  return flattened.reduce((store, flatResource) => processResource(store, base, flatResource), kb)
76
80
  }
77
81
 
package/src/store.ts CHANGED
@@ -53,7 +53,6 @@ import {
53
53
  Quad_Subject,
54
54
  Term,
55
55
  } from './tf-types'
56
- import { namedNode } from './index'
57
56
  import serialize from "./serialize";
58
57
  import BlankNode from './blank-node'
59
58
  import DefaultGraph from './default-graph'
@@ -315,7 +314,7 @@ export default class IndexedFormula extends Formula { // IN future - allow pass
315
314
  var query = new Query('patch')
316
315
  query.pat = patch.where
317
316
  query.pat.statements.map(function (st) {
318
- st.graph = namedNode(target.value)
317
+ st.graph = new NamedNode(target.value)
319
318
  })
320
319
  //@ts-ignore TODO: add sync property to Query when converting Query to typescript
321
320
  query.sync = true