@semapps/semantic-data-provider 1.0.4 → 1.1.0-patch.1

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/dist/index.es.js CHANGED
@@ -1,11 +1,14 @@
1
- import $fj9kP$urljoin from "url-join";
1
+ import $fj9kP$speakingurl from "speakingurl";
2
2
  import $fj9kP$jsonld from "jsonld";
3
3
  import $fj9kP$rdfjsdatamodel, {triple as $fj9kP$triple, variable as $fj9kP$variable, namedNode as $fj9kP$namedNode} from "@rdfjs/data-model";
4
4
  import {Generator as $fj9kP$Generator} from "sparqljs";
5
5
  import $fj9kP$cryptojsmd5 from "crypto-js/md5";
6
+ import {fetchUtils as $fj9kP$fetchUtils, useDataProvider as $fj9kP$useDataProvider, DataProviderContext as $fj9kP$DataProviderContext, useRecordContext as $fj9kP$useRecordContext, useGetList as $fj9kP$useGetList, ArrayInput as $fj9kP$ArrayInput, SimpleFormIterator as $fj9kP$SimpleFormIterator, TextInput as $fj9kP$TextInput} from "react-admin";
7
+ import $fj9kP$urljoin from "url-join";
6
8
  import $fj9kP$jwtdecode from "jwt-decode";
7
- import {fetchUtils as $fj9kP$fetchUtils, DataProviderContext as $fj9kP$DataProviderContext, useDataProvider as $fj9kP$useDataProvider, useRecordContext as $fj9kP$useRecordContext, useGetList as $fj9kP$useGetList, ArrayInput as $fj9kP$ArrayInput, SimpleFormIterator as $fj9kP$SimpleFormIterator, TextInput as $fj9kP$TextInput} from "react-admin";
8
- import $fj9kP$react, {useContext as $fj9kP$useContext, useMemo as $fj9kP$useMemo, useCallback as $fj9kP$useCallback, useState as $fj9kP$useState, useEffect as $fj9kP$useEffect} from "react";
9
+ import $fj9kP$httplinkheader from "http-link-header";
10
+ import {capitalCase as $fj9kP$capitalCase} from "change-case";
11
+ import $fj9kP$react, {useState as $fj9kP$useState, useEffect as $fj9kP$useEffect, useMemo as $fj9kP$useMemo, useCallback as $fj9kP$useCallback, useContext as $fj9kP$useContext} from "react";
9
12
  import {jsx as $fj9kP$jsx, Fragment as $fj9kP$Fragment, jsxs as $fj9kP$jsxs} from "react/jsx-runtime";
10
13
  import $fj9kP$muistylesmakeStyles from "@mui/styles/makeStyles";
11
14
 
@@ -18,10 +21,10 @@ const $336b7edf722fe53e$var$fetchResource = async (resourceUri, config)=>{
18
21
  const { httpClient: httpClient, jsonContext: jsonContext } = config;
19
22
  let { json: data } = await httpClient(resourceUri);
20
23
  if (!data) throw new Error(`Not a valid JSON: ${resourceUri}`);
21
- data.id = data.id || data["@id"];
24
+ data.id = data.id || data['@id'];
22
25
  // We compact only if the context is different between the frontend and the middleware
23
26
  // TODO deep compare if the context is an object
24
- if (data["@context"] !== jsonContext) data = await (0, $fj9kP$jsonld).compact(data, jsonContext);
27
+ if (data['@context'] !== jsonContext) data = await (0, $fj9kP$jsonld).compact(data, jsonContext);
25
28
  return data;
26
29
  };
27
30
  var $336b7edf722fe53e$export$2e2bcd8739ae039 = $336b7edf722fe53e$var$fetchResource;
@@ -63,32 +66,34 @@ const $ed447224dd38ce82$var$getOneMethod = (config)=>async (resourceId, params)=
63
66
  var $ed447224dd38ce82$export$2e2bcd8739ae039 = $ed447224dd38ce82$var$getOneMethod;
64
67
 
65
68
 
