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.
@@ -1,5 +1,7 @@
1
+ import type { Record } from "skir-internal";
1
2
  import { AsyncFileReader } from "./io.js";
2
- import type { DependenciesResult, PackageDownloader, PackageIdToVersion } from "./package_types.js";
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;AAE5D,OAAO,KAAK,EACV,kBAAkB,EAGlB,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"}
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":"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"}
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 fetch(url, { headers: makeHeaders(githubToken) });
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 fetch(repoCheckUrl, {
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 fetch(url, { headers: makeHeaders(githubToken) });
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,6 @@
1
1
  {
2
2
  "name": "skir",
3
- "version": "1.1.26",
3
+ "version": "1.1.28",
4
4
  "description": "",
5
5
  "homepage": "https://skir.build/",
6
6
  "bugs": {
@@ -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 fetch(url, { headers: makeHeaders(githubToken) });
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 fetch(repoCheckUrl, {
101
- headers: makeHeaders(githubToken),
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 fetch(url, { headers: makeHeaders(githubToken) });
162
+ const response = await fetchWithRetry(url, makeHeaders(githubToken));
138
163
 
139
164
  if (!response.ok) {
140
165
  throw new Error(