Skip to content

Commit 4dffa42

Browse files
committed
fix: support owner/repo shorthand in detectForge
The demo page uses repo="auths-dev/example-verify-badge" (no URL), which caused detectForge to return null. Now handles shorthand format.
1 parent d7a5834 commit 4dffa42

3 files changed

Lines changed: 26 additions & 14 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@auths-dev/verify",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"description": "Drop-in <auths-verify> web component for decentralized commit verification",
55
"type": "module",
66
"main": "dist/auths-verify.mjs",

src/resolvers/detect.ts

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,36 @@ import type { ForgeConfig, ForgeType } from './types';
99
* - forgeHint overrides auto-detection
1010
*/
1111
export function detectForge(repoUrl: string, forgeHint?: string): ForgeConfig | null {
12-
let url: URL;
12+
let url: URL | null = null;
1313
try {
1414
url = new URL(repoUrl);
1515
} catch {
16-
return null;
16+
// Not a full URL — try owner/repo shorthand
1717
}
1818

19-
// Strip .git suffix and trailing slash from pathname
20-
const path = url.pathname.replace(/\.git$/, '').replace(/\/$/, '');
21-
const segments = path.split('/').filter(Boolean);
19+
let owner: string;
20+
let repo: string;
2221

23-
if (segments.length < 2) return null;
24-
25-
const owner = segments[0];
26-
const repo = segments[1];
22+
if (url) {
23+
const path = url.pathname.replace(/\.git$/, '').replace(/\/$/, '');
24+
const segments = path.split('/').filter(Boolean);
25+
if (segments.length < 2) return null;
26+
owner = segments[0];
27+
repo = segments[1];
28+
} else {
29+
// Handle "owner/repo" shorthand
30+
const parts = repoUrl.split('/').filter(Boolean);
31+
if (parts.length < 2) return null;
32+
owner = parts[0];
33+
repo = parts[1];
34+
}
2735

2836
let type: ForgeType;
2937
let baseUrl: string;
3038

3139
if (forgeHint) {
3240
type = forgeHint as ForgeType;
33-
} else {
41+
} else if (url) {
3442
const host = url.hostname.toLowerCase();
3543
if (host === 'github.com') {
3644
type = 'github';
@@ -39,16 +47,20 @@ export function detectForge(repoUrl: string, forgeHint?: string): ForgeConfig |
3947
} else {
4048
type = 'gitea';
4149
}
50+
} else {
51+
// Shorthand without forge hint — assume GitHub
52+
type = 'github';
4253
}
4354

4455
switch (type) {
4556
case 'github':
4657
baseUrl = 'https://api.github.com';
4758
break;
4859
case 'gitlab':
49-
baseUrl = `${url.protocol}//${url.host}`;
60+
baseUrl = url ? `${url.protocol}//${url.host}` : 'https://gitlab.com';
5061
break;
5162
case 'gitea':
63+
if (!url) return null; // Gitea requires full URL for self-hosted
5264
baseUrl = `${url.protocol}//${url.host}`;
5365
break;
5466
default:

0 commit comments

Comments
 (0)