66
-
67
- const $b17c43e3301545ca$var$isFile = (o)=>o?.rawFile && o.rawFile instanceof File;
68
- const $b17c43e3301545ca$var$isFileToDelete = (o)=>o?.fileToDelete !== undefined && o?.fileToDelete !== null;
69
- const $b17c43e3301545ca$var$getUploadsContainerUri = (config, serverKey)=>{
70
- // If no server key is defined, or if the server has no uploads container, find any server with a uploads container
71
- if (!serverKey || !config.dataServers[serverKey].uploadsContainer) serverKey = Object.keys(config.dataServers).find((key)=>config.dataServers[key].uploadsContainer);
72
- if (serverKey) return (0, $fj9kP$urljoin)(config.dataServers[serverKey].baseUrl, config.dataServers[serverKey].uploadsContainer);
69
+ const $c35ffbda15247c32$var$getUploadsContainerUri = (config, serverKey)=>{
70
+ // If no server key is defined or if the server has no uploads container, find any server with a uploads container
71
+ if (!serverKey || !config.dataServers[serverKey].containers || !config.dataServers[serverKey].containers?.find((c)=>c.binaryResources)) serverKey = Object.keys(config.dataServers).find((key)=>config.dataServers[key].containers?.find((c)=>c.binaryResources));
72
+ if (serverKey) return config.dataServers[serverKey].containers?.find((c)=>c.binaryResources)?.uri;
73
73
  else // No server has an uploads container
74
74
  return null;
75
75
  };
76
+ var $c35ffbda15247c32$export$2e2bcd8739ae039 = $c35ffbda15247c32$var$getUploadsContainerUri;
77
+
78
+
79
+ const $b17c43e3301545ca$var$isFile = (o)=>o?.rawFile && o.rawFile instanceof File;
80
+ const $b17c43e3301545ca$var$isFileToDelete = (o)=>o?.fileToDelete !== undefined && o?.fileToDelete !== null;
76
81
  const $b17c43e3301545ca$export$a5575dbeeffdad98 = async (rawFile, config, serverKey)=>{
77
- const uploadsContainerUri = $b17c43e3301545ca$var$getUploadsContainerUri(config, serverKey);
78
- if (!uploadsContainerUri) throw new Error("You must define an uploadsContainer in one of the server's configuration");
82
+ const uploadsContainerUri = (0, $c35ffbda15247c32$export$2e2bcd8739ae039)(config, serverKey);
83
+ if (!uploadsContainerUri) throw new Error("You must define an container with binaryResources in one of the server's configuration");
79
84
  const response = await config.httpClient(uploadsContainerUri, {
80
- method: "POST",
85
+ method: 'POST',
81
86
  body: rawFile,
82
87
  headers: new Headers({
83
- "Content-Type": rawFile.type
88
+ 'Content-Type': rawFile.type
84
89
  })
85
90
  });
86
- if (response.status === 201) return response.headers.get("Location");
91
+ if (response.status === 201) return response.headers.get('Location');
87
92
  return null;
88
93
  };
89
94
  const $b17c43e3301545ca$var$deleteFiles = async (filesToDelete, config)=>{
90
95
  return Promise.all(filesToDelete.map((file)=>config.httpClient(file, {
91
- method: "DELETE"
96
+ method: 'DELETE'
92
97
  })));
93
98
  };
94
99
  /*
@@ -130,74 +135,72 @@ var $b17c43e3301545ca$export$2e2bcd8739ae039 = {
130
135
  };
131
136
 
132
137
 
133
-
134
138
  const $8326b88c1a913ca9$var$getServerKeyFromType = (type, dataServers)=>{
135
- return Object.keys(dataServers).find((key)=>{
139
+ return dataServers && Object.keys(dataServers).find((key)=>{
136
140
  return dataServers[key][type];
137
141
  });
138
142
  };
139
143
  var $8326b88c1a913ca9$export$2e2bcd8739ae039 = $8326b88c1a913ca9$var$getServerKeyFromType;
140
144
 
141
145
 
142
- const $64441f6e76bd15b6$var$parseServerKey = (serverKey, dataServers)=>{
146
+ const $99cc2e4a2a3c100b$var$parseServerKey = (serverKey, dataServers)=>{
143
147
  switch(serverKey){
144
- case "@default":
145
- return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("default", dataServers);
146
- case "@pod":
147
- return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("pod", dataServers);
148
- case "@authServer":
149
- return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("authServer", dataServers);
148
+ case '@default':
149
+ return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('default', dataServers);
150
+ case '@pod':
151
+ return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('pod', dataServers);
152
+ case '@authServer':
153
+ return (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('authServer', dataServers);
150
154
  default:
151
155
  return serverKey;
152
156
  }
153
157
  };
154
158
  // Return the list of servers keys in an array
155
159
  // parsing keywords like @all, @default, @pod and @authServer
156
- const $64441f6e76bd15b6$var$parseServerKeys = (serverKeys, dataServers)=>{
160
+ const $99cc2e4a2a3c100b$var$parseServerKeys = (serverKeys, dataServers)=>{
157
161
  if (Array.isArray(serverKeys)) {
158
- if (serverKeys.includes("@all")) return Object.keys(dataServers);
159
- return serverKeys.map((serverKey)=>$64441f6e76bd15b6$var$parseServerKey(serverKey, dataServers));
160
- }
161
- if (typeof serverKeys === "string") {
162
- if (serverKeys === "@all") return Object.keys(dataServers);
163
- if (serverKeys === "@remote") {
164
- const defaultServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("default", dataServers);
162
+ if (serverKeys.includes('@all')) return Object.keys(dataServers);
163
+ else return serverKeys.map((serverKey)=>$99cc2e4a2a3c100b$var$parseServerKey(serverKey, dataServers));
164
+ } else if (typeof serverKeys === 'string') {
165
+ if (serverKeys === '@all') return Object.keys(dataServers);
166
+ else if (serverKeys === '@remote') {
167
+ const defaultServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('default', dataServers);
165
168
  return Object.keys(dataServers).filter((serverKey)=>serverKey !== defaultServerKey);
166
- }
167
- return [
168
- $64441f6e76bd15b6$var$parseServerKey(serverKeys, dataServers)
169
+ } else return [
170
+ $99cc2e4a2a3c100b$var$parseServerKey(serverKeys, dataServers)
169
171
  ];
170
- }
171
- // If server key is empty
172
- return false;
172
+ } else throw new Error(`The parseServerKeys expect a list of server keys, or keywords`);
173
173
  };
174
- var $64441f6e76bd15b6$export$2e2bcd8739ae039 = $64441f6e76bd15b6$var$parseServerKeys;
175
-
176
-
177
- const $15b841e67a1ba752$var$findContainersWithTypes = (types, serverKeys, dataServers)=>{
178
- const containers = {};
179
- const existingContainers = [];
180
- const parsedServerKeys = (0, $64441f6e76bd15b6$export$2e2bcd8739ae039)(serverKeys, dataServers);
181
- Object.keys(dataServers).filter((dataServerKey)=>dataServers[dataServerKey].containers).forEach((dataServerKey)=>{
182
- Object.keys(dataServers[dataServerKey].containers || {}).forEach((containerKey)=>{
183
- if (!parsedServerKeys || parsedServerKeys.includes(containerKey)) Object.keys(dataServers[dataServerKey].containers[containerKey]).forEach((type)=>{
184
- if (types.includes(type)) dataServers[dataServerKey].containers[containerKey][type].map((path)=>{
185
- const containerUri = (0, $fj9kP$urljoin)(dataServers[containerKey].baseUrl, path);
186
- // Avoid returning the same container several times
187
- if (!existingContainers.includes(containerUri)) {
188
- existingContainers.push(containerUri);
189
- if (!containers[dataServerKey]) containers[dataServerKey] = [];
190
- containers[dataServerKey].push(containerUri);
191
- }
192
- });
193
- });
174
+ var $99cc2e4a2a3c100b$export$2e2bcd8739ae039 = $99cc2e4a2a3c100b$var$parseServerKeys;
175
+
176
+
177
+ /**
178
+ * Return all containers matching the given types
179
+ */ const $15b841e67a1ba752$var$findContainersWithTypes = (types, serverKeys, dataServers)=>{
180
+ const matchingContainers = [];
181
+ const parsedServerKeys = (0, $99cc2e4a2a3c100b$export$2e2bcd8739ae039)(serverKeys || '@all', dataServers);
182
+ Object.keys(dataServers).forEach((dataServerKey)=>{
183
+ if (parsedServerKeys.includes(dataServerKey)) dataServers[dataServerKey].containers?.forEach((container)=>{
184
+ if (container.types?.some((t)=>types.includes(t))) matchingContainers.push(container);
194
185
  });
195
186
  });
196
- return containers;
187
+ return matchingContainers;
197
188
  };
198
189
  var $15b841e67a1ba752$export$2e2bcd8739ae039 = $15b841e67a1ba752$var$findContainersWithTypes;
199
190
 
200
191
 
192
+ const $7c772a9c0c25a69d$var$findContainersWithURIs = (containersUris, dataServers)=>{
193
+ const matchingContainers = [];
194
+ Object.keys(dataServers).forEach((serverKey)=>{
195
+ dataServers[serverKey].containers?.forEach((container)=>{
196
+ if (container.uri && containersUris.includes(container.uri)) matchingContainers.push(container);
197
+ });
198
+ });
199
+ return matchingContainers;
200
+ };
201
+ var $7c772a9c0c25a69d$export$2e2bcd8739ae039 = $7c772a9c0c25a69d$var$findContainersWithURIs;
202
+
203
+
201
204
  const $5a7a2f7583392866$var$createMethod = (config)=>async (resourceId, params)=>{
202
205
  const { dataServers: dataServers, resources: resources, httpClient: httpClient, jsonContext: jsonContext } = config;
203
206
  const dataModel = resources[resourceId];
@@ -206,47 +209,49 @@ const $5a7a2f7583392866$var$createMethod = (config)=>async (resourceId, params)=
206
209
  let containerUri;
207
210
  let serverKey;
208
211
  if (dataModel.create?.container) {
209
- serverKey = Object.keys(dataModel.create.container)[0];
210
- containerUri = (0, $fj9kP$urljoin)(dataServers[serverKey].baseUrl, Object.values(dataModel.create.container)[0]);
212
+ const [container] = (0, $7c772a9c0c25a69d$export$2e2bcd8739ae039)([
213
+ dataModel.create?.container
214
+ ], dataServers);
215
+ serverKey = container.server;
216
+ containerUri = container.uri;
211
217
  } else {
212
218
  serverKey = dataModel.create?.server || Object.keys(dataServers).find((key)=>dataServers[key].default === true);
213
- if (!serverKey) throw new Error("You must define a server for the creation, or a container, or a default server");
219
+ if (!serverKey) throw new Error('You must define a server for the creation, or a container, or a default server');
214
220
  const containers = (0, $15b841e67a1ba752$export$2e2bcd8739ae039)(dataModel.types, [
215
221
  serverKey
216
222
  ], dataServers);
217
- // Extract the containerUri from the results (and ensure there is only one)
218
- const serverKeys = Object.keys(containers);
219
- if (!serverKeys || serverKeys.length === 0) throw new Error(`No container with types ${JSON.stringify(dataModel.types)} found on server ${serverKey}`);
220
- if (serverKeys.length > 1 || containers[serverKeys[0]].length > 1) throw new Error(`More than one container detected with types ${JSON.stringify(dataModel.types)} on server ${serverKey}`);
221
- containerUri = containers[serverKeys[0]][0];
223
+ if (!containers || containers.length === 0) throw new Error(`No container with types ${JSON.stringify(dataModel.types)} found on server ${serverKey}`);
224
+ if (containers.length > 1) throw new Error(`More than one container detected with types ${JSON.stringify(dataModel.types)} on server ${serverKey}`);
225
+ containerUri = containers[0].uri;
222
226
  }
223
227
  if (params.data) {
224
228
  if (dataModel.fieldsMapping?.title) {
225
- if (Array.isArray(dataModel.fieldsMapping.title)) headers.set("Slug", dataModel.fieldsMapping.title.map((f)=>params.data[f]).join(" "));
226
- else headers.set("Slug", params.data[dataModel.fieldsMapping.title]);
229
+ const slug = Array.isArray(dataModel.fieldsMapping.title) ? dataModel.fieldsMapping.title.map((f)=>params.data[f]).join(' ') : params.data[dataModel.fieldsMapping.title];
230
+ // Generate slug here, otherwise we may get errors with special characters
231
+ headers.set('Slug', (0, $fj9kP$speakingurl)(slug));
227
232
  }
228
233
  // Upload files, if there are any
229
234
  const { updatedRecord: updatedRecord } = await (0, $b17c43e3301545ca$export$2e2bcd8739ae039).upload(params.data, config, serverKey);
230
235
  params.data = updatedRecord;
231
236
  const { headers: responseHeaders } = await httpClient(containerUri, {
232
- method: "POST",
237
+ method: 'POST',
233
238
  headers: headers,
234
239
  body: JSON.stringify({
235
- "@context": jsonContext,
236
- "@type": dataModel.types,
240
+ '@context': jsonContext,
241
+ '@type': dataModel.types,
237
242
  ...params.data
238
243
  })
239
244
  });
240
245
  // Retrieve newly-created resource
241
- const resourceUri = responseHeaders.get("Location");
246
+ const resourceUri = responseHeaders.get('Location');
242
247
  return await (0, $ed447224dd38ce82$export$2e2bcd8739ae039)(config)(resourceId, {
243
248
  id: resourceUri
244
249
  });
245
250
  }
246
251
  if (params.id) {
247
- headers.set("Content-Type", "application/sparql-update");
252
+ headers.set('Content-Type', 'application/sparql-update');
248
253
  await httpClient(containerUri, {
249
- method: "PATCH",
254
+ method: 'PATCH',
250
255
  headers: headers,
251
256
  body: `
252
257
  PREFIX ldp: <http://www.w3.org/ns/ldp#>
@@ -266,7 +271,7 @@ var $5a7a2f7583392866$export$2e2bcd8739ae039 = $5a7a2f7583392866$var$createMetho
266
271
  const $9510970b8e7eb9e2$var$deleteMethod = (config)=>async (resourceId, params)=>{
267
272
  const { httpClient: httpClient } = config;
268
273
  await httpClient(`${params.id}`, {
269
- method: "DELETE"
274
+ method: 'DELETE'
270
275
  });
271
276
  if (params.meta?.filesToDelete) await (0, $b17c43e3301545ca$export$2e2bcd8739ae039).delete(params.meta.filesToDelete, config);
272
277
  return {
@@ -283,7 +288,7 @@ const $298dd1ae21173ea0$var$deleteManyMethod = (config)=>async (resourceId, para
283
288
  const ids = [];
284
289
  for (const id of params.ids)try {
285
290
  await httpClient(id, {
286
- method: "DELETE"
291
+ method: 'DELETE'
287
292
  });
288
293
  ids.push(id);
289
294
  } catch (e) {
@@ -324,24 +329,23 @@ var $cc8adac4b83414eb$export$2e2bcd8739ae039 = $cc8adac4b83414eb$var$arrayOf;
324
329
 
325
330
 
326
331
  const $aba124ea15ea8bc6$var$isValidLDPContainer = (container)=>{
327
- const resourceType = container.type || container["@type"];
328
- return Array.isArray(resourceType) ? resourceType.includes("ldp:Container") : resourceType === "ldp:Container";
332
+ const resourceType = container.type || container['@type'];
333
+ return Array.isArray(resourceType) ? resourceType.includes('ldp:Container') : resourceType === 'ldp:Container';
329
334
  };
330
335
  const $aba124ea15ea8bc6$var$isObject = (val)=>{
331
- return val != null && typeof val === "object" && !Array.isArray(val);
336
+ return val != null && typeof val === 'object' && !Array.isArray(val);
332
337
  };
333
338
  const $aba124ea15ea8bc6$var$fetchContainers = async (containers, params, { httpClient: httpClient, jsonContext: jsonContext })=>{
334
- const containersUri = Object.values(containers).flat();
335
- const fetchPromises = containersUri.map((containerUri)=>httpClient(containerUri).then(async ({ json: json })=>{
339
+ const fetchPromises = containers.map((container)=>httpClient(container.uri).then(async ({ json: json })=>{
336
340
  const jsonResponse = json;
337
341
  // If container's context is different, compact it to have an uniform result
338
342
  // TODO deep compare if the context is an object
339
- if (jsonResponse["@context"] !== jsonContext) return (0, $fj9kP$jsonld).compact(jsonResponse, jsonContext);
343
+ if (jsonResponse['@context'] !== jsonContext) return (0, $fj9kP$jsonld).compact(jsonResponse, jsonContext);
340
344
  return jsonResponse;
341
345
  }).then((json)=>{
342
- if (!$aba124ea15ea8bc6$var$isValidLDPContainer(json)) throw new Error(`${containerUri} is not a LDP container`);
343
- return (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(json["ldp:contains"]).map((resource)=>({
344
- "@context": json["@context"],
346
+ if (!$aba124ea15ea8bc6$var$isValidLDPContainer(json)) throw new Error(`${container.uri} is not a LDP container`);
347
+ return (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(json['ldp:contains']).map((resource)=>({
348
+ '@context': json['@context'],
345
349
  ...resource
346
350
  }));
347
351
  }));
@@ -349,7 +353,7 @@ const $aba124ea15ea8bc6$var$fetchContainers = async (containers, params, { httpC
349
353
  const results = await Promise.all(fetchPromises);
350
354
  let resources = results.flat();
351
355
  resources = resources.map((resource)=>{
352
- resource.id = resource.id || resource["@id"];
356
+ resource.id = resource.id || resource['@id'];
353
357
  return resource;
354
358
  });
355
359
  // Apply filter to results
@@ -363,20 +367,20 @@ const $aba124ea15ea8bc6$var$fetchContainers = async (containers, params, { httpC
363
367
  if (filters._predicates && Array.isArray(filters._predicates)) {
364
368
  const predicates = filters._predicates;
365
369
  const mandatoryAttributes = [
366
- "id"
370
+ 'id'
367
371
  ];
368
372
  resources = resources.map((resource)=>{
369
373
  return Object.keys(resource).filter((key)=>predicates.includes(key) || mandatoryAttributes.includes(key)).reduce((filteredResource, key)=>{
370
374
  filteredResource[key] = resource[key];
371
375
  return filteredResource;
372
376
  }, {
373
- "@context": []
377
+ '@context': []
374
378
  });
375
379
  });
376
380
  }
377
381
  if (Object.keys(filters).filter((f)=>![
378
- "_predicates",
379
- "_servers"
382
+ '_predicates',
383
+ '_servers'
380
384
  ].includes(f)).length > 0) resources = resources.filter((resource)=>{
381
385
  // Full text filtering
382
386
  if (filters.q) return Object.values(resource).some((attributeValue)=>{
@@ -385,7 +389,7 @@ const $aba124ea15ea8bc6$var$fetchContainers = async (containers, params, { httpC
385
389
  attributeValue
386
390
  ];
387
391
  return arrayValues.some((value)=>{
388
- if (typeof value === "string") return value.toLowerCase().normalize("NFD").includes(filters.q.toLowerCase().normalize("NFD"));
392
+ if (typeof value === 'string') return value.toLowerCase().normalize('NFD').includes(filters.q.toLowerCase().normalize('NFD'));
389
393
  return false;
390
394
  });
391
395
  }
@@ -393,24 +397,24 @@ const $aba124ea15ea8bc6$var$fetchContainers = async (containers, params, { httpC
393
397
  });
394
398
  // Attribute filtering
395
399
  const attributesFilters = Object.keys(filters).filter((f)=>![
396
- "_predicates",
397
- "_servers",
398
- "q"
400
+ '_predicates',
401
+ '_servers',
402
+ 'q'
399
403
  ].includes(f));
400
404
  return attributesFilters.every((attribute)=>{
401
405
  if (resource[attribute]) {
402
406
  const arrayValues = Array.isArray(resource[attribute]) ? resource[attribute] : [
403
407
  resource[attribute]
404
408
  ];
405
- return arrayValues.some((value)=>typeof value === "string" && value.includes(filters[attribute]));
409
+ return arrayValues.some((value)=>typeof value === 'string' && value.includes(filters[attribute]));
406
410
  }
407
411
  return false;
408
412
  });
409
413
  });
410
414
  // Sorting
411
415
  if (params.sort) resources = resources.sort((a, b)=>{
412
- if (params.sort.order === "ASC") return (a[params.sort.field] ?? "").localeCompare(b[params.sort.field] ?? "");
413
- return (b[params.sort.field] ?? "").localeCompare(a[params.sort.field] ?? "");
416
+ if (params.sort.order === 'ASC') return (a[params.sort.field] ?? '').localeCompare(b[params.sort.field] ?? '');
417
+ return (b[params.sort.field] ?? '').localeCompare(a[params.sort.field] ?? '');
414
418
  });
415
419
  // Pagination
416
420
  const total = resources.length;
@@ -429,7 +433,7 @@ const $3007d5479dd82d51$var$getEmbedFrame = (blankNodes)=>{
429
433
  let predicates;
430
434
  if (blankNodes) {
431
435
  for (const blankNode of blankNodes){
432
- if (blankNode.includes("/")) predicates = blankNode.split("/").reverse();
436
+ if (blankNode.includes('/')) predicates = blankNode.split('/').reverse();
433
437
  else predicates = [
434
438
  blankNode
435
439
  ];
@@ -437,7 +441,7 @@ const $3007d5479dd82d51$var$getEmbedFrame = (blankNodes)=>{
437
441
  ...embedFrame,
438
442
  ...predicates.reduce((accumulator, predicate)=>({
439
443
  [predicate]: {
440
- "@embed": "@last",
444
+ '@embed': '@last',
441
445
  ...accumulator
442
446
  }
443
447
  }), {})
@@ -451,30 +455,31 @@ var $3007d5479dd82d51$export$2e2bcd8739ae039 = $3007d5479dd82d51$var$getEmbedFra
451
455
 
452
456
 
453
457
 
454
- const $564e5d81f6496048$var$resolvePrefix = (item, ontologies)=>{
455
- if (item.startsWith("http://") || item.startsWith("https://")) // Already resolved, return the URI
458
+ const $4872a1c30c1fc60e$var$getUriFromPrefix = (item, ontologies)=>{
459
+ if (item.startsWith('http://') || item.startsWith('https://')) // Already resolved, return the URI
456
460
  return item;
457
- if (item === "a") // Special case
458
- return "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
459
- const [prefix, value] = item.split(":");
460
- if (value) {
461
- const ontology = ontologies.find((ontology)=>ontology.prefix === prefix);
462
- if (ontology) return ontology.url + value;
463
- throw new Error(`No ontology found with prefix ${prefix}`);
464
- } else throw new Error(`The value "${item}" is not correct. It must include a prefix or be a full URI.`);
461
+ else if (item === 'a') // Special case
462
+ return 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
463
+ else {
464
+ const [prefix, value] = item.split(':');
465
+ if (value) {
466
+ if (ontologies[prefix]) return ontologies[prefix] + value;
467
+ else throw new Error(`No ontology found with prefix ${prefix}`);
468
+ } else throw new Error(`The value "${item}" is not correct. It must include a prefix or be a full URI.`);
469
+ }
465
470
  };
466
- var $564e5d81f6496048$export$2e2bcd8739ae039 = $564e5d81f6496048$var$resolvePrefix;
471
+ var $4872a1c30c1fc60e$export$2e2bcd8739ae039 = $4872a1c30c1fc60e$var$getUriFromPrefix;
467
472
 
468
473
 
469
474
  const $47d734d7812e6861$var$defaultToArray = (value)=>!value ? [] : Array.isArray(value) ? value : [
470
475
  value
471
476
  ];
472
477
  // We need to always include the type or React-Admin will not work properly
473
- const $47d734d7812e6861$var$typeQuery = (0, $fj9kP$triple)((0, $fj9kP$variable)("s1"), (0, $fj9kP$namedNode)("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), (0, $fj9kP$variable)("type"));
478
+ const $47d734d7812e6861$var$typeQuery = (0, $fj9kP$triple)((0, $fj9kP$variable)('s1'), (0, $fj9kP$namedNode)('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), (0, $fj9kP$variable)('type'));
474
479
  const $47d734d7812e6861$var$buildBaseQuery = (predicates, ontologies)=>{
475
480
  let baseTriples;
476
481
  if (predicates) {
477
- baseTriples = $47d734d7812e6861$var$defaultToArray(predicates).map((predicate, i)=>(0, $fj9kP$triple)((0, $fj9kP$variable)("s1"), (0, $fj9kP$namedNode)((0, $564e5d81f6496048$export$2e2bcd8739ae039)(predicate, ontologies)), (0, $fj9kP$variable)(`o${i + 1}`)));
482
+ baseTriples = $47d734d7812e6861$var$defaultToArray(predicates).map((predicate, i)=>(0, $fj9kP$triple)((0, $fj9kP$variable)('s1'), (0, $fj9kP$namedNode)((0, $4872a1c30c1fc60e$export$2e2bcd8739ae039)(predicate, ontologies)), (0, $fj9kP$variable)(`o${i + 1}`)));
478
483
  return {
479
484
  construct: [
480
485
  $47d734d7812e6861$var$typeQuery,
@@ -483,7 +488,7 @@ const $47d734d7812e6861$var$buildBaseQuery = (predicates, ontologies)=>{
483
488
  where: [
484
489
  $47d734d7812e6861$var$typeQuery,
485
490
  ...baseTriples.map((triple)=>({
486
- type: "optional",
491
+ type: 'optional',
487
492
  patterns: [
488
493
  triple
489
494
  ]
@@ -492,7 +497,7 @@ const $47d734d7812e6861$var$buildBaseQuery = (predicates, ontologies)=>{
492
497
  };
493
498
  }
494
499
  baseTriples = [
495
- (0, $fj9kP$triple)((0, $fj9kP$variable)("s1"), (0, $fj9kP$variable)("p1"), (0, $fj9kP$variable)("o1"))
500
+ (0, $fj9kP$triple)((0, $fj9kP$variable)('s1'), (0, $fj9kP$variable)('p1'), (0, $fj9kP$variable)('o1'))
496
501
  ];
497
502
  return {
498
503
  construct: baseTriples,
@@ -509,22 +514,22 @@ var $47d734d7812e6861$export$2e2bcd8739ae039 = $47d734d7812e6861$var$buildBaseQu
509
514
  const $865f630cc944e818$var$extractNodes = (blankNodes)=>{
510
515
  const nodes = [];
511
516
  if (blankNodes) {
512
- for (const predicate of blankNodes)if (predicate.includes("/")) {
513
- const nodeNames = predicate.split("/");
514
- for(let i = 1; i <= nodeNames.length; i++)nodes.push(nodeNames.slice(0, i).join("/"));
517
+ for (const predicate of blankNodes)if (predicate.includes('/')) {
518
+ const nodeNames = predicate.split('/');
519
+ for(let i = 1; i <= nodeNames.length; i++)nodes.push(nodeNames.slice(0, i).join('/'));
515
520
  } else nodes.push(predicate);
516
521
  }
517
522
  return nodes;
518
523
  };
519
524
  const $865f630cc944e818$var$generateSparqlVarName = (node)=>(0, $fj9kP$cryptojsmd5)(node);
520
- const $865f630cc944e818$var$getParentNode = (node)=>node.includes("/") && node.split("/")[0];
521
- const $865f630cc944e818$var$getPredicate = (node)=>node.includes("/") ? node.split("/")[1] : node;
525
+ const $865f630cc944e818$var$getParentNode = (node)=>node.includes('/') && node.split('/')[0];
526
+ const $865f630cc944e818$var$getPredicate = (node)=>node.includes('/') ? node.split('/')[1] : node;
522
527
  const $865f630cc944e818$var$buildUnionQuery = (queries)=>queries.map((q)=>{
523
528
  let triples = q.query;
524
529
  const firstTriple = queries.find((q2)=>q.parentNode === q2.node);
525
530
  if (firstTriple !== undefined) triples = triples.concat(firstTriple.query[0]);
526
531
  return {
527
- type: "bgp",
532
+ type: 'bgp',
528
533
  triples: triples
529
534
  };
530
535
  });
@@ -536,22 +541,22 @@ const $865f630cc944e818$var$buildBlankNodesQuery = (blankNodes, baseQuery, ontol
536
541
  const parentNode = $865f630cc944e818$var$getParentNode(node);
537
542
  const predicate = $865f630cc944e818$var$getPredicate(node);
538
543
  const varName = $865f630cc944e818$var$generateSparqlVarName(node);
539
- const parentVarName = parentNode ? $865f630cc944e818$var$generateSparqlVarName(parentNode) : "1";
544
+ const parentVarName = parentNode ? $865f630cc944e818$var$generateSparqlVarName(parentNode) : '1';
540
545
  const query = [
541
- (0, $fj9kP$triple)((0, $fj9kP$variable)(`s${parentVarName}`), (0, $fj9kP$namedNode)((0, $564e5d81f6496048$export$2e2bcd8739ae039)(predicate, ontologies)), (0, $fj9kP$variable)(`s${varName}`)),
546
+ (0, $fj9kP$triple)((0, $fj9kP$variable)(`s${parentVarName}`), (0, $fj9kP$namedNode)((0, $4872a1c30c1fc60e$export$2e2bcd8739ae039)(predicate, ontologies)), (0, $fj9kP$variable)(`s${varName}`)),
542
547
  (0, $fj9kP$triple)((0, $fj9kP$variable)(`s${varName}`), (0, $fj9kP$variable)(`p${varName}`), (0, $fj9kP$variable)(`o${varName}`))
543
548
  ];
544
549
  queries.push({
545
550
  node: node,
546
551
  parentNode: parentNode,
547
552
  query: query,
548
- filter: "" // `FILTER(isBLANK(?s${varName})) .`
553
+ filter: '' // `FILTER(isBLANK(?s${varName})) .`
549
554
  });
550
555
  }
551
556
  return {
552
557
  construct: queries.length > 0 ? queries.map((q)=>q.query).reduce((pre, cur)=>pre.concat(cur)) : null,
553
558
  where: {
554
- type: "union",
559
+ type: 'union',
555
560
  patterns: [
556
561
  baseQuery.where,
557
562
  ...$865f630cc944e818$var$buildUnionQuery(queries)
@@ -560,8 +565,8 @@ const $865f630cc944e818$var$buildBlankNodesQuery = (blankNodes, baseQuery, ontol
560
565
  };
561
566
  }
562
567
  return {
563
- construct: "",
564
- where: ""
568
+ construct: '',
569
+ where: ''
565
570
  };
566
571
  };
567
572
  var $865f630cc944e818$export$2e2bcd8739ae039 = $865f630cc944e818$var$buildBlankNodesQuery;
@@ -583,10 +588,10 @@ const $efbe3fa6f1479c06$var$buildAutoDetectBlankNodesQuery = (depth, baseQuery)=
583
588
  whereQueries.push([
584
589
  ...whereQueries[whereQueries.length - 1],
585
590
  {
586
- type: "filter",
591
+ type: 'filter',
587
592
  expression: {
588
- type: "operation",
589
- operator: "isblank",
593
+ type: 'operation',
594
+ operator: 'isblank',
590
595
  args: [
591
596
  (0, $fj9kP$variable)(`o${i}`)
592
597
  ]
@@ -596,11 +601,11 @@ const $efbe3fa6f1479c06$var$buildAutoDetectBlankNodesQuery = (depth, baseQuery)=
596
601
  ]);
597
602
  }
598
603
  where = {
599
- type: "union",
604
+ type: 'union',
600
605
  patterns: whereQueries
601
606
  };
602
607
  } else if (depth === 0) where = baseQuery.where;
603
- else throw new Error("The depth of buildAutoDetectBlankNodesQuery should be 0 or more");
608
+ else throw new Error('The depth of buildAutoDetectBlankNodesQuery should be 0 or more');
604
609
  return {
605
610
  construct: construct,
606
611
  where: where
@@ -616,14 +621,14 @@ const { literal: $6cde9a8fbbde3ffb$var$literal, namedNode: $6cde9a8fbbde3ffb$var
616
621
  const $6cde9a8fbbde3ffb$var$generator = new $6cde9a8fbbde3ffb$require$SparqlGenerator({
617
622
  });
618
623
  const $6cde9a8fbbde3ffb$var$reservedFilterKeys = [
619
- "q",
620
- "sparqlWhere",
621
- "blankNodes",
622
- "blankNodesDepth",
623
- "_servers",
624
- "_predicates"
624
+ 'q',
625
+ 'sparqlWhere',
626
+ 'blankNodes',
627
+ 'blankNodesDepth',
628
+ '_servers',
629
+ '_predicates'
625
630
  ];
626
- const $6cde9a8fbbde3ffb$var$buildSparqlQuery = ({ containers: containers, params: params, dataModel: dataModel, ontologies: ontologies })=>{
631
+ const $6cde9a8fbbde3ffb$var$buildSparqlQuery = ({ containersUris: containersUris, params: params, dataModel: dataModel, ontologies: ontologies })=>{
627
632
  const blankNodes = params.filter?.blankNodes || dataModel.list?.blankNodes;
628
633
  const predicates = params.filter?._predicates || dataModel.list?.predicates;
629
634
  const blankNodesDepth = params.filter?.blankNodesDepth ?? dataModel.list?.blankNodesDepth ?? 2;
@@ -633,99 +638,97 @@ const $6cde9a8fbbde3ffb$var$buildSparqlQuery = ({ containers: containers, params
633
638
  };
634
639
  const baseQuery = (0, $47d734d7812e6861$export$2e2bcd8739ae039)(predicates, ontologies);
635
640
  const sparqlJsParams = {
636
- queryType: "CONSTRUCT",
641
+ queryType: 'CONSTRUCT',
637
642
  template: baseQuery.construct,
638
643
  where: [],
639
- type: "query",
640
- prefixes: Object.fromEntries(ontologies.map((ontology)=>[
641
- ontology.prefix,
642
- ontology.url
643
- ]))
644
+ type: 'query',
645
+ prefixes: ontologies
644
646
  };
645
647
  const containerWhere = [
646
648
  {
647
- type: "values",
648
- values: containers.map((containerUri)=>({
649
- "?containerUri": $6cde9a8fbbde3ffb$var$namedNode(containerUri)
649
+ type: 'values',
650
+ values: containersUris.map((containerUri)=>({
651
+ '?containerUri': $6cde9a8fbbde3ffb$var$namedNode(containerUri)
650
652
  }))
651
653
  },
652
- $6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable("containerUri"), $6cde9a8fbbde3ffb$var$namedNode("http://www.w3.org/ns/ldp#contains"), $6cde9a8fbbde3ffb$var$variable("s1")),
654
+ $6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable('containerUri'), $6cde9a8fbbde3ffb$var$namedNode('http://www.w3.org/ns/ldp#contains'), $6cde9a8fbbde3ffb$var$variable('s1')),
653
655
  {
654
- type: "filter",
656
+ type: 'filter',
655
657
  expression: {
656
- type: "operation",
657
- operator: "isiri",
658
+ type: 'operation',
659
+ operator: 'isiri',
658
660
  args: [
659
- $6cde9a8fbbde3ffb$var$variable("s1")
661
+ $6cde9a8fbbde3ffb$var$variable('s1')
660
662
  ]
661
663
  }
662
664
  }
663
665
  ];
664
666
  let resourceWhere = [];
665
667
  if (filter && Object.keys(filter).length > 0) {
666
- const hasSPARQLFilter = filter.sparqlWhere && Object.keys(filter.sparqlWhere).length > 0;
667
- const hasFullTextSearch = filter.q && filter.q.length > 0;
668
- if (hasSPARQLFilter) /*
669
- Example of usage :
670
- {
671
- "sparqlWhere": {
672
- "type": "bgp",
673
- "triples": [{
674
- "subject": {"termType": "Variable", "value": "s1"},
675
- "predicate": {"termType": "NameNode", "value": "http://virtual-assembly.org/ontologies/pair#label"},
676
- "object": {"termType": "Literal", "value": "My Organization"}
677
- }]
678
- }
668
+ /*
669
+ Example of usage :
670
+ {
671
+ "sparqlWhere": {
672
+ "type": "bgp",
673
+ "triples": [{
674
+ "subject": {"termType": "Variable", "value": "s1"},
675
+ "predicate": {"termType": "NameNode", "value": "http://virtual-assembly.org/ontologies/pair#label"},
676
+ "object": {"termType": "Literal", "value": "My Organization"}
677
+ }]
679
678
  }
680
- */ // initialize array in case of single value :
681
- [].concat(filter.sparqlWhere).forEach((sw)=>{
682
- resourceWhere.push(sw);
683
- });
684
- if (hasFullTextSearch) resourceWhere.push({
685
- type: "group",
679
+ }
680
+ */ if (filter.sparqlWhere) {
681
+ // When the SPARQL request comes from the browser's URL, it is a JSON string that must be parsed
682
+ const sparqlWhere = filter.sparqlWhere && (typeof filter.sparqlWhere === 'string' || filter.sparqlWhere instanceof String) ? JSON.parse(decodeURIComponent(filter.sparqlWhere)) : filter.sparqlWhere;
683
+ if (Object.keys(sparqlWhere).length > 0) [].concat(sparqlWhere).forEach((sw)=>{
684
+ resourceWhere.push(sw);
685
+ });
686
+ }
687
+ if (filter.q && filter.q.length > 0) resourceWhere.push({
688
+ type: 'group',
686
689
  patterns: [
687
690
  {
688
- queryType: "SELECT",
691
+ queryType: 'SELECT',
689
692
  variables: [
690
- $6cde9a8fbbde3ffb$var$variable("s1")
693
+ $6cde9a8fbbde3ffb$var$variable('s1')
691
694
  ],
692
695
  where: [
693
- $6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable("s1"), $6cde9a8fbbde3ffb$var$variable("p1"), $6cde9a8fbbde3ffb$var$variable("o1")),
696
+ $6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable('s1'), $6cde9a8fbbde3ffb$var$variable('p1'), $6cde9a8fbbde3ffb$var$variable('o1')),
694
697
  {
695
- type: "filter",
698
+ type: 'filter',
696
699
  expression: {
697
- type: "operation",
698
- operator: "isliteral",
700
+ type: 'operation',
701
+ operator: 'isliteral',
699
702
  args: [
700
- $6cde9a8fbbde3ffb$var$variable("o1")
703
+ $6cde9a8fbbde3ffb$var$variable('o1')
701
704
  ]
702
705
  }
703
706
  },
704
707
  {
705
- type: "filter",
708
+ type: 'filter',
706
709
  expression: {
707
- type: "operation",
708
- operator: "regex",
710
+ type: 'operation',
711
+ operator: 'regex',
709
712
  args: [
710
713
  {
711
- type: "operation",
712
- operator: "lcase",
714
+ type: 'operation',
715
+ operator: 'lcase',
713
716
  args: [
714
717
  {
715
- type: "operation",
716
- operator: "str",
718
+ type: 'operation',
719
+ operator: 'str',
717
720
  args: [
718
- $6cde9a8fbbde3ffb$var$variable("o1")
721
+ $6cde9a8fbbde3ffb$var$variable('o1')
719
722
  ]
720
723
  }
721
724
  ]
722
725
  },
723
- $6cde9a8fbbde3ffb$var$literal(filter.q.toLowerCase(), "", $6cde9a8fbbde3ffb$var$namedNode("http://www.w3.org/2001/XMLSchema#string"))
726
+ $6cde9a8fbbde3ffb$var$literal(filter.q.toLowerCase(), '', $6cde9a8fbbde3ffb$var$namedNode('http://www.w3.org/2001/XMLSchema#string'))
724
727
  ]
725
728
  }
726
729
  }
727
730
  ],
728
- type: "query"
731
+ type: 'query'
729
732
  }
730
733
  ]
731
734
  });
@@ -733,7 +736,7 @@ const $6cde9a8fbbde3ffb$var$buildSparqlQuery = ({ containers: containers, params
733
736
  // SPARQL keyword a = filter based on the class of a resource (example => 'a': 'pair:OrganizationType')
734
737
  // Other filters are based on a value (example => 'petr:hasAudience': 'http://localhost:3000/audiences/tout-public')
735
738
  Object.entries(filter).forEach(([predicate, object])=>{
736
- if (!$6cde9a8fbbde3ffb$var$reservedFilterKeys.includes(predicate)) resourceWhere.unshift($6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable("s1"), $6cde9a8fbbde3ffb$var$namedNode((0, $564e5d81f6496048$export$2e2bcd8739ae039)(predicate, ontologies)), $6cde9a8fbbde3ffb$var$namedNode((0, $564e5d81f6496048$export$2e2bcd8739ae039)(object, ontologies))));
739
+ if (!$6cde9a8fbbde3ffb$var$reservedFilterKeys.includes(predicate)) resourceWhere.unshift($6cde9a8fbbde3ffb$var$triple($6cde9a8fbbde3ffb$var$variable('s1'), $6cde9a8fbbde3ffb$var$namedNode((0, $4872a1c30c1fc60e$export$2e2bcd8739ae039)(predicate, ontologies)), $6cde9a8fbbde3ffb$var$namedNode((0, $4872a1c30c1fc60e$export$2e2bcd8739ae039)(object, ontologies))));
737
740
  });
738
741
  }
739
742
  // Blank nodes
@@ -742,27 +745,7 @@ const $6cde9a8fbbde3ffb$var$buildSparqlQuery = ({ containers: containers, params
742
745
  resourceWhere = resourceWhere.concat(blankNodesQuery.where);
743
746
  sparqlJsParams.template = sparqlJsParams.template.concat(blankNodesQuery.construct);
744
747
  } else resourceWhere.push(baseQuery.where);
745
- sparqlJsParams.where.push({
746
- type: "union",
747
- patterns: [
748
- containerWhere,
749
- {
750
- type: "graph",
751
- name: $6cde9a8fbbde3ffb$var$namedNode("http://semapps.org/mirror"),
752
- patterns: containerWhere
753
- }
754
- ]
755
- }, {
756
- type: "union",
757
- patterns: [
758
- resourceWhere,
759
- {
760
- type: "graph",
761
- name: $6cde9a8fbbde3ffb$var$namedNode("http://semapps.org/mirror"),
762
- patterns: resourceWhere
763
- }
764
- ]
765
- });
748
+ sparqlJsParams.where.push(containerWhere, resourceWhere);
766
749
  return $6cde9a8fbbde3ffb$var$generator.stringify(sparqlJsParams);
767
750
  };
768
751
  var $6cde9a8fbbde3ffb$export$2e2bcd8739ae039 = $6cde9a8fbbde3ffb$var$buildSparqlQuery;
@@ -770,10 +753,9 @@ var $6cde9a8fbbde3ffb$export$2e2bcd8739ae039 = $6cde9a8fbbde3ffb$var$buildSparql
770
753
 
771
754
  const $05a1b4063d50f1b7$var$compare = (a, b)=>{
772
755
  switch(typeof a){
773
- case "string":
756
+ case 'string':
774
757
  return a.localeCompare(b);
775
- case "number":
776
- case "bigint":
758
+ case 'number':
777
759
  return a - b;
778
760
  default:
779
761
  return 0;
@@ -782,48 +764,50 @@ const $05a1b4063d50f1b7$var$compare = (a, b)=>{
782
764
  const $05a1b4063d50f1b7$var$fetchSparqlEndpoints = async (containers, resourceId, params, config)=>{
783
765
  const { dataServers: dataServers, resources: resources, httpClient: httpClient, jsonContext: jsonContext, ontologies: ontologies } = config;
784
766
  const dataModel = resources[resourceId];
785
- const sparqlQueryPromises = Object.keys(containers).map((serverKey)=>new Promise((resolve, reject)=>{
767
+ const serversToQuery = containers.reduce((acc, cur)=>{
768
+ if (!acc.includes(cur.server)) acc.push(cur.server);
769
+ return acc;
770
+ }, []);
771
+ const sparqlQueryPromises = serversToQuery.map((serverKey)=>new Promise((resolve, reject)=>{
786
772
  const blankNodes = params.filter?.blankNodes || dataModel.list?.blankNodes;
787
- // When the SPARQL request comes from the browser's URL, it comes as JSON string which must must be parsed
788
- if (params.filter?.sparqlWhere && (typeof params.filter.sparqlWhere === "string" || params.filter.sparqlWhere instanceof String)) params.filter.sparqlWhere = JSON.parse(decodeURIComponent(params.filter.sparqlWhere));
789
773
  const sparqlQuery = (0, $6cde9a8fbbde3ffb$export$2e2bcd8739ae039)({
790
- containers: containers[serverKey],
774
+ containersUris: containers.filter((c)=>c.server === serverKey).map((c)=>c.uri),
791
775
  params: params,
792
776
  dataModel: dataModel,
793
777
  ontologies: ontologies
794
778
  });
795
779
  httpClient(dataServers[serverKey].sparqlEndpoint, {
796
- method: "POST",
780
+ method: 'POST',
797
781
  body: sparqlQuery
798
782
  }).then(({ json: json })=>{
799
783
  // If we declared the blank nodes to dereference, embed only those blank nodes
800
784
  // This solve problems which can occur when same-type resources are embedded in other resources
801
785
  // To increase performances, you can set explicitEmbedOnFraming to false (make sure the result is still OK)
802
786
  const frame = blankNodes && dataModel.list?.explicitEmbedOnFraming !== false ? {
803
- "@context": jsonContext,
804
- "@type": dataModel.types,
805
- "@embed": "@never",
787
+ '@context': jsonContext,
788
+ '@type': dataModel.types,
789
+ '@embed': '@never',
806
790
  ...(0, $3007d5479dd82d51$export$2e2bcd8739ae039)(blankNodes)
807
791
  } : {
808
- "@context": jsonContext,
809
- "@type": dataModel.types
792
+ '@context': jsonContext,
793
+ '@type': dataModel.types
810
794
  };
811
795
  // omitGraph option force results to be in a @graph, even if we have a single result
812
796
  return (0, $fj9kP$jsonld).frame(json, frame, {
813
797
  omitGraph: false
814
798
  });
815
799
  }).then((compactJson)=>{
816
- if (compactJson["@id"]) {
817
- const { "@context": context, ...rest } = compactJson;
800
+ if (compactJson['@id']) {
801
+ const { '@context': context, ...rest } = compactJson;
818
802
  compactJson = {
819
- "@context": context,
820
- "@graph": [
803
+ '@context': context,
804
+ '@graph': [
821
805
  rest
822
806
  ]
823
807
  };
824
808
  }
825
- resolve(compactJson["@graph"].map((resource)=>({
826
- "@context": compactJson["@context"],
809
+ resolve(compactJson['@graph']?.map((resource)=>({
810
+ '@context': compactJson['@context'],
827
811
  ...resource
828
812
  })) || []);
829
813
  }).catch((e)=>reject(e));
@@ -838,13 +822,13 @@ const $05a1b4063d50f1b7$var$fetchSparqlEndpoints = async (containers, resourceId
838
822
  results = [].concat(...results);
839
823
  // Add id in addition to @id, as this is what React-Admin expects
840
824
  let returnData = results.map((item)=>{
841
- item.id = item.id || item["@id"];
825
+ item.id = item.id || item['@id'];
842
826
  return item;
843
827
  });
844
828
  // TODO sort and paginate the results in the SPARQL query to improve performances
845
829
  if (params.sort) returnData = returnData.sort((a, b)=>{
846
830
  if (a[params.sort.field] !== undefined && b[params.sort.field] !== undefined) {
847
- if (params.sort.order === "ASC") return $05a1b4063d50f1b7$var$compare(a[params.sort.field], b[params.sort.field]);
831
+ if (params.sort.order === 'ASC') return $05a1b4063d50f1b7$var$compare(a[params.sort.field], b[params.sort.field]);
848
832
  return $05a1b4063d50f1b7$var$compare(b[params.sort.field], a[params.sort.field]);
849
833
  }
850
834
  return 0;
@@ -859,43 +843,46 @@ var $05a1b4063d50f1b7$export$2e2bcd8739ae039 = $05a1b4063d50f1b7$var$fetchSparql
859
843
 
860
844
 
861
845
 
862
- const $4a0be4f601906b75$var$findContainersWithPaths = (paths, dataServers)=>{
863
- const containers = {};
864
- Object.keys(paths).forEach((serverKey)=>{
865
- if (dataServers[serverKey]) {
866
- containers[serverKey] = [];
867
- paths[serverKey].forEach((path)=>{
868
- containers[serverKey].push((0, $fj9kP$urljoin)(dataServers[serverKey].baseUrl, path));
869
- });
870
- } else throw new Error(`No server found with key ${serverKey}`);
846
+
847
+ /**
848
+ * Return all containers matching the given shape tree
849
+ */ const $3bcb3ff5a72a9185$var$findContainersWithShapeTree = (shapeTreeUri, serverKeys, dataServers)=>{
850
+ const matchingContainers = [];
851
+ const parsedServerKeys = (0, $99cc2e4a2a3c100b$export$2e2bcd8739ae039)(serverKeys || '@all', dataServers);
852
+ Object.keys(dataServers).forEach((dataServerKey)=>{
853
+ if (parsedServerKeys.includes(dataServerKey)) dataServers[dataServerKey].containers?.forEach((container)=>{
854
+ if (container.shapeTreeUri === shapeTreeUri) matchingContainers.push(container);
855
+ });
871
856
  });
872
- return containers;
857
+ return matchingContainers;
873
858
  };
874
- var $4a0be4f601906b75$export$2e2bcd8739ae039 = $4a0be4f601906b75$var$findContainersWithPaths;
859
+ var $3bcb3ff5a72a9185$export$2e2bcd8739ae039 = $3bcb3ff5a72a9185$var$findContainersWithShapeTree;
860
+
875
861
 
876
862
 
877
- const $7add415f7ebb1122$var$getListMethod = (config)=>async (resourceId, params = {})=>{
863
+ const $1caf729dc3ce856d$var$getListMethod = (config)=>async (resourceId, params)=>{
878
864
  const { dataServers: dataServers, resources: resources } = config;
879
865
  const dataModel = resources[resourceId];
880
866
  if (!dataModel) throw new Error(`Resource ${resourceId} is not mapped in resources file`);
881
- let containers;
867
+ let containers = [];
882
868
  if (!params.filter?._servers && dataModel.list?.containers) {
883
869
  if (Array.isArray(dataModel.list?.containers)) throw new Error(`The list.containers property of ${resourceId} dataModel must be of type object ({ serverKey: [containerUri] })`);
884
870
  // If containers are set explicitly, use them
885
- containers = (0, $4a0be4f601906b75$export$2e2bcd8739ae039)(dataModel.list.containers, dataServers);
886
- } else // Otherwise find the container URIs on the given servers (either in the filter or the data model)
887
- containers = (0, $15b841e67a1ba752$export$2e2bcd8739ae039)(dataModel.types, params.filter?._servers || dataModel.list?.servers, dataServers);
871
+ containers = (0, $7c772a9c0c25a69d$export$2e2bcd8739ae039)(dataModel.list.containers, dataServers);
872
+ } else if (dataModel.shapeTreeUri) containers = (0, $3bcb3ff5a72a9185$export$2e2bcd8739ae039)(dataModel.shapeTreeUri, params?.filter?._servers || dataModel.list?.servers, dataServers);
873
+ else // Otherwise find the container URIs on the given servers (either in the filter or the data model)
874
+ containers = (0, $15b841e67a1ba752$export$2e2bcd8739ae039)((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(dataModel.types), params?.filter?._servers || dataModel.list?.servers, dataServers);
888
875
  if (dataModel.list?.fetchContainer) return (0, $aba124ea15ea8bc6$export$2e2bcd8739ae039)(containers, params, config);
889
- return (0, $05a1b4063d50f1b7$export$2e2bcd8739ae039)(containers, resourceId, params, config);
876
+ else return (0, $05a1b4063d50f1b7$export$2e2bcd8739ae039)(containers, resourceId, params, config);
890
877
  };
891
- var $7add415f7ebb1122$export$2e2bcd8739ae039 = $7add415f7ebb1122$var$getListMethod;
878
+ var $1caf729dc3ce856d$export$2e2bcd8739ae039 = $1caf729dc3ce856d$var$getListMethod;
892
879
 
893
880
 
894
881
 
895
882
  const $f1e05270f9a21255$var$getManyMethod = (config)=>async (resourceId, params)=>{
896
883
  const { returnFailedResources: returnFailedResources } = config;
897
884
  let returnData = await Promise.all(params.ids.map((id)=>(0, $ed447224dd38ce82$export$2e2bcd8739ae039)(config)(resourceId, {
898
- id: typeof id === "object" ? id["@id"] : id
885
+ id: typeof id === 'object' ? id['@id'] : id
899
886
  }).then(({ data: data })=>data).catch(()=>{
900
887
  // Catch if one resource fails to load
901
888
  // Otherwise no references will be show if only one is missing
@@ -922,7 +909,7 @@ const $b5979a9678f57756$var$getManyReferenceMethod = (config)=>async (resourceId
922
909
  [params.target]: params.id
923
910
  };
924
911
  delete params.target;
925
- return await (0, $7add415f7ebb1122$export$2e2bcd8739ae039)(config)(resourceId, params);
912
+ return await (0, $1caf729dc3ce856d$export$2e2bcd8739ae039)(config)(resourceId, params);
926
913
  };
927
914
  var $b5979a9678f57756$export$2e2bcd8739ae039 = $b5979a9678f57756$var$getManyReferenceMethod;
928
915
 
@@ -933,32 +920,32 @@ const $cdfdce6efa87baab$var$generator = new (0, $fj9kP$Generator)();
933
920
  const $cdfdce6efa87baab$var$patchMethod = (config)=>async (resourceId, params)=>{
934
921
  const { httpClient: httpClient } = config;
935
922
  const sparqlUpdate = {
936
- type: "update",
923
+ type: 'update',
937
924
  prefixes: {},
938
925
  updates: []
939
926
  };
940
927
  if (params.triplesToAdd) sparqlUpdate.updates.push({
941
- updateType: "insert",
928
+ updateType: 'insert',
942
929
  insert: [
943
930
  {
944
- type: "bgp",
931
+ type: 'bgp',
945
932
  triples: params.triplesToAdd
946
933
  }
947
934
  ]
948
935
  });
949
936
  if (params.triplesToRemove) sparqlUpdate.updates.push({
950
- updateType: "delete",
937
+ updateType: 'delete',
951
938
  delete: [
952
939
  {
953
- type: "bgp",
940
+ type: 'bgp',
954
941
  triples: params.triplesToRemove
955
942
  }
956
943
  ]
957
944
  });
958
945
  await httpClient(`${params.id}`, {
959
- method: "PATCH",
946
+ method: 'PATCH',
960
947
  headers: new Headers({
961
- "Content-Type": "application/sparql-update"
948
+ 'Content-Type': 'application/sparql-update'
962
949
  }),
963
950
  body: $cdfdce6efa87baab$var$generator.stringify(sparqlUpdate)
964
951
  });
@@ -970,9 +957,9 @@ var $cdfdce6efa87baab$export$2e2bcd8739ae039 = $cdfdce6efa87baab$var$patchMethod
970
957
  // Return the first server matching with the baseUrl
971
958
  const $47e21ee81eed09a6$var$getServerKeyFromUri = (uri, dataServers)=>{
972
959
  if (!uri) throw Error(`No URI provided to getServerKeyFromUri`);
973
- return Object.keys(dataServers).find((key)=>{
960
+ return dataServers && Object.keys(dataServers).find((key)=>{
974
961
  if (dataServers[key].pod) // The baseUrl ends with /data so remove this part to match with the webId and webId-related URLs (/inbox, /outbox...)
975
- return dataServers[key].baseUrl && uri.startsWith(dataServers[key].baseUrl.replace("/data", ""));
962
+ return dataServers[key].baseUrl && uri.startsWith(dataServers[key].baseUrl.replace('/data', ''));
976
963
  return uri.startsWith(dataServers[key].baseUrl);
977
964
  });
978
965
  };
@@ -986,9 +973,9 @@ const $c5031381f4dfc62d$var$updateMethod = (config)=>async (resourceId, params)=
986
973
  const { updatedRecord: updatedRecord, filesToDelete: filesToDelete } = await (0, $b17c43e3301545ca$export$2e2bcd8739ae039).upload(params.data, config, serverKey);
987
974
  params.data = updatedRecord;
988
975
  await httpClient(`${params.id}`, {
989
- method: "PUT",
976
+ method: 'PUT',
990
977
  body: JSON.stringify({
991
- "@context": jsonContext,
978
+ '@context': jsonContext,
992
979
  ...params.data
993
980
  })
994
981
  });
@@ -1004,141 +991,51 @@ var $c5031381f4dfc62d$export$2e2bcd8739ae039 = $c5031381f4dfc62d$var$updateMetho
1004
991
 
1005
992
 
1006
993
 
1007
- const $81a8da127161495a$var$fetchUserConfig = async (config)=>{
1008
- const { dataServers: dataServers, httpClient: httpClient } = config;
1009
- const token = localStorage.getItem("token");
1010
- const podKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("pod", dataServers);
1011
- const authServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("authServer", dataServers);
1012
- // If the user is logged in
1013
- if (token) {
1014
- const payload = (0, $fj9kP$jwtdecode)(token);
1015
- const webId = payload.webId || payload.webid; // Currently we must deal with both formats
1016
- let userData;
1017
- try {
1018
- const { json: json } = await httpClient(webId);
1019
- userData = json;
1020
- } catch (e) {
1021
- console.error(e);
1022
- // If the webId cannot be fetched, assume an invalid token and disconnect the user
1023
- localStorage.clear();
1024
- window.location.reload();
1025
- return;
1026
- }
1027
- // If we have a POD server
1028
- if (podKey) {
1029
- // Fill the config provided to the data provider
1030
- // We must modify the config object directly
1031
- config.dataServers[podKey].name = "My Pod";
1032
- config.dataServers[podKey].baseUrl = userData["pim:storage"] || (0, $fj9kP$urljoin)(webId, "data");
1033
- config.dataServers[podKey].sparqlEndpoint = userData.endpoints?.["void:sparqlEndpoint"] || (0, $fj9kP$urljoin)(webId, "sparql");
1034
- }
1035
- if (authServerKey) // Fill the config provided to the data provider
1036
- // We must modify the config object directly
1037
- config.dataServers[authServerKey].proxyUrl = userData.endpoints?.proxyUrl;
1038
- } else if (podKey) // If the user is not logged in, ignore the POD server
1039
- delete config.dataServers[podKey];
1040
- };
1041
- var $81a8da127161495a$export$2e2bcd8739ae039 = $81a8da127161495a$var$fetchUserConfig;
1042
-
1043
-
1044
- const $31a4627920feab4a$var$defaultToArray = (value)=>!value ? undefined : Array.isArray(value) ? value : [
1045
- value
1046
- ];
1047
- const $31a4627920feab4a$var$fetchVoidEndpoints = async (config)=>{
1048
- const fetchPromises = Object.entries(config.dataServers).filter(([key, server])=>server.pod !== true && server.void !== false).map(([key, server])=>config.httpClient(new URL("/.well-known/void", server.baseUrl).toString()).then((result)=>({
1049
- key: key,
1050
- datasets: result.json["@graph"]
1051
- })).catch((e)=>{
1052
- if (e.status === 404 || e.status === 401 || e.status === 500) return {
1053
- key: key,
1054
- error: e
1055
- };
1056
- throw e;
1057
- }));
1058
- let results = [];
1059
- try {
1060
- results = await Promise.all(fetchPromises);
1061
- } catch (e) {
1062
- // Do not throw error if no endpoint found
1063
- }
1064
- for (const result of results){
1065
- config.dataServers[result.key].containers = config.dataServers[result.key].containers || {};
1066
- config.dataServers[result.key].blankNodes = config.dataServers[result.key].blankNodes || {};
1067
- // Ignore unfetchable endpoints
1068
- if (result.datasets) for (const dataset of result.datasets){
1069
- const datasetServerKey = Object.keys(config.dataServers).find((key)=>dataset["void:uriSpace"] === config.dataServers[key].baseUrl);
1070
- // If the dataset is not part of a server mapped in the dataServers, ignore it
1071
- if (datasetServerKey) {
1072
- // If this is the local dataset, add the base information
1073
- if (datasetServerKey === result.key) {
1074
- config.dataServers[result.key].name = config.dataServers[result.key].name || dataset["dc:title"];
1075
- config.dataServers[result.key].description = config.dataServers[result.key].description || dataset["dc:description"];
1076
- config.dataServers[result.key].sparqlEndpoint = config.dataServers[result.key].sparqlEndpoint || dataset["void:sparqlEndpoint"];
1077
- }
1078
- config.dataServers[result.key].containers[datasetServerKey] = config.dataServers[result.key].containers[datasetServerKey] || {};
1079
- for (const partition of $31a4627920feab4a$var$defaultToArray(dataset["void:classPartition"]))for (const type of $31a4627920feab4a$var$defaultToArray(partition["void:class"])){
1080
- // Set containers by type
1081
- const path = partition["void:uriSpace"].replace(dataset["void:uriSpace"], "/");
1082
- if (config.dataServers[result.key].containers[datasetServerKey][type]) config.dataServers[result.key].containers[datasetServerKey][type].push(path);
1083
- else config.dataServers[result.key].containers[datasetServerKey][type] = [
1084
- path
1085
- ];
1086
- }
1087
- }
1088
- }
1089
- }
1090
- };
1091
- var $31a4627920feab4a$export$2e2bcd8739ae039 = $31a4627920feab4a$var$fetchVoidEndpoints;
1092
-
1093
-
1094
-
1095
-
1096
-
1097
-
1098
994
  /*
1099
995
  * HTTP client used by all calls in data provider and auth provider
1100
996
  * Do proxy calls if a proxy endpoint is available and the server is different from the auth server
1101
997
  */ const $22b4895a4ca7d626$var$httpClient = (dataServers)=>(url, options = {})=>{
1102
- const authServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("authServer", dataServers);
998
+ if (!url) throw new Error(`No URL provided on httpClient call`);
999
+ const authServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('authServer', dataServers);
1103
1000
  const serverKey = (0, $47e21ee81eed09a6$export$2e2bcd8739ae039)(url, dataServers);
1104
- const useProxy = serverKey !== authServerKey && dataServers[authServerKey]?.proxyUrl && dataServers[serverKey]?.noProxy !== true;
1001
+ const useProxy = serverKey !== authServerKey && dataServers.user?.proxyUrl && dataServers[serverKey]?.noProxy !== true;
1105
1002
  if (!options.headers) options.headers = new Headers();
1106
1003
  switch(options.method){
1107
- case "POST":
1108
- case "PATCH":
1109
- case "PUT":
1110
- if (!options.headers.has("Accept")) options.headers.set("Accept", "application/ld+json");
1111
- if (!options.headers.has("Content-Type")) options.headers.set("Content-Type", "application/ld+json");
1004
+ case 'POST':
1005
+ case 'PATCH':
1006
+ case 'PUT':
1007
+ if (!options.headers.has('Accept')) options.headers.set('Accept', 'application/ld+json');
1008
+ if (!options.headers.has('Content-Type')) options.headers.set('Content-Type', 'application/ld+json');
1112
1009
  break;
1113
- case "DELETE":
1010
+ case 'DELETE':
1114
1011
  break;
1115
- case "GET":
1012
+ case 'GET':
1116
1013
  default:
1117
- if (!options.headers.has("Accept")) options.headers.set("Accept", "application/ld+json");
1014
+ if (!options.headers.has('Accept')) options.headers.set('Accept', 'application/ld+json');
1118
1015
  break;
1119
1016
  }
1120
1017
  if (useProxy) {
1121
1018
  const formData = new FormData();
1122
- formData.append("id", url);
1123
- formData.append("method", options.method || "GET");
1124
- formData.append("headers", JSON.stringify(Object.fromEntries(options.headers.entries())));
1019
+ formData.append('id', url);
1020
+ formData.append('method', options.method || 'GET');
1021
+ formData.append('headers', JSON.stringify(Object.fromEntries(options.headers.entries())));
1125
1022
  if (options.body) {
1126
- if (options.body instanceof File) formData.append("body", options.body, options.body.name);
1127
- else formData.append("body", options.body);
1023
+ if (options.body instanceof File) formData.append('body', options.body, options.body.name);
1024
+ else formData.append('body', options.body);
1128
1025
  }
1129
1026
  // Post to proxy endpoint with multipart/form-data format
1130
- return (0, $fj9kP$fetchUtils).fetchJson(dataServers[authServerKey].proxyUrl, {
1131
- method: "POST",
1027
+ return (0, $fj9kP$fetchUtils).fetchJson(dataServers.user.proxyUrl, {
1028
+ method: 'POST',
1132
1029
  headers: new Headers({
1133
- Authorization: `Bearer ${localStorage.getItem("token")}`
1030
+ Authorization: `Bearer ${localStorage.getItem('token')}`
1134
1031
  }),
1135
1032
  body: formData
1136
1033
  });
1137
1034
  }
1138
1035
  // Add token if the server is the same as the auth server
1139
1036
  if (serverKey === authServerKey) {
1140
- const token = localStorage.getItem("token");
1141
- if (token) options.headers.set("Authorization", `Bearer ${token}`);
1037
+ const token = localStorage.getItem('token');
1038
+ if (token) options.headers.set('Authorization', `Bearer ${token}`);
1142
1039
  }
1143
1040
  return (0, $fj9kP$fetchUtils).fetchJson(url, options);
1144
1041
  };
@@ -1146,54 +1043,171 @@ var $22b4895a4ca7d626$export$2e2bcd8739ae039 = $22b4895a4ca7d626$var$httpClient;
1146
1043
 
1147
1044
 
1148
1045
 
1149
- /** @type {(config: Configuration) => SemanticDataProvider} */ const $243bf28fbb1b868f$var$dataProvider = (config)=>{
1150
- // TODO verify all data provider config + data models
1151
- if (!(0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("default", config.dataServers)) throw new Error("You must define a default server in your dataServers config");
1152
- if (!config.jsonContext) config.jsonContext = Object.fromEntries(config.ontologies.map((o)=>[
1153
- o.prefix,
1154
- o.url
1155
- ]));
1156
- if (!config.returnFailedResources) config.returnFailedResources = false;
1157
- // Configure httpClient with data servers (this is needed for proxy calls)
1158
- config.httpClient = (0, $22b4895a4ca7d626$export$2e2bcd8739ae039)(config.dataServers);
1159
- // Keep in memory for refresh
1160
- const originalConfig = {
1046
+
1047
+
1048
+
1049
+
1050
+ const $36aa010ec46eaf45$var$isURL = (value)=>(typeof value === 'string' || value instanceof String) && value.startsWith('http');
1051
+ const $36aa010ec46eaf45$var$expandTypes = async (types, context)=>{
1052
+ // If types are already full URIs, return them immediately
1053
+ if (types.every((type)=>$36aa010ec46eaf45$var$isURL(type))) return types;
1054
+ const result = await (0, $fj9kP$jsonld).expand({
1055
+ '@context': context,
1056
+ '@type': types
1057
+ });
1058
+ const expandedTypes = (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(result[0]['@type']);
1059
+ if (!expandedTypes.every((type)=>$36aa010ec46eaf45$var$isURL(type))) throw new Error(`
1060
+ Could not expand all types (${expandedTypes.join(', ')}).
1061
+ Is an ontology missing or not registered yet on the local context ?
1062
+ `);
1063
+ return expandedTypes;
1064
+ };
1065
+ var $36aa010ec46eaf45$export$2e2bcd8739ae039 = $36aa010ec46eaf45$var$expandTypes;
1066
+
1067
+
1068
+
1069
+
1070
+ const $ab7d38fd091ff1b6$var$getTypesFromShapeTree = async (shapeTreeUri)=>{
1071
+ let { json: shapeTree } = await (0, $fj9kP$fetchUtils).fetchJson(shapeTreeUri, {
1072
+ headers: new Headers({
1073
+ Accept: 'application/ld+json'
1074
+ })
1075
+ });
1076
+ shapeTree = await (0, $fj9kP$jsonld).compact(shapeTree, {
1077
+ st: 'http://www.w3.org/ns/shapetrees#',
1078
+ skos: 'http://www.w3.org/2004/02/skos/core#',
1079
+ expectsType: {
1080
+ '@id': 'st:expectsType',
1081
+ '@type': '@id'
1082
+ },
1083
+ shape: {
1084
+ '@id': 'st:shape',
1085
+ '@type': '@id'
1086
+ },
1087
+ describesInstance: {
1088
+ '@id': 'st:describesInstance',
1089
+ '@type': '@id'
1090
+ },
1091
+ label: {
1092
+ '@id': 'skos:prefLabel',
1093
+ '@container': '@language'
1094
+ }
1095
+ });
1096
+ if (shapeTree.shape) {
1097
+ const { json: shape } = await (0, $fj9kP$fetchUtils).fetchJson(shapeTree.shape, {
1098
+ headers: new Headers({
1099
+ Accept: 'application/ld+json'
1100
+ })
1101
+ });
1102
+ return shape?.[0]?.['http://www.w3.org/ns/shacl#targetClass']?.map((node)=>node?.['@id']) || [];
1103
+ } else return [];
1104
+ };
1105
+ var $ab7d38fd091ff1b6$export$2e2bcd8739ae039 = $ab7d38fd091ff1b6$var$getTypesFromShapeTree;
1106
+
1107
+
1108
+ const $33bf2a661b5c0cbd$var$normalizeConfig = async (config)=>{
1109
+ const newConfig = {
1161
1110
  ...config
1162
1111
  };
1163
- let fetchUserConfigPromise = (0, $81a8da127161495a$export$2e2bcd8739ae039)(config);
1164
- let fetchVoidEndpointsPromise = (0, $31a4627920feab4a$export$2e2bcd8739ae039)(config);
1165
- const waitForConfig = (method)=>async (...arg)=>{
1166
- await fetchUserConfigPromise;
1167
- await fetchVoidEndpointsPromise; // Return immediately if promise is fulfilled
1168
- return await method(...arg);
1112
+ // Add server and uri key to servers' containers
1113
+ for (const serverKey of Object.keys(newConfig.dataServers))if (newConfig.dataServers[serverKey].containers) newConfig.dataServers[serverKey].containers = await Promise.all(newConfig.dataServers[serverKey].containers?.map(async (container)=>{
1114
+ return {
1115
+ ...container,
1116
+ types: container.types && await (0, $36aa010ec46eaf45$export$2e2bcd8739ae039)(container.types, config.jsonContext),
1117
+ server: serverKey,
1118
+ uri: (0, $fj9kP$urljoin)(config.dataServers[serverKey].baseUrl, container.path)
1119
+ };
1120
+ }));
1121
+ // Expand types in data models
1122
+ for (const resourceId of Object.keys(newConfig.resources)){
1123
+ if (!newConfig.resources[resourceId].types && newConfig.resources[resourceId].shapeTreeUri) newConfig.resources[resourceId].types = await (0, $ab7d38fd091ff1b6$export$2e2bcd8739ae039)(newConfig.resources[resourceId].shapeTreeUri);
1124
+ newConfig.resources[resourceId].types = await (0, $36aa010ec46eaf45$export$2e2bcd8739ae039)((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(newConfig.resources[resourceId].types), config.jsonContext);
1125
+ }
1126
+ return newConfig;
1127
+ };
1128
+ var $33bf2a661b5c0cbd$export$2e2bcd8739ae039 = $33bf2a661b5c0cbd$var$normalizeConfig;
1129
+
1130
+
1131
+
1132
+
1133
+ const $143de1c1f21344e7$var$isURL = (value)=>(typeof value === 'string' || value instanceof String) && value.startsWith('http');
1134
+ const $143de1c1f21344e7$var$getOntologiesFromContextJson = (contextJson)=>{
1135
+ const ontologies = {};
1136
+ for (const [key, value] of Object.entries(contextJson))if ($143de1c1f21344e7$var$isURL(value)) ontologies[key] = value;
1137
+ return ontologies;
1138
+ };
1139
+ const $143de1c1f21344e7$var$getOntologiesFromContextUrl = async (contextUrl)=>{
1140
+ const { json: json } = await (0, $fj9kP$fetchUtils).fetchJson(contextUrl, {
1141
+ headers: new Headers({
1142
+ Accept: 'application/ld+json'
1143
+ })
1144
+ });
1145
+ return $143de1c1f21344e7$var$getOntologiesFromContextJson(json['@context']);
1146
+ };
1147
+ const $143de1c1f21344e7$var$getOntologiesFromContext = async (context)=>{
1148
+ let ontologies = {};
1149
+ if (Array.isArray(context)) for (const contextUrl of context)ontologies = {
1150
+ ...ontologies,
1151
+ ...await $143de1c1f21344e7$var$getOntologiesFromContextUrl(contextUrl)
1152
+ };
1153
+ else if (typeof context === 'string') ontologies = await $143de1c1f21344e7$var$getOntologiesFromContextUrl(context);
1154
+ else ontologies = $143de1c1f21344e7$var$getOntologiesFromContextJson(context);
1155
+ return ontologies;
1156
+ };
1157
+ var $143de1c1f21344e7$export$2e2bcd8739ae039 = $143de1c1f21344e7$var$getOntologiesFromContext;
1158
+
1159
+
1160
+ /** @type {(originalConfig: Configuration) => SemanticDataProvider} */ const $243bf28fbb1b868f$var$dataProvider = (originalConfig)=>{
1161
+ // Keep in memory for refresh
1162
+ let config = {
1163
+ ...originalConfig
1164
+ };
1165
+ const prepareConfig = async ()=>{
1166
+ config.dataServers ??= {};
1167
+ // Configure httpClient with initial data servers, so that plugins may use it
1168
+ config.httpClient = (0, $22b4895a4ca7d626$export$2e2bcd8739ae039)(config.dataServers);
1169
+ for (const plugin of config.plugins)if (plugin.transformConfig) config = await plugin.transformConfig(config);
1170
+ // Configure again httpClient with possibly updated data servers
1171
+ config.httpClient = (0, $22b4895a4ca7d626$export$2e2bcd8739ae039)(config.dataServers);
1172
+ if (!config.ontologies && config.jsonContext) config.ontologies = await (0, $143de1c1f21344e7$export$2e2bcd8739ae039)(config.jsonContext);
1173
+ else if (!config.jsonContext && config.ontologies) config.jsonContext = config.ontologies;
1174
+ else if (!config.jsonContext && !config.ontologies) throw new Error(`Either the JSON context or the ontologies must be set`);
1175
+ if (!config.returnFailedResources) config.returnFailedResources = false;
1176
+ config = await (0, $33bf2a661b5c0cbd$export$2e2bcd8739ae039)(config);
1177
+ console.log('Config after plugins', config);
1178
+ };
1179
+ // Immediately call the preload plugins
1180
+ const prepareConfigPromise = prepareConfig();
1181
+ const waitForPrepareConfig = (method)=>async (...arg)=>{
1182
+ await prepareConfigPromise; // Return immediately if plugins have already been loaded
1183
+ return method(config)(...arg);
1169
1184
  };
1170
1185
  return {
1171
- getList: waitForConfig((0, $7add415f7ebb1122$export$2e2bcd8739ae039)(config)),
1172
- getMany: waitForConfig((0, $f1e05270f9a21255$export$2e2bcd8739ae039)(config)),
1173
- getManyReference: waitForConfig((0, $b5979a9678f57756$export$2e2bcd8739ae039)(config)),
1174
- getOne: waitForConfig((0, $ed447224dd38ce82$export$2e2bcd8739ae039)(config)),
1175
- create: waitForConfig((0, $5a7a2f7583392866$export$2e2bcd8739ae039)(config)),
1176
- update: waitForConfig((0, $c5031381f4dfc62d$export$2e2bcd8739ae039)(config)),
1186
+ getList: waitForPrepareConfig((0, $1caf729dc3ce856d$export$2e2bcd8739ae039)),
1187
+ getMany: waitForPrepareConfig((0, $f1e05270f9a21255$export$2e2bcd8739ae039)),
1188
+ getManyReference: waitForPrepareConfig((0, $b5979a9678f57756$export$2e2bcd8739ae039)),
1189
+ getOne: waitForPrepareConfig((0, $ed447224dd38ce82$export$2e2bcd8739ae039)),
1190
+ create: waitForPrepareConfig((0, $5a7a2f7583392866$export$2e2bcd8739ae039)),
1191
+ update: waitForPrepareConfig((0, $c5031381f4dfc62d$export$2e2bcd8739ae039)),
1177
1192
  updateMany: ()=>{
1178
- throw new Error("updateMany is not implemented yet");
1193
+ throw new Error('updateMany is not implemented yet');
1179
1194
  },
1180
- delete: waitForConfig((0, $9510970b8e7eb9e2$export$2e2bcd8739ae039)(config)),
1181
- deleteMany: waitForConfig((0, $298dd1ae21173ea0$export$2e2bcd8739ae039)(config)),
1195
+ delete: waitForPrepareConfig((0, $9510970b8e7eb9e2$export$2e2bcd8739ae039)),
1196
+ deleteMany: waitForPrepareConfig((0, $298dd1ae21173ea0$export$2e2bcd8739ae039)),
1182
1197
  // Custom methods
1183
- patch: waitForConfig((0, $cdfdce6efa87baab$export$2e2bcd8739ae039)(config)),
1184
- getDataModels: waitForConfig((0, $54a3fa40eed06111$export$2e2bcd8739ae039)(config)),
1185
- getDataServers: waitForConfig((0, $7dd5bf9323d2d9c1$export$2e2bcd8739ae039)(config)),
1186
- getLocalDataServers: (0, $7dd5bf9323d2d9c1$export$2e2bcd8739ae039)(config),
1187
- fetch: waitForConfig(config.httpClient),
1188
- uploadFile: waitForConfig((rawFile)=>(0, $b17c43e3301545ca$export$a5575dbeeffdad98)(rawFile, config)),
1198
+ patch: waitForPrepareConfig((0, $cdfdce6efa87baab$export$2e2bcd8739ae039)),
1199
+ getDataModels: waitForPrepareConfig((0, $54a3fa40eed06111$export$2e2bcd8739ae039)),
1200
+ getDataServers: waitForPrepareConfig((0, $7dd5bf9323d2d9c1$export$2e2bcd8739ae039)),
1201
+ getLocalDataServers: (0, $7dd5bf9323d2d9c1$export$2e2bcd8739ae039)(originalConfig),
1202
+ fetch: waitForPrepareConfig((c)=>(0, $22b4895a4ca7d626$export$2e2bcd8739ae039)(c.dataServers)),
1203
+ uploadFile: waitForPrepareConfig((c)=>(rawFile)=>(0, $b17c43e3301545ca$export$a5575dbeeffdad98)(rawFile, c)),
1204
+ expandTypes: waitForPrepareConfig((c)=>(types)=>(0, $36aa010ec46eaf45$export$2e2bcd8739ae039)(types, c.jsonContext)),
1205
+ getConfig: waitForPrepareConfig((c)=>()=>c),
1189
1206
  refreshConfig: async ()=>{
1190
1207
  config = {
1191
1208
  ...originalConfig
1192
1209
  };
1193
- fetchUserConfigPromise = (0, $81a8da127161495a$export$2e2bcd8739ae039)(config);
1194
- fetchVoidEndpointsPromise = (0, $31a4627920feab4a$export$2e2bcd8739ae039)(config);
1195
- await fetchUserConfigPromise;
1196
- await fetchVoidEndpointsPromise;
1210
+ await prepareConfig();
1197
1211
  return config;
1198
1212
  }
1199
1213
  };
@@ -1204,95 +1218,403 @@ var $243bf28fbb1b868f$export$2e2bcd8739ae039 = $243bf28fbb1b868f$var$dataProvide
1204
1218
 
1205
1219
 
1206
1220
 
1221
+ const $861da9be2c0e62eb$var$getPrefixFromUri = (uri, ontologies)=>{
1222
+ for (const [prefix, namespace] of Object.entries(ontologies)){
1223
+ if (uri.startsWith(namespace)) return uri.replace(namespace, `${prefix}:`);
1224
+ }
1225
+ return uri;
1226
+ };
1227
+ var $861da9be2c0e62eb$export$2e2bcd8739ae039 = $861da9be2c0e62eb$var$getPrefixFromUri;
1207
1228
 
1208
- const $87656edf926c0f1f$var$compute = (externalLinks, record)=>typeof externalLinks === "function" ? externalLinks(record) : externalLinks;
1209
- const $87656edf926c0f1f$var$isURL = (url)=>typeof url === "string" && url.startsWith("http");
1210
- const $87656edf926c0f1f$var$useGetExternalLink = (componentExternalLinks)=>{
1211
- // Since the externalLinks config is defined only locally, we don't need to wait for VOID endpoints fetching
1212
- const dataProvider = (0, $fj9kP$useContext)((0, $fj9kP$DataProviderContext));
1213
- const dataServers = dataProvider.getLocalDataServers();
1214
- const serversExternalLinks = (0, $fj9kP$useMemo)(()=>{
1215
- if (dataServers) return Object.fromEntries(Object.values(dataServers).map((server)=>{
1216
- // If externalLinks is not defined in the data server, use external links for non-default servers
1217
- const externalLinks = server.externalLinks !== undefined ? server.externalLinks : !server.default;
1218
- return [
1219
- server.baseUrl,
1220
- externalLinks
1221
- ];
1222
- }));
1223
- }, [
1224
- dataServers
1225
- ]);
1226
- return (0, $fj9kP$useCallback)((record)=>{
1227
- const computedComponentExternalLinks = $87656edf926c0f1f$var$compute(componentExternalLinks, record);
1228
- // If the component explicitly asks not to display as external links, use an internal link
1229
- if (computedComponentExternalLinks === false) return false;
1230
- if (!record?.id) return false;
1231
- const serverBaseUrl = Object.keys(serversExternalLinks).find((baseUrl)=>record?.id.startsWith(baseUrl));
1232
- // If no matching data servers could be found, assume we have an internal link
1233
- if (!serverBaseUrl) return false;
1234
- const computedServerExternalLinks = $87656edf926c0f1f$var$compute(serversExternalLinks[serverBaseUrl], record);
1235
- // If the data server explicitly asks not to display as external links, use an internal link
1236
- if (computedServerExternalLinks === false) return false;
1237
- if ($87656edf926c0f1f$var$isURL(computedComponentExternalLinks)) return computedComponentExternalLinks;
1238
- if ($87656edf926c0f1f$var$isURL(computedServerExternalLinks)) return computedServerExternalLinks;
1239
- return record.id;
1240
- }, [
1241
- serversExternalLinks,
1242
- componentExternalLinks
1243
- ]);
1229
+
1230
+
1231
+
1232
+ const $cdd3c71a628eeefe$var$configureUserStorage = ()=>({
1233
+ transformConfig: async (config)=>{
1234
+ const token = localStorage.getItem('token');
1235
+ // If the user is logged in
1236
+ if (token) {
1237
+ const payload = (0, $fj9kP$jwtdecode)(token);
1238
+ const webId = payload.webId || payload.webid; // Currently we must deal with both formats
1239
+ const { json: user } = await config.httpClient(webId);
1240
+ if (user) {
1241
+ const newConfig = {
1242
+ ...config
1243
+ };
1244
+ newConfig.dataServers.user = {
1245
+ pod: true,
1246
+ default: true,
1247
+ authServer: true,
1248
+ baseUrl: user['pim:storage'] || (0, $fj9kP$urljoin)(webId, 'data'),
1249
+ sparqlEndpoint: user.endpoints?.['void:sparqlEndpoint'] || (0, $fj9kP$urljoin)(webId, 'sparql'),
1250
+ proxyUrl: user.endpoints?.proxyUrl,
1251
+ containers: []
1252
+ };
1253
+ if (!newConfig.jsonContext) newConfig.jsonContext = [
1254
+ 'https://www.w3.org/ns/activitystreams',
1255
+ (0, $fj9kP$urljoin)(new URL(webId).origin, '/.well-known/context.jsonld')
1256
+ ];
1257
+ return newConfig;
1258
+ }
1259
+ }
1260
+ // Nothing to change
1261
+ return config;
1262
+ }
1263
+ });
1264
+ var $cdd3c71a628eeefe$export$2e2bcd8739ae039 = $cdd3c71a628eeefe$var$configureUserStorage;
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+ const $d7a7484a035f15cd$var$getContainerFromDataRegistration = async (dataRegistrationUri, config)=>{
1273
+ const { json: dataRegistration } = await config.httpClient(dataRegistrationUri, {
1274
+ headers: new Headers({
1275
+ Accept: 'application/ld+json',
1276
+ Prefer: 'return=representation; include="http://www.w3.org/ns/ldp#PreferMinimalContainer"'
1277
+ })
1278
+ });
1279
+ const shapeTreeUri = dataRegistration['interop:registeredShapeTree'];
1280
+ let { json: shapeTree } = await (0, $fj9kP$fetchUtils).fetchJson(shapeTreeUri, {
1281
+ headers: new Headers({
1282
+ Accept: 'application/ld+json'
1283
+ })
1284
+ });
1285
+ shapeTree = await (0, $fj9kP$jsonld).compact(shapeTree, {
1286
+ st: 'http://www.w3.org/ns/shapetrees#',
1287
+ skos: 'http://www.w3.org/2004/02/skos/core#',
1288
+ expectsType: {
1289
+ '@id': 'st:expectsType',
1290
+ '@type': '@id'
1291
+ },
1292
+ shape: {
1293
+ '@id': 'st:shape',
1294
+ '@type': '@id'
1295
+ },
1296
+ describesInstance: {
1297
+ '@id': 'st:describesInstance',
1298
+ '@type': '@id'
1299
+ },
1300
+ label: {
1301
+ '@id': 'skos:prefLabel',
1302
+ '@container': '@language'
1303
+ }
1304
+ });
1305
+ const { baseUrl: baseUrl } = config.dataServers.user;
1306
+ const containerPath = dataRegistration.id.replace(baseUrl, '');
1307
+ const container = {
1308
+ path: containerPath,
1309
+ shapeTreeUri: shapeTreeUri,
1310
+ label: shapeTree.label,
1311
+ labelPredicate: shapeTree.describesInstance,
1312
+ binaryResources: shapeTree.expectsType === 'st:NonRDFResource'
1313
+ };
1314
+ if (shapeTree.shape) {
1315
+ const { json: shape } = await (0, $fj9kP$fetchUtils).fetchJson(shapeTree.shape, {
1316
+ headers: new Headers({
1317
+ Accept: 'application/ld+json'
1318
+ })
1319
+ });
1320
+ container.types = shape?.[0]?.['http://www.w3.org/ns/shacl#targetClass']?.map((node)=>node?.['@id']);
1321
+ }
1322
+ return container;
1244
1323
  };
1245
- var $87656edf926c0f1f$export$2e2bcd8739ae039 = $87656edf926c0f1f$var$useGetExternalLink;
1324
+ var $d7a7484a035f15cd$export$2e2bcd8739ae039 = $d7a7484a035f15cd$var$getContainerFromDataRegistration;
1325
+
1326
+
1327
+ /**
1328
+ * Return a function that look if an app (clientId) is registered with an user (webId)
1329
+ * If not, it redirects to the endpoint provided by the user's authorization agent
1330
+ * See https://solid.github.io/data-interoperability-panel/specification/#authorization-agent
1331
+ */ const $2c257b4237cb14ca$var$fetchAppRegistration = ()=>({
1332
+ transformConfig: async (config)=>{
1333
+ const token = localStorage.getItem('token');
1334
+ // If the user is logged in
1335
+ if (token) {
1336
+ const payload = (0, $fj9kP$jwtdecode)(token);
1337
+ const webId = payload.webId || payload.webid; // Currently we must deal with both formats
1338
+ const { json: user } = await config.httpClient(webId);
1339
+ const authAgentUri = user['interop:hasAuthorizationAgent'];
1340
+ if (authAgentUri) {
1341
+ // Find if an application registration is linked to this user
1342
+ // See https://solid.github.io/data-interoperability-panel/specification/#agent-registration-discovery
1343
+ const { headers: headers } = await config.httpClient(authAgentUri);
1344
+ if (headers.has('Link')) {
1345
+ const linkHeader = (0, $fj9kP$httplinkheader).parse(headers.get('Link'));
1346
+ const registeredAgentLinkHeader = linkHeader.rel('http://www.w3.org/ns/solid/interop#registeredAgent');
1347
+ if (registeredAgentLinkHeader.length > 0) {
1348
+ const appRegistrationUri = registeredAgentLinkHeader[0].anchor;
1349
+ const { json: appRegistration } = await config.httpClient(appRegistrationUri);
1350
+ const newConfig = {
1351
+ ...config
1352
+ };
1353
+ // Load data grants concurrently to improve performances
1354
+ const results = await Promise.all((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(appRegistration['interop:hasAccessGrant']).map(async (accessGrantUri)=>{
1355
+ const { json: accessGrant } = await config.httpClient(accessGrantUri);
1356
+ return Promise.all((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(accessGrant['interop:hasDataGrant']).map(async (dataGrantUri)=>{
1357
+ const { json: dataGrant } = await config.httpClient(dataGrantUri);
1358
+ return (0, $d7a7484a035f15cd$export$2e2bcd8739ae039)(dataGrant['interop:hasDataRegistration'], config);
1359
+ }));
1360
+ }));
1361
+ newConfig.dataServers.user.containers = results.flat();
1362
+ return newConfig;
1363
+ }
1364
+ }
1365
+ }
1366
+ }
1367
+ return config;
1368
+ }
1369
+ });
1370
+ var $2c257b4237cb14ca$export$2e2bcd8739ae039 = $2c257b4237cb14ca$var$fetchAppRegistration;
1371
+
1372
+
1373
+
1374
+
1375
+ const $91255e144bb55afc$var$fetchDataRegistry = ()=>({
1376
+ transformConfig: async (config)=>{
1377
+ const token = localStorage.getItem('token');
1378
+ // If the user is logged in
1379
+ if (token) {
1380
+ if (!config.dataServers.user) throw new Error(`You must configure the user storage first with the configureUserStorage plugin`);
1381
+ const payload = (0, $fj9kP$jwtdecode)(token);
1382
+ const webId = payload.webId || payload.webid; // Currently we must deal with both formats
1383
+ const { json: user } = await config.httpClient(webId);
1384
+ const { json: registrySet } = await config.httpClient(user['interop:hasRegistrySet']);
1385
+ const { json: dataRegistry } = await config.httpClient(registrySet['interop:hasDataRegistry']);
1386
+ if (dataRegistry['interop:hasDataRegistration']) {
1387
+ const results = await Promise.all(dataRegistry['interop:hasDataRegistration'].map((dataRegistrationUri)=>{
1388
+ return (0, $d7a7484a035f15cd$export$2e2bcd8739ae039)(dataRegistrationUri, config);
1389
+ }));
1390
+ const newConfig = {
1391
+ ...config
1392
+ };
1393
+ newConfig.dataServers.user.containers?.push(...results.flat());
1394
+ return newConfig;
1395
+ }
1396
+ }
1397
+ // Nothing to change
1398
+ return config;
1399
+ }
1400
+ });
1401
+ var $91255e144bb55afc$export$2e2bcd8739ae039 = $91255e144bb55afc$var$fetchDataRegistry;
1246
1402
 
1247
1403
 
1248
1404
 
1249
1405
 
1250
1406
 
1251
- const $e5a0eacd756fd1d5$var$useDataModel = (resourceId)=>{
1252
- // Get the raw data provider, since useDataProvider returns a wrapper
1253
- const dataProvider = (0, $fj9kP$useContext)((0, $fj9kP$DataProviderContext));
1254
- const [dataModel, setDataModel] = (0, $fj9kP$useState)(undefined); // TODO: Type this object
1407
+
1408
+ const $2d5f75df63129ebc$var$fetchTypeIndexes = ()=>({
1409
+ transformConfig: async (config)=>{
1410
+ const token = localStorage.getItem('token');
1411
+ // If the user is logged in
1412
+ if (token) {
1413
+ if (!config.dataServers.user) throw new Error(`You must configure the user storage first with the configureUserStorage plugin`);
1414
+ const payload = (0, $fj9kP$jwtdecode)(token);
1415
+ const webId = payload.webId || payload.webid; // Currently we must deal with both formats
1416
+ const { json: user } = await config.httpClient(webId);
1417
+ const typeRegistrations = {
1418
+ public: [],
1419
+ private: []
1420
+ };
1421
+ if (user['solid:publicTypeIndex']) {
1422
+ const { json: publicTypeIndex } = await config.httpClient(user['solid:publicTypeIndex']);
1423
+ if (publicTypeIndex) typeRegistrations.public = (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(publicTypeIndex['solid:hasTypeRegistration']);
1424
+ }
1425
+ if (user['pim:preferencesFile']) {
1426
+ const { json: preferencesFile } = await config.httpClient(user['pim:preferencesFile']);
1427
+ if (preferencesFile?.['solid:privateTypeIndex']) {
1428
+ const { json: privateTypeIndex } = await config.httpClient(preferencesFile['solid:privateTypeIndex']);
1429
+ typeRegistrations.private = (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(privateTypeIndex['solid:hasTypeRegistration']);
1430
+ }
1431
+ }
1432
+ if (typeRegistrations.public.length > 0 || typeRegistrations.private.length > 0) {
1433
+ const newConfig = {
1434
+ ...config
1435
+ };
1436
+ for (const mode of Object.keys(typeRegistrations))for (const typeRegistration of typeRegistrations[mode]){
1437
+ const types = (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(typeRegistration['solid:forClass']);
1438
+ const container = {
1439
+ label: {
1440
+ en: (0, $fj9kP$capitalCase)(types[0].split(':')[1], {
1441
+ separateNumbers: true
1442
+ })
1443
+ },
1444
+ path: typeRegistration['solid:instanceContainer'].replace(newConfig.dataServers.user.baseUrl, ''),
1445
+ types: await (0, $36aa010ec46eaf45$export$2e2bcd8739ae039)(types, user['@context']),
1446
+ private: mode === 'private'
1447
+ };
1448
+ const containerIndex = newConfig.dataServers.user.containers.findIndex((c)=>c.path === container.path);
1449
+ if (containerIndex !== -1) // If a container with this URI already exist, add type registration information if they are not set
1450
+ newConfig.dataServers.user.containers[containerIndex] = {
1451
+ ...container,
1452
+ ...newConfig.dataServers.user.containers[containerIndex]
1453
+ };
1454
+ else newConfig.dataServers.user.containers.push(container);
1455
+ }
1456
+ return newConfig;
1457
+ }
1458
+ }
1459
+ return config;
1460
+ }
1461
+ });
1462
+ var $2d5f75df63129ebc$export$2e2bcd8739ae039 = $2d5f75df63129ebc$var$fetchTypeIndexes;
1463
+
1464
+
1465
+
1466
+
1467
+ const $a87fd63d8fca0380$var$fetchVoidEndpoints = ()=>({
1468
+ transformConfig: async (config)=>{
1469
+ let results = [];
1470
+ try {
1471
+ results = await Promise.all(Object.entries(config.dataServers).filter(([_, server])=>server.pod !== true && server.void !== false).map(async ([key, server])=>config.httpClient(new URL('/.well-known/void', server.baseUrl).toString()).then((result)=>({
1472
+ key: key,
1473
+ context: result.json?.['@context'],
1474
+ datasets: result.json?.['@graph']
1475
+ })).catch((e)=>{
1476
+ if (e.status === 404 || e.status === 401 || e.status === 500) return {
1477
+ key: key,
1478
+ error: e.message
1479
+ };
1480
+ throw e;
1481
+ })));
1482
+ } catch (e) {
1483
+ // Do not throw error if no endpoint found
1484
+ }
1485
+ results = results.filter((result)=>result.datasets);
1486
+ if (results.length > 0) {
1487
+ const newConfig = {
1488
+ ...config
1489
+ };
1490
+ for (const result of results){
1491
+ // Ignore unfetchable endpoints
1492
+ if (result.datasets) for (const dataset of result.datasets){
1493
+ newConfig.dataServers[result.key].name ??= dataset['dc:title'];
1494
+ newConfig.dataServers[result.key].description ??= dataset['dc:description'];
1495
+ newConfig.dataServers[result.key].sparqlEndpoint ??= dataset['void:sparqlEndpoint'];
1496
+ newConfig.dataServers[result.key].containers ??= [];
1497
+ for (const partition of (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(dataset['void:classPartition']))for (const type of (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(partition['void:class'])){
1498
+ const path = partition['void:uriSpace'].replace(dataset['void:uriSpace'], '/');
1499
+ const expandedTypes = await (0, $36aa010ec46eaf45$export$2e2bcd8739ae039)([
1500
+ type
1501
+ ], result.context);
1502
+ const containerIndex = newConfig.dataServers[result.key].containers.findIndex((c)=>c.types?.some((t)=>expandedTypes.includes(t)));
1503
+ if (containerIndex && containerIndex !== -1) // If a container with this type already exist, overwrite path and types
1504
+ newConfig.dataServers[result.key].containers[containerIndex] = {
1505
+ ...newConfig.dataServers[result.key].containers[containerIndex],
1506
+ path: path,
1507
+ types: expandedTypes
1508
+ };
1509
+ else newConfig.dataServers[result.key].containers.push({
1510
+ path: path,
1511
+ types: expandedTypes
1512
+ });
1513
+ }
1514
+ }
1515
+ }
1516
+ return newConfig;
1517
+ } else return config;
1518
+ }
1519
+ });
1520
+ var $a87fd63d8fca0380$export$2e2bcd8739ae039 = $a87fd63d8fca0380$var$fetchVoidEndpoints;
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+ const $3677b4de74c3d10d$var$useDataProviderConfig = ()=>{
1527
+ const dataProvider = (0, $fj9kP$useDataProvider)();
1528
+ const [config, setConfig] = (0, $fj9kP$useState)();
1529
+ const [isLoading, setIsLoading] = (0, $fj9kP$useState)(false);
1255
1530
  (0, $fj9kP$useEffect)(()=>{
1256
- dataProvider.getDataModels().then((results)=>setDataModel(results[resourceId]));
1531
+ if (!isLoading && !config) {
1532
+ setIsLoading(true);
1533
+ dataProvider.getConfig().then((c)=>{
1534
+ setConfig(c);
1535
+ setIsLoading(false);
1536
+ });
1537
+ }
1257
1538
  }, [
1258
1539
  dataProvider,
1259
- resourceId,
1260
- setDataModel
1540
+ setConfig,
1541
+ config,
1542
+ setIsLoading,
1543
+ isLoading
1261
1544
  ]);
1262
- return dataModel;
1545
+ return config;
1263
1546
  };
1264
- var $e5a0eacd756fd1d5$export$2e2bcd8739ae039 = $e5a0eacd756fd1d5$var$useDataModel;
1547
+ var $3677b4de74c3d10d$export$2e2bcd8739ae039 = $3677b4de74c3d10d$var$useDataProviderConfig;
1265
1548
 
1266
1549
 
1267
1550
 
1551
+ const $52b38c5b114c348c$var$compactPredicate = async (predicate, context)=>{
1552
+ const result = await (0, $fj9kP$jsonld).compact({
1553
+ [predicate]: ''
1554
+ }, context);
1555
+ return Object.keys(result).find((key)=>key !== '@context');
1556
+ };
1557
+ var $52b38c5b114c348c$export$2e2bcd8739ae039 = $52b38c5b114c348c$var$compactPredicate;
1268
1558
 
1269
- const $4daf4cf698ee4eed$var$useDataServers = ()=>{
1270
- const dataProvider = (0, $fj9kP$useDataProvider)();
1271
- const [dataServers, setDataServers] = (0, $fj9kP$useState)();
1559
+
1560
+ const $72db0904d77f0f1e$var$useCompactPredicate = (predicate, context)=>{
1561
+ const config = (0, $3677b4de74c3d10d$export$2e2bcd8739ae039)();
1562
+ const [result, setResult] = (0, $fj9kP$useState)();
1272
1563
  (0, $fj9kP$useEffect)(()=>{
1273
- dataProvider.getDataServers().then((results)=>{
1274
- setDataServers(results);
1564
+ if (config && predicate) (0, $52b38c5b114c348c$export$2e2bcd8739ae039)(predicate, context || config.jsonContext).then((r)=>{
1565
+ setResult(r);
1275
1566
  });
1276
1567
  }, [
1277
- dataProvider,
1278
- setDataServers
1568
+ predicate,
1569
+ setResult,
1570
+ config,
1571
+ context
1279
1572
  ]);
1280
- return dataServers;
1573
+ return result;
1574
+ };
1575
+ var $72db0904d77f0f1e$export$2e2bcd8739ae039 = $72db0904d77f0f1e$var$useCompactPredicate;
1576
+
1577
+
1578
+
1579
+
1580
+ const $3a9656756670cb78$var$useDataModels = ()=>{
1581
+ const config = (0, $3677b4de74c3d10d$export$2e2bcd8739ae039)();
1582
+ return config?.resources;
1583
+ };
1584
+ var $3a9656756670cb78$export$2e2bcd8739ae039 = $3a9656756670cb78$var$useDataModels;
1585
+
1586
+
1587
+
1588
+ const $4daf4cf698ee4eed$var$useDataServers = ()=>{
1589
+ const config = (0, $3677b4de74c3d10d$export$2e2bcd8739ae039)();
1590
+ return config?.dataServers;
1281
1591
  };
1282
1592
  var $4daf4cf698ee4eed$export$2e2bcd8739ae039 = $4daf4cf698ee4eed$var$useDataServers;
1283
1593
 
1284
1594
 
1285
1595
 
1286
- const $586fa0ea9d02fa12$var$useContainers = (resourceId, serverKeys = "@all")=>{
1287
- const dataModel = (0, $e5a0eacd756fd1d5$export$2e2bcd8739ae039)(resourceId);
1596
+
1597
+
1598
+ const $586fa0ea9d02fa12$var$useContainers = (resourceId, serverKeys)=>{
1599
+ const dataModels = (0, $3a9656756670cb78$export$2e2bcd8739ae039)();
1288
1600
  const dataServers = (0, $4daf4cf698ee4eed$export$2e2bcd8739ae039)();
1289
- const [containers, setContainers] = (0, $fj9kP$useState)();
1601
+ const [containers, setContainers] = (0, $fj9kP$useState)([]);
1602
+ // Warning: if serverKeys change, the containers list will not be updated (otherwise we have an infinite re-render loop)
1290
1603
  (0, $fj9kP$useEffect)(()=>{
1291
- if (dataModel && dataServers) setContainers((0, $15b841e67a1ba752$export$2e2bcd8739ae039)(dataModel.types, serverKeys, dataServers));
1604
+ if (dataServers && dataModels) {
1605
+ if (resourceId) {
1606
+ const dataModel = dataModels[resourceId];
1607
+ setContainers((0, $15b841e67a1ba752$export$2e2bcd8739ae039)((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(dataModel.types), serverKeys, dataServers));
1608
+ } else {
1609
+ const parsedServerKeys = (0, $99cc2e4a2a3c100b$export$2e2bcd8739ae039)(serverKeys || '@all', dataServers);
1610
+ setContainers(parsedServerKeys.map((serverKey)=>dataServers[serverKey].containers).flat());
1611
+ }
1612
+ }
1292
1613
  }, [
1293
- dataModel,
1614
+ dataModels,
1294
1615
  dataServers,
1295
- serverKeys
1616
+ setContainers,
1617
+ resourceId
1296
1618
  ]);
1297
1619
  return containers;
1298
1620
  };
@@ -1304,96 +1626,164 @@ var $586fa0ea9d02fa12$export$2e2bcd8739ae039 = $586fa0ea9d02fa12$var$useContaine
1304
1626
 
1305
1627
 
1306
1628
 
1307
- const $7d9911a250866af6$var$findCreateContainerWithTypes = (types, createServerKey, dataServers)=>{
1308
- const containers = [];
1309
- Object.keys(dataServers[createServerKey].containers?.[createServerKey] || {}).forEach((type)=>{
1310
- if (types.includes(type)) dataServers[createServerKey].containers[createServerKey][type].forEach((path)=>{
1311
- const containerUri = (0, $fj9kP$urljoin)(dataServers[createServerKey].baseUrl, path);
1312
- if (!containers.includes(containerUri)) containers.push(containerUri);
1629
+ const $9d2c669bd52faa31$var$useContainersByTypes = (types)=>{
1630
+ const dataServers = (0, $4daf4cf698ee4eed$export$2e2bcd8739ae039)();
1631
+ const dataProvider = (0, $fj9kP$useDataProvider)();
1632
+ const [containers, setContainers] = (0, $fj9kP$useState)([]);
1633
+ (0, $fj9kP$useEffect)(()=>{
1634
+ if (dataServers && types) dataProvider.expandTypes((0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(types)).then((expandedTypes)=>{
1635
+ setContainers((0, $15b841e67a1ba752$export$2e2bcd8739ae039)(expandedTypes, '@all', dataServers));
1636
+ }).catch(()=>{
1637
+ // Ignore errors
1313
1638
  });
1314
- });
1315
- if (containers.length === 0) throw new Error(`No container found matching with types ${JSON.stringify(types)}. You can set explicitely the create.container property of the resource.`);
1316
- else if (containers.length > 1) throw new Error(`More than one container found matching with types ${JSON.stringify(types)}. You must set the create.server or create.container property for the resource.`);
1317
- return containers[0];
1639
+ }, [
1640
+ dataServers,
1641
+ dataProvider,
1642
+ setContainers,
1643
+ types
1644
+ ]);
1645
+ return containers;
1318
1646
  };
1319
- var $7d9911a250866af6$export$2e2bcd8739ae039 = $7d9911a250866af6$var$findCreateContainerWithTypes;
1647
+ var $9d2c669bd52faa31$export$2e2bcd8739ae039 = $9d2c669bd52faa31$var$useContainersByTypes;
1648
+
1320
1649
 
1321
1650
 
1322
1651
 
1323
- /** @deprecated Use "useCreateContainerUri" instead */ const $7bd037d7ec9d51f8$var$useCreateContainer = (resourceId)=>{
1324
- const dataModel = (0, $e5a0eacd756fd1d5$export$2e2bcd8739ae039)(resourceId);
1652
+ const $43097d0b613bd4db$var$useContainerByUri = (containerUri)=>{
1325
1653
  const dataServers = (0, $4daf4cf698ee4eed$export$2e2bcd8739ae039)();
1326
- const [createContainer, setCreateContainer] = (0, $fj9kP$useState)();
1654
+ const [container, setContainer] = (0, $fj9kP$useState)();
1327
1655
  (0, $fj9kP$useEffect)(()=>{
1328
- if (dataModel && dataServers) {
1329
- if (dataModel.create?.container) {
1330
- const [serverKey, path] = Object.entries(dataModel.create.container)[0];
1331
- if (!serverKey || !dataServers[serverKey]) throw new Error(`Wrong key for the dataModel.create.container config of resource ${resourceId}`);
1332
- setCreateContainer((0, $fj9kP$urljoin)(dataServers[serverKey].baseUrl, path));
1333
- } else if (dataModel.create?.server) setCreateContainer((0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, dataModel.create?.server, dataServers));
1334
- else {
1335
- const defaultServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("default", dataServers);
1336
- setCreateContainer((0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, defaultServerKey, dataServers));
1337
- }
1338
- }
1656
+ if (dataServers && containerUri) Object.keys(dataServers).forEach((serverKey)=>{
1657
+ dataServers[serverKey].containers?.forEach((c)=>{
1658
+ if (c.uri === containerUri) setContainer(c);
1659
+ });
1660
+ });
1339
1661
  }, [
1340
- dataModel,
1341
1662
  dataServers,
1342
- setCreateContainer
1663
+ setContainer,
1664
+ containerUri
1343
1665
  ]);
1344
- return createContainer;
1666
+ return container;
1345
1667
  };
1346
- var $7bd037d7ec9d51f8$export$2e2bcd8739ae039 = $7bd037d7ec9d51f8$var$useCreateContainer;
1347
-
1668
+ var $43097d0b613bd4db$export$2e2bcd8739ae039 = $43097d0b613bd4db$var$useContainerByUri;
1348
1669
 
1349
1670
 
1350
1671
 
1351
1672
 
1352
1673
 
1353
1674
 
1675
+ const $7d9911a250866af6$var$findCreateContainerWithTypes = (types, createServerKey, dataServers)=>{
1676
+ if (!dataServers[createServerKey].containers) throw new Error(`Data server ${createServerKey} has no declared containers`);
1677
+ const matchingContainers = dataServers[createServerKey].containers.filter((container)=>container.types?.some((t)=>types.includes(t)));
1678
+ if (matchingContainers.length === 0) throw new Error(`No container found matching with types ${JSON.stringify(types)}. You can set explicitly the create.container property of the resource.`);
1679
+ else if (matchingContainers.length > 1) throw new Error(`More than one container found matching with types ${JSON.stringify(types)}. You must set the create.server or create.container property for the resource.`);
1680
+ return matchingContainers[0].uri;
1681
+ };
1682
+ var $7d9911a250866af6$export$2e2bcd8739ae039 = $7d9911a250866af6$var$findCreateContainerWithTypes;
1354
1683
 
1355
1684
 
1356
- const $3a9656756670cb78$var$useDataModels = ()=>{
1357
- const dataProvider = (0, $fj9kP$useDataProvider)();
1358
- const [dataModels, setDataModels] = (0, $fj9kP$useState)();
1359
- (0, $fj9kP$useEffect)(()=>{
1360
- dataProvider.getDataModels().then((results)=>{
1361
- setDataModels(results);
1362
- });
1363
- }, [
1364
- dataProvider,
1365
- setDataModels
1366
- ]);
1367
- return dataModels;
1368
- };
1369
- var $3a9656756670cb78$export$2e2bcd8739ae039 = $3a9656756670cb78$var$useDataModels;
1370
1685
 
1371
1686
 
1372
- const $35f3e75c86e51f35$var$useCreateContainerUri = ()=>{
1687
+ const $8dbb0c8c3814e663$var$useGetCreateContainerUri = ()=>{
1373
1688
  const dataModels = (0, $3a9656756670cb78$export$2e2bcd8739ae039)();
1374
1689
  const dataServers = (0, $4daf4cf698ee4eed$export$2e2bcd8739ae039)();
1375
- const getContainerUri = (0, $fj9kP$useCallback)((resourceId)=>{
1690
+ const getCreateContainerUri = (0, $fj9kP$useCallback)((resourceId)=>{
1376
1691
  if (!dataModels || !dataServers || !dataModels[resourceId]) return undefined;
1377
1692
  const dataModel = dataModels[resourceId];
1378
1693
  if (dataModel.create?.container) {
1379
1694
  const [serverKey, path] = Object.entries(dataModel.create.container)[0];
1380
1695
  if (!serverKey || !dataServers[serverKey]) throw new Error(`Wrong key for the dataModel.create.container config of resource ${resourceId}`);
1381
1696
  return (0, $fj9kP$urljoin)(dataServers[serverKey].baseUrl, path);
1697
+ } else if (dataModel.create?.server) return (0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, dataModel.create?.server, dataServers);
1698
+ else {
1699
+ const defaultServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)('default', dataServers);
1700
+ if (!defaultServerKey) throw new Error(`No default dataServer found. You can set explicitly one setting the "default" attribute to true`);
1701
+ return (0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, defaultServerKey, dataServers);
1382
1702
  }
1383
- if (dataModel.create?.server) return (0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, dataModel.create?.server, dataServers);
1384
- const defaultServerKey = (0, $8326b88c1a913ca9$export$2e2bcd8739ae039)("default", dataServers);
1385
- if (!defaultServerKey) throw new Error(`No default dataServer found. You can set explicitly one setting the "default" attribute to true`);
1386
- return (0, $7d9911a250866af6$export$2e2bcd8739ae039)(dataModel.types, defaultServerKey, dataServers);
1387
1703
  }, [
1388
1704
  dataModels,
1389
1705
  dataServers
1390
1706
  ]);
1391
- return getContainerUri;
1707
+ return getCreateContainerUri;
1708
+ };
1709
+ var $8dbb0c8c3814e663$export$2e2bcd8739ae039 = $8dbb0c8c3814e663$var$useGetCreateContainerUri;
1710
+
1711
+
1712
+ const $35f3e75c86e51f35$var$useCreateContainerUri = (resourceId)=>{
1713
+ const getCreateContainerUri = (0, $8dbb0c8c3814e663$export$2e2bcd8739ae039)();
1714
+ const createContainerUri = (0, $fj9kP$useMemo)(()=>getCreateContainerUri(resourceId), [
1715
+ getCreateContainerUri,
1716
+ resourceId
1717
+ ]);
1718
+ return createContainerUri;
1392
1719
  };
1393
1720
  var $35f3e75c86e51f35$export$2e2bcd8739ae039 = $35f3e75c86e51f35$var$useCreateContainerUri;
1394
1721
 
1395
1722
 
1396
1723
 
1724
+ const $e5a0eacd756fd1d5$var$useDataModel = (resourceId)=>{
1725
+ const config = (0, $3677b4de74c3d10d$export$2e2bcd8739ae039)();
1726
+ return config?.resources[resourceId];
1727
+ };
1728
+ var $e5a0eacd756fd1d5$export$2e2bcd8739ae039 = $e5a0eacd756fd1d5$var$useDataModel;
1729
+
1730
+
1731
+
1732
+
1733
+
1734
+
1735
+
1736
+
1737
+ const $87656edf926c0f1f$var$compute = (externalLinks, record)=>typeof externalLinks === 'function' ? externalLinks(record) : externalLinks;
1738
+ const $87656edf926c0f1f$var$isURL = (url)=>typeof url === 'string' && url.startsWith('http');
1739
+ const $87656edf926c0f1f$var$useGetExternalLink = (componentExternalLinks)=>{
1740
+ // Since the externalLinks config is defined only locally, we don't need to wait for VOID endpoints fetching
1741
+ const dataProvider = (0, $fj9kP$useContext)((0, $fj9kP$DataProviderContext));
1742
+ const dataServers = dataProvider.getLocalDataServers();
1743
+ const serversExternalLinks = (0, $fj9kP$useMemo)(()=>{
1744
+ if (dataServers) return Object.fromEntries(Object.values(dataServers).map((server)=>{
1745
+ // If externalLinks is not defined in the data server, use external links for non-default servers
1746
+ const externalLinks = server.externalLinks !== undefined ? server.externalLinks : !server.default;
1747
+ return [
1748
+ server.baseUrl,
1749
+ externalLinks
1750
+ ];
1751
+ }));
1752
+ }, [
1753
+ dataServers
1754
+ ]);
1755
+ return (0, $fj9kP$useCallback)((record)=>{
1756
+ const computedComponentExternalLinks = $87656edf926c0f1f$var$compute(componentExternalLinks, record);
1757
+ // If the component explicitly asks not to display as external links, use an internal link
1758
+ if (computedComponentExternalLinks === false) return false;
1759
+ if (!record?.id) return false;
1760
+ const serverBaseUrl = Object.keys(serversExternalLinks).find((baseUrl)=>record?.id.startsWith(baseUrl));
1761
+ // If no matching data servers could be found, assume we have an internal link
1762
+ if (!serverBaseUrl) return false;
1763
+ const computedServerExternalLinks = $87656edf926c0f1f$var$compute(serversExternalLinks[serverBaseUrl], record);
1764
+ // If the data server explicitly asks not to display as external links, use an internal link
1765
+ if (computedServerExternalLinks === false) return false;
1766
+ if ($87656edf926c0f1f$var$isURL(computedComponentExternalLinks)) return computedComponentExternalLinks;
1767
+ if ($87656edf926c0f1f$var$isURL(computedServerExternalLinks)) return computedServerExternalLinks;
1768
+ return record.id;
1769
+ }, [
1770
+ serversExternalLinks,
1771
+ componentExternalLinks
1772
+ ]);
1773
+ };
1774
+ var $87656edf926c0f1f$export$2e2bcd8739ae039 = $87656edf926c0f1f$var$useGetExternalLink;
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+ const $487567a146508c4e$var$useGetPrefixFromUri = ()=>{
1781
+ const config = (0, $3677b4de74c3d10d$export$2e2bcd8739ae039)();
1782
+ return (0, $fj9kP$useCallback)((uri)=>(0, $861da9be2c0e62eb$export$2e2bcd8739ae039)(uri, config.ontologies), [
1783
+ config?.ontologies
1784
+ ]);
1785
+ };
1786
+ var $487567a146508c4e$export$2e2bcd8739ae039 = $487567a146508c4e$var$useGetPrefixFromUri;
1397
1787
 
1398
1788
 
1399
1789
 
@@ -1548,15 +1938,15 @@ var $1d8c1cbe606a94ae$export$2e2bcd8739ae039 = $1d8c1cbe606a94ae$var$GroupedRefe
1548
1938
 
1549
1939
  const $6844bbce0ad66151$var$useReferenceInputStyles = (0, $fj9kP$muistylesmakeStyles)({
1550
1940
  form: {
1551
- display: "flex"
1941
+ display: 'flex'
1552
1942
  },
1553
1943
  input: {
1554
- paddingRight: "20px"
1944
+ paddingRight: '20px'
1555
1945
  }
1556
1946
  });
1557
1947
  const $6844bbce0ad66151$var$useHideInputStyles = (0, $fj9kP$muistylesmakeStyles)({
1558
1948
  root: {
1559
- display: "none"
1949
+ display: 'none'
1560
1950
  }
1561
1951
  });
1562
1952
  const $6844bbce0ad66151$var$ReificationArrayInput = (props)=>{
@@ -1592,21 +1982,21 @@ var $6844bbce0ad66151$export$2e2bcd8739ae039 = $6844bbce0ad66151$var$Reification
1592
1982
  * Find the solid notification description resource for a given resource URI.
1593
1983
  */ const $03d52e691e8dc945$var$findDescriptionResource = async (authenticatedFetch, resourceUri)=>{
1594
1984
  const { headers: headers } = await authenticatedFetch(resourceUri, {
1595
- method: "HEAD"
1985
+ method: 'HEAD'
1596
1986
  });
1597
- const linkHeader = headers.get("Link");
1987
+ const linkHeader = headers.get('Link');
1598
1988
  const matches = linkHeader?.match(/<([^>]+)>;\s*rel="(?:describedby|http:\/\/www\.w3\.org\/ns\/solid\/terms#storageDescription)"/);
1599
1989
  if (!matches?.[1]) return undefined;
1600
1990
  // Don't use authenticatedFetch to get this endpoint
1601
1991
  const response = await fetch(matches[1], {
1602
1992
  headers: new Headers({
1603
- Accept: "application/ld+json"
1993
+ Accept: 'application/ld+json'
1604
1994
  })
1605
1995
  });
1606
1996
  return await response.json();
1607
1997
  };
1608
1998
  const $03d52e691e8dc945$export$3edfe18db119b920 = async (authenticatedFetch, resourceUri, options = {
1609
- type: "WebSocketChannel2023"
1999
+ type: 'WebSocketChannel2023'
1610
2000
  })=>{
1611
2001
  const { type: type, closeAfter: closeAfter, startIn: startIn, rate: rate } = options;
1612
2002
  let { startAt: startAt, endAt: endAt } = options;
@@ -1616,13 +2006,13 @@ const $03d52e691e8dc945$export$3edfe18db119b920 = async (authenticatedFetch, res
1616
2006
  // TODO: use a json-ld parser / ldo in the future for this...
1617
2007
  // Get solid notification subscription service for the given type.
1618
2008
  const subscriptionService = (await Promise.all(// Get the subscription service resources (that describe a channel type).
1619
- (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(descriptionResource.subscription || descriptionResource["notify:subscription"]).map(async (subscriptionServiceOrUri)=>{
2009
+ (0, $cc8adac4b83414eb$export$2e2bcd8739ae039)(descriptionResource.subscription || descriptionResource['notify:subscription']).map(async (subscriptionServiceOrUri)=>{
1620
2010
  // They might not be resolved...
1621
- if (typeof subscriptionServiceOrUri === "string") {
2011
+ if (typeof subscriptionServiceOrUri === 'string') {
1622
2012
  // Don't use authenticatedFetch to get this endpoint
1623
2013
  const response = await fetch(subscriptionServiceOrUri, {
1624
2014
  headers: new Headers({
1625
- Accept: "application/ld+json"
2015
+ Accept: 'application/ld+json'
1626
2016
  })
1627
2017
  });
1628
2018
  return await response.json();
@@ -1630,16 +2020,16 @@ const $03d52e691e8dc945$export$3edfe18db119b920 = async (authenticatedFetch, res
1630
2020
  return subscriptionServiceOrUri;
1631
2021
  }))).find((service)=>{
1632
2022
  // Find for the correct channel type (e.g. web socket).
1633
- const channelType = service.channelType ?? service["notify:channelType"];
2023
+ const channelType = service.channelType ?? service['notify:channelType'];
1634
2024
  return channelType === type || channelType === `notify:${type}`;
1635
2025
  });
1636
2026
  if (!subscriptionService) throw new Error(`No solid notification subscription service found for type ${type}`);
1637
2027
  // Create a new channel.
1638
- const { json: channel } = await authenticatedFetch(subscriptionService.id || subscriptionService["@id"], {
1639
- method: "POST",
2028
+ const { json: channel } = await authenticatedFetch(subscriptionService.id || subscriptionService['@id'], {
2029
+ method: 'POST',
1640
2030
  body: JSON.stringify({
1641
- "@context": "https://www.w3.org/ns/solid/notifications-context/v1",
1642
- type: "WebSocketChannel2023",
2031
+ '@context': 'https://www.w3.org/ns/solid/notifications-context/v1',
2032
+ type: 'WebSocketChannel2023',
1643
2033
  topic: resourceUri,
1644
2034
  startAt: startAt,
1645
2035
  endAt: endAt,
@@ -1650,7 +2040,7 @@ const $03d52e691e8dc945$export$3edfe18db119b920 = async (authenticatedFetch, res
1650
2040
  };
1651
2041
  const $03d52e691e8dc945$export$28772ab4c256e709 = async (authenticatedFetch, resourceUri, options)=>{
1652
2042
  const channel = await $03d52e691e8dc945$export$3edfe18db119b920(authenticatedFetch, resourceUri, options);
1653
- const receiveFrom = channel.receiveFrom || channel["notify:receiveFrom"];
2043
+ const receiveFrom = channel.receiveFrom || channel['notify:receiveFrom'];
1654
2044
  return new WebSocket(receiveFrom);
1655
2045
  };
1656
2046
  const $03d52e691e8dc945$var$registeredWebSockets = new Map();
@@ -1660,7 +2050,7 @@ const $03d52e691e8dc945$var$registeredWebSockets = new Map();
1660
2050
  * @param options Options to pass to @see createSolidNotificationChannel, if the channel does not exist yet.
1661
2051
  * @returns {WebSocket} A new or existing web socket that subscribed to the given resource.
1662
2052
  */ const $03d52e691e8dc945$export$8d60734939c59ced = async (authenticatedFetch, resourceUri, options = {
1663
- type: "WebSocketChannel2023",
2053
+ type: 'WebSocketChannel2023',
1664
2054
  closeAfter: 3600000
1665
2055
  })=>{
1666
2056
  const socket = $03d52e691e8dc945$var$registeredWebSockets.get(resourceUri);
@@ -1670,10 +2060,10 @@ const $03d52e691e8dc945$var$registeredWebSockets = new Map();
1670
2060
  // This prevents racing conditions that create multiple channels.
1671
2061
  const wsPromise = $03d52e691e8dc945$export$28772ab4c256e709(authenticatedFetch, resourceUri, {
1672
2062
  ...options,
1673
- type: "WebSocketChannel2023"
2063
+ type: 'WebSocketChannel2023'
1674
2064
  }).then((ws)=>{
1675
2065
  // Remove the promise from the cache, if it closes.
1676
- ws.addEventListener("close", (e)=>{
2066
+ ws.addEventListener('close', (e)=>{
1677
2067
  $03d52e691e8dc945$var$registeredWebSockets.delete(resourceUri);
1678
2068
  });
1679
2069
  // Close the socket, if the endAt / closeAfter time is reached.
@@ -1691,5 +2081,5 @@ const $03d52e691e8dc945$var$registeredWebSockets = new Map();
1691
2081
 
1692
2082
 
1693
2083
 
1694
- export {$243bf28fbb1b868f$export$2e2bcd8739ae039 as dataProvider, $6cde9a8fbbde3ffb$export$2e2bcd8739ae039 as buildSparqlQuery, $865f630cc944e818$export$2e2bcd8739ae039 as buildBlankNodesQuery, $87656edf926c0f1f$export$2e2bcd8739ae039 as useGetExternalLink, $586fa0ea9d02fa12$export$2e2bcd8739ae039 as useContainers, $7bd037d7ec9d51f8$export$2e2bcd8739ae039 as useCreateContainer, $35f3e75c86e51f35$export$2e2bcd8739ae039 as useCreateContainerUri, $e5a0eacd756fd1d5$export$2e2bcd8739ae039 as useDataModel, $3a9656756670cb78$export$2e2bcd8739ae039 as useDataModels, $4daf4cf698ee4eed$export$2e2bcd8739ae039 as useDataServers, $406574efa35ec6f1$export$2e2bcd8739ae039 as FilterHandler, $1d8c1cbe606a94ae$export$2e2bcd8739ae039 as GroupedReferenceHandler, $6844bbce0ad66151$export$2e2bcd8739ae039 as ReificationArrayInput, $03d52e691e8dc945$export$28772ab4c256e709 as createWsChannel, $03d52e691e8dc945$export$8d60734939c59ced as getOrCreateWsChannel, $03d52e691e8dc945$export$3edfe18db119b920 as createSolidNotificationChannel};
2084
+ export {$243bf28fbb1b868f$export$2e2bcd8739ae039 as dataProvider, $6cde9a8fbbde3ffb$export$2e2bcd8739ae039 as buildSparqlQuery, $865f630cc944e818$export$2e2bcd8739ae039 as buildBlankNodesQuery, $4872a1c30c1fc60e$export$2e2bcd8739ae039 as getUriFromPrefix, $861da9be2c0e62eb$export$2e2bcd8739ae039 as getPrefixFromUri, $cdd3c71a628eeefe$export$2e2bcd8739ae039 as configureUserStorage, $2c257b4237cb14ca$export$2e2bcd8739ae039 as fetchAppRegistration, $91255e144bb55afc$export$2e2bcd8739ae039 as fetchDataRegistry, $2d5f75df63129ebc$export$2e2bcd8739ae039 as fetchTypeIndexes, $a87fd63d8fca0380$export$2e2bcd8739ae039 as fetchVoidEndpoints, $72db0904d77f0f1e$export$2e2bcd8739ae039 as useCompactPredicate, $586fa0ea9d02fa12$export$2e2bcd8739ae039 as useContainers, $9d2c669bd52faa31$export$2e2bcd8739ae039 as useContainersByTypes, $43097d0b613bd4db$export$2e2bcd8739ae039 as useContainerByUri, $35f3e75c86e51f35$export$2e2bcd8739ae039 as useCreateContainerUri, $e5a0eacd756fd1d5$export$2e2bcd8739ae039 as useDataModel, $3a9656756670cb78$export$2e2bcd8739ae039 as useDataModels, $3677b4de74c3d10d$export$2e2bcd8739ae039 as useDataProviderConfig, $4daf4cf698ee4eed$export$2e2bcd8739ae039 as useDataServers, $8dbb0c8c3814e663$export$2e2bcd8739ae039 as useGetCreateContainerUri, $87656edf926c0f1f$export$2e2bcd8739ae039 as useGetExternalLink, $487567a146508c4e$export$2e2bcd8739ae039 as useGetPrefixFromUri, $406574efa35ec6f1$export$2e2bcd8739ae039 as FilterHandler, $1d8c1cbe606a94ae$export$2e2bcd8739ae039 as GroupedReferenceHandler, $6844bbce0ad66151$export$2e2bcd8739ae039 as ReificationArrayInput, $03d52e691e8dc945$export$28772ab4c256e709 as createWsChannel, $03d52e691e8dc945$export$8d60734939c59ced as getOrCreateWsChannel, $03d52e691e8dc945$export$3edfe18db119b920 as createSolidNotificationChannel};
1695
2085
  //# sourceMappingURL=index.es.js.map