-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEscoLanguages.ts
More file actions
52 lines (47 loc) · 1.84 KB
/
EscoLanguages.ts
File metadata and controls
52 lines (47 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { Output, array, equal, length, object, string } from 'valibot';
import ExternalResource from '../../utils/data/models/ExternalResource';
import ISO639Languages from '../library/ISO639Languages';
const EscoLanguagesInputSchema = object({
title: string([equal('languages')]),
links: object({
narrowerSkill: array(object({
href: string(),
uri: string(),
title: string(),
skillType: string(),
})),
}),
});
type EscoLanguagesInput = Output<typeof EscoLanguagesInputSchema>;
const EscoLanguageOutputSchema = array(object({
id: string(),
name: string(),
twoLetterISOLanguageName: string([length(2)]),
threeLetterISOLanguageName: string([length(3)]),
escoUri: string(),
}));
export default new ExternalResource({
name: 'EscoLanguages',
uri: 'https://esco.ec.europa.eu/sites/default/files/languages.json',
parsers: {
input: EscoLanguagesInputSchema,
async transform(escoResponse: EscoLanguagesInput) {
const escoCodeMap = escoResponse.links.narrowerSkill.reduce((acc: any, language: any) => {
const code = language.title.toLocaleLowerCase();
acc[code] = language.uri;
return acc;
}, {});
return ISO639Languages.map((language) => {
const mapCode = language.englishName.toLocaleLowerCase();
return {
id: language.id,
name: language.englishName,
twoLetterISOLanguageName: language.twoLetterISOLanguageName,
threeLetterISOLanguageName: language.threeLetterISOLanguageName,
escoUri: escoCodeMap[mapCode] || 'http://data.europa.eu/esco/skill/L1',
};
});
},
output: EscoLanguageOutputSchema,
},
});