@achieveai/azuredevops-mcp 1.3.15 → 1.3.17
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/dist/Services/AzureDevOpsService.js +4 -3
- package/dist/Services/AzureDevOpsService.js.map +1 -1
- package/dist/Services/BuildService.project.test.js +91 -0
- package/dist/Services/BuildService.project.test.js.map +1 -0
- package/dist/Services/GitService.js +101 -75
- package/dist/Services/GitService.js.map +1 -1
- package/dist/Services/GitService.project.test.js +407 -0
- package/dist/Services/GitService.project.test.js.map +1 -0
- package/dist/Services/WorkItemService.js +105 -25
- package/dist/Services/WorkItemService.js.map +1 -1
- package/dist/Tools/WorkItemTools.js +1 -1
- package/dist/Tools/WorkItemTools.js.map +1 -1
- package/dist/index.js +40 -18
- package/dist/index.js.map +1 -1
- package/dist/package.json +59 -0
- package/dist/src/Interfaces/AIAssisted.js +3 -0
- package/dist/src/Interfaces/AIAssisted.js.map +1 -0
- package/dist/src/Interfaces/ArtifactManagement.js +3 -0
- package/dist/src/Interfaces/ArtifactManagement.js.map +1 -0
- package/dist/src/Interfaces/AzureDevOps.js +3 -0
- package/dist/src/Interfaces/AzureDevOps.js.map +1 -0
- package/dist/src/Interfaces/BoardsAndSprints.js +3 -0
- package/dist/src/Interfaces/BoardsAndSprints.js.map +1 -0
- package/dist/src/Interfaces/CodeAndRepositories.js +3 -0
- package/dist/src/Interfaces/CodeAndRepositories.js.map +1 -0
- package/dist/src/Interfaces/Common.js +134 -0
- package/dist/src/Interfaces/Common.js.map +1 -0
- package/dist/src/Interfaces/CostResourceManagement.js +3 -0
- package/dist/src/Interfaces/CostResourceManagement.js.map +1 -0
- package/dist/src/Interfaces/DevSecOps.js +3 -0
- package/dist/src/Interfaces/DevSecOps.js.map +1 -0
- package/dist/src/Interfaces/ExternalIntegrations.js +3 -0
- package/dist/src/Interfaces/ExternalIntegrations.js.map +1 -0
- package/dist/src/Interfaces/HybridCrossPlatform.js +3 -0
- package/dist/src/Interfaces/HybridCrossPlatform.js.map +1 -0
- package/dist/src/Interfaces/Pipelines.js +3 -0
- package/dist/src/Interfaces/Pipelines.js.map +1 -0
- package/dist/src/Interfaces/ProjectManagement.js +3 -0
- package/dist/src/Interfaces/ProjectManagement.js.map +1 -0
- package/dist/src/Interfaces/TestingCapabilities.js +3 -0
- package/dist/src/Interfaces/TestingCapabilities.js.map +1 -0
- package/dist/src/Interfaces/Wiki.js +3 -0
- package/dist/src/Interfaces/Wiki.js.map +1 -0
- package/dist/src/Interfaces/WorkItems.js +3 -0
- package/dist/src/Interfaces/WorkItems.js.map +1 -0
- package/dist/src/Services/AIAssistedDevelopmentService.js +195 -0
- package/dist/src/Services/AIAssistedDevelopmentService.js.map +1 -0
- package/dist/src/Services/ArtifactManagementService.js +346 -0
- package/dist/src/Services/ArtifactManagementService.js.map +1 -0
- package/dist/src/Services/AzureDevOpsService.js +385 -0
- package/dist/src/Services/AzureDevOpsService.js.map +1 -0
- package/dist/src/Services/BoardsSprintsService.js +339 -0
- package/dist/src/Services/BoardsSprintsService.js.map +1 -0
- package/dist/src/Services/BuildService.js +405 -0
- package/dist/src/Services/BuildService.js.map +1 -0
- package/dist/src/Services/DevSecOpsService.js +307 -0
- package/dist/src/Services/DevSecOpsService.js.map +1 -0
- package/dist/src/Services/EntraAuthHandler.js +337 -0
- package/dist/src/Services/EntraAuthHandler.js.map +1 -0
- package/dist/src/Services/GitService.js +1595 -0
- package/dist/src/Services/GitService.js.map +1 -0
- package/dist/src/Services/ProjectService.js +257 -0
- package/dist/src/Services/ProjectService.js.map +1 -0
- package/dist/src/Services/TestingCapabilitiesService.js +149 -0
- package/dist/src/Services/TestingCapabilitiesService.js.map +1 -0
- package/dist/src/Services/WikiService.js +90 -0
- package/dist/src/Services/WikiService.js.map +1 -0
- package/dist/src/Services/WorkItemService.js +885 -0
- package/dist/src/Services/WorkItemService.js.map +1 -0
- package/dist/src/Tools/AIAssistedDevelopmentTools.js +137 -0
- package/dist/src/Tools/AIAssistedDevelopmentTools.js.map +1 -0
- package/dist/src/Tools/ArtifactManagementTools.js +140 -0
- package/dist/src/Tools/ArtifactManagementTools.js.map +1 -0
- package/dist/src/Tools/BoardsSprintsTools.js +338 -0
- package/dist/src/Tools/BoardsSprintsTools.js.map +1 -0
- package/dist/src/Tools/BuildTools.js +468 -0
- package/dist/src/Tools/BuildTools.js.map +1 -0
- package/dist/src/Tools/DevSecOpsTools.js +147 -0
- package/dist/src/Tools/DevSecOpsTools.js.map +1 -0
- package/dist/src/Tools/GitTools.js +1475 -0
- package/dist/src/Tools/GitTools.js.map +1 -0
- package/dist/src/Tools/ProjectTools.js +360 -0
- package/dist/src/Tools/ProjectTools.js.map +1 -0
- package/dist/src/Tools/TestingCapabilitiesTools.js +157 -0
- package/dist/src/Tools/TestingCapabilitiesTools.js.map +1 -0
- package/dist/src/Tools/WikiTools.js +137 -0
- package/dist/src/Tools/WikiTools.js.map +1 -0
- package/dist/src/Tools/WorkItemTools.js +862 -0
- package/dist/src/Tools/WorkItemTools.js.map +1 -0
- package/dist/src/config.js +176 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.js +1716 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils/formatHelpers.js +257 -0
- package/dist/src/utils/formatHelpers.js.map +1 -0
- package/dist/src/utils/getClassMethods.js +8 -0
- package/dist/src/utils/getClassMethods.js.map +1 -0
- package/dist/src/utils/repositoryResolver.js +40 -0
- package/dist/src/utils/repositoryResolver.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Tests that the `project` parameter is correctly propagated from service method
|
|
5
|
+
* params to the underlying Azure DevOps API calls, instead of always using
|
|
6
|
+
* the default config project.
|
|
7
|
+
*
|
|
8
|
+
* This was the root cause of project override not working for threads/comments
|
|
9
|
+
* while it worked for build APIs.
|
|
10
|
+
*/
|
|
11
|
+
const vitest_1 = require("vitest");
|
|
12
|
+
// ── Mock the azure-devops-node-api module ────────────────────────────
|
|
13
|
+
const mockGetThreads = vitest_1.vi.fn().mockResolvedValue([]);
|
|
14
|
+
const mockGetPullRequestThread = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
|
|
15
|
+
const mockCreateThread = vitest_1.vi.fn().mockResolvedValue({ id: 1, comments: [] });
|
|
16
|
+
const mockCreateComment = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
|
|
17
|
+
const mockUpdateThread = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
|
|
18
|
+
const mockGetPullRequests = vitest_1.vi.fn().mockResolvedValue([]);
|
|
19
|
+
const mockGetPullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
|
|
20
|
+
const mockCreatePullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 99 });
|
|
21
|
+
const mockUpdatePullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
|
|
22
|
+
const mockCreatePullRequestReviewer = vitest_1.vi.fn().mockResolvedValue({});
|
|
23
|
+
const mockDeletePullRequestReviewer = vitest_1.vi.fn().mockResolvedValue(undefined);
|
|
24
|
+
const mockGetPullRequestWorkItemRefs = vitest_1.vi.fn().mockResolvedValue([]);
|
|
25
|
+
const mockGetPullRequestIterations = vitest_1.vi.fn().mockResolvedValue([{ id: 1 }]);
|
|
26
|
+
const mockGetPullRequestIterationChanges = vitest_1.vi.fn().mockResolvedValue({ changeEntries: [] });
|
|
27
|
+
const mockGetBranches = vitest_1.vi.fn().mockResolvedValue([{ name: 'main', commit: { commitId: 'abc123' } }]);
|
|
28
|
+
const mockUpdateRefs = vitest_1.vi.fn().mockResolvedValue([{ name: 'refs/heads/new-branch' }]);
|
|
29
|
+
const REPO_GUID = 'c5e7435f-113e-4328-9d8a-726f094bfa95';
|
|
30
|
+
const mockGetRepository = vitest_1.vi.fn().mockResolvedValue({ id: REPO_GUID, name: 'MyRepo' });
|
|
31
|
+
const mockGetRepositories = vitest_1.vi.fn().mockResolvedValue([{ id: REPO_GUID, name: 'MyRepo' }]);
|
|
32
|
+
const mockConnect = vitest_1.vi.fn().mockResolvedValue({ authenticatedUser: { id: 'user-123' } });
|
|
33
|
+
const mockGetWorkItems = vitest_1.vi.fn().mockResolvedValue([]);
|
|
34
|
+
const mockGetItems = vitest_1.vi.fn().mockResolvedValue([]);
|
|
35
|
+
const mockGetItemContent = vitest_1.vi.fn().mockResolvedValue(Buffer.from('file content'));
|
|
36
|
+
const mockGetBlobContent = vitest_1.vi.fn().mockResolvedValue(Buffer.from('blob content'));
|
|
37
|
+
const mockGetPullRequestById = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
|
|
38
|
+
const mockGetCommits = vitest_1.vi.fn().mockResolvedValue([]);
|
|
39
|
+
const mockGitApi = {
|
|
40
|
+
getThreads: mockGetThreads,
|
|
41
|
+
getPullRequestThread: mockGetPullRequestThread,
|
|
42
|
+
createThread: mockCreateThread,
|
|
43
|
+
createComment: mockCreateComment,
|
|
44
|
+
updateThread: mockUpdateThread,
|
|
45
|
+
getPullRequests: mockGetPullRequests,
|
|
46
|
+
getPullRequest: mockGetPullRequest,
|
|
47
|
+
createPullRequest: mockCreatePullRequest,
|
|
48
|
+
updatePullRequest: mockUpdatePullRequest,
|
|
49
|
+
createPullRequestReviewer: mockCreatePullRequestReviewer,
|
|
50
|
+
deletePullRequestReviewer: mockDeletePullRequestReviewer,
|
|
51
|
+
getPullRequestWorkItemRefs: mockGetPullRequestWorkItemRefs,
|
|
52
|
+
getPullRequestIterations: mockGetPullRequestIterations,
|
|
53
|
+
getPullRequestIterationChanges: mockGetPullRequestIterationChanges,
|
|
54
|
+
getBranches: mockGetBranches,
|
|
55
|
+
updateRefs: mockUpdateRefs,
|
|
56
|
+
getRepository: mockGetRepository,
|
|
57
|
+
getRepositories: mockGetRepositories,
|
|
58
|
+
getItems: mockGetItems,
|
|
59
|
+
getItemContent: mockGetItemContent,
|
|
60
|
+
getBlobContent: mockGetBlobContent,
|
|
61
|
+
getPullRequestById: mockGetPullRequestById,
|
|
62
|
+
getCommits: mockGetCommits,
|
|
63
|
+
};
|
|
64
|
+
const mockWorkItemTrackingApi = {
|
|
65
|
+
getWorkItems: mockGetWorkItems,
|
|
66
|
+
};
|
|
67
|
+
vitest_1.vi.mock('azure-devops-node-api', () => {
|
|
68
|
+
class MockWebApi {
|
|
69
|
+
constructor() {
|
|
70
|
+
this.getGitApi = vitest_1.vi.fn().mockResolvedValue(mockGitApi);
|
|
71
|
+
this.getWorkItemTrackingApi = vitest_1.vi.fn().mockResolvedValue(mockWorkItemTrackingApi);
|
|
72
|
+
this.getPolicyApi = vitest_1.vi.fn().mockResolvedValue({ getPolicyEvaluations: vitest_1.vi.fn().mockResolvedValue([]) });
|
|
73
|
+
this.getCoreApi = vitest_1.vi.fn().mockResolvedValue({ getProject: vitest_1.vi.fn().mockResolvedValue({ id: 'proj-guid' }) });
|
|
74
|
+
this.connect = mockConnect;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
WebApi: MockWebApi,
|
|
79
|
+
getPersonalAccessTokenHandler: vitest_1.vi.fn().mockReturnValue({}),
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
// Import after mocking
|
|
83
|
+
const GitService_1 = require("./GitService");
|
|
84
|
+
const DEFAULT_PROJECT = 'DefaultProject';
|
|
85
|
+
const OVERRIDE_PROJECT = 'OverrideProject';
|
|
86
|
+
function createService() {
|
|
87
|
+
return new GitService_1.GitService({
|
|
88
|
+
orgUrl: 'https://dev.azure.com/test',
|
|
89
|
+
project: DEFAULT_PROJECT,
|
|
90
|
+
personalAccessToken: 'fake-pat',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
(0, vitest_1.describe)('GitService project parameter propagation', () => {
|
|
94
|
+
let service;
|
|
95
|
+
(0, vitest_1.beforeEach)(() => {
|
|
96
|
+
vitest_1.vi.clearAllMocks();
|
|
97
|
+
service = createService();
|
|
98
|
+
});
|
|
99
|
+
// ── getPullRequestComments ──────────────────────────────────────
|
|
100
|
+
(0, vitest_1.describe)('getPullRequestComments', () => {
|
|
101
|
+
(0, vitest_1.it)('uses config.project by default', async () => {
|
|
102
|
+
await service.getPullRequestComments({
|
|
103
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
104
|
+
pullRequestId: 42,
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, DEFAULT_PROJECT);
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
109
|
+
await service.getPullRequestComments({
|
|
110
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
111
|
+
pullRequestId: 42,
|
|
112
|
+
project: OVERRIDE_PROJECT,
|
|
113
|
+
});
|
|
114
|
+
(0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)('uses override project for single thread retrieval', async () => {
|
|
117
|
+
await service.getPullRequestComments({
|
|
118
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
119
|
+
pullRequestId: 42,
|
|
120
|
+
threadId: 7,
|
|
121
|
+
project: OVERRIDE_PROJECT,
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.expect)(mockGetPullRequestThread).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
// ── addPullRequestComment ──────────────────────────────────────
|
|
127
|
+
(0, vitest_1.describe)('addPullRequestComment', () => {
|
|
128
|
+
(0, vitest_1.it)('uses config.project by default', async () => {
|
|
129
|
+
await service.addPullRequestComment({
|
|
130
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
131
|
+
pullRequestId: 42,
|
|
132
|
+
comment: 'LGTM',
|
|
133
|
+
});
|
|
134
|
+
(0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, DEFAULT_PROJECT);
|
|
135
|
+
});
|
|
136
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
137
|
+
await service.addPullRequestComment({
|
|
138
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
139
|
+
pullRequestId: 42,
|
|
140
|
+
comment: 'LGTM',
|
|
141
|
+
project: OVERRIDE_PROJECT,
|
|
142
|
+
});
|
|
143
|
+
(0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
// ── addPullRequestFileComment ──────────────────────────────────
|
|
147
|
+
(0, vitest_1.describe)('addPullRequestFileComment', () => {
|
|
148
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
149
|
+
await service.addPullRequestFileComment({
|
|
150
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
151
|
+
pullRequestId: 42,
|
|
152
|
+
path: '/src/foo.ts',
|
|
153
|
+
comment: 'This file needs tests',
|
|
154
|
+
project: OVERRIDE_PROJECT,
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
// ── replyToComment ─────────────────────────────────────────────
|
|
160
|
+
(0, vitest_1.describe)('replyToComment', () => {
|
|
161
|
+
(0, vitest_1.it)('uses config.project by default', async () => {
|
|
162
|
+
await service.replyToComment({
|
|
163
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
164
|
+
pullRequestId: 42,
|
|
165
|
+
threadId: 7,
|
|
166
|
+
comment: 'Fixed',
|
|
167
|
+
});
|
|
168
|
+
(0, vitest_1.expect)(mockCreateComment).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, DEFAULT_PROJECT);
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
171
|
+
await service.replyToComment({
|
|
172
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
173
|
+
pullRequestId: 42,
|
|
174
|
+
threadId: 7,
|
|
175
|
+
comment: 'Fixed',
|
|
176
|
+
project: OVERRIDE_PROJECT,
|
|
177
|
+
});
|
|
178
|
+
(0, vitest_1.expect)(mockCreateComment).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// ── updatePullRequestThread ────────────────────────────────────
|
|
182
|
+
(0, vitest_1.describe)('updatePullRequestThread', () => {
|
|
183
|
+
(0, vitest_1.it)('uses config.project by default', async () => {
|
|
184
|
+
await service.updatePullRequestThread({
|
|
185
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
186
|
+
pullRequestId: 42,
|
|
187
|
+
threadId: 7,
|
|
188
|
+
status: 'fixed',
|
|
189
|
+
});
|
|
190
|
+
(0, vitest_1.expect)(mockUpdateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, DEFAULT_PROJECT);
|
|
191
|
+
});
|
|
192
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
193
|
+
await service.updatePullRequestThread({
|
|
194
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
195
|
+
pullRequestId: 42,
|
|
196
|
+
threadId: 7,
|
|
197
|
+
status: 'closed',
|
|
198
|
+
project: OVERRIDE_PROJECT,
|
|
199
|
+
});
|
|
200
|
+
(0, vitest_1.expect)(mockUpdateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ── getPullRequests ────────────────────────────────────────────
|
|
204
|
+
(0, vitest_1.describe)('getPullRequests', () => {
|
|
205
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
206
|
+
await service.getPullRequests({
|
|
207
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
208
|
+
project: OVERRIDE_PROJECT,
|
|
209
|
+
});
|
|
210
|
+
(0, vitest_1.expect)(mockGetPullRequests).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', vitest_1.expect.any(Object), OVERRIDE_PROJECT, undefined, 0, 50);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// ── createPullRequest ──────────────────────────────────────────
|
|
214
|
+
(0, vitest_1.describe)('createPullRequest', () => {
|
|
215
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
216
|
+
await service.createPullRequest({
|
|
217
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
218
|
+
sourceRefName: 'refs/heads/feature',
|
|
219
|
+
targetRefName: 'refs/heads/main',
|
|
220
|
+
title: 'My PR',
|
|
221
|
+
project: OVERRIDE_PROJECT,
|
|
222
|
+
});
|
|
223
|
+
(0, vitest_1.expect)(mockCreatePullRequest).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
// ── getPullRequest ─────────────────────────────────────────────
|
|
227
|
+
(0, vitest_1.describe)('getPullRequest', () => {
|
|
228
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
229
|
+
await service.getPullRequest({
|
|
230
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
231
|
+
pullRequestId: 42,
|
|
232
|
+
project: OVERRIDE_PROJECT,
|
|
233
|
+
});
|
|
234
|
+
(0, vitest_1.expect)(mockGetPullRequest).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
// ── approvePullRequest ─────────────────────────────────────────
|
|
238
|
+
(0, vitest_1.describe)('approvePullRequest', () => {
|
|
239
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
240
|
+
await service.approvePullRequest({
|
|
241
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
242
|
+
pullRequestId: 42,
|
|
243
|
+
project: OVERRIDE_PROJECT,
|
|
244
|
+
});
|
|
245
|
+
(0, vitest_1.expect)(mockCreatePullRequestReviewer).toHaveBeenCalledWith({ vote: 10 }, 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-123', OVERRIDE_PROJECT);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
// ── mergePullRequest ───────────────────────────────────────────
|
|
249
|
+
(0, vitest_1.describe)('mergePullRequest', () => {
|
|
250
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
251
|
+
await service.mergePullRequest({
|
|
252
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
253
|
+
pullRequestId: 42,
|
|
254
|
+
project: OVERRIDE_PROJECT,
|
|
255
|
+
});
|
|
256
|
+
(0, vitest_1.expect)(mockUpdatePullRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ status: 3 }), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
// ── updatePullRequest ──────────────────────────────────────────
|
|
260
|
+
(0, vitest_1.describe)('updatePullRequest', () => {
|
|
261
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
262
|
+
await service.updatePullRequest({
|
|
263
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
264
|
+
pullRequestId: 42,
|
|
265
|
+
title: 'New Title',
|
|
266
|
+
project: OVERRIDE_PROJECT,
|
|
267
|
+
});
|
|
268
|
+
(0, vitest_1.expect)(mockUpdatePullRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ title: 'New Title' }), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
// ── updatePullRequestReviewers ─────────────────────────────────
|
|
272
|
+
(0, vitest_1.describe)('updatePullRequestReviewers', () => {
|
|
273
|
+
(0, vitest_1.it)('uses override project for adding reviewers', async () => {
|
|
274
|
+
await service.updatePullRequestReviewers({
|
|
275
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
276
|
+
pullRequestId: 42,
|
|
277
|
+
reviewersToAdd: ['user-abc'],
|
|
278
|
+
project: OVERRIDE_PROJECT,
|
|
279
|
+
});
|
|
280
|
+
(0, vitest_1.expect)(mockCreatePullRequestReviewer).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-abc', OVERRIDE_PROJECT);
|
|
281
|
+
});
|
|
282
|
+
(0, vitest_1.it)('uses override project for removing reviewers', async () => {
|
|
283
|
+
await service.updatePullRequestReviewers({
|
|
284
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
285
|
+
pullRequestId: 42,
|
|
286
|
+
reviewersToRemove: ['user-xyz'],
|
|
287
|
+
project: OVERRIDE_PROJECT,
|
|
288
|
+
});
|
|
289
|
+
(0, vitest_1.expect)(mockDeletePullRequestReviewer).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-xyz', OVERRIDE_PROJECT);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
// ── createBranch ───────────────────────────────────────────────
|
|
293
|
+
(0, vitest_1.describe)('createBranch', () => {
|
|
294
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
295
|
+
await service.createBranch({
|
|
296
|
+
repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
|
|
297
|
+
branchName: 'feature/new',
|
|
298
|
+
sourceRef: 'main',
|
|
299
|
+
project: OVERRIDE_PROJECT,
|
|
300
|
+
});
|
|
301
|
+
(0, vitest_1.expect)(mockGetBranches).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
|
|
302
|
+
(0, vitest_1.expect)(mockUpdateRefs).toHaveBeenCalledWith(vitest_1.expect.any(Array), 'c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
// ── browseRepository ─────────────────────────────────────────
|
|
306
|
+
(0, vitest_1.describe)('browseRepository', () => {
|
|
307
|
+
(0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
|
|
308
|
+
await service.browseRepository({
|
|
309
|
+
repository: 'MyRepo',
|
|
310
|
+
project: OVERRIDE_PROJECT,
|
|
311
|
+
});
|
|
312
|
+
(0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
// ── getFileContent ──────────────────────────────────────────
|
|
316
|
+
(0, vitest_1.describe)('getFileContent', () => {
|
|
317
|
+
(0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
|
|
318
|
+
await service.getFileContent({
|
|
319
|
+
repository: 'MyRepo',
|
|
320
|
+
path: '/src/index.ts',
|
|
321
|
+
project: OVERRIDE_PROJECT,
|
|
322
|
+
});
|
|
323
|
+
(0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
// ── getCommitHistory ────────────────────────────────────────
|
|
327
|
+
(0, vitest_1.describe)('getCommitHistory', () => {
|
|
328
|
+
(0, vitest_1.it)('uses projectId for resolveRepositoryId and API call', async () => {
|
|
329
|
+
await service.getCommitHistory({
|
|
330
|
+
repository: 'MyRepo',
|
|
331
|
+
projectId: OVERRIDE_PROJECT,
|
|
332
|
+
});
|
|
333
|
+
(0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
|
|
334
|
+
(0, vitest_1.expect)(mockGetCommits).toHaveBeenCalledWith(REPO_GUID, vitest_1.expect.any(Object), OVERRIDE_PROJECT);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
// ── getPullRequestWorkItemRefs ──────────────────────────────
|
|
338
|
+
(0, vitest_1.describe)('getPullRequestWorkItemRefs', () => {
|
|
339
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
340
|
+
await service.getPullRequestWorkItemRefs(REPO_GUID, 42, OVERRIDE_PROJECT);
|
|
341
|
+
(0, vitest_1.expect)(mockGetPullRequestWorkItemRefs).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
|
|
342
|
+
});
|
|
343
|
+
(0, vitest_1.it)('uses config.project by default', async () => {
|
|
344
|
+
await service.getPullRequestWorkItemRefs(REPO_GUID, 42);
|
|
345
|
+
(0, vitest_1.expect)(mockGetPullRequestWorkItemRefs).toHaveBeenCalledWith(REPO_GUID, 42, DEFAULT_PROJECT);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
// ── getPolicyEvaluations ────────────────────────────────────
|
|
349
|
+
(0, vitest_1.describe)('getPolicyEvaluations', () => {
|
|
350
|
+
(0, vitest_1.it)('uses override project when provided', async () => {
|
|
351
|
+
const mockGetPolicyEvaluations = vitest_1.vi.fn().mockResolvedValue([]);
|
|
352
|
+
const mockGetProject = vitest_1.vi.fn().mockResolvedValue({ id: 'proj-guid' });
|
|
353
|
+
// Access the mock to set up the policy and core APIs
|
|
354
|
+
const policyApi = await service.connection.getPolicyApi();
|
|
355
|
+
policyApi.getPolicyEvaluations = mockGetPolicyEvaluations;
|
|
356
|
+
const coreApi = await service.connection.getCoreApi();
|
|
357
|
+
coreApi.getProject = mockGetProject;
|
|
358
|
+
await service.getPolicyEvaluations(REPO_GUID, 42, OVERRIDE_PROJECT);
|
|
359
|
+
(0, vitest_1.expect)(mockGetProject).toHaveBeenCalledWith(OVERRIDE_PROJECT);
|
|
360
|
+
(0, vitest_1.expect)(mockGetPolicyEvaluations).toHaveBeenCalledWith(OVERRIDE_PROJECT, vitest_1.expect.stringContaining('proj-guid'));
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
// ── completePullRequest ─────────────────────────────────────
|
|
364
|
+
(0, vitest_1.describe)('completePullRequest', () => {
|
|
365
|
+
(0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
|
|
366
|
+
await service.completePullRequest({
|
|
367
|
+
repository: 'MyRepo',
|
|
368
|
+
pullRequestId: 42,
|
|
369
|
+
status: 'completed',
|
|
370
|
+
mergeStrategy: 'squash',
|
|
371
|
+
project: OVERRIDE_PROJECT,
|
|
372
|
+
});
|
|
373
|
+
(0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
// ── getPullRequestChangesCount ──────────────────────────────
|
|
377
|
+
(0, vitest_1.describe)('getPullRequestChangesCount', () => {
|
|
378
|
+
(0, vitest_1.it)('passes project through to getLatestPullRequestIteration', async () => {
|
|
379
|
+
await service.getPullRequestChangesCount({
|
|
380
|
+
repository: REPO_GUID,
|
|
381
|
+
pullRequestId: 42,
|
|
382
|
+
project: OVERRIDE_PROJECT,
|
|
383
|
+
});
|
|
384
|
+
// getLatestPullRequestIteration calls getPullRequestIterations with project
|
|
385
|
+
(0, vitest_1.expect)(mockGetPullRequestIterations).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
|
|
386
|
+
// getPullRequestIterationChanges also uses project
|
|
387
|
+
(0, vitest_1.expect)(mockGetPullRequestIterationChanges).toHaveBeenCalledWith(REPO_GUID, 42, 1, OVERRIDE_PROJECT);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
// ── resolveRepositoryId with project override ──────────────────
|
|
391
|
+
(0, vitest_1.describe)('resolveRepositoryId with project override', () => {
|
|
392
|
+
(0, vitest_1.it)('passes project to listRepositories when resolving repo name', async () => {
|
|
393
|
+
// Use a repository name (not a GUID) to trigger resolution
|
|
394
|
+
await service.getPullRequestComments({
|
|
395
|
+
repository: 'MyRepo',
|
|
396
|
+
pullRequestId: 42,
|
|
397
|
+
project: OVERRIDE_PROJECT,
|
|
398
|
+
});
|
|
399
|
+
// resolveRepositoryId calls listRepositories which calls getRepositories
|
|
400
|
+
// The first arg should be the override project
|
|
401
|
+
(0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
|
|
402
|
+
// And the resolved GUID should be used for getThreads
|
|
403
|
+
(0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
//# sourceMappingURL=GitService.project.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitService.project.test.js","sourceRoot":"","sources":["../../src/Services/GitService.project.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.WorkItemService = void 0;
|
|
4
37
|
const WorkItemTrackingInterfaces_1 = require("azure-devops-node-api/interfaces/WorkItemTrackingInterfaces");
|
|
5
38
|
const VSSInterfaces_1 = require("azure-devops-node-api/interfaces/common/VSSInterfaces");
|
|
6
39
|
const AzureDevOpsService_1 = require("./AzureDevOpsService");
|
|
40
|
+
const crypto = __importStar(require("crypto"));
|
|
7
41
|
const formatHelpers_1 = require("../utils/formatHelpers");
|
|
8
42
|
/** Rich-text fields that expect HTML — markdown is auto-converted for these */
|
|
9
43
|
const RICH_TEXT_FIELDS = new Set([
|
|
@@ -16,15 +50,49 @@ const RICH_TEXT_FIELDS = new Set([
|
|
|
16
50
|
class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
|
|
17
51
|
constructor(config) {
|
|
18
52
|
super(config);
|
|
53
|
+
this.wiqlCache = new Map();
|
|
54
|
+
this.CACHE_TTL_MS = 60000; // 60 seconds
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get a cached WIQL result or undefined if not found / expired.
|
|
58
|
+
*/
|
|
59
|
+
getCachedWiql(cacheKey) {
|
|
60
|
+
const entry = this.wiqlCache.get(cacheKey);
|
|
61
|
+
if (entry && Date.now() - entry.timestamp < this.CACHE_TTL_MS) {
|
|
62
|
+
return entry.result;
|
|
63
|
+
}
|
|
64
|
+
if (entry) {
|
|
65
|
+
this.wiqlCache.delete(cacheKey);
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Store a WIQL result in the cache.
|
|
71
|
+
*/
|
|
72
|
+
setCachedWiql(cacheKey, result) {
|
|
73
|
+
this.wiqlCache.set(cacheKey, { result, timestamp: Date.now() });
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build a cache key from the query string and project.
|
|
77
|
+
*/
|
|
78
|
+
buildWiqlCacheKey(query, top) {
|
|
79
|
+
const hash = crypto.createHash('md5').update(query).digest('hex');
|
|
80
|
+
return `${this.config.project}:${hash}:${top ?? 'none'}`;
|
|
19
81
|
}
|
|
20
82
|
/**
|
|
21
83
|
* Query work items using WIQL
|
|
22
84
|
*/
|
|
23
|
-
async listWorkItems(wiqlQuery) {
|
|
85
|
+
async listWorkItems(wiqlQuery, top) {
|
|
24
86
|
try {
|
|
87
|
+
const serverTop = top ?? 200;
|
|
88
|
+
const cacheKey = this.buildWiqlCacheKey(wiqlQuery, serverTop);
|
|
89
|
+
const cached = this.getCachedWiql(cacheKey);
|
|
90
|
+
if (cached)
|
|
91
|
+
return cached;
|
|
25
92
|
const witApi = await this.getWorkItemTrackingApi();
|
|
26
|
-
// Execute the WIQL query
|
|
27
|
-
const queryResult = await this.withAuthRetry(() => witApi.queryByWiql({ query: wiqlQuery }, { project: this.config.project }));
|
|
93
|
+
// Execute the WIQL query with server-side top limit
|
|
94
|
+
const queryResult = await this.withAuthRetry(() => witApi.queryByWiql({ query: wiqlQuery }, { project: this.config.project }, undefined, serverTop));
|
|
95
|
+
this.setCachedWiql(cacheKey, queryResult);
|
|
28
96
|
return queryResult;
|
|
29
97
|
}
|
|
30
98
|
catch (error) {
|
|
@@ -215,23 +283,27 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
|
|
|
215
283
|
async searchWorkItems(params) {
|
|
216
284
|
try {
|
|
217
285
|
const witApi = await this.getWorkItemTrackingApi();
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
286
|
+
const serverTop = params.top || 50;
|
|
287
|
+
const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
|
|
288
|
+
FROM WorkItems
|
|
289
|
+
WHERE [System.TeamProject] = @project
|
|
221
290
|
AND (
|
|
222
291
|
[System.Title] CONTAINS '${params.searchText}'
|
|
223
292
|
OR [System.Description] CONTAINS '${params.searchText}'
|
|
224
293
|
)
|
|
225
294
|
ORDER BY [System.CreatedDate] DESC`;
|
|
226
|
-
const
|
|
295
|
+
const cacheKey = this.buildWiqlCacheKey(query, serverTop);
|
|
296
|
+
const cached = this.getCachedWiql(cacheKey);
|
|
297
|
+
const queryResult = cached ?? await witApi.queryByWiql({
|
|
227
298
|
query
|
|
228
299
|
}, {
|
|
229
300
|
project: this.config.project
|
|
230
|
-
});
|
|
301
|
+
}, undefined, serverTop);
|
|
302
|
+
if (!cached)
|
|
303
|
+
this.setCachedWiql(cacheKey, queryResult);
|
|
231
304
|
// Get full work item details if we have results
|
|
232
305
|
if (queryResult.workItems && queryResult.workItems.length > 0) {
|
|
233
306
|
const workItemIds = queryResult.workItems
|
|
234
|
-
.slice(0, params.top || 50) // Limit results to avoid too many API calls
|
|
235
307
|
.map((wi) => wi.id);
|
|
236
308
|
// Fetch detailed work item information
|
|
237
309
|
const detailedWorkItems = await witApi.getWorkItems(workItemIds, [
|
|
@@ -298,17 +370,24 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
|
|
|
298
370
|
async getRecentWorkItems(params) {
|
|
299
371
|
try {
|
|
300
372
|
const witApi = await this.getWorkItemTrackingApi();
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
373
|
+
const days = params.days || 30;
|
|
374
|
+
const top = params.top || 10;
|
|
375
|
+
const skip = params.skip || 0;
|
|
376
|
+
const serverTop = skip + top; // fetch enough to cover the pagination window
|
|
377
|
+
const query = `SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate]
|
|
378
|
+
FROM WorkItems
|
|
379
|
+
WHERE [System.TeamProject] = @project
|
|
380
|
+
AND [System.ChangedDate] >= @today - ${days}
|
|
304
381
|
ORDER BY [System.ChangedDate] DESC`;
|
|
305
|
-
const
|
|
382
|
+
const cacheKey = this.buildWiqlCacheKey(query, serverTop);
|
|
383
|
+
const cached = this.getCachedWiql(cacheKey);
|
|
384
|
+
const queryResult = cached ?? await witApi.queryByWiql({
|
|
306
385
|
query
|
|
307
386
|
}, {
|
|
308
387
|
project: this.config.project
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
|
|
388
|
+
}, undefined, serverTop);
|
|
389
|
+
if (!cached)
|
|
390
|
+
this.setCachedWiql(cacheKey, queryResult);
|
|
312
391
|
if (queryResult.workItems) {
|
|
313
392
|
queryResult.workItems = queryResult.workItems.slice(skip, skip + top);
|
|
314
393
|
}
|
|
@@ -329,21 +408,22 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
|
|
|
329
408
|
if (params.state) {
|
|
330
409
|
stateCondition = `AND [System.State] = '${params.state}'`;
|
|
331
410
|
}
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
411
|
+
const serverTop = params.top || 100;
|
|
412
|
+
const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
|
|
413
|
+
FROM WorkItems
|
|
414
|
+
WHERE [System.TeamProject] = @project
|
|
335
415
|
AND [System.AssignedTo] = @me
|
|
336
416
|
${stateCondition}
|
|
337
417
|
ORDER BY [System.CreatedDate] DESC`;
|
|
338
|
-
const
|
|
418
|
+
const cacheKey = this.buildWiqlCacheKey(query, serverTop);
|
|
419
|
+
const cached = this.getCachedWiql(cacheKey);
|
|
420
|
+
const queryResult = cached ?? await witApi.queryByWiql({
|
|
339
421
|
query
|
|
340
422
|
}, {
|
|
341
423
|
project: this.config.project
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
queryResult.workItems = queryResult.workItems.slice(0, top);
|
|
346
|
-
}
|
|
424
|
+
}, undefined, serverTop);
|
|
425
|
+
if (!cached)
|
|
426
|
+
this.setCachedWiql(cacheKey, queryResult);
|
|
347
427
|
return queryResult;
|
|
348
428
|
}
|
|
349
429
|
catch (error) {
|