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

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