@rock-js/provider-github 0.8.13

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/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @rock-js/provider-github
2
+
3
+ GitHub Actions artifact storage provider for Rock (Rock). This package is part of the Rock ecosystem.
4
+
5
+ ## Documentation
6
+
7
+ For detailed documentation about Rock and its tools, visit [Rock Documentation](https://rockjs.dev)
@@ -0,0 +1 @@
1
+ export { providerGitHub } from './lib/providerGitHub.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { providerGitHub } from './lib/providerGitHub.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type RemoteArtifact } from '@rock-js/tools';
2
+ import { type GitHubRepoDetails } from './config.js';
3
+ type GitHubArtifact = {
4
+ id: number;
5
+ name: string;
6
+ expiresAt: string | null;
7
+ sizeInBytes: number;
8
+ downloadUrl: string;
9
+ };
10
+ export declare function fetchGitHubArtifactsByName(name: string | undefined, repoDetails: GitHubRepoDetails, limit?: number): Promise<GitHubArtifact[] | []>;
11
+ export declare function deleteGitHubArtifacts(artifacts: GitHubArtifact[], repoDetails: GitHubRepoDetails, artifactName: string): Promise<RemoteArtifact[]>;
12
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,KAAK,cAAc,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAgBF,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,WAAW,EAAE,iBAAiB,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAsFhC;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,cAAc,EAAE,EAC3B,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkC3B"}
@@ -0,0 +1,98 @@
1
+ import { cacheManager, color, colorLink, logger, RockError, } from '@rock-js/tools';
2
+ const PAGE_SIZE = 100; // Maximum allowed by GitHub API
3
+ export async function fetchGitHubArtifactsByName(name, repoDetails, limit) {
4
+ let page = 1;
5
+ const result = [];
6
+ const owner = repoDetails.owner;
7
+ const repo = repoDetails.repository;
8
+ try {
9
+ while (true) {
10
+ const url = `https://api.github.com/repos/${owner}/${repo}/actions/artifacts?per_page=${limit ?? PAGE_SIZE}&page=${page}${name ? `&name=${name}` : ''}`;
11
+ let data;
12
+ try {
13
+ const response = await fetch(url, {
14
+ headers: { Authorization: `token ${repoDetails.token}` },
15
+ });
16
+ if (!response.ok) {
17
+ throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
18
+ }
19
+ data = await response.json();
20
+ }
21
+ catch (error) {
22
+ throw new Error(`Error fetching artifacts from ${colorLink(url)}: ${error}`);
23
+ }
24
+ const artifacts = data.artifacts
25
+ .filter((artifact) => !artifact.expired && artifact.workflow_run?.id)
26
+ .map((artifact) => ({
27
+ id: artifact.id,
28
+ name: artifact.name,
29
+ sizeInBytes: artifact.size_in_bytes,
30
+ expiresAt: artifact.expires_at,
31
+ downloadUrl: artifact.archive_download_url,
32
+ }));
33
+ result.push(...artifacts);
34
+ if (artifacts.length < PAGE_SIZE) {
35
+ break;
36
+ }
37
+ page += 1;
38
+ }
39
+ }
40
+ catch (error) {
41
+ if (error.message.includes('401 Unauthorized')) {
42
+ cacheManager.remove('githubToken');
43
+ throw new RockError(`Failed to fetch GitHub artifacts due to invalid or expired GitHub Personal Access Token provided.
44
+ Update the token under "${color.bold('remoteCacheProvider')}" key in ${colorLink('rock.config.mjs')} config file.
45
+
46
+ 📘 Read more about generating a new token: ${colorLink('https://rockjs.dev/docs/github-actions/configuration#generate-github-personal-access-token-for-downloading-cached-builds')}`);
47
+ }
48
+ if (error.message.includes('404 Not Found')) {
49
+ throw new RockError(`Failed to fetch GitHub artifacts due to "404 Not Found" error. This can happen for the following reasons:
50
+ - permission mismatch between your GitHub Personal Access Token and the repository
51
+ - you're blocked by the owner of the repository
52
+ - repository address is incorrect
53
+
54
+ Make sure the repository information and token under "${color.bold('remoteCacheProvider')}" key in ${colorLink('rock.config.mjs')} config file is valid.
55
+
56
+ 📘 Read more about generating a new token: ${colorLink('https://rockjs.dev/docs/github-actions/configuration#generate-github-personal-access-token-for-downloading-cached-builds')}`);
57
+ }
58
+ throw new RockError(`Failed to fetch GitHub artifacts`, { cause: error });
59
+ }
60
+ result.sort((a, b) => {
61
+ const expiresA = a.expiresAt ?? '0000-00-00';
62
+ const expiresB = b.expiresAt ?? '0000-00-00';
63
+ // Sort in descending order
64
+ return expiresB.localeCompare(expiresA);
65
+ });
66
+ return result;
67
+ }
68
+ export async function deleteGitHubArtifacts(artifacts, repoDetails, artifactName) {
69
+ const deletedArtifacts = [];
70
+ try {
71
+ const owner = repoDetails.owner;
72
+ const repo = repoDetails.repository;
73
+ // Delete all matching artifacts
74
+ for (const artifact of artifacts) {
75
+ const artifactId = artifact.id;
76
+ const url = `https://api.github.com/repos/${owner}/${repo}/actions/artifacts/${artifactId}`;
77
+ const response = await fetch(url, {
78
+ method: 'DELETE',
79
+ headers: {
80
+ Authorization: `Bearer ${repoDetails.token}`,
81
+ Accept: 'application/vnd.github+json',
82
+ },
83
+ });
84
+ if (!response.ok) {
85
+ logger.warn(`Failed to delete artifact ID ${artifactId}: ${response.status} ${response.statusText}`);
86
+ continue;
87
+ }
88
+ deletedArtifacts.push({ name: artifact.name, url: artifact.downloadUrl });
89
+ }
90
+ return deletedArtifacts;
91
+ }
92
+ catch (error) {
93
+ throw new RockError(`Failed to delete artifacts named "${artifactName}"`, {
94
+ cause: error,
95
+ });
96
+ }
97
+ }
98
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function getGitHubToken(): string | undefined;
2
+ export declare function promptForGitHubToken(): Promise<string>;
3
+ export type GitHubRepoDetails = {
4
+ owner: string;
5
+ repository: string;
6
+ token: string;
7
+ };
8
+ export declare function detectGitHubRepoDetails(): Promise<GitHubRepoDetails>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAuBA,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED,wBAAsB,oBAAoB,oBAQzC;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAmC1E"}
@@ -0,0 +1,53 @@
1
+ import { cacheManager, colorLink, logger, promptPassword, RockError, spawn, } from '@rock-js/tools';
2
+ import * as r from 'ts-regex-builder';
3
+ import { getGitRemote } from './getGitRemote.js';
4
+ const GITHUB_REPO_REGEX = r.buildRegExp([
5
+ r.startOfString,
6
+ r.choiceOf('git@', 'https://'),
7
+ r.oneOrMore(/[^:/]/),
8
+ r.anyOf(':/'),
9
+ r.capture(r.oneOrMore(/[^/]/)), // organization
10
+ '/',
11
+ r.capture(r.oneOrMore(r.any, { greedy: false })), // repository
12
+ r.optional('.git'),
13
+ r.endOfString,
14
+ ]);
15
+ export function getGitHubToken() {
16
+ return cacheManager.get('githubToken');
17
+ }
18
+ export async function promptForGitHubToken() {
19
+ const githubToken = (await promptPassword({
20
+ message: 'Paste your GitHub Personal Access Token',
21
+ validate: (value) => value.length === 0 ? 'Value is required.' : undefined,
22
+ }));
23
+ cacheManager.set('githubToken', githubToken);
24
+ return githubToken;
25
+ }
26
+ export async function detectGitHubRepoDetails() {
27
+ const gitRemote = await getGitRemote();
28
+ try {
29
+ const { output: url } = await spawn('git', ['config', '--get', `remote.${gitRemote}.url`], { stdio: 'pipe' });
30
+ const match = url.match(GITHUB_REPO_REGEX);
31
+ if (!match) {
32
+ throw new RockError(`The remote URL "${url}" doesn't look like a GitHub repo.`);
33
+ }
34
+ let token = getGitHubToken();
35
+ if (!token) {
36
+ logger.warn(`No GitHub Personal Access Token found necessary to download cached builds.
37
+ Please generate one at: ${colorLink('https://github.com/settings/tokens')}
38
+ Include "repo", "workflow", and "read:org" permissions.`);
39
+ token = await promptForGitHubToken();
40
+ }
41
+ return {
42
+ owner: match[1],
43
+ repository: match[2],
44
+ token,
45
+ };
46
+ }
47
+ catch (error) {
48
+ throw new RockError('Unable to detect GitHub repository details.', {
49
+ cause: error,
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,MAAM,EACN,cAAc,EACd,SAAS,EACT,KAAK,GACN,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,iBAAiB,GAAG,CAAC,CAAC,WAAW,CAAC;IACtC,CAAC,CAAC,aAAa;IACf,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC9B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACb,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe;IAC/C,GAAG;IACH,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,aAAa;IAC/D,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClB,CAAC,CAAC,WAAW;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,WAAW,GAAG,CAAC,MAAM,cAAc,CAAC;QACxC,OAAO,EAAE,yCAAyC;QAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC,CAAW,CAAC;IACd,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7C,OAAO,WAAW,CAAC;AACrB,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,CACjC,KAAK,EACL,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,SAAS,MAAM,CAAC,EAC9C,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QAEF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,SAAS,CACjB,mBAAmB,GAAG,oCAAoC,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CACT;0BACkB,SAAS,CAAC,oCAAoC,CAAC;wDACjB,CACjD,CAAC;YACF,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACvC,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,6CAA6C,EAAE;YACjE,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function getGitRemote(): Promise<string | null>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGitRemote.d.ts","sourceRoot":"","sources":["../../../src/lib/getGitRemote.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,2BA2BjC"}
@@ -0,0 +1,29 @@
1
+ import { cacheManager, promptSelect, spawn } from '@rock-js/tools';
2
+ export async function getGitRemote() {
3
+ let gitRemote = cacheManager.get('gitRemote');
4
+ if (gitRemote) {
5
+ return gitRemote;
6
+ }
7
+ const { output: remoteOutput } = await spawn('git', ['remote'], {
8
+ stdio: 'pipe',
9
+ });
10
+ const remotes = remoteOutput.split('\n').filter(Boolean);
11
+ if (remotes.length > 1) {
12
+ gitRemote = await promptSelect({
13
+ message: 'Select git remote of the upstream repository:',
14
+ options: remotes.map((remote) => ({
15
+ value: remote,
16
+ label: remote,
17
+ })),
18
+ });
19
+ cacheManager.set('gitRemote', gitRemote);
20
+ }
21
+ else if (remotes.length === 1) {
22
+ gitRemote = remotes[0];
23
+ }
24
+ else {
25
+ return null;
26
+ }
27
+ return gitRemote;
28
+ }
29
+ //# sourceMappingURL=getGitRemote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGitRemote.js","sourceRoot":"","sources":["../../../src/lib/getGitRemote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC9D,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,SAAS,GAAG,MAAM,YAAY,CAAC;YAC7B,OAAO,EAAE,+CAA+C;YACxD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { RemoteArtifact, RemoteBuildCache } from '@rock-js/tools';
2
+ import { type GitHubRepoDetails } from './config.js';
3
+ export declare class GitHubBuildCache implements RemoteBuildCache {
4
+ name: string;
5
+ repoDetails: GitHubRepoDetails | null;
6
+ constructor(config?: {
7
+ owner: string;
8
+ repository: string;
9
+ token: string;
10
+ });
11
+ getRepoDetails(): Promise<GitHubRepoDetails>;
12
+ list({ artifactName, limit, }: {
13
+ artifactName?: string;
14
+ limit?: number;
15
+ }): Promise<RemoteArtifact[]>;
16
+ download({ artifactName, }: {
17
+ artifactName: string;
18
+ }): Promise<Response>;
19
+ delete({ artifactName, limit, skipLatest, }: {
20
+ artifactName: string;
21
+ limit?: number;
22
+ skipLatest?: boolean;
23
+ }): Promise<RemoteArtifact[]>;
24
+ upload(): Promise<RemoteArtifact & {
25
+ getResponse: (buffer: Buffer | ((baseUrl: string) => Buffer), contentType?: string | undefined) => Response;
26
+ }>;
27
+ }
28
+ export declare const providerGitHub: (options?: {
29
+ owner: string;
30
+ repository: string;
31
+ token: string;
32
+ }) => () => RemoteBuildCache;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerGitHub.d.ts","sourceRoot":"","sources":["../../../src/lib/providerGitHub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE9E,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAY;IAChB,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAQ;gBAEjC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAUnE,cAAc;IAOd,IAAI,CAAC,EACT,YAAY,EACZ,KAAK,GACN,EAAE;QACD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAcvB,QAAQ,CAAC,EACb,YAAY,GACb,EAAE;QACD,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcf,MAAM,CAAC,EACX,YAAY,EACZ,KAAK,EACL,UAAU,GACX,EAAE;QACD,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBvB,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;CAKxC;AAED,eAAO,MAAM,cAAc,aACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,WAC3D,gBAC2B,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { deleteGitHubArtifacts, fetchGitHubArtifactsByName, } from './artifacts.js';
2
+ import { detectGitHubRepoDetails } from './config.js';
3
+ export class GitHubBuildCache {
4
+ name = 'GitHub';
5
+ repoDetails = null;
6
+ constructor(config) {
7
+ if (config) {
8
+ this.repoDetails = {
9
+ owner: config.owner,
10
+ repository: config.repository,
11
+ token: config.token,
12
+ };
13
+ }
14
+ }
15
+ async getRepoDetails() {
16
+ if (!this.repoDetails) {
17
+ this.repoDetails = await detectGitHubRepoDetails();
18
+ }
19
+ return this.repoDetails;
20
+ }
21
+ async list({ artifactName, limit, }) {
22
+ const repoDetails = await this.getRepoDetails();
23
+ const artifacts = await fetchGitHubArtifactsByName(artifactName, repoDetails, limit);
24
+ return artifacts.map((artifact) => ({
25
+ name: artifact.name,
26
+ url: artifact.downloadUrl,
27
+ id: String(artifact.id),
28
+ }));
29
+ }
30
+ async download({ artifactName, }) {
31
+ const repoDetails = await this.getRepoDetails();
32
+ const artifacts = await this.list({ artifactName });
33
+ if (artifacts.length === 0) {
34
+ throw new Error(`No artifact found with name "${artifactName}"`);
35
+ }
36
+ return fetch(artifacts[0].url, {
37
+ headers: {
38
+ Authorization: `token ${repoDetails.token}`,
39
+ 'Accept-Encoding': 'None',
40
+ },
41
+ });
42
+ }
43
+ async delete({ artifactName, limit, skipLatest, }) {
44
+ const repoDetails = await this.getRepoDetails();
45
+ const artifacts = await fetchGitHubArtifactsByName(artifactName, repoDetails, limit);
46
+ if (artifacts.length === 0) {
47
+ throw new Error(`No artifact found with name "${artifactName}"`);
48
+ }
49
+ const [, ...rest] = artifacts;
50
+ return await deleteGitHubArtifacts(skipLatest ? rest : artifacts, repoDetails, artifactName);
51
+ }
52
+ async upload() {
53
+ throw new Error('Uploading artifacts to GitHub is not supported through GitHub API. See: https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28');
54
+ }
55
+ }
56
+ export const providerGitHub = (options) => () => new GitHubBuildCache(options);
57
+ //# sourceMappingURL=providerGitHub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerGitHub.js","sourceRoot":"","sources":["../../../src/lib/providerGitHub.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAA0B,MAAM,aAAa,CAAC;AAE9E,MAAM,OAAO,gBAAgB;IAC3B,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAA6B,IAAI,CAAC;IAE7C,YAAY,MAA6D;QACvE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,GAAG;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,MAAM,uBAAuB,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACT,YAAY,EACZ,KAAK,GAIN;QACC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,YAAY,EACZ,WAAW,EACX,KAAK,CACN,CAAC;QACF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG,EAAE,QAAQ,CAAC,WAAW;YACzB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EACb,YAAY,GAGb;QACC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;YAC7B,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,WAAW,CAAC,KAAK,EAAE;gBAC3C,iBAAiB,EAAE,MAAM;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EACX,YAAY,EACZ,KAAK,EACL,UAAU,GAKX;QACC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,YAAY,EACZ,WAAW,EACX,KAAK,CACN,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;QAC9B,OAAO,MAAM,qBAAqB,CAChC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC7B,WAAW,EACX,YAAY,CACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QAQV,MAAM,IAAI,KAAK,CACb,iJAAiJ,CAClJ,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GACzB,CAAC,OAA8D,EAAE,EAAE,CACnE,GAAqB,EAAE,CACrB,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@rock-js/provider-github",
3
+ "version": "0.8.13",
4
+ "type": "module",
5
+ "types": "./dist/src/index.d.ts",
6
+ "exports": {
7
+ "types": "./dist/src/index.d.ts",
8
+ "default": "./dist/src/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.lib.json",
15
+ "dev": "tsc -p tsconfig.lib.json --watch",
16
+ "publish:npm": "npm publish --access public",
17
+ "publish:verdaccio": "npm publish --registry http://localhost:4873 --userconfig ../../.npmrc"
18
+ },
19
+ "dependencies": {
20
+ "@rock-js/tools": "^0.8.13",
21
+ "ts-regex-builder": "^1.8.2",
22
+ "tslib": "^2.3.0"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ }
27
+ }