From d29f935e64953696e8f2ca7829164b9c6fb87c7b Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Fri, 15 Dec 2023 14:19:11 +0800 Subject: [PATCH] feat: resolve embedded repos overview data --- src/platforms/GitHub/DOMHelper.ts | 45 ++++++++++++++++++++++++------- src/platforms/GitHub/index.ts | 6 ++--- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/platforms/GitHub/DOMHelper.ts b/src/platforms/GitHub/DOMHelper.ts index 8740965..1de1bae 100644 --- a/src/platforms/GitHub/DOMHelper.ts +++ b/src/platforms/GitHub/DOMHelper.ts @@ -27,28 +27,33 @@ const selectors = { pathContext: '[data-testid="breadcrumbs"]', pathContextFileName: '[data-testid="breadcrumbs-filename"]', pathContextScreenReaderHeading: '[data-testid="screen-reader-heading"]', + embeddedData: { + app: 'script[type="application/json"][data-target="react-app.embeddedData"]', + reposOverview: + '[partial-name="repos-overview"] script[type="application/json"][data-target="react-partial.embeddedData"]', + }, }, } -export function resolveMetaFromDOMJSON(): { defaultBranch: string; metaData: MetaData } | void { - // in code page, there is a JSON script tag in DOM with meta data - const json = $('script[type="application/json"][data-target="react-app.embeddedData"]', e => { +const getDOMJSON = (selector: string) => + $(selector, e => { try { return JSON.parse(e.textContent || '') } catch (error) { return null } }) - if (!json) return - - const { payload } = json - if (!payload) return +function getMetaFromPayload(payload: any) { const { repo, refInfo } = payload if (!repo || !refInfo) return const { defaultBranch, name: repoName, ownerLogin: userName } = repo const { name: branchName } = refInfo + + // TODO: use runtime type check + if (!defaultBranch || !repoName || !userName || !branchName) return + return { defaultBranch, metaData: { @@ -59,8 +64,28 @@ export function resolveMetaFromDOMJSON(): { defaultBranch: string; metaData: Met } } +// in code page, there is a JSON script tag in DOM with meta data +function resolveEmbeddedAppData() { + const appData = getDOMJSON(selectors.globalNavigation.embeddedData.app) + const payload = appData?.payload + if (payload) return getMetaFromPayload(payload) +} + +function resolveEmbeddedReposOverviewData() { + const reposOverviewData = getDOMJSON(selectors.globalNavigation.embeddedData.reposOverview) + const payload = reposOverviewData?.props?.initialPayload + if (payload) return getMetaFromPayload(payload) +} + +export function resolveEmbeddedData(): { + defaultBranch: string + metaData: MetaData +} | void { + return resolveEmbeddedAppData() || resolveEmbeddedReposOverviewData() +} + export function resolveMeta(): Partial { - const dataFromJSON = resolveMetaFromDOMJSON() + const dataFromJSON = resolveEmbeddedData() if (dataFromJSON) return dataFromJSON.metaData const metaData = { @@ -129,7 +154,9 @@ export function getCurrentBranch(passive = false) { ].join() const branchButtonElement = $(selectedBranchButtonSelector) if (branchButtonElement) { - const branchNameSpanElement = branchButtonElement.querySelector('span') + const branchNameSpanElement = branchButtonElement.querySelector( + ['.ref-selector-button-text-container', 'span'].join(), + ) if (branchNameSpanElement) { const partialBranchNameFromInnerText = branchNameSpanElement.textContent?.trim() || '' if (partialBranchNameFromInnerText && !partialBranchNameFromInnerText.includes('…')) diff --git a/src/platforms/GitHub/index.ts b/src/platforms/GitHub/index.ts index eb84969..b06bb35 100644 --- a/src/platforms/GitHub/index.ts +++ b/src/platforms/GitHub/index.ts @@ -7,12 +7,12 @@ import { resolveGitModules } from 'utils/gitSubmodule' import { sortFoldersToFront } from 'utils/treeParser' import * as API from './API' import * as DOMHelper from './DOMHelper' +import * as URLHelper from './URLHelper' import { getCommitTreeData } from './getCommitTreeData' import { getPullRequestTreeData } from './getPullRequestTreeData' import { useEnterpriseStatBarStyleFix } from './hooks/useEnterpriseStatBarStyleFix' import { useGitHubAttachCopySnippetButton } from './hooks/useGitHubAttachCopySnippetButton' import { useGitHubCodeFold } from './hooks/useGitHubCodeFold' -import * as URLHelper from './URLHelper' export function processTree(tree: TreeNode[]): TreeNode { // nodes are created from items and put onto tree @@ -109,7 +109,7 @@ export const GitHub: Platform = { } const { type } = metaFromURL - let branchName + let branchName = metaFromDOM.branchName if (URLHelper.isInPullPage()) { branchName = DOMHelper.getIssueTitle() } else if (URLHelper.isInCommitPage()) { @@ -130,7 +130,7 @@ export const GitHub: Platform = { return metaData }, async getDefaultBranchName({ userName, repoName }, accessToken) { - const dataFromJSON = DOMHelper.resolveMetaFromDOMJSON() + const dataFromJSON = DOMHelper.resolveEmbeddedData() if (dataFromJSON?.defaultBranch) return dataFromJSON.defaultBranch return (await API.getRepoMeta(userName, repoName, accessToken)).default_branch