github-url-detection 8.2.0 → 9.0.1

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.
@@ -121,11 +121,14 @@ export declare const isUserTheOrganizationOwner: () => boolean;
121
121
  export declare const canUserEditRepo: () => boolean;
122
122
  export declare const isNewRepo: (url?: URL | HTMLAnchorElement | Location) => boolean;
123
123
  export declare const isNewRepoTemplate: (url?: URL | HTMLAnchorElement | Location) => boolean;
124
+ export type NameWithOwner = `${string}/${string}`;
124
125
  export type RepositoryInfo = {
126
+ /** The repo owner/user */
125
127
  owner: string;
128
+ /** The repo name */
126
129
  name: string;
127
130
  /** The 'user/repo' part from an URL */
128
- nameWithOwner: string;
131
+ nameWithOwner: NameWithOwner;
129
132
  /** A repo's subpage
130
133
  @example '/user/repo/issues/' -> 'issues'
131
134
  @example '/user/repo/' -> ''
@@ -137,7 +140,9 @@ export declare const utils: {
137
140
  name: string;
138
141
  path: string;
139
142
  } | undefined;
143
+ /** @deprecated Use `getLoggedInUser` */
140
144
  getUsername: () => string | undefined;
145
+ getLoggedInUser: () => string | undefined;
141
146
  getCleanPathname: (url?: URL | HTMLAnchorElement | Location) => string;
142
147
  getCleanGistPathname: (url?: URL | HTMLAnchorElement | Location) => string | undefined;
143
148
  getRepositoryInfo: (url?: URL | HTMLAnchorElement | Location | string) => RepositoryInfo | undefined;
@@ -1,370 +1,92 @@
1
- const reservedNames = [
2
- "300",
3
- "302",
4
- "400",
5
- "401",
6
- "402",
7
- "403",
8
- "404",
9
- "405",
10
- "406",
11
- "407",
12
- "408",
13
- "409",
14
- "410",
15
- "411",
16
- "412",
17
- "413",
18
- "414",
19
- "415",
20
- "416",
21
- "417",
22
- "418",
23
- "419",
24
- "420",
25
- "421",
26
- "422",
27
- "423",
28
- "424",
29
- "425",
30
- "426",
31
- "427",
32
- "428",
33
- "429",
34
- "430",
35
- "431",
36
- "500",
37
- "501",
38
- "502",
39
- "503",
40
- "504",
41
- "505",
42
- "506",
43
- "507",
44
- "508",
45
- "509",
46
- "510",
47
- "511",
48
- "693",
49
- "694",
50
- "695",
51
- "900",
52
- "about",
53
- "access",
54
- "account",
55
- "admin",
56
- "advisories",
57
- "anonymous",
58
- "any",
59
- "api",
60
- "apps",
61
- "attributes",
62
- "auth",
63
- "billing",
64
- "blob",
65
- "blog",
66
- "bounty",
67
- "branches",
68
- "business",
69
- "businesses",
70
- "c",
71
- "cache",
72
- "case-studies",
73
- "categories",
74
- "central",
75
- "certification",
76
- "changelog",
77
- "chat",
78
- "cla",
79
- "cloud",
80
- "codereview",
81
- "collection",
82
- "collections",
83
- "comments",
84
- "commit",
85
- "commits",
86
- "community",
87
- "companies",
88
- "compare",
89
- "contact",
90
- "contributing",
91
- "cookbook",
92
- "coupons",
93
- "customer-stories",
94
- "customer",
95
- "customers",
96
- "dashboard-feed",
97
- "dashboard",
98
- "dashboards",
99
- "design",
100
- "develop",
101
- "developer",
102
- "diff",
103
- "discover",
104
- "discussions",
105
- "docs",
106
- "downloads",
107
- "downtime",
108
- "editor",
109
- "editors",
110
- "edu",
111
- "enterprise",
112
- "events",
113
- "explore",
114
- "featured",
115
- "features",
116
- "files",
117
- "fixtures",
118
- "forked",
119
- "garage",
120
- "ghost",
121
- "gist",
122
- "gists",
123
- "graphs",
124
- "guide",
125
- "guides",
126
- "help",
127
- "help-wanted",
128
- "home",
129
- "hooks",
130
- "hosting",
131
- "hovercards",
132
- "identity",
133
- "images",
134
- "inbox",
135
- "individual",
136
- "info",
137
- "integration",
138
- "interfaces",
139
- "introduction",
140
- "invalid-email-address",
141
- "investors",
142
- "issues",
143
- "jobs",
144
- "join",
145
- "journal",
146
- "journals",
147
- "lab",
148
- "labs",
149
- "languages",
150
- "launch",
151
- "layouts",
152
- "learn",
153
- "legal",
154
- "library",
155
- "linux",
156
- "listings",
157
- "lists",
158
- "login",
159
- "logos",
160
- "logout",
161
- "mac",
162
- "maintenance",
163
- "malware",
164
- "man",
165
- "marketplace",
166
- "mention",
167
- "mentioned",
168
- "mentioning",
169
- "mentions",
170
- "migrating",
171
- "milestones",
172
- "mine",
173
- "mirrors",
174
- "mobile",
175
- "navigation",
176
- "network",
177
- "new",
178
- "news",
179
- "none",
180
- "nonprofit",
181
- "nonprofits",
182
- "notices",
183
- "notifications",
184
- "oauth",
185
- "offer",
186
- "open-source",
187
- "organisations",
188
- "organizations",
189
- "orgs",
190
- "pages",
191
- "partners",
192
- "payments",
193
- "personal",
194
- "plans",
195
- "plugins",
196
- "popular",
197
- "popularity",
198
- "posts",
199
- "press",
200
- "pricing",
201
- "professional",
202
- "projects",
203
- "pulls",
204
- "raw",
205
- "readme",
206
- "recommendations",
207
- "redeem",
208
- "releases",
209
- "render",
210
- "reply",
211
- "repositories",
212
- "resources",
213
- "restore",
214
- "revert",
215
- "save-net-neutrality",
216
- "saved",
217
- "scraping",
218
- "search",
219
- "security",
220
- "services",
221
- "sessions",
222
- "settings",
223
- "shareholders",
224
- "shop",
225
- "showcases",
226
- "signin",
227
- "signup",
228
- "site",
229
- "spam",
230
- "sponsors",
231
- "ssh",
232
- "staff",
233
- "starred",
234
- "stars",
235
- "static",
236
- "status",
237
- "statuses",
238
- "storage",
239
- "store",
240
- "stories",
241
- "styleguide",
242
- "subscriptions",
243
- "suggest",
244
- "suggestion",
245
- "suggestions",
246
- "support",
247
- "suspended",
248
- "talks",
249
- "teach",
250
- "teacher",
251
- "teachers",
252
- "teaching",
253
- "team",
254
- "teams",
255
- "ten",
256
- "terms",
257
- "timeline",
258
- "topic",
259
- "topics",
260
- "tos",
261
- "tour",
262
- "train",
263
- "training",
264
- "translations",
265
- "tree",
266
- "trending",
267
- "updates",
268
- "username",
269
- "users",
270
- "visualization",
271
- "w",
272
- "watching",
273
- "wiki",
274
- "windows",
275
- "works-with",
276
- "www0",
277
- "www1",
278
- "www2",
279
- "www3",
280
- "www4",
281
- "www5",
282
- "www6",
283
- "www7",
284
- "www8",
285
- "www9"
286
- ];
287
- const $ = (selector) => document.querySelector(selector);
288
- const exists = (selector) => Boolean($(selector));
289
- const is404 = () => /^(Page|File) not found · GitHub/.test(document.title);
290
- const is500 = () => document.title === "Server Error · GitHub" || document.title === "Unicorn! · GitHub" || document.title === "504 Gateway Time-out";
291
- const isPasswordConfirmation = () => document.title === "Confirm password" || document.title === "Confirm access";
292
- const isLoggedIn = () => exists("body.logged-in");
293
- const isBlame = (url = location) => Boolean(getRepo(url)?.path.startsWith("blame/"));
294
- const isCommit = (url = location) => isSingleCommit(url) || isPRCommit(url);
295
- const isCommitList = (url = location) => isRepoCommitList(url) || isPRCommitList(url);
296
- const isRepoCommitList = (url = location) => Boolean(getRepo(url)?.path.startsWith("commits"));
297
- const isCompare = (url = location) => Boolean(getRepo(url)?.path.startsWith("compare"));
298
- const isCompareWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).split("/").slice(3, 5).includes("_compare");
299
- const isDashboard = (url = location) => !isGist(url) && /^$|^(orgs\/[^/]+\/)?dashboard(-feed)?(\/|$)/.test(getCleanPathname(url));
300
- const isEnterprise = (url = location) => url.hostname !== "github.com" && url.hostname !== "gist.github.com";
301
- const isGist = (url = location) => typeof getCleanGistPathname(url) === "string";
302
- const isGlobalIssueOrPRList = (url = location) => ["issues", "pulls"].includes(url.pathname.split("/", 2)[1]);
303
- const isGlobalSearchResults = (url = location) => url.pathname === "/search" && new URLSearchParams(url.search).get("q") !== null;
304
- const isIssue = (url = location) => /^issues\/\d+/.test(getRepo(url)?.path) && document.title !== "GitHub · Where software is built";
305
- const isIssueOrPRList = (url = location) => isGlobalIssueOrPRList(url) || isRepoIssueOrPRList(url) || isMilestone(url);
306
- const isConversation = (url = location) => isIssue(url) || isPRConversation(url);
307
- const isLabelList = (url = location) => getRepo(url)?.path === "labels";
308
- const isMilestone = (url = location) => /^milestone\/\d+/.test(getRepo(url)?.path);
309
- const isMilestoneList = (url = location) => getRepo(url)?.path === "milestones";
310
- const isNewFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("new"));
311
- const isNewIssue = (url = location) => getRepo(url)?.path === "issues/new";
312
- const isNewRelease = (url = location) => getRepo(url)?.path === "releases/new";
313
- const isNewWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).endsWith("/_new");
314
- const isNotifications = (url = location) => getCleanPathname(url) === "notifications";
315
- const isOrganizationProfile = () => exists('meta[name="hovercard-subject-tag"][content^="organization"]');
316
- const isOrganizationRepo = () => exists('.AppHeader-context-full [data-hovercard-type="organization"]');
317
- const isTeamDiscussion = (url = location) => Boolean(getOrg(url)?.path.startsWith("teams"));
318
- const isOwnUserProfile = () => getCleanPathname() === getUsername();
319
- const isOwnOrganizationProfile = () => isOrganizationProfile() && !exists('[href*="contact/report-abuse?report="]');
320
- const isProject = (url = location) => /^projects\/\d+/.test(getRepo(url)?.path);
321
- const isProjects = (url = location) => getRepo(url)?.path === "projects";
322
- const isDiscussion = (url = location) => /^discussions\/\d+/.test(getRepo(url)?.path ?? getOrg(url)?.path);
323
- const isNewDiscussion = (url = location) => getRepo(url)?.path === "discussions/new" || getOrg(url)?.path === "discussions/new";
324
- const isDiscussionList = (url = location) => getRepo(url)?.path === "discussions" || getOrg(url)?.path === "discussions";
325
- const isPR = (url = location) => /^pull\/\d+/.test(getRepo(url)?.path) && !isPRConflicts(url);
326
- const isPRConflicts = (url = location) => /^pull\/\d+\/conflicts/.test(getRepo(url)?.path);
327
- const isPRList = (url = location) => url.pathname === "/pulls" || getRepo(url)?.path === "pulls";
328
- const isPRCommit = (url = location) => /^pull\/\d+\/commits\/[\da-f]{5,40}$/.test(getRepo(url)?.path);
329
- const isPRCommit404 = () => isPRCommit() && document.title.startsWith("Commit range not found · Pull Request");
330
- const isPRFile404 = () => isPRFiles() && document.title.startsWith("Commit range not found · Pull Request");
331
- const isPRConversation = (url = location) => /^pull\/\d+$/.test(getRepo(url)?.path);
332
- const isPRCommitList = (url = location) => /^pull\/\d+\/commits$/.test(getRepo(url)?.path);
333
- const isPRFiles = (url = location) => /^pull\/\d+\/files/.test(getRepo(url)?.path) || isPRCommit(url);
334
- const isQuickPR = (url = location) => isCompare(url) && /[?&]quick_pull=1(&|$)/.test(url.search);
335
- const isDraftPR = () => exists("#partial-discussion-header .octicon-git-pull-request-draft");
336
- const isOpenPR = () => exists("#partial-discussion-header :is(.octicon-git-pull-request, .octicon-git-pull-request-draft)");
337
- const isMergedPR = () => exists("#partial-discussion-header .octicon-git-merge");
338
- const isClosedPR = () => exists("#partial-discussion-header :is(.octicon-git-pull-request-closed, .octicon-git-merge)");
339
- const isClosedIssue = () => exists("#partial-discussion-header :is(.octicon-issue-closed, .octicon-skip)");
340
- const isReleases = (url = location) => getRepo(url)?.path === "releases";
341
- const isTags = (url = location) => getRepo(url)?.path === "tags";
342
- const isSingleReleaseOrTag = (url = location) => Boolean(getRepo(url)?.path.startsWith("releases/tag"));
343
- const isReleasesOrTags = (url = location) => isReleases(url) || isTags(url);
344
- const isDeletingFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("delete"));
345
- const isEditingFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("edit"));
346
- const hasFileEditor = (url = location) => isEditingFile(url) || isNewFile(url) || isDeletingFile(url);
347
- const isEditingRelease = (url = location) => Boolean(getRepo(url)?.path.startsWith("releases/edit"));
348
- const hasReleaseEditor = (url = location) => isEditingRelease(url) || isNewRelease(url);
349
- const isEditingWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).endsWith("/_edit");
350
- const hasWikiPageEditor = (url = location) => isEditingWikiPage(url) || isNewWikiPage(url);
351
- const isRepo = (url = location) => /^[^/]+\/[^/]+/.test(getCleanPathname(url)) && !reservedNames.includes(url.pathname.split("/", 2)[1]) && !isDashboard(url) && !isGist(url) && !isNewRepoTemplate(url);
352
- const hasRepoHeader = (url = location) => isRepo(url) && !isRepoSearch(url);
353
- const isEmptyRepoRoot = () => isRepoHome() && !exists('link[rel="canonical"]');
354
- const isEmptyRepo = () => exists('[aria-label="Cannot fork because repository is empty."]');
355
- const isPublicRepo = () => exists('meta[name="octolytics-dimension-repository_public"][content="true"]');
356
- const isArchivedRepo = () => Boolean(isRepo() && $("main > .flash-warn")?.textContent.includes("archived"));
357
- const isBlank = () => exists("main .blankslate:not([hidden] .blankslate)");
358
- const isRepoTaxonomyIssueOrPRList = (url = location) => /^labels\/.+|^milestones\/\d+(?!\/edit)/.test(getRepo(url)?.path);
359
- const isRepoIssueOrPRList = (url = location) => isRepoPRList(url) || isRepoIssueList(url) || isRepoTaxonomyIssueOrPRList(url);
360
- const isRepoPRList = (url = location) => Boolean(getRepo(url)?.path.startsWith("pulls"));
361
- const isRepoIssueList = (url = location) => (
1
+ // index.ts
2
+ import reservedNames from "github-reserved-names/reserved-names.json" with { type: "json" };
3
+ var $ = (selector) => document.querySelector(selector);
4
+ var exists = (selector) => Boolean($(selector));
5
+ var is404 = () => /^(Page|File) not found · GitHub/.test(document.title);
6
+ var is500 = () => document.title === "Server Error \xB7 GitHub" || document.title === "Unicorn! \xB7 GitHub" || document.title === "504 Gateway Time-out";
7
+ var isPasswordConfirmation = () => document.title === "Confirm password" || document.title === "Confirm access";
8
+ var isLoggedIn = () => exists("body.logged-in");
9
+ var isBlame = (url = location) => Boolean(getRepo(url)?.path.startsWith("blame/"));
10
+ var isCommit = (url = location) => isSingleCommit(url) || isPRCommit(url);
11
+ var isCommitList = (url = location) => isRepoCommitList(url) || isPRCommitList(url);
12
+ var isRepoCommitList = (url = location) => Boolean(getRepo(url)?.path.startsWith("commits"));
13
+ var isCompare = (url = location) => Boolean(getRepo(url)?.path.startsWith("compare"));
14
+ var isCompareWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).split("/").slice(3, 5).includes("_compare");
15
+ var isDashboard = (url = location) => !isGist(url) && /^$|^(orgs\/[^/]+\/)?dashboard(-feed)?(\/|$)/.test(getCleanPathname(url));
16
+ var isEnterprise = (url = location) => url.hostname !== "github.com" && url.hostname !== "gist.github.com";
17
+ var isGist = (url = location) => typeof getCleanGistPathname(url) === "string";
18
+ var isGlobalIssueOrPRList = (url = location) => ["issues", "pulls"].includes(url.pathname.split("/", 2)[1]);
19
+ var isGlobalSearchResults = (url = location) => url.pathname === "/search" && new URLSearchParams(url.search).get("q") !== null;
20
+ var isIssue = (url = location) => /^issues\/\d+/.test(getRepo(url)?.path) && document.title !== "GitHub \xB7 Where software is built";
21
+ var isIssueOrPRList = (url = location) => isGlobalIssueOrPRList(url) || isRepoIssueOrPRList(url) || isMilestone(url);
22
+ var isConversation = (url = location) => isIssue(url) || isPRConversation(url);
23
+ var isLabelList = (url = location) => getRepo(url)?.path === "labels";
24
+ var isMilestone = (url = location) => /^milestone\/\d+/.test(getRepo(url)?.path);
25
+ var isMilestoneList = (url = location) => getRepo(url)?.path === "milestones";
26
+ var isNewFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("new"));
27
+ var isNewIssue = (url = location) => getRepo(url)?.path === "issues/new";
28
+ var isNewRelease = (url = location) => getRepo(url)?.path === "releases/new";
29
+ var isNewWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).endsWith("/_new");
30
+ var isNotifications = (url = location) => getCleanPathname(url) === "notifications";
31
+ var isOrganizationProfile = () => exists('meta[name="hovercard-subject-tag"][content^="organization"]');
32
+ var isOrganizationRepo = () => exists('.AppHeader-context-full [data-hovercard-type="organization"]');
33
+ var isTeamDiscussion = (url = location) => Boolean(getOrg(url)?.path.startsWith("teams"));
34
+ var isOwnUserProfile = () => getCleanPathname() === getLoggedInUser();
35
+ var isOwnOrganizationProfile = () => isOrganizationProfile() && !exists('[href*="contact/report-abuse?report="]');
36
+ var isProject = (url = location) => /^projects\/\d+/.test(getRepo(url)?.path);
37
+ var isProjects = (url = location) => getRepo(url)?.path === "projects";
38
+ var isDiscussion = (url = location) => /^discussions\/\d+/.test(getRepo(url)?.path ?? getOrg(url)?.path);
39
+ var isNewDiscussion = (url = location) => getRepo(url)?.path === "discussions/new" || getOrg(url)?.path === "discussions/new";
40
+ var isDiscussionList = (url = location) => getRepo(url)?.path === "discussions" || getOrg(url)?.path === "discussions";
41
+ var isPR = (url = location) => /^pull\/\d+/.test(getRepo(url)?.path) && !isPRConflicts(url);
42
+ var isPRConflicts = (url = location) => /^pull\/\d+\/conflicts/.test(getRepo(url)?.path);
43
+ var isPRList = (url = location) => url.pathname === "/pulls" || getRepo(url)?.path === "pulls";
44
+ var isPRCommit = (url = location) => /^pull\/\d+\/commits\/[\da-f]{5,40}$/.test(getRepo(url)?.path);
45
+ var isPRCommit404 = () => isPRCommit() && document.title.startsWith("Commit range not found \xB7 Pull Request");
46
+ var isPRFile404 = () => isPRFiles() && document.title.startsWith("Commit range not found \xB7 Pull Request");
47
+ var isPRConversation = (url = location) => /^pull\/\d+$/.test(getRepo(url)?.path);
48
+ var isPRCommitList = (url = location) => /^pull\/\d+\/commits$/.test(getRepo(url)?.path);
49
+ var isPRFiles = (url = location) => /^pull\/\d+\/files/.test(getRepo(url)?.path) || isPRCommit(url);
50
+ var isQuickPR = (url = location) => isCompare(url) && /[?&]quick_pull=1(&|$)/.test(url.search);
51
+ var isDraftPR = () => exists("#partial-discussion-header .octicon-git-pull-request-draft");
52
+ var isOpenPR = () => exists("#partial-discussion-header :is(.octicon-git-pull-request, .octicon-git-pull-request-draft)");
53
+ var isMergedPR = () => exists("#partial-discussion-header .octicon-git-merge");
54
+ var isClosedPR = () => exists("#partial-discussion-header :is(.octicon-git-pull-request-closed, .octicon-git-merge)");
55
+ var isClosedIssue = () => exists("#partial-discussion-header :is(.octicon-issue-closed, .octicon-skip)");
56
+ var isReleases = (url = location) => getRepo(url)?.path === "releases";
57
+ var isTags = (url = location) => getRepo(url)?.path === "tags";
58
+ var isSingleReleaseOrTag = (url = location) => Boolean(getRepo(url)?.path.startsWith("releases/tag"));
59
+ var isReleasesOrTags = (url = location) => isReleases(url) || isTags(url);
60
+ var isDeletingFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("delete"));
61
+ var isEditingFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("edit"));
62
+ var hasFileEditor = (url = location) => isEditingFile(url) || isNewFile(url) || isDeletingFile(url);
63
+ var isEditingRelease = (url = location) => Boolean(getRepo(url)?.path.startsWith("releases/edit"));
64
+ var hasReleaseEditor = (url = location) => isEditingRelease(url) || isNewRelease(url);
65
+ var isEditingWikiPage = (url = location) => isRepoWiki(url) && getCleanPathname(url).endsWith("/_edit");
66
+ var hasWikiPageEditor = (url = location) => isEditingWikiPage(url) || isNewWikiPage(url);
67
+ var isRepo = (url = location) => {
68
+ const [user, repo, extra] = getCleanPathname(url).split("/");
69
+ return Boolean(
70
+ user && repo && !reservedNames.includes(user) && !url.hostname.startsWith("gist.") && extra !== "generate"
71
+ // Like isNewRepoTemplate but inlined for performance
72
+ );
73
+ };
74
+ var hasRepoHeader = (url = location) => isRepo(url) && !isRepoSearch(url);
75
+ var isEmptyRepoRoot = () => isRepoHome() && !exists('link[rel="canonical"]');
76
+ var isEmptyRepo = () => exists('[aria-label="Cannot fork because repository is empty."]');
77
+ var isPublicRepo = () => exists('meta[name="octolytics-dimension-repository_public"][content="true"]');
78
+ var isArchivedRepo = () => Boolean(isRepo() && $("main > .flash-warn")?.textContent.includes("archived"));
79
+ var isBlank = () => exists("main .blankslate:not([hidden] .blankslate)");
80
+ var isRepoTaxonomyIssueOrPRList = (url = location) => /^labels\/.+|^milestones\/\d+(?!\/edit)/.test(getRepo(url)?.path);
81
+ var isRepoIssueOrPRList = (url = location) => isRepoPRList(url) || isRepoIssueList(url) || isRepoTaxonomyIssueOrPRList(url);
82
+ var isRepoPRList = (url = location) => Boolean(getRepo(url)?.path.startsWith("pulls"));
83
+ var isRepoIssueList = (url = location) => (
362
84
  // `issues/fregante` is a list but `issues/1`, `issues/new`, `issues/new/choose`, `issues/templates/edit` aren’t
363
85
  /^labels\/|^issues(?!\/(\d+|new|templates)($|\/))/.test(getRepo(url)?.path)
364
86
  );
