skir 1.1.26 → 1.1.28
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/dist/dependency_manager.d.ts +19 -1
- package/dist/dependency_manager.d.ts.map +1 -1
- package/dist/dependency_manager.js +93 -0
- package/dist/dependency_manager.js.map +1 -1
- package/dist/package_downloader.js +22 -5
- package/dist/package_downloader.js.map +1 -1
- package/package.json +1 -1
- package/src/dependency_manager.ts +130 -0
- package/src/package_downloader.ts +30 -5
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import type { Record } from "skir-internal";
|
|
1
2
|
import { AsyncFileReader } from "./io.js";
|
|
2
|
-
import
|
|
3
|
+
import { ModuleSet } from "./module_set.js";
|
|
4
|
+
import type { DependenciesResult, DependencyError, PackageDownloader, PackageIdToVersion } from "./package_types.js";
|
|
3
5
|
export declare class DependencyManager {
|
|
4
6
|
private readonly rootDir;
|
|
5
7
|
private readonly githubToken;
|
|
@@ -11,4 +13,20 @@ export declare class DependencyManager {
|
|
|
11
13
|
private get externalDir();
|
|
12
14
|
private readDependenciesFile;
|
|
13
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves a GitHub blob URL to the first record declared at the referenced line.
|
|
18
|
+
*
|
|
19
|
+
* Expected URL shape:
|
|
20
|
+
* https://github.com/<owner>/<repo>/blob/<version>/skir-src/<path>.skir#L<line>
|
|
21
|
+
*
|
|
22
|
+
* Returns:
|
|
23
|
+
* - `{ kind: "success", record, moduleSet }` when a record is found.
|
|
24
|
+
* - `{ kind: "error", message }` for invalid URLs, dependency download issues,
|
|
25
|
+
* compilation failures, missing modules, or when no record starts at the line.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getModuleFromGithubUrl(githubUrl: string, githubToken: string | undefined, packageDownloader?: PackageDownloader): Promise<{
|
|
28
|
+
kind: "success";
|
|
29
|
+
record: Record;
|
|
30
|
+
moduleSet: ModuleSet;
|
|
31
|
+
} | DependencyError>;
|
|
14
32
|
//# sourceMappingURL=dependency_manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency_manager.d.ts","sourceRoot":"","sources":["../src/dependency_manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"dependency_manager.d.ts","sourceRoot":"","sources":["../src/dependency_manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAEf,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAHjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,GAAE,eAAkC,EAC9C,iBAAiB,GAAE,iBAAmC;IAGnE,eAAe,CACnB,YAAY,EAAE,kBAAkB,EAChC,WAAW,GAAE,OAAO,GAAG,UAAoB,GAC1C,OAAO,CAAC,kBAAkB,CAAC;YAiBhB,WAAW;IA4EzB,OAAO,KAAK,WAAW,GAEtB;YAEa,oBAAoB;CAanC;AAqHD;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,iBAAiB,GAAE,iBAAmC,GACrD,OAAO,CACN;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;CACtB,GACD,eAAe,CAClB,CAsDA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as fs from "fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { REAL_FILE_SYSTEM } from "./io.js";
|
|
4
|
+
import { ModuleSet } from "./module_set.js";
|
|
4
5
|
import { downloadPackage } from "./package_downloader.js";
|
|
5
6
|
export class DependencyManager {
|
|
6
7
|
constructor(rootDir, githubToken, fileReader = REAL_FILE_SYSTEM, packageDownloader = downloadPackage) {
|
|
@@ -187,4 +188,96 @@ function formatDependencyChain(chain) {
|
|
|
187
188
|
.join(" which depends on "));
|
|
188
189
|
}
|
|
189
190
|
const DEPENDENCIES_FILENAME = "dependencies.json";
|
|
191
|
+
/**
|
|
192
|
+
* Resolves a GitHub blob URL to the first record declared at the referenced line.
|
|
193
|
+
*
|
|
194
|
+
* Expected URL shape:
|
|
195
|
+
* https://github.com/<owner>/<repo>/blob/<version>/skir-src/<path>.skir#L<line>
|
|
196
|
+
*
|
|
197
|
+
* Returns:
|
|
198
|
+
* - `{ kind: "success", record, moduleSet }` when a record is found.
|
|
199
|
+
* - `{ kind: "error", message }` for invalid URLs, dependency download issues,
|
|
200
|
+
* compilation failures, missing modules, or when no record starts at the line.
|
|
201
|
+
*/
|
|
202
|
+
export async function getModuleFromGithubUrl(githubUrl, githubToken, packageDownloader = downloadPackage) {
|
|
203
|
+
const parsedUrl = parseGithubModuleUrl(githubUrl);
|
|
204
|
+
if (parsedUrl.kind === "error") {
|
|
205
|
+
return parsedUrl;
|
|
206
|
+
}
|
|
207
|
+
const { packageId, version, modulePath, lineNumber } = parsedUrl;
|
|
208
|
+
const flow = new GetDependenciesFlow({}, githubToken, packageDownloader);
|
|
209
|
+
const dependenciesResult = await flow.run({
|
|
210
|
+
[packageId]: version,
|
|
211
|
+
});
|
|
212
|
+
if (dependenciesResult.kind === "error") {
|
|
213
|
+
return dependenciesResult;
|
|
214
|
+
}
|
|
215
|
+
const modulePathToContent = new Map();
|
|
216
|
+
for (const pkg of Object.values(dependenciesResult.packages)) {
|
|
217
|
+
for (const [path, content] of Object.entries(pkg.modules)) {
|
|
218
|
+
modulePathToContent.set(path, content);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const moduleSet = ModuleSet.compile(modulePathToContent);
|
|
222
|
+
if (moduleSet.errors.length > 0) {
|
|
223
|
+
return {
|
|
224
|
+
kind: "error",
|
|
225
|
+
message: moduleSet.errors[0].message || "Compilation failed",
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const moduleResult = moduleSet.modules.get(modulePath);
|
|
229
|
+
if (!moduleResult) {
|
|
230
|
+
return {
|
|
231
|
+
kind: "error",
|
|
232
|
+
message: `Module not found: ${modulePath}`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const recordAtLine = moduleResult.result.records.find((record) => record.record.name.line.lineNumber === lineNumber);
|
|
236
|
+
if (!recordAtLine) {
|
|
237
|
+
return {
|
|
238
|
+
kind: "error",
|
|
239
|
+
message: `No record found at line ${lineNumber + 1} in ${modulePath}`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
kind: "success",
|
|
244
|
+
record: recordAtLine.record,
|
|
245
|
+
moduleSet,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function parseGithubModuleUrl(githubUrl) {
|
|
249
|
+
const match = githubUrl.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/(.+)#L(\d+)$/);
|
|
250
|
+
if (!match) {
|
|
251
|
+
return {
|
|
252
|
+
kind: "error",
|
|
253
|
+
message: `Invalid GitHub URL: ${githubUrl}`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
const owner = match[1];
|
|
257
|
+
const repo = match[2];
|
|
258
|
+
const version = match[3];
|
|
259
|
+
const repoPath = match[4];
|
|
260
|
+
const lineNumberOneBased = Number(match[5]);
|
|
261
|
+
if (!repoPath.startsWith("skir-src/") || !repoPath.endsWith(".skir")) {
|
|
262
|
+
return {
|
|
263
|
+
kind: "error",
|
|
264
|
+
message: `URL must target a .skir file in skir-src: ${githubUrl}`,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
if (!Number.isInteger(lineNumberOneBased) || lineNumberOneBased <= 0) {
|
|
268
|
+
return {
|
|
269
|
+
kind: "error",
|
|
270
|
+
message: `Invalid line number in URL: ${githubUrl}`,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const packageId = `@${owner}/${repo}`;
|
|
274
|
+
const modulePath = packageId + repoPath.substring("skir-src".length);
|
|
275
|
+
return {
|
|
276
|
+
kind: "success",
|
|
277
|
+
packageId,
|
|
278
|
+
version,
|
|
279
|
+
modulePath,
|
|
280
|
+
lineNumber: lineNumberOneBased - 1,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
190
283
|
//# sourceMappingURL=dependency_manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency_manager.js","sourceRoot":"","sources":["../src/dependency_manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dependency_manager.js","sourceRoot":"","sources":["../src/dependency_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,16 +57,33 @@ export async function downloadPackage(packageId, version, githubToken) {
|
|
|
57
57
|
},
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
+
async function fetchWithRetry(url, headers, maxRetries = 3) {
|
|
61
|
+
let lastResponse;
|
|
62
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
63
|
+
const response = await fetch(url, { headers });
|
|
64
|
+
if (response.status !== 403 && response.status !== 429) {
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
lastResponse = response;
|
|
68
|
+
if (attempt === maxRetries) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
72
|
+
const waitMs = retryAfter
|
|
73
|
+
? parseInt(retryAfter, 10) * 1000
|
|
74
|
+
: 1000 * 2 ** attempt;
|
|
75
|
+
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
76
|
+
}
|
|
77
|
+
return lastResponse;
|
|
78
|
+
}
|
|
60
79
|
async function getGithubTree(repo, version, githubToken) {
|
|
61
80
|
const url = `https://api.github.com/repos/${repo}/git/trees/${version}?recursive=1`;
|
|
62
|
-
const response = await
|
|
81
|
+
const response = await fetchWithRetry(url, makeHeaders(githubToken));
|
|
63
82
|
if (!response.ok) {
|
|
64
83
|
if (response.status === 404) {
|
|
65
84
|
// Check if the repo exists or if it's the tag that's missing
|
|
66
85
|
const repoCheckUrl = `https://api.github.com/repos/${repo}`;
|
|
67
|
-
const repoResponse = await
|
|
68
|
-
headers: makeHeaders(githubToken),
|
|
69
|
-
});
|
|
86
|
+
const repoResponse = await fetchWithRetry(repoCheckUrl, makeHeaders(githubToken));
|
|
70
87
|
if (repoResponse.ok) {
|
|
71
88
|
// Repo exists, so the tag is missing
|
|
72
89
|
return {
|
|
@@ -94,7 +111,7 @@ async function getGithubTree(repo, version, githubToken) {
|
|
|
94
111
|
}
|
|
95
112
|
async function downloadFileContent(repo, sha, githubToken) {
|
|
96
113
|
const url = `https://api.github.com/repos/${repo}/git/blobs/${sha}`;
|
|
97
|
-
const response = await
|
|
114
|
+
const response = await fetchWithRetry(url, makeHeaders(githubToken));
|
|
98
115
|
if (!response.ok) {
|
|
99
116
|
throw new Error(`Failed to download file: ${response.status} ${response.statusText}`);
|
|
100
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package_downloader.js","sourceRoot":"","sources":["../src/package_downloader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"package_downloader.js","sourceRoot":"","sources":["../src/package_downloader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as fs from "fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import type { Record } from "skir-internal";
|
|
3
4
|
import { AsyncFileReader, REAL_FILE_SYSTEM } from "./io.js";
|
|
5
|
+
import { ModuleSet } from "./module_set.js";
|
|
4
6
|
import { downloadPackage } from "./package_downloader.js";
|
|
5
7
|
import type {
|
|
6
8
|
DependenciesResult,
|
|
@@ -248,3 +250,131 @@ interface PackageBundle {
|
|
|
248
250
|
pkg: Package;
|
|
249
251
|
dependencyChain: DependencyItem[];
|
|
250
252
|
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Resolves a GitHub blob URL to the first record declared at the referenced line.
|
|
256
|
+
*
|
|
257
|
+
* Expected URL shape:
|
|
258
|
+
* https://github.com/<owner>/<repo>/blob/<version>/skir-src/<path>.skir#L<line>
|
|
259
|
+
*
|
|
260
|
+
* Returns:
|
|
261
|
+
* - `{ kind: "success", record, moduleSet }` when a record is found.
|
|
262
|
+
* - `{ kind: "error", message }` for invalid URLs, dependency download issues,
|
|
263
|
+
* compilation failures, missing modules, or when no record starts at the line.
|
|
264
|
+
*/
|
|
265
|
+
export async function getModuleFromGithubUrl(
|
|
266
|
+
githubUrl: string,
|
|
267
|
+
githubToken: string | undefined,
|
|
268
|
+
packageDownloader: PackageDownloader = downloadPackage,
|
|
269
|
+
): Promise<
|
|
270
|
+
| {
|
|
271
|
+
kind: "success";
|
|
272
|
+
record: Record;
|
|
273
|
+
moduleSet: ModuleSet;
|
|
274
|
+
}
|
|
275
|
+
| DependencyError
|
|
276
|
+
> {
|
|
277
|
+
const parsedUrl = parseGithubModuleUrl(githubUrl);
|
|
278
|
+
if (parsedUrl.kind === "error") {
|
|
279
|
+
return parsedUrl;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const { packageId, version, modulePath, lineNumber } = parsedUrl;
|
|
283
|
+
|
|
284
|
+
const flow = new GetDependenciesFlow({}, githubToken, packageDownloader);
|
|
285
|
+
const dependenciesResult = await flow.run({
|
|
286
|
+
[packageId]: version,
|
|
287
|
+
});
|
|
288
|
+
if (dependenciesResult.kind === "error") {
|
|
289
|
+
return dependenciesResult;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const modulePathToContent = new Map<string, string>();
|
|
293
|
+
for (const pkg of Object.values(dependenciesResult.packages)) {
|
|
294
|
+
for (const [path, content] of Object.entries(pkg.modules)) {
|
|
295
|
+
modulePathToContent.set(path, content);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const moduleSet = ModuleSet.compile(modulePathToContent);
|
|
300
|
+
if (moduleSet.errors.length > 0) {
|
|
301
|
+
return {
|
|
302
|
+
kind: "error",
|
|
303
|
+
message: moduleSet.errors[0]!.message || "Compilation failed",
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const moduleResult = moduleSet.modules.get(modulePath);
|
|
308
|
+
if (!moduleResult) {
|
|
309
|
+
return {
|
|
310
|
+
kind: "error",
|
|
311
|
+
message: `Module not found: ${modulePath}`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const recordAtLine = moduleResult.result.records.find(
|
|
316
|
+
(record) => record.record.name.line.lineNumber === lineNumber,
|
|
317
|
+
);
|
|
318
|
+
if (!recordAtLine) {
|
|
319
|
+
return {
|
|
320
|
+
kind: "error",
|
|
321
|
+
message: `No record found at line ${lineNumber + 1} in ${modulePath}`,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
kind: "success",
|
|
327
|
+
record: recordAtLine.record,
|
|
328
|
+
moduleSet,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function parseGithubModuleUrl(githubUrl: string):
|
|
333
|
+
| {
|
|
334
|
+
kind: "success";
|
|
335
|
+
packageId: string;
|
|
336
|
+
version: string;
|
|
337
|
+
modulePath: string;
|
|
338
|
+
lineNumber: number;
|
|
339
|
+
}
|
|
340
|
+
| DependencyError {
|
|
341
|
+
const match = githubUrl.match(
|
|
342
|
+
/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/(.+)#L(\d+)$/,
|
|
343
|
+
);
|
|
344
|
+
if (!match) {
|
|
345
|
+
return {
|
|
346
|
+
kind: "error",
|
|
347
|
+
message: `Invalid GitHub URL: ${githubUrl}`,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const owner = match[1]!;
|
|
352
|
+
const repo = match[2]!;
|
|
353
|
+
const version = match[3]!;
|
|
354
|
+
const repoPath = match[4]!;
|
|
355
|
+
const lineNumberOneBased = Number(match[5]!);
|
|
356
|
+
|
|
357
|
+
if (!repoPath.startsWith("skir-src/") || !repoPath.endsWith(".skir")) {
|
|
358
|
+
return {
|
|
359
|
+
kind: "error",
|
|
360
|
+
message: `URL must target a .skir file in skir-src: ${githubUrl}`,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
if (!Number.isInteger(lineNumberOneBased) || lineNumberOneBased <= 0) {
|
|
364
|
+
return {
|
|
365
|
+
kind: "error",
|
|
366
|
+
message: `Invalid line number in URL: ${githubUrl}`,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const packageId = `@${owner}/${repo}`;
|
|
371
|
+
const modulePath = packageId + repoPath.substring("skir-src".length);
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
kind: "success",
|
|
375
|
+
packageId,
|
|
376
|
+
version,
|
|
377
|
+
modulePath,
|
|
378
|
+
lineNumber: lineNumberOneBased - 1,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
@@ -85,21 +85,46 @@ export async function downloadPackage(
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
async function fetchWithRetry(
|
|
89
|
+
url: string,
|
|
90
|
+
headers: Record<string, string>,
|
|
91
|
+
maxRetries = 3,
|
|
92
|
+
): Promise<Response> {
|
|
93
|
+
let lastResponse: Response | undefined;
|
|
94
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
95
|
+
const response = await fetch(url, { headers });
|
|
96
|
+
if (response.status !== 403 && response.status !== 429) {
|
|
97
|
+
return response;
|
|
98
|
+
}
|
|
99
|
+
lastResponse = response;
|
|
100
|
+
if (attempt === maxRetries) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
104
|
+
const waitMs = retryAfter
|
|
105
|
+
? parseInt(retryAfter, 10) * 1000
|
|
106
|
+
: 1000 * 2 ** attempt;
|
|
107
|
+
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
108
|
+
}
|
|
109
|
+
return lastResponse!;
|
|
110
|
+
}
|
|
111
|
+
|
|
88
112
|
async function getGithubTree(
|
|
89
113
|
repo: string,
|
|
90
114
|
version: string,
|
|
91
115
|
githubToken?: string,
|
|
92
116
|
): Promise<GithubTreeResult> {
|
|
93
117
|
const url = `https://api.github.com/repos/${repo}/git/trees/${version}?recursive=1`;
|
|
94
|
-
const response = await
|
|
118
|
+
const response = await fetchWithRetry(url, makeHeaders(githubToken));
|
|
95
119
|
|
|
96
120
|
if (!response.ok) {
|
|
97
121
|
if (response.status === 404) {
|
|
98
122
|
// Check if the repo exists or if it's the tag that's missing
|
|
99
123
|
const repoCheckUrl = `https://api.github.com/repos/${repo}`;
|
|
100
|
-
const repoResponse = await
|
|
101
|
-
|
|
102
|
-
|
|
124
|
+
const repoResponse = await fetchWithRetry(
|
|
125
|
+
repoCheckUrl,
|
|
126
|
+
makeHeaders(githubToken),
|
|
127
|
+
);
|
|
103
128
|
|
|
104
129
|
if (repoResponse.ok) {
|
|
105
130
|
// Repo exists, so the tag is missing
|
|
@@ -134,7 +159,7 @@ async function downloadFileContent(
|
|
|
134
159
|
githubToken?: string,
|
|
135
160
|
): Promise<string> {
|
|
136
161
|
const url = `https://api.github.com/repos/${repo}/git/blobs/${sha}`;
|
|
137
|
-
const response = await
|
|
162
|
+
const response = await fetchWithRetry(url, makeHeaders(githubToken));
|
|
138
163
|
|
|
139
164
|
if (!response.ok) {
|
|
140
165
|
throw new Error(
|