cocoda-sdk 3.3.3 → 3.4.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.
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -29,6 +33,7 @@ __export(src_exports, {
29
33
  CocodaSDK: () => CocodaSDK,
30
34
  ConceptApiProvider: () => ConceptApiProvider,
31
35
  LabelSearchSuggestionProvider: () => LabelSearchSuggestionProvider,
36
+ LobidApiProvider: () => LobidApiProvider,
32
37
  LocApiProvider: () => LocApiProvider,
33
38
  LocalMappingsProvider: () => LocalMappingsProvider,
34
39
  MappingsApiProvider: () => MappingsApiProvider,
@@ -58,6 +63,14 @@ __export(errors_exports, {
58
63
  NetworkError: () => NetworkError
59
64
  });
60
65
  var CDKError = class extends Error {
66
+ /**
67
+ * CDKError constructor.
68
+ *
69
+ * @param {Object} options
70
+ * @param {string} [options.message=""] message for the error
71
+ * @param {Error} [options.relatedError=null] related error
72
+ * @param {number} [options.code] HTTP status code for the error
73
+ */
61
74
  constructor({ message = "", relatedError = null, code = null } = {}) {
62
75
  if (!message && relatedError && relatedError.message) {
63
76
  message = relatedError.message;
@@ -69,12 +82,26 @@ var CDKError = class extends Error {
69
82
  }
70
83
  };
71
84
  var MethodNotImplementedError = class extends CDKError {
85
+ /**
86
+ * MethodNotImplementedError constructor.
87
+ *
88
+ * @param {Object} config
89
+ * @param {string} config.method method that this error refers to
90
+ * @param {string} [config.message=""] message for the error
91
+ */
72
92
  constructor({ method, message = "", ...options }) {
73
93
  options.message = `Method not implemented: ${method} (${message})`;
74
94
  super(options);
75
95
  }
76
96
  };
77
97
  var InvalidOrMissingParameterError = class extends CDKError {
98
+ /**
99
+ * InvalidOrMissingParameterError constructor.
100
+ *
101
+ * @param {Object} config
102
+ * @param {string} config.parameter parameter that this error refers to
103
+ * @param {string} [config.message=""] message for the error
104
+ */
78
105
  constructor({ parameter, message = "", ...options }) {
79
106
  options.message = `Invalid or missing parameter: ${parameter} (${message})`;
80
107
  super(options);
@@ -94,7 +121,7 @@ var InvalidProviderError = class extends CDKError {
94
121
  };
95
122
 
96
123
  // src/lib/CocodaSDK.js
97
- var import_axios3 = __toESM(require("axios"), 1);
124
+ var import_axios4 = __toESM(require("axios"), 1);
98
125
 
99
126
  // src/utils/lodash.js
100
127
  var import_get = __toESM(require("lodash/get.js"), 1);
@@ -114,7 +141,7 @@ var import_omit = __toESM(require("lodash/omit.js"), 1);
114
141
  var import_concat = __toESM(require("lodash/concat.js"), 1);
115
142
 
116
143
  // src/lib/CocodaSDK.js
117
- var import_jskos_tools12 = __toESM(require("jskos-tools"), 1);
144
+ var import_jskos_tools13 = __toESM(require("jskos-tools"), 1);
118
145
 
119
146
  // src/providers/index.js
120
147
  var providers_exports = {};
@@ -122,6 +149,7 @@ __export(providers_exports, {
122
149
  BaseProvider: () => BaseProvider,
123
150
  ConceptApiProvider: () => ConceptApiProvider,
124
151
  LabelSearchSuggestionProvider: () => LabelSearchSuggestionProvider,
152
+ LobidApiProvider: () => LobidApiProvider,
125
153
  LocApiProvider: () => LocApiProvider,
126
154
  LocalMappingsProvider: () => LocalMappingsProvider,
127
155
  MappingsApiProvider: () => MappingsApiProvider,
@@ -145,6 +173,7 @@ __export(utils_exports, {
145
173
  withCustomProps: () => withCustomProps
146
174
  });
147
175
  var requestMethods = [
176
+ // General
148
177
  {
149
178
  method: "getRegistries",
150
179
  fallback: [],
@@ -183,6 +212,7 @@ var requestMethods = [
183
212
  fallback: [],
184
213
  type: "Occurrences"
185
214
  },
215
+ // Concepts
186
216
  {
187
217
  method: "getTop",
188
218
  fallback: [],
@@ -208,6 +238,7 @@ var requestMethods = [
208
238
  fallback: [],
209
239
  type: "Concepts"
210
240
  },
241
+ // Mappings
211
242
  {
212
243
  method: "getMapping",
213
244
  fallback: null,
@@ -246,6 +277,11 @@ var requestMethods = [
246
277
  method: "deleteMappings",
247
278
  fallback: []
248
279
  },
280
+ // Annotations
281
+ // {
282
+ // method: "getAnnotation",
283
+ // fallback: "",
284
+ // },
249
285
  {
250
286
  method: "getAnnotations",
251
287
  fallback: [],
@@ -308,9 +344,15 @@ var listOfCapabilities = [
308
344
 
309
345
  // src/providers/base-provider.js
310
346
  var BaseProvider = class {
347
+ /**
348
+ * Provider constructor.
349
+ *
350
+ * @param {Object} registry the registry for this provider
351
+ */
311
352
  constructor(registry = {}) {
312
353
  this._jskos = registry;
313
354
  this.axios = import_axios.default.create({
355
+ // TODO: Decide on timeout value
314
356
  timeout: 2e4
315
357
  });
316
358
  this._path = typeof window !== "undefined" && window.location.pathname;
@@ -324,6 +366,7 @@ var BaseProvider = class {
324
366
  this._repeating = [];
325
367
  this._api = {
326
368
  status: registry.status,
369
+ // If `schemes` on registry is an array, remove it because we're only keeping it in this._jskos.schemes
327
370
  schemes: Array.isArray(registry.schemes) ? void 0 : registry.schemes,
328
371
  top: registry.top,
329
372
  data: registry.data,
@@ -469,6 +512,7 @@ var BaseProvider = class {
469
512
  };
470
513
  }
471
514
  }
515
+ // Expose some properties from original registry object as getters
472
516
  get uri() {
473
517
  return this._jskos.uri;
474
518
  }
@@ -490,6 +534,11 @@ var BaseProvider = class {
490
534
  get stored() {
491
535
  return this._jskos.stored !== void 0 ? this._jskos.stored : this.constructor.stored;
492
536
  }
537
+ /**
538
+ * Load data about registry via the status endpoint.
539
+ *
540
+ * @returns {Promise} Promise that resolves when initialization is complete.
541
+ */
493
542
  async init() {
494
543
  if (this._init) {
495
544
  return this._init;
@@ -523,17 +572,48 @@ var BaseProvider = class {
523
572
  })();
524
573
  return this._init;
525
574
  }
575
+ /**
576
+ * Preparation to be executed before init. Should be overwritten by subclasses.
577
+ *
578
+ * @private
579
+ */
526
580
  _prepare() {
527
581
  }
582
+ /**
583
+ * Setup to be executed after init. Should be overwritten by subclasses.
584
+ *
585
+ * @private
586
+ */
528
587
  _setup() {
529
588
  }
589
+ /**
590
+ * Returns a source for a axios cancel token.
591
+ *
592
+ * @returns {Object} axios cancel token source
593
+ */
530
594
  getCancelTokenSource() {
531
595
  return import_axios.default.CancelToken.source();
532
596
  }
597
+ /**
598
+ * Sets authentication credentials.
599
+ *
600
+ * @param {Object} options
601
+ * @param {string} options.key public key of login-server instance the user is authorized for
602
+ * @param {string} options.bearerToken token that is sent with each request
603
+ */
533
604
  setAuth({ key = this._auth.key, bearerToken = this._auth.bearerToken }) {
534
605
  this._auth.key = key;
535
606
  this._auth.bearerToken = bearerToken;
536
607
  }
608
+ /**
609
+ * Sets retry configuration.
610
+ *
611
+ * @param {Object} config
612
+ * @param {string[]} [config.methods=["get", "head", "options"]] HTTP methods to retry (lowercase)
613
+ * @param {number[]} [config.statusCodes=[401, 403]] status codes to retry
614
+ * @param {number} [config.count=3] maximum number of retries
615
+ * @param {number|Function} [config.delay=300*count] a delay in ms or a function that takes the number of current retries and returns a delay in ms
616
+ */
537
617
  setRetryConfig(config = {}) {
538
618
  this._retryConfig = Object.assign({
539
619
  methods: ["get", "head", "options"],
@@ -544,6 +624,16 @@ var BaseProvider = class {
544
624
  }
545
625
  }, config);
546
626
  }
627
+ /**
628
+ * Returns whether a user is authorized for a certain request.
629
+ *
630
+ * @param {Object} options
631
+ * @param {string} options.type type of item (e.g. mappings)
632
+ * @param {string} options.action action to be performed (read/create/update/delete)
633
+ * @param {Object} options.user user object
634
+ * @param {boolean} [options.crossUser] whether the request is a crossUser request (i.e. updading/deleting another user's item)
635
+ * @returns {boolean}
636
+ */
547
637
  isAuthorizedFor({ type, action, user, crossUser }) {
548
638
  if (action == "read" && this.has[type] === true) {
549
639
  return true;
@@ -578,6 +668,12 @@ var BaseProvider = class {
578
668
  }
579
669
  return !!this.has[type][action];
580
670
  }
671
+ /**
672
+ * Returns a boolean whether a certain target scheme is supported or not.
673
+ *
674
+ * @param {Object} scheme
675
+ * @returns {boolean}
676
+ */
581
677
  supportsScheme(scheme) {
582
678
  if (!scheme) {
583
679
  return false;
@@ -671,6 +767,13 @@ var BaseProvider = class {
671
767
  adjustMappings(mappings) {
672
768
  return withCustomProps(mappings.map((mapping) => this.adjustMapping(mapping)), mappings);
673
769
  }
770
+ /**
771
+ * POSTs multiple mappings. Do not override in subclass!
772
+ *
773
+ * @param {Object} config
774
+ * @param {Array} config.mappings array of mapping objects
775
+ * @returns {Object[]} array of created mapping objects; in case of failure, consult the `_errors` property on the array at the index of the failed request
776
+ */
674
777
  async postMappings({ mappings, ...config } = {}) {
675
778
  if (!mappings || !mappings.length) {
676
779
  throw new InvalidOrMissingParameterError({ parameter: "mappings" });
@@ -682,6 +785,13 @@ var BaseProvider = class {
682
785
  config
683
786
  });
684
787
  }
788
+ /**
789
+ * DELETEs multiple mappings. Do not override in subclass!
790
+ *
791
+ * @param {Object} config
792
+ * @param {Array} config.mappings array of mapping objects
793
+ * @returns {Object[]} array of results (`true` if successful); in case of failure, consult the `_errors` property on the array at the index of the failed request
794
+ */
685
795
  async deleteMappings({ mappings, ...config } = {}) {
686
796
  if (!mappings || !mappings.length) {
687
797
  throw new InvalidOrMissingParameterError({ parameter: "mappings" });
@@ -693,6 +803,20 @@ var BaseProvider = class {
693
803
  config
694
804
  });
695
805
  }
806
+ /**
807
+ * Calls a method that is for only one item for an array of items. Returns an array of results.
808
+ *
809
+ * If there is an error, that index in the result array will be `null`. There is a property `_errors` on the result array that will contain the respective error at the correct index.
810
+ *
811
+ * @param {Object} options
812
+ * @param {string} options.method instance method to call (e.g. `postMapping`)
813
+ * @param {Object[]} options.items items to call the method for
814
+ * @param {string} options.itemProperty the property name for the item when calling the method (e.g. `mapping`)
815
+ * @param {Object} options.config other properties to pass to the method call
816
+ * @returns {any[]} result array with values returned from individual method calls
817
+ *
818
+ * @private
819
+ */
696
820
  async _callHelperForArrayWrappers({ method, items, itemProperty, config }) {
697
821
  const errors = [];
698
822
  const resultItems = await Promise.all(items.map(async (item) => {
@@ -716,6 +840,9 @@ var import_localforage = __toESM(require("localforage"), 1);
716
840
  var import_uuid = require("uuid");
717
841
  var uriPrefix = "urn:uuid:";
718
842
  var LocalMappingsProvider = class extends BaseProvider {
843
+ /**
844
+ * @private
845
+ */
719
846
  _prepare() {
720
847
  this.has.mappings = {
721
848
  read: true,
@@ -727,6 +854,9 @@ var LocalMappingsProvider = class extends BaseProvider {
727
854
  this.has[c] = false;
728
855
  });
729
856
  }
857
+ /**
858
+ * @private
859
+ */
730
860
  _setup() {
731
861
  this.queue = [];
732
862
  this.localStorageKey = "cocoda-mappings--" + this._path;
@@ -768,6 +898,14 @@ var LocalMappingsProvider = class extends BaseProvider {
768
898
  }
769
899
  return false;
770
900
  }
901
+ /**
902
+ * Returns a Promise that returns an object { mappings, done } with the local mappings and a done function that is supposed to be called when the transaction is finished.
903
+ * This prevents conflicts when saveMapping is called multiple times simultaneously.
904
+ *
905
+ * TODO: There might be a better solution for this...
906
+ *
907
+ * @private
908
+ */
771
909
  _getMappingsQueue() {
772
910
  let last2 = import_last.default(this.queue) || Promise.resolve();
773
911
  return new Promise((resolve) => {
@@ -793,6 +931,13 @@ var LocalMappingsProvider = class extends BaseProvider {
793
931
  });
794
932
  });
795
933
  }
934
+ /**
935
+ * Returns a single mapping.
936
+ *
937
+ * @param {Object} config
938
+ * @param {Object} config.mapping JSKOS mapping
939
+ * @returns {Object} JSKOS mapping object
940
+ */
796
941
  async getMapping({ mapping, ...config }) {
797
942
  config._raw = true;
798
943
  if (!mapping || !mapping.uri) {
@@ -800,6 +945,14 @@ var LocalMappingsProvider = class extends BaseProvider {
800
945
  }
801
946
  return (await this.getMappings({ ...config, uri: mapping.uri }))[0];
802
947
  }
948
+ /**
949
+ * Returns a list of local mappings.
950
+ *
951
+ * TODO: Add support for sort (`created` or `modified`) and order (`asc` or `desc`).
952
+ * TODO: Clean up and use async/await
953
+ *
954
+ * @returns {Object[]} array of JSKOS mapping objects
955
+ */
803
956
  async getMappings({ from, fromScheme, to, toScheme, creator, type, partOf, offset, limit, direction, mode, identifier, uri } = {}) {
804
957
  let params = {};
805
958
  if (from) {
@@ -945,6 +1098,13 @@ var LocalMappingsProvider = class extends BaseProvider {
945
1098
  return mappings;
946
1099
  });
947
1100
  }
1101
+ /**
1102
+ * Creates a mapping.
1103
+ *
1104
+ * @param {Object} config
1105
+ * @param {Object} config.mapping JSKOS mapping
1106
+ * @returns {Object} JSKOS mapping object
1107
+ */
948
1108
  async postMapping({ mapping }) {
949
1109
  if (!mapping) {
950
1110
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -964,7 +1124,7 @@ var LocalMappingsProvider = class extends BaseProvider {
964
1124
  throw new InvalidOrMissingParameterError({ parameter: "mapping", message: "Duplicate URI" });
965
1125
  }
966
1126
  if (!mapping.created) {
967
- mapping.created = new Date().toISOString();
1127
+ mapping.created = (/* @__PURE__ */ new Date()).toISOString();
968
1128
  }
969
1129
  if (!mapping.modified) {
970
1130
  mapping.modified = mapping.created;
@@ -980,6 +1140,13 @@ var LocalMappingsProvider = class extends BaseProvider {
980
1140
  throw error;
981
1141
  }
982
1142
  }
1143
+ /**
1144
+ * Overwrites a mapping.
1145
+ *
1146
+ * @param {Object} config
1147
+ * @param {Object} config.mapping JSKOS mapping
1148
+ * @returns {Object} JSKOS mapping object
1149
+ */
983
1150
  async putMapping({ mapping }) {
984
1151
  if (!mapping) {
985
1152
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -993,7 +1160,7 @@ var LocalMappingsProvider = class extends BaseProvider {
993
1160
  if (!mapping.created) {
994
1161
  mapping.created = localMappings[index].created;
995
1162
  }
996
- mapping.modified = new Date().toISOString();
1163
+ mapping.modified = (/* @__PURE__ */ new Date()).toISOString();
997
1164
  localMappings[index] = mapping;
998
1165
  localMappings = localMappings.map((mapping2) => import_jskos_tools2.default.minifyMapping(mapping2));
999
1166
  try {
@@ -1005,6 +1172,13 @@ var LocalMappingsProvider = class extends BaseProvider {
1005
1172
  throw error;
1006
1173
  }
1007
1174
  }
1175
+ /**
1176
+ * Patches a mapping.
1177
+ *
1178
+ * @param {Object} config
1179
+ * @param {Object} mapping JSKOS mapping (or part of mapping)
1180
+ * @returns {Object} JSKOS mapping object
1181
+ */
1008
1182
  async patchMapping({ mapping }) {
1009
1183
  if (!mapping) {
1010
1184
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1018,7 +1192,7 @@ var LocalMappingsProvider = class extends BaseProvider {
1018
1192
  if (!mapping.created) {
1019
1193
  mapping.created = localMappings[index].created;
1020
1194
  }
1021
- mapping.modified = new Date().toISOString();
1195
+ mapping.modified = (/* @__PURE__ */ new Date()).toISOString();
1022
1196
  localMappings[index] = Object.assign(localMappings[index], mapping);
1023
1197
  localMappings = localMappings.map((mapping2) => import_jskos_tools2.default.minifyMapping(mapping2));
1024
1198
  try {
@@ -1030,6 +1204,13 @@ var LocalMappingsProvider = class extends BaseProvider {
1030
1204
  throw error;
1031
1205
  }
1032
1206
  }
1207
+ /**
1208
+ * Removes a mapping from local storage.
1209
+ *
1210
+ * @param {Object} config
1211
+ * @param {Object} mapping JSKOS mapping
1212
+ * @returns {boolean} boolean whether deleting the mapping was successful
1213
+ */
1033
1214
  async deleteMapping({ mapping }) {
1034
1215
  if (!mapping) {
1035
1216
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1053,6 +1234,9 @@ LocalMappingsProvider.stored = true;
1053
1234
  // src/providers/mappings-api-provider.js
1054
1235
  var import_jskos_tools3 = __toESM(require("jskos-tools"), 1);
1055
1236
  var MappingsApiProvider = class extends BaseProvider {
1237
+ /**
1238
+ * @private
1239
+ */
1056
1240
  _prepare() {
1057
1241
  if (this._api.api && this._api.status === void 0) {
1058
1242
  this._api.status = concatUrl(this._api.api, "/status");
@@ -1064,6 +1248,9 @@ var MappingsApiProvider = class extends BaseProvider {
1064
1248
  this.has[c] = false;
1065
1249
  });
1066
1250
  }
1251
+ /**
1252
+ * @private
1253
+ */
1067
1254
  _setup() {
1068
1255
  if (this._api.api) {
1069
1256
  const endpoints = {
@@ -1104,6 +1291,13 @@ var MappingsApiProvider = class extends BaseProvider {
1104
1291
  properties: "annotations"
1105
1292
  };
1106
1293
  }
1294
+ /**
1295
+ * Returns a single mapping.
1296
+ *
1297
+ * @param {Object} config
1298
+ * @param {Object} config.mapping JSKOS mapping
1299
+ * @returns {Object} JSKOS mapping object
1300
+ */
1107
1301
  async getMapping({ mapping, ...config }) {
1108
1302
  if (!mapping) {
1109
1303
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1127,6 +1321,12 @@ var MappingsApiProvider = class extends BaseProvider {
1127
1321
  throw error;
1128
1322
  }
1129
1323
  }
1324
+ /**
1325
+ * Returns a list of mappings.
1326
+ *
1327
+ * @param {Object} config request config with parameters
1328
+ * @returns {Object[]} array of JSKOS mapping objects
1329
+ */
1130
1330
  async getMappings({ from, fromScheme, to, toScheme, creator, type, partOf, offset, limit, direction, mode, identifier, cardinality, annotatedBy, annotatedFor, annotatedWith, sort, order, ...config }) {
1131
1331
  let params = {}, url = this._api.mappings;
1132
1332
  if (from) {
@@ -1194,6 +1394,13 @@ var MappingsApiProvider = class extends BaseProvider {
1194
1394
  }
1195
1395
  });
1196
1396
  }
1397
+ /**
1398
+ * Creates a mapping.
1399
+ *
1400
+ * @param {Object} config
1401
+ * @param {Object} config.mapping JSKOS mapping
1402
+ * @returns {Object} JSKOS mapping object
1403
+ */
1197
1404
  async postMapping({ mapping, ...config }) {
1198
1405
  if (!mapping) {
1199
1406
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1211,6 +1418,13 @@ var MappingsApiProvider = class extends BaseProvider {
1211
1418
  }
1212
1419
  });
1213
1420
  }
1421
+ /**
1422
+ * Overwrites a mapping.
1423
+ *
1424
+ * @param {Object} config
1425
+ * @param {Object} config.mapping JSKOS mapping
1426
+ * @returns {Object} JSKOS mapping object
1427
+ */
1214
1428
  async putMapping({ mapping, ...config }) {
1215
1429
  if (!mapping) {
1216
1430
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1232,6 +1446,13 @@ var MappingsApiProvider = class extends BaseProvider {
1232
1446
  }
1233
1447
  });
1234
1448
  }
1449
+ /**
1450
+ * Patches a mapping.
1451
+ *
1452
+ * @param {Object} config
1453
+ * @param {Object} config.mapping JSKOS mapping (or part of mapping)
1454
+ * @returns {Object} JSKOS mapping object
1455
+ */
1235
1456
  async patchMapping({ mapping, ...config }) {
1236
1457
  if (!mapping) {
1237
1458
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1251,6 +1472,13 @@ var MappingsApiProvider = class extends BaseProvider {
1251
1472
  }
1252
1473
  });
1253
1474
  }
1475
+ /**
1476
+ * Deletes a mapping.
1477
+ *
1478
+ * @param {Object} config
1479
+ * @param {Object} config.mapping JSKOS mapping
1480
+ * @returns {boolean} `true` if deletion was successful
1481
+ */
1254
1482
  async deleteMapping({ mapping, ...config }) {
1255
1483
  if (!mapping) {
1256
1484
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1266,6 +1494,13 @@ var MappingsApiProvider = class extends BaseProvider {
1266
1494
  });
1267
1495
  return true;
1268
1496
  }
1497
+ /**
1498
+ * Returns a list of annotations.
1499
+ *
1500
+ * @param {Object} config
1501
+ * @param {string} [config.target] target URI
1502
+ * @returns {Object[]} array of JSKOS annotation objects
1503
+ */
1269
1504
  async getAnnotations({ target, ...config }) {
1270
1505
  if (target) {
1271
1506
  import_set.default(config, "params.target", target);
@@ -1276,6 +1511,13 @@ var MappingsApiProvider = class extends BaseProvider {
1276
1511
  url: this._api.annotations
1277
1512
  });
1278
1513
  }
1514
+ /**
1515
+ * Creates an annotation.
1516
+ *
1517
+ * @param {Object} config
1518
+ * @param {Object} config.annotation JSKOS annotation
1519
+ * @returns {Object} JSKOS annotation object
1520
+ */
1279
1521
  async postAnnotation({ annotation, ...config }) {
1280
1522
  return this.axios({
1281
1523
  ...config,
@@ -1284,6 +1526,13 @@ var MappingsApiProvider = class extends BaseProvider {
1284
1526
  data: annotation
1285
1527
  });
1286
1528
  }
1529
+ /**
1530
+ * Overwrites an annotation.
1531
+ *
1532
+ * @param {Object} config
1533
+ * @param {Object} config.annotation JSKOS annotation
1534
+ * @returns {Object} JSKOS annotation object
1535
+ */
1287
1536
  async putAnnotation({ annotation, ...config }) {
1288
1537
  const uri = annotation.id;
1289
1538
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1296,6 +1545,13 @@ var MappingsApiProvider = class extends BaseProvider {
1296
1545
  data: annotation
1297
1546
  });
1298
1547
  }
1548
+ /**
1549
+ * Patches an annotation.
1550
+ *
1551
+ * @param {Object} config
1552
+ * @param {Object} config.annotation JSKOS annotation
1553
+ * @returns {Object} JSKOS annotation object
1554
+ */
1299
1555
  async patchAnnotation({ annotation, ...config }) {
1300
1556
  const uri = annotation.id;
1301
1557
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1308,6 +1564,13 @@ var MappingsApiProvider = class extends BaseProvider {
1308
1564
  data: annotation
1309
1565
  });
1310
1566
  }
1567
+ /**
1568
+ * Deletes an annotation.
1569
+ *
1570
+ * @param {Object} config
1571
+ * @param {Object} config.annotation JSKOS annotation
1572
+ * @returns {boolean} `true` if deletion was successful
1573
+ */
1311
1574
  async deleteAnnotation({ annotation, ...config }) {
1312
1575
  const uri = annotation.id;
1313
1576
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1320,6 +1583,12 @@ var MappingsApiProvider = class extends BaseProvider {
1320
1583
  });
1321
1584
  return true;
1322
1585
  }
1586
+ /**
1587
+ * Returns a list of concordances.
1588
+ *
1589
+ * @param {Object} config
1590
+ * @returns {Object[]} array of JSKOS concordance objects
1591
+ */
1323
1592
  async getConcordances(config) {
1324
1593
  return this.axios({
1325
1594
  ...config,
@@ -1327,6 +1596,13 @@ var MappingsApiProvider = class extends BaseProvider {
1327
1596
  url: this._api.concordances
1328
1597
  });
1329
1598
  }
1599
+ /**
1600
+ * Creates a concordance.
1601
+ *
1602
+ * @param {Object} config
1603
+ * @param {Object} config.concordance JSKOS concordance
1604
+ * @returns {Object} JSKOS concordance object
1605
+ */
1330
1606
  async postConcordance({ concordance, ...config }) {
1331
1607
  if (!concordance) {
1332
1608
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1342,6 +1618,13 @@ var MappingsApiProvider = class extends BaseProvider {
1342
1618
  }
1343
1619
  });
1344
1620
  }
1621
+ /**
1622
+ * Overwrites a concordance.
1623
+ *
1624
+ * @param {Object} config
1625
+ * @param {Object} config.concordance JSKOS concordance
1626
+ * @returns {Object} JSKOS concordance object
1627
+ */
1345
1628
  async putConcordance({ concordance, ...config }) {
1346
1629
  if (!concordance) {
1347
1630
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1361,6 +1644,13 @@ var MappingsApiProvider = class extends BaseProvider {
1361
1644
  }
1362
1645
  });
1363
1646
  }
1647
+ /**
1648
+ * Patches a concordance.
1649
+ *
1650
+ * @param {Object} config
1651
+ * @param {Object} config.concordance JSKOS concordance (or part of concordance)
1652
+ * @returns {Object} JSKOS concordance object
1653
+ */
1364
1654
  async patchConcordance({ concordance, ...config }) {
1365
1655
  if (!concordance) {
1366
1656
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1380,6 +1670,13 @@ var MappingsApiProvider = class extends BaseProvider {
1380
1670
  }
1381
1671
  });
1382
1672
  }
1673
+ /**
1674
+ * Deletes a concordance.
1675
+ *
1676
+ * @param {Object} config
1677
+ * @param {Object} config.concordance JSKOS concordance
1678
+ * @returns {boolean} `true` if deletion was successful
1679
+ */
1383
1680
  async deleteConcordance({ concordance, ...config }) {
1384
1681
  if (!concordance) {
1385
1682
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1406,6 +1703,9 @@ var OccurrencesApiProvider = class extends BaseProvider {
1406
1703
  get _cache() {
1407
1704
  return cache[this.uri];
1408
1705
  }
1706
+ /**
1707
+ * @private
1708
+ */
1409
1709
  _prepare() {
1410
1710
  cache[this.uri] = [];
1411
1711
  this._occurrencesSupportedSchemes = [];
@@ -1415,6 +1715,13 @@ var OccurrencesApiProvider = class extends BaseProvider {
1415
1715
  this.has[c] = false;
1416
1716
  });
1417
1717
  }
1718
+ /**
1719
+ * Returns whether a concept scheme is supported for occurrences.
1720
+ *
1721
+ * @private
1722
+ *
1723
+ * @param {Object} scheme JSKOS scheme to query
1724
+ */
1418
1725
  async _occurrencesIsSupported(scheme) {
1419
1726
  if (this._occurrencesSupportedSchemes && this._occurrencesSupportedSchemes.length) {
1420
1727
  } else {
@@ -1436,6 +1743,12 @@ var OccurrencesApiProvider = class extends BaseProvider {
1436
1743
  }
1437
1744
  return supported;
1438
1745
  }
1746
+ /**
1747
+ * Wrapper around getOccurrences that converts occurrences into mappings.
1748
+ *
1749
+ * @param {Object} config config object for getOccurrences request
1750
+ * @returns {Object[]} array of JSKOS mapping objects
1751
+ */
1439
1752
  async getMappings(config) {
1440
1753
  const occurrences = await this.getOccurrences(config);
1441
1754
  const from = config.from;
@@ -1479,6 +1792,15 @@ var OccurrencesApiProvider = class extends BaseProvider {
1479
1792
  mappings._url = occurrences._url;
1480
1793
  return mappings;
1481
1794
  }
1795
+ /**
1796
+ * Returns a list of occurrences.
1797
+ *
1798
+ * @param {Object} config
1799
+ * @param {Object} [config.from] JSKOS concept to load occurrences for (from side)
1800
+ * @param {Object} [config.to] JSKOS concept to load occurrences for (to side)
1801
+ * @param {Object[]} [config.concepts] list of JSKOS concepts to load occurrences for
1802
+ * @returns {Object[]} array of JSKOS occurrence objects
1803
+ */
1482
1804
  async getOccurrences({ from, to, concepts, threshold = 0, ...config }) {
1483
1805
  let promises = [];
1484
1806
  concepts = (concepts || []).concat([from, to]).filter((c) => !!c);
@@ -1531,6 +1853,13 @@ var OccurrencesApiProvider = class extends BaseProvider {
1531
1853
  occurrences._url = results.map((result) => result._url);
1532
1854
  return occurrences;
1533
1855
  }
1856
+ /**
1857
+ * Internal function for getOccurrences that either makes an API request or uses a local cache.
1858
+ *
1859
+ * @private
1860
+ *
1861
+ * @param {Object} config passthrough of config parameter for axios request
1862
+ */
1534
1863
  async _getOccurrences(config) {
1535
1864
  let resultsFromCache = this._cache.find((item) => {
1536
1865
  return import_isEqual.default(item.config.params, config.params);
@@ -1559,6 +1888,9 @@ OccurrencesApiProvider.stored = false;
1559
1888
  // src/providers/concept-api-provider.js
1560
1889
  var import_jskos_tools5 = __toESM(require("jskos-tools"), 1);
1561
1890
  var ConceptApiProvider = class extends BaseProvider {
1891
+ /**
1892
+ * @private
1893
+ */
1562
1894
  _prepare() {
1563
1895
  if (this._api.api && this._api.status === void 0) {
1564
1896
  this._api.status = concatUrl(this._api.api, "/status");
@@ -1577,6 +1909,9 @@ var ConceptApiProvider = class extends BaseProvider {
1577
1909
  this.has[c] = false;
1578
1910
  });
1579
1911
  }
1912
+ /**
1913
+ * @private
1914
+ */
1580
1915
  _setup() {
1581
1916
  if (this._api.api) {
1582
1917
  const endpoints = {
@@ -1610,9 +1945,17 @@ var ConceptApiProvider = class extends BaseProvider {
1610
1945
  this.has.search = !!this._api.search;
1611
1946
  this.has.auth = import_get.default(this._config, "auth.key") != null;
1612
1947
  this._defaultParams = {
1948
+ // Default parameters mostly for DANTE
1613
1949
  properties: "+created,issued,modified,editorialNote,scopeNote"
1614
1950
  };
1615
1951
  }
1952
+ /**
1953
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
1954
+ *
1955
+ * @param {Object} options
1956
+ * @param {Object} options.url API URL for server
1957
+ * @returns {Object} provider configuration
1958
+ */
1616
1959
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
1617
1960
  if (!url || !scheme) {
1618
1961
  return null;
@@ -1622,6 +1965,11 @@ var ConceptApiProvider = class extends BaseProvider {
1622
1965
  schemes: [scheme]
1623
1966
  };
1624
1967
  }
1968
+ /**
1969
+ * Returns the main vocabulary URI by requesting the scheme info and saving it in a cache.
1970
+ *
1971
+ * @private
1972
+ */
1625
1973
  async _getSchemeUri(scheme) {
1626
1974
  this._approvedSchemes = this._approvedSchemes || [];
1627
1975
  this._rejectedSchemes = this._rejectedSchemes || [];
@@ -1650,6 +1998,12 @@ var ConceptApiProvider = class extends BaseProvider {
1650
1998
  return null;
1651
1999
  }
1652
2000
  }
2001
+ /**
2002
+ * Returns all concept schemes.
2003
+ *
2004
+ * @param {Object} config
2005
+ * @returns {Object[]} array of JSKOS concept scheme objects
2006
+ */
1653
2007
  async getSchemes(config) {
1654
2008
  if (!this._api.schemes) {
1655
2009
  if (Array.isArray(this.schemes)) {
@@ -1663,6 +2017,7 @@ var ConceptApiProvider = class extends BaseProvider {
1663
2017
  url: this._api.schemes,
1664
2018
  params: {
1665
2019
  ...this._defaultParams,
2020
+ // ? What should the default limit be?
1666
2021
  limit: 500,
1667
2022
  ...config.params || {}
1668
2023
  }
@@ -1673,6 +2028,13 @@ var ConceptApiProvider = class extends BaseProvider {
1673
2028
  return schemes;
1674
2029
  }
1675
2030
  }
2031
+ /**
2032
+ * Returns top concepts for a concept scheme.
2033
+ *
2034
+ * @param {Object} config
2035
+ * @param {Object} config.scheme concept scheme object
2036
+ * @returns {Object[]} array of JSKOS concept objects
2037
+ */
1676
2038
  async getTop({ scheme, ...config }) {
1677
2039
  if (!this._api.top) {
1678
2040
  throw new MissingApiUrlError();
@@ -1693,12 +2055,20 @@ var ConceptApiProvider = class extends BaseProvider {
1693
2055
  url: this._api.top,
1694
2056
  params: {
1695
2057
  ...this._defaultParams,
2058
+ // ? What should the default limit be?
1696
2059
  limit: 1e4,
1697
2060
  ...config.params || {},
1698
2061
  uri: schemeUri
1699
2062
  }
1700
2063
  });
1701
2064
  }
2065
+ /**
2066
+ * Returns details for a list of concepts.
2067
+ *
2068
+ * @param {Object} config
2069
+ * @param {Object[]} config.concepts list of concept objects to load
2070
+ * @returns {Object[]} array of JSKOS concept objects
2071
+ */
1702
2072
  async getConcepts({ concepts, ...config }) {
1703
2073
  if (this.has.data === false) {
1704
2074
  throw new MissingApiUrlError();
@@ -1716,12 +2086,20 @@ var ConceptApiProvider = class extends BaseProvider {
1716
2086
  url: this._api.data,
1717
2087
  params: {
1718
2088
  ...this._defaultParams,
2089
+ // ? What should the default limit be?
1719
2090
  limit: 500,
1720
2091
  ...config.params || {},
1721
2092
  uri: uris.join("|")
1722
2093
  }
1723
2094
  });
1724
2095
  }
2096
+ /**
2097
+ * Returns narrower concepts for a concept.
2098
+ *
2099
+ * @param {Object} config
2100
+ * @param {Object} config.concept concept object
2101
+ * @returns {Object[]} array of JSKOS concept objects
2102
+ */
1725
2103
  async getNarrower({ concept, ...config }) {
1726
2104
  if (!this._api.narrower) {
1727
2105
  throw new MissingApiUrlError();
@@ -1735,12 +2113,20 @@ var ConceptApiProvider = class extends BaseProvider {
1735
2113
  url: this._api.narrower,
1736
2114
  params: {
1737
2115
  ...this._defaultParams,
2116
+ // ? What should the default limit be?
1738
2117
  limit: 1e4,
1739
2118
  ...config.params || {},
1740
2119
  uri: concept.uri
1741
2120
  }
1742
2121
  });
1743
2122
  }
2123
+ /**
2124
+ * Returns ancestor concepts for a concept.
2125
+ *
2126
+ * @param {Object} config
2127
+ * @param {Object} config.concept concept object
2128
+ * @returns {Object[]} array of JSKOS concept objects
2129
+ */
1744
2130
  async getAncestors({ concept, ...config }) {
1745
2131
  if (!this._api.ancestors) {
1746
2132
  throw new MissingApiUrlError();
@@ -1754,12 +2140,25 @@ var ConceptApiProvider = class extends BaseProvider {
1754
2140
  url: this._api.ancestors,
1755
2141
  params: {
1756
2142
  ...this._defaultParams,
2143
+ // ? What should the default limit be?
1757
2144
  limit: 1e4,
1758
2145
  ...config.params || {},
1759
2146
  uri: concept.uri
1760
2147
  }
1761
2148
  });
1762
2149
  }
2150
+ /**
2151
+ * Returns suggestion result in OpenSearch Suggest Format.
2152
+ *
2153
+ * @param {Object} config
2154
+ * @param {string} config.search search string
2155
+ * @param {Object} [config.scheme] concept scheme to search in
2156
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2157
+ * @param {string} [config.use=notation,label] which fields to search ("notation", "label" or "notation,label")
2158
+ * @param {string[]} [config.types=[]] list of type URIs
2159
+ * @param {string} [config.sort=score] sorting parameter
2160
+ * @returns {Array} result in OpenSearch Suggest Format
2161
+ */
1763
2162
  async suggest({ use = "notation,label", types = [], sort = "score", params = {}, ...config }) {
1764
2163
  return this._search({
1765
2164
  ...config,
@@ -1772,6 +2171,17 @@ var ConceptApiProvider = class extends BaseProvider {
1772
2171
  }
1773
2172
  });
1774
2173
  }
2174
+ /**
2175
+ * Returns search results in JSKOS Format.
2176
+ *
2177
+ * @param {Object} config
2178
+ * @param {string} config.search search string
2179
+ * @param {Object} [config.scheme] concept scheme to search in
2180
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2181
+ * @param {number} [config.offset=0] offset
2182
+ * @param {string[]} [config.types=[]] list of type URIs
2183
+ * @returns {Array} result in JSKOS Format
2184
+ */
1775
2185
  async search({ types = [], params = {}, ...config }) {
1776
2186
  return this._search({
1777
2187
  ...config,
@@ -1782,6 +2192,16 @@ var ConceptApiProvider = class extends BaseProvider {
1782
2192
  }
1783
2193
  });
1784
2194
  }
2195
+ /**
2196
+ * Returns concept scheme suggestion result in OpenSearch Suggest Format.
2197
+ *
2198
+ * @param {Object} config
2199
+ * @param {string} config.search search string
2200
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2201
+ * @param {string} [config.use=notation,label] which fields to search ("notation", "label" or "notation,label")
2202
+ * @param {string} [config.sort=score] sorting parameter
2203
+ * @returns {Array} result in OpenSearch Suggest Format
2204
+ */
1785
2205
  async vocSuggest({ use = "notation,label", sort = "score", params = {}, ...config }) {
1786
2206
  return this._search({
1787
2207
  ...config,
@@ -1793,6 +2213,15 @@ var ConceptApiProvider = class extends BaseProvider {
1793
2213
  }
1794
2214
  });
1795
2215
  }
2216
+ /**
2217
+ * Returns concept scheme search results in JSKOS Format.
2218
+ *
2219
+ * @param {Object} config
2220
+ * @param {string} config.search search string
2221
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2222
+ * @param {number} [config.offset=0] offset
2223
+ * @returns {Array} result in JSKOS Format
2224
+ */
1796
2225
  async vocSearch(config) {
1797
2226
  return this._search({
1798
2227
  ...config,
@@ -1818,6 +2247,7 @@ var ConceptApiProvider = class extends BaseProvider {
1818
2247
  ...params,
1819
2248
  limit,
1820
2249
  count: limit,
2250
+ // Some endpoints use count instead of limit
1821
2251
  offset,
1822
2252
  search,
1823
2253
  query: search,
@@ -1827,6 +2257,13 @@ var ConceptApiProvider = class extends BaseProvider {
1827
2257
  url
1828
2258
  });
1829
2259
  }
2260
+ /**
2261
+ * Returns a list of types.
2262
+ *
2263
+ * @param {Object} config
2264
+ * @param {Object} [config.scheme] concept scheme to load types for
2265
+ * @returns {Object[]} array of JSKOS type objects
2266
+ */
1830
2267
  async getTypes({ scheme, ...config }) {
1831
2268
  if (!this._api.types) {
1832
2269
  throw new MissingApiUrlError();
@@ -1855,6 +2292,9 @@ var ReconciliationApiProvider = class extends BaseProvider {
1855
2292
  get _cache() {
1856
2293
  return cache2[this.uri];
1857
2294
  }
2295
+ /**
2296
+ * @private
2297
+ */
1858
2298
  _prepare() {
1859
2299
  cache2[this.uri] = [];
1860
2300
  this.has.mappings = true;
@@ -1862,6 +2302,15 @@ var ReconciliationApiProvider = class extends BaseProvider {
1862
2302
  this.has[c] = false;
1863
2303
  });
1864
2304
  }
2305
+ /**
2306
+ * Returns a list of mappings suggestions.
2307
+ *
2308
+ * @param {Object} config
2309
+ * @param {Object} config.from JSKOS concept on from side
2310
+ * @param {Object} config.to JSKOS concept on to side
2311
+ * @param {Object} config.mode mappings mode
2312
+ * @returns {Object[]} array of JSKOS mapping objects
2313
+ */
1865
2314
  async getMappings({ from, to, mode, ...config }) {
1866
2315
  let schemes = [];
1867
2316
  if (import_isArray.default(this.schemes)) {
@@ -1946,6 +2395,15 @@ var ReconciliationApiProvider = class extends BaseProvider {
1946
2395
  mappings._url = url;
1947
2396
  return mappings;
1948
2397
  }
2398
+ /**
2399
+ * Internal function that either makes an API request or uses a local cache.
2400
+ *
2401
+ * @private
2402
+ *
2403
+ * @param {Object} config passthrough of config object for axios request
2404
+ * @param {string[]} labels list of labels to get results for
2405
+ * @param {string} language language of labels
2406
+ */
1949
2407
  async _getReconciliationResults({ labels, language, ...config }) {
1950
2408
  labels = labels.sort();
1951
2409
  let resultsFromCache = this._cache.find((item) => {
@@ -1994,6 +2452,9 @@ ReconciliationApiProvider.stored = false;
1994
2452
  // src/providers/label-search-suggestion-provider.js
1995
2453
  var import_jskos_tools7 = __toESM(require("jskos-tools"), 1);
1996
2454
  var LabelSearchSuggestionProvider = class extends BaseProvider {
2455
+ /**
2456
+ * @private
2457
+ */
1997
2458
  _prepare() {
1998
2459
  this._cache = [];
1999
2460
  this.has.mappings = true;
@@ -2001,9 +2462,25 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2001
2462
  this.has[c] = false;
2002
2463
  });
2003
2464
  }
2465
+ /**
2466
+ * Override `supportsScheme` to check whether a search URI is available for the scheme's registry.
2467
+ *
2468
+ * @param {Object} scheme - target scheme to check for support
2469
+ * @returns {boolean}
2470
+ */
2004
2471
  supportsScheme(scheme) {
2005
2472
  return super.supportsScheme(scheme) && import_get.default(scheme, "_registry.has.search", false);
2006
2473
  }
2474
+ /**
2475
+ * Returns a list of mappings.
2476
+ *
2477
+ * @param {Object} config
2478
+ * @param {Object} config.from JSKOS concept on from side
2479
+ * @param {Object} config.to JSKOS concept on to side
2480
+ * @param {Object} config.mode mappings mode
2481
+ * @param {Object} config.selected selected mappings in Cocoda
2482
+ * @returns {Object[]} array of JSKOS mapping objects
2483
+ */
2007
2484
  async getMappings({ from, to, mode, selected, limit = 10, ...config }) {
2008
2485
  if (mode != "or") {
2009
2486
  return [];
@@ -2033,6 +2510,17 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2033
2510
  }
2034
2511
  return import_union.default(fromResult, toResult);
2035
2512
  }
2513
+ /**
2514
+ * Internal function to get mapping recommendations for a certain concept with sourceScheme and targetScheme.
2515
+ *
2516
+ * @private
2517
+ *
2518
+ * @param {Object} config
2519
+ * @param {Object} config.concept
2520
+ * @param {Object} config.sourceScheme
2521
+ * @param {Pbject} config.targetScheme
2522
+ * @param {boolean} config.swap - whether to reverse the direction of the mappings
2523
+ */
2036
2524
  async _getMappings({ concept, sourceScheme, targetScheme, limit, swap = false, ...config }) {
2037
2525
  if (!concept || !sourceScheme || !targetScheme) {
2038
2526
  return [];
@@ -2082,6 +2570,15 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2082
2570
  }
2083
2571
  return mappings;
2084
2572
  }
2573
+ /**
2574
+ * Internal function that either makes an API request or uses a local cache.
2575
+ *
2576
+ * @private
2577
+ *
2578
+ * @param {Object} config
2579
+ * @param {string} config.label
2580
+ * @param {Object} config.targetScheme
2581
+ */
2085
2582
  async _getResults({ label, targetScheme, limit, ...config }) {
2086
2583
  let resultsFromCache = (this._cache[targetScheme.uri] || {})[label];
2087
2584
  if (resultsFromCache && resultsFromCache._limit >= limit) {
@@ -2113,6 +2610,9 @@ LabelSearchSuggestionProvider.stored = false;
2113
2610
  // src/providers/skosmos-api-provider.js
2114
2611
  var import_jskos_tools8 = __toESM(require("jskos-tools"), 1);
2115
2612
  var SkosmosApiProvider = class extends BaseProvider {
2613
+ /**
2614
+ * @private
2615
+ */
2116
2616
  _prepare() {
2117
2617
  this.has.schemes = true;
2118
2618
  this.has.top = true;
@@ -2127,6 +2627,14 @@ var SkosmosApiProvider = class extends BaseProvider {
2127
2627
  this.has[c] = false;
2128
2628
  });
2129
2629
  }
2630
+ /**
2631
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
2632
+ *
2633
+ * @param {Object} options
2634
+ * @param {Object} options.url API URL for BARTOC instance
2635
+ * @param {Object} options.scheme scheme for which the config is requested
2636
+ * @returns {Object} provider configuration
2637
+ */
2130
2638
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2131
2639
  if (!url || !scheme) {
2132
2640
  return null;
@@ -2141,9 +2649,15 @@ var SkosmosApiProvider = class extends BaseProvider {
2141
2649
  config.schemes = [scheme];
2142
2650
  return config;
2143
2651
  }
2652
+ /**
2653
+ * @private
2654
+ */
2144
2655
  get _language() {
2145
2656
  return this.languages[0] || this._defaultLanguages[0] || "en";
2146
2657
  }
2658
+ /**
2659
+ * @private
2660
+ */
2147
2661
  _getApiUrl(scheme, endpoint, params) {
2148
2662
  const VOCID = scheme && scheme.VOCID || import_get.default(this.schemes.find((s) => import_jskos_tools8.default.compare(s, scheme)), "VOCID");
2149
2663
  if (!VOCID) {
@@ -2157,6 +2671,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2157
2671
  const paramString = Object.keys(params).map((k) => `${k}=${encodeURIComponent(params[k])}`).join("&");
2158
2672
  return `${this._api.api}${VOCID}${endpoint}${paramString ? "?" + paramString : ""}`;
2159
2673
  }
2674
+ /**
2675
+ * @private
2676
+ */
2160
2677
  _getDataUrl(concept, { addFormatParameter = true } = {}) {
2161
2678
  const scheme = import_get.default(concept, "inScheme[0]");
2162
2679
  if (!concept || !concept.uri) {
@@ -2164,6 +2681,11 @@ var SkosmosApiProvider = class extends BaseProvider {
2164
2681
  }
2165
2682
  return this._getApiUrl(scheme, "/data", addFormatParameter ? { format: "application/json" } : {});
2166
2683
  }
2684
+ /**
2685
+ * Returns the main vocabulary URI by requesting the scheme info and saving it in a cache.
2686
+ *
2687
+ * @private
2688
+ */
2167
2689
  async _getSchemeUri(scheme) {
2168
2690
  this._approvedSchemes = this._approvedSchemes || [];
2169
2691
  this._rejectedSchemes = this._rejectedSchemes || [];
@@ -2194,6 +2716,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2194
2716
  return null;
2195
2717
  }
2196
2718
  }
2719
+ /**
2720
+ * @private
2721
+ */
2197
2722
  _toJskosConcept(skosmosConcept, { concept, scheme, result, language } = {}) {
2198
2723
  if (!skosmosConcept) {
2199
2724
  return null;
@@ -2266,6 +2791,12 @@ var SkosmosApiProvider = class extends BaseProvider {
2266
2791
  }
2267
2792
  return concept;
2268
2793
  }
2794
+ /**
2795
+ * Returns all concept schemes.
2796
+ *
2797
+ * @param {Object} config
2798
+ * @returns {Object[]} array of JSKOS concept scheme objects
2799
+ */
2269
2800
  async getSchemes({ ...config }) {
2270
2801
  const schemes = [];
2271
2802
  for (let scheme of this.schemes || []) {
@@ -2291,6 +2822,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2291
2822
  }
2292
2823
  return schemes;
2293
2824
  }
2825
+ /**
2826
+ * Returns top concepts.
2827
+ *
2828
+ * @param {Object} config
2829
+ * @param {Object} config.scheme concept scheme
2830
+ * @returns {Object[]} array of JSKOS concept scheme objects
2831
+ */
2294
2832
  async getTop({ scheme, ...config }) {
2295
2833
  const url = this._getApiUrl(scheme, "/topConcepts");
2296
2834
  const schemeUri = await this._getSchemeUri(scheme);
@@ -2314,6 +2852,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2314
2852
  }
2315
2853
  return concepts;
2316
2854
  }
2855
+ /**
2856
+ * Returns details for a list of concepts.
2857
+ *
2858
+ * @param {Object} config
2859
+ * @param {Object[]} config.concepts list of concept objects to load
2860
+ * @returns {Object[]} array of JSKOS concept objects
2861
+ */
2317
2862
  async getConcepts({ concepts, ...config }) {
2318
2863
  if (!import_isArray.default(concepts)) {
2319
2864
  concepts = [concepts];
@@ -2353,6 +2898,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2353
2898
  }
2354
2899
  return newConcepts;
2355
2900
  }
2901
+ /**
2902
+ * Returns narrower concepts for a concept.
2903
+ *
2904
+ * @param {Object} config
2905
+ * @param {Object} config.concept concept object
2906
+ * @returns {Object[]} array of JSKOS concept objects
2907
+ */
2356
2908
  async getNarrower({ concept, ...config }) {
2357
2909
  if (!concept || !concept.uri) {
2358
2910
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2368,6 +2920,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2368
2920
  const concepts = (response.narrower || []).map((c) => this._toJskosConcept(c, { scheme }));
2369
2921
  return concepts;
2370
2922
  }
2923
+ /**
2924
+ * Returns ancestor concepts for a concept.
2925
+ *
2926
+ * @param {Object} config
2927
+ * @param {Object} config.concept concept object
2928
+ * @returns {Object[]} array of JSKOS concept objects
2929
+ */
2371
2930
  async getAncestors({ concept, ...config }) {
2372
2931
  if (!concept || !concept.uri) {
2373
2932
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2392,6 +2951,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2392
2951
  const concepts = ancestors.map((c) => this._toJskosConcept(c, { scheme })).filter((c) => c.uri != concept.uri);
2393
2952
  return concepts;
2394
2953
  }
2954
+ /**
2955
+ * Returns suggestion result in OpenSearch Suggest Format.
2956
+ *
2957
+ * @param {Object} config
2958
+ * @param {string} config.search search string
2959
+ * @param {Object} [config.scheme] concept scheme to search in
2960
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2961
+ * @param {string[]} [config.types=[]] list of type URIs
2962
+ * @returns {Array} result in OpenSearch Suggest Format
2963
+ */
2395
2964
  async suggest(config) {
2396
2965
  config._raw = true;
2397
2966
  const concepts = await this.search(config);
@@ -2410,6 +2979,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2410
2979
  }
2411
2980
  return result;
2412
2981
  }
2982
+ /**
2983
+ * Returns concept search results.
2984
+ *
2985
+ * @param {Object} config
2986
+ * @param {string} config.search search string
2987
+ * @param {Object} [config.scheme] concept scheme to search in
2988
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2989
+ * @param {string[]} [config.types=[]] list of type URIs
2990
+ * @returns {Array} array of JSKOS concept objects
2991
+ */
2413
2992
  async search({ search, scheme, limit, types = [], ...config }) {
2414
2993
  const url = this._getApiUrl(scheme, "/search");
2415
2994
  import_set.default(config, "params.query", `${search}*`);
@@ -2424,6 +3003,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2424
3003
  const concepts = (response.results || []).map((c) => this._toJskosConcept(c, { scheme }));
2425
3004
  return concepts;
2426
3005
  }
3006
+ /**
3007
+ * Returns a list of types.
3008
+ *
3009
+ * @param {Object} config
3010
+ * @param {Object} [config.scheme] concept scheme to load types for
3011
+ * @returns {Object[]} array of JSKOS type objects
3012
+ */
2427
3013
  async getTypes({ scheme, ...config }) {
2428
3014
  const url = this._getApiUrl(scheme, "/types");
2429
3015
  const types = [];
@@ -2522,6 +3108,9 @@ function madsToJskosConcept(data3, { scheme }) {
2522
3108
  return concept;
2523
3109
  }
2524
3110
  var LocApiProvider = class extends BaseProvider {
3111
+ /**
3112
+ * @private
3113
+ */
2525
3114
  _prepare() {
2526
3115
  this.has.schemes = true;
2527
3116
  this.has.top = false;
@@ -2535,6 +3124,13 @@ var LocApiProvider = class extends BaseProvider {
2535
3124
  this.has[c] = false;
2536
3125
  });
2537
3126
  }
3127
+ /**
3128
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3129
+ *
3130
+ * @param {Object} options
3131
+ * @param {Object} options.scheme scheme for which the config is requested
3132
+ * @returns {Object} provider configuration
3133
+ */
2538
3134
  static _registryConfigForBartocApiConfig({ scheme } = {}) {
2539
3135
  if (!scheme || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, scheme))) {
2540
3136
  return null;
@@ -2543,6 +3139,11 @@ var LocApiProvider = class extends BaseProvider {
2543
3139
  schemes: [scheme]
2544
3140
  };
2545
3141
  }
3142
+ /**
3143
+ * Returns all concept schemes.
3144
+ *
3145
+ * @returns {Object[]} array of JSKOS concept scheme objects
3146
+ */
2546
3147
  async getSchemes() {
2547
3148
  const schemes = [];
2548
3149
  for (let scheme of await Promise.all(
@@ -2567,6 +3168,29 @@ var LocApiProvider = class extends BaseProvider {
2567
3168
  }
2568
3169
  return schemes;
2569
3170
  }
3171
+ /**
3172
+ * TODO: Possibly reenable for LCC
3173
+ * Returns top concepts for a concept scheme.
3174
+ *
3175
+ * @param {Object} config
3176
+ * @param {Object} config.scheme concept scheme object
3177
+ * @returns {Object[]} array of JSKOS concept objects
3178
+ */
3179
+ // async getTop({ scheme }) {
3180
+ // if (scheme.topConcepts && !scheme.topConcepts.includes(null)) {
3181
+ // return scheme.topConcepts
3182
+ // }
3183
+ // const schemes = await this.getSchemes()
3184
+ // scheme = schemes.find(s => jskos.compare(s, scheme))
3185
+ // return scheme && scheme.topConcepts || []
3186
+ // }
3187
+ /**
3188
+ * Returns details for a list of concepts.
3189
+ *
3190
+ * @param {Object} config
3191
+ * @param {Object[]} config.concepts list of concept objects to load
3192
+ * @returns {Object[]} array of JSKOS concept objects
3193
+ */
2570
3194
  async getConcepts({ concepts }) {
2571
3195
  if (!Array.isArray(concepts)) {
2572
3196
  concepts = [concepts];
@@ -2590,6 +3214,16 @@ var LocApiProvider = class extends BaseProvider {
2590
3214
  }
2591
3215
  return resultConcepts;
2592
3216
  }
3217
+ /**
3218
+ * Returns suggestion result in OpenSearch Suggest Format.
3219
+ *
3220
+ * @param {Object} config
3221
+ * @param {string} config.search search string
3222
+ * @param {Object} config.scheme concept scheme to search in
3223
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
3224
+ * @param {number} [config.offset=0] offset
3225
+ * @returns {Array} result in OpenSearch Suggest Format
3226
+ */
2593
3227
  async suggest(config) {
2594
3228
  const results = await this.search(config);
2595
3229
  return [
@@ -2601,6 +3235,16 @@ var LocApiProvider = class extends BaseProvider {
2601
3235
  results.map((c) => c.uri)
2602
3236
  ];
2603
3237
  }
3238
+ /**
3239
+ * Returns search results in JSKOS Format.
3240
+ *
3241
+ * @param {Object} config
3242
+ * @param {string} config.search search string
3243
+ * @param {Object} config.scheme concept scheme to search in
3244
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
3245
+ * @param {number} [config.offset=0] offset
3246
+ * @returns {Array} result in JSKOS Format
3247
+ */
2604
3248
  async search({ search, scheme, limit, offset }) {
2605
3249
  const schemeUri = import_jskos_tools9.default.getAllUris(scheme).find((uri) => uri.startsWith(locUriPrefix));
2606
3250
  if (!schemeUri || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, { uri: schemeUri }))) {
@@ -2672,6 +3316,14 @@ var SkohubProvider = class extends BaseProvider {
2672
3316
  get _schemeCache() {
2673
3317
  return data[this.uri] && data[this.uri].schemeCache;
2674
3318
  }
3319
+ /**
3320
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3321
+ *
3322
+ * @param {Object} options
3323
+ * @param {Object} options.url API URL for BARTOC instance
3324
+ * @param {Object} options.scheme scheme for which the config is requested
3325
+ * @returns {Object} provider configuration
3326
+ */
2675
3327
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2676
3328
  if (!url || !scheme) {
2677
3329
  return null;
@@ -2801,6 +3453,15 @@ var SkohubProvider = class extends BaseProvider {
2801
3453
  concept = await this._loadConcept({ ...config, uri: concept.uri });
2802
3454
  return concept.narrower;
2803
3455
  }
3456
+ /**
3457
+ * Returns concept search results.
3458
+ *
3459
+ * @param {Object} config
3460
+ * @param {string} config.search search string
3461
+ * @param {Object} [config.scheme] concept scheme to search in
3462
+ * @param {number} [config.limit=100] maximum number of search results
3463
+ * @returns {Array} array of JSKOS concept objects
3464
+ */
2804
3465
  async search({ search, scheme, limit = 100 }) {
2805
3466
  scheme = await this._loadScheme({ scheme });
2806
3467
  if (!scheme || !scheme.uri) {
@@ -2846,6 +3507,15 @@ var SkohubProvider = class extends BaseProvider {
2846
3507
  const concepts = await this.getConcepts({ concepts: result.map((uri) => ({ uri })) });
2847
3508
  return concepts.slice(0, limit);
2848
3509
  }
3510
+ /**
3511
+ * Returns suggestion result in OpenSearch Suggest Format.
3512
+ *
3513
+ * @param {Object} config
3514
+ * @param {string} config.search search string
3515
+ * @param {Object} [config.scheme] concept scheme to search in
3516
+ * @param {number} [config.limit=100] maximum number of search results
3517
+ * @returns {Array} result in OpenSearch Suggest Format
3518
+ */
2849
3519
  async suggest(config) {
2850
3520
  config._raw = true;
2851
3521
  const concepts = await this.search(config);
@@ -2868,8 +3538,243 @@ var SkohubProvider = class extends BaseProvider {
2868
3538
  SkohubProvider.providerName = "Skohub";
2869
3539
  SkohubProvider.providerType = "http://bartoc.org/api-type/skohub";
2870
3540
 
2871
- // src/providers/mycore-provider.js
3541
+ // src/providers/lobid-api-provider.js
2872
3542
  var import_jskos_tools11 = __toESM(require("jskos-tools"), 1);
3543
+ var import_axios3 = __toESM(require("axios"), 1);
3544
+ var gndJson = {
3545
+ uri: "http://bartoc.org/en/node/430",
3546
+ concepts: [
3547
+ null
3548
+ ],
3549
+ topConcepts: [],
3550
+ type: [
3551
+ "http://www.w3.org/2004/02/skos/core#ConceptScheme"
3552
+ ],
3553
+ DISPLAY: {
3554
+ hideNotation: true
3555
+ },
3556
+ identifier: [
3557
+ "http://www.wikidata.org/entity/Q36578"
3558
+ ],
3559
+ license: [
3560
+ {
3561
+ uri: "http://creativecommons.org/publicdomain/zero/1.0/"
3562
+ }
3563
+ ],
3564
+ namespace: "https://d-nb.info/gnd/",
3565
+ notation: [
3566
+ "GND"
3567
+ ],
3568
+ notationPattern: "[0-9X-]+",
3569
+ prefLabel: {
3570
+ de: "Gemeinsame Normdatei",
3571
+ en: "Integrated Authority File"
3572
+ },
3573
+ types: [
3574
+ {
3575
+ uri: "https://d-nb.info/standards/elementset/gnd#DifferentiatedPerson",
3576
+ prefLabel: {
3577
+ de: "Person",
3578
+ en: "Person"
3579
+ }
3580
+ },
3581
+ {
3582
+ uri: "https://d-nb.info/standards/elementset/gnd#PlaceOrGeographicName",
3583
+ prefLabel: {
3584
+ de: "Geografikum",
3585
+ en: "Place"
3586
+ }
3587
+ },
3588
+ {
3589
+ uri: "https://d-nb.info/standards/elementset/gnd#CorporateBody",
3590
+ prefLabel: {
3591
+ de: "Organisation",
3592
+ en: "Organization"
3593
+ }
3594
+ },
3595
+ {
3596
+ uri: "https://d-nb.info/standards/elementset/gnd#SubjectHeading",
3597
+ prefLabel: {
3598
+ de: "Sachbegriff",
3599
+ en: "Subject"
3600
+ }
3601
+ },
3602
+ {
3603
+ uri: "https://d-nb.info/standards/elementset/gnd#Work",
3604
+ prefLabel: {
3605
+ de: "Werk",
3606
+ en: "Work"
3607
+ }
3608
+ },
3609
+ {
3610
+ uri: "https://d-nb.info/standards/elementset/gnd#ConferenceOrEvent",
3611
+ prefLabel: {
3612
+ de: "Konferenz oder Veranstaltung",
3613
+ en: "ConferenceOrEvent"
3614
+ }
3615
+ }
3616
+ ]
3617
+ };
3618
+ var gndTypeScheme = new import_jskos_tools11.default.ConceptScheme({
3619
+ uri: "https://d-nb.info/standards/elementset/gnd",
3620
+ namespace: "https://d-nb.info/standards/elementset/gnd#"
3621
+ });
3622
+ gndJson.types.forEach((type) => {
3623
+ type.notation = [gndTypeScheme.notationFromUri(type.uri)];
3624
+ });
3625
+ var gnd = new import_jskos_tools11.default.ConceptScheme(gndJson);
3626
+ var broaderProps = [
3627
+ "broaderTerm",
3628
+ "broaderTermGeneral",
3629
+ "broaderTermGeneric",
3630
+ "broaderTermInstantial",
3631
+ "broaderTermPartitive"
3632
+ ];
3633
+ function toJSKOS(data3) {
3634
+ const concept = {
3635
+ uri: data3.id,
3636
+ notation: [data3.gndIdentifier],
3637
+ prefLabel: { de: data3.preferredName },
3638
+ inScheme: [{ uri: gndJson.uri }]
3639
+ };
3640
+ if (data3.variantName) {
3641
+ concept.altLabel = { de: data3.variantName };
3642
+ }
3643
+ concept.type = data3.type.map((type) => gndTypeScheme.uriFromNotation(type)).filter(Boolean);
3644
+ concept.broader = [];
3645
+ broaderProps.forEach((prop) => {
3646
+ concept.broader = concept.broader.concat(data3[prop] || []);
3647
+ });
3648
+ concept.broader = concept.broader.map((broader) => ({ uri: broader.id }));
3649
+ concept.identifier = [concept.uri.replace("https://", "http://")];
3650
+ return concept;
3651
+ }
3652
+ function fixURI(uri) {
3653
+ if (uri && uri.startsWith("http://")) {
3654
+ return uri.replace("http://", "https://");
3655
+ }
3656
+ return uri;
3657
+ }
3658
+ var LobidApiProvider = class extends BaseProvider {
3659
+ _prepare() {
3660
+ this.has.schemes = true;
3661
+ this.has.data = true;
3662
+ this.has.concepts = true;
3663
+ this.has.narrower = true;
3664
+ this.has.suggest = true;
3665
+ this.has.search = true;
3666
+ this.has.types = true;
3667
+ listOfCapabilities.filter((c) => !this.has[c]).forEach((c) => {
3668
+ this.has[c] = false;
3669
+ });
3670
+ }
3671
+ /**
3672
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3673
+ *
3674
+ * @param {Object} options
3675
+ * @param {Object} options.url API URL for server
3676
+ * @returns {Object} provider configuration
3677
+ */
3678
+ static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
3679
+ if (!url || !scheme || !import_jskos_tools11.default.compare(scheme, gndJson) || url !== "https://lobid.org/gnd/api") {
3680
+ return null;
3681
+ }
3682
+ return {
3683
+ api: "https://lobid.org/gnd/",
3684
+ schemes: [gndJson]
3685
+ };
3686
+ }
3687
+ async getSchemes() {
3688
+ return [gndJson];
3689
+ }
3690
+ async getTop() {
3691
+ return [];
3692
+ }
3693
+ async getConcepts({ concepts }) {
3694
+ if (!concepts) {
3695
+ throw new errors.InvalidOrMissingParameterError({ parameter: "concepts" });
3696
+ }
3697
+ if (!Array.isArray(concepts)) {
3698
+ concepts = [concepts];
3699
+ }
3700
+ const notations = concepts.map((concept) => {
3701
+ if (concept?.notation?.[0]) {
3702
+ return concept?.notation?.[0];
3703
+ }
3704
+ return gnd.notationFromUri(fixURI(concept?.uri));
3705
+ }).filter(Boolean);
3706
+ const errors = [];
3707
+ const results = await Promise.all(notations.map(async (notation) => {
3708
+ try {
3709
+ const result = await import_axios3.default.get(`${this._api.api}${notation}.json`);
3710
+ return toJSKOS(result.data);
3711
+ } catch (error) {
3712
+ errors.push(error);
3713
+ }
3714
+ }));
3715
+ if (errors.length === concepts.length) {
3716
+ throw errors[0];
3717
+ }
3718
+ return results.filter(Boolean);
3719
+ }
3720
+ async getNarrower({ concept, limit = 200, offset = 0 }) {
3721
+ if (!concept || !concept.uri) {
3722
+ throw new InvalidOrMissingParameterError({ parameter: "concept" });
3723
+ }
3724
+ const uri = fixURI(concept.uri);
3725
+ const q = broaderProps.map((prop) => `${prop}.id:"${uri}"`).join(" OR ");
3726
+ const result = await import_axios3.default.get(`${this._api.api}search`, {
3727
+ params: {
3728
+ q,
3729
+ format: "json",
3730
+ size: limit,
3731
+ from: offset
3732
+ }
3733
+ });
3734
+ return result.data.member.map((member) => toJSKOS(member));
3735
+ }
3736
+ async suggest(config) {
3737
+ const results = await this._search({ ...config, format: "json:suggest" });
3738
+ return [
3739
+ config.search,
3740
+ results.map((r) => r.label),
3741
+ [],
3742
+ results.map((r) => r.id)
3743
+ ];
3744
+ }
3745
+ async search(config) {
3746
+ const results = await this._search(config);
3747
+ return results.member.map((member) => toJSKOS(member));
3748
+ }
3749
+ async _search({ search, types, limit = 100, offset = 0, format = "json" }) {
3750
+ if (!search) {
3751
+ throw new InvalidOrMissingParameterError({ parameter: "search" });
3752
+ }
3753
+ let filter = "";
3754
+ types = types?.map((type) => gndTypeScheme.notationFromUri(fixURI(type))).filter(Boolean) || [];
3755
+ if (types.length) {
3756
+ filter = types.map((type) => `type:${type}`).join(" OR ");
3757
+ }
3758
+ const results = await import_axios3.default.get(`${this._api.api}search`, { params: {
3759
+ q: search,
3760
+ filter,
3761
+ format,
3762
+ size: limit,
3763
+ from: offset
3764
+ } });
3765
+ return results.data;
3766
+ }
3767
+ async getTypes({ scheme }) {
3768
+ if (!scheme || !import_jskos_tools11.default.compare(scheme, gndJson)) {
3769
+ throw new InvalidOrMissingParameterError({ parameter: "search", message: scheme?.uri ? `scheme ${scheme?.uri} not supported` : "" });
3770
+ }
3771
+ return gndJson.types;
3772
+ }
3773
+ };
3774
+ LobidApiProvider.providerName = "LobidApi";
3775
+
3776
+ // src/providers/mycore-provider.js
3777
+ var import_jskos_tools12 = __toESM(require("jskos-tools"), 1);
2873
3778
  var import_flexsearch2 = __toESM(require("flexsearch"), 1);
2874
3779
  var data2 = {};
2875
3780
  var MyCoReProvider = class extends BaseProvider {
@@ -2889,6 +3794,14 @@ var MyCoReProvider = class extends BaseProvider {
2889
3794
  _setup() {
2890
3795
  this._scheme = null;
2891
3796
  }
3797
+ /**
3798
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3799
+ *
3800
+ * @param {Object} options
3801
+ * @param {Object} options.url API URL for BARTOC instance
3802
+ * @param {Object} options.scheme scheme for which the config is requested
3803
+ * @returns {Object} provider configuration
3804
+ */
2892
3805
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2893
3806
  if (!url || !scheme) {
2894
3807
  return null;
@@ -2897,6 +3810,9 @@ var MyCoReProvider = class extends BaseProvider {
2897
3810
  api: url
2898
3811
  };
2899
3812
  }
3813
+ /**
3814
+ * Converts scheme info (full scheme data that comes from the API) to a JSKOS scheme
3815
+ */
2900
3816
  _schemeInfoToJSKOS(schemeInfo) {
2901
3817
  const uri = schemeInfo.labels.find((l) => l.lang === "x-uri").text;
2902
3818
  const prefLabel = {};
@@ -2915,6 +3831,13 @@ var MyCoReProvider = class extends BaseProvider {
2915
3831
  }
2916
3832
  return scheme;
2917
3833
  }
3834
+ /**
3835
+ * Converts a category to a JSKOS concept.
3836
+ * - Also saves that concept in data
3837
+ * - Also adds the concept's prefLabels to the search index
3838
+ *
3839
+ * ? Question: Should scopeNotes be part of the search index?
3840
+ */
2918
3841
  _categoryToJSKOS(category, { scheme, broader = [] }) {
2919
3842
  if (!category || !scheme) {
2920
3843
  return null;
@@ -2947,11 +3870,17 @@ var MyCoReProvider = class extends BaseProvider {
2947
3870
  };
2948
3871
  return data2[scheme.uri].concepts[uri];
2949
3872
  }
3873
+ /**
3874
+ * Helper function that replaces `narrower` key with [null] if it has values. Use this before returning concepts.
3875
+ */
2950
3876
  _removeNarrower(concept) {
2951
3877
  if (!concept)
2952
3878
  return concept;
2953
3879
  return Object.assign({}, concept, { narrower: concept.narrower && concept.narrower.length ? [null] : [] });
2954
3880
  }
3881
+ /**
3882
+ * Loads the data from the API. Only called from getSchemes and only called once.
3883
+ */
2955
3884
  async _loadSchemeData(config) {
2956
3885
  const schemeInfo = await this.axios({
2957
3886
  ...config,
@@ -2994,7 +3923,7 @@ var MyCoReProvider = class extends BaseProvider {
2994
3923
  if (!this._scheme) {
2995
3924
  await this.getSchemes(config);
2996
3925
  }
2997
- if (!import_jskos_tools11.default.compare(scheme, this._scheme)) {
3926
+ if (!import_jskos_tools12.default.compare(scheme, this._scheme)) {
2998
3927
  throw new InvalidOrMissingParameterError({ parameter: "scheme", message: "Requested vocabulary seems to be unsupported by this API." });
2999
3928
  }
3000
3929
  return data2[this._scheme.uri].topConcepts.map(this._removeNarrower);
@@ -3038,6 +3967,15 @@ var MyCoReProvider = class extends BaseProvider {
3038
3967
  concept = data2[this._scheme.uri].concepts[concept.uri];
3039
3968
  return (concept && concept.narrower || []).map((c) => data2[this._scheme.uri].concepts[c.uri]).map(this._removeNarrower);
3040
3969
  }
3970
+ /**
3971
+ * Returns concept search results.
3972
+ *
3973
+ * @param {Object} config
3974
+ * @param {string} config.search search string
3975
+ * @param {Object} [config.scheme] concept scheme to search in
3976
+ * @param {number} [config.limit=100] maximum number of search results
3977
+ * @returns {Array} array of JSKOS concept objects
3978
+ */
3041
3979
  async search({ search, scheme, limit = 100 }) {
3042
3980
  if (!scheme || !scheme.uri) {
3043
3981
  throw new InvalidOrMissingParameterError({ parameter: "scheme" });
@@ -3051,19 +3989,28 @@ var MyCoReProvider = class extends BaseProvider {
3051
3989
  if (!this._scheme) {
3052
3990
  await this.getSchemes();
3053
3991
  }
3054
- if (!import_jskos_tools11.default.compare(scheme, this._scheme)) {
3992
+ if (!import_jskos_tools12.default.compare(scheme, this._scheme)) {
3055
3993
  throw new InvalidOrMissingParameterError({ parameter: "scheme", message: "Requested vocabulary seems to be unsupported by this API." });
3056
3994
  }
3057
3995
  const result = await data2[this._scheme.uri].searchIndex.search(search);
3058
3996
  return result.map((uri) => data2[this._scheme.uri].concepts[uri]).map(this._removeNarrower).slice(0, limit);
3059
3997
  }
3998
+ /**
3999
+ * Returns suggestion result in OpenSearch Suggest Format.
4000
+ *
4001
+ * @param {Object} config
4002
+ * @param {string} config.search search string
4003
+ * @param {Object} [config.scheme] concept scheme to search in
4004
+ * @param {number} [config.limit=100] maximum number of search results
4005
+ * @returns {Array} result in OpenSearch Suggest Format
4006
+ */
3060
4007
  async suggest(config) {
3061
4008
  config._raw = true;
3062
4009
  const concepts = await this.search(config);
3063
4010
  const result = [config.search, [], [], []];
3064
4011
  for (let concept of concepts) {
3065
- const notation = import_jskos_tools11.default.notation(concept);
3066
- const label = import_jskos_tools11.default.prefLabel(concept);
4012
+ const notation = import_jskos_tools12.default.notation(concept);
4013
+ const label = import_jskos_tools12.default.prefLabel(concept);
3067
4014
  result[1].push((notation ? notation + " " : "") + label);
3068
4015
  result[2].push("");
3069
4016
  result[3].push(concept.uri);
@@ -3100,16 +4047,37 @@ providers.addProvider(ConceptApiProvider);
3100
4047
  providers.addProvider(MappingsApiProvider);
3101
4048
  var registryCache = {};
3102
4049
  var CocodaSDK = class {
4050
+ /**
4051
+ * CDK constructor.
4052
+ *
4053
+ * @param {Object} [config={}] Cocoda-stye config object
4054
+ */
3103
4055
  constructor(config) {
3104
4056
  this.config = config;
3105
- this.axios = import_axios3.default.create();
4057
+ this.axios = import_axios4.default.create();
3106
4058
  }
4059
+ /**
4060
+ * Method to set the configuration.
4061
+ *
4062
+ * @param {Object} config Cocoda-stye config object
4063
+ */
3107
4064
  setConfig(config) {
3108
4065
  this.config = config;
3109
4066
  }
4067
+ /**
4068
+ * Current configuration.
4069
+ *
4070
+ * @returns {Object} current configuration
4071
+ */
3110
4072
  get config() {
3111
4073
  return this._config;
3112
4074
  }
4075
+ /**
4076
+ * Prepares config when set.
4077
+ *
4078
+ * @param {Object} config Cocoda config object
4079
+ * @private
4080
+ */
3113
4081
  set config(config) {
3114
4082
  config = config || {};
3115
4083
  config.registries = config.registries || [];
@@ -3119,16 +4087,44 @@ var CocodaSDK = class {
3119
4087
  });
3120
4088
  this._config = config;
3121
4089
  }
4090
+ /**
4091
+ * Map of registered providers.
4092
+ *
4093
+ * @returns {Object} map of registered providers (name -> provider)
4094
+ */
3122
4095
  get providers() {
3123
4096
  return providers;
3124
4097
  }
4098
+ /**
4099
+ * Creates a new CDK instance (same as `new CocodaSDK(config)`).
4100
+ *
4101
+ * @param {Object} config Cocoda config object
4102
+ * @returns {CocodaSDK} new CDK instance
4103
+ */
3125
4104
  createInstance(config) {
3126
4105
  return new CocodaSDK(config);
3127
4106
  }
4107
+ /**
4108
+ * Offer method to load a config file from URL.
4109
+ *
4110
+ * @param {string} url URL of config as JSON
4111
+ */
3128
4112
  async loadConfig(url) {
3129
4113
  const response = await this.axios.get(url);
3130
4114
  this.config = response.data;
3131
4115
  }
4116
+ /**
4117
+ * Method to load buildInfo.
4118
+ *
4119
+ * Callback will only be called if buildInfo changes; it will not be called when there is no previous value.
4120
+ *
4121
+ * @param {Object} config
4122
+ * @param {string} [config.url] full URL for build-info.json (default is taken from config.cocodaBaseUrl)
4123
+ * @param {Object} [config.buildInfo] current buildInfo
4124
+ * @param {number} [config.interval=60000] interval to load buildInfo in ms
4125
+ * @param {Function} config.callback callback function called with two parameters (error, buildInfo, previousBuildInfo)
4126
+ * @returns {Object} object with two function properties, `stop` to cancel the repeating request, `start` to restart the repeating request, as well as three convenience properties, `isPaused` (whether it is currently paused), `lastResult`, `hasErrored` (whether the last call of the function has errored)
4127
+ */
3132
4128
  loadBuildInfo({ url, buildInfo = null, interval = 6e4, callback, ...config }) {
3133
4129
  if (!url && !this.config.cocodaBaseUrl) {
3134
4130
  throw new CDKError({ message: "Could not determine URL to load build config." });
@@ -3155,20 +4151,64 @@ var CocodaSDK = class {
3155
4151
  }
3156
4152
  });
3157
4153
  }
4154
+ /**
4155
+ * Method to get a registry by URI.
4156
+ *
4157
+ * @param {string} uri URI of registry in config
4158
+ * @returns {?Object} initialized registry from config if found
4159
+ */
3158
4160
  getRegistryForUri(uri) {
3159
4161
  return this.config.registries.find((r) => r.uri == uri);
3160
4162
  }
4163
+ /**
4164
+ * Method to initialize registry.
4165
+ *
4166
+ * @param {Object} registry JSKOS registry object
4167
+ * @returns {Object} initialized registry
4168
+ */
3161
4169
  initializeRegistry(registry) {
3162
4170
  registry = providers.init(registry);
3163
4171
  registry.cdk = this;
3164
4172
  return registry;
3165
4173
  }
4174
+ /**
4175
+ * Method to add custom provider.
4176
+ *
4177
+ * @param {Object} provider provider class that extends BaseProvider
4178
+ */
3166
4179
  addProvider(provider) {
3167
4180
  providers.addProvider(provider);
3168
4181
  }
4182
+ /**
4183
+ * Static method to add custom provider.
4184
+ *
4185
+ * @param {Object} provider provider class that extends BaseProvider
4186
+ */
3169
4187
  static addProvider(provider) {
3170
4188
  providers.addProvider(provider);
3171
4189
  }
4190
+ /**
4191
+ * Repeatedly call a certain function.
4192
+ *
4193
+ * Notes:
4194
+ * - Callback will only be called if the results were changed.
4195
+ * - The function will only be repeated after the previous call is resolved. This means that the total interval duration is (interval + duration of function call).
4196
+ *
4197
+ * Example:
4198
+ * ```js
4199
+ * cdk.repeat({
4200
+ * function: () => registry.getMappings(),
4201
+ * callback: (error, result) => console.log(result),
4202
+ * })
4203
+ * ```
4204
+ *
4205
+ * @param {Object} config
4206
+ * @param {string} config.function a function to be called (can be async)
4207
+ * @param {number} [config.interval=15000] interval in ms
4208
+ * @param {Function} config.callback callback function called with two parameters (error, result, previousResult)
4209
+ * @param {boolean} [config.callImmediately=true] whether to call the function immediately
4210
+ * @returns {Object} object with two function properties, `stop` to cancel the repeating request, `start` to restart the repeating request, as well as three convenience properties, `isPaused` (whether it is currently paused), `lastResult`, `hasErrored` (whether the last call of the function has errored)
4211
+ */
3172
4212
  repeat({ function: func, interval = 15e3, callback, callImmediately = true } = {}) {
3173
4213
  if (!func) {
3174
4214
  throw new InvalidOrMissingParameterError({ parameter: "function" });
@@ -3255,6 +4295,12 @@ var CocodaSDK = class {
3255
4295
  }
3256
4296
  };
3257
4297
  }
4298
+ /**
4299
+ * Gets schemes from all registries that support schemes and merges the results.
4300
+ *
4301
+ * @param {Object} [config={}] configuration object that will be used as a parameter for internal `getSchemes` calls
4302
+ * @returns {Object[]} array of JSKOS schemes
4303
+ */
3258
4304
  async getSchemes(config = {}) {
3259
4305
  let schemes = [], promises = [];
3260
4306
  for (let registry of this.config.registries) {
@@ -3264,7 +4310,7 @@ var CocodaSDK = class {
3264
4310
  scheme._registry = registry;
3265
4311
  scheme.__DETAILSLOADED__ = 1;
3266
4312
  scheme.type = scheme.type || ["http://www.w3.org/2004/02/skos/core#ConceptScheme"];
3267
- let otherScheme = schemes.find((s) => import_jskos_tools12.default.compare(s, scheme)), prio, otherPrio, override = false;
4313
+ let otherScheme = schemes.find((s) => import_jskos_tools13.default.compare(s, scheme)), prio, otherPrio, override = false;
3268
4314
  if (otherScheme) {
3269
4315
  prio = this.config.registries.indexOf(registry);
3270
4316
  if (prio != -1) {
@@ -3286,19 +4332,19 @@ var CocodaSDK = class {
3286
4332
  }
3287
4333
  if (!otherScheme || override) {
3288
4334
  if (override) {
3289
- let otherSchemeIndex = schemes.findIndex((s) => import_jskos_tools12.default.compare(s, otherScheme));
4335
+ let otherSchemeIndex = schemes.findIndex((s) => import_jskos_tools13.default.compare(s, otherScheme));
3290
4336
  if (otherSchemeIndex != -1) {
3291
4337
  schemes.splice(otherSchemeIndex, 1);
3292
4338
  }
3293
- scheme = import_jskos_tools12.default.merge(scheme, import_omit.default(otherScheme, ["concepts", "topConcepts"]), { mergeUris: true, skipPaths: ["_registry"] });
4339
+ scheme = import_jskos_tools13.default.merge(scheme, import_omit.default(otherScheme, ["concepts", "topConcepts"]), { mergeUris: true, skipPaths: ["_registry"] });
3294
4340
  }
3295
4341
  scheme._registry = registry;
3296
4342
  schemes.push(scheme);
3297
4343
  } else {
3298
- const index = schemes.findIndex((s) => import_jskos_tools12.default.compare(s, scheme));
4344
+ const index = schemes.findIndex((s) => import_jskos_tools13.default.compare(s, scheme));
3299
4345
  if (index != -1) {
3300
4346
  const otherSchemeRegistry = schemes[index]._registry;
3301
- schemes[index] = import_jskos_tools12.default.merge(schemes[index], import_omit.default(scheme, ["concepts", "topConcepts"]), { mergeUris: true, skipPaths: ["_registry"] });
4347
+ schemes[index] = import_jskos_tools13.default.merge(schemes[index], import_omit.default(scheme, ["concepts", "topConcepts"]), { mergeUris: true, skipPaths: ["_registry"] });
3302
4348
  schemes[index]._registry = otherSchemeRegistry;
3303
4349
  }
3304
4350
  }
@@ -3320,7 +4366,7 @@ var CocodaSDK = class {
3320
4366
  scheme._registry = newRegistry;
3321
4367
  }
3322
4368
  });
3323
- return import_jskos_tools12.default.sortSchemes(schemes.filter(Boolean));
4369
+ return import_jskos_tools13.default.sortSchemes(schemes.filter(Boolean));
3324
4370
  }
3325
4371
  registryForScheme(scheme) {
3326
4372
  let registry = scheme._registry;
@@ -3331,30 +4377,34 @@ var CocodaSDK = class {
3331
4377
  const url = config.url;
3332
4378
  if (registryCache[url]) {
3333
4379
  const registry2 = registryCache[url];
3334
- if (Array.isArray(registry2._jskos.schemes) && !import_jskos_tools12.default.isContainedIn(scheme, registry2._jskos.schemes)) {
4380
+ if (Array.isArray(registry2._jskos.schemes) && !import_jskos_tools13.default.isContainedIn(scheme, registry2._jskos.schemes)) {
3335
4381
  registry2._jskos.schemes.push(scheme);
3336
4382
  }
3337
4383
  return registry2;
3338
4384
  } else {
3339
- const provider = Object.values(providers).find((p) => p.providerType === type);
3340
- if (!provider || !provider._registryConfigForBartocApiConfig) {
3341
- continue;
3342
- }
3343
- const providerName = provider.providerName;
3344
4385
  config.scheme = scheme;
3345
- config = providers[providerName]._registryConfigForBartocApiConfig(config);
3346
- if (!config) {
3347
- continue;
3348
- }
3349
- config.provider = providerName;
3350
- try {
3351
- registry = this.initializeRegistry(config);
3352
- if (registry) {
3353
- registryCache[url] = registry;
3354
- return registry;
4386
+ for (const provider of Object.values(providers)) {
4387
+ if (provider.providerType && provider.providerType !== type) {
4388
+ continue;
4389
+ }
4390
+ if (!provider._registryConfigForBartocApiConfig) {
4391
+ continue;
4392
+ }
4393
+ const providerName = provider.providerName;
4394
+ const registryConfig = providers[providerName]._registryConfigForBartocApiConfig(config);
4395
+ if (!registryConfig) {
4396
+ continue;
4397
+ }
4398
+ registryConfig.provider = providerName;
4399
+ try {
4400
+ registry = this.initializeRegistry(registryConfig);
4401
+ if (registry) {
4402
+ registryCache[url] = registry;
4403
+ return registry;
4404
+ }
4405
+ } catch (error) {
4406
+ continue;
3355
4407
  }
3356
- } catch (error) {
3357
- continue;
3358
4408
  }
3359
4409
  }
3360
4410
  }
@@ -3373,6 +4423,7 @@ function addAllProviders(_cdk) {
3373
4423
  CocodaSDK,
3374
4424
  ConceptApiProvider,
3375
4425
  LabelSearchSuggestionProvider,
4426
+ LobidApiProvider,
3376
4427
  LocApiProvider,
3377
4428
  LocalMappingsProvider,
3378
4429
  MappingsApiProvider,