@dynamik-dev/refdocs 0.1.1 → 0.4.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 (40) hide show
  1. package/README.md +39 -28
  2. package/dist/src/add.d.ts +29 -0
  3. package/dist/src/add.d.ts.map +1 -0
  4. package/dist/src/add.js +142 -0
  5. package/dist/src/add.js.map +1 -0
  6. package/dist/src/config.d.ts +8 -0
  7. package/dist/src/config.d.ts.map +1 -1
  8. package/dist/src/config.js +73 -2
  9. package/dist/src/config.js.map +1 -1
  10. package/dist/src/github.d.ts +9 -0
  11. package/dist/src/github.d.ts.map +1 -0
  12. package/dist/src/github.js +51 -0
  13. package/dist/src/github.js.map +1 -0
  14. package/dist/src/index.js +281 -21
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/indexer.js +1 -1
  17. package/dist/src/indexer.js.map +1 -1
  18. package/dist/src/search.d.ts +1 -0
  19. package/dist/src/search.d.ts.map +1 -1
  20. package/dist/src/search.js +5 -0
  21. package/dist/src/search.js.map +1 -1
  22. package/dist/src/types.d.ts +10 -0
  23. package/dist/src/types.d.ts.map +1 -1
  24. package/dist/tests/add.test.d.ts +2 -0
  25. package/dist/tests/add.test.d.ts.map +1 -0
  26. package/dist/tests/add.test.js +332 -0
  27. package/dist/tests/add.test.js.map +1 -0
  28. package/dist/tests/config.test.js +42 -1
  29. package/dist/tests/config.test.js.map +1 -1
  30. package/dist/tests/github.test.d.ts +2 -0
  31. package/dist/tests/github.test.d.ts.map +1 -0
  32. package/dist/tests/github.test.js +73 -0
  33. package/dist/tests/github.test.js.map +1 -0
  34. package/dist/tests/global.test.d.ts +2 -0
  35. package/dist/tests/global.test.d.ts.map +1 -0
  36. package/dist/tests/global.test.js +160 -0
  37. package/dist/tests/global.test.js.map +1 -0
  38. package/dist/tests/indexer.test.js +19 -0
  39. package/dist/tests/indexer.test.js.map +1 -1
  40. package/package.json +4 -2
