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