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