rdflib 2.2.20 → 2.2.21-acff123a

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 (112) 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 -126
  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 +105 -0
  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 -78
  37. package/esm/store.js +831 -1102
  38. package/esm/types.js +22 -21
  39. package/esm/update-manager.js +869 -1104
  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 +28 -19
  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 -129
  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.d.ts +13 -0
  67. package/lib/lists.js +113 -0
  68. package/lib/literal.js +120 -195
  69. package/lib/log.d.ts +0 -6
  70. package/lib/log.js +7 -8
  71. package/lib/n3parser.js +1030 -1436
  72. package/lib/named-node.js +69 -126
  73. package/lib/namespace.js +2 -7
  74. package/lib/node-internal.js +74 -107
  75. package/lib/node.js +2 -12
  76. package/lib/parse.d.ts +1 -1
  77. package/lib/parse.js +12 -32
  78. package/lib/patch-parser.js +11 -34
  79. package/lib/query-to-sparql.js +0 -23
  80. package/lib/query.js +62 -167
  81. package/lib/rdfaparser.js +796 -1009
  82. package/lib/rdfxmlparser.js +349 -466
  83. package/lib/serialize.js +11 -37
  84. package/lib/serializer.js +823 -1064
  85. package/lib/sparql-to-query.js +42 -167
  86. package/lib/statement.js +55 -84
  87. package/lib/store.d.ts +1 -1
  88. package/lib/store.js +850 -1112
  89. package/lib/tf-types.d.ts +4 -4
  90. package/lib/types.d.ts +8 -8
  91. package/lib/types.js +23 -23
  92. package/lib/update-manager.d.ts +1 -1
  93. package/lib/update-manager.js +865 -1101
  94. package/lib/updates-via.js +105 -164
  95. package/lib/uri.js +8 -61
  96. package/lib/utils/default-graph-uri.js +3 -5
  97. package/lib/utils/termValue.js +0 -2
  98. package/lib/utils/terms.d.ts +6 -1
  99. package/lib/utils/terms.js +29 -35
  100. package/lib/utils-js.js +23 -88
  101. package/lib/utils.js +10 -27
  102. package/lib/variable.js +34 -85
  103. package/lib/xsd-internal.js +0 -3
  104. package/lib/xsd.js +2 -6
  105. package/package.json +35 -36
  106. package/src/collection.ts +2 -0
  107. package/src/fetcher.ts +2 -2
  108. package/src/lists.ts +121 -0
  109. package/src/statement.ts +7 -0
  110. package/src/store.ts +7 -7
  111. package/src/update-manager.ts +15 -9
  112. package/src/utils/terms.ts +23 -1
package/esm/index.js CHANGED
@@ -1,15 +1,4 @@
1
- import _createClass from "@babel/runtime/helpers/createClass";
2
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
- import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
4
- import _inherits from "@babel/runtime/helpers/inherits";
5
- import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
6
- import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
-
9
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
10
-
11
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
12
-
13
2
  import BlankNode from './blank-node';
14
3
  import Collection from './collection';
15
4
  import * as convert from './convert';
@@ -40,77 +29,52 @@ import { UpdatesVia } from './updates-via';
40
29
  import * as uri from './uri';
41
30
  import * as Util from './utils-js';
42
31
  import Variable from './variable';
43
- import DataFactory from './factories/rdflib-data-factory'; // Prepare bound versions of data factory methods for export
32
+ import DataFactory from './factories/rdflib-data-factory';
44
33
 
