cocoda-sdk 1.0.13 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +74 -28
  3. package/dist/cjs/index.cjs +2673 -0
  4. package/dist/cocoda-sdk.js +33 -17423
  5. package/dist/cocoda-sdk.js.LICENSES.txt +105 -86
  6. package/dist/cocoda-sdk.js.map +7 -0
  7. package/dist/esm/errors/index.js +46 -0
  8. package/dist/esm/index.js +9 -0
  9. package/dist/esm/lib/CocodaSDK.js +269 -0
  10. package/dist/esm/providers/base-provider.js +368 -0
  11. package/dist/esm/providers/concept-api-provider.js +278 -0
  12. package/dist/esm/providers/index.js +20 -0
  13. package/dist/esm/providers/label-search-suggestion-provider.js +101 -0
  14. package/dist/esm/providers/loc-api-provider.js +185 -0
  15. package/dist/esm/providers/local-mappings-provider.js +337 -0
  16. package/dist/esm/providers/mappings-api-provider.js +264 -0
  17. package/dist/esm/providers/occurrences-api-provider.js +163 -0
  18. package/dist/esm/providers/reconciliation-api-provider.js +140 -0
  19. package/dist/esm/providers/skosmos-api-provider.js +345 -0
  20. package/{utils → dist/esm/utils}/index.js +40 -53
  21. package/dist/esm/utils/lodash.js +34 -0
  22. package/package.json +16 -17
  23. package/errors/index.js +0 -119
  24. package/index.js +0 -5
  25. package/lib/CocodaSDK.js +0 -360
  26. package/providers/base-provider.js +0 -581
  27. package/providers/concept-api-provider.js +0 -377
  28. package/providers/index.js +0 -34
  29. package/providers/label-search-suggestion-provider.js +0 -219
  30. package/providers/loc-api-provider.js +0 -275
  31. package/providers/local-mappings-provider.js +0 -459
  32. package/providers/mappings-api-provider.js +0 -396
  33. package/providers/occurrences-api-provider.js +0 -234
  34. package/providers/reconciliation-api-provider.js +0 -211
  35. package/providers/skosmos-api-provider.js +0 -441
  36. package/utils/lodash.js +0 -21
