cocoda-sdk 3.3.3 → 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 [];
@@ -2082,6 +2568,15 @@ var LabelSearchSuggestionProvider = class extends BaseProvider {
2082
2568
  }
2083
2569
  return mappings;
2084
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
+ */
2085
2580
  async _getResults({ label, targetScheme, limit, ...config }) {
2086
2581
  let resultsFromCache = (this._cache[targetScheme.uri] || {})[label];
2087
2582
  if (resultsFromCache && resultsFromCache._limit >= limit) {
@@ -2113,6 +2608,9 @@ LabelSearchSuggestionProvider.stored = false;
2113
2608
  // src/providers/skosmos-api-provider.js
2114
2609
  var import_jskos_tools8 = __toESM(require("jskos-tools"), 1);
2115
2610
  var SkosmosApiProvider = class extends BaseProvider {
2611
+ /**
2612
+ * @private
2613
+ */
2116
2614
  _prepare() {
2117
2615
  this.has.schemes = true;
2118
2616
  this.has.top = true;
@@ -2127,6 +2625,14 @@ var SkosmosApiProvider = class extends BaseProvider {
2127
2625
  this.has[c] = false;
2128
2626
  });
2129
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
+ */
2130
2636
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2131
2637
  if (!url || !scheme) {
2132
2638
  return null;
@@ -2141,9 +2647,15 @@ var SkosmosApiProvider = class extends BaseProvider {
2141
2647
  config.schemes = [scheme];
2142
2648
  return config;
2143
2649
  }
2650
+ /**
2651
+ * @private
2652
+ */
2144
2653
  get _language() {
2145
2654
  return this.languages[0] || this._defaultLanguages[0] || "en";
2146
2655
  }
2656
+ /**
2657
+ * @private
2658
+ */
2147
2659
  _getApiUrl(scheme, endpoint, params) {
2148
2660
  const VOCID = scheme && scheme.VOCID || import_get.default(this.schemes.find((s) => import_jskos_tools8.default.compare(s, scheme)), "VOCID");
2149
2661
  if (!VOCID) {
@@ -2157,6 +2669,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2157
2669
  const paramString = Object.keys(params).map((k) => `${k}=${encodeURIComponent(params[k])}`).join("&");
2158
2670
  return `${this._api.api}${VOCID}${endpoint}${paramString ? "?" + paramString : ""}`;
2159
2671
  }
2672
+ /**
2673
+ * @private
2674
+ */
2160
2675
  _getDataUrl(concept, { addFormatParameter = true } = {}) {
2161
2676
  const scheme = import_get.default(concept, "inScheme[0]");
2162
2677
  if (!concept || !concept.uri) {
@@ -2164,6 +2679,11 @@ var SkosmosApiProvider = class extends BaseProvider {
2164
2679
  }
2165
2680
  return this._getApiUrl(scheme, "/data", addFormatParameter ? { format: "application/json" } : {});
2166
2681
  }
2682
+ /**
2683
+ * Returns the main vocabulary URI by requesting the scheme info and saving it in a cache.
2684
+ *
2685
+ * @private
2686
+ */
2167
2687
  async _getSchemeUri(scheme) {
2168
2688
  this._approvedSchemes = this._approvedSchemes || [];
2169
2689
  this._rejectedSchemes = this._rejectedSchemes || [];
@@ -2194,6 +2714,9 @@ var SkosmosApiProvider = class extends BaseProvider {
2194
2714
  return null;
2195
2715
  }
2196
2716
  }
2717
+ /**
2718
+ * @private
2719
+ */
2197
2720
  _toJskosConcept(skosmosConcept, { concept, scheme, result, language } = {}) {
2198
2721
  if (!skosmosConcept) {
2199
2722
  return null;
@@ -2266,6 +2789,12 @@ var SkosmosApiProvider = class extends BaseProvider {
2266
2789
  }
2267
2790
  return concept;
2268
2791
  }
2792
+ /**
2793
+ * Returns all concept schemes.
2794
+ *
2795
+ * @param {Object} config
2796
+ * @returns {Object[]} array of JSKOS concept scheme objects
2797
+ */
2269
2798
  async getSchemes({ ...config }) {
2270
2799
  const schemes = [];
2271
2800
  for (let scheme of this.schemes || []) {
@@ -2291,6 +2820,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2291
2820
  }
2292
2821
  return schemes;
2293
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
+ */
2294
2830
  async getTop({ scheme, ...config }) {
2295
2831
  const url = this._getApiUrl(scheme, "/topConcepts");
2296
2832
  const schemeUri = await this._getSchemeUri(scheme);
@@ -2314,6 +2850,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2314
2850
  }
2315
2851
  return concepts;
2316
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
+ */
2317
2860
  async getConcepts({ concepts, ...config }) {
2318
2861
  if (!import_isArray.default(concepts)) {
2319
2862
  concepts = [concepts];
@@ -2353,6 +2896,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2353
2896
  }
2354
2897
  return newConcepts;
2355
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
+ */
2356
2906
  async getNarrower({ concept, ...config }) {
2357
2907
  if (!concept || !concept.uri) {
2358
2908
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2368,6 +2918,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2368
2918
  const concepts = (response.narrower || []).map((c) => this._toJskosConcept(c, { scheme }));
2369
2919
  return concepts;
2370
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
+ */
2371
2928
  async getAncestors({ concept, ...config }) {
2372
2929
  if (!concept || !concept.uri) {
2373
2930
  throw new InvalidOrMissingParameterError({ parameter: "concept" });
@@ -2392,6 +2949,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2392
2949
  const concepts = ancestors.map((c) => this._toJskosConcept(c, { scheme })).filter((c) => c.uri != concept.uri);
2393
2950
  return concepts;
2394
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
+ */
2395
2962
  async suggest(config) {
2396
2963
  config._raw = true;
2397
2964
  const concepts = await this.search(config);
@@ -2410,6 +2977,16 @@ var SkosmosApiProvider = class extends BaseProvider {
2410
2977
  }
2411
2978
  return result;
2412
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
+ */
2413
2990
  async search({ search, scheme, limit, types = [], ...config }) {
2414
2991
  const url = this._getApiUrl(scheme, "/search");
2415
2992
  import_set.default(config, "params.query", `${search}*`);
@@ -2424,6 +3001,13 @@ var SkosmosApiProvider = class extends BaseProvider {
2424
3001
  const concepts = (response.results || []).map((c) => this._toJskosConcept(c, { scheme }));
2425
3002
  return concepts;
2426
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
+ */
2427
3011
  async getTypes({ scheme, ...config }) {
2428
3012
  const url = this._getApiUrl(scheme, "/types");
2429
3013
  const types = [];
@@ -2522,6 +3106,9 @@ function madsToJskosConcept(data3, { scheme }) {
2522
3106
  return concept;
2523
3107
  }
2524
3108
  var LocApiProvider = class extends BaseProvider {
3109
+ /**
3110
+ * @private
3111
+ */
2525
3112
  _prepare() {
2526
3113
  this.has.schemes = true;
2527
3114
  this.has.top = false;
@@ -2535,6 +3122,13 @@ var LocApiProvider = class extends BaseProvider {
2535
3122
  this.has[c] = false;
2536
3123
  });
2537
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
+ */
2538
3132
  static _registryConfigForBartocApiConfig({ scheme } = {}) {
2539
3133
  if (!scheme || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, scheme))) {
2540
3134
  return null;
@@ -2543,6 +3137,11 @@ var LocApiProvider = class extends BaseProvider {
2543
3137
  schemes: [scheme]
2544
3138
  };
2545
3139
  }
3140
+ /**
3141
+ * Returns all concept schemes.
3142
+ *
3143
+ * @returns {Object[]} array of JSKOS concept scheme objects
3144
+ */
2546
3145
  async getSchemes() {
2547
3146
  const schemes = [];
2548
3147
  for (let scheme of await Promise.all(
@@ -2567,6 +3166,29 @@ var LocApiProvider = class extends BaseProvider {
2567
3166
  }
2568
3167
  return schemes;
2569
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
+ */
2570
3192
  async getConcepts({ concepts }) {
2571
3193
  if (!Array.isArray(concepts)) {
2572
3194
  concepts = [concepts];
@@ -2590,6 +3212,16 @@ var LocApiProvider = class extends BaseProvider {
2590
3212
  }
2591
3213
  return resultConcepts;
2592
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
+ */
2593
3225
  async suggest(config) {
2594
3226
  const results = await this.search(config);
2595
3227
  return [
@@ -2601,6 +3233,16 @@ var LocApiProvider = class extends BaseProvider {
2601
3233
  results.map((c) => c.uri)
2602
3234
  ];
2603
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
+ */
2604
3246
  async search({ search, scheme, limit, offset }) {
2605
3247
  const schemeUri = import_jskos_tools9.default.getAllUris(scheme).find((uri) => uri.startsWith(locUriPrefix));
2606
3248
  if (!schemeUri || !supportedSchemes.find((s) => import_jskos_tools9.default.compare(s, { uri: schemeUri }))) {
@@ -2672,6 +3314,14 @@ var SkohubProvider = class extends BaseProvider {
2672
3314
  get _schemeCache() {
2673
3315
  return data[this.uri] && data[this.uri].schemeCache;
2674
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
+ */
2675
3325
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2676
3326
  if (!url || !scheme) {
2677
3327
  return null;
@@ -2801,6 +3451,15 @@ var SkohubProvider = class extends BaseProvider {
2801
3451
  concept = await this._loadConcept({ ...config, uri: concept.uri });
2802
3452
  return concept.narrower;
2803
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
+ */
2804
3463
  async search({ search, scheme, limit = 100 }) {
2805
3464
  scheme = await this._loadScheme({ scheme });
2806
3465
  if (!scheme || !scheme.uri) {
@@ -2846,6 +3505,15 @@ var SkohubProvider = class extends BaseProvider {
2846
3505
  const concepts = await this.getConcepts({ concepts: result.map((uri) => ({ uri })) });
2847
3506
  return concepts.slice(0, limit);
2848
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
+ */
2849
3517
  async suggest(config) {
2850
3518
  config._raw = true;
2851
3519
  const concepts = await this.search(config);
@@ -2889,6 +3557,14 @@ var MyCoReProvider = class extends BaseProvider {
2889
3557
  _setup() {
2890
3558
  this._scheme = null;
2891
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
+ */
2892
3568
  static _registryConfigForBartocApiConfig({ url, scheme } = {}) {
2893
3569
  if (!url || !scheme) {
2894
3570
  return null;
@@ -2897,6 +3573,9 @@ var MyCoReProvider = class extends BaseProvider {
2897
3573
  api: url
2898
3574
  };
2899
3575
  }
3576
+ /**
3577
+ * Converts scheme info (full scheme data that comes from the API) to a JSKOS scheme
3578
+ */
2900
3579
  _schemeInfoToJSKOS(schemeInfo) {
2901
3580
  const uri = schemeInfo.labels.find((l) => l.lang === "x-uri").text;
2902
3581
  const prefLabel = {};
@@ -2915,6 +3594,13 @@ var MyCoReProvider = class extends BaseProvider {
2915
3594
  }
2916
3595
  return scheme;
2917
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
+ */
2918
3604
  _categoryToJSKOS(category, { scheme, broader = [] }) {
2919
3605
  if (!category || !scheme) {
2920
3606
  return null;
@@ -2947,11 +3633,17 @@ var MyCoReProvider = class extends BaseProvider {
2947
3633
  };
2948
3634
  return data2[scheme.uri].concepts[uri];
2949
3635
  }
3636
+ /**
3637
+ * Helper function that replaces `narrower` key with [null] if it has values. Use this before returning concepts.
3638
+ */
2950
3639
  _removeNarrower(concept) {
2951
3640
  if (!concept)
2952
3641
  return concept;
2953
3642
  return Object.assign({}, concept, { narrower: concept.narrower && concept.narrower.length ? [null] : [] });
2954
3643
  }
3644
+ /**
3645
+ * Loads the data from the API. Only called from getSchemes and only called once.
3646
+ */
2955
3647
  async _loadSchemeData(config) {
2956
3648
  const schemeInfo = await this.axios({
2957
3649
  ...config,
@@ -3038,6 +3730,15 @@ var MyCoReProvider = class extends BaseProvider {
3038
3730
  concept = data2[this._scheme.uri].concepts[concept.uri];
3039
3731
  return (concept && concept.narrower || []).map((c) => data2[this._scheme.uri].concepts[c.uri]).map(this._removeNarrower);
3040
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
+ */
3041
3742
  async search({ search, scheme, limit = 100 }) {
3042
3743
  if (!scheme || !scheme.uri) {
3043
3744
  throw new InvalidOrMissingParameterError({ parameter: "scheme" });
@@ -3057,6 +3758,15 @@ var MyCoReProvider = class extends BaseProvider {
3057
3758
  const result = await data2[this._scheme.uri].searchIndex.search(search);
3058
3759
  return result.map((uri) => data2[this._scheme.uri].concepts[uri]).map(this._removeNarrower).slice(0, limit);
3059
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
+ */
3060
3770
  async suggest(config) {
3061
3771
  config._raw = true;
3062
3772
  const concepts = await this.search(config);
@@ -3100,16 +3810,37 @@ providers.addProvider(ConceptApiProvider);
3100
3810
  providers.addProvider(MappingsApiProvider);
3101
3811
  var registryCache = {};
3102
3812
  var CocodaSDK = class {
3813
+ /**
3814
+ * CDK constructor.
3815
+ *
3816
+ * @param {Object} [config={}] Cocoda-stye config object
3817
+ */
3103
3818
  constructor(config) {
3104
3819
  this.config = config;
3105
3820
  this.axios = import_axios3.default.create();
3106
3821
  }
3822
+ /**
3823
+ * Method to set the configuration.
3824
+ *
3825
+ * @param {Object} config Cocoda-stye config object
3826
+ */
3107
3827
  setConfig(config) {
3108
3828
  this.config = config;
3109
3829
  }
3830
+ /**
3831
+ * Current configuration.
3832
+ *
3833
+ * @returns {Object} current configuration
3834
+ */
3110
3835
  get config() {
3111
3836
  return this._config;
3112
3837
  }
3838
+ /**
3839
+ * Prepares config when set.
3840
+ *
3841
+ * @param {Object} config Cocoda config object
3842
+ * @private
3843
+ */
3113
3844
  set config(config) {
3114
3845
  config = config || {};
3115
3846
  config.registries = config.registries || [];
@@ -3119,16 +3850,44 @@ var CocodaSDK = class {
3119
3850
  });
3120
3851
  this._config = config;
3121
3852
  }
3853
+ /**
3854
+ * Map of registered providers.
3855
+ *
3856
+ * @returns {Object} map of registered providers (name -> provider)
3857
+ */
3122
3858
  get providers() {
3123
3859
  return providers;
3124
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
+ */
3125
3867
  createInstance(config) {
3126
3868
  return new CocodaSDK(config);
3127
3869
  }
3870
+ /**
3871
+ * Offer method to load a config file from URL.
3872
+ *
3873
+ * @param {string} url URL of config as JSON
3874
+ */
3128
3875
  async loadConfig(url) {
3129
3876
  const response = await this.axios.get(url);
3130
3877
  this.config = response.data;
3131
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
+ */
3132
3891
  loadBuildInfo({ url, buildInfo = null, interval = 6e4, callback, ...config }) {
3133
3892
  if (!url && !this.config.cocodaBaseUrl) {
3134
3893
  throw new CDKError({ message: "Could not determine URL to load build config." });
@@ -3155,20 +3914,64 @@ var CocodaSDK = class {
3155
3914
  }
3156
3915
  });
3157
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
+ */
3158
3923
  getRegistryForUri(uri) {
3159
3924
  return this.config.registries.find((r) => r.uri == uri);
3160
3925
  }
3926
+ /**
3927
+ * Method to initialize registry.
3928
+ *
3929
+ * @param {Object} registry JSKOS registry object
3930
+ * @returns {Object} initialized registry
3931
+ */
3161
3932
  initializeRegistry(registry) {
3162
3933
  registry = providers.init(registry);
3163
3934
  registry.cdk = this;
3164
3935
  return registry;
3165
3936
  }
3937
+ /**
3938
+ * Method to add custom provider.
3939
+ *
3940
+ * @param {Object} provider provider class that extends BaseProvider
3941
+ */
3166
3942
  addProvider(provider) {
3167
3943
  providers.addProvider(provider);
3168
3944
  }
3945
+ /**
3946
+ * Static method to add custom provider.
3947
+ *
3948
+ * @param {Object} provider provider class that extends BaseProvider
3949
+ */
3169
3950
  static addProvider(provider) {
3170
3951
  providers.addProvider(provider);
3171
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
+ */
3172
3975
  repeat({ function: func, interval = 15e3, callback, callImmediately = true } = {}) {
3173
3976
  if (!func) {
3174
3977
  throw new InvalidOrMissingParameterError({ parameter: "function" });
@@ -3255,6 +4058,12 @@ var CocodaSDK = class {
3255
4058
  }
3256
4059
  };
3257
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
+ */
3258
4067
  async getSchemes(config = {}) {
3259
4068
  let schemes = [], promises = [];
3260
4069
  for (let registry of this.config.registries) {