@udondan/avanti 0.4.0 → 0.6.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.
Files changed (62) hide show
  1. package/README.md +130 -5
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/diff.d.ts.map +1 -1
  5. package/dist/commands/diff.js +45 -2
  6. package/dist/commands/diff.js.map +1 -1
  7. package/dist/commands/log.d.ts +3 -0
  8. package/dist/commands/log.d.ts.map +1 -0
  9. package/dist/commands/log.js +100 -0
  10. package/dist/commands/log.js.map +1 -0
  11. package/dist/commands/pull.d.ts.map +1 -1
  12. package/dist/commands/pull.js +67 -19
  13. package/dist/commands/pull.js.map +1 -1
  14. package/dist/commands/reset.d.ts +3 -0
  15. package/dist/commands/reset.d.ts.map +1 -0
  16. package/dist/commands/reset.js +106 -0
  17. package/dist/commands/reset.js.map +1 -0
  18. package/dist/commands/revert.d.ts +3 -0
  19. package/dist/commands/revert.d.ts.map +1 -0
  20. package/dist/commands/revert.js +153 -0
  21. package/dist/commands/revert.js.map +1 -0
  22. package/dist/diff.d.ts +1 -0
  23. package/dist/diff.d.ts.map +1 -1
  24. package/dist/diff.js +10 -1
  25. package/dist/diff.js.map +1 -1
  26. package/dist/fetch.d.ts +3 -0
  27. package/dist/fetch.d.ts.map +1 -0
  28. package/dist/fetch.js +37 -0
  29. package/dist/fetch.js.map +1 -0
  30. package/dist/history.d.ts +64 -0
  31. package/dist/history.d.ts.map +1 -0
  32. package/dist/history.js +316 -0
  33. package/dist/history.js.map +1 -0
  34. package/dist/processors/json.d.ts.map +1 -1
  35. package/dist/processors/json.js +8 -5
  36. package/dist/processors/json.js.map +1 -1
  37. package/dist/prompt.d.ts +2 -0
  38. package/dist/prompt.d.ts.map +1 -0
  39. package/dist/prompt.js +42 -0
  40. package/dist/prompt.js.map +1 -0
  41. package/dist/sources/github.d.ts +1 -1
  42. package/dist/sources/github.d.ts.map +1 -1
  43. package/dist/sources/github.js +124 -20
  44. package/dist/sources/github.js.map +1 -1
  45. package/dist/sources/gitlab.d.ts +1 -1
  46. package/dist/sources/gitlab.d.ts.map +1 -1
  47. package/dist/sources/gitlab.js +136 -48
  48. package/dist/sources/gitlab.js.map +1 -1
  49. package/dist/sources/http.d.ts.map +1 -1
  50. package/dist/sources/http.js +5 -24
  51. package/dist/sources/http.js.map +1 -1
  52. package/dist/sources/index.js +4 -4
  53. package/dist/sources/index.js.map +1 -1
  54. package/dist/writer.d.ts +1 -1
  55. package/dist/writer.d.ts.map +1 -1
  56. package/dist/writer.js +10 -1
  57. package/dist/writer.js.map +1 -1
  58. package/package.json +6 -1
  59. package/.prettierignore +0 -2
  60. package/CHANGELOG.md +0 -46
  61. package/eslint.config.mjs +0 -25
  62. package/prettier.config.mjs +0 -5
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.HistoryManager = void 0;
27
+ const crypto = __importStar(require("crypto"));
28
+ const fs = __importStar(require("fs"));
29
+ const os = __importStar(require("os"));
30
+ const path = __importStar(require("path"));
31
+ function defaultBaseDir() {
32
+ return (process.env.AVANTI_HISTORY_DIR ??
33
+ path.join(os.homedir(), '.config', 'avanti'));
34
+ }
35
+ function sha256(input) {
36
+ return crypto.createHash('sha256').update(input).digest('hex');
37
+ }
38
+ function uuid() {
39
+ return crypto.randomUUID();
40
+ }
41
+ class HistoryManager {
42
+ baseDir;
43
+ projectSlug;
44
+ projectDir;
45
+ filesDir;
46
+ indexPath;
47
+ pullsLogPath;
48
+ configFile;
49
+ workingDir;
50
+ constructor(configFile, workingDir) {
51
+ this.configFile = configFile;
52
+ this.workingDir = workingDir;
53
+ this.baseDir = defaultBaseDir();
54
+ this.projectSlug = sha256(`${configFile}|${workingDir}`);
55
+ this.projectDir = path.join(this.baseDir, 'projects', this.projectSlug);
56
+ this.filesDir = path.join(this.projectDir, 'files');
57
+ this.indexPath = path.join(this.filesDir, 'index.json');
58
+ this.pullsLogPath = path.join(this.projectDir, 'pulls.jsonl');
59
+ }
60
+ ensureStorageDir() {
61
+ try {
62
+ fs.mkdirSync(this.filesDir, { recursive: true });
63
+ const metaPath = path.join(this.projectDir, 'meta.json');
64
+ if (!fs.existsSync(metaPath)) {
65
+ fs.writeFileSync(metaPath, JSON.stringify({ configFile: this.configFile, workingDir: this.workingDir }, null, 2), 'utf8');
66
+ }
67
+ return true;
68
+ }
69
+ catch (err) {
70
+ console.warn(`Warning: could not initialise history storage at ${this.baseDir}: ${err.message}`);
71
+ return false;
72
+ }
73
+ }
74
+ openPullSession() {
75
+ return uuid();
76
+ }
77
+ stageFileVersion(pullId, targetPath, newContent, isNew) {
78
+ const slug = sha256(targetPath);
79
+ const fileDir = path.join(this.filesDir, slug);
80
+ fs.mkdirSync(fileDir, { recursive: true });
81
+ const metaPath = path.join(fileDir, 'meta.json');
82
+ let meta;
83
+ if (fs.existsSync(metaPath)) {
84
+ meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
85
+ }
86
+ else {
87
+ const existedBeforeAvanti = !isNew && fs.existsSync(targetPath);
88
+ if (existedBeforeAvanti) {
89
+ const originalContent = fs.readFileSync(targetPath, 'utf8');
90
+ fs.writeFileSync(path.join(fileDir, 'v0'), originalContent, 'utf8');
91
+ }
92
+ meta = {
93
+ absolutePath: targetPath,
94
+ slug,
95
+ firstSeenAt: new Date().toISOString(),
96
+ existedBeforeAvanti,
97
+ currentVersion: 0,
98
+ };
99
+ fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf8');
100
+ const index = this.readIndex();
101
+ index[targetPath] = slug;
102
+ this.writeIndex(index);
103
+ }
104
+ const nextVersion = meta.currentVersion + 1;
105
+ fs.writeFileSync(path.join(fileDir, `v${nextVersion}`), newContent, 'utf8');
106
+ const fileRef = {
107
+ absolutePath: targetPath,
108
+ slug,
109
+ version: nextVersion,
110
+ wasNew: isNew,
111
+ };
112
+ return { version: nextVersion, fileRef };
113
+ }
114
+ closePullSession(pullId, configFile, fileRefs) {
115
+ for (const ref of fileRefs) {
116
+ const metaPath = path.join(this.filesDir, ref.slug, 'meta.json');
117
+ if (fs.existsSync(metaPath)) {
118
+ const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
119
+ meta.currentVersion = ref.version;
120
+ fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf8');
121
+ }
122
+ }
123
+ const entry = {
124
+ pullId,
125
+ timestamp: new Date().toISOString(),
126
+ configFile,
127
+ files: fileRefs,
128
+ };
129
+ fs.appendFileSync(this.pullsLogPath, JSON.stringify(entry) + '\n', 'utf8');
130
+ }
131
+ listPulls() {
132
+ try {
133
+ if (!fs.existsSync(this.pullsLogPath))
134
+ return [];
135
+ const lines = fs
136
+ .readFileSync(this.pullsLogPath, 'utf8')
137
+ .split('\n')
138
+ .filter(Boolean);
139
+ const entries = [];
140
+ for (const line of lines) {
141
+ try {
142
+ entries.push(JSON.parse(line));
143
+ }
144
+ catch {
145
+ // skip corrupt lines
146
+ }
147
+ }
148
+ return entries.reverse();
149
+ }
150
+ catch {
151
+ return [];
152
+ }
153
+ }
154
+ getFileHistory(absolutePath) {
155
+ try {
156
+ const index = this.readIndex();
157
+ const slug = index[absolutePath];
158
+ if (!slug)
159
+ return null;
160
+ const meta = this.readMeta(slug);
161
+ if (!meta)
162
+ return null;
163
+ const pulls = this.listPulls().slice().reverse(); // chronological order for version lookup
164
+ const versionMap = new Map();
165
+ for (const pull of pulls) {
166
+ for (const ref of pull.files) {
167
+ if (ref.absolutePath === absolutePath) {
168
+ versionMap.set(ref.version, {
169
+ pulledAt: pull.timestamp,
170
+ pullId: pull.pullId,
171
+ });
172
+ }
173
+ }
174
+ }
175
+ const versions = [];
176
+ if (meta.existedBeforeAvanti) {
177
+ versions.push({
178
+ version: 0,
179
+ isOriginal: true,
180
+ pulledAt: null,
181
+ pullId: null,
182
+ });
183
+ }
184
+ for (let v = 1; v <= meta.currentVersion; v++) {
185
+ const info = versionMap.get(v);
186
+ versions.push({
187
+ version: v,
188
+ isOriginal: false,
189
+ pulledAt: info?.pulledAt ?? null,
190
+ pullId: info?.pullId ?? null,
191
+ });
192
+ }
193
+ return {
194
+ absolutePath,
195
+ existedBeforeAvanti: meta.existedBeforeAvanti,
196
+ currentVersion: meta.currentVersion,
197
+ versions,
198
+ };
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ }
204
+ readVersion(absolutePath, version) {
205
+ try {
206
+ const index = this.readIndex();
207
+ const slug = index[absolutePath];
208
+ if (!slug)
209
+ return null;
210
+ const versionPath = path.join(this.filesDir, slug, `v${version}`);
211
+ if (!fs.existsSync(versionPath))
212
+ return null;
213
+ return fs.readFileSync(versionPath, 'utf8');
214
+ }
215
+ catch {
216
+ return null;
217
+ }
218
+ }
219
+ getFileMeta(absolutePath) {
220
+ try {
221
+ const index = this.readIndex();
222
+ const slug = index[absolutePath];
223
+ if (!slug)
224
+ return null;
225
+ return this.readMeta(slug);
226
+ }
227
+ catch {
228
+ return null;
229
+ }
230
+ }
231
+ getFilesAtPull(pullId) {
232
+ const result = new Map();
233
+ const pulls = this.listPulls().slice().reverse(); // chronological
234
+ // Build state snapshot: for each file, find highest version at or before the target pull
235
+ let found = false;
236
+ const snapshot = new Map(); // absolutePath → version at target pull
237
+ for (const pull of pulls) {
238
+ for (const ref of pull.files) {
239
+ if (!snapshot.has(ref.absolutePath)) {
240
+ // Only record if we haven't passed the target pull yet or are at it
241
+ if (!found) {
242
+ snapshot.set(ref.absolutePath, ref.version);
243
+ }
244
+ }
245
+ }
246
+ if (pull.pullId === pullId) {
247
+ // Record files written IN this pull (overwrite any tentative earlier values)
248
+ for (const ref of pull.files) {
249
+ snapshot.set(ref.absolutePath, ref.version);
250
+ }
251
+ found = true;
252
+ break;
253
+ }
254
+ }
255
+ if (!found)
256
+ return result;
257
+ for (const [absolutePath, version] of snapshot) {
258
+ const meta = this.getFileMeta(absolutePath);
259
+ result.set(absolutePath, {
260
+ version,
261
+ existedBeforeAvanti: meta?.existedBeforeAvanti ?? false,
262
+ });
263
+ }
264
+ return result;
265
+ }
266
+ listTrackedFiles() {
267
+ try {
268
+ const index = this.readIndex();
269
+ const metas = [];
270
+ for (const slug of Object.values(index)) {
271
+ const meta = this.readMeta(slug);
272
+ if (meta)
273
+ metas.push(meta);
274
+ }
275
+ return metas;
276
+ }
277
+ catch {
278
+ return [];
279
+ }
280
+ }
281
+ getLastPullFiles() {
282
+ const pulls = this.listPulls();
283
+ if (pulls.length === 0)
284
+ return [];
285
+ return pulls[0].files; // listPulls returns newest first
286
+ }
287
+ hasHistory() {
288
+ return fs.existsSync(this.pullsLogPath);
289
+ }
290
+ readIndex() {
291
+ try {
292
+ if (!fs.existsSync(this.indexPath))
293
+ return {};
294
+ return JSON.parse(fs.readFileSync(this.indexPath, 'utf8'));
295
+ }
296
+ catch {
297
+ return {};
298
+ }
299
+ }
300
+ writeIndex(index) {
301
+ fs.writeFileSync(this.indexPath, JSON.stringify(index, null, 2), 'utf8');
302
+ }
303
+ readMeta(slug) {
304
+ try {
305
+ const metaPath = path.join(this.filesDir, slug, 'meta.json');
306
+ if (!fs.existsSync(metaPath))
307
+ return null;
308
+ return JSON.parse(fs.readFileSync(metaPath, 'utf8'));
309
+ }
310
+ catch {
311
+ return null;
312
+ }
313
+ }
314
+ }
315
+ exports.HistoryManager = HistoryManager;
316
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA+D5C,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,gBAAqB,GAC1B,MAAM,CA0BR;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQlD"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiE5C,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,gBAAqB,GAC1B,MAAM,CA0BR;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQlD"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatJson = exports.mergeJson = void 0;
4
+ const comment_json_1 = require("comment-json");
4
5
  function isPlainObject(v) {
5
6
  return v !== null && typeof v === 'object' && !Array.isArray(v);
6
7
  }
@@ -27,14 +28,16 @@ function mergeValues(path, a, b, opts) {
27
28
  return b;
28
29
  }
29
30
  function deepMerge(a, b, opts, basePath) {
30
- const result = { ...a };
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ const result = (0, comment_json_1.assign)({}, a);
31
33
  for (const [key, bVal] of Object.entries(b)) {
32
34
  const childPath = basePath ? `${basePath}.${key}` : key;
33
35
  if (key in result) {
34
36
  result[key] = mergeValues(childPath, result[key], bVal, opts);
35
37
  }
36
38
  else {
37
- result[key] = bVal;
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ (0, comment_json_1.assign)(result, b, [key]);
38
41
  }
39
42
  }
40
43
  return result;
@@ -49,7 +52,7 @@ function mergeJson(parts, opts = {}) {
49
52
  return 'null';
50
53
  const parsed = parts.map((p, i) => {
51
54
  try {
52
- return JSON.parse(p);
55
+ return (0, comment_json_1.parse)(p);
53
56
  }
54
57
  catch (e) {
55
58
  throw new Error(`[source ${i}]: invalid JSON: ${e.message}`, { cause: e });
@@ -59,12 +62,12 @@ function mergeJson(parts, opts = {}) {
59
62
  for (let i = 1; i < parsed.length; i++) {
60
63
  result = mergeValues('', result, parsed[i], resolved);
61
64
  }
62
- return JSON.stringify(result, null, 2);
65
+ return (0, comment_json_1.stringify)(result, null, 2);
63
66
  }
64
67
  exports.mergeJson = mergeJson;
65
68
  function formatJson(content) {
66
69
  try {
67
- return JSON.stringify(JSON.parse(content), null, 2);
70
+ return (0, comment_json_1.stringify)((0, comment_json_1.parse)(content), null, 2);
68
71
  }
69
72
  catch (e) {
70
73
  throw new Error(`invalid JSON: ${e.message}`, {
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function confirm(question: string): Promise<boolean>;
2
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAchE"}
package/dist/prompt.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.confirm = void 0;
27
+ const readline = __importStar(require("readline"));
28
+ async function confirm(question) {
29
+ const rl = readline.createInterface({
30
+ input: process.stdin,
31
+ output: process.stdout,
32
+ });
33
+ return new Promise((resolve) => {
34
+ rl.question(question, (answer) => {
35
+ rl.close();
36
+ resolve(answer.trim().toLowerCase() === 'y' ||
37
+ answer.trim().toLowerCase() === 'yes');
38
+ });
39
+ });
40
+ }
41
+ exports.confirm = confirm;
42
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAqC;AAE9B,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CACL,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG;gBACjC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CACxC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAdD,0BAcC"}
@@ -1,5 +1,5 @@
1
1
  export interface GitHubResult {
2
2
  files: Map<string, string>;
3
3
  }
4
- export declare function fetchGitHub(repo: string, file: string, ref: string | undefined): GitHubResult;
4
+ export declare function fetchGitHub(repo: string, file: string, ref: string | undefined): Promise<GitHubResult>;
5
5
  //# sourceMappingURL=github.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/sources/github.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AA0ED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,YAAY,CA0Bd"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/sources/github.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAgOD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
@@ -26,22 +26,50 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.fetchGitHub = void 0;
27
27
  const child_process_1 = require("child_process");
28
28
  const path = __importStar(require("path"));
29
+ const fetch_1 = require("../fetch");
30
+ function getApiBase() {
31
+ const host = process.env.GITHUB_HOST;
32
+ return host ? `https://${host}/api/v3` : 'https://api.github.com';
33
+ }
34
+ function apiHeaders() {
35
+ const headers = {
36
+ Accept: 'application/vnd.github+json',
37
+ 'X-GitHub-Api-Version': '2022-11-28',
38
+ 'User-Agent': 'scync',
39
+ };
40
+ const token = process.env.GITHUB_TOKEN;
41
+ if (token)
42
+ headers.Authorization = `Bearer ${token}`;
43
+ return headers;
44
+ }
45
+ function shouldFallback(status) {
46
+ return status === 401 || status === 403 || status === 404;
47
+ }
48
+ function isGhAvailable() {
49
+ return !(0, child_process_1.spawnSync)('gh', ['--version'], { encoding: 'utf8' }).error;
50
+ }
29
51
  function ghRun(args) {
30
52
  const result = (0, child_process_1.spawnSync)('gh', args, { encoding: 'utf8' });
31
- if (result.error) {
32
- const msg = result.error.message ?? '';
33
- if (msg.includes('ENOENT')) {
34
- throw new Error('gh CLI not found. Install it from https://cli.github.com');
35
- }
36
- throw new Error(`gh error: ${msg}`);
37
- }
53
+ if (result.error)
54
+ throw new Error(`gh error: ${result.error.message}`);
38
55
  return {
39
56
  stdout: result.stdout ?? '',
40
57
  stderr: result.stderr ?? '',
41
58
  status: result.status,
42
59
  };
43
60
  }
44
- function detectPathType(repo, filePath, ref) {
61
+ async function detectPathType(repo, filePath, ref) {
62
+ const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`, { headers: apiHeaders() });
63
+ if (res.ok) {
64
+ const data = await res.json();
65
+ return Array.isArray(data) ? 'directory' : 'file';
66
+ }
67
+ if (shouldFallback(res.status) && isGhAvailable()) {
68
+ return detectPathTypeViaCli(repo, filePath, ref);
69
+ }
70
+ throw new Error(`Failed to stat ${filePath} in ${repo}@${ref}: HTTP ${res.status}`);
71
+ }
72
+ function detectPathTypeViaCli(repo, filePath, ref) {
45
73
  const res = ghRun([
46
74
  'api',
47
75
  `repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`,
@@ -53,7 +81,18 @@ function detectPathType(repo, filePath, ref) {
53
81
  }
54
82
  return res.stdout.trim();
55
83
  }
56
- function fetchFile(repo, filePath, ref) {
84
+ async function fetchFile(repo, filePath, ref) {
85
+ const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`, { headers: apiHeaders() });
86
+ if (!res.ok) {
87
+ if (shouldFallback(res.status) && isGhAvailable()) {
88
+ return fetchFileViaCli(repo, filePath, ref);
89
+ }
90
+ throw new Error(`Failed to fetch ${filePath} from ${repo}@${ref}: HTTP ${res.status}`);
91
+ }
92
+ const data = (await res.json());
93
+ return Buffer.from(data.content.replace(/\n/g, ''), 'base64').toString('utf8');
94
+ }
95
+ function fetchFileViaCli(repo, filePath, ref) {
57
96
  const res = ghRun([
58
97
  'api',
59
98
  `repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`,
@@ -66,7 +105,21 @@ function fetchFile(repo, filePath, ref) {
66
105
  const b64 = res.stdout.trim().replace(/\\n/g, '').replace(/\n/g, '');
67
106
  return Buffer.from(b64, 'base64').toString('utf8');
68
107
  }
69
- function listTree(repo, dirPath, ref) {
108
+ async function listTree(repo, dirPath, ref) {
109
+ const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`, { headers: apiHeaders() });
110
+ if (!res.ok) {
111
+ if (shouldFallback(res.status) && isGhAvailable()) {
112
+ return listTreeViaCli(repo, dirPath, ref);
113
+ }
114
+ throw new Error(`Failed to list tree ${dirPath} in ${repo}@${ref}: HTTP ${res.status}`);
115
+ }
116
+ const data = (await res.json());
117
+ const prefix = `${dirPath}/`;
118
+ return data.tree
119
+ .filter((item) => item.type === 'blob' && item.path.startsWith(prefix))
120
+ .map((item) => item.path);
121
+ }
122
+ function listTreeViaCli(repo, dirPath, ref) {
70
123
  const res = ghRun([
71
124
  'api',
72
125
  `repos/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`,
@@ -78,24 +131,75 @@ function listTree(repo, dirPath, ref) {
78
131
  }
79
132
  return res.stdout.trim().split('\n').filter(Boolean);
80
133
  }
81
- function fetchGitHub(repo, file, ref) {
82
- const resolvedRef = ref ?? 'HEAD';
134
+ async function resolveRef(repo, ref) {
135
+ if (ref !== '$latest')
136
+ return ref ?? 'HEAD';
137
+ // Try latest release first
138
+ const relRes = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/releases/latest`, {
139
+ headers: apiHeaders(),
140
+ });
141
+ if (relRes.ok) {
142
+ const rel = (await relRes.json());
143
+ return rel.tag_name;
144
+ }
145
+ // No releases (404) — fall back to most recent tag
146
+ if (relRes.status === 404) {
147
+ const tagRes = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/tags?per_page=1`, { headers: apiHeaders() });
148
+ if (tagRes.ok) {
149
+ const tags = (await tagRes.json());
150
+ if (tags.length)
151
+ return tags[0].name;
152
+ throw new Error(`No releases or tags found for ${repo}`);
153
+ }
154
+ if (shouldFallback(tagRes.status) && isGhAvailable()) {
155
+ return resolveRefViaCli(repo);
156
+ }
157
+ throw new Error(`Failed to resolve $latest for ${repo}: HTTP ${tagRes.status}`);
158
+ }
159
+ if (shouldFallback(relRes.status) && isGhAvailable()) {
160
+ return resolveRefViaCli(repo);
161
+ }
162
+ throw new Error(`Failed to resolve $latest for ${repo}: HTTP ${relRes.status}`);
163
+ }
164
+ function resolveRefViaCli(repo) {
165
+ const res = ghRun([
166
+ 'api',
167
+ `repos/${repo}/releases/latest`,
168
+ '--jq',
169
+ '.tag_name',
170
+ ]);
171
+ if (res.status === 0 && res.stdout.trim())
172
+ return res.stdout.trim();
173
+ // Fall back to most recent tag
174
+ const tagRes = ghRun([
175
+ 'api',
176
+ `repos/${repo}/tags?per_page=1`,
177
+ '--jq',
178
+ '.[0].name',
179
+ ]);
180
+ if (tagRes.status !== 0 || !tagRes.stdout.trim()) {
181
+ throw new Error(`No releases or tags found for ${repo}`);
182
+ }
183
+ return tagRes.stdout.trim();
184
+ }
185
+ async function fetchGitHub(repo, file, ref) {
186
+ const resolvedRef = await resolveRef(repo, ref);
83
187
  const normalizedPath = file.replace(/\/$/, '');
84
188
  const isDirectory = file.endsWith('/') ||
85
- detectPathType(repo, normalizedPath, resolvedRef) === 'directory';
189
+ (await detectPathType(repo, normalizedPath, resolvedRef)) === 'directory';
86
190
  if (!isDirectory) {
87
- const content = fetchFile(repo, normalizedPath, resolvedRef);
191
+ const content = await fetchFile(repo, normalizedPath, resolvedRef);
88
192
  return { files: new Map([[path.basename(normalizedPath), content]]) };
89
193
  }
90
- const paths = listTree(repo, normalizedPath, resolvedRef);
194
+ const paths = await listTree(repo, normalizedPath, resolvedRef);
91
195
  if (!paths.length) {
92
196
  throw new Error(`Failed to fetch ${file} from ${repo}@${resolvedRef} (not a file or empty directory)`);
93
197
  }
94
- const files = new Map();
95
- for (const p of paths) {
96
- files.set(path.relative(normalizedPath, p), fetchFile(repo, p, resolvedRef));
97
- }
98
- return { files };
198
+ const entries = await Promise.all(paths.map(async (p) => [
199
+ path.relative(normalizedPath, p),
200
+ await fetchFile(repo, p, resolvedRef),
201
+ ]));
202
+ return { files: new Map(entries) };
99
203
  }
100
204
  exports.fetchGitHub = fetchGitHub;
101
205
  //# sourceMappingURL=github.js.map