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.
- package/LICENSE +1 -1
- package/README.md +74 -28
- package/dist/cjs/index.cjs +2673 -0
- package/dist/cocoda-sdk.js +33 -17423
- package/dist/cocoda-sdk.js.LICENSES.txt +105 -86
- package/dist/cocoda-sdk.js.map +7 -0
- package/dist/esm/errors/index.js +46 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/lib/CocodaSDK.js +269 -0
- package/dist/esm/providers/base-provider.js +368 -0
- package/dist/esm/providers/concept-api-provider.js +278 -0
- package/dist/esm/providers/index.js +20 -0
- package/dist/esm/providers/label-search-suggestion-provider.js +101 -0
- package/dist/esm/providers/loc-api-provider.js +185 -0
- package/dist/esm/providers/local-mappings-provider.js +337 -0
- package/dist/esm/providers/mappings-api-provider.js +264 -0
- package/dist/esm/providers/occurrences-api-provider.js +163 -0
- package/dist/esm/providers/reconciliation-api-provider.js +140 -0
- package/dist/esm/providers/skosmos-api-provider.js +345 -0
- package/{utils → dist/esm/utils}/index.js +40 -53
- package/dist/esm/utils/lodash.js +34 -0
- package/package.json +16 -17
- package/errors/index.js +0 -119
- package/index.js +0 -5
- package/lib/CocodaSDK.js +0 -360
- package/providers/base-provider.js +0 -581
- package/providers/concept-api-provider.js +0 -377
- package/providers/index.js +0 -34
- package/providers/label-search-suggestion-provider.js +0 -219
- package/providers/loc-api-provider.js +0 -275
- package/providers/local-mappings-provider.js +0 -459
- package/providers/mappings-api-provider.js +0 -396
- package/providers/occurrences-api-provider.js +0 -234
- package/providers/reconciliation-api-provider.js +0 -211
- package/providers/skosmos-api-provider.js +0 -441
- 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
|