cocoda-sdk 3.3.2 → 3.3.4

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
  ));
@@ -58,6 +62,14 @@ __export(errors_exports, {
58
62
  NetworkError: () => NetworkError
59
63
  });
60
64
  var CDKError = class extends Error {
65
+ /**
66
+ * CDKError constructor.
67
+ *
68
+ * @param {Object} options
69
+ * @param {string} [options.message=""] message for the error
70
+ * @param {Error} [options.relatedError=null] related error
71
+ * @param {number} [options.code] HTTP status code for the error
72
+ */
61
73
  constructor({ message = "", relatedError = null, code = null } = {}) {
62
74
  if (!message && relatedError && relatedError.message) {
63
75
  message = relatedError.message;
@@ -69,12 +81,26 @@ var CDKError = class extends Error {
69
81
  }
70
82
  };
71
83
  var MethodNotImplementedError = class extends CDKError {
84
+ /**
85
+ * MethodNotImplementedError constructor.
86
+ *
87
+ * @param {Object} config
88
+ * @param {string} config.method method that this error refers to
89
+ * @param {string} [config.message=""] message for the error
90
+ */
72
91
  constructor({ method, message = "", ...options }) {
73
92
  options.message = `Method not implemented: ${method} (${message})`;
74
93
  super(options);
75
94
  }
76
95
  };
77
96
  var InvalidOrMissingParameterError = class extends CDKError {
97
+ /**
98
+ * InvalidOrMissingParameterError constructor.
99
+ *
100
+ * @param {Object} config
101
+ * @param {string} config.parameter parameter that this error refers to
102
+ * @param {string} [config.message=""] message for the error
103
+ */
78
104
  constructor({ parameter, message = "", ...options }) {
79
105
  options.message = `Invalid or missing parameter: ${parameter} (${message})`;
80
106
  super(options);
@@ -145,6 +171,7 @@ __export(utils_exports, {
145
171
  withCustomProps: () => withCustomProps
146
172
  });
147
173
  var requestMethods = [
174
+ // General
148
175
  {
149
176
  method: "getRegistries",
150
177
  fallback: [],
@@ -183,6 +210,7 @@ var requestMethods = [
183
210
  fallback: [],
184
211
  type: "Occurrences"
185
212
  },
213
+ // Concepts
186
214
  {
187
215
  method: "getTop",
188
216
  fallback: [],
@@ -208,6 +236,7 @@ var requestMethods = [
208
236
  fallback: [],
209
237
  type: "Concepts"
210
238
  },
239
+ // Mappings
211
240
  {
212
241
  method: "getMapping",
213
242
  fallback: null,
@@ -246,6 +275,11 @@ var requestMethods = [
246
275
  method: "deleteMappings",
247
276
  fallback: []
248
277
  },
278
+ // Annotations
279
+ // {
280
+ // method: "getAnnotation",
281
+ // fallback: "",
282
+ // },
249
283
  {
250
284
  method: "getAnnotations",
251
285
  fallback: [],
@@ -308,9 +342,15 @@ var listOfCapabilities = [
308
342
 
309
343
  // src/providers/base-provider.js
310
344
  var BaseProvider = class {
345
+ /**
346
+ * Provider constructor.
347
+ *
348
+ * @param {Object} registry the registry for this provider
349
+ */
311
350
  constructor(registry = {}) {
312
351
  this._jskos = registry;
313
352
  this.axios = import_axios.default.create({
353
+ // TODO: Decide on timeout value
314
354
  timeout: 2e4
315
355
  });
316
356
  this._path = typeof window !== "undefined" && window.location.pathname;
@@ -324,6 +364,7 @@ var BaseProvider = class {
324
364
  this._repeating = [];
325
365
  this._api = {
326
366
  status: registry.status,
367
+ // If `schemes` on registry is an array, remove it because we're only keeping it in this._jskos.schemes
327
368
  schemes: Array.isArray(registry.schemes) ? void 0 : registry.schemes,
328
369
  top: registry.top,
329
370
  data: registry.data,
@@ -469,6 +510,7 @@ var BaseProvider = class {
469
510
  };
470
511
  }
471
512
  }
513
+ // Expose some properties from original registry object as getters
472
514
  get uri() {
473
515
  return this._jskos.uri;
474
516
  }
@@ -490,6 +532,11 @@ var BaseProvider = class {
490
532
  get stored() {
491
533
  return this._jskos.stored !== void 0 ? this._jskos.stored : this.constructor.stored;
492
534
  }
535
+ /**
536
+ * Load data about registry via the status endpoint.
537
+ *
538
+ * @returns {Promise} Promise that resolves when initialization is complete.
539
+ */
493
540
  async init() {
494
541
  if (this._init) {
495
542
  return this._init;
@@ -523,17 +570,48 @@ var BaseProvider = class {
523
570
  })();
524
571
  return this._init;
525
572
  }
573
+ /**
574
+ * Preparation to be executed before init. Should be overwritten by subclasses.
575
+ *
576
+ * @private
577
+ */
526
578
  _prepare() {
527
579
  }
580
+ /**
581
+ * Setup to be executed after init. Should be overwritten by subclasses.
582
+ *
583
+ * @private
584
+ */
528
585
  _setup() {
529
586
  }
587
+ /**
588
+ * Returns a source for a axios cancel token.
589
+ *
590
+ * @returns {Object} axios cancel token source
591
+ */
530
592
  getCancelTokenSource() {
531
593
  return import_axios.default.CancelToken.source();
532
594
  }
595
+ /**
596
+ * Sets authentication credentials.
597
+ *
598
+ * @param {Object} options
599
+ * @param {string} options.key public key of login-server instance the user is authorized for
600
+ * @param {string} options.bearerToken token that is sent with each request
601
+ */
533
602
  setAuth({ key = this._auth.key, bearerToken = this._auth.bearerToken }) {
534
603
  this._auth.key = key;
535
604
  this._auth.bearerToken = bearerToken;
536
605
  }
606
+ /**
607
+ * Sets retry configuration.
608
+ *
609
+ * @param {Object} config
610
+ * @param {string[]} [config.methods=["get", "head", "options"]] HTTP methods to retry (lowercase)
611
+ * @param {number[]} [config.statusCodes=[401, 403]] status codes to retry
612
+ * @param {number} [config.count=3] maximum number of retries
613
+ * @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
614
+ */
537
615
  setRetryConfig(config = {}) {
538
616
  this._retryConfig = Object.assign({
539
617
  methods: ["get", "head", "options"],
@@ -544,6 +622,16 @@ var BaseProvider = class {
544
622
  }
545
623
  }, config);
546
624
  }
625
+ /**
626
+ * Returns whether a user is authorized for a certain request.
627
+ *
628
+ * @param {Object} options
629
+ * @param {string} options.type type of item (e.g. mappings)
630
+ * @param {string} options.action action to be performed (read/create/update/delete)
631
+ * @param {Object} options.user user object
632
+ * @param {boolean} [options.crossUser] whether the request is a crossUser request (i.e. updading/deleting another user's item)
633
+ * @returns {boolean}
634
+ */
547
635
  isAuthorizedFor({ type, action, user, crossUser }) {
548
636
  if (action == "read" && this.has[type] === true) {
549
637
  return true;
@@ -578,6 +666,12 @@ var BaseProvider = class {
578
666
  }
579
667
  return !!this.has[type][action];
580
668
  }
669
+ /**
670
+ * Returns a boolean whether a certain target scheme is supported or not.
671
+ *
672
+ * @param {Object} scheme
673
+ * @returns {boolean}
674
+ */
581
675
  supportsScheme(scheme) {
582
676
  if (!scheme) {
583
677
  return false;
@@ -671,6 +765,13 @@ var BaseProvider = class {
671
765
  adjustMappings(mappings) {
672
766
  return withCustomProps(mappings.map((mapping) => this.adjustMapping(mapping)), mappings);
673
767
  }
768
+ /**
769
+ * POSTs multiple mappings. Do not override in subclass!
770
+ *
771
+ * @param {Object} config
772
+ * @param {Array} config.mappings array of mapping objects
773
+ * @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
774
+ */
674
775
  async postMappings({ mappings, ...config } = {}) {
675
776
  if (!mappings || !mappings.length) {
676
777
  throw new InvalidOrMissingParameterError({ parameter: "mappings" });
@@ -682,6 +783,13 @@ var BaseProvider = class {
682
783
  config
683
784
  });
684
785
  }
786
+ /**
787
+ * DELETEs multiple mappings. Do not override in subclass!
788
+ *
789
+ * @param {Object} config
790
+ * @param {Array} config.mappings array of mapping objects
791
+ * @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
792
+ */
685
793
  async deleteMappings({ mappings, ...config } = {}) {
686
794
  if (!mappings || !mappings.length) {
687
795
  throw new InvalidOrMissingParameterError({ parameter: "mappings" });
@@ -693,6 +801,20 @@ var BaseProvider = class {
693
801
  config
694
802
  });
695
803
  }
804
+ /**
805
+ * Calls a method that is for only one item for an array of items. Returns an array of results.
806
+ *
807
+ * 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.
808
+ *
809
+ * @param {Object} options
810
+ * @param {string} options.method instance method to call (e.g. `postMapping`)
811
+ * @param {Object[]} options.items items to call the method for
812
+ * @param {string} options.itemProperty the property name for the item when calling the method (e.g. `mapping`)
813
+ * @param {Object} options.config other properties to pass to the method call
814
+ * @returns {any[]} result array with values returned from individual method calls
815
+ *
816
+ * @private
817
+ */
696
818
  async _callHelperForArrayWrappers({ method, items, itemProperty, config }) {
697
819
  const errors = [];
698
820
  const resultItems = await Promise.all(items.map(async (item) => {
@@ -716,6 +838,9 @@ var import_localforage = __toESM(require("localforage"), 1);
716
838
  var import_uuid = require("uuid");
717
839
  var uriPrefix = "urn:uuid:";
718
840
  var LocalMappingsProvider = class extends BaseProvider {
841
+ /**
842
+ * @private
843
+ */
719
844
  _prepare() {
720
845
  this.has.mappings = {
721
846
  read: true,
@@ -727,6 +852,9 @@ var LocalMappingsProvider = class extends BaseProvider {
727
852
  this.has[c] = false;
728
853
  });
729
854
  }
855
+ /**
856
+ * @private
857
+ */
730
858
  _setup() {
731
859
  this.queue = [];
732
860
  this.localStorageKey = "cocoda-mappings--" + this._path;
@@ -768,6 +896,14 @@ var LocalMappingsProvider = class extends BaseProvider {
768
896
  }
769
897
  return false;
770
898
  }
899
+ /**
900
+ * 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.
901
+ * This prevents conflicts when saveMapping is called multiple times simultaneously.
902
+ *
903
+ * TODO: There might be a better solution for this...
904
+ *
905
+ * @private
906
+ */
771
907
  _getMappingsQueue() {
772
908
  let last2 = import_last.default(this.queue) || Promise.resolve();
773
909
  return new Promise((resolve) => {
@@ -793,6 +929,13 @@ var LocalMappingsProvider = class extends BaseProvider {
793
929
  });
794
930
  });
795
931
  }
932
+ /**
933
+ * Returns a single mapping.
934
+ *
935
+ * @param {Object} config
936
+ * @param {Object} config.mapping JSKOS mapping
937
+ * @returns {Object} JSKOS mapping object
938
+ */
796
939
  async getMapping({ mapping, ...config }) {
797
940
  config._raw = true;
798
941
  if (!mapping || !mapping.uri) {
@@ -800,6 +943,14 @@ var LocalMappingsProvider = class extends BaseProvider {
800
943
  }
801
944
  return (await this.getMappings({ ...config, uri: mapping.uri }))[0];
802
945
  }
946
+ /**
947
+ * Returns a list of local mappings.
948
+ *
949
+ * TODO: Add support for sort (`created` or `modified`) and order (`asc` or `desc`).
950
+ * TODO: Clean up and use async/await
951
+ *
952
+ * @returns {Object[]} array of JSKOS mapping objects
953
+ */
803
954
  async getMappings({ from, fromScheme, to, toScheme, creator, type, partOf, offset, limit, direction, mode, identifier, uri } = {}) {
804
955
  let params = {};
805
956
  if (from) {
@@ -945,6 +1096,13 @@ var LocalMappingsProvider = class extends BaseProvider {
945
1096
  return mappings;
946
1097
  });
947
1098
  }
1099
+ /**
1100
+ * Creates a mapping.
1101
+ *
1102
+ * @param {Object} config
1103
+ * @param {Object} config.mapping JSKOS mapping
1104
+ * @returns {Object} JSKOS mapping object
1105
+ */
948
1106
  async postMapping({ mapping }) {
949
1107
  if (!mapping) {
950
1108
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -980,6 +1138,13 @@ var LocalMappingsProvider = class extends BaseProvider {
980
1138
  throw error;
981
1139
  }
982
1140
  }
1141
+ /**
1142
+ * Overwrites a mapping.
1143
+ *
1144
+ * @param {Object} config
1145
+ * @param {Object} config.mapping JSKOS mapping
1146
+ * @returns {Object} JSKOS mapping object
1147
+ */
983
1148
  async putMapping({ mapping }) {
984
1149
  if (!mapping) {
985
1150
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1005,6 +1170,13 @@ var LocalMappingsProvider = class extends BaseProvider {
1005
1170
  throw error;
1006
1171
  }
1007
1172
  }
1173
+ /**
1174
+ * Patches a mapping.
1175
+ *
1176
+ * @param {Object} config
1177
+ * @param {Object} mapping JSKOS mapping (or part of mapping)
1178
+ * @returns {Object} JSKOS mapping object
1179
+ */
1008
1180
  async patchMapping({ mapping }) {
1009
1181
  if (!mapping) {
1010
1182
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1030,6 +1202,13 @@ var LocalMappingsProvider = class extends BaseProvider {
1030
1202
  throw error;
1031
1203
  }
1032
1204
  }
1205
+ /**
1206
+ * Removes a mapping from local storage.
1207
+ *
1208
+ * @param {Object} config
1209
+ * @param {Object} mapping JSKOS mapping
1210
+ * @returns {boolean} boolean whether deleting the mapping was successful
1211
+ */
1033
1212
  async deleteMapping({ mapping }) {
1034
1213
  if (!mapping) {
1035
1214
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1053,6 +1232,9 @@ LocalMappingsProvider.stored = true;
1053
1232
  // src/providers/mappings-api-provider.js
1054
1233
  var import_jskos_tools3 = __toESM(require("jskos-tools"), 1);
1055
1234
  var MappingsApiProvider = class extends BaseProvider {
1235
+ /**
1236
+ * @private
1237
+ */
1056
1238
  _prepare() {
1057
1239
  if (this._api.api && this._api.status === void 0) {
1058
1240
  this._api.status = concatUrl(this._api.api, "/status");
@@ -1064,6 +1246,9 @@ var MappingsApiProvider = class extends BaseProvider {
1064
1246
  this.has[c] = false;
1065
1247
  });
1066
1248
  }
1249
+ /**
1250
+ * @private
1251
+ */
1067
1252
  _setup() {
1068
1253
  if (this._api.api) {
1069
1254
  const endpoints = {
@@ -1104,6 +1289,13 @@ var MappingsApiProvider = class extends BaseProvider {
1104
1289
  properties: "annotations"
1105
1290
  };
1106
1291
  }
1292
+ /**
1293
+ * Returns a single mapping.
1294
+ *
1295
+ * @param {Object} config
1296
+ * @param {Object} config.mapping JSKOS mapping
1297
+ * @returns {Object} JSKOS mapping object
1298
+ */
1107
1299
  async getMapping({ mapping, ...config }) {
1108
1300
  if (!mapping) {
1109
1301
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1127,6 +1319,12 @@ var MappingsApiProvider = class extends BaseProvider {
1127
1319
  throw error;
1128
1320
  }
1129
1321
  }
1322
+ /**
1323
+ * Returns a list of mappings.
1324
+ *
1325
+ * @param {Object} config request config with parameters
1326
+ * @returns {Object[]} array of JSKOS mapping objects
1327
+ */
1130
1328
  async getMappings({ from, fromScheme, to, toScheme, creator, type, partOf, offset, limit, direction, mode, identifier, cardinality, annotatedBy, annotatedFor, annotatedWith, sort, order, ...config }) {
1131
1329
  let params = {}, url = this._api.mappings;
1132
1330
  if (from) {
@@ -1194,6 +1392,13 @@ var MappingsApiProvider = class extends BaseProvider {
1194
1392
  }
1195
1393
  });
1196
1394
  }
1395
+ /**
1396
+ * Creates a mapping.
1397
+ *
1398
+ * @param {Object} config
1399
+ * @param {Object} config.mapping JSKOS mapping
1400
+ * @returns {Object} JSKOS mapping object
1401
+ */
1197
1402
  async postMapping({ mapping, ...config }) {
1198
1403
  if (!mapping) {
1199
1404
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1211,6 +1416,13 @@ var MappingsApiProvider = class extends BaseProvider {
1211
1416
  }
1212
1417
  });
1213
1418
  }
1419
+ /**
1420
+ * Overwrites a mapping.
1421
+ *
1422
+ * @param {Object} config
1423
+ * @param {Object} config.mapping JSKOS mapping
1424
+ * @returns {Object} JSKOS mapping object
1425
+ */
1214
1426
  async putMapping({ mapping, ...config }) {
1215
1427
  if (!mapping) {
1216
1428
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1232,6 +1444,13 @@ var MappingsApiProvider = class extends BaseProvider {
1232
1444
  }
1233
1445
  });
1234
1446
  }
1447
+ /**
1448
+ * Patches a mapping.
1449
+ *
1450
+ * @param {Object} config
1451
+ * @param {Object} config.mapping JSKOS mapping (or part of mapping)
1452
+ * @returns {Object} JSKOS mapping object
1453
+ */
1235
1454
  async patchMapping({ mapping, ...config }) {
1236
1455
  if (!mapping) {
1237
1456
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1251,6 +1470,13 @@ var MappingsApiProvider = class extends BaseProvider {
1251
1470
  }
1252
1471
  });
1253
1472
  }
1473
+ /**
1474
+ * Deletes a mapping.
1475
+ *
1476
+ * @param {Object} config
1477
+ * @param {Object} config.mapping JSKOS mapping
1478
+ * @returns {boolean} `true` if deletion was successful
1479
+ */
1254
1480
  async deleteMapping({ mapping, ...config }) {
1255
1481
  if (!mapping) {
1256
1482
  throw new InvalidOrMissingParameterError({ parameter: "mapping" });
@@ -1266,6 +1492,13 @@ var MappingsApiProvider = class extends BaseProvider {
1266
1492
  });
1267
1493
  return true;
1268
1494
  }
1495
+ /**
1496
+ * Returns a list of annotations.
1497
+ *
1498
+ * @param {Object} config
1499
+ * @param {string} [config.target] target URI
1500
+ * @returns {Object[]} array of JSKOS annotation objects
1501
+ */
1269
1502
  async getAnnotations({ target, ...config }) {
1270
1503
  if (target) {
1271
1504
  import_set.default(config, "params.target", target);
@@ -1276,6 +1509,13 @@ var MappingsApiProvider = class extends BaseProvider {
1276
1509
  url: this._api.annotations
1277
1510
  });
1278
1511
  }
1512
+ /**
1513
+ * Creates an annotation.
1514
+ *
1515
+ * @param {Object} config
1516
+ * @param {Object} config.annotation JSKOS annotation
1517
+ * @returns {Object} JSKOS annotation object
1518
+ */
1279
1519
  async postAnnotation({ annotation, ...config }) {
1280
1520
  return this.axios({
1281
1521
  ...config,
@@ -1284,6 +1524,13 @@ var MappingsApiProvider = class extends BaseProvider {
1284
1524
  data: annotation
1285
1525
  });
1286
1526
  }
1527
+ /**
1528
+ * Overwrites an annotation.
1529
+ *
1530
+ * @param {Object} config
1531
+ * @param {Object} config.annotation JSKOS annotation
1532
+ * @returns {Object} JSKOS annotation object
1533
+ */
1287
1534
  async putAnnotation({ annotation, ...config }) {
1288
1535
  const uri = annotation.id;
1289
1536
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1296,6 +1543,13 @@ var MappingsApiProvider = class extends BaseProvider {
1296
1543
  data: annotation
1297
1544
  });
1298
1545
  }
1546
+ /**
1547
+ * Patches an annotation.
1548
+ *
1549
+ * @param {Object} config
1550
+ * @param {Object} config.annotation JSKOS annotation
1551
+ * @returns {Object} JSKOS annotation object
1552
+ */
1299
1553
  async patchAnnotation({ annotation, ...config }) {
1300
1554
  const uri = annotation.id;
1301
1555
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1308,6 +1562,13 @@ var MappingsApiProvider = class extends BaseProvider {
1308
1562
  data: annotation
1309
1563
  });
1310
1564
  }
1565
+ /**
1566
+ * Deletes an annotation.
1567
+ *
1568
+ * @param {Object} config
1569
+ * @param {Object} config.annotation JSKOS annotation
1570
+ * @returns {boolean} `true` if deletion was successful
1571
+ */
1311
1572
  async deleteAnnotation({ annotation, ...config }) {
1312
1573
  const uri = annotation.id;
1313
1574
  if (!uri || !uri.startsWith(this._api.annotations)) {
@@ -1320,6 +1581,12 @@ var MappingsApiProvider = class extends BaseProvider {
1320
1581
  });
1321
1582
  return true;
1322
1583
  }
1584
+ /**
1585
+ * Returns a list of concordances.
1586
+ *
1587
+ * @param {Object} config
1588
+ * @returns {Object[]} array of JSKOS concordance objects
1589
+ */
1323
1590
  async getConcordances(config) {
1324
1591
  return this.axios({
1325
1592
  ...config,
@@ -1327,6 +1594,13 @@ var MappingsApiProvider = class extends BaseProvider {
1327
1594
  url: this._api.concordances
1328
1595
  });
1329
1596
  }
1597
+ /**
1598
+ * Creates a concordance.
1599
+ *
1600
+ * @param {Object} config
1601
+ * @param {Object} config.concordance JSKOS concordance
1602
+ * @returns {Object} JSKOS concordance object
1603
+ */
1330
1604
  async postConcordance({ concordance, ...config }) {
1331
1605
  if (!concordance) {
1332
1606
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1342,6 +1616,13 @@ var MappingsApiProvider = class extends BaseProvider {
1342
1616
  }
1343
1617
  });
1344
1618
  }
1619
+ /**
1620
+ * Overwrites a concordance.
1621
+ *
1622
+ * @param {Object} config
1623
+ * @param {Object} config.concordance JSKOS concordance
1624
+ * @returns {Object} JSKOS concordance object
1625
+ */
1345
1626
  async putConcordance({ concordance, ...config }) {
1346
1627
  if (!concordance) {
1347
1628
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1361,6 +1642,13 @@ var MappingsApiProvider = class extends BaseProvider {
1361
1642
  }
1362
1643
  });
1363
1644
  }
1645
+ /**
1646
+ * Patches a concordance.
1647
+ *
1648
+ * @param {Object} config
1649
+ * @param {Object} config.concordance JSKOS concordance (or part of concordance)
1650
+ * @returns {Object} JSKOS concordance object
1651
+ */
1364
1652
  async patchConcordance({ concordance, ...config }) {
1365
1653
  if (!concordance) {
1366
1654
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1380,6 +1668,13 @@ var MappingsApiProvider = class extends BaseProvider {
1380
1668
  }
1381
1669
  });
1382
1670
  }
1671
+ /**
1672
+ * Deletes a concordance.
1673
+ *
1674
+ * @param {Object} config
1675
+ * @param {Object} config.concordance JSKOS concordance
1676
+ * @returns {boolean} `true` if deletion was successful
1677
+ */
1383
1678
  async deleteConcordance({ concordance, ...config }) {
1384
1679
  if (!concordance) {
1385
1680
  throw new InvalidOrMissingParameterError({ parameter: "concordance" });
@@ -1406,6 +1701,9 @@ var OccurrencesApiProvider = class extends BaseProvider {
1406
1701
  get _cache() {
1407
1702
  return cache[this.uri];
1408
1703
  }
1704
+ /**
1705
+ * @private
1706
+ */
1409
1707
  _prepare() {
1410
1708
  cache[this.uri] = [];
1411
1709
  this._occurrencesSupportedSchemes = [];
@@ -1415,6 +1713,13 @@ var OccurrencesApiProvider = class extends BaseProvider {
1415
1713
  this.has[c] = false;
1416
1714
  });
1417
1715
  }
1716
+ /**
1717
+ * Returns whether a concept scheme is supported for occurrences.
1718
+ *
1719
+ * @private
1720
+ *
1721
+ * @param {Object} scheme JSKOS scheme to query
1722
+ */
1418
1723
  async _occurrencesIsSupported(scheme) {
1419
1724
  if (this._occurrencesSupportedSchemes && this._occurrencesSupportedSchemes.length) {
1420
1725
  } else {
@@ -1436,6 +1741,12 @@ var OccurrencesApiProvider = class extends BaseProvider {
1436
1741
  }
1437
1742
  return supported;
1438
1743
  }
1744
+ /**
1745
+ * Wrapper around getOccurrences that converts occurrences into mappings.
1746
+ *
1747
+ * @param {Object} config config object for getOccurrences request
1748
+ * @returns {Object[]} array of JSKOS mapping objects
1749
+ */
1439
1750
  async getMappings(config) {
1440
1751
  const occurrences = await this.getOccurrences(config);
1441
1752
  const from = config.from;
@@ -1479,6 +1790,15 @@ var OccurrencesApiProvider = class extends BaseProvider {
1479
1790
  mappings._url = occurrences._url;
1480
1791
  return mappings;
1481
1792
  }
1793
+ /**
1794
+ * Returns a list of occurrences.
1795
+ *
1796
+ * @param {Object} config
1797
+ * @param {Object} [config.from] JSKOS concept to load occurrences for (from side)
1798
+ * @param {Object} [config.to] JSKOS concept to load occurrences for (to side)
1799
+ * @param {Object[]} [config.concepts] list of JSKOS concepts to load occurrences for
1800
+ * @returns {Object[]} array of JSKOS occurrence objects
1801
+ */
1482
1802
  async getOccurrences({ from, to, concepts, threshold = 0, ...config }) {
1483
1803
  let promises = [];
1484
1804
  concepts = (concepts || []).concat([from, to]).filter((c) => !!c);
@@ -1531,6 +1851,13 @@ var OccurrencesApiProvider = class extends BaseProvider {
1531
1851
  occurrences._url = results.map((result) => result._url);
1532
1852
  return occurrences;
1533
1853
  }
1854
+ /**
1855
+ * Internal function for getOccurrences that either makes an API request or uses a local cache.
1856
+ *
1857
+ * @private
1858
+ *
1859
+ * @param {Object} config passthrough of config parameter for axios request
1860
+ */
1534
1861
  async _getOccurrences(config) {
1535
1862
  let resultsFromCache = this._cache.find((item) => {
1536
1863
  return import_isEqual.default(item.config.params, config.params);
@@ -1559,6 +1886,9 @@ OccurrencesApiProvider.stored = false;
1559
1886
  // src/providers/concept-api-provider.js
1560
1887
  var import_jskos_tools5 = __toESM(require("jskos-tools"), 1);
1561
1888
  var ConceptApiProvider = class extends BaseProvider {
1889
+ /**
1890
+ * @private
1891
+ */
1562
1892
  _prepare() {
1563
1893
  if (this._api.api && this._api.status === void 0) {
1564
1894
  this._api.status = concatUrl(this._api.api, "/status");
@@ -1577,6 +1907,9 @@ var ConceptApiProvider = class extends BaseProvider {
1577
1907
  this.has[c] = false;
1578
1908
  });
1579
1909
  }
1910
+ /**
1911
+ * @private
1912
+ */
1580
1913
  _setup() {
1581
1914
  if (this._api.api) {
1582
1915
  const endpoints = {
@@ -1610,9 +1943,17 @@ var ConceptApiProvider = class extends BaseProvider {
1610
1943
  this.has.search = !!this._api.search;
1611
1944
  this.has.auth = import_get.default(this._config, "auth.key") != null;
1612
1945
  this._defaultParams = {
1946
+ // Default parameters mostly for DANTE
1613
1947
  properties: "+created,issued,modified,editorialNote,scopeNote"
1614
1948
  };
1615
1949
  }
1950
+ /**
1951
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
1952
+ *
1953
+ * @param {Object} options
1954
+ * @param {Object} options.url API URL for server
1955
+ * @returns {Object} provider configuration
1956
+ */
1616
1957
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
1617
1958
  if (!url || !scheme) {
1618
1959
  return null;
@@ -1622,6 +1963,11 @@ var ConceptApiProvider = class extends BaseProvider {
1622
1963
  schemes: [scheme]
1623
1964
  };
1624
1965
  }
1966
+ /**
1967
+ * Returns the main vocabulary URI by requesting the scheme info and saving it in a cache.
1968
+ *
1969
+ * @private
1970
+ */
1625
1971
  async _getSchemeUri(scheme) {
1626
1972
  this._approvedSchemes = this._approvedSchemes || [];
1627
1973
  this._rejectedSchemes = this._rejectedSchemes || [];
@@ -1650,6 +1996,12 @@ var ConceptApiProvider = class extends BaseProvider {
1650
1996
  return null;
1651
1997
  }
1652
1998
  }
1999
+ /**
2000
+ * Returns all concept schemes.
2001
+ *
2002
+ * @param {Object} config
2003
+ * @returns {Object[]} array of JSKOS concept scheme objects
2004
+ */
1653
2005
  async getSchemes(config) {
1654
2006
  if (!this._api.schemes) {
1655
2007
  if (Array.isArray(this.schemes)) {
@@ -1663,6 +2015,7 @@ var ConceptApiProvider = class extends BaseProvider {
1663
2015
  url: this._api.schemes,
1664
2016
  params: {
1665
2017
  ...this._defaultParams,
2018
+ // ? What should the default limit be?
1666
2019
  limit: 500,
1667
2020
  ...config.params || {}
1668
2021
  }
@@ -1673,6 +2026,13 @@ var ConceptApiProvider = class extends BaseProvider {
1673
2026
  return schemes;
1674
2027
  }
1675
2028
  }
2029
+ /**
2030
+ * Returns top concepts for a concept scheme.
2031
+ *
2032
+ * @param {Object} config
2033
+ * @param {Object} config.scheme concept scheme object
2034
+ * @returns {Object[]} array of JSKOS concept objects
2035
+ */
1676
2036
  async getTop({ scheme, ...config }) {
1677
2037
  if (!this._api.top) {
1678
2038
  throw new MissingApiUrlError();
@@ -1693,12 +2053,20 @@ var ConceptApiProvider = class extends BaseProvider {
1693
2053
  url: this._api.top,
1694
2054
  params: {
1695
2055
  ...this._defaultParams,
2056
+ // ? What should the default limit be?
1696
2057
  limit: 1e4,
1697
2058
  ...config.params || {},
1698
2059
  uri: schemeUri
1699
2060
  }
1700
2061
  });
1701
2062
  }
2063
+ /**
2064
+ * Returns details for a list of concepts.
2065
+ *
2066
+ * @param {Object} config
2067
+ * @param {Object[]} config.concepts list of concept objects to load
2068
+ * @returns {Object[]} array of JSKOS concept objects
2069
+ */
1702
2070
  async getConcepts({ concepts, ...config }) {
1703
2071
  if (this.has.data === false) {
1704
2072
  throw new MissingApiUrlError();
@@ -1716,12 +2084,20 @@ var ConceptApiProvider = class extends BaseProvider {
1716
2084
  url: this._api.data,
1717
2085
  params: {
1718
2086
  ...this._defaultParams,
2087
+ // ? What should the default limit be?
1719
2088
  limit: 500,
1720
2089
  ...config.params || {},
1721
2090
  uri: uris.join("|")
1722
2091
  }
1723
2092
  });
1724
2093
  }
2094
+ /**
2095
+ * Returns narrower concepts for a concept.
2096
+ *
2097
+ * @param {Object} config
2098
+ * @param {Object} config.concept concept object
2099
+ * @returns {Object[]} array of JSKOS concept objects
2100
+ */
1725
2101
  async getNarrower({ concept, ...config }) {
1726
2102
  if (!this._api.narrower) {
1727
2103
  throw new MissingApiUrlError();
@@ -1735,12 +2111,20 @@ var ConceptApiProvider = class extends BaseProvider {
1735
2111
  url: this._api.narrower,
1736
2112
  params: {
1737
2113
  ...this._defaultParams,
2114
+ // ? What should the default limit be?
1738
2115
  limit: 1e4,
1739
2116
  ...config.params || {},
1740
2117
  uri: concept.uri
1741
2118
  }
1742
2119
  });
1743
2120
  }
2121
+ /**
2122
+ * Returns ancestor concepts for a concept.
2123
+ *
2124
+ * @param {Object} config
2125
+ * @param {Object} config.concept concept object
2126
+ * @returns {Object[]} array of JSKOS concept objects
2127
+ */
1744
2128
  async getAncestors({ concept, ...config }) {
1745
2129
  if (!this._api.ancestors) {
1746
2130
  throw new MissingApiUrlError();
@@ -1754,12 +2138,25 @@ var ConceptApiProvider = class extends BaseProvider {
1754
2138
  url: this._api.ancestors,
1755
2139
  params: {
1756
2140
  ...this._defaultParams,
2141
+ // ? What should the default limit be?
1757
2142
  limit: 1e4,
1758
2143
  ...config.params || {},
1759
2144
  uri: concept.uri
1760
2145
  }
1761
2146
  });
1762
2147
  }
2148
+ /**
2149
+ * Returns suggestion result in OpenSearch Suggest Format.
2150
+ *
2151
+ * @param {Object} config
2152
+ * @param {string} config.search search string
2153
+ * @param {Object} [config.scheme] concept scheme to search in
2154
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2155
+ * @param {string} [config.use=notation,label] which fields to search ("notation", "label" or "notation,label")
2156
+ * @param {string[]} [config.types=[]] list of type URIs
2157
+ * @param {string} [config.sort=score] sorting parameter
2158
+ * @returns {Array} result in OpenSearch Suggest Format
2159
+ */
1763
2160
  async suggest({ use = "notation,label", types = [], sort = "score", params = {}, ...config }) {
1764
2161
  return this._search({
1765
2162
  ...config,
@@ -1772,6 +2169,17 @@ var ConceptApiProvider = class extends BaseProvider {
1772
2169
  }
1773
2170
  });
1774
2171
  }
2172
+ /**
2173
+ * Returns search results in JSKOS Format.
2174
+ *
2175
+ * @param {Object} config
2176
+ * @param {string} config.search search string
2177
+ * @param {Object} [config.scheme] concept scheme to search in
2178
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2179
+ * @param {number} [config.offset=0] offset
2180
+ * @param {string[]} [config.types=[]] list of type URIs
2181
+ * @returns {Array} result in JSKOS Format
2182
+ */
1775
2183
  async search({ types = [], params = {}, ...config }) {
1776
2184
  return this._search({
1777
2185
  ...config,
@@ -1782,6 +2190,16 @@ var ConceptApiProvider = class extends BaseProvider {
1782
2190
  }
1783
2191
  });
1784
2192
  }
2193
+ /**
2194
+ * Returns concept scheme suggestion result in OpenSearch Suggest Format.
2195
+ *
2196
+ * @param {Object} config
2197
+ * @param {string} config.search search string
2198
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2199
+ * @param {string} [config.use=notation,label] which fields to search ("notation", "label" or "notation,label")
2200
+ * @param {string} [config.sort=score] sorting parameter
2201
+ * @returns {Array} result in OpenSearch Suggest Format
2202
+ */
1785
2203
  async vocSuggest({ use = "notation,label", sort = "score", params = {}, ...config }) {
1786
2204
  return this._search({
1787
2205
  ...config,
@@ -1793,6 +2211,15 @@ var ConceptApiProvider = class extends BaseProvider {
1793
2211
  }
1794
2212
  });
1795
2213
  }
2214
+ /**
2215
+ * Returns concept scheme search results in JSKOS Format.
2216
+ *
2217
+ * @param {Object} config
2218
+ * @param {string} config.search search string
2219
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2220
+ * @param {number} [config.offset=0] offset
2221
+ * @returns {Array} result in JSKOS Format
2222
+ */
1796
2223
  async vocSearch(config) {
1797
2224
  return this._search({
1798
2225
  ...config,
@@ -1818,6 +2245,7 @@ var ConceptApiProvider = class extends BaseProvider {
1818
2245
  ...params,
1819
2246
  limit,
1820
2247
  count: limit,
2248
+ // Some endpoints use count instead of limit
1821
2249
  offset,
1822
2250
  search,
1823
2251
  query: search,
@@ -1827,6 +2255,13 @@ var ConceptApiProvider = class extends BaseProvider {
1827
2255
  url
1828
2256
  });
1829
2257
  }
2258
+ /**
2259
+ * Returns a list of types.
2260
+ *
2261
+ * @param {Object} config
2262
+ * @param {Object} [config.scheme] concept scheme to load types for
2263
+ * @returns {Object[]} array of JSKOS type objects
2264
+ */
1830
2265
  async getTypes({ scheme, ...config }) {
1831
2266
  if (!this._api.types) {
1832
2267
  throw new MissingApiUrlError();
@@ -1855,6 +2290,9 @@ var ReconciliationApiProvider = class extends BaseProvider {
1855
2290
  get _cache() {
1856
2291
  return cache2[this.uri];
1857
2292
  }
2293
+ /**
2294
+ * @private
2295
+ */
1858
2296
  _prepare() {
1859
2297
  cache2[this.uri] = [];
1860
2298
  this.has.mappings = true;
@@ -1862,6 +2300,15 @@ var ReconciliationApiProvider = class extends BaseProvider {
1862
2300
  this.has[c] = false;
1863
2301
  });
1864
2302
  }
2303
+ /**
2304
+ * Returns a list of mappings suggestions.
2305
+ *
2306
+ * @param {Object} config
2307
+ * @param {Object} config.from JSKOS concept on from side
2308
+ * @param {Object} config.to JSKOS concept on to side
2309
+ * @param {Object} config.mode mappings mode
2310
+ * @returns {Object[]} array of JSKOS mapping objects
2311
+ */
1865
2312
  async getMappings({ from, to, mode, ...config }) {
1866
2313
  let schemes = [];
1867
2314
  if (import_isArray.default(this.schemes)) {
@@ -1946,6 +2393,15 @@ var ReconciliationApiProvider = class extends BaseProvider {
1946
2393
  mappings._url = url;
1947
2394
  return mappings;
1948
2395
  }
2396
+ /**
2397
+ * Internal function that either makes an API request or uses a local cache.
2398
+ *
2399
+ * @private
2400
+ *
2401
+ * @param {Object} config passthrough of config object for axios request
2402
+ * @param {string[]} labels list of labels to get results for
2403
+ * @param {string} language language of labels
2404
+ */
1949
2405
  async _getReconciliationResults({ labels, language, ...config }) {
1950
2406
  labels = labels.sort();
1951
2407
  let resultsFromCache = this._cache.find((item) => {
@@ -1994,6 +2450,9 @@ ReconciliationApiProvider.stored = false;
1994
2450
  // src/providers/label-search-suggestion-provider.js
1995
2451
  var import_jskos_tools7 = __toESM(require("jskos-tools"), 1);
1996
2452
  var LabelSearchSuggestionProvider = class extends BaseProvider {
2453
+ /**
2454
+ * @private
2455
+ */
1997
2456
  _prepare() {
1998
2457
  this._cache = [];
1999
2458
  this.has.mappings = true;
@@ -2001,9 +2460,25 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2001
2460
  this.has[c] = false;
2002
2461
  });
2003
2462
  }
2463
+ /**
2464
+ * Override `supportsScheme` to check whether a search URI is available for the scheme's registry.
2465
+ *
2466
+ * @param {Object} scheme - target scheme to check for support
2467
+ * @returns {boolean}
2468
+ */
2004
2469
  supportsScheme(scheme) {
2005
2470
  return super.supportsScheme(scheme) && import_get.default(scheme, "_registry.has.search", false);
2006
2471
  }
2472
+ /**
2473
+ * Returns a list of mappings.
2474
+ *
2475
+ * @param {Object} config
2476
+ * @param {Object} config.from JSKOS concept on from side
2477
+ * @param {Object} config.to JSKOS concept on to side
2478
+ * @param {Object} config.mode mappings mode
2479
+ * @param {Object} config.selected selected mappings in Cocoda
2480
+ * @returns {Object[]} array of JSKOS mapping objects
2481
+ */
2007
2482
  async getMappings({ from, to, mode, selected, limit = 10, ...config }) {
2008
2483
  if (mode != "or") {
2009
2484
  return [];
@@ -2033,6 +2508,17 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2033
2508
  }
2034
2509
  return import_union.default(fromResult, toResult);
2035
2510
  }
2511
+ /**
2512
+ * Internal function to get mapping recommendations for a certain concept with sourceScheme and targetScheme.
2513
+ *
2514
+ * @private
2515
+ *
2516
+ * @param {Object} config
2517
+ * @param {Object} config.concept
2518
+ * @param {Object} config.sourceScheme
2519
+ * @param {Pbject} config.targetScheme
2520
+ * @param {boolean} config.swap - whether to reverse the direction of the mappings
2521
+ */
2036
2522
  async _getMappings({ concept, sourceScheme, targetScheme, limit, swap = false, ...config }) {
2037
2523
  if (!concept || !sourceScheme || !targetScheme) {
2038
2524
  return [];
@@ -2050,7 +2536,21 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2050
2536
  }
2051
2537
  const regexResult = /^[\s\wäüöÄÜÖß]*\w/.exec(label);
2052
2538
  label = regexResult ? regexResult[0] : label;
2053
- const results = await this._getResults({ ...config, label, targetScheme, limit });
2539
+ let results = await this._getResults({ ...config, label, targetScheme, limit });
2540
+ if (!results.length && concept.broader?.length) {
2541
+ for (const broader of concept.broader) {
2542
+ const label2 = import_jskos_tools7.default.prefLabel(broader, {
2543
+ fallbackToUri: false,
2544
+ language
2545
+ });
2546
+ if (!label2)
2547
+ continue;
2548
+ results = await this._getResults({ ...config, label: label2, targetScheme, limit });
2549
+ if (results.length) {
2550
+ break;
2551
+ }
2552
+ }
2553
+ }
2054
2554
  let mappings = results.map((result) => ({
2055
2555
  fromScheme: sourceScheme,
2056
2556
  from: { memberSet: [concept] },
@@ -2068,6 +2568,15 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2068
2568
  }
2069
2569
  return mappings;
2070
2570
  }
2571
+ /**
2572
+ * Internal function that either makes an API request or uses a local cache.
2573
+ *
2574
+ * @private
2575
+ *
2576
+ * @param {Object} config
2577
+ * @param {string} config.label
2578
+ * @param {Object} config.targetScheme
2579
+ */
2071
2580
  async _getResults({ label, targetScheme, limit, ...config }) {
2072
2581
  let resultsFromCache = (this._cache[targetScheme.uri] || {})[label];
2073
2582
  if (resultsFromCache && resultsFromCache._limit >= limit) {
@@ -2099,6 +2608,9 @@ LabelSearchSuggestionProvider.stored = false;
2099
2608
  // src/providers/skosmos-api-provider.js
2100
2609
  var import_jskos_tools8 = __toESM(require("jskos-tools"), 1);
2101
2610
  var SkosmosApiProvider = class extends BaseProvider {
2611
+ /**
2612
+ * @private
2613
+ */
2102
2614
  _prepare() {
2103
2615
  this.has.schemes = true;
2104
2616
  this.has.top = true;
@@ -2113,6 +2625,14 @@ var SkosmosApiProvider = class extends BaseProvider {
2113
2625
  this.has[c] = false;
2114
2626
  });
2115
2627
  }
2628
+ /**
2629
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
2630
+ *
2631
+ * @param {Object} options
2632
+ * @param {Object} options.url API URL for BARTOC instance
2633
+ * @param {Object} options.scheme scheme for which the config is requested
2634
+ * @returns {Object} provider configuration
2635
+ */
2116
2636
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2117
2637
  if (!url || !scheme) {
2118
2638
  return null;
@@ -2127,9 +2647,15 @@ var SkosmosApiProvider = class extends BaseProvider {
2127
2647
  config.schemes = [scheme];
2128
2648
  return config;
2129
2649
  }
2650
+ /**
2651
+ * @private
2652
+ */
2130
2653
  get _language() {
2131
2654
  return this.languages[0] || this._defaultLanguages[0] || "en";
2132
2655
  }
2656
+ /**
2657
+ * @private
2658
+ */
2133
2659
  _getApiUrl(scheme, endpoint, params) {
2134
2660
  const VOCID = scheme && scheme.VOCID || import_get.default(this.schemes.find((s) => import_jskos_tools8.default.compare(s, scheme)), "VOCID");
2135
2661
  if (!VOCID) {
@@ -2143,6 +2669,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2143
2669
  const paramString = Object.keys(params).map((k) => `${k}=${encodeURIComponent(params[k])}`).join("&");
2144
2670
  return `${this._api.api}${VOCID}${endpoint}${paramString ? "?" + paramString : ""}`;
2145
2671
  }
2672
+ /**
2673
+ * @private
2674
+ */
2146
2675
  _getDataUrl(concept, { addFormatParameter = true } = {}) {
2147
2676
  const scheme = import_get.default(concept, "inScheme[0]");
2148
2677
  if (!concept || !concept.uri) {
@@ -2150,6 +2679,11 @@ var SkosmosApiProvider = class extends BaseProvider {
2150
2679
  }
2151
2680
  return this._getApiUrl(scheme, "/data", addFormatParameter ? { format: "application/json" } : {});
2152
2681
  }
2682
+ /**
2683
+ * Returns the main vocabulary URI by requesting the scheme info and saving it in a cache.
2684
+ *
2685
+ * @private
2686
+ */
2153
2687
  async _getSchemeUri(scheme) {
2154
2688
  this._approvedSchemes = this._approvedSchemes || [];
2155
2689
  this._rejectedSchemes = this._rejectedSchemes || [];
@@ -2180,6 +2714,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2180
2714
  return null;
2181
2715
  }
2182
2716
  }
2717
+ /**
2718
+ * @private
2719
+ */
2183
2720
  _toJskosConcept(skosmosConcept, { concept, scheme, result, language } = {}) {
2184
2721
  if (!skosmosConcept) {
2185
2722
  return null;
@@ -2252,6 +2789,12 @@ var SkosmosApiProvider = class extends BaseProvider {
2252
2789
  }
2253
2790
  return concept;
2254
2791
  }
2792
+ /**
2793
+ * Returns all concept schemes.
2794
+ *
2795
+ * @param {Object} config
2796
+ * @returns {Object[]} array of JSKOS concept scheme objects
2797
+ */
2255
2798
  async getSchemes({ ...config }) {
2256
2799
  const schemes = [];
2257
2800
  for (let scheme of this.schemes || []) {
@@ -2277,6 +2820,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2277
2820
  }
2278
2821
  return schemes;
2279
2822
  }
2823
+ /**
2824
+ * Returns top concepts.
2825
+ *
2826
+ * @param {Object} config
2827
+ * @param {Object} config.scheme concept scheme
2828
+ * @returns {Object[]} array of JSKOS concept scheme objects
2829
+ */
2280
2830
  async getTop({ scheme, ...config }) {
2281
2831
  const url = this._getApiUrl(scheme, "/topConcepts");
2282
2832
  const schemeUri = await this._getSchemeUri(scheme);
@@ -2300,6 +2850,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2300
2850
  }
2301
2851
  return concepts;
2302
2852
  }
2853
+ /**
2854
+ * Returns details for a list of concepts.
2855
+ *
2856
+ * @param {Object} config
2857
+ * @param {Object[]} config.concepts list of concept objects to load
2858
+ * @returns {Object[]} array of JSKOS concept objects
2859
+ */
2303
2860
  async getConcepts({ concepts, ...config }) {
2304
2861
  if (!import_isArray.default(concepts)) {
2305
2862
  concepts = [concepts];
@@ -2339,6 +2896,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2339
2896
  }
2340
2897
  return newConcepts;
2341
2898
  }
2899
+ /**
2900
+ * Returns narrower concepts for a concept.
2901
+ *
2902
+ * @param {Object} config
2903
+ * @param {Object} config.concept concept object
2904
+ * @returns {Object[]} array of JSKOS concept objects
2905
+ */
2342
2906
  async getNarrower({ concept, ...config }) {
2343
2907
  if (!concept || !concept.uri) {
2344
2908
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2354,6 +2918,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2354
2918
  const concepts = (response.narrower || []).map((c) => this._toJskosConcept(c, { scheme }));
2355
2919
  return concepts;
2356
2920
  }
2921
+ /**
2922
+ * Returns ancestor concepts for a concept.
2923
+ *
2924
+ * @param {Object} config
2925
+ * @param {Object} config.concept concept object
2926
+ * @returns {Object[]} array of JSKOS concept objects
2927
+ */
2357
2928
  async getAncestors({ concept, ...config }) {
2358
2929
  if (!concept || !concept.uri) {
2359
2930
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2378,6 +2949,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2378
2949
  const concepts = ancestors.map((c) => this._toJskosConcept(c, { scheme })).filter((c) => c.uri != concept.uri);
2379
2950
  return concepts;
2380
2951
  }
2952
+ /**
2953
+ * Returns suggestion result in OpenSearch Suggest Format.
2954
+ *
2955
+ * @param {Object} config
2956
+ * @param {string} config.search search string
2957
+ * @param {Object} [config.scheme] concept scheme to search in
2958
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2959
+ * @param {string[]} [config.types=[]] list of type URIs
2960
+ * @returns {Array} result in OpenSearch Suggest Format
2961
+ */
2381
2962
  async suggest(config) {
2382
2963
  config._raw = true;
2383
2964
  const concepts = await this.search(config);
@@ -2396,6 +2977,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2396
2977
  }
2397
2978
  return result;
2398
2979
  }
2980
+ /**
2981
+ * Returns concept search results.
2982
+ *
2983
+ * @param {Object} config
2984
+ * @param {string} config.search search string
2985
+ * @param {Object} [config.scheme] concept scheme to search in
2986
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
2987
+ * @param {string[]} [config.types=[]] list of type URIs
2988
+ * @returns {Array} array of JSKOS concept objects
2989
+ */
2399
2990
  async search({ search, scheme, limit, types = [], ...config }) {
2400
2991
  const url = this._getApiUrl(scheme, "/search");
2401
2992
  import_set.default(config, "params.query", `${search}*`);
@@ -2410,6 +3001,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2410
3001
  const concepts = (response.results || []).map((c) => this._toJskosConcept(c, { scheme }));
2411
3002
  return concepts;
2412
3003
  }
3004
+ /**
3005
+ * Returns a list of types.
3006
+ *
3007
+ * @param {Object} config
3008
+ * @param {Object} [config.scheme] concept scheme to load types for
3009
+ * @returns {Object[]} array of JSKOS type objects
3010
+ */
2413
3011
  async getTypes({ scheme, ...config }) {
2414
3012
  const url = this._getApiUrl(scheme, "/types");
2415
3013
  const types = [];
@@ -2508,6 +3106,9 @@ function madsToJskosConcept(data3, { scheme }) {
2508
3106
  return concept;
2509
3107
  }
2510
3108
  var LocApiProvider = class extends BaseProvider {
3109
+ /**
3110
+ * @private
3111
+ */
2511
3112
  _prepare() {
2512
3113
  this.has.schemes = true;
2513
3114
  this.has.top = false;
@@ -2521,6 +3122,13 @@ var LocApiProvider = class extends BaseProvider {
2521
3122
  this.has[c] = false;
2522
3123
  });
2523
3124
  }
3125
+ /**
3126
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3127
+ *
3128
+ * @param {Object} options
3129
+ * @param {Object} options.scheme scheme for which the config is requested
3130
+ * @returns {Object} provider configuration
3131
+ */
2524
3132
  static _registryConfigForBartocApiConfig({ scheme } = {}) {
2525
3133
  if (!scheme || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, scheme))) {
2526
3134
  return null;
@@ -2529,6 +3137,11 @@ var LocApiProvider = class extends BaseProvider {
2529
3137
  schemes: [scheme]
2530
3138
  };
2531
3139
  }
3140
+ /**
3141
+ * Returns all concept schemes.
3142
+ *
3143
+ * @returns {Object[]} array of JSKOS concept scheme objects
3144
+ */
2532
3145
  async getSchemes() {
2533
3146
  const schemes = [];
2534
3147
  for (let scheme of await Promise.all(
@@ -2553,6 +3166,29 @@ var LocApiProvider = class extends BaseProvider {
2553
3166
  }
2554
3167
  return schemes;
2555
3168
  }
3169
+ /**
3170
+ * TODO: Possibly reenable for LCC
3171
+ * Returns top concepts for a concept scheme.
3172
+ *
3173
+ * @param {Object} config
3174
+ * @param {Object} config.scheme concept scheme object
3175
+ * @returns {Object[]} array of JSKOS concept objects
3176
+ */
3177
+ // async getTop({ scheme }) {
3178
+ // if (scheme.topConcepts && !scheme.topConcepts.includes(null)) {
3179
+ // return scheme.topConcepts
3180
+ // }
3181
+ // const schemes = await this.getSchemes()
3182
+ // scheme = schemes.find(s => jskos.compare(s, scheme))
3183
+ // return scheme && scheme.topConcepts || []
3184
+ // }
3185
+ /**
3186
+ * Returns details for a list of concepts.
3187
+ *
3188
+ * @param {Object} config
3189
+ * @param {Object[]} config.concepts list of concept objects to load
3190
+ * @returns {Object[]} array of JSKOS concept objects
3191
+ */
2556
3192
  async getConcepts({ concepts }) {
2557
3193
  if (!Array.isArray(concepts)) {
2558
3194
  concepts = [concepts];
@@ -2576,6 +3212,16 @@ var LocApiProvider = class extends BaseProvider {
2576
3212
  }
2577
3213
  return resultConcepts;
2578
3214
  }
3215
+ /**
3216
+ * Returns suggestion result in OpenSearch Suggest Format.
3217
+ *
3218
+ * @param {Object} config
3219
+ * @param {string} config.search search string
3220
+ * @param {Object} config.scheme concept scheme to search in
3221
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
3222
+ * @param {number} [config.offset=0] offset
3223
+ * @returns {Array} result in OpenSearch Suggest Format
3224
+ */
2579
3225
  async suggest(config) {
2580
3226
  const results = await this.search(config);
2581
3227
  return [
@@ -2587,6 +3233,16 @@ var LocApiProvider = class extends BaseProvider {
2587
3233
  results.map((c) => c.uri)
2588
3234
  ];
2589
3235
  }
3236
+ /**
3237
+ * Returns search results in JSKOS Format.
3238
+ *
3239
+ * @param {Object} config
3240
+ * @param {string} config.search search string
3241
+ * @param {Object} config.scheme concept scheme to search in
3242
+ * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
3243
+ * @param {number} [config.offset=0] offset
3244
+ * @returns {Array} result in JSKOS Format
3245
+ */
2590
3246
  async search({ search, scheme, limit, offset }) {
2591
3247
  const schemeUri = import_jskos_tools9.default.getAllUris(scheme).find((uri) => uri.startsWith(locUriPrefix));
2592
3248
  if (!schemeUri || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, { uri: schemeUri }))) {
@@ -2658,6 +3314,14 @@ var SkohubProvider = class extends BaseProvider {
2658
3314
  get _schemeCache() {
2659
3315
  return data[this.uri] && data[this.uri].schemeCache;
2660
3316
  }
3317
+ /**
3318
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3319
+ *
3320
+ * @param {Object} options
3321
+ * @param {Object} options.url API URL for BARTOC instance
3322
+ * @param {Object} options.scheme scheme for which the config is requested
3323
+ * @returns {Object} provider configuration
3324
+ */
2661
3325
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2662
3326
  if (!url || !scheme) {
2663
3327
  return null;
@@ -2787,6 +3451,15 @@ var SkohubProvider = class extends BaseProvider {
2787
3451
  concept = await this._loadConcept({ ...config, uri: concept.uri });
2788
3452
  return concept.narrower;
2789
3453
  }
3454
+ /**
3455
+ * Returns concept search results.
3456
+ *
3457
+ * @param {Object} config
3458
+ * @param {string} config.search search string
3459
+ * @param {Object} [config.scheme] concept scheme to search in
3460
+ * @param {number} [config.limit=100] maximum number of search results
3461
+ * @returns {Array} array of JSKOS concept objects
3462
+ */
2790
3463
  async search({ search, scheme, limit = 100 }) {
2791
3464
  scheme = await this._loadScheme({ scheme });
2792
3465
  if (!scheme || !scheme.uri) {
@@ -2832,6 +3505,15 @@ var SkohubProvider = class extends BaseProvider {
2832
3505
  const concepts = await this.getConcepts({ concepts: result.map((uri) => ({ uri })) });
2833
3506
  return concepts.slice(0, limit);
2834
3507
  }
3508
+ /**
3509
+ * Returns suggestion result in OpenSearch Suggest Format.
3510
+ *
3511
+ * @param {Object} config
3512
+ * @param {string} config.search search string
3513
+ * @param {Object} [config.scheme] concept scheme to search in
3514
+ * @param {number} [config.limit=100] maximum number of search results
3515
+ * @returns {Array} result in OpenSearch Suggest Format
3516
+ */
2835
3517
  async suggest(config) {
2836
3518
  config._raw = true;
2837
3519
  const concepts = await this.search(config);
@@ -2875,6 +3557,14 @@ var MyCoReProvider = class extends BaseProvider {
2875
3557
  _setup() {
2876
3558
  this._scheme = null;
2877
3559
  }
3560
+ /**
3561
+ * Used by `registryForScheme` (see src/lib/CocodaSDK.js) to determine a provider config for a concept schceme.
3562
+ *
3563
+ * @param {Object} options
3564
+ * @param {Object} options.url API URL for BARTOC instance
3565
+ * @param {Object} options.scheme scheme for which the config is requested
3566
+ * @returns {Object} provider configuration
3567
+ */
2878
3568
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2879
3569
  if (!url || !scheme) {
2880
3570
  return null;
@@ -2883,6 +3573,9 @@ var MyCoReProvider = class extends BaseProvider {
2883
3573
  api: url
2884
3574
  };
2885
3575
  }
3576
+ /**
3577
+ * Converts scheme info (full scheme data that comes from the API) to a JSKOS scheme
3578
+ */
2886
3579
  _schemeInfoToJSKOS(schemeInfo) {
2887
3580
  const uri = schemeInfo.labels.find((l) => l.lang === "x-uri").text;
2888
3581
  const prefLabel = {};
@@ -2901,6 +3594,13 @@ var MyCoReProvider = class extends BaseProvider {
2901
3594
  }
2902
3595
  return scheme;
2903
3596
  }
3597
+ /**
3598
+ * Converts a category to a JSKOS concept.
3599
+ * - Also saves that concept in data
3600
+ * - Also adds the concept's prefLabels to the search index
3601
+ *
3602
+ * ? Question: Should scopeNotes be part of the search index?
3603
+ */
2904
3604
  _categoryToJSKOS(category, { scheme, broader = [] }) {
2905
3605
  if (!category || !scheme) {
2906
3606
  return null;
@@ -2933,11 +3633,17 @@ var MyCoReProvider = class extends BaseProvider {
2933
3633
  };
2934
3634
  return data2[scheme.uri].concepts[uri];
2935
3635
  }
3636
+ /**
3637
+ * Helper function that replaces `narrower` key with [null] if it has values. Use this before returning concepts.
3638
+ */
2936
3639
  _removeNarrower(concept) {
2937
3640
  if (!concept)
2938
3641
  return concept;
2939
3642
  return Object.assign({}, concept, { narrower: concept.narrower && concept.narrower.length ? [null] : [] });
2940
3643
  }
3644
+ /**
3645
+ * Loads the data from the API. Only called from getSchemes and only called once.
3646
+ */
2941
3647
  async _loadSchemeData(config) {
2942
3648
  const schemeInfo = await this.axios({
2943
3649
  ...config,
@@ -3024,6 +3730,15 @@ var MyCoReProvider = class extends BaseProvider {
3024
3730
  concept = data2[this._scheme.uri].concepts[concept.uri];
3025
3731
  return (concept && concept.narrower || []).map((c) => data2[this._scheme.uri].concepts[c.uri]).map(this._removeNarrower);
3026
3732
  }
3733
+ /**
3734
+ * Returns concept search results.
3735
+ *
3736
+ * @param {Object} config
3737
+ * @param {string} config.search search string
3738
+ * @param {Object} [config.scheme] concept scheme to search in
3739
+ * @param {number} [config.limit=100] maximum number of search results
3740
+ * @returns {Array} array of JSKOS concept objects
3741
+ */
3027
3742
  async search({ search, scheme, limit = 100 }) {
3028
3743
  if (!scheme || !scheme.uri) {
3029
3744
  throw new InvalidOrMissingParameterError({ parameter: "scheme" });
@@ -3043,6 +3758,15 @@ var MyCoReProvider = class extends BaseProvider {
3043
3758
  const result = await data2[this._scheme.uri].searchIndex.search(search);
3044
3759
  return result.map((uri) => data2[this._scheme.uri].concepts[uri]).map(this._removeNarrower).slice(0, limit);
3045
3760
  }
3761
+ /**
3762
+ * Returns suggestion result in OpenSearch Suggest Format.
3763
+ *
3764
+ * @param {Object} config
3765
+ * @param {string} config.search search string
3766
+ * @param {Object} [config.scheme] concept scheme to search in
3767
+ * @param {number} [config.limit=100] maximum number of search results
3768
+ * @returns {Array} result in OpenSearch Suggest Format
3769
+ */
3046
3770
  async suggest(config) {
3047
3771
  config._raw = true;
3048
3772
  const concepts = await this.search(config);
@@ -3086,16 +3810,37 @@ providers.addProvider(ConceptApiProvider);
3086
3810
  providers.addProvider(MappingsApiProvider);
3087
3811
  var registryCache = {};
3088
3812
  var CocodaSDK = class {
3813
+ /**
3814
+ * CDK constructor.
3815
+ *
3816
+ * @param {Object} [config={}] Cocoda-stye config object
3817
+ */
3089
3818
  constructor(config) {
3090
3819
  this.config = config;
3091
3820
  this.axios = import_axios3.default.create();
3092
3821
  }
3822
+ /**
3823
+ * Method to set the configuration.
3824
+ *
3825
+ * @param {Object} config Cocoda-stye config object
3826
+ */
3093
3827
  setConfig(config) {
3094
3828
  this.config = config;
3095
3829
  }
3830
+ /**
3831
+ * Current configuration.
3832
+ *
3833
+ * @returns {Object} current configuration
3834
+ */
3096
3835
  get config() {
3097
3836
  return this._config;
3098
3837
  }
3838
+ /**
3839
+ * Prepares config when set.
3840
+ *
3841
+ * @param {Object} config Cocoda config object
3842
+ * @private
3843
+ */
3099
3844
  set config(config) {
3100
3845
  config = config || {};
3101
3846
  config.registries = config.registries || [];
@@ -3105,16 +3850,44 @@ var CocodaSDK = class {
3105
3850
  });
3106
3851
  this._config = config;
3107
3852
  }
3853
+ /**
3854
+ * Map of registered providers.
3855
+ *
3856
+ * @returns {Object} map of registered providers (name -> provider)
3857
+ */
3108
3858
  get providers() {
3109
3859
  return providers;
3110
3860
  }
3861
+ /**
3862
+ * Creates a new CDK instance (same as `new CocodaSDK(config)`).
3863
+ *
3864
+ * @param {Object} config Cocoda config object
3865
+ * @returns {CocodaSDK} new CDK instance
3866
+ */
3111
3867
  createInstance(config) {
3112
3868
  return new CocodaSDK(config);
3113
3869
  }
3870
+ /**
3871
+ * Offer method to load a config file from URL.
3872
+ *
3873
+ * @param {string} url URL of config as JSON
3874
+ */
3114
3875
  async loadConfig(url) {
3115
3876
  const response = await this.axios.get(url);
3116
3877
  this.config = response.data;
3117
3878
  }
3879
+ /**
3880
+ * Method to load buildInfo.
3881
+ *
3882
+ * Callback will only be called if buildInfo changes; it will not be called when there is no previous value.
3883
+ *
3884
+ * @param {Object} config
3885
+ * @param {string} [config.url] full URL for build-info.json (default is taken from config.cocodaBaseUrl)
3886
+ * @param {Object} [config.buildInfo] current buildInfo
3887
+ * @param {number} [config.interval=60000] interval to load buildInfo in ms
3888
+ * @param {Function} config.callback callback function called with two parameters (error, buildInfo, previousBuildInfo)
3889
+ * @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)
3890
+ */
3118
3891
  loadBuildInfo({ url, buildInfo = null, interval = 6e4, callback, ...config }) {
3119
3892
  if (!url && !this.config.cocodaBaseUrl) {
3120
3893
  throw new CDKError({ message: "Could not determine URL to load build config." });
@@ -3141,20 +3914,64 @@ var CocodaSDK = class {
3141
3914
  }
3142
3915
  });
3143
3916
  }
3917
+ /**
3918
+ * Method to get a registry by URI.
3919
+ *
3920
+ * @param {string} uri URI of registry in config
3921
+ * @returns {?Object} initialized registry from config if found
3922
+ */
3144
3923
  getRegistryForUri(uri) {
3145
3924
  return this.config.registries.find((r) => r.uri == uri);
3146
3925
  }
3926
+ /**
3927
+ * Method to initialize registry.
3928
+ *
3929
+ * @param {Object} registry JSKOS registry object
3930
+ * @returns {Object} initialized registry
3931
+ */
3147
3932
  initializeRegistry(registry) {
3148
3933
  registry = providers.init(registry);
3149
3934
  registry.cdk = this;
3150
3935
  return registry;
3151
3936
  }
3937
+ /**
3938
+ * Method to add custom provider.
3939
+ *
3940
+ * @param {Object} provider provider class that extends BaseProvider
3941
+ */
3152
3942
  addProvider(provider) {
3153
3943
  providers.addProvider(provider);
3154
3944
  }
3945
+ /**
3946
+ * Static method to add custom provider.
3947
+ *
3948
+ * @param {Object} provider provider class that extends BaseProvider
3949
+ */
3155
3950
  static addProvider(provider) {
3156
3951
  providers.addProvider(provider);
3157
3952
  }
3953
+ /**
3954
+ * Repeatedly call a certain function.
3955
+ *
3956
+ * Notes:
3957
+ * - Callback will only be called if the results were changed.
3958
+ * - 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).
3959
+ *
3960
+ * Example:
3961
+ * ```js
3962
+ * cdk.repeat({
3963
+ * function: () => registry.getMappings(),
3964
+ * callback: (error, result) => console.log(result),
3965
+ * })
3966
+ * ```
3967
+ *
3968
+ * @param {Object} config
3969
+ * @param {string} config.function a function to be called (can be async)
3970
+ * @param {number} [config.interval=15000] interval in ms
3971
+ * @param {Function} config.callback callback function called with two parameters (error, result, previousResult)
3972
+ * @param {boolean} [config.callImmediately=true] whether to call the function immediately
3973
+ * @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)
3974
+ */
3158
3975
  repeat({ function: func, interval = 15e3, callback, callImmediately = true } = {}) {
3159
3976
  if (!func) {
3160
3977
  throw new InvalidOrMissingParameterError({ parameter: "function" });
@@ -3241,6 +4058,12 @@ var CocodaSDK = class {
3241
4058
  }
3242
4059
  };
3243
4060
  }
4061
+ /**
4062
+ * Gets schemes from all registries that support schemes and merges the results.
4063
+ *
4064
+ * @param {Object} [config={}] configuration object that will be used as a parameter for internal `getSchemes` calls
4065
+ * @returns {Object[]} array of JSKOS schemes
4066
+ */
3244
4067
  async getSchemes(config = {}) {
3245
4068
  let schemes = [], promises = [];
3246
4069
  for (let registry of this.config.registries) {