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