@opengeospatial/jsonld-ui-utils 0.2.0

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.
@@ -0,0 +1,508 @@
1
+ import * as N3 from 'n3';
2
+ import * as jsonldLib from 'jsonld';
3
+ import { RdfXmlParser } from 'rdfxml-streaming-parser';
4
+
5
+ const jsonFetch = async url => {
6
+ const response = await fetch(url, {
7
+ headers: {
8
+ 'Accept': 'application/json'
9
+ }
10
+ });
11
+ return await response.json();
12
+ };
13
+ const mergeContexts = definitions => {
14
+ const mergePair = (a, b) => {
15
+ if (!a || !Object.keys(a).length) {
16
+ return b;
17
+ }
18
+ const result = {
19
+ ...a
20
+ };
21
+ for (const [k, v] of Object.entries(b)) {
22
+ result[k] = v;
23
+ }
24
+ return result;
25
+ };
26
+ if (!definitions.length) {
27
+ return {};
28
+ }
29
+ if (definitions.length === 1) {
30
+ return definitions[0];
31
+ }
32
+ let currentContext = definitions[0];
33
+ for (let i = 1; i < definitions.length; i++) {
34
+ currentContext = mergePair(currentContext, definitions[i]);
35
+ }
36
+ return currentContext;
37
+ };
38
+ async function loadContext(context) {
39
+ const loadedUrls = new Map();
40
+ const walk = async (definition, refChain) => {
41
+ for (const [key, value] of Object.entries(definition)) {
42
+ if (key === '@context') {
43
+ // @ts-ignore
44
+ definition[key] = await load(value, refChain);
45
+ } else if (typeof value === 'object' && value !== null) {
46
+ await walk(value, refChain);
47
+ }
48
+ }
49
+ };
50
+ const load = async (context, refChain) => {
51
+ if (context === null || typeof context === 'undefined') {
52
+ return {};
53
+ }
54
+ if (Array.isArray(context)) {
55
+ // fetch and merge
56
+ const contextEntries = await Promise.all(context.map(e => load(e, refChain)));
57
+ return mergeContexts(contextEntries);
58
+ } else if (typeof context === 'object') {
59
+ await walk(context, refChain);
60
+ return context;
61
+ } else {
62
+ if (refChain === null || refChain === void 0 ? void 0 : refChain.includes(context)) {
63
+ throw new Error('Circular dependencies found: ' + refChain.join(' -> ') + ' -> ' + context);
64
+ }
65
+ const newRefChain = Array.isArray(refChain) ? refChain === null || refChain === void 0 ? void 0 : refChain.slice() : [];
66
+ newRefChain.push(context);
67
+ let newContext;
68
+ if (!loadedUrls.has(context)) {
69
+ newContext = await jsonFetch(context);
70
+ loadedUrls.set(context, newContext);
71
+ } else {
72
+ newContext = loadedUrls.get(context);
73
+ }
74
+ return load(newContext['@context'], newRefChain);
75
+ }
76
+ };
77
+ if (typeof context === 'object' && context !== null && '@context' in context) {
78
+ return load(context['@context']);
79
+ } else {
80
+ return load(context);
81
+ }
82
+ }
83
+
84
+ var jsonld = /*#__PURE__*/Object.freeze({
85
+ __proto__: null,
86
+ loadContext: loadContext
87
+ });
88
+
89
+ const ns = base => local => `${base}${local}`;
90
+ const SKOS = ns('http://www.w3.org/2004/02/skos/core#');
91
+ const RDFS = ns('http://www.w3.org/2000/01/rdf-schema#');
92
+ const DCT = ns('http://purl.org/dc/terms/');
93
+ const DC = ns('http://purl.org/dc/elements/1.1/');
94
+ const SDO = ns('https://schema.org/');
95
+ const FOAF = ns('http://xmlns.com/foaf/0.1/');
96
+ const labelPredicates = [SKOS('prefLabel'), DCT('title'), DC('title'), SDO('name'), FOAF('name'), RDFS('label')];
97
+ const descriptionPredicates = [SKOS('definition'), DCT('description'), DC('description'), RDFS('comment')];
98
+
99
+ const defaultFetchResourceOptions = {
100
+ labelPredicates,
101
+ descriptionPredicates
102
+ };
103
+ const fetchResourceCache = {};
104
+ const N3_CONTENT_TYPES = new Set(['text/turtle', 'text/n3', 'application/n-triples', 'application/n-quads', 'application/trig', 'text/anot+turtle']);
105
+ const ACCEPT_HEADER = ['text/turtle', 'application/n-triples', 'application/n-quads', 'application/trig', 'application/ld+json', 'application/rdf+xml'].join(', ');
106
+ function findInStore(store, subjectUri, predicates) {
107
+ var _a;
108
+ const subj = N3.DataFactory.namedNode(subjectUri);
109
+ for (const predUri of predicates) {
110
+ const quads = store.getQuads(subj, N3.DataFactory.namedNode(predUri), null, null).filter(q => q.object.termType === 'Literal');
111
+ if (!quads.length) continue;
112
+ const en = quads.find(q => q.object.language === 'en');
113
+ const noLang = quads.find(q => !q.object.language);
114
+ return ((_a = en !== null && en !== void 0 ? en : noLang) !== null && _a !== void 0 ? _a : quads[0]).object.value;
115
+ }
116
+ return null;
117
+ }
118
+ function parseTurtle(text, baseIRI, contentType) {
119
+ const store = new N3.Store();
120
+ const format = contentType === 'text/anot+turtle' ? 'text/turtle' : contentType;
121
+ const parser = new N3.Parser({
122
+ baseIRI,
123
+ format
124
+ });
125
+ return new Promise((resolve, reject) => {
126
+ parser.parse(text, (err, quad) => {
127
+ if (err) return reject(err);
128
+ if (quad) store.addQuad(quad);else resolve(store);
129
+ });
130
+ });
131
+ }
132
+ async function parseJsonLd(text, baseIRI) {
133
+ const doc = JSON.parse(text);
134
+ const nquads = await jsonldLib.toRDF(doc, {
135
+ format: 'application/n-quads',
136
+ base: baseIRI
137
+ });
138
+ return parseTurtle(nquads, baseIRI, 'application/n-quads');
139
+ }
140
+ async function parseRdfXml(text, baseIRI) {
141
+ const store = new N3.Store();
142
+ return new Promise((resolve, reject) => {
143
+ const parser = new RdfXmlParser({
144
+ baseIRI
145
+ });
146
+ parser.on('data', quad => store.addQuad(quad));
147
+ parser.on('error', reject);
148
+ parser.on('end', () => resolve(store));
149
+ parser.write(text);
150
+ parser.end();
151
+ });
152
+ }
153
+ const toArray = val => !val ? [] : Array.isArray(val) ? val : [val];
154
+ const getSparqlQuery = uri => `DESCRIBE <${uri}>`;
155
+ const tryFetchAndParse = async (fetchFn, uri, options) => {
156
+ var _a;
157
+ let response;
158
+ try {
159
+ response = await fetchFn();
160
+ if (!response.ok) return null;
161
+ } catch (_b) {
162
+ return null;
163
+ }
164
+ const contentType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0].trim()) || 'text/turtle';
165
+ const text = await response.text();
166
+ let store;
167
+ try {
168
+ if (N3_CONTENT_TYPES.has(contentType)) {
169
+ store = await parseTurtle(text, uri, contentType);
170
+ } else if (contentType === 'application/ld+json') {
171
+ store = await parseJsonLd(text, uri);
172
+ } else if (contentType === 'application/rdf+xml') {
173
+ store = await parseRdfXml(text, uri);
174
+ } else {
175
+ return null;
176
+ }
177
+ } catch (_c) {
178
+ return null;
179
+ }
180
+ const label = findInStore(store, uri, options.labelPredicates);
181
+ if (!label) return null;
182
+ return {
183
+ uri,
184
+ label,
185
+ description: findInStore(store, uri, options.descriptionPredicates)
186
+ };
187
+ };
188
+ const actualFetchResource = async (uri, options) => {
189
+ // 1. Direct
190
+ let result = await tryFetchAndParse(() => fetch(uri, {
191
+ headers: {
192
+ 'Accept': ACCEPT_HEADER
193
+ }
194
+ }), uri, options);
195
+ // 2. Rainbow proxies (in order)
196
+ for (const instance of [...toArray(options.fallbackRainbowInstances), ...toArray(options.fallbackRainbowInstance)]) {
197
+ if (result) break;
198
+ const rainbowURL = new URL(instance);
199
+ rainbowURL.searchParams.set('uri', uri);
200
+ result = await tryFetchAndParse(() => fetch(rainbowURL.toString(), {
201
+ headers: {
202
+ 'Accept': ACCEPT_HEADER
203
+ }
204
+ }), uri, options);
205
+ }
206
+ // 3. SPARQL endpoints (in order)
207
+ for (const endpoint of [...toArray(options.fallbackSparqlEndpoints), ...toArray(options.fallbackSparqlEndpoint)]) {
208
+ if (result) break;
209
+ const formBody = new URLSearchParams({
210
+ query: getSparqlQuery(uri)
211
+ });
212
+ result = await tryFetchAndParse(() => fetch(endpoint, {
213
+ method: 'POST',
214
+ headers: {
215
+ 'Content-Type': 'application/x-www-form-urlencoded',
216
+ 'Accept': 'text/turtle, application/n-triples'
217
+ },
218
+ body: formBody.toString()
219
+ }), uri, options);
220
+ }
221
+ if (!result) {
222
+ throw new Error(`No label data found for <${uri}>`);
223
+ }
224
+ return result;
225
+ };
226
+ async function fetchResource(uri, options = {}) {
227
+ const mergedOptions = {
228
+ ...defaultFetchResourceOptions,
229
+ ...options
230
+ };
231
+ if (!(uri in fetchResourceCache)) {
232
+ fetchResourceCache[uri] = actualFetchResource(uri, mergedOptions);
233
+ }
234
+ return fetchResourceCache[uri];
235
+ }
236
+ async function loadFeature(url) {
237
+ const response = await fetch(url, {
238
+ headers: {
239
+ 'Accept': 'application/ld+json, application/json;q=0.9, */*;q=0.1'
240
+ }
241
+ });
242
+ if (!response.ok) {
243
+ throw new Error(`Could not load feature ${url}: ${response.status} - ${response.statusText}`);
244
+ }
245
+ const feature = await response.json();
246
+ const context = await loadContext(feature);
247
+ return {
248
+ feature,
249
+ context
250
+ };
251
+ }
252
+
253
+ var resource = /*#__PURE__*/Object.freeze({
254
+ __proto__: null,
255
+ defaultFetchResourceOptions: defaultFetchResourceOptions,
256
+ fetchResource: fetchResource,
257
+ loadFeature: loadFeature
258
+ });
259
+
260
+ const defaultAugmentOptions = {
261
+ replaceElements: true,
262
+ ...defaultFetchResourceOptions
263
+ };
264
+ function createPropertiesTable(feature, container, options = {
265
+ propertiesField: 'properties'
266
+ }) {
267
+ const createLevel = (parent, value, addHeaders = false) => {
268
+ if (Array.isArray(value)) {
269
+ for (const entry of value) {
270
+ const newElem = createLevel(parent, entry);
271
+ newElem.classList.add('array-entry');
272
+ }
273
+ return parent;
274
+ } else if (value === null || typeof value === 'undefined' || typeof value !== 'object') {
275
+ const span = document.createElement('span');
276
+ span.classList.add('literal-value');
277
+ span.textContent = '' + value;
278
+ parent.appendChild(span);
279
+ return span;
280
+ } else {
281
+ const table = document.createElement('table');
282
+ table.classList.add('object-table');
283
+ if (addHeaders) {
284
+ table.innerHTML = '<thead><tr><th>Property</th><th>Value</th></tr></thead>';
285
+ }
286
+ const tbody = document.createElement('tbody');
287
+ Object.entries(value).forEach(([k, v]) => {
288
+ const row = document.createElement('tr');
289
+ const keyCell = document.createElement('td');
290
+ keyCell.classList.add('object-property');
291
+ keyCell.setAttribute('data-property', k);
292
+ keyCell.textContent = k;
293
+ row.appendChild(keyCell);
294
+ const valueCell = document.createElement('td');
295
+ valueCell.classList.add('object-value');
296
+ createLevel(valueCell, v);
297
+ row.appendChild(valueCell);
298
+ tbody.appendChild(row);
299
+ });
300
+ table.appendChild(tbody);
301
+ parent.appendChild(table);
302
+ return table;
303
+ }
304
+ };
305
+ if (options.propertiesField) {
306
+ createLevel(container, feature[options.propertiesField], true);
307
+ } else {
308
+ createLevel(container, feature, true);
309
+ }
310
+ }
311
+ async function augment(rootElem, context, options = {}) {
312
+ const mergedOptions = {
313
+ ...defaultAugmentOptions,
314
+ ...options
315
+ };
316
+ const resolveTerm = (term, contextStack, useVocab = true, useBase = false) => {
317
+ if (term.indexOf('://') !== -1) {
318
+ return {
319
+ '@id': term
320
+ };
321
+ }
322
+ let closestVocab = null;
323
+ let closestBase = null;
324
+ for (let i = contextStack.length - 1; i >= 0; i--) {
325
+ if (term in contextStack[i]) {
326
+ let resolvedTerm = contextStack[i][term];
327
+ let resolvedId;
328
+ if (resolvedTerm === null || typeof resolvedTerm === 'undefined' || typeof resolvedTerm === 'boolean' || Array.isArray(resolvedTerm)) {
329
+ continue;
330
+ }
331
+ if (typeof resolvedTerm === 'string') {
332
+ if (resolvedTerm === '@type') {
333
+ return {
334
+ '@id': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
335
+ };
336
+ }
337
+ resolvedId = resolvedTerm;
338
+ resolvedTerm = {
339
+ '@id': resolvedTerm
340
+ };
341
+ } else if (typeof resolvedTerm === 'object' && '@id' in resolvedTerm && typeof resolvedTerm['@id'] === 'string') {
342
+ resolvedId = resolvedTerm['@id'];
343
+ } else {
344
+ continue;
345
+ }
346
+ const idx = resolvedId.indexOf(':');
347
+ if (idx > -1) {
348
+ const prefix = resolvedId.substring(0, idx);
349
+ const localPart = resolvedId.substring(idx + 1);
350
+ if (localPart.startsWith('//')) {
351
+ // Full URI -> return
352
+ return resolvedTerm;
353
+ }
354
+ const resolvedPrefix = resolveTerm(prefix, contextStack);
355
+ if (resolvedPrefix !== null && '@id' in resolvedPrefix && typeof resolvedPrefix['@id'] === 'string') {
356
+ // Prefix found and resolved
357
+ resolvedTerm['@id'] = `${resolvedPrefix['@id']}${localPart}`;
358
+ }
359
+ return resolvedTerm;
360
+ }
361
+ }
362
+ if (closestVocab === null && contextStack[i]['@vocab']) {
363
+ closestVocab = contextStack[i]['@vocab'];
364
+ }
365
+ if (closestBase === null && contextStack[i]['@base']) {
366
+ closestBase = contextStack[i]['@base'];
367
+ }
368
+ }
369
+ if (term.indexOf(':') === -1) {
370
+ if (useVocab && closestVocab) {
371
+ return {
372
+ '@id': `${closestVocab}${term}`
373
+ };
374
+ }
375
+ if (useBase && closestBase) {
376
+ return {
377
+ '@id': `${closestBase}${term}`
378
+ };
379
+ }
380
+ }
381
+ return null;
382
+ };
383
+ const findPropertyChildren = elem => {
384
+ const walker = document.createTreeWalker(elem, NodeFilter.SHOW_ELEMENT, {
385
+ acceptNode(node) {
386
+ const nodeElem = node;
387
+ if (node !== elem && nodeElem.classList.contains('object-value')) {
388
+ return NodeFilter.FILTER_REJECT;
389
+ }
390
+ if (nodeElem.classList.contains('object-property')) {
391
+ return NodeFilter.FILTER_ACCEPT;
392
+ }
393
+ return NodeFilter.FILTER_SKIP;
394
+ }
395
+ });
396
+ const result = [];
397
+ let cur;
398
+ while (cur = walker.nextNode()) {
399
+ result.push(cur);
400
+ }
401
+ return result;
402
+ };
403
+ const findLiteralChildren = elem => {
404
+ const result = [];
405
+ const walker = document.createTreeWalker(elem, NodeFilter.SHOW_ELEMENT, {
406
+ acceptNode(node) {
407
+ const nodeElem = node;
408
+ if (nodeElem.classList.contains('object-property') || nodeElem.classList.contains('object-value')) {
409
+ return NodeFilter.FILTER_REJECT;
410
+ }
411
+ if (nodeElem.classList.contains('literal-value')) {
412
+ result.push(nodeElem);
413
+ return NodeFilter.FILTER_REJECT;
414
+ }
415
+ return NodeFilter.FILTER_SKIP;
416
+ }
417
+ });
418
+ while (walker.nextNode()) {}
419
+ return result;
420
+ };
421
+ const updateElement = (elem, resourceUri, replaceElements = true) => {
422
+ elem.setAttribute('data-uri', resourceUri);
423
+ elem.classList.add('resource-loading');
424
+ fetchResource(resourceUri, mergedOptions).then(resourceData => {
425
+ let elemToUpdate = elem.querySelector('.resource-link') || elem;
426
+ if (resourceData.label) {
427
+ elem.setAttribute('data-label', resourceData.label);
428
+ if (mergedOptions.replaceElements) {
429
+ elemToUpdate.textContent = resourceData.label;
430
+ }
431
+ }
432
+ if (resourceData.description) {
433
+ elem.setAttribute('data-description', resourceData.description);
434
+ if (mergedOptions.replaceElements) {
435
+ elemToUpdate.title = resourceData.description;
436
+ }
437
+ }
438
+ elem.classList.add('resource-resolved');
439
+ }).catch(e => {
440
+ console.error(`Error resolving URI ${resourceUri}: ${e}`, {
441
+ cause: e
442
+ });
443
+ elem.classList.add('resource-error');
444
+ }).finally(() => {
445
+ elem.classList.remove('resource-loading');
446
+ });
447
+ if (replaceElements) {
448
+ const link = document.createElement("a");
449
+ link.href = resourceUri;
450
+ link.target = '_blank';
451
+ link.classList.add('resource-link');
452
+ while (elem.firstChild) {
453
+ link.appendChild(elem.firstChild);
454
+ }
455
+ elem.appendChild(link);
456
+ }
457
+ };
458
+ const augmentInner = (elem, contextStack) => {
459
+ var _a;
460
+ const propElems = findPropertyChildren(elem);
461
+ for (const propElem of propElems) {
462
+ let propertyName = null;
463
+ propertyName = propElem.getAttribute('data-property');
464
+ if (!propertyName) {
465
+ propertyName = propElem.textContent.trim();
466
+ }
467
+ const resolvedProperty = resolveTerm(propertyName, contextStack);
468
+ let newContextStack = contextStack;
469
+ const valueElem = (_a = propElem.parentElement) === null || _a === void 0 ? void 0 : _a.querySelector('.object-value');
470
+ if (resolvedProperty && '@id' in resolvedProperty && typeof resolvedProperty['@id'] === 'string') {
471
+ const propertyUri = resolvedProperty['@id'];
472
+ updateElement(propElem, propertyUri, mergedOptions.replaceElements);
473
+ if ('@context' in resolvedProperty) {
474
+ newContextStack = [...contextStack, resolvedProperty['@context']];
475
+ }
476
+ if (resolvedProperty['@type'] === '@id' && valueElem) {
477
+ const literalElems = findLiteralChildren(valueElem);
478
+ literalElems.forEach(literalElem => {
479
+ const resolvedLiteral = resolveTerm(literalElem.textContent.trim(), newContextStack, false, true);
480
+ if (resolvedLiteral && '@id' in resolvedLiteral && typeof resolvedLiteral['@id'] === 'string') {
481
+ const resourceUri = resolvedLiteral['@id'];
482
+ updateElement(literalElem, resourceUri, mergedOptions.replaceElements);
483
+ }
484
+ });
485
+ }
486
+ }
487
+ if (valueElem) {
488
+ augmentInner(valueElem, newContextStack);
489
+ }
490
+ }
491
+ };
492
+ augmentInner(rootElem, [context]);
493
+ }
494
+
495
+ var augment$1 = /*#__PURE__*/Object.freeze({
496
+ __proto__: null,
497
+ augment: augment,
498
+ createPropertiesTable: createPropertiesTable
499
+ });
500
+
501
+ var index = {
502
+ ...resource,
503
+ ...jsonld,
504
+ ...augment$1
505
+ };
506
+
507
+ export { augment, createPropertiesTable, index as default, defaultFetchResourceOptions, fetchResource, loadContext, loadFeature };
508
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/jsonld.ts","../src/constants.ts","../src/resource.ts","../src/augment.ts","../src/index.ts"],"sourcesContent":["import {ContextDefinition} from 'jsonld';\n\ntype OrArray<T> = T | T[];\n\ntype Context = OrArray<null | string | ContextDefinition>;\n\ntype ContextObject = {\n \"@context\": Context;\n}\n\nconst jsonFetch = async (url: string) => {\n const response = await fetch(url, {\n headers: {'Accept': 'application/json'},\n });\n return await response.json() as ContextObject;\n};\n\nconst mergeContexts = (definitions: ContextDefinition[]) => {\n const mergePair = (a: ContextDefinition | null | undefined,\n b: ContextDefinition): ContextDefinition => {\n if (!a || !Object.keys(a).length) {\n return b;\n }\n const result = {...a};\n for (const [k, v] of Object.entries(b)) {\n result[k] = v;\n }\n return result;\n };\n\n if (!definitions.length) {\n return {};\n }\n if (definitions.length === 1) {\n return definitions[0];\n }\n let currentContext = definitions[0];\n for (let i = 1; i < definitions.length; i++) {\n currentContext = mergePair(currentContext, definitions[i]);\n }\n return currentContext;\n};\n\n\nexport async function loadContext(context: Context | ContextObject) {\n const loadedUrls = new Map<string, ContextObject>();\n\n const walk = async (definition: object, refChain?: string[]) => {\n for (const [key, value] of Object.entries(definition)) {\n if (key === '@context') {\n // @ts-ignore\n definition[key] = await load(value as Context, refChain);\n } else if (typeof value === 'object' && value !== null) {\n await walk(value, refChain);\n }\n }\n };\n\n const load = async (context: Context, refChain?: string[]): Promise<ContextDefinition> => {\n if (context === null || typeof context === 'undefined') {\n return {};\n }\n if (Array.isArray(context)) {\n // fetch and merge\n const contextEntries = await Promise.all(context.map(e => load(e, refChain)));\n return mergeContexts(contextEntries);\n } else if (typeof context === 'object') {\n await walk(context, refChain);\n return context;\n } else {\n if (refChain?.includes(context)) {\n throw new Error('Circular dependencies found: ' + refChain.join(' -> ') + ' -> ' + context);\n }\n const newRefChain = Array.isArray(refChain) ? refChain?.slice() : [];\n newRefChain.push(context);\n let newContext: ContextObject;\n if (!loadedUrls.has(context)) {\n newContext = await jsonFetch(context);\n loadedUrls.set(context, newContext);\n } else {\n newContext = loadedUrls.get(context) as ContextObject;\n }\n return load(newContext['@context'], newRefChain);\n }\n };\n\n if (typeof context === 'object' && context !== null && '@context' in context) {\n return load((context as ContextObject)['@context']);\n } else {\n return load(context);\n }\n}","const ns = (base: string) => (local: string): string => `${base}${local}`;\n\nexport const SKOS = ns('http://www.w3.org/2004/02/skos/core#');\nexport const RDFS = ns('http://www.w3.org/2000/01/rdf-schema#');\nexport const RDF = ns('http://www.w3.org/1999/02/22-rdf-syntax-ns#');\nexport const DCT = ns('http://purl.org/dc/terms/');\nexport const DC = ns('http://purl.org/dc/elements/1.1/');\nexport const SDO = ns('https://schema.org/');\nexport const FOAF = ns('http://xmlns.com/foaf/0.1/');\n\nexport const labelPredicates: string[] = [\n SKOS('prefLabel'),\n DCT('title'),\n DC('title'),\n SDO('name'),\n FOAF('name'),\n RDFS('label'),\n];\n\nexport const descriptionPredicates: string[] = [\n SKOS('definition'),\n DCT('description'),\n DC('description'),\n RDFS('comment'),\n];","import {loadContext} from \"./jsonld\";\nimport {descriptionPredicates, labelPredicates} from \"./constants\";\nimport * as N3 from 'n3';\nimport * as jsonldLib from 'jsonld';\nimport { RdfXmlParser } from 'rdfxml-streaming-parser';\n\nexport interface FetchResourceOptions {\n labelPredicates: string[],\n descriptionPredicates: string[],\n fallbackRainbowInstance?: string, // deprecated: use fallbackRainbowInstances\n fallbackRainbowInstances?: string | string[],\n fallbackSparqlEndpoint?: string, // deprecated: use fallbackSparqlEndpoints\n fallbackSparqlEndpoints?: string | string[],\n}\n\nexport const defaultFetchResourceOptions: FetchResourceOptions = {\n labelPredicates,\n descriptionPredicates,\n};\n\nexport interface CreatePropertiesTableOptions {\n propertiesField?: string | null,\n}\n\nexport interface ResourceData {\n uri: string,\n label: string | null,\n description?: string | null,\n}\n\nconst fetchResourceCache: { [url: string]: Promise<ResourceData> } = {};\n\nconst N3_CONTENT_TYPES = new Set([\n 'text/turtle',\n 'text/n3',\n 'application/n-triples',\n 'application/n-quads',\n 'application/trig',\n 'text/anot+turtle',\n]);\n\nconst ACCEPT_HEADER = [\n 'text/turtle',\n 'application/n-triples',\n 'application/n-quads',\n 'application/trig',\n 'application/ld+json',\n 'application/rdf+xml',\n].join(', ');\n\nfunction findInStore(store: N3.Store, subjectUri: string, predicates: string[]): string | null {\n const subj = N3.DataFactory.namedNode(subjectUri);\n for (const predUri of predicates) {\n const quads = store\n .getQuads(subj, N3.DataFactory.namedNode(predUri), null, null)\n .filter(q => q.object.termType === 'Literal');\n if (!quads.length) continue;\n const en = quads.find(q => (q.object as N3.Literal).language === 'en');\n const noLang = quads.find(q => !(q.object as N3.Literal).language);\n return (en ?? noLang ?? quads[0]).object.value;\n }\n return null;\n}\n\nfunction parseTurtle(text: string, baseIRI: string, contentType: string): Promise<N3.Store> {\n const store = new N3.Store();\n const format = contentType === 'text/anot+turtle' ? 'text/turtle' : contentType as any;\n const parser = new N3.Parser({baseIRI, format});\n return new Promise((resolve, reject) => {\n parser.parse(text, (err, quad) => {\n if (err) return reject(err);\n if (quad) store.addQuad(quad);\n else resolve(store);\n });\n });\n}\n\nasync function parseJsonLd(text: string, baseIRI: string): Promise<N3.Store> {\n const doc = JSON.parse(text);\n const nquads = await (jsonldLib as any).toRDF(doc, {format: 'application/n-quads', base: baseIRI});\n return parseTurtle(nquads, baseIRI, 'application/n-quads');\n}\n\nasync function parseRdfXml(text: string, baseIRI: string): Promise<N3.Store> {\n const store = new N3.Store();\n return new Promise((resolve, reject) => {\n const parser = new RdfXmlParser({baseIRI});\n parser.on('data', (quad: any) => store.addQuad(quad));\n parser.on('error', reject);\n parser.on('end', () => resolve(store));\n parser.write(text);\n parser.end();\n });\n}\n\nconst toArray = (val?: string | string[]): string[] =>\n !val ? [] : Array.isArray(val) ? val : [val];\n\nconst getSparqlQuery = (uri: string) => `DESCRIBE <${uri}>`;\n\nconst tryFetchAndParse = async (fetchFn: () => Promise<Response>, uri: string, options: FetchResourceOptions): Promise<ResourceData | null> => {\n let response: Response;\n try {\n response = await fetchFn();\n if (!response.ok) return null;\n } catch {\n return null;\n }\n const contentType = response.headers.get('content-type')?.split(';')[0].trim() || 'text/turtle';\n const text = await response.text();\n let store: N3.Store;\n try {\n if (N3_CONTENT_TYPES.has(contentType)) {\n store = await parseTurtle(text, uri, contentType);\n } else if (contentType === 'application/ld+json') {\n store = await parseJsonLd(text, uri);\n } else if (contentType === 'application/rdf+xml') {\n store = await parseRdfXml(text, uri);\n } else {\n return null;\n }\n } catch {\n return null;\n }\n const label = findInStore(store, uri, options.labelPredicates);\n if (!label) return null;\n return {\n uri,\n label,\n description: findInStore(store, uri, options.descriptionPredicates),\n };\n};\n\nconst actualFetchResource = async (uri: string, options: FetchResourceOptions): Promise<ResourceData> => {\n // 1. Direct\n let result = await tryFetchAndParse(\n () => fetch(uri, {headers: {'Accept': ACCEPT_HEADER}}),\n uri, options,\n );\n\n // 2. Rainbow proxies (in order)\n for (const instance of [...toArray(options.fallbackRainbowInstances), ...toArray(options.fallbackRainbowInstance)]) {\n if (result) break;\n const rainbowURL = new URL(instance);\n rainbowURL.searchParams.set('uri', uri);\n result = await tryFetchAndParse(\n () => fetch(rainbowURL.toString(), {headers: {'Accept': ACCEPT_HEADER}}),\n uri, options,\n );\n }\n\n // 3. SPARQL endpoints (in order)\n for (const endpoint of [...toArray(options.fallbackSparqlEndpoints), ...toArray(options.fallbackSparqlEndpoint)]) {\n if (result) break;\n const formBody = new URLSearchParams({query: getSparqlQuery(uri)});\n result = await tryFetchAndParse(\n () => fetch(endpoint, {\n method: 'POST',\n headers: {'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/turtle, application/n-triples'},\n body: formBody.toString(),\n }),\n uri, options,\n );\n }\n\n if (!result) {\n throw new Error(`No label data found for <${uri}>`);\n }\n return result;\n};\n\nexport async function fetchResource(uri: string, options: Partial<FetchResourceOptions> = {}) {\n const mergedOptions: FetchResourceOptions = {...defaultFetchResourceOptions, ...options};\n if (!(uri in fetchResourceCache)) {\n fetchResourceCache[uri] = actualFetchResource(uri, mergedOptions);\n }\n return fetchResourceCache[uri];\n}\n\nexport async function loadFeature(url: string) {\n const response = await fetch(url, {\n headers: {\n 'Accept': 'application/ld+json, application/json;q=0.9, */*;q=0.1',\n },\n });\n if (!response.ok) {\n throw new Error(`Could not load feature ${url}: ${response.status} - ${response.statusText}`);\n }\n const feature = await response.json();\n const context = await loadContext(feature);\n return {\n feature,\n context,\n };\n}","import {\n CreatePropertiesTableOptions,\n defaultFetchResourceOptions,\n fetchResource,\n FetchResourceOptions,\n} from \"./resource\";\nimport {ContextDefinition, ExpandedTermDefinition} from \"jsonld\";\n\nexport interface AugmentOptions extends FetchResourceOptions {\n replaceElements: boolean,\n}\n\nconst defaultAugmentOptions: AugmentOptions = {\n replaceElements: true,\n ...defaultFetchResourceOptions,\n};\n\nexport function createPropertiesTable(feature: { [index: string]: any }, container: HTMLElement,\n options: CreatePropertiesTableOptions = {\n propertiesField: 'properties',\n }) {\n const createLevel = (parent: HTMLElement, value: any, addHeaders = false) => {\n if (Array.isArray(value)) {\n for (const entry of value) {\n const newElem = createLevel(parent, entry);\n newElem.classList.add('array-entry');\n }\n return parent;\n } else if (value === null || typeof value === 'undefined' || typeof value !== 'object') {\n const span = document.createElement('span');\n span.classList.add('literal-value');\n span.textContent = '' + value;\n parent.appendChild(span);\n return span;\n } else {\n const table = document.createElement('table');\n table.classList.add('object-table');\n if (addHeaders) {\n table.innerHTML = '<thead><tr><th>Property</th><th>Value</th></tr></thead>';\n }\n const tbody = document.createElement('tbody');\n Object.entries(value).forEach(([k, v]) => {\n const row = document.createElement('tr');\n const keyCell = document.createElement('td');\n keyCell.classList.add('object-property');\n keyCell.setAttribute('data-property', k);\n keyCell.textContent = k;\n row.appendChild(keyCell);\n const valueCell = document.createElement('td');\n valueCell.classList.add('object-value');\n createLevel(valueCell, v);\n row.appendChild(valueCell);\n tbody.appendChild(row);\n });\n table.appendChild(tbody);\n parent.appendChild(table);\n return table;\n }\n };\n if (options.propertiesField) {\n createLevel(container, feature[options.propertiesField], true);\n } else {\n createLevel(container, feature, true);\n }\n}\n\nexport async function augment(rootElem: HTMLElement, context: ContextDefinition, options: Partial<AugmentOptions> = {}) {\n\n const mergedOptions = {...defaultAugmentOptions, ...options};\n\n const resolveTerm = (term: string, contextStack: ContextDefinition[],\n useVocab = true, useBase = false): ExpandedTermDefinition | null => {\n if (term.indexOf('://') !== -1) {\n return {'@id': term};\n }\n let closestVocab: string | null = null;\n let closestBase: string | null = null;\n for (let i = contextStack.length - 1; i >= 0; i--) {\n if (term in contextStack[i]) {\n let resolvedTerm = contextStack[i][term];\n let resolvedId: string;\n if (resolvedTerm === null || typeof resolvedTerm === 'undefined' || typeof resolvedTerm === 'boolean'\n || Array.isArray(resolvedTerm)) {\n continue;\n }\n if (typeof resolvedTerm === 'string') {\n if (resolvedTerm === '@type') {\n return {'@id': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'};\n }\n resolvedId = resolvedTerm;\n resolvedTerm = {'@id': resolvedTerm};\n } else if (typeof resolvedTerm === 'object' && '@id' in resolvedTerm && typeof resolvedTerm['@id'] === 'string') {\n resolvedId = resolvedTerm['@id'];\n } else {\n continue;\n }\n const idx = resolvedId.indexOf(':');\n if (idx > -1) {\n const prefix = resolvedId.substring(0, idx);\n const localPart = resolvedId.substring(idx + 1);\n if (localPart.startsWith('//')) {\n // Full URI -> return\n return resolvedTerm;\n }\n const resolvedPrefix = resolveTerm(prefix, contextStack);\n if (resolvedPrefix !== null && '@id' in resolvedPrefix && typeof resolvedPrefix['@id'] === 'string') {\n // Prefix found and resolved\n resolvedTerm['@id'] = `${resolvedPrefix['@id']}${localPart}`;\n }\n return resolvedTerm;\n }\n }\n if (closestVocab === null && contextStack[i]['@vocab']) {\n closestVocab = contextStack[i]['@vocab']!;\n }\n if (closestBase === null && contextStack[i]['@base']) {\n closestBase = contextStack[i]['@base']!;\n }\n }\n if (term.indexOf(':') === -1) {\n if (useVocab && closestVocab) {\n return {'@id': `${closestVocab}${term}`};\n }\n if (useBase && closestBase) {\n return {'@id': `${closestBase}${term}`};\n }\n }\n return null;\n };\n\n const findPropertyChildren = (elem: HTMLElement) => {\n const walker = document.createTreeWalker(elem, NodeFilter.SHOW_ELEMENT, {\n acceptNode(node: Node): number {\n const nodeElem = node as HTMLElement;\n if (node !== elem && nodeElem.classList.contains('object-value')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (nodeElem.classList.contains('object-property')) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n });\n const result: HTMLElement[] = [];\n let cur;\n while ((cur = walker.nextNode())) {\n result.push(cur as HTMLElement);\n }\n return result;\n };\n\n const findLiteralChildren = (elem: HTMLElement) => {\n const result: HTMLElement[] = [];\n const walker = document.createTreeWalker(elem, NodeFilter.SHOW_ELEMENT, {\n acceptNode(node: Node): number {\n const nodeElem = node as HTMLElement;\n if (nodeElem.classList.contains('object-property') || nodeElem.classList.contains('object-value')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (nodeElem.classList.contains('literal-value')) {\n result.push(nodeElem);\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n });\n while (walker.nextNode()) {\n }\n return result;\n };\n\n const updateElement = (elem: HTMLElement, resourceUri: string,\n replaceElements = true) => {\n elem.setAttribute('data-uri', resourceUri);\n elem.classList.add('resource-loading');\n fetchResource(resourceUri, mergedOptions)\n .then(resourceData => {\n let elemToUpdate = elem.querySelector('.resource-link') as HTMLElement || elem;\n if (resourceData.label) {\n elem.setAttribute('data-label', resourceData.label);\n if (mergedOptions.replaceElements) {\n elemToUpdate.textContent = resourceData.label;\n }\n }\n if (resourceData.description) {\n elem.setAttribute('data-description', resourceData.description);\n if (mergedOptions.replaceElements) {\n elemToUpdate.title = resourceData.description;\n }\n }\n elem.classList.add('resource-resolved');\n })\n .catch(e => {\n console.error(`Error resolving URI ${resourceUri}: ${e}`, {cause: e});\n elem.classList.add('resource-error');\n })\n .finally(() => {\n elem.classList.remove('resource-loading');\n });\n if (replaceElements) {\n const link = document.createElement(\"a\");\n link.href = resourceUri;\n link.target = '_blank';\n link.classList.add('resource-link');\n while (elem.firstChild) {\n link.appendChild(elem.firstChild);\n }\n elem.appendChild(link);\n }\n };\n\n const augmentInner = (elem: HTMLElement, contextStack: ContextDefinition[]) => {\n const propElems = findPropertyChildren(elem);\n for (const propElem of propElems) {\n let propertyName: string | null = null;\n propertyName = propElem.getAttribute('data-property');\n if (!propertyName) {\n propertyName = propElem.textContent.trim();\n }\n const resolvedProperty = resolveTerm(propertyName, contextStack);\n let newContextStack = contextStack;\n const valueElem = propElem.parentElement?.querySelector('.object-value') as HTMLElement;\n if (resolvedProperty && '@id' in resolvedProperty && typeof resolvedProperty['@id'] === 'string') {\n const propertyUri = resolvedProperty['@id'];\n updateElement(propElem, propertyUri, mergedOptions.replaceElements);\n if ('@context' in resolvedProperty) {\n newContextStack = [...contextStack, resolvedProperty['@context']!];\n }\n if (resolvedProperty['@type'] === '@id' && valueElem) {\n const literalElems = findLiteralChildren(valueElem);\n literalElems.forEach(literalElem => {\n const resolvedLiteral = resolveTerm(literalElem.textContent.trim(),\n newContextStack, false, true);\n if (resolvedLiteral && '@id' in resolvedLiteral && typeof resolvedLiteral['@id'] === 'string') {\n const resourceUri = resolvedLiteral['@id'];\n updateElement(literalElem, resourceUri, mergedOptions.replaceElements);\n }\n });\n }\n }\n if (valueElem) {\n augmentInner(valueElem as HTMLElement, newContextStack);\n }\n }\n };\n augmentInner(rootElem, [context]);\n}\n","export * from './resource';\nexport * from './jsonld';\nexport * from './augment';\n\nimport * as resource from './resource';\nimport * as jsonld from './jsonld';\nimport * as augment from './augment';\n\nexport default {\n ...resource,\n ...jsonld,\n ...augment,\n}"],"names":["jsonFetch","url","response","fetch","headers","json","mergeContexts","definitions","mergePair","a","b","Object","keys","length","result","k","v","entries","currentContext","i","loadContext","context","loadedUrls","Map","walk","definition","refChain","key","value","load","Array","isArray","contextEntries","Promise","all","map","e","includes","Error","join","newRefChain","slice","push","newContext","has","set","get","ns","base","local","SKOS","RDFS","DCT","DC","SDO","FOAF","labelPredicates","descriptionPredicates","defaultFetchResourceOptions","fetchResourceCache","N3_CONTENT_TYPES","Set","ACCEPT_HEADER","findInStore","store","subjectUri","predicates","subj","N3","DataFactory","namedNode","predUri","quads","getQuads","filter","q","object","termType","en","find","language","noLang","_a","parseTurtle","text","baseIRI","contentType","Store","format","parser","Parser","resolve","reject","parse","err","quad","addQuad","parseJsonLd","doc","JSON","nquads","jsonldLib","toRDF","parseRdfXml","RdfXmlParser","on","write","end","toArray","val","getSparqlQuery","uri","tryFetchAndParse","fetchFn","options","ok","_b","split","trim","_c","label","description","actualFetchResource","instance","fallbackRainbowInstances","fallbackRainbowInstance","rainbowURL","URL","searchParams","toString","endpoint","fallbackSparqlEndpoints","fallbackSparqlEndpoint","formBody","URLSearchParams","query","method","body","fetchResource","mergedOptions","loadFeature","status","statusText","feature","defaultAugmentOptions","replaceElements","createPropertiesTable","container","propertiesField","createLevel","parent","addHeaders","entry","newElem","classList","add","span","document","createElement","textContent","appendChild","table","innerHTML","tbody","forEach","row","keyCell","setAttribute","valueCell","augment","rootElem","resolveTerm","term","contextStack","useVocab","useBase","indexOf","closestVocab","closestBase","resolvedTerm","resolvedId","idx","prefix","substring","localPart","startsWith","resolvedPrefix","findPropertyChildren","elem","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","acceptNode","node","nodeElem","contains","FILTER_REJECT","FILTER_ACCEPT","FILTER_SKIP","cur","nextNode","findLiteralChildren","updateElement","resourceUri","then","resourceData","elemToUpdate","querySelector","title","catch","console","error","cause","finally","remove","link","href","target","firstChild","augmentInner","propElems","propElem","propertyName","getAttribute","resolvedProperty","newContextStack","valueElem","parentElement","propertyUri","literalElems","literalElem","resolvedLiteral","resource","jsonld"],"mappings":"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"}