365
- const hasSearchParameter = (url) => new URLSearchParams(url.search).get("search") === "1";
366
- const isRepoHome = (url = location) => getRepo(url)?.path === "" && !hasSearchParameter(url);
367
- const _isRepoRoot = (url) => {
87
+ var hasSearchParameter = (url) => new URLSearchParams(url.search).get("search") === "1";
88
+ var isRepoHome = (url = location) => getRepo(url)?.path === "" && !hasSearchParameter(url);
89
+ var _isRepoRoot = (url) => {
368
90
  const repository = getRepo(url ?? location);
369
91
  if (!repository) {
370
92
  return false;
@@ -377,52 +99,52 @@ const _isRepoRoot = (url) => {
377
99
  }
378
100
  return repository.path.startsWith("tree/") && document.title.startsWith(repository.nameWithOwner) && !document.title.endsWith(repository.nameWithOwner);
379
101
  };
380
- const isRepoRoot = (url) => !hasSearchParameter(url ?? location) && _isRepoRoot(url);
381
- const isRepoSearch = (url = location) => getRepo(url)?.path === "search";
382
- const isRepoSettings = (url = location) => Boolean(getRepo(url)?.path.startsWith("settings"));
383
- const isRepoMainSettings = (url = location) => getRepo(url)?.path === "settings";
384
- const isRepliesSettings = (url = location) => url.pathname.startsWith("/settings/replies");
385
- const isUserSettings = (url = location) => url.pathname.startsWith("/settings/");
386
- const isRepoTree = (url = location) => _isRepoRoot(url) || Boolean(getRepo(url)?.path.startsWith("tree/"));
387
- const isRepoWiki = (url = location) => Boolean(getRepo(url)?.path.startsWith("wiki"));
388
- const isSingleCommit = (url = location) => /^commit\/[\da-f]{5,40}$/.test(getRepo(url)?.path);
389
- const isSingleFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("blob/"));
390
- const isFileFinder = (url = location) => Boolean(getRepo(url)?.path.startsWith("find/"));
391
- const isRepoFile404 = (url = location) => (isSingleFile(url) || isRepoTree(url)) && document.title.startsWith("File not found");
392
- const isRepoForksList = (url = location) => getRepo(url)?.path === "network/members";
393
- const isRepoNetworkGraph = (url = location) => getRepo(url)?.path === "network";
394
- const isForkedRepo = () => exists('meta[name="octolytics-dimension-repository_is_fork"][content="true"]');
395
- const isSingleGist = (url = location) => /^[^/]+\/[\da-f]{20,32}(\/[\da-f]{40})?$/.test(getCleanGistPathname(url));
396
- const isGistRevision = (url = location) => /^[^/]+\/[\da-f]{20,32}\/revisions$/.test(getCleanGistPathname(url));
397
- const isTrending = (url = location) => url.pathname === "/trending" || url.pathname.startsWith("/trending/");
398
- const isBranches = (url = location) => Boolean(getRepo(url)?.path.startsWith("branches"));
399
- const doesLookLikeAProfile = (string) => typeof string === "string" && string.length > 0 && !string.includes("/") && !string.includes(".") && !reservedNames.includes(string);
400
- const isProfile = (url = location) => !isGist(url) && doesLookLikeAProfile(getCleanPathname(url));
401
- const isGistProfile = (url = location) => doesLookLikeAProfile(getCleanGistPathname(url));
402
- const isUserProfile = () => isProfile() && !isOrganizationProfile();
403
- const isPrivateUserProfile = () => isUserProfile() && !exists('.UnderlineNav-item[href$="tab=stars"]');
404
- const isUserProfileMainTab = () => isUserProfile() && !new URLSearchParams(location.search).has("tab");
405
- const isUserProfileRepoTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "repositories";
406
- const isUserProfileStarsTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "stars";
407
- const isUserProfileFollowersTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "followers";
408
- const isUserProfileFollowingTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "following";
409
- const isProfileRepoList = (url = location) => isUserProfileRepoTab(url) || getOrg(url)?.path === "repositories";
410
- const hasComments = (url = location) => isPR(url) || isIssue(url) || isCommit(url) || isTeamDiscussion(url) || isSingleGist(url);
411
- const hasRichTextEditor = (url = location) => hasComments(url) || isNewIssue(url) || isCompare(url) || isRepliesSettings(url) || hasReleaseEditor(url) || isDiscussion(url) || isNewDiscussion(url);
412
- const hasCode = (url = location) => hasComments(url) || isRepoTree(url) || isRepoSearch(url) || isGlobalSearchResults(url) || isSingleFile(url) || isGist(url) || isCompare(url) || isCompareWikiPage(url) || isBlame(url);
413
- const hasFiles = (url = location) => isCommit(url) || isCompare(url) || isPRFiles(url);
414
- const isMarketplaceAction = (url = location) => url.pathname.startsWith("/marketplace/actions/");
415
- const isActionJobRun = (url = location) => Boolean(getRepo(url)?.path.startsWith("runs/"));
416
- const isActionRun = (url = location) => /^(actions\/)?runs/.test(getRepo(url)?.path);
417
- const isNewAction = (url = location) => getRepo(url)?.path === "actions/new";
418
- const isRepositoryActions = (url = location) => /^actions(\/workflows\/.+\.ya?ml)?$/.test(getRepo(url)?.path);
419
- const isUserTheOrganizationOwner = () => isOrganizationProfile() && exists('[aria-label="Organization"] [data-tab-item="org-header-settings-tab"]');
420
- const canUserEditRepo = () => isRepo() && exists('.reponav-item[href$="/settings"], [data-tab-item$="settings-tab"]');
421
- const isNewRepo = (url = location) => url.pathname === "/new" || /^organizations\/[^/]+\/repositories\/new$/.test(getCleanPathname(url));
422
- const isNewRepoTemplate = (url = location) => Boolean(url.pathname.split("/")[3] === "generate");
423
- const getUsername = () => $('meta[name="user-login"]')?.getAttribute("content") ?? void 0;
424
- const getCleanPathname = (url = location) => url.pathname.replaceAll(/\/+/g, "/").slice(1, url.pathname.endsWith("/") ? -1 : void 0);
425
- const getCleanGistPathname = (url = location) => {
102
+ var isRepoRoot = (url) => !hasSearchParameter(url ?? location) && _isRepoRoot(url);
103
+ var isRepoSearch = (url = location) => getRepo(url)?.path === "search";
104
+ var isRepoSettings = (url = location) => Boolean(getRepo(url)?.path.startsWith("settings"));
105
+ var isRepoMainSettings = (url = location) => getRepo(url)?.path === "settings";
106
+ var isRepliesSettings = (url = location) => url.pathname.startsWith("/settings/replies");
107
+ var isUserSettings = (url = location) => url.pathname.startsWith("/settings/");
108
+ var isRepoTree = (url = location) => _isRepoRoot(url) || Boolean(getRepo(url)?.path.startsWith("tree/"));
109
+ var isRepoWiki = (url = location) => Boolean(getRepo(url)?.path.startsWith("wiki"));
110
+ var isSingleCommit = (url = location) => /^commit\/[\da-f]{5,40}$/.test(getRepo(url)?.path);
111
+ var isSingleFile = (url = location) => Boolean(getRepo(url)?.path.startsWith("blob/"));
112
+ var isFileFinder = (url = location) => Boolean(getRepo(url)?.path.startsWith("find/"));
113
+ var isRepoFile404 = (url = location) => (isSingleFile(url) || isRepoTree(url)) && document.title.startsWith("File not found");
114
+ var isRepoForksList = (url = location) => getRepo(url)?.path === "network/members";
115
+ var isRepoNetworkGraph = (url = location) => getRepo(url)?.path === "network";
116
+ var isForkedRepo = () => exists('meta[name="octolytics-dimension-repository_is_fork"][content="true"]');
117
+ var isSingleGist = (url = location) => /^[^/]+\/[\da-f]{20,32}(\/[\da-f]{40})?$/.test(getCleanGistPathname(url));
118
+ var isGistRevision = (url = location) => /^[^/]+\/[\da-f]{20,32}\/revisions$/.test(getCleanGistPathname(url));
119
+ var isTrending = (url = location) => url.pathname === "/trending" || url.pathname.startsWith("/trending/");
120
+ var isBranches = (url = location) => Boolean(getRepo(url)?.path.startsWith("branches"));
121
+ var doesLookLikeAProfile = (string) => typeof string === "string" && string.length > 0 && !string.includes("/") && !string.includes(".") && !reservedNames.includes(string);
122
+ var isProfile = (url = location) => !isGist(url) && doesLookLikeAProfile(getCleanPathname(url));
123
+ var isGistProfile = (url = location) => doesLookLikeAProfile(getCleanGistPathname(url));
124
+ var isUserProfile = () => isProfile() && !isOrganizationProfile();
125
+ var isPrivateUserProfile = () => isUserProfile() && !exists('.UnderlineNav-item[href$="tab=stars"]');
126
+ var isUserProfileMainTab = () => isUserProfile() && !new URLSearchParams(location.search).has("tab");
127
+ var isUserProfileRepoTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "repositories";
128
+ var isUserProfileStarsTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "stars";
129
+ var isUserProfileFollowersTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "followers";
130
+ var isUserProfileFollowingTab = (url = location) => isProfile(url) && new URLSearchParams(url.search).get("tab") === "following";
131
+ var isProfileRepoList = (url = location) => isUserProfileRepoTab(url) || getOrg(url)?.path === "repositories";
132
+ var hasComments = (url = location) => isPR(url) || isIssue(url) || isCommit(url) || isTeamDiscussion(url) || isSingleGist(url);
133
+ var hasRichTextEditor = (url = location) => hasComments(url) || isNewIssue(url) || isCompare(url) || isRepliesSettings(url) || hasReleaseEditor(url) || isDiscussion(url) || isNewDiscussion(url);
134
+ var hasCode = (url = location) => hasComments(url) || isRepoTree(url) || isRepoSearch(url) || isGlobalSearchResults(url) || isSingleFile(url) || isGist(url) || isCompare(url) || isCompareWikiPage(url) || isBlame(url);
135
+ var hasFiles = (url = location) => isCommit(url) || isCompare(url) || isPRFiles(url);
136
+ var isMarketplaceAction = (url = location) => url.pathname.startsWith("/marketplace/actions/");
137
+ var isActionJobRun = (url = location) => Boolean(getRepo(url)?.path.startsWith("runs/"));
138
+ var isActionRun = (url = location) => /^(actions\/)?runs/.test(getRepo(url)?.path);
139
+ var isNewAction = (url = location) => getRepo(url)?.path === "actions/new";
140
+ var isRepositoryActions = (url = location) => /^actions(\/workflows\/.+\.ya?ml)?$/.test(getRepo(url)?.path);
141
+ var isUserTheOrganizationOwner = () => isOrganizationProfile() && exists('[aria-label="Organization"] [data-tab-item="org-header-settings-tab"]');
142
+ var canUserEditRepo = () => isRepo() && exists('.reponav-item[href$="/settings"], [data-tab-item$="settings-tab"]');
143
+ var isNewRepo = (url = location) => url.pathname === "/new" || /^organizations\/[^/]+\/repositories\/new$/.test(getCleanPathname(url));
144
+ var isNewRepoTemplate = (url = location) => Boolean(url.pathname.split("/")[3] === "generate");
145
+ var getLoggedInUser = () => $('meta[name="user-login"]')?.getAttribute("content") ?? void 0;
146
+ var getCleanPathname = (url = location) => url.pathname.replaceAll(/\/\/+/g, "/").replace(/\/$/, "").slice(1);
147
+ var getCleanGistPathname = (url = location) => {
426
148
  const pathname = getCleanPathname(url);
427
149
  if (url.hostname.startsWith("gist.")) {
428
150
  return pathname;
@@ -430,14 +152,14 @@ const getCleanGistPathname = (url = location) => {
430
152
  const [gist, ...parts] = pathname.split("/");
431
153
  return gist === "gist" ? parts.join("/") : void 0;
432
154
  };
433
- const getOrg = (url = location) => {
434
- const [, orgs, name, ...path] = url.pathname.split("/");
155
+ var getOrg = (url = location) => {
156
+ const [orgs, name, ...path] = getCleanPathname(url).split("/");
435
157
  if (orgs === "orgs" && name) {
436
158
  return { name, path: path.join("/") };
437
159
  }
438
160
  return void 0;
439
161
  };
440
- const getRepo = (url) => {
162
+ var getRepo = (url) => {
441
163
  if (!url) {
442
164
  const canonical = $('[property="og:url"]');
443
165
  if (canonical) {
@@ -457,13 +179,15 @@ const getRepo = (url) => {
457
179
  return {
458
180
  owner,
459
181
  name,
460
- nameWithOwner: owner + "/" + name,
182
+ nameWithOwner: `${owner}/${name}`,
461
183
  path: path.join("/")
462
184
  };
463
185
  };
464
- const utils = {
186
+ var utils = {
465
187
  getOrg,
466
- getUsername,
188
+ /** @deprecated Use `getLoggedInUser` */
189
+ getUsername: getLoggedInUser,
190
+ getLoggedInUser,
467
191
  getCleanPathname,
468
192
  getCleanGistPathname,
469
193
  getRepositoryInfo: getRepo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-url-detection",
3
- "version": "8.2.0",
3
+ "version": "9.0.1",
4
4
  "description": "Which GitHub page are you on? Is it an issue? Is it a list? Perfect for your WebExtension or userscript.",
5
5
  "keywords": [
6
6
  "github",
@@ -25,7 +25,7 @@
25
25
  ],
26
26
  "scripts": {
27
27
  "build": "run-p build:*",
28
- "build:vite": "vite build",
28
+ "build:esbuild": "esbuild index.ts --bundle --external:github-reserved-names --outdir=distribution --format=esm --drop-labels=TEST",
29
29
  "build:typescript": "tsc --declaration --emitDeclarationOnly",
30
30
  "build:demo": "vite build demo",
31
31
  "prepack": "npm run build",
@@ -49,25 +49,30 @@
49
49
  ],
50
50
  "rules": {
51
51
  "@typescript-eslint/triple-slash-reference": "off",
52
- "@typescript-eslint/naming-convention": "off"
52
+ "@typescript-eslint/naming-convention": "off",
53
+ "no-unused-labels": "off",
54
+ "no-labels": "off"
53
55
  }
54
56
  }
55
57
  ]
56
58
  },
59
+ "dependencies": {
60
+ "github-reserved-names": "^2.0.7"
61
+ },
57
62
  "devDependencies": {
58
- "@sindresorhus/tsconfig": "^5.0.0",
63
+ "@sindresorhus/tsconfig": "^6.0.0",
59
64
  "@sveltejs/vite-plugin-svelte": "^3.1.1",
60
- "github-reserved-names": "^2.0.5",
65
+ "esbuild": "^0.23.1",
61
66
  "npm-run-all": "^4.1.5",
62
67
  "strip-indent": "^4.0.0",
63
- "svelte": "^4.2.17",
64
- "svelte-check": "^3.8.0",
65
- "typescript": "^5.4.5",
66
- "vite": "^5.2.12",
67
- "vitest": "^1.6.0",
68
- "xo": "^0.58.0"
68
+ "svelte": "^4.2.18",
69
+ "svelte-check": "^3.8.5",
70
+ "typescript": "^5.5.4",
71
+ "vite": "^5.4.2",
72
+ "vitest": "^2.0.5",
73
+ "xo": "^0.59.3"
69
74
  },
70
75
  "engines": {
71
- "node": ">=18"
76
+ "node": ">=20.10"
72
77
  }
73
78
  }