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