-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
core.ts
82 lines (75 loc) · 2.46 KB
/
core.ts
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
/*
* Copyright 2020 Spotify AB
*
* 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 parseGitUrl from 'git-url-parse';
import { GitHubIntegrationConfig } from './config';
/**
* Given a URL pointing to a file on a provider, returns a URL that is suitable
* for fetching the contents of the data.
*
* Converts
* from: https://github.com/a/b/blob/branchname/path/to/c.yaml
* to: https://api.github.com/repos/a/b/contents/path/to/c.yaml?ref=branchname
* or: https://raw.githubusercontent.com/a/b/branchname/c.yaml
*
* @param url A URL pointing to a file
* @param config The relevant provider config
*/
export function getGitHubFileFetchUrl(
url: string,
config: GitHubIntegrationConfig,
): string {
try {
const { owner, name, ref, filepathtype, filepath } = parseGitUrl(url);
if (
!owner ||
!name ||
!ref ||
(filepathtype !== 'blob' && filepathtype !== 'raw')
) {
throw new Error('Invalid GitHub URL or file path');
}
const pathWithoutSlash = filepath.replace(/^\//, '');
if (chooseEndpoint(config) === 'api') {
return `${config.apiBaseUrl}/repos/${owner}/${name}/contents/${pathWithoutSlash}?ref=${ref}`;
}
return `${config.rawBaseUrl}/${owner}/${name}/${ref}/${pathWithoutSlash}`;
} catch (e) {
throw new Error(`Incorrect URL: ${url}, ${e}`);
}
}
/**
* Gets the request options necessary to make requests to a given provider.
*
* @param config The relevant provider config
*/
export function getGitHubRequestOptions(
config: GitHubIntegrationConfig,
): RequestInit {
const headers: HeadersInit = {};
if (chooseEndpoint(config) === 'api') {
headers.Accept = 'application/vnd.github.v3.raw';
}
if (config.token) {
headers.Authorization = `token ${config.token}`;
}
return { headers };
}
export function chooseEndpoint(config: GitHubIntegrationConfig): 'api' | 'raw' {
if (config.apiBaseUrl && (config.token || !config.rawBaseUrl)) {
return 'api';
}
return 'raw';
}