@@ -0,0 +1,332 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { readFileSync, mkdtempSync, rmSync, existsSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { extractMarkdownFiles, updateSources, addLocalPath, removePath, isPathCovered } from "../src/add.js";
6
+ const FIXTURE_PATH = join(import.meta.dirname, "fixtures", "test-repo.tar.gz");
7
+ describe("extractMarkdownFiles", () => {
8
+ let tmpDir;
9
+ let tarball;
10
+ beforeEach(() => {
11
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-add-"));
12
+ tarball = readFileSync(FIXTURE_PATH);
13
+ });
14
+ afterEach(() => {
15
+ rmSync(tmpDir, { recursive: true, force: true });
16
+ });
17
+ it("extracts all .md files when no subpath filter", async () => {
18
+ const count = await extractMarkdownFiles(tarball, "", join(tmpDir, "out"));
19
+ expect(count).toBe(4);
20
+ expect(existsSync(join(tmpDir, "out", "README.md"))).toBe(true);
21
+ expect(existsSync(join(tmpDir, "out", "docs", "guide.md"))).toBe(true);
22
+ expect(existsSync(join(tmpDir, "out", "docs", "api.md"))).toBe(true);
23
+ expect(existsSync(join(tmpDir, "out", "docs", "nested", "advanced.md"))).toBe(true);
24
+ });
25
+ it("filters to subpath", async () => {
26
+ const count = await extractMarkdownFiles(tarball, "docs", join(tmpDir, "out"));
27
+ expect(count).toBe(3);
28
+ expect(existsSync(join(tmpDir, "out", "guide.md"))).toBe(true);
29
+ expect(existsSync(join(tmpDir, "out", "api.md"))).toBe(true);
30
+ expect(existsSync(join(tmpDir, "out", "nested", "advanced.md"))).toBe(true);
31
+ expect(existsSync(join(tmpDir, "out", "README.md"))).toBe(false);
32
+ });
33
+ it("filters nested subpath", async () => {
34
+ const count = await extractMarkdownFiles(tarball, "docs/nested", join(tmpDir, "out"));
35
+ expect(count).toBe(1);
36
+ expect(existsSync(join(tmpDir, "out", "advanced.md"))).toBe(true);
37
+ });
38
+ it("excludes non-.md files", async () => {
39
+ await extractMarkdownFiles(tarball, "", join(tmpDir, "out"));
40
+ expect(existsSync(join(tmpDir, "out", "src", "code.ts"))).toBe(false);
41
+ expect(existsSync(join(tmpDir, "out", "notes.txt"))).toBe(false);
42
+ });
43
+ it("preserves file content", async () => {
44
+ await extractMarkdownFiles(tarball, "docs", join(tmpDir, "out"));
45
+ const content = readFileSync(join(tmpDir, "out", "guide.md"), "utf-8");
46
+ expect(content).toBe("# Guide\n\nA user guide.\n");
47
+ });
48
+ it("returns 0 for subpath with no .md files", async () => {
49
+ const count = await extractMarkdownFiles(tarball, "src", join(tmpDir, "out"));
50
+ expect(count).toBe(0);
51
+ });
52
+ it("returns 0 for nonexistent subpath", async () => {
53
+ const count = await extractMarkdownFiles(tarball, "nonexistent", join(tmpDir, "out"));
54
+ expect(count).toBe(0);
55
+ });
56
+ });
57
+ vi.mock("../src/github.js", async (importOriginal) => {
58
+ const actual = await importOriginal();
59
+ return {
60
+ ...actual,
61
+ downloadTarball: vi.fn(async () => {
62
+ const buf = readFileSync(FIXTURE_PATH);
63
+ return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
64
+ }),
65
+ };
66
+ });
67
+ describe("updateSources", () => {
68
+ let tmpDir;
69
+ beforeEach(() => {
70
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-update-"));
71
+ });
72
+ afterEach(() => {
73
+ rmSync(tmpDir, { recursive: true, force: true });
74
+ });
75
+ it("re-downloads files for all configured sources", async () => {
76
+ const config = {
77
+ paths: ["ref-docs/test-repo"],
78
+ index: ".refdocs-index.json",
79
+ chunkMaxTokens: 800,
80
+ chunkMinTokens: 100,
81
+ boostFields: { title: 2, headings: 1.5, body: 1 },
82
+ sources: [
83
+ {
84
+ url: "https://github.com/test/repo",
85
+ owner: "test",
86
+ repo: "repo",
87
+ branch: "main",
88
+ subpath: "docs",
89
+ localPath: "ref-docs/test-repo",
90
+ addedAt: "2025-01-01T00:00:00.000Z",
91
+ },
92
+ ],
93
+ };
94
+ const results = await updateSources(config, tmpDir);
95
+ expect(results).toHaveLength(1);
96
+ expect(results[0].filesWritten).toBe(3);
97
+ expect(results[0].source.owner).toBe("test");
98
+ expect(existsSync(join(tmpDir, "ref-docs/test-repo", "guide.md"))).toBe(true);
99
+ expect(existsSync(join(tmpDir, "ref-docs/test-repo", "api.md"))).toBe(true);
100
+ });
101
+ it("handles multiple sources", async () => {
102
+ const config = {
103
+ paths: ["ref-docs/a", "ref-docs/b"],
104
+ index: ".refdocs-index.json",
105
+ chunkMaxTokens: 800,
106
+ chunkMinTokens: 100,
107
+ boostFields: { title: 2, headings: 1.5, body: 1 },
108
+ sources: [
109
+ {
110
+ url: "https://github.com/test/a",
111
+ owner: "test",
112
+ repo: "a",
113
+ branch: "HEAD",
114
+ subpath: "",
115
+ localPath: "ref-docs/a",
116
+ addedAt: "2025-01-01T00:00:00.000Z",
117
+ },
118
+ {
119
+ url: "https://github.com/test/b",
120
+ owner: "test",
121
+ repo: "b",
122
+ branch: "main",
123
+ subpath: "docs",
124
+ localPath: "ref-docs/b",
125
+ addedAt: "2025-01-01T00:00:00.000Z",
126
+ },
127
+ ],
128
+ };
129
+ const results = await updateSources(config, tmpDir);
130
+ expect(results).toHaveLength(2);
131
+ expect(results[0].filesWritten).toBe(4);
132
+ expect(results[1].filesWritten).toBe(3);
133
+ });
134
+ it("throws when no sources are configured", async () => {
135
+ const config = {
136
+ paths: [],
137
+ index: ".refdocs-index.json",
138
+ chunkMaxTokens: 800,
139
+ chunkMinTokens: 100,
140
+ boostFields: { title: 2, headings: 1.5, body: 1 },
141
+ };
142
+ await expect(updateSources(config, tmpDir)).rejects.toThrow("No sources configured");
143
+ });
144
+ });
145
+ describe("config updates via addFromUrl", () => {
146
+ let tmpDir;
147
+ beforeEach(() => {
148
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-add-cfg-"));
149
+ });
150
+ afterEach(() => {
151
+ rmSync(tmpDir, { recursive: true, force: true });
152
+ });
153
+ it("saveConfig merges into existing config", async () => {
154
+ const { saveConfig } = await import("../src/config.js");
155
+ writeFileSync(join(tmpDir, ".refdocs.json"), JSON.stringify({ paths: ["docs"], chunkMaxTokens: 500 }));
156
+ saveConfig({ paths: ["docs", "ref-docs/laravel"] }, tmpDir);
157
+ const result = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
158
+ expect(result.paths).toEqual(["docs", "ref-docs/laravel"]);
159
+ expect(result.chunkMaxTokens).toBe(500);
160
+ });
161
+ it("saveConfig creates config if none exists", async () => {
162
+ const { saveConfig } = await import("../src/config.js");
163
+ saveConfig({ paths: ["ref-docs/test"] }, tmpDir);
164
+ const result = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
165
+ expect(result.paths).toEqual(["ref-docs/test"]);
166
+ });
167
+ });
168
+ describe("addLocalPath", () => {
169
+ let tmpDir;
170
+ const baseConfig = {
171
+ paths: ["existing-docs"],
172
+ index: ".refdocs-index.json",
173
+ chunkMaxTokens: 800,
174
+ chunkMinTokens: 100,
175
+ boostFields: { title: 2, headings: 1.5, body: 1 },
176
+ };
177
+ beforeEach(() => {
178
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-addlocal-"));
179
+ writeFileSync(join(tmpDir, ".refdocs.json"), JSON.stringify(baseConfig));
180
+ });
181
+ afterEach(() => {
182
+ rmSync(tmpDir, { recursive: true, force: true });
183
+ });
184
+ it("adds a local path to config", () => {
185
+ const docsDir = join(tmpDir, "my-docs");
186
+ mkdirSync(docsDir, { recursive: true });
187
+ writeFileSync(join(docsDir, "readme.md"), "# Hello");
188
+ const result = addLocalPath("my-docs", tmpDir, baseConfig);
189
+ expect(result.localPath).toBe("my-docs");
190
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
191
+ expect(saved.paths).toEqual(["existing-docs", "my-docs"]);
192
+ });
193
+ it("skips duplicate paths", () => {
194
+ const docsDir = join(tmpDir, "existing-docs");
195
+ mkdirSync(docsDir, { recursive: true });
196
+ writeFileSync(join(docsDir, "readme.md"), "# Hello");
197
+ const result = addLocalPath("existing-docs", tmpDir, baseConfig);
198
+ expect(result.localPath).toBe("existing-docs");
199
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
200
+ expect(saved.paths).toEqual(["existing-docs"]);
201
+ });
202
+ it("throws for nonexistent directory", () => {
203
+ expect(() => addLocalPath("nope", tmpDir, baseConfig)).toThrow("Directory not found: nope");
204
+ });
205
+ it("throws if directory has no .md files", () => {
206
+ const emptyDir = join(tmpDir, "empty");
207
+ mkdirSync(emptyDir, { recursive: true });
208
+ writeFileSync(join(emptyDir, "data.json"), "{}");
209
+ expect(() => addLocalPath("empty", tmpDir, baseConfig)).toThrow("No .md files found");
210
+ });
211
+ it("finds .md files in subdirectories", () => {
212
+ const parentDir = join(tmpDir, "parent");
213
+ const childDir = join(parentDir, "child");
214
+ mkdirSync(childDir, { recursive: true });
215
+ writeFileSync(join(childDir, "nested.md"), "# Nested");
216
+ const result = addLocalPath("parent", tmpDir, baseConfig);
217
+ expect(result.localPath).toBe("parent");
218
+ });
219
+ });
220
+ describe("removePath", () => {
221
+ let tmpDir;
222
+ const baseConfig = {
223
+ paths: ["docs", "ref-docs/laravel"],
224
+ index: ".refdocs-index.json",
225
+ chunkMaxTokens: 800,
226
+ chunkMinTokens: 100,
227
+ boostFields: { title: 2, headings: 1.5, body: 1 },
228
+ sources: [
229
+ {
230
+ url: "https://github.com/laravel/docs",
231
+ owner: "laravel",
232
+ repo: "docs",
233
+ branch: "11.x",
234
+ subpath: "",
235
+ localPath: "ref-docs/laravel",
236
+ addedAt: "2025-01-01T00:00:00.000Z",
237
+ },
238
+ ],
239
+ };
240
+ beforeEach(() => {
241
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-remove-"));
242
+ writeFileSync(join(tmpDir, ".refdocs.json"), JSON.stringify(baseConfig));
243
+ });
244
+ afterEach(() => {
245
+ rmSync(tmpDir, { recursive: true, force: true });
246
+ });
247
+ it("removes a path from config", () => {
248
+ const result = removePath("docs", tmpDir, baseConfig);
249
+ expect(result.removed).toBe(true);
250
+ expect(result.sourceRemoved).toBe(false);
251
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
252
+ expect(saved.paths).toEqual(["ref-docs/laravel"]);
253
+ });
254
+ it("also removes matching source", () => {
255
+ const result = removePath("ref-docs/laravel", tmpDir, baseConfig);
256
+ expect(result.removed).toBe(true);
257
+ expect(result.sourceRemoved).toBe(true);
258
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
259
+ expect(saved.paths).toEqual(["docs"]);
260
+ expect(saved.sources).toEqual([]);
261
+ });
262
+ it("returns removed: false for unknown path", () => {
263
+ const result = removePath("nonexistent", tmpDir, baseConfig);
264
+ expect(result.removed).toBe(false);
265
+ expect(result.sourceRemoved).toBe(false);
266
+ });
267
+ });
268
+ describe("isPathCovered", () => {
269
+ it("returns true for exact match", () => {
270
+ expect(isPathCovered(["ref-docs"], "ref-docs")).toBe(true);
271
+ });
272
+ it("returns true when new path is a subdirectory of existing", () => {
273
+ expect(isPathCovered(["ref-docs"], "ref-docs/honojs/website/docs")).toBe(true);
274
+ });
275
+ it("returns false when new path is not covered", () => {
276
+ expect(isPathCovered(["docs"], "ref-docs/honojs")).toBe(false);
277
+ });
278
+ it("returns false when new path is a parent of existing", () => {
279
+ expect(isPathCovered(["ref-docs/honojs"], "ref-docs")).toBe(false);
280
+ });
281
+ it("returns false for shared prefix that is not parent-child", () => {
282
+ expect(isPathCovered(["ref-docs-v2"], "ref-docs")).toBe(false);
283
+ expect(isPathCovered(["ref-docs"], "ref-docs-v2")).toBe(false);
284
+ });
285
+ it("returns false for empty paths array", () => {
286
+ expect(isPathCovered([], "ref-docs")).toBe(false);
287
+ });
288
+ });
289
+ describe("addFromUrl overlapping paths", () => {
290
+ let tmpDir;
291
+ beforeEach(() => {
292
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-overlap-"));
293
+ writeFileSync(join(tmpDir, ".refdocs.json"), JSON.stringify({
294
+ paths: ["ref-docs"],
295
+ index: ".refdocs-index.json",
296
+ chunkMaxTokens: 800,
297
+ chunkMinTokens: 100,
298
+ boostFields: { title: 2, headings: 1.5, body: 1 },
299
+ }));
300
+ });
301
+ afterEach(() => {
302
+ rmSync(tmpDir, { recursive: true, force: true });
303
+ });
304
+ it("does not add subpath when parent is already in paths", async () => {
305
+ const { addFromUrl } = await import("../src/add.js");
306
+ const config = {
307
+ paths: ["ref-docs"],
308
+ index: ".refdocs-index.json",
309
+ chunkMaxTokens: 800,
310
+ chunkMinTokens: 100,
311
+ boostFields: { title: 2, headings: 1.5, body: 1 },
312
+ };
313
+ await addFromUrl("https://github.com/honojs/website/tree/main/docs", { path: "ref-docs/honojs/website/docs" }, tmpDir, config);
314
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
315
+ expect(saved.paths).toEqual(["ref-docs"]);
316
+ });
317
+ it("adds path when not covered by existing paths", async () => {
318
+ const { addFromUrl } = await import("../src/add.js");
319
+ const config = {
320
+ paths: ["docs"],
321
+ index: ".refdocs-index.json",
322
+ chunkMaxTokens: 800,
323
+ chunkMinTokens: 100,
324
+ boostFields: { title: 2, headings: 1.5, body: 1 },
325
+ };
326
+ writeFileSync(join(tmpDir, ".refdocs.json"), JSON.stringify(config));
327
+ await addFromUrl("https://github.com/honojs/website/tree/main/docs", { path: "ref-docs/honojs/website/docs" }, tmpDir, config);
328
+ const saved = JSON.parse(readFileSync(join(tmpDir, ".refdocs.json"), "utf-8"));
329
+ expect(saved.paths).toContain("ref-docs/honojs/website/docs");
330
+ });
331
+ });
332
+ //# sourceMappingURL=add.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.test.js","sourceRoot":"","sources":["../../tests/add.test.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
2
  import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
- import { loadConfig, validateConfig } from "../src/config.js";
5
+ import { readFileSync, existsSync } from "node:fs";
6
+ import { loadConfig, validateConfig, configExists, initConfig, CONFIG_FILENAME } from "../src/config.js";
6
7
  describe("validateConfig", () => {
7
8
  it("returns no errors for valid config", () => {
8
9
  expect(validateConfig({
@@ -91,4 +92,44 @@ describe("loadConfig", () => {
91
92
  expect(() => loadConfig(tmpDir)).toThrow("Invalid .refdocs.json");
92
93
  });
93
94
  });
95
+ describe("configExists", () => {
96
+ let tmpDir;
97
+ beforeEach(() => {
98
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-test-"));
99
+ });
100
+ afterEach(() => {
101
+ rmSync(tmpDir, { recursive: true, force: true });
102
+ });
103
+ it("returns false when no config file exists", () => {
104
+ expect(configExists(tmpDir)).toBe(false);
105
+ });
106
+ it("returns true when config file exists", () => {
107
+ writeFileSync(join(tmpDir, CONFIG_FILENAME), "{}");
108
+ expect(configExists(tmpDir)).toBe(true);
109
+ });
110
+ });
111
+ describe("initConfig", () => {
112
+ let tmpDir;
113
+ beforeEach(() => {
114
+ tmpDir = mkdtempSync(join(tmpdir(), "refdocs-test-"));
115
+ });
116
+ afterEach(() => {
117
+ rmSync(tmpDir, { recursive: true, force: true });
118
+ });
119
+ it("creates .refdocs.json with full defaults", () => {
120
+ initConfig(tmpDir);
121
+ const configPath = join(tmpDir, CONFIG_FILENAME);
122
+ expect(existsSync(configPath)).toBe(true);
123
+ const written = JSON.parse(readFileSync(configPath, "utf-8"));
124
+ expect(written.paths).toEqual(["ref-docs"]);
125
+ expect(written.index).toBe(".refdocs-index.json");
126
+ expect(written.chunkMaxTokens).toBe(800);
127
+ expect(written.chunkMinTokens).toBe(100);
128
+ expect(written.boostFields).toEqual({ title: 2, headings: 1.5, body: 1 });
129
+ });
130
+ it("throws if config already exists", () => {
131
+ writeFileSync(join(tmpDir, CONFIG_FILENAME), "{}");
132
+ expect(() => initConfig(tmpDir)).toThrow(".refdocs.json already exists");
133
+ });
134
+ });
94
135
  //# sourceMappingURL=config.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../tests/config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../tests/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzG,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CACJ,cAAc,CAAC;YACb,KAAK,EAAE,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE;SAClD,CAAC,CACH,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CACtD,4CAA4C,CAC7C,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CACzD,4CAA4C,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CACrD,4CAA4C,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAC7D,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CACzD,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAC3C,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3C,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9C,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAC1C,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=github.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.d.ts","sourceRoot":"","sources":["../../tests/github.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { parseGitHubUrl } from "../src/github.js";
3
+ describe("parseGitHubUrl", () => {
4
+ it("parses owner/repo URL", () => {
5
+ const result = parseGitHubUrl("https://github.com/laravel/docs");
6
+ expect(result).toEqual({
7
+ owner: "laravel",
8
+ repo: "docs",
9
+ branch: null,
10
+ subpath: "",
11
+ });
12
+ });
13
+ it("parses URL with branch", () => {
14
+ const result = parseGitHubUrl("https://github.com/laravel/docs/tree/11.x");
15
+ expect(result).toEqual({
16
+ owner: "laravel",
17
+ repo: "docs",
18
+ branch: "11.x",
19
+ subpath: "",
20
+ });
21
+ });
22
+ it("parses URL with branch and subpath", () => {
23
+ const result = parseGitHubUrl("https://github.com/statamic/docs/tree/6.x/content");
24
+ expect(result).toEqual({
25
+ owner: "statamic",
26
+ repo: "docs",
27
+ branch: "6.x",
28
+ subpath: "content",
29
+ });
30
+ });
31
+ it("parses URL with deep subpath", () => {
32
+ const result = parseGitHubUrl("https://github.com/owner/repo/tree/main/docs/en/guide");
33
+ expect(result).toEqual({
34
+ owner: "owner",
35
+ repo: "repo",
36
+ branch: "main",
37
+ subpath: "docs/en/guide",
38
+ });
39
+ });
40
+ it("handles trailing slash", () => {
41
+ const result = parseGitHubUrl("https://github.com/laravel/docs/");
42
+ expect(result).toEqual({
43
+ owner: "laravel",
44
+ repo: "docs",
45
+ branch: null,
46
+ subpath: "",
47
+ });
48
+ });
49
+ it("strips .git suffix", () => {
50
+ const result = parseGitHubUrl("https://github.com/laravel/docs.git");
51
+ expect(result).toEqual({
52
+ owner: "laravel",
53
+ repo: "docs",
54
+ branch: null,
55
+ subpath: "",
56
+ });
57
+ });
58
+ it("rejects non-GitHub URLs", () => {
59
+ expect(() => parseGitHubUrl("https://gitlab.com/owner/repo")).toThrow("Only GitHub URLs are supported");
60
+ });
61
+ it("rejects invalid URLs", () => {
62
+ expect(() => parseGitHubUrl("not-a-url")).toThrow("Invalid URL");
63
+ });
64
+ it("rejects URL with only owner", () => {
65
+ expect(() => parseGitHubUrl("https://github.com/owner")).toThrow("Could not parse owner/repo");
66
+ });
67
+ it("handles http URLs", () => {
68
+ const result = parseGitHubUrl("http://github.com/owner/repo");
69
+ expect(result.owner).toBe("owner");
70
+ expect(result.repo).toBe("repo");
71
+ });
72
+ });
73
+ //# sourceMappingURL=github.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.js","sourceRoot":"","sources":["../../tests/github.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.test.d.ts","sourceRoot":"","sources":["../../tests/global.test.ts"],"names":[],"mappings":""}