feat: resolve embedded repos overview data

This commit is contained in:
EnixCoda 2023-12-15 14:19:11 +08:00
parent 69cd8d71a7
commit d29f935e64
2 changed files with 39 additions and 12 deletions

View file

@ -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<MetaData> {
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('…'))

View file

@ -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