@ankhorage/repository 0.6.16 → 0.8.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/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/github/index.d.ts +6 -0
- package/dist/github/index.d.ts.map +1 -1
- package/dist/github/index.js +3 -0
- package/dist/github/index.js.map +1 -1
- package/dist/github/index.test.d.ts +2 -0
- package/dist/github/index.test.d.ts.map +1 -0
- package/dist/github/index.test.js +6 -0
- package/dist/github/index.test.js.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.d.ts +17 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.d.ts.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.js +209 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.js.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.test.d.ts +2 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.test.d.ts.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.test.js +195 -0
- package/dist/providers/github/adapters/createGitHubHttpClient.test.js.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryDiscoveryGateway.d.ts +9 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryDiscoveryGateway.d.ts.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryDiscoveryGateway.js +91 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryDiscoveryGateway.js.map +1 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.d.ts +3 -1
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.d.ts.map +1 -1
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.js +41 -60
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.js.map +1 -1
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.test.js +168 -0
- package/dist/providers/github/adapters/createGitHubHttpRepositoryReadGateway.test.js.map +1 -1
- package/dist/providers/github/adapters/rateLimitResponseAsync.d.ts +9 -0
- package/dist/providers/github/adapters/rateLimitResponseAsync.d.ts.map +1 -0
- package/dist/providers/github/adapters/rateLimitResponseAsync.js +44 -0
- package/dist/providers/github/adapters/rateLimitResponseAsync.js.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryOptions.d.ts +10 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryOptions.d.ts.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryOptions.js +2 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryOptions.js.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryResult.d.ts +25 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryResult.d.ts.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryResult.js +12 -0
- package/dist/providers/github/definitions/GitHubRepositoryDiscoveryResult.js.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryMaterializationOptions.d.ts +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryMaterializationOptions.d.ts.map +1 -1
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionOptions.d.ts +9 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionOptions.d.ts.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionOptions.js +2 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionOptions.js.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionResult.d.ts +15 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionResult.d.ts.map +1 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionResult.js +2 -0
- package/dist/providers/github/definitions/GitHubRepositoryRevisionResolutionResult.js.map +1 -0
- package/dist/providers/github/ports/GitHubRepositoryDiscoveryGateway.d.ts +18 -0
- package/dist/providers/github/ports/GitHubRepositoryDiscoveryGateway.d.ts.map +1 -0
- package/dist/providers/github/ports/GitHubRepositoryDiscoveryGateway.js +2 -0
- package/dist/providers/github/ports/GitHubRepositoryDiscoveryGateway.js.map +1 -0
- package/dist/providers/github/ports/GitHubRepositoryReadGateway.d.ts +7 -4
- package/dist/providers/github/ports/GitHubRepositoryReadGateway.d.ts.map +1 -1
- package/dist/providers/github/services/discoverGitHubRepositoriesAsync.d.ts +5 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesAsync.d.ts.map +1 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesAsync.js +9 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesAsync.js.map +1 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.d.ts +6 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.d.ts.map +1 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.js +91 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.js.map +1 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.test.d.ts +2 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.test.d.ts.map +1 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.test.js +55 -0
- package/dist/providers/github/services/discoverGitHubRepositoriesWithGatewayAsync.test.js.map +1 -0
- package/dist/providers/github/services/materializeGitHubRepositoryWithGatewayAsync.d.ts.map +1 -1
- package/dist/providers/github/services/materializeGitHubRepositoryWithGatewayAsync.js +17 -110
- package/dist/providers/github/services/materializeGitHubRepositoryWithGatewayAsync.js.map +1 -1
- package/dist/providers/github/services/materializeGitHubRepositoryWithGatewayAsync.test.js +8 -1
- package/dist/providers/github/services/materializeGitHubRepositoryWithGatewayAsync.test.js.map +1 -1
- package/dist/providers/github/services/parseGitHubRepositoryUrl.d.ts +8 -0
- package/dist/providers/github/services/parseGitHubRepositoryUrl.d.ts.map +1 -0
- package/dist/providers/github/services/parseGitHubRepositoryUrl.js +80 -0
- package/dist/providers/github/services/parseGitHubRepositoryUrl.js.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionAsync.d.ts +5 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionAsync.d.ts.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionAsync.js +9 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionAsync.js.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.d.ts +6 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.d.ts.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.js +20 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.js.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.test.d.ts +2 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.test.d.ts.map +1 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.test.js +111 -0
- package/dist/providers/github/services/resolveGitHubRepositoryRevisionWithGatewayAsync.test.js.map +1 -0
- package/dist/providers/github/services/resolveGitHubUrlRevisionAsync.d.ts +9 -0
- package/dist/providers/github/services/resolveGitHubUrlRevisionAsync.d.ts.map +1 -0
- package/dist/providers/github/services/resolveGitHubUrlRevisionAsync.js +22 -0
- package/dist/providers/github/services/resolveGitHubUrlRevisionAsync.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { GitHubRepositoryDiscoveryError } from '../definitions/GitHubRepositoryDiscoveryResult.js';
|
|
2
|
+
const API_ORIGIN = 'https://api.github.com';
|
|
3
|
+
/** Create the discovery adapter from the shared GitHub HTTP requester. */
|
|
4
|
+
export function createGitHubHttpRepositoryDiscoveryGateway(requestJsonResponseAsync) {
|
|
5
|
+
return {
|
|
6
|
+
resolveOwnerAsync: (owner, signal) => resolveOwnerAsync(requestJsonResponseAsync, owner, signal),
|
|
7
|
+
listOwnerRepositoriesAsync: (owner, signal) => listOwnerRepositoriesAsync(requestJsonResponseAsync, owner, signal),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** Resolve a login through GitHub rather than inferring whether it names a user or organization. */
|
|
11
|
+
async function resolveOwnerAsync(requestJsonResponseAsync, owner, signal) {
|
|
12
|
+
const { value } = await requestJsonResponseAsync(`${API_ORIGIN}/users/${encodeURIComponent(owner)}`, 'owner', signal);
|
|
13
|
+
const record = requireRecord(value, 'owner');
|
|
14
|
+
const type = requireString(record.type, 'owner type');
|
|
15
|
+
if (type !== 'User' && type !== 'Organization') {
|
|
16
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', 'GitHub returned an unsupported owner type.');
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
login: requireString(record.login, 'owner login'),
|
|
20
|
+
type: type === 'Organization' ? 'organization' : 'user',
|
|
21
|
+
url: requireString(record.html_url, 'owner URL'),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Read every page of repositories visible through GitHub's owner listing endpoints. */
|
|
25
|
+
async function listOwnerRepositoriesAsync(requestJsonResponseAsync, owner, signal) {
|
|
26
|
+
const route = owner.type === 'organization' ? 'orgs' : 'users';
|
|
27
|
+
let nextUrl = `${API_ORIGIN}/${route}/${encodeURIComponent(owner.login)}/repos?per_page=100&type=all&sort=full_name&direction=asc`;
|
|
28
|
+
const repositories = new Map();
|
|
29
|
+
while (nextUrl !== undefined) {
|
|
30
|
+
const page = await requestJsonResponseAsync(nextUrl, 'repository list', signal);
|
|
31
|
+
if (!Array.isArray(page.value)) {
|
|
32
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', 'GitHub returned an invalid repository list.');
|
|
33
|
+
}
|
|
34
|
+
for (const value of page.value) {
|
|
35
|
+
const repository = parseDiscoveredRepository(value);
|
|
36
|
+
repositories.set(repository.id, repository);
|
|
37
|
+
}
|
|
38
|
+
nextUrl = nextPageUrl(page.link);
|
|
39
|
+
}
|
|
40
|
+
return [...repositories.values()].sort(compareRepositories);
|
|
41
|
+
}
|
|
42
|
+
/** Parse one listed repository without exposing API-only response data to callers. */
|
|
43
|
+
function parseDiscoveredRepository(value) {
|
|
44
|
+
const record = requireRecord(value, 'repository');
|
|
45
|
+
const { id } = record;
|
|
46
|
+
if (typeof id !== 'number' || !Number.isSafeInteger(id) || id < 1) {
|
|
47
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', 'GitHub returned an invalid repository ID.');
|
|
48
|
+
}
|
|
49
|
+
const owner = requireRecord(record.owner, 'repository owner');
|
|
50
|
+
return {
|
|
51
|
+
id: String(id),
|
|
52
|
+
name: requireString(record.name, 'repository name'),
|
|
53
|
+
owner: requireString(owner.login, 'repository owner login'),
|
|
54
|
+
url: requireString(record.html_url, 'repository URL'),
|
|
55
|
+
visibility: record.private === true ? 'private' : 'public',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Select the next GitHub pagination target while rejecting an unexpected cross-origin link. */
|
|
59
|
+
function nextPageUrl(link) {
|
|
60
|
+
if (!link)
|
|
61
|
+
return undefined;
|
|
62
|
+
const match = /<([^>]+)>;\s*rel="next"/u.exec(link);
|
|
63
|
+
if (!match?.[1])
|
|
64
|
+
return undefined;
|
|
65
|
+
const url = new URL(match[1]);
|
|
66
|
+
if (url.origin !== API_ORIGIN) {
|
|
67
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', 'GitHub returned an invalid pagination URL.');
|
|
68
|
+
}
|
|
69
|
+
return url.href;
|
|
70
|
+
}
|
|
71
|
+
/** Sort repository identities independently of the provider's page ordering. */
|
|
72
|
+
function compareRepositories(left, right) {
|
|
73
|
+
const leftIdentity = `${left.owner.toLowerCase()}/${left.name.toLowerCase()}`;
|
|
74
|
+
const rightIdentity = `${right.owner.toLowerCase()}/${right.name.toLowerCase()}`;
|
|
75
|
+
return leftIdentity < rightIdentity ? -1 : leftIdentity > rightIdentity ? 1 : 0;
|
|
76
|
+
}
|
|
77
|
+
/** Narrow unknown JSON values to object records. */
|
|
78
|
+
function requireRecord(value, subject) {
|
|
79
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
80
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', `GitHub returned invalid ${subject}.`);
|
|
81
|
+
}
|
|
82
|
+
return Object.fromEntries(Object.entries(value));
|
|
83
|
+
}
|
|
84
|
+
/** Require a non-empty provider string field. */
|
|
85
|
+
function requireString(value, subject) {
|
|
86
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
87
|
+
throw new GitHubRepositoryDiscoveryError('api-failure', `GitHub returned invalid ${subject}.`);
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=createGitHubHttpRepositoryDiscoveryGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGitHubHttpRepositoryDiscoveryGateway.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryDiscoveryGateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { GitHubRepositoryDiscoveryGateway } from '../ports/GitHubRepositoryDiscoveryGateway.js';
|
|
1
2
|
import type { GitHubRepositoryReadGateway } from '../ports/GitHubRepositoryReadGateway.js';
|
|
3
|
+
import type { GitHubHttpClientOptions } from './createGitHubHttpClient.js';
|
|
2
4
|
/*** Create the read-only GitHub gateway used to materialize repository snapshots over HTTPS. */
|
|
3
|
-
export declare function createGitHubHttpRepositoryReadGateway(fetcher?: typeof fetch): GitHubRepositoryReadGateway;
|
|
5
|
+
export declare function createGitHubHttpRepositoryReadGateway(fetcher?: typeof fetch, options?: GitHubHttpClientOptions): GitHubRepositoryReadGateway & GitHubRepositoryDiscoveryGateway;
|
|
4
6
|
//# sourceMappingURL=createGitHubHttpRepositoryReadGateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAM5B,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8CAA8C,CAAC;AACrG,OAAO,KAAK,EACV,2BAA2B,EAM5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAO3E,gGAAgG;AAChG,wBAAgB,qCAAqC,CACnD,OAAO,GAAE,OAAO,KAAa,EAC7B,OAAO,GAAE,uBAA4B,GACpC,2BAA2B,GAAG,gCAAgC,CAchE"}
|
|
@@ -1,26 +1,37 @@
|
|
|
1
|
+
import { createGitHubHttpClient } from './createGitHubHttpClient.js';
|
|
2
|
+
import { createGitHubHttpRepositoryDiscoveryGateway } from './createGitHubHttpRepositoryDiscoveryGateway.js';
|
|
3
|
+
const API_ORIGIN = 'https://api.github.com';
|
|
4
|
+
const RAW_ORIGIN = 'https://raw.githubusercontent.com';
|
|
1
5
|
/*** Create the read-only GitHub gateway used to materialize repository snapshots over HTTPS. */
|
|
2
|
-
export function createGitHubHttpRepositoryReadGateway(fetcher = fetch) {
|
|
6
|
+
export function createGitHubHttpRepositoryReadGateway(fetcher = fetch, options = {}) {
|
|
7
|
+
const client = createGitHubHttpClient(fetcher, options);
|
|
8
|
+
const discoveryGateway = createGitHubHttpRepositoryDiscoveryGateway((url, subject, signal) => client.requestJsonResponseAsync(url, subject, signal));
|
|
3
9
|
return {
|
|
4
|
-
inspectRepositoryAsync: (target) => inspectRepositoryAsync(
|
|
5
|
-
resolveRevisionAsync: (target, ref) => resolveRevisionAsync(
|
|
6
|
-
readTreeAsync: (target, treeSha) => readTreeAsync(
|
|
7
|
-
readFileAsync: (target, revision, path) => readFileAsync(
|
|
10
|
+
inspectRepositoryAsync: (target, signal) => inspectRepositoryAsync(client, target, signal),
|
|
11
|
+
resolveRevisionAsync: (target, ref, signal) => resolveRevisionAsync(client, target, ref, signal),
|
|
12
|
+
readTreeAsync: (target, treeSha, signal) => readTreeAsync(client, target, treeSha, signal),
|
|
13
|
+
readFileAsync: (target, revision, path, signal) => readFileAsync(client, target, revision, path, signal),
|
|
14
|
+
...discoveryGateway,
|
|
8
15
|
};
|
|
9
16
|
}
|
|
10
|
-
const API_ORIGIN = 'https://api.github.com';
|
|
11
|
-
const RAW_ORIGIN = 'https://raw.githubusercontent.com';
|
|
12
17
|
/*** Read repository metadata without mutating provider state. */
|
|
13
|
-
async function inspectRepositoryAsync(
|
|
14
|
-
const value = await
|
|
15
|
-
const record = requireRecord(value, 'repository metadata');
|
|
18
|
+
async function inspectRepositoryAsync(client, target, signal) {
|
|
19
|
+
const value = await client.requestJsonResponseAsync(`${API_ORIGIN}/repos/${encodeURIComponent(target.owner)}/${encodeURIComponent(target.name)}`, 'repository metadata', signal);
|
|
20
|
+
const record = requireRecord(value.value, 'repository metadata');
|
|
16
21
|
const defaultBranch = requireString(record.default_branch, 'repository default branch');
|
|
17
|
-
const
|
|
18
|
-
return {
|
|
22
|
+
const owner = requireRecord(record.owner, 'repository owner');
|
|
23
|
+
return {
|
|
24
|
+
id: String(requireSafeInteger(record.id, 'repository ID')),
|
|
25
|
+
owner: requireString(owner.login, 'repository owner login'),
|
|
26
|
+
name: requireString(record.name, 'repository name'),
|
|
27
|
+
defaultBranch,
|
|
28
|
+
url: requireString(record.html_url, 'repository URL'),
|
|
29
|
+
};
|
|
19
30
|
}
|
|
20
31
|
/*** Resolve a branch, tag, or commit ref to an immutable commit and tree SHA. */
|
|
21
|
-
async function resolveRevisionAsync(
|
|
22
|
-
const value = await
|
|
23
|
-
const record = requireRecord(value, 'repository revision');
|
|
32
|
+
async function resolveRevisionAsync(client, target, ref, signal) {
|
|
33
|
+
const value = await client.requestJsonResponseAsync(`${API_ORIGIN}/repos/${encodeURIComponent(target.owner)}/${encodeURIComponent(target.name)}/commits/${encodeURIComponent(ref)}`, 'repository revision', signal);
|
|
34
|
+
const record = requireRecord(value.value, 'repository revision');
|
|
24
35
|
const commit = requireRecord(record.commit, 'repository commit');
|
|
25
36
|
const tree = requireRecord(commit.tree, 'repository commit tree');
|
|
26
37
|
return {
|
|
@@ -29,9 +40,9 @@ async function resolveRevisionAsync(fetcher, target, ref) {
|
|
|
29
40
|
};
|
|
30
41
|
}
|
|
31
42
|
/*** Read the complete recursive tree for one immutable Git tree SHA. */
|
|
32
|
-
async function readTreeAsync(
|
|
33
|
-
const value = await
|
|
34
|
-
const record = requireRecord(value, 'repository tree');
|
|
43
|
+
async function readTreeAsync(client, target, treeSha, signal) {
|
|
44
|
+
const value = await client.requestJsonResponseAsync(`${API_ORIGIN}/repos/${encodeURIComponent(target.owner)}/${encodeURIComponent(target.name)}/git/trees/${encodeURIComponent(treeSha)}?recursive=1`, 'repository tree', signal);
|
|
45
|
+
const record = requireRecord(value.value, 'repository tree');
|
|
35
46
|
if (!Array.isArray(record.tree))
|
|
36
47
|
throw new Error('GitHub returned an invalid repository tree.');
|
|
37
48
|
return {
|
|
@@ -40,27 +51,22 @@ async function readTreeAsync(fetcher, target, treeSha) {
|
|
|
40
51
|
};
|
|
41
52
|
}
|
|
42
53
|
/*** Read one file from an immutable GitHub revision without executing repository code. */
|
|
43
|
-
async function readFileAsync(
|
|
54
|
+
async function readFileAsync(client, target, revision, path, signal) {
|
|
44
55
|
const encodedPath = path
|
|
45
56
|
.split('/')
|
|
46
57
|
.map((segment) => encodeURIComponent(segment))
|
|
47
58
|
.join('/');
|
|
48
|
-
|
|
49
|
-
if (!response.ok)
|
|
50
|
-
throw requestError(response, 'repository file');
|
|
51
|
-
return new Uint8Array(await response.arrayBuffer());
|
|
59
|
+
return client.requestBytesAsync(`${RAW_ORIGIN}/${encodeURIComponent(target.owner)}/${encodeURIComponent(target.name)}/${encodeURIComponent(revision)}/${encodedPath}`, 'repository file', signal);
|
|
52
60
|
}
|
|
53
61
|
/*** Parse one Git tree item while rejecting malformed provider responses. */
|
|
54
62
|
function parseTreeEntry(value) {
|
|
55
63
|
const record = requireRecord(value, 'repository tree entry');
|
|
56
64
|
const type = requireString(record.type, 'repository tree entry type');
|
|
57
|
-
if (type !== 'blob' && type !== 'tree' && type !== 'commit')
|
|
65
|
+
if (type !== 'blob' && type !== 'tree' && type !== 'commit')
|
|
58
66
|
throw new Error(`GitHub returned an unsupported repository tree entry type: ${type}.`);
|
|
59
|
-
}
|
|
60
67
|
const { size } = record;
|
|
61
|
-
if (size !== undefined && (typeof size !== 'number' || !Number.isSafeInteger(size) || size < 0))
|
|
68
|
+
if (size !== undefined && (typeof size !== 'number' || !Number.isSafeInteger(size) || size < 0))
|
|
62
69
|
throw new Error('GitHub returned an invalid repository tree entry size.');
|
|
63
|
-
}
|
|
64
70
|
return {
|
|
65
71
|
mode: requireString(record.mode, 'repository tree entry mode'),
|
|
66
72
|
path: requireString(record.path, 'repository tree entry path'),
|
|
@@ -69,47 +75,22 @@ function parseTreeEntry(value) {
|
|
|
69
75
|
...(size === undefined ? {} : { size }),
|
|
70
76
|
};
|
|
71
77
|
}
|
|
72
|
-
/*** Request GitHub JSON with stable safe errors and optional standard token authentication. */
|
|
73
|
-
async function requestJsonAsync(fetcher, url) {
|
|
74
|
-
const response = await fetcher(url, {
|
|
75
|
-
headers: requestHeaders(),
|
|
76
|
-
signal: AbortSignal.timeout(30_000),
|
|
77
|
-
});
|
|
78
|
-
if (!response.ok)
|
|
79
|
-
throw requestError(response, 'repository metadata');
|
|
80
|
-
try {
|
|
81
|
-
return await response.json();
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
throw new Error('GitHub returned malformed JSON.', { cause: error });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/*** Build GitHub request headers without exposing credentials to callers or errors. */
|
|
88
|
-
function requestHeaders() {
|
|
89
|
-
const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
|
|
90
|
-
return {
|
|
91
|
-
Accept: 'application/vnd.github+json',
|
|
92
|
-
'User-Agent': '@ankhorage/repository',
|
|
93
|
-
'X-GitHub-Api-Version': '2022-11-28',
|
|
94
|
-
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
/*** Convert one failed provider response into a credential-free diagnostic. */
|
|
98
|
-
function requestError(response, subject) {
|
|
99
|
-
return new Error(`GitHub ${subject} request failed with HTTP ${response.status}.`);
|
|
100
|
-
}
|
|
101
78
|
/*** Narrow unknown JSON values to object records. */
|
|
102
79
|
function requireRecord(value, subject) {
|
|
103
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
80
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
104
81
|
throw new Error(`GitHub returned invalid ${subject}.`);
|
|
105
|
-
}
|
|
106
82
|
return Object.fromEntries(Object.entries(value));
|
|
107
83
|
}
|
|
108
84
|
/*** Require a non-empty provider string field. */
|
|
109
85
|
function requireString(value, subject) {
|
|
110
|
-
if (typeof value !== 'string' || value.trim() === '')
|
|
86
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
87
|
+
throw new Error(`GitHub returned invalid ${subject}.`);
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
/** Require a safe integer GitHub resource ID before exposing its canonical string form. */
|
|
91
|
+
function requireSafeInteger(value, subject) {
|
|
92
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
|
|
111
93
|
throw new Error(`GitHub returned invalid ${subject}.`);
|
|
112
|
-
}
|
|
113
94
|
return value;
|
|
114
95
|
}
|
|
115
96
|
//# sourceMappingURL=createGitHubHttpRepositoryReadGateway.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ test('reads repository metadata, immutable revision, tree, and raw file content'
|
|
|
9
9
|
url: 'https://github.com/ankhorage/demo',
|
|
10
10
|
};
|
|
11
11
|
expect(await gateway.inspectRepositoryAsync(target)).toEqual({
|
|
12
|
+
id: '1',
|
|
13
|
+
owner: 'ankhorage',
|
|
14
|
+
name: 'demo',
|
|
12
15
|
defaultBranch: 'main',
|
|
13
16
|
url: 'https://github.com/ankhorage/demo',
|
|
14
17
|
});
|
|
@@ -31,6 +34,131 @@ test('reads repository metadata, immutable revision, tree, and raw file content'
|
|
|
31
34
|
expect(Buffer.from(await gateway.readFileAsync(target, 'commit-sha', 'src/index.ts')).toString()).toBe('0123456789');
|
|
32
35
|
expect(urls).toContain('https://raw.githubusercontent.com/ankhorage/demo/commit-sha/src/index.ts');
|
|
33
36
|
});
|
|
37
|
+
test('resolves an organization and returns every sorted repository page', async () => {
|
|
38
|
+
const urls = [];
|
|
39
|
+
const gateway = createGitHubHttpRepositoryReadGateway(createDiscoveryFetchFixture(urls), {
|
|
40
|
+
waitAsync: () => Promise.resolve(),
|
|
41
|
+
});
|
|
42
|
+
const owner = await gateway.resolveOwnerAsync('ankhorage');
|
|
43
|
+
const repositories = await gateway.listOwnerRepositoriesAsync(owner);
|
|
44
|
+
expect(owner).toEqual({
|
|
45
|
+
login: 'Ankhorage',
|
|
46
|
+
type: 'organization',
|
|
47
|
+
url: 'https://github.com/Ankhorage',
|
|
48
|
+
});
|
|
49
|
+
expect(repositories).toEqual([
|
|
50
|
+
{
|
|
51
|
+
id: '1',
|
|
52
|
+
name: 'atlas',
|
|
53
|
+
owner: 'Ankhorage',
|
|
54
|
+
url: 'https://github.com/Ankhorage/atlas',
|
|
55
|
+
visibility: 'public',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: '2',
|
|
59
|
+
name: 'zora',
|
|
60
|
+
owner: 'Ankhorage',
|
|
61
|
+
url: 'https://github.com/Ankhorage/zora',
|
|
62
|
+
visibility: 'public',
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
expect(urls).toHaveLength(3);
|
|
66
|
+
});
|
|
67
|
+
test('retries a GitHub rate limit and returns a stable rate-limit error after its retry budget', async () => {
|
|
68
|
+
let calls = 0;
|
|
69
|
+
const gateway = createGitHubHttpRepositoryReadGateway(((_input) => {
|
|
70
|
+
calls += 1;
|
|
71
|
+
return Promise.resolve(calls === 1
|
|
72
|
+
? new Response('', { status: 429, headers: { 'retry-after': '0' } })
|
|
73
|
+
: Response.json({
|
|
74
|
+
login: 'Ankhorage',
|
|
75
|
+
type: 'Organization',
|
|
76
|
+
html_url: 'https://github.com/Ankhorage',
|
|
77
|
+
}));
|
|
78
|
+
}), { waitAsync: () => Promise.resolve() });
|
|
79
|
+
expect(await gateway.resolveOwnerAsync('ankhorage')).toMatchObject({ type: 'organization' });
|
|
80
|
+
expect(calls).toBe(2);
|
|
81
|
+
const rateLimitedGateway = createGitHubHttpRepositoryReadGateway(((_input) => Promise.resolve(new Response('', { status: 429, headers: { 'retry-after': '0' } }))), { waitAsync: () => Promise.resolve() });
|
|
82
|
+
expect(rateLimitedGateway.resolveOwnerAsync('ankhorage')).rejects.toMatchObject({
|
|
83
|
+
code: 'rate-limited',
|
|
84
|
+
retryAfterMilliseconds: 0,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
test('maps an aborted request to a stable cancellation error', () => {
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
controller.abort();
|
|
90
|
+
const gateway = createGitHubHttpRepositoryReadGateway(((_input) => Promise.reject(new DOMException('Aborted', 'AbortError'))));
|
|
91
|
+
expect(gateway.resolveOwnerAsync('ankhorage', controller.signal)).rejects.toMatchObject({
|
|
92
|
+
code: 'cancelled',
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
test.each([
|
|
96
|
+
[
|
|
97
|
+
'metadata',
|
|
98
|
+
(gateway) => gateway.inspectRepositoryAsync(target()),
|
|
99
|
+
],
|
|
100
|
+
[
|
|
101
|
+
'revision',
|
|
102
|
+
(gateway) => gateway.resolveRevisionAsync(target(), 'main'),
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
'tree',
|
|
106
|
+
(gateway) => gateway.readTreeAsync(target(), 'tree-sha'),
|
|
107
|
+
],
|
|
108
|
+
[
|
|
109
|
+
'discovery',
|
|
110
|
+
(gateway) => gateway.resolveOwnerAsync('ankhorage'),
|
|
111
|
+
],
|
|
112
|
+
])('times out a hanging %s request', (_subject, request) => {
|
|
113
|
+
const gateway = createGitHubHttpRepositoryReadGateway(((_input) => new Promise(() => undefined)), { timeoutMilliseconds: 0 });
|
|
114
|
+
expect(request(gateway)).rejects.toMatchObject({ code: 'timeout' });
|
|
115
|
+
});
|
|
116
|
+
test('retries a secondary rate limit but does not retry a permission-only 403', () => {
|
|
117
|
+
let secondaryCalls = 0;
|
|
118
|
+
const secondaryGateway = createGitHubHttpRepositoryReadGateway(((_input) => {
|
|
119
|
+
secondaryCalls += 1;
|
|
120
|
+
return Promise.resolve(secondaryCalls === 1
|
|
121
|
+
? new Response('', { status: 403, headers: { 'retry-after': '0' } })
|
|
122
|
+
: Response.json({
|
|
123
|
+
login: 'Ankhorage',
|
|
124
|
+
type: 'Organization',
|
|
125
|
+
html_url: 'https://github.com/Ankhorage',
|
|
126
|
+
}));
|
|
127
|
+
}), { waitAsync: () => Promise.resolve() });
|
|
128
|
+
expect(secondaryGateway.resolveOwnerAsync('ankhorage')).resolves.toMatchObject({
|
|
129
|
+
type: 'organization',
|
|
130
|
+
});
|
|
131
|
+
expect(secondaryCalls).toBe(2);
|
|
132
|
+
let permissionCalls = 0;
|
|
133
|
+
const permissionGateway = createGitHubHttpRepositoryReadGateway(((_input) => {
|
|
134
|
+
permissionCalls += 1;
|
|
135
|
+
return Promise.resolve(new Response('', { status: 403 }));
|
|
136
|
+
}));
|
|
137
|
+
expect(permissionGateway.resolveOwnerAsync('ankhorage')).rejects.toMatchObject({
|
|
138
|
+
code: 'permission-denied',
|
|
139
|
+
});
|
|
140
|
+
expect(permissionCalls).toBe(1);
|
|
141
|
+
});
|
|
142
|
+
test('cancels during response processing and retry waits', () => {
|
|
143
|
+
const responseController = new AbortController();
|
|
144
|
+
const responseGateway = createGitHubHttpRepositoryReadGateway(((_input) => Promise.resolve({
|
|
145
|
+
ok: true,
|
|
146
|
+
headers: new Headers(),
|
|
147
|
+
json: () => new Promise(() => undefined),
|
|
148
|
+
})));
|
|
149
|
+
const responseRequest = responseGateway.resolveOwnerAsync('ankhorage', responseController.signal);
|
|
150
|
+
responseController.abort();
|
|
151
|
+
expect(responseRequest).rejects.toMatchObject({ code: 'cancelled' });
|
|
152
|
+
const retryController = new AbortController();
|
|
153
|
+
const retryGateway = createGitHubHttpRepositoryReadGateway(((_input) => Promise.resolve(new Response('', { status: 429, headers: { 'retry-after': '10' } }))));
|
|
154
|
+
const retryRequest = retryGateway.resolveOwnerAsync('ankhorage', retryController.signal);
|
|
155
|
+
retryController.abort();
|
|
156
|
+
expect(retryRequest).rejects.toMatchObject({ code: 'cancelled' });
|
|
157
|
+
});
|
|
158
|
+
/** Create a stable repository target used by HTTP gateway behavior tests. */
|
|
159
|
+
function target() {
|
|
160
|
+
return { owner: 'ankhorage', name: 'demo', url: 'https://github.com/ankhorage/demo' };
|
|
161
|
+
}
|
|
34
162
|
function createFetchFixture(urls) {
|
|
35
163
|
return ((input) => {
|
|
36
164
|
const url = requestUrl(input);
|
|
@@ -48,6 +176,9 @@ function requestUrl(input) {
|
|
|
48
176
|
function responseForUrl(url) {
|
|
49
177
|
if (url.endsWith('/repos/ankhorage/demo')) {
|
|
50
178
|
return Response.json({
|
|
179
|
+
id: 1,
|
|
180
|
+
name: 'demo',
|
|
181
|
+
owner: { login: 'ankhorage' },
|
|
51
182
|
default_branch: 'main',
|
|
52
183
|
html_url: 'https://github.com/ankhorage/demo',
|
|
53
184
|
});
|
|
@@ -77,4 +208,41 @@ function responseForUrl(url) {
|
|
|
77
208
|
}
|
|
78
209
|
return new Response('', { status: 404 });
|
|
79
210
|
}
|
|
211
|
+
function createDiscoveryFetchFixture(urls) {
|
|
212
|
+
return ((input) => {
|
|
213
|
+
const url = requestUrl(input);
|
|
214
|
+
urls.push(url);
|
|
215
|
+
if (url.endsWith('/users/ankhorage')) {
|
|
216
|
+
return Promise.resolve(Response.json({
|
|
217
|
+
login: 'Ankhorage',
|
|
218
|
+
type: 'Organization',
|
|
219
|
+
html_url: 'https://github.com/Ankhorage',
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
if (url.includes('page=2')) {
|
|
223
|
+
return Promise.resolve(Response.json([
|
|
224
|
+
{
|
|
225
|
+
id: 2,
|
|
226
|
+
name: 'zora',
|
|
227
|
+
owner: { login: 'Ankhorage' },
|
|
228
|
+
html_url: 'https://github.com/Ankhorage/zora',
|
|
229
|
+
private: false,
|
|
230
|
+
},
|
|
231
|
+
]));
|
|
232
|
+
}
|
|
233
|
+
return Promise.resolve(Response.json([
|
|
234
|
+
{
|
|
235
|
+
id: 1,
|
|
236
|
+
name: 'atlas',
|
|
237
|
+
owner: { login: 'Ankhorage' },
|
|
238
|
+
html_url: 'https://github.com/Ankhorage/atlas',
|
|
239
|
+
private: false,
|
|
240
|
+
},
|
|
241
|
+
], {
|
|
242
|
+
headers: {
|
|
243
|
+
link: '<https://api.github.com/orgs/Ankhorage/repos?per_page=100&type=all&sort=full_name&direction=asc&page=2>; rel="next"',
|
|
244
|
+
},
|
|
245
|
+
}));
|
|
246
|
+
});
|
|
247
|
+
}
|
|
80
248
|
//# sourceMappingURL=createGitHubHttpRepositoryReadGateway.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.test.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createGitHubHttpRepositoryReadGateway.test.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/createGitHubHttpRepositoryReadGateway.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*** Classify GitHub primary, secondary, and Retry-After rate-limit responses. */
|
|
2
|
+
export declare function rateLimitResponseAsync(response: Response, now: () => number, readMessageAsync: ReadGitHubErrorMessageAsync): Promise<GitHubRateLimitResponse>;
|
|
3
|
+
export interface GitHubRateLimitResponse {
|
|
4
|
+
readonly isRateLimited: boolean;
|
|
5
|
+
readonly retryAfterMilliseconds?: number;
|
|
6
|
+
}
|
|
7
|
+
type ReadGitHubErrorMessageAsync = (response: Response) => Promise<string | undefined>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=rateLimitResponseAsync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitResponseAsync.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/adapters/rateLimitResponseAsync.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,MAAM,EACjB,gBAAgB,EAAE,2BAA2B,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CAiBlC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED,KAAK,2BAA2B,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*** Classify GitHub primary, secondary, and Retry-After rate-limit responses. */
|
|
2
|
+
export async function rateLimitResponseAsync(response, now, readMessageAsync) {
|
|
3
|
+
const retryAfterMilliseconds = readRetryAfterMilliseconds(response);
|
|
4
|
+
if (response.status !== 403 && response.status !== 429)
|
|
5
|
+
return { isRateLimited: false };
|
|
6
|
+
const primaryRateLimitExceeded = response.headers.get('x-ratelimit-remaining') === '0';
|
|
7
|
+
if (primaryRateLimitExceeded) {
|
|
8
|
+
return {
|
|
9
|
+
isRateLimited: true,
|
|
10
|
+
retryAfterMilliseconds: laterRateLimitDeadlineMilliseconds(readResetDelayMilliseconds(response, now), retryAfterMilliseconds),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (response.status === 429)
|
|
14
|
+
return { isRateLimited: true, retryAfterMilliseconds };
|
|
15
|
+
if (retryAfterMilliseconds !== undefined)
|
|
16
|
+
return { isRateLimited: true, retryAfterMilliseconds };
|
|
17
|
+
const message = await readMessageAsync(response);
|
|
18
|
+
return { isRateLimited: message !== undefined && /\bsecondary rate limit\b/iu.test(message) };
|
|
19
|
+
}
|
|
20
|
+
/*** Keep every provider-required rate-limit deadline by selecting the later valid delay. */
|
|
21
|
+
function laterRateLimitDeadlineMilliseconds(primaryResetDelayMilliseconds, retryAfterMilliseconds) {
|
|
22
|
+
if (primaryResetDelayMilliseconds === undefined)
|
|
23
|
+
return retryAfterMilliseconds;
|
|
24
|
+
if (retryAfterMilliseconds === undefined)
|
|
25
|
+
return primaryResetDelayMilliseconds;
|
|
26
|
+
return Math.max(primaryResetDelayMilliseconds, retryAfterMilliseconds);
|
|
27
|
+
}
|
|
28
|
+
/*** Read a syntactically valid non-negative Retry-After delay without discarding provider timing. */
|
|
29
|
+
function readRetryAfterMilliseconds(response) {
|
|
30
|
+
const value = response.headers.get('retry-after');
|
|
31
|
+
if (!value || !/^\d+(?:\.\d+)?$/u.test(value))
|
|
32
|
+
return undefined;
|
|
33
|
+
const milliseconds = Number(value) * 1000;
|
|
34
|
+
return Number.isSafeInteger(milliseconds) ? milliseconds : undefined;
|
|
35
|
+
}
|
|
36
|
+
/*** Read a valid primary-rate-limit reset timestamp without discarding a delay beyond the retry budget. */
|
|
37
|
+
function readResetDelayMilliseconds(response, now) {
|
|
38
|
+
const value = response.headers.get('x-ratelimit-reset');
|
|
39
|
+
if (!value || !/^\d+$/u.test(value))
|
|
40
|
+
return undefined;
|
|
41
|
+
const milliseconds = Number(value) * 1000 - now();
|
|
42
|
+
return Number.isSafeInteger(milliseconds) && milliseconds >= 0 ? milliseconds : undefined;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=rateLimitResponseAsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitResponseAsync.js","sourceRoot":"","sources":["../../../../src/providers/github/adapters/rateLimitResponseAsync.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAkB,EAClB,GAAiB,EACjB,gBAA6C;IAE7C,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACxF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG,CAAC;IACvF,IAAI,wBAAwB,EAAE,CAAC;QAC7B,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,sBAAsB,EAAE,kCAAkC,CACxD,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,EACzC,sBAAsB,CACvB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;IACpF,IAAI,sBAAsB,KAAK,SAAS;QAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;IACjG,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,EAAE,aAAa,EAAE,OAAO,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAChG,CAAC;AASD,4FAA4F;AAC5F,SAAS,kCAAkC,CACzC,6BAAiD,EACjD,sBAA0C;IAE1C,IAAI,6BAA6B,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC;IAC/E,IAAI,sBAAsB,KAAK,SAAS;QAAE,OAAO,6BAA6B,CAAC;IAC/E,OAAO,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,sBAAsB,CAAC,CAAC;AACzE,CAAC;AAED,qGAAqG;AACrG,SAAS,0BAA0B,CAAC,QAAkB;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,OAAO,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,2GAA2G;AAC3G,SAAS,0BAA0B,CAAC,QAAkB,EAAE,GAAiB;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;IAClD,OAAO,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Explicit credential policy for GitHub operations that may be exposed through an application endpoint. */
|
|
2
|
+
export type GitHubRepositoryAuthentication = 'anonymous' | 'environment';
|
|
3
|
+
/** Options for discovering the repositories visible under one GitHub owner source. */
|
|
4
|
+
export interface GitHubRepositoryDiscoveryOptions {
|
|
5
|
+
readonly source: string;
|
|
6
|
+
/** Defaults to anonymous access so a public discovery endpoint cannot inherit server credentials. */
|
|
7
|
+
readonly authentication?: GitHubRepositoryAuthentication;
|
|
8
|
+
readonly signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=GitHubRepositoryDiscoveryOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubRepositoryDiscoveryOptions.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/definitions/GitHubRepositoryDiscoveryOptions.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,MAAM,8BAA8B,GAAG,WAAW,GAAG,aAAa,CAAC;AAEzE,sFAAsF;AACtF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,QAAQ,CAAC,cAAc,CAAC,EAAE,8BAA8B,CAAC;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubRepositoryDiscoveryOptions.js","sourceRoot":"","sources":["../../../../src/providers/github/definitions/GitHubRepositoryDiscoveryOptions.ts"],"names":[],"mappings":""}
|