45
- var boundDataFactory = {};
46
-
47
- for (var name in DataFactory) {
34
+ // Prepare bound versions of data factory methods for export
35
+ const boundDataFactory = {};
36
+ for (const name in DataFactory) {
48
37
  if (typeof DataFactory[name] === 'function') boundDataFactory[name] = DataFactory[name].bind(DataFactory);
49
38
  }
50
-
51
- var fetcher = boundDataFactory.fetcher,
52
- graph = boundDataFactory.graph,
53
- lit = boundDataFactory.lit,
54
- st = boundDataFactory.st,
55
- namedNode = boundDataFactory.namedNode,
56
- variable = boundDataFactory.variable,
57
- blankNode = boundDataFactory.blankNode,
58
- defaultGraph = boundDataFactory.defaultGraph,
59
- literal = boundDataFactory.literal,
60
- quad = boundDataFactory.quad,
61
- triple = boundDataFactory.triple;
62
- var formula = new Formula();
63
-
64
- var fromNT = function fromNT(str) {
65
- return formula.fromNT(str);
66
- };
67
-
68
- var term = Node.fromValue; // TODO: this export is broken;
39
+ const {
40
+ fetcher,
41
+ graph,
42
+ lit,
43
+ st,
44
+ namedNode,
45
+ variable,
46
+ blankNode,
47
+ defaultGraph,
48
+ literal,
49
+ quad,
50
+ triple
51
+ } = boundDataFactory;
52
+ const formula = new Formula();
53
+ const fromNT = str => formula.fromNT(str);
54
+ const term = Node.fromValue;
55
+
56
+ // TODO: this export is broken;
69
57
  // it exports the _current_ value of nextId, which is always 0
70
-
71
- var NextId = BlankNode.nextId;
58
+ const NextId = BlankNode.nextId;
72
59
  export * from './utils/terms';
73
- export { BlankNode, Collection, convert, DataFactory, Empty, Fetcher, Formula, Store, jsonParser, Literal, log, N3Parser, NamedNode, Namespace, Node, parse, Query, queryToSPARQL, RDFaProcessor, RDFParser, serialize, Serializer, SPARQLToQuery, sparqlUpdateParser, Statement, term, UpdateManager, UpdatesSocket, UpdatesVia, uri, Util, Variable, Store as IndexedFormula, // Alias
74
- NextId, fromNT, fetcher, graph, lit, st, namedNode as sym, // RDFJS DataFactory interface
60
+ export { BlankNode, Collection, convert, DataFactory, Empty, Fetcher, Formula, Store, jsonParser, Literal, log, N3Parser, NamedNode, Namespace, Node, parse, Query, queryToSPARQL, RDFaProcessor, RDFParser, serialize, Serializer, SPARQLToQuery, sparqlUpdateParser, Statement, term, UpdateManager, UpdatesSocket, UpdatesVia, uri, Util, Variable, Store as IndexedFormula,
61
+ // Alias
62
+
63
+ NextId, fromNT, fetcher, graph, lit, st, namedNode as sym,
64
+ // RDFJS DataFactory interface
75
65
  blankNode, defaultGraph, literal, namedNode, quad, triple, variable };
76
66
  export { termValue } from './utils/termValue';
77
- export var ConnectedStore = /*#__PURE__*/function (_Store) {
78
- _inherits(ConnectedStore, _Store);
79
-
80
- var _super = _createSuper(ConnectedStore);
81
-
82
- function ConnectedStore(features) {
83
- var _this;
84
-
85
- _classCallCheck(this, ConnectedStore);
86
-
87
- _this = _super.call(this, features);
88
-
89
- _defineProperty(_assertThisInitialized(_this), "fetcher", void 0);
90
-
91
- _this.fetcher = new Fetcher(_assertThisInitialized(_this), {});
92
- return _this;
67
+ export class ConnectedStore extends Store {
68
+ constructor(features) {
69
+ super(features);
70
+ _defineProperty(this, "fetcher", void 0);
71
+ this.fetcher = new Fetcher(this, {});
93
72
  }
94
-
95
- return _createClass(ConnectedStore);
96
- }(Store);
97
- export var LiveStore = /*#__PURE__*/function (_ConnectedStore) {
98
- _inherits(LiveStore, _ConnectedStore);
99
-
100
- var _super2 = _createSuper(LiveStore);
101
-
102
- function LiveStore(features) {
103
- var _this2;
104
-
105
- _classCallCheck(this, LiveStore);
106
-
107
- _this2 = _super2.call(this, features);
108
-
109
- _defineProperty(_assertThisInitialized(_this2), "updater", void 0);
110
-
111
- _this2.updater = new UpdateManager(_assertThisInitialized(_this2));
112
- return _this2;
73
+ }
74
+ export class LiveStore extends ConnectedStore {
75
+ constructor(features) {
76
+ super(features);
77
+ _defineProperty(this, "updater", void 0);
78
+ this.updater = new UpdateManager(this);
113
79
  }
114
-
115
- return _createClass(LiveStore);
116
- }(ConnectedStore);
80
+ }
@@ -1,118 +1,97 @@
1
1
  import jsonld from 'jsonld';
2
2
  import { arrayToStatements } from './utils';
3
+
3
4
  /**
4
5
  * Parses json-ld formatted JS objects to a rdf Term.
5
6
  * @param kb - The DataFactory to use.
6
7
  * @param obj - The json-ld object to process.
7
8
  * @return {Literal|NamedNode|BlankNode|Collection}
8
9
  */
9
-
10
10
  export function jsonldObjectToTerm(kb, obj) {
11
11
  if (typeof obj === 'string') {
12
12
  return kb.rdfFactory.literal(obj);
13
13
  }
14
-
15
14
  if (Object.prototype.hasOwnProperty.call(obj, '@list')) {
16
15
  if (kb.rdfFactory.supports["COLLECTIONS"] === true) {
17
16
  return listToCollection(kb, obj['@list']);
18
17
  }
19
-
20
18
  return listToStatements(kb, obj);
21
19
  }
22
-
23
20
  if (Object.prototype.hasOwnProperty.call(obj, '@id')) {
24
21
  return kb.rdfFactory.namedNode(obj['@id']);
25
22
  }
26
-
27
23
  if (Object.prototype.hasOwnProperty.call(obj, '@language')) {
28
24
  return kb.rdfFactory.literal(obj['@value'], obj['@language']);
29
25
  }
30
-
31
26
  if (Object.prototype.hasOwnProperty.call(obj, '@type')) {
32
27
  return kb.rdfFactory.literal(obj['@value'], kb.rdfFactory.namedNode(obj['@type']));
33
28
  }
34
-
35
29
  if (Object.prototype.hasOwnProperty.call(obj, '@value')) {
36
30
  return kb.rdfFactory.literal(obj['@value']);
37
31
  }
38
-
39
32
  return kb.rdfFactory.literal(obj);
40
33
  }
34
+
41
35
  /**
42
36
  * Adds the statements in a json-ld list object to {kb}.
43
37
  */
44
-
45
38
  function listToStatements(kb, obj) {
46
- var listId = obj['@id'] ? kb.rdfFactory.namedNode(obj['@id']) : kb.rdfFactory.blankNode();
47
- var items = obj['@list'].map(function (listItem) {
48
- return jsonldObjectToTerm(kb, listItem);
49
- });
50
- var statements = arrayToStatements(kb.rdfFactory, listId, items);
39
+ const listId = obj['@id'] ? kb.rdfFactory.namedNode(obj['@id']) : kb.rdfFactory.blankNode();
40
+ const items = obj['@list'].map(listItem => jsonldObjectToTerm(kb, listItem));
41
+ const statements = arrayToStatements(kb.rdfFactory, listId, items);
51
42
  kb.addAll(statements);
52
43
  return listId;
53
44
  }
54
-
55
45
  function listToCollection(kb, obj) {
56
46
  if (!Array.isArray(obj)) {
57
47
  throw new TypeError("Object must be an array");
58
48
  }
59
-
60
- return kb.rdfFactory.collection(obj.map(function (o) {
61
- return jsonldObjectToTerm(kb, o);
62
- }));
49
+ return kb.rdfFactory.collection(obj.map(o => jsonldObjectToTerm(kb, o)));
63
50
  }
51
+
64
52
  /**
65
53
  * Takes a json-ld formatted string {str} and adds its statements to {kb}.
66
54
  *
67
55
  * Ensure that {kb.rdfFactory} is a DataFactory.
68
56
  */
69
-
70
-
71
57
  export default function jsonldParser(str, kb, base, callback) {
72
- var baseString = base && Object.prototype.hasOwnProperty.call(base, 'termType') ? base.value : base;
58
+ const baseString = base && Object.prototype.hasOwnProperty.call(base, 'termType') ? base.value : base;
73
59
  return jsonld.flatten(JSON.parse(str), null, {
74
60
  base: baseString
75
- }).then(function (flattened) {
76
- return flattened.reduce(function (store, flatResource) {
77
- kb = processResource(kb, base, flatResource);
78
- return kb;
79
- }, kb);
80
- }).then(callback).catch(callback);
61
+ }).then(flattened => flattened.reduce((store, flatResource) => {
62
+ kb = processResource(kb, base, flatResource);
63
+ return kb;
64
+ }, kb)).then(callback).catch(callback);
81
65
  }
82
-
83
66
  function processResource(kb, base, flatResource) {
84
- var id = flatResource['@id'] ? kb.rdfFactory.namedNode(flatResource['@id']) : kb.rdfFactory.blankNode();
85
-
86
- for (var _i = 0, _Object$keys = Object.keys(flatResource); _i < _Object$keys.length; _i++) {
87
- var property = _Object$keys[_i];
88
-
67
+ const id = flatResource['@id'] ? kb.rdfFactory.namedNode(flatResource['@id']) : kb.rdfFactory.blankNode();
68
+ for (const property of Object.keys(flatResource)) {
89
69
  if (property === '@id') {
90
70
  continue;
91
71
  } else if (property == '@graph') {
92
72
  // the JSON-LD flattened structure may contain nested graphs
93
73
  // the id value for this object is the new base (named graph id) for all nested flat resources
94
- var graphId = id; // this is an array of resources
95
-
96
- var nestedFlatResources = flatResource[property]; // recursively process all flat resources in the array, but with the graphId as base.
74
+ const graphId = id;
75
+ // this is an array of resources
76
+ const nestedFlatResources = flatResource[property];
97
77
 
98
- for (var i = 0; i < nestedFlatResources.length; i++) {
78
+ // recursively process all flat resources in the array, but with the graphId as base.
79
+ for (let i = 0; i < nestedFlatResources.length; i++) {
99
80
  kb = processResource(kb, graphId, nestedFlatResources[i]);
100
81
  }
101
82
  }
102
-
103
- var value = flatResource[property];
104
-
83
+ const value = flatResource[property];
105
84
  if (Array.isArray(value)) {
106
- for (var _i2 = 0; _i2 < value.length; _i2++) {
107
- kb.addStatement(createStatement(kb, id, property, value[_i2], base));
85
+ for (let i = 0; i < value.length; i++) {
86
+ kb.addStatement(createStatement(kb, id, property, value[i], base));
108
87
  }
109
88
  } else {
110
89
  kb.addStatement(createStatement(kb, id, property, value, base));
111
90
  }
112
91
  }
113
-
114
92
  return kb;
115
93
  }
94
+
116
95
  /**
117
96
  * Create statement quad depending on @type being a type node
118
97
  * @param kb
@@ -121,11 +100,8 @@ function processResource(kb, base, flatResource) {
121
100
  * @param value
122
101
  * @return quad statement
123
102
  */
124
-
125
-
126
103
  function createStatement(kb, id, property, value, base) {
127
- var predicate, object;
128
-
104
+ let predicate, object;
129
105
  if (property === "@type") {
130
106
  predicate = kb.rdfFactory.namedNode("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
131
107
  object = kb.rdfFactory.namedNode(value);
@@ -133,6 +109,5 @@ function createStatement(kb, id, property, value, base) {
133
109
  predicate = kb.rdfFactory.namedNode(property);
134
110
  object = jsonldObjectToTerm(kb, value);
135
111
  }
136
-
137
112
  return kb.rdfFactory.quad(id, predicate, object, kb.rdfFactory.namedNode(base));
138
113
  }
package/esm/jsonparser.js CHANGED
@@ -1,10 +1,9 @@
1
1
  export default (function () {
2
2
  return {
3
- parseJSON: function parseJSON(data, source, store) {
3
+ parseJSON: function (data, source, store) {
4
4
  var subject, predicate, object;
5
5
  var bnodes = {};
6
6
  var why = store.sym(source);
7
-
8
7
  for (var x in data) {
9
8
  if (x.indexOf('_:') === 0) {
10
9
  if (bnodes[x]) {
@@ -16,16 +15,12 @@ export default (function () {
16
15
  } else {
17
16
  subject = store.sym(x);
18
17
  }
19
-
20
18
  var preds = data[x];
21
-
22
19
  for (var y in preds) {
23
20
  var objects = preds[y];
24
21
  predicate = store.sym(y);
25
-
26
22
  for (var z in objects) {
27
23
  var obj = objects[z];
28
-
29
24
  if (obj.type === 'uri') {
30
25
  object = store.sym(obj.value);
31
26
  store.add(subject, predicate, object, why);
@@ -36,7 +31,6 @@ export default (function () {
36
31
  object = store.bnode(obj.value);
37
32
  bnodes[obj.value] = object;
38
33
  }
39
-
40
34
  store.add(subject, predicate, object, why);
41
35
  } else if (obj.type === 'Literal') {
42
36
  // var datatype
@@ -47,7 +41,6 @@ export default (function () {
47
41
  } else {
48
42
  object = store.literal(obj.value);
49
43
  }
50
-
51
44
  store.add(subject, predicate, object, why);
52
45
  } else {
53
46
  throw new Error('error: unexpected termtype: ' + z.type);
package/esm/lists.js ADDED
@@ -0,0 +1,105 @@
1
+ /* Lists form conversion
2
+ */
3
+
4
+ // import DataFactory from './factories/extended-term-factory'
5
+ // import jsonldParser from './jsonldparser'
6
+ // @ts-ignore is this injected?
7
+ // @@ Goal: remove this dependency
8
+ // import N3Parser from './n3parser'
9
+ // import { parseRDFaDOM } from './rdfaparser'
10
+ // import RDFParser from './rdfxmlparser'
11
+ // import sparqlUpdateParser from './patch-parser'
12
+ // import * as Util from './utils-js'
13
+
14
+ // import BlankNode from './blank-node'
15
+ // import NamedNode from './named-node'
16
+ import Collection from './collection';
17
+ import Statement from './statement';
18
+ // import Formula from './formula'
19
+
20
+ import Namespace from './namespace';
21
+ const RDF = Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
22
+
23
+ /* Replace a given node with another node throughout a given document
24
+ *
25
+ * we do the predicate as well for complenesss though we don't expect Collections to use it
26
+ */
27
+ export function substituteInDoc(store, x, y, doc) {
28
+ // console.log(`substituteInDoc put ${x} for ${y} in ${doc}}`)
29
+ for (const quad of store.statementsMatching(y, null, null, doc)) {
30
+ const newStatement = new Statement(x, quad.predicate, quad.object, doc);
31
+ store.remove(quad);
32
+ store.add(newStatement);
33
+ }
34
+ for (const quad of store.statementsMatching(null, y, null, doc)) {
35
+ store.remove(quad);
36
+ // console.log(` substituteInDoc predicate ${x} in ${quad}}`)
37
+ store.add(new Statement(quad.subject, x, quad.object, doc));
38
+ }
39
+ for (const quad of store.statementsMatching(null, null, y, doc)) {
40
+ store.remove(quad);
41
+ store.add(new Statement(quad.subject, quad.predicate, x, doc));
42
+ }
43
+ }
44
+
45
+ /* Change all lone rdf:nil nodes into empty Collections
46
+ */
47
+ export function substituteNillsInDoc(store, doc) {
48
+ const x = RDF('nil');
49
+ for (const quad of store.statementsMatching(x, null, null, doc)) {
50
+ store.remove(quad);
51
+ const y = new Collection();
52
+ store.add(new Statement(y, quad.predicate, quad.object, doc));
53
+ }
54
+ for (const quad of store.statementsMatching(null, null, x, doc)) {
55
+ if (!quad.predicate.sameTerm(RDF('rest'))) {
56
+ // If not a tail
57
+ store.remove(quad);
58
+ const y = new Collection();
59
+ store.add(new Statement(quad.subject, quad.predicate, y, doc));
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Convert lists reified as rdf:first, rest
65
+ * Normal method is sync.
66
+ * Unfortunately jsdonld is currently written to need to be called async.
67
+ * Hence the mess below with executeCallback.
68
+ * @param store - The quadstore
69
+ * @param doc - The document in which the conversion is done
70
+ */
71
+
72
+ export function convertFirstRestNil(store, doc // Do whole store?
73
+ ) {
74
+ function preceding(ele, listSoFar, trash) {
75
+ const rests = store.statementsMatching(ele, RDF('rest'), null, doc);
76
+ if (rests.length !== 1) throw new Error(`Bad list structure: no rest at ${ele}`);
77
+ const firsts = store.statementsMatching(ele, RDF('first'), null, doc);
78
+ if (firsts.length !== 1) throw new Error(`Bad list structure: rest but ${firsts.length} firsts at ${ele}`);
79
+ const value = firsts[0].object;
80
+ const total = [value].concat(listSoFar);
81
+ // console.log(' List now is: ', total)
82
+ const totalTrash = trash.concat(rests).concat(firsts);
83
+ const pres = store.statementsMatching(null, RDF('rest'), ele, doc);
84
+ if (pres.length === 0) {
85
+ // Head of the list
86
+ const newList = new Collection(total);
87
+ store.remove(totalTrash);
88
+ // Replace old list with new list:
89
+ substituteInDoc(store, newList, ele, doc);
90
+ return;
91
+ }
92
+ if (pres.length !== 1) throw new Error(`Bad list structure: ${pres.length} pres at ${ele}`);
93
+ const pre = pres[0].subject;
94
+ if (pre.termType !== 'BlankNode') throw new Error(`Bad list element node ${pre} type: ${pre.termType} `);
95
+ preceding(pre, total, totalTrash);
96
+ return;
97
+ }
98
+ substituteNillsInDoc(store, doc); // lone ones only
99
+
100
+ const tails = store.statementsMatching(null, RDF('rest'), RDF('nil'), doc);
101
+ tails.forEach(tail => {
102
+ if (tail.subject.termType !== 'BlankNode') throw new Error(`Bad list element node ${tail.subject} type: ${tail.subject.termType} `);
103
+ preceding(tail.subject, [], []);
104
+ });
105
+ }