@@ -1,275 +0,0 @@
1
- const BaseProvider = require("./base-provider")
2
- const errors = require("../errors")
3
- const jskos = require("jskos-tools")
4
- const axios = require("axios")
5
-
6
- const locUriPrefix = "http://id.loc.gov/authorities/"
7
- const supportedSchemes = [
8
- {
9
- uri: `${locUriPrefix}subjects`,
10
- identifier: [
11
- "http://bartoc.org/en/node/454",
12
- ],
13
- notation: ["LCSH"],
14
- concepts: [null],
15
- topConcepts: [],
16
- },
17
- {
18
- uri: `${locUriPrefix}names`,
19
- identifier: [
20
- "http://bartoc.org/en/node/18536",
21
- ],
22
- notation: ["LCNAF"],
23
- concepts: [null],
24
- topConcepts: [],
25
- },
26
- ]
27
- const lccUri = `${locUriPrefix}classification`
28
-
29
- function madsToJskosItem(data) {
30
- const item = {}
31
- item.uri = data["@id"]
32
- // Notation
33
- item.notation = (data["http://www.loc.gov/mads/rdf/v1#code"] || []).map(n => n["@value"])
34
- // prefLabel
35
- const prefLabelArray = data["http://www.loc.gov/mads/rdf/v1#authoritativeLabel"] || data["http://www.w3.org/2000/01/rdf-schema#label"] || []
36
- if (prefLabelArray.length) {
37
- item.prefLabel = {}
38
- item.prefLabel[prefLabelArray[0]["@language"] || "en"] = prefLabelArray[0]["@value"]
39
- }
40
- // altLabel
41
- const altLabelArray = data["http://www.w3.org/2004/02/skos/core#altLabel"] || []
42
- if (altLabelArray.length) {
43
- item.altLabel = { en: altLabelArray.map(l => l["@value"]) }
44
- }
45
- // definition
46
- for (let definition of data["http://www.w3.org/2000/01/rdf-schema#comment"] || []) {
47
- item.definition = item.definition || {}
48
- item.definition.en = item.definition.en || []
49
- item.definition.en.push(definition["@value"])
50
- }
51
- return item
52
- }
53
-
54
- function madsToJskosScheme(data) {
55
- const scheme = madsToJskosItem(data)
56
- scheme.namespace = scheme.uri + "/"
57
- scheme.type = ["http://www.w3.org/2004/02/skos/core#ConceptScheme"]
58
- // TODO: topConcepts can possibly be reenabled for LCC
59
- // const topConcepts = data["http://www.loc.gov/mads/rdf/v1#hasMADSSchemeMember"]
60
- // if (scheme.uri === lccUri && topConcepts) {
61
- // scheme.topConcepts = topConcepts.map(c => {
62
- // const concept = madsToJskosItem(c)
63
- // concept.inScheme = [{ uri: scheme.uri }]
64
- // return concept
65
- // })
66
- // }
67
- return scheme
68
- }
69
-
70
- function madsToJskosConcept(data, { scheme }) {
71
- const concept = madsToJskosItem(data)
72
- concept.type = ["http://www.w3.org/2004/02/skos/core#Concept"]
73
- concept.inScheme = scheme ? [scheme] : (data["http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme"] || []).map(s => supportedSchemes.find(s2 => s2.uri === s["@id"]))
74
- if (!concept.inScheme.length || !concept.inScheme[0]) {
75
- // TODO: Should conversion fail if inScheme couldn't be set?
76
- delete concept.inScheme
77
- }
78
- // narrower
79
- const narrower = data["http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority"] || (jskos.compare(concept.inScheme[0], { uri: lccUri }) && data["http://www.loc.gov/mads/rdf/v1#hasMADSCollectionMember"]) || []
80
- concept.narrower = narrower.map(n => ({ uri: n["@id"] }))
81
- // broader
82
- const broader = data["http://www.loc.gov/mads/rdf/v1#hasBroaderAuthority"] || (jskos.compare(concept.inScheme[0], { uri: lccUri }) && data["http://www.loc.gov/mads/rdf/v1#isMemberOfMADSCollection"]) || []
83
- concept.broader = broader.map(n => ({ uri: n["@id"] }))
84
- return concept
85
- }
86
-
87
- /**
88
- * Library of Congress API (experimental)
89
- *
90
- * This class provides access to concept schemes and their concepts via the Library of Congress Linked Open Data Service (https://id.loc.gov/), in [JSKOS format](https://gbv.github.io/jskos/).
91
- *
92
- * To use it in a registry, specify `provider` as "LocApi":
93
- * ```json
94
- * {
95
- * "uri": "http://coli-conc.gbv.de/registry/loc-concepts",
96
- * "provider": "LocApi",
97
- * }
98
- * ```
99
- *
100
- * No further configuration is needed. Currently supported are LC Subject Headings (LCSH) and LC Name Authority File (LCNAF), both of which are hardcoded.
101
- *
102
- * Additionally, the following JSKOS properties on the registry can be provided: `prefLabel`, `notation`, `definition` (i.e. to be shown in Cocoda)
103
- *
104
- * @extends BaseProvider
105
- * @category Providers
106
- */
107
- class LocApiProvider extends BaseProvider {
108
-
109
- /**
110
- * @private
111
- */
112
- _setup() {
113
- this.has.schemes = true
114
- this.has.top = false
115
- this.has.data = true
116
- this.has.concepts = true
117
- this.has.narrower = true
118
- this.has.ancestors = false
119
- this.has.suggest = true
120
- this.has.search = true
121
- }
122
-
123
- /**
124
- * Returns all concept schemes.
125
- *
126
- * @returns {Object[]} array of JSKOS concept scheme objects
127
- */
128
- async getSchemes() {
129
- const schemes = []
130
-
131
- for (let scheme of await Promise.all(
132
- supportedSchemes.filter(s => !this.schemes || !this.schemes.length || this.schemes.find(s2 => jskos.compare(s, s2))).map(s => axios({
133
- method: "get",
134
- url: `${s.uri.replace("http:", "https:")}.json`,
135
- }).then(({ status, data }) => {
136
- if (status === 200) {
137
- let scheme = data.find(d => s.uri === d["@id"])
138
- if (scheme) {
139
- scheme = jskos.merge(madsToJskosScheme(scheme), s)
140
- scheme.topConcepts = (scheme.topConcepts || []).filter(c => c)
141
- return scheme
142
- }
143
- }
144
- return null
145
- })))) {
146
- if (scheme) {
147
- schemes.push(scheme)
148
- }
149
- }
150
-
151
- return schemes
152
- }
153
-
154
- /**
155
- * TODO: Possibly reenable for LCC
156
- * Returns top concepts for a concept scheme.
157
- *
158
- * @param {Object} config
159
- * @param {Object} config.scheme concept scheme object
160
- * @returns {Object[]} array of JSKOS concept objects
161
- */
162
- // async getTop({ scheme }) {
163
- // if (scheme.topConcepts && !scheme.topConcepts.includes(null)) {
164
- // return scheme.topConcepts
165
- // }
166
- // const schemes = await this.getSchemes()
167
- // scheme = schemes.find(s => jskos.compare(s, scheme))
168
- // return scheme && scheme.topConcepts || []
169
- // }
170
-
171
- /**
172
- * Returns details for a list of concepts.
173
- *
174
- * @param {Object} config
175
- * @param {Object[]} config.concepts list of concept objects to load
176
- * @returns {Object[]} array of JSKOS concept objects
177
- */
178
- async getConcepts({ concepts }) {
179
- if (!Array.isArray(concepts)) {
180
- concepts = [concepts]
181
- }
182
-
183
- const resultConcepts = []
184
-
185
- for (let concept of await Promise.all(concepts.map(c => axios({
186
- method: "get",
187
- url: `${c.uri.replace("http:", "https:")}.json`,
188
- }).then(({ status, data }) => {
189
- if (status === 200) {
190
- let concept = data.find(d => c.uri === d["@id"])
191
- if (concept) {
192
- return madsToJskosConcept(concept, { scheme: c.inScheme && c.inScheme[0] })
193
- }
194
- return null
195
- }
196
-
197
- })))) {
198
- if (concept) {
199
- resultConcepts.push(concept)
200
- }
201
- }
202
-
203
- return resultConcepts
204
- }
205
-
206
- /**
207
- * Returns suggestion result in OpenSearch Suggest Format.
208
- *
209
- * @param {Object} config
210
- * @param {string} config.search search string
211
- * @param {Object} config.scheme concept scheme to search in
212
- * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
213
- * @param {number} [config.offset=0] offset
214
- * @returns {Array} result in OpenSearch Suggest Format
215
- */
216
- async suggest(config) {
217
- const results = await this.search(config)
218
- return [
219
- config.search,
220
- results.map(c => {
221
- let string = ""
222
- const notation = jskos.notation(c)
223
- if (notation) {
224
- string += notation + " "
225
- }
226
- string += jskos.prefLabel(c, { fallbackToUri: string === "" })
227
- return string
228
- }),
229
- [],
230
- results.map(c => c.uri),
231
- ]
232
- }
233
-
234
- /**
235
- * Returns search results in JSKOS Format.
236
- *
237
- * @param {Object} config
238
- * @param {string} config.search search string
239
- * @param {Object} config.scheme concept scheme to search in
240
- * @param {number} [config.limit=100] maximum number of search results (default might be overridden by registry)
241
- * @param {number} [config.offset=0] offset
242
- * @returns {Array} result in JSKOS Format
243
- */
244
- async search({ search, scheme, limit, offset }) {
245
- const schemeUri = jskos.getAllUris(scheme).find(uri => uri.startsWith(locUriPrefix))
246
- if (!schemeUri || !supportedSchemes.find(s => jskos.compare(s, { uri: schemeUri }))) {
247
- throw new errors.InvalidOrMissingParameterError({ parameter: "scheme", message: "provided scheme is not supported (yet)" })
248
- }
249
- if (!search) {
250
- throw new errors.InvalidOrMissingParameterError({ parameter: "search", message: "parameter is empty or missing" })
251
- }
252
- limit = limit || this._jskos.suggestResultLimit || 100
253
- offset = offset || 0
254
- const { data } = await axios({
255
- method: "get",
256
- url: `${schemeUri}/suggest2`.replace("http:", "https:"),
257
- params: {
258
- q: search,
259
- count: limit || 100,
260
- offset,
261
- searchtype: "keyword",
262
- },
263
- })
264
- return (data.hits || []).map(d => ({
265
- uri: d.uri,
266
- notation: [d.token],
267
- prefLabel: { en: d.aLabel },
268
- inScheme: [scheme],
269
- }))
270
- }
271
-
272
- }
273
-
274
- LocApiProvider.providerName = "LocApi"
275
- module.exports = LocApiProvider