-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathfetch-devfiles.tsx
113 lines (98 loc) · 2.68 KB
/
fetch-devfiles.tsx
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
* Copyright Red Hat
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { getDeprecatedDevfileValue } from '../get-deprecated-devfile-value/get-deprecated-devfile-value';
interface DevfileJsonBase {
name: string;
displayName: string;
description: string;
type: 'sample' | 'stack';
tags: string[];
icon: string;
projectType: string;
language: string;
versions?: VersionDevfile[];
provider?: string;
architectures?: string[];
git?: {
remotes: {
[key: string]: string;
};
};
}
interface DevfileJsonSample extends DevfileJsonBase {
type: 'sample';
versions?: never;
}
interface DevfileJsonStack extends DevfileJsonBase {
type: 'stack';
versions: VersionDevfile[];
}
export type DevfileJson = DevfileJsonSample | DevfileJsonStack;
export interface VersionDevfile {
version: string;
schemaVersion: string;
default: boolean;
description: string;
tags: string[];
icon: string;
links?: {
self: string;
};
resources?: string[];
starterProjects: string[];
architectures?: string[];
}
export interface Registry {
name: string;
url: string;
fqdn?: string;
}
export type Devfile = DevfileJson & {
_registry: Registry;
_deprecated: string;
};
export interface DevfileParams {
devfiles: Devfile[];
total: number;
}
export async function fetchDevfiles(registries: Registry[]): Promise<Devfile[]> {
const responses = await Promise.all(
registries.map((devfileRegistry) => fetch(`${devfileRegistry.url}/v2index/all?icon=base64`)),
);
responses.forEach((response) => {
if (!response.ok) {
throw new Error(response.statusText);
}
});
const devfileJsons: DevfileJson[][] = await Promise.all(
responses.map((r) => (r.json() as Promise<DevfileJson[]>) ?? []),
);
const devfiles: Devfile[] = registries
.flatMap((registry, devfileRegistryIndex) =>
devfileJsons[devfileRegistryIndex].map((devfile) => ({
...devfile,
_registry: registry,
_deprecated: getDeprecatedDevfileValue(devfile),
})),
)
.sort((a, b) =>
a.displayName.localeCompare(b.displayName, 'en', {
sensitivity: 'accent',
}),
);
return devfiles;
}
export default fetchDevfiles;