github-issue-tower-defence-management 1.118.1 → 1.119.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.
- package/CHANGELOG.md +14 -0
- package/bin/adapter/entry-points/console/ui-dist/assets/{index-BMe1bEF4.css → index-D0RwhyOM.css} +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-syKbd_lW.js +103 -0
- package/bin/adapter/entry-points/console/ui-dist/index.html +2 -2
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +74 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +1 -1
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +8 -2
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +21 -8
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +63 -6
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +4 -0
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +4 -0
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +37 -0
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +69 -5
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +95 -0
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +93 -0
- package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +23 -0
- package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +20 -0
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +6 -2
- package/src/adapter/entry-points/console/ui/src/index.css +25 -0
- package/src/adapter/entry-points/console/ui-dist/assets/{index-BMe1bEF4.css → index-D0RwhyOM.css} +1 -1
- package/src/adapter/entry-points/console/ui-dist/assets/index-syKbd_lW.js +103 -0
- package/src/adapter/entry-points/console/ui-dist/index.html +2 -2
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +167 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +124 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-DWiG7btO.js +0 -103
- package/src/adapter/entry-points/console/ui-dist/assets/index-DWiG7btO.js +0 -103
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TDPM Console</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-syKbd_lW.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-D0RwhyOM.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -1807,6 +1807,173 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
1807
1807
|
});
|
|
1808
1808
|
});
|
|
1809
1809
|
|
|
1810
|
+
describe('findRelatedOpenPRs mergeability resolution', () => {
|
|
1811
|
+
afterEach(() => {
|
|
1812
|
+
jest.restoreAllMocks();
|
|
1813
|
+
});
|
|
1814
|
+
|
|
1815
|
+
const buildTimelineResponse = (mergeable: string) => ({
|
|
1816
|
+
data: {
|
|
1817
|
+
repository: {
|
|
1818
|
+
issue: {
|
|
1819
|
+
timelineItems: {
|
|
1820
|
+
pageInfo: { endCursor: null, hasNextPage: false },
|
|
1821
|
+
nodes: [
|
|
1822
|
+
{
|
|
1823
|
+
__typename: 'CrossReferencedEvent',
|
|
1824
|
+
willCloseTarget: true,
|
|
1825
|
+
source: {
|
|
1826
|
+
__typename: 'PullRequest',
|
|
1827
|
+
url: 'https://github.com/HiromiShikata/test-repository/pull/11148',
|
|
1828
|
+
number: 11148,
|
|
1829
|
+
state: 'OPEN',
|
|
1830
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
1831
|
+
isDraft: false,
|
|
1832
|
+
mergeable,
|
|
1833
|
+
headRefName: 'feature-branch',
|
|
1834
|
+
baseRefName: 'main',
|
|
1835
|
+
baseRepository: {
|
|
1836
|
+
branchProtectionRules: { nodes: [] },
|
|
1837
|
+
defaultBranchRef: { name: 'main' },
|
|
1838
|
+
rulesets: { nodes: [] },
|
|
1839
|
+
},
|
|
1840
|
+
commits: { nodes: [] },
|
|
1841
|
+
reviewThreads: { nodes: [] },
|
|
1842
|
+
baseRef: { name: 'main' },
|
|
1843
|
+
},
|
|
1844
|
+
},
|
|
1845
|
+
],
|
|
1846
|
+
},
|
|
1847
|
+
},
|
|
1848
|
+
},
|
|
1849
|
+
},
|
|
1850
|
+
});
|
|
1851
|
+
|
|
1852
|
+
const buildMergeabilityResponse = (
|
|
1853
|
+
mergeable: string | null,
|
|
1854
|
+
mergeStateStatus: string | null,
|
|
1855
|
+
) => ({
|
|
1856
|
+
data: {
|
|
1857
|
+
repository: {
|
|
1858
|
+
pullRequest: {
|
|
1859
|
+
mergeable,
|
|
1860
|
+
mergeStateStatus,
|
|
1861
|
+
},
|
|
1862
|
+
},
|
|
1863
|
+
},
|
|
1864
|
+
});
|
|
1865
|
+
|
|
1866
|
+
it('resolves isConflicted true via a direct query when the timeline node reports mergeable UNKNOWN but the direct query reports CONFLICTING', async () => {
|
|
1867
|
+
const fetchSpy = jest
|
|
1868
|
+
.spyOn(global, 'fetch')
|
|
1869
|
+
.mockResolvedValueOnce(
|
|
1870
|
+
new Response(JSON.stringify(buildTimelineResponse('UNKNOWN')), {
|
|
1871
|
+
status: 200,
|
|
1872
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1873
|
+
}),
|
|
1874
|
+
)
|
|
1875
|
+
.mockResolvedValueOnce(
|
|
1876
|
+
new Response(
|
|
1877
|
+
JSON.stringify(buildMergeabilityResponse('CONFLICTING', 'DIRTY')),
|
|
1878
|
+
{
|
|
1879
|
+
status: 200,
|
|
1880
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1881
|
+
},
|
|
1882
|
+
),
|
|
1883
|
+
);
|
|
1884
|
+
|
|
1885
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1886
|
+
const result = await repository.findRelatedOpenPRs(
|
|
1887
|
+
'https://github.com/HiromiShikata/test-repository/issues/11194',
|
|
1888
|
+
);
|
|
1889
|
+
|
|
1890
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
1891
|
+
expect(result).toHaveLength(1);
|
|
1892
|
+
expect(result[0].isConflicted).toBe(true);
|
|
1893
|
+
expect(result[0].mergeable).toBe('CONFLICTING');
|
|
1894
|
+
});
|
|
1895
|
+
|
|
1896
|
+
it('resolves isConflicted true when the direct query returns mergeable UNKNOWN but mergeStateStatus DIRTY', async () => {
|
|
1897
|
+
jest
|
|
1898
|
+
.spyOn(global, 'fetch')
|
|
1899
|
+
.mockResolvedValueOnce(
|
|
1900
|
+
new Response(JSON.stringify(buildTimelineResponse('UNKNOWN')), {
|
|
1901
|
+
status: 200,
|
|
1902
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1903
|
+
}),
|
|
1904
|
+
)
|
|
1905
|
+
.mockImplementation(() =>
|
|
1906
|
+
Promise.resolve(
|
|
1907
|
+
new Response(
|
|
1908
|
+
JSON.stringify(buildMergeabilityResponse('UNKNOWN', 'DIRTY')),
|
|
1909
|
+
{
|
|
1910
|
+
status: 200,
|
|
1911
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1912
|
+
},
|
|
1913
|
+
),
|
|
1914
|
+
),
|
|
1915
|
+
);
|
|
1916
|
+
|
|
1917
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1918
|
+
const result = await repository.findRelatedOpenPRs(
|
|
1919
|
+
'https://github.com/HiromiShikata/test-repository/issues/11194',
|
|
1920
|
+
);
|
|
1921
|
+
|
|
1922
|
+
expect(result).toHaveLength(1);
|
|
1923
|
+
expect(result[0].isConflicted).toBe(true);
|
|
1924
|
+
});
|
|
1925
|
+
|
|
1926
|
+
it('keeps isConflicted false when mergeability stays UNKNOWN after the bounded retries', async () => {
|
|
1927
|
+
const fetchSpy = jest
|
|
1928
|
+
.spyOn(global, 'fetch')
|
|
1929
|
+
.mockResolvedValueOnce(
|
|
1930
|
+
new Response(JSON.stringify(buildTimelineResponse('UNKNOWN')), {
|
|
1931
|
+
status: 200,
|
|
1932
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1933
|
+
}),
|
|
1934
|
+
)
|
|
1935
|
+
.mockImplementation(() =>
|
|
1936
|
+
Promise.resolve(
|
|
1937
|
+
new Response(
|
|
1938
|
+
JSON.stringify(buildMergeabilityResponse('UNKNOWN', 'UNKNOWN')),
|
|
1939
|
+
{
|
|
1940
|
+
status: 200,
|
|
1941
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1942
|
+
},
|
|
1943
|
+
),
|
|
1944
|
+
),
|
|
1945
|
+
);
|
|
1946
|
+
|
|
1947
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1948
|
+
const result = await repository.findRelatedOpenPRs(
|
|
1949
|
+
'https://github.com/HiromiShikata/test-repository/issues/11194',
|
|
1950
|
+
);
|
|
1951
|
+
|
|
1952
|
+
expect(fetchSpy).toHaveBeenCalledTimes(4);
|
|
1953
|
+
expect(result).toHaveLength(1);
|
|
1954
|
+
expect(result[0].isConflicted).toBe(false);
|
|
1955
|
+
});
|
|
1956
|
+
|
|
1957
|
+
it('does not issue a direct mergeability query when the timeline node already reports a definitive mergeable value', async () => {
|
|
1958
|
+
const fetchSpy = jest.spyOn(global, 'fetch').mockResolvedValueOnce(
|
|
1959
|
+
new Response(JSON.stringify(buildTimelineResponse('MERGEABLE')), {
|
|
1960
|
+
status: 200,
|
|
1961
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1962
|
+
}),
|
|
1963
|
+
);
|
|
1964
|
+
|
|
1965
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1966
|
+
const result = await repository.findRelatedOpenPRs(
|
|
1967
|
+
'https://github.com/HiromiShikata/test-repository/issues/11194',
|
|
1968
|
+
);
|
|
1969
|
+
|
|
1970
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
1971
|
+
expect(result).toHaveLength(1);
|
|
1972
|
+
expect(result[0].isConflicted).toBe(false);
|
|
1973
|
+
expect(result[0].mergeable).toBe('MERGEABLE');
|
|
1974
|
+
});
|
|
1975
|
+
});
|
|
1976
|
+
|
|
1810
1977
|
const createApiV3CheerioRestIssueRepository = () => {
|
|
1811
1978
|
const apiV3IssueRepository = mock<ApiV3IssueRepository>();
|
|
1812
1979
|
const restIssueRepository = mock<RestIssueRepository>();
|
|
@@ -212,6 +212,18 @@ type DirectPullRequestResponse = {
|
|
|
212
212
|
errors?: Array<{ message: string }>;
|
|
213
213
|
};
|
|
214
214
|
|
|
215
|
+
type PullRequestMergeabilityResponse = {
|
|
216
|
+
data?: {
|
|
217
|
+
repository?: {
|
|
218
|
+
pullRequest?: {
|
|
219
|
+
mergeable?: string | null;
|
|
220
|
+
mergeStateStatus?: string | null;
|
|
221
|
+
} | null;
|
|
222
|
+
} | null;
|
|
223
|
+
};
|
|
224
|
+
errors?: Array<{ message: string }>;
|
|
225
|
+
};
|
|
226
|
+
|
|
215
227
|
function isIssueTimelineResponse(
|
|
216
228
|
value: unknown,
|
|
217
229
|
): value is IssueTimelineResponse {
|
|
@@ -226,6 +238,13 @@ function isDirectPullRequestResponse(
|
|
|
226
238
|
return true;
|
|
227
239
|
}
|
|
228
240
|
|
|
241
|
+
function isPullRequestMergeabilityResponse(
|
|
242
|
+
value: unknown,
|
|
243
|
+
): value is PullRequestMergeabilityResponse {
|
|
244
|
+
if (typeof value !== 'object' || value === null) return false;
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
|
|
229
248
|
type PullRequestFilesResponseItem = {
|
|
230
249
|
filename: string;
|
|
231
250
|
};
|
|
@@ -1006,6 +1025,88 @@ export class ApiV3CheerioRestIssueRepository
|
|
|
1006
1025
|
};
|
|
1007
1026
|
};
|
|
1008
1027
|
|
|
1028
|
+
private resolveMergeabilityWithRetry = async (
|
|
1029
|
+
owner: string,
|
|
1030
|
+
repo: string,
|
|
1031
|
+
prNumber: number,
|
|
1032
|
+
): Promise<{
|
|
1033
|
+
mergeable: string | null;
|
|
1034
|
+
mergeStateStatus: string | null;
|
|
1035
|
+
} | null> => {
|
|
1036
|
+
const query = `
|
|
1037
|
+
query($owner: String!, $repo: String!, $prNumber: Int!) {
|
|
1038
|
+
repository(owner: $owner, name: $repo) {
|
|
1039
|
+
pullRequest(number: $prNumber) {
|
|
1040
|
+
mergeable
|
|
1041
|
+
mergeStateStatus
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
`;
|
|
1046
|
+
|
|
1047
|
+
const maxAttempts = 3;
|
|
1048
|
+
const retryDelayMilliseconds = 1000;
|
|
1049
|
+
let lastResult: {
|
|
1050
|
+
mergeable: string | null;
|
|
1051
|
+
mergeStateStatus: string | null;
|
|
1052
|
+
} | null = null;
|
|
1053
|
+
|
|
1054
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
1055
|
+
if (attempt > 0) {
|
|
1056
|
+
await this.sleep(retryDelayMilliseconds);
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
const response = await this.fetchWithRateLimitRetry(() =>
|
|
1060
|
+
fetch('https://api.github.com/graphql', {
|
|
1061
|
+
method: 'POST',
|
|
1062
|
+
headers: {
|
|
1063
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
1064
|
+
'Content-Type': 'application/json',
|
|
1065
|
+
},
|
|
1066
|
+
body: JSON.stringify({
|
|
1067
|
+
query,
|
|
1068
|
+
variables: { owner, repo, prNumber },
|
|
1069
|
+
}),
|
|
1070
|
+
}),
|
|
1071
|
+
);
|
|
1072
|
+
|
|
1073
|
+
if (!response.ok) {
|
|
1074
|
+
throw new Error(
|
|
1075
|
+
`Failed to fetch pull request mergeability from GitHub GraphQL API: HTTP ${response.status}`,
|
|
1076
|
+
);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
const responseData: unknown = await response.json();
|
|
1080
|
+
if (!isPullRequestMergeabilityResponse(responseData)) {
|
|
1081
|
+
throw new Error(
|
|
1082
|
+
`Unexpected response shape when fetching pull request mergeability: ${owner}/${repo}#${prNumber}`,
|
|
1083
|
+
);
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
if (responseData.errors && responseData.errors.length > 0) {
|
|
1087
|
+
throw new Error(
|
|
1088
|
+
`GraphQL errors: ${JSON.stringify(responseData.errors)}`,
|
|
1089
|
+
);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
const pr = responseData.data?.repository?.pullRequest;
|
|
1093
|
+
if (!pr) {
|
|
1094
|
+
return null;
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
lastResult = {
|
|
1098
|
+
mergeable: pr.mergeable ?? null,
|
|
1099
|
+
mergeStateStatus: pr.mergeStateStatus ?? null,
|
|
1100
|
+
};
|
|
1101
|
+
|
|
1102
|
+
if (lastResult.mergeable !== null && lastResult.mergeable !== 'UNKNOWN') {
|
|
1103
|
+
return lastResult;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
return lastResult;
|
|
1108
|
+
};
|
|
1109
|
+
|
|
1009
1110
|
findRelatedOpenPRs = async (
|
|
1010
1111
|
issueUrl: string,
|
|
1011
1112
|
): Promise<RelatedPullRequest[]> => {
|
|
@@ -1170,8 +1271,31 @@ export class ApiV3CheerioRestIssueRepository
|
|
|
1170
1271
|
pr,
|
|
1171
1272
|
);
|
|
1172
1273
|
|
|
1274
|
+
let isConflicted = prStatus.isConflicted;
|
|
1275
|
+
let mergeable = prStatus.mergeable;
|
|
1276
|
+
if (
|
|
1277
|
+
pr.number !== undefined &&
|
|
1278
|
+
(pr.mergeable === undefined ||
|
|
1279
|
+
pr.mergeable === null ||
|
|
1280
|
+
pr.mergeable === 'UNKNOWN')
|
|
1281
|
+
) {
|
|
1282
|
+
const resolved = await this.resolveMergeabilityWithRetry(
|
|
1283
|
+
owner,
|
|
1284
|
+
repo,
|
|
1285
|
+
pr.number,
|
|
1286
|
+
);
|
|
1287
|
+
if (resolved !== null) {
|
|
1288
|
+
mergeable = resolved.mergeable;
|
|
1289
|
+
isConflicted =
|
|
1290
|
+
resolved.mergeable === 'CONFLICTING' ||
|
|
1291
|
+
resolved.mergeStateStatus === 'DIRTY';
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1173
1295
|
relatedPRsMap.set(prUrl, {
|
|
1174
1296
|
...prStatus,
|
|
1297
|
+
isConflicted,
|
|
1298
|
+
mergeable,
|
|
1175
1299
|
createdAt: pr.createdAt ? new Date(pr.createdAt) : new Date(0),
|
|
1176
1300
|
});
|
|
1177
1301
|
}
|
|
@@ -63,6 +63,7 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
63
63
|
update: (issue: Issue, _project: Project) => Promise<void>;
|
|
64
64
|
private parseIssueUrl;
|
|
65
65
|
private computePrStatus;
|
|
66
|
+
private resolveMergeabilityWithRetry;
|
|
66
67
|
findRelatedOpenPRs: (issueUrl: string) => Promise<RelatedPullRequest[]>;
|
|
67
68
|
getAllOpened: (project: Project, allowCacheMinutes: number) => Promise<Issue[]>;
|
|
68
69
|
getStoryObjectMap: (project: Project, allowCacheMinutes: number) => Promise<StoryObjectMap>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EAEjB,iBAAiB,EACjB,4BAA4B,EAC5B,+BAA+B,EAChC,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,WAAW,EACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EACL,KAAK,EAKN,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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"}
|