@paklo/core 0.10.0 → 0.11.0

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.
@@ -1,4 +1,4 @@
1
- import { Jt as DependabotPersistedPr, Un as VariableFinderFn, W as DependabotUpdatePullRequest, f as DependabotCreatePullRequest, vn as DependabotConfig } from "../index-CFWMNvXg.mjs";
1
+ import { Jt as DependabotPersistedPr, Un as VariableFinderFn, W as DependabotUpdatePullRequest, f as DependabotCreatePullRequest, vn as DependabotConfig } from "../index-CjxvO_Pt.mjs";
2
2
  import "../index-BfwWezjJ.mjs";
3
3
  import { z } from "zod";
4
4
  import { KyInstance } from "ky";
@@ -22,11 +22,17 @@ type AzureDevOpsOrganizationUrl = {
22
22
  'identity-api-url': URL;
23
23
  };
24
24
  type AzureDevOpsProjectUrl = AzureDevOpsOrganizationUrl & {
25
- /** Project ID or Name */
25
+ /**
26
+ * Project ID or Name.
27
+ * This value is not URL-encoded, clients must encode it when constructing URLs.
28
+ */
26
29
  project: string;
27
30
  };
28
31
  type AzureDevOpsRepositoryUrl = AzureDevOpsProjectUrl & {
29
- /** Repository ID or Name */
32
+ /**
33
+ * Repository ID or Name.
34
+ * This value is not URL-encoded, clients must encode it when constructing URLs.
35
+ */
30
36
  repository: string;
31
37
  /** Slug of the repository e.g. `contoso/prj1/_git/repo1`, `tfs/contoso/prj1/_git/repo1` */
32
38
  'repository-slug': string;
@@ -128,22 +128,22 @@ var PullRequestsClient = class extends BaseAzureDevOpsClient {
128
128
  * @param status The status of the pull requests to filter by
129
129
  */
130
130
  async list(projectIdOrName, repositoryIdOrName, creatorId, status) {
131
- return (await this.client.get(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests`, {
131
+ return (await this.client.get(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests`, {
132
132
  "searchCriteria.creatorId": creatorId,
133
133
  "searchCriteria.status": status
134
134
  })).json())?.value;
135
135
  }
136
136
  async get(projectIdOrName, repositoryIdOrName, pullRequestId) {
137
- return await this.client.get(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`)).json();
137
+ return await this.client.get(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`)).json();
138
138
  }
139
139
  async create(projectIdOrName, repositoryIdOrName, pr) {
140
- return await this.client.post(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests`), { json: pr }).json();
140
+ return await this.client.post(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests`), { json: pr }).json();
141
141
  }
142
142
  async update(projectIdOrName, repositoryIdOrName, pullRequestId, pr) {
143
- return await this.client.patch(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`), { json: pr }).json();
143
+ return await this.client.patch(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`), { json: pr }).json();
144
144
  }
145
145
  async getProperties(projectIdOrName, repositoryIdOrName, pullRequestId) {
146
- const response = await this.client.get(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/properties`)).json();
146
+ const response = await this.client.get(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/properties`)).json();
147
147
  return Object.entries(response?.value || {}).filter(([, val]) => val?.$value).map(([key, val]) => ({
148
148
  name: key,
149
149
  value: val.$value
@@ -166,7 +166,7 @@ var PullRequestsClient = class extends BaseAzureDevOpsClient {
166
166
  * Requires scope "Code (Write)" (vso.code_write).
167
167
  */
168
168
  async approve(projectIdOrName, repositoryIdOrName, pullRequestId, userId) {
169
- return await this.client.put(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/reviewers/${userId}`, "7.1"), { json: {
169
+ return await this.client.put(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/reviewers/${userId}`, "7.1"), { json: {
170
170
  vote: 10,
171
171
  isReapprove: true
172
172
  } }).json();
@@ -176,7 +176,7 @@ var PullRequestsClient = class extends BaseAzureDevOpsClient {
176
176
  * Requires scope "Code (Write)" (vso.code_write).
177
177
  */
178
178
  async abandon(projectIdOrName, repositoryIdOrName, pullRequestId, userId) {
179
- return await this.client.patch(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`), { json: {
179
+ return await this.client.patch(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`), { json: {
180
180
  status: "abandoned",
181
181
  closedBy: { id: userId }
182
182
  } }).json();
@@ -186,14 +186,14 @@ var PullRequestsClient = class extends BaseAzureDevOpsClient {
186
186
  * Requires scope "Code (Read)" (vso.code_read).
187
187
  */
188
188
  async getCommits(projectIdOrName, repositoryIdOrName, pullRequestId) {
189
- return (await this.client.get(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/commits`)).json())?.value;
189
+ return (await this.client.get(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/commits`)).json())?.value;
190
190
  }
191
191
  /**
192
192
  * Create a comment thread on a pull request.
193
193
  * Requires scope "Code (Write)" (vso.code_write).
194
194
  */
195
195
  async createCommentThread(projectIdOrName, repositoryIdOrName, pullRequestId, thread) {
196
- return await this.client.post(this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/threads`), { json: thread }).json();
196
+ return await this.client.post(this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/threads`), { json: thread }).json();
197
197
  }
198
198
  };
199
199
 
@@ -1240,10 +1240,10 @@ function extractOrganizationUrl({ organisationUrl }) {
1240
1240
  }
1241
1241
  function extractProjectUrl({ organisationUrl, project }) {
1242
1242
  const extracted = extractOrganizationUrl({ organisationUrl });
1243
- const escapedProject = encodeURI(project);
1243
+ const decodedProject = decodeURIComponent(project);
1244
1244
  return {
1245
1245
  ...extracted,
1246
- project: escapedProject
1246
+ project: decodedProject
1247
1247
  };
1248
1248
  }
1249
1249
  function extractRepositoryUrl({ organisationUrl, project, repository }) {
@@ -1251,12 +1251,12 @@ function extractRepositoryUrl({ organisationUrl, project, repository }) {
1251
1251
  organisationUrl,
1252
1252
  project
1253
1253
  });
1254
- const { organisation, "virtual-directory": virtualDirectory, project: escapedProject } = extracted;
1255
- const escapedRepository = encodeURI(repository);
1256
- const repoSlug = `${virtualDirectory ? `${virtualDirectory}/` : ""}${organisation}/${escapedProject}/_git/${escapedRepository}`;
1254
+ const { organisation, "virtual-directory": virtualDirectory, project: decodedProject } = extracted;
1255
+ const decodedRepository = decodeURIComponent(repository);
1256
+ const repoSlug = `${virtualDirectory ? `${virtualDirectory}/` : ""}${organisation}/${encodeURI(decodedProject)}/_git/${encodeURI(decodedRepository)}`;
1257
1257
  return {
1258
1258
  ...extracted,
1259
- repository: escapedRepository,
1259
+ repository: decodedRepository,
1260
1260
  "repository-slug": repoSlug
1261
1261
  };
1262
1262
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["client: KyInstance","path","changeType: AzdoVersionControlChangeType","reviewers: AzdoIdentityRefWithVote[]","ids: string[]","subscription: typeof existing","configPath: undefined | string","configContents: undefined | string","organisation: string","path"],"sources":["../../src/azure/client/constants.ts","../../src/azure/client/client-base.ts","../../src/azure/client/client-connection.ts","../../src/azure/client/client-git.ts","../../src/azure/client/client-identity.ts","../../src/azure/client/client-projects.ts","../../src/azure/client/client-pull-requests.ts","../../src/azure/client/client-repositories.ts","../../src/azure/client/client-subscriptions.ts","../../src/azure/client/client.ts","../../src/azure/client/types.ts","../../src/azure/client/utils.ts","../../src/azure/client/wrapper.ts","../../src/azure/config.ts","../../src/azure/events.ts","../../src/azure/url-parts.ts"],"sourcesContent":["export const API_VERSION = '5.0'; // this is the same version used by dependabot-core\nexport const API_VERSION_PREVIEW = '5.0-preview';\n\n/** Returned when no user is authenticated */\nexport const ANONYMOUS_USER_ID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';\n\n/**\n * Pull request property names used to store metadata about the pull request.\n * https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-properties\n */\nexport const PR_PROPERTY_MICROSOFT_GIT_SOURCE_REF_NAME = 'Microsoft.Git.PullRequest.SourceRefName';\nexport const PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER = 'Dependabot.PackageManager';\nexport const PR_PROPERTY_DEPENDABOT_DEPENDENCIES = 'Dependabot.Dependencies';\n\nexport const PR_DESCRIPTION_MAX_LENGTH = 4_000;\n","import type { KyInstance } from 'ky';\nimport { API_VERSION } from './constants';\n\nexport class BaseAzureDevOpsClient {\n constructor(protected readonly client: KyInstance) {}\n\n protected makeUrl(path: string): string;\n protected makeUrl(path: string, apiVersion: string): string;\n protected makeUrl(path: string, params: Record<string, unknown>): string;\n protected makeUrl(path: string, params: Record<string, unknown>, apiVersion: string): string;\n protected makeUrl(path: string, params?: Record<string, unknown> | string, apiVersion: string = API_VERSION): string {\n if (typeof params === 'string') {\n apiVersion = params;\n params = {};\n }\n\n const queryString = Object.entries({ 'api-version': apiVersion, ...params })\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join('&');\n return `${path}?${queryString}`;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport { API_VERSION_PREVIEW } from './constants';\nimport type { AzdoConnectionData } from './types';\n\nexport class ConnectionClient extends BaseAzureDevOpsClient {\n /**\n * Get the connection data for the current user.\n */\n public async get(): Promise<AzdoConnectionData> {\n return await this.client.get<AzdoConnectionData>(this.makeUrl('_apis/connectiondata', API_VERSION_PREVIEW)).json();\n }\n}\n","import { isHTTPError } from 'ky';\nimport { BaseAzureDevOpsClient } from './client-base';\nimport type {\n AzdoGitCommitDiffs,\n AzdoGitPush,\n AzdoGitPushCreate,\n AzdoGitRefUpdate,\n AzdoGitRefUpdateResult,\n AzdoRepositoryItem,\n AzdoResponse,\n} from './types';\n\nexport class GitClient extends BaseAzureDevOpsClient {\n public async getItem(\n projectIdOrName: string,\n repositoryIdOrName: string,\n path: string,\n includeContent: boolean = true,\n latestProcessedChange: boolean = true,\n ): Promise<AzdoRepositoryItem | undefined> {\n try {\n const item = await this.client\n .get<AzdoRepositoryItem>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/items`,\n {\n path,\n includeContent,\n latestProcessedChange,\n },\n ),\n )\n .json();\n return item;\n } catch (e) {\n if (isHTTPError(e) && e.response.status === 404) {\n // item does not exist\n return undefined;\n }\n throw e;\n }\n }\n\n public async getPush(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pushId: number,\n includeCommits?: number,\n includeRefUpdates?: boolean,\n ): Promise<AzdoGitPush> {\n return await this.client\n .get<AzdoGitPush>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pushes/${pushId}`,\n {\n includeCommits,\n includeRefUpdates,\n },\n ),\n )\n .json();\n }\n\n public async createPush(\n projectIdOrName: string,\n repositoryIdOrName: string,\n push: AzdoGitPushCreate,\n ): Promise<AzdoGitPush> {\n return await this.client\n .post<AzdoGitPush>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pushes`,\n ),\n { json: push },\n )\n .json();\n }\n\n public async getDiffCommits(\n projectIdOrName: string,\n repositoryIdOrName: string,\n baseVersion: string,\n targetVersion: string,\n ): Promise<AzdoGitCommitDiffs> {\n return await this.client\n .get<AzdoGitCommitDiffs>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/diffs/commits`,\n {\n baseVersion,\n baseVersionType: 'commit',\n targetVersion,\n targetVersionType: 'commit',\n },\n ),\n )\n .json();\n }\n\n public async updateRef(\n projectIdOrName: string,\n repositoryIdOrName: string,\n ref: AzdoGitRefUpdate[],\n ): Promise<AzdoGitRefUpdateResult[] | undefined> {\n const response = await this.client\n .post<AzdoResponse<AzdoGitRefUpdateResult[]>>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/refs`,\n ),\n { json: ref },\n )\n .json();\n return response.value;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoIdentity, AzdoResponse } from './types';\n\nexport class IdentityClient extends BaseAzureDevOpsClient {\n /**\n * Get the identities that match the given user name, email, or group name.\n * Requires scope \"Identity (Read)\" (vso.identity).\n * @param filterValue username, email, or group name\n * @returns\n */\n public async get(filterValue: string): Promise<AzdoIdentity[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoIdentity[]>>(\n this.makeUrl('_apis/identities', {\n searchFilter: 'General',\n filterValue,\n queryMembership: 'None',\n }),\n )\n .json();\n return response?.value;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoProject, AzdoResponse } from './types';\n\nexport class ProjectsClient extends BaseAzureDevOpsClient {\n public async list(): Promise<AzdoProject[] | undefined> {\n const response = await this.client.get<AzdoResponse<AzdoProject[]>>(this.makeUrl('_apis/projects')).json();\n return response?.value;\n }\n\n public async get(idOrName: string): Promise<AzdoProject | undefined> {\n return await this.client.get<AzdoProject>(this.makeUrl(`_apis/projects/${encodeURIComponent(idOrName)}`)).json();\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type {\n AzdoGitCommitRef,\n AzdoIdentityRefWithVote,\n AzdoProperties,\n AzdoPullRequest,\n AzdoPullRequestCommentThread,\n AzdoPullRequestStatus,\n AzdoResponse,\n} from './types';\n\nexport class PullRequestsClient extends BaseAzureDevOpsClient {\n /**\n * List pull requests\n * Requires scope \"Code (Read)\" (vso.code).\n * @param projectIdOrName\n * @param repositoryIdOrName\n * @param creatorId ID of the user who created the pull requests\n * @param status The status of the pull requests to filter by\n */\n public async list(\n projectIdOrName: string,\n repositoryIdOrName: string,\n creatorId: string,\n status: AzdoPullRequestStatus,\n ): Promise<AzdoPullRequest[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoPullRequest[]>>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests`, {\n 'searchCriteria.creatorId': creatorId,\n 'searchCriteria.status': status,\n }),\n )\n .json();\n return response?.value;\n }\n\n public async get(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<AzdoPullRequest | undefined> {\n return await this.client\n .get<AzdoPullRequest>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`),\n )\n .json();\n }\n\n public async create(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pr: Partial<AzdoPullRequest>,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .post<AzdoPullRequest>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests`),\n { json: pr },\n )\n .json();\n }\n\n public async update(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n pr: Partial<AzdoPullRequest>,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .patch<AzdoPullRequest>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`),\n { json: pr },\n )\n .json();\n }\n\n public async getProperties(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<{ name: string; value: string }[]> {\n const response = await this.client\n .get<AzdoResponse<AzdoProperties>>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/properties`,\n ),\n )\n .json();\n\n return Object.entries(response?.value || {})\n .filter(([, val]) => val?.$value)\n .map(([key, val]) => ({\n name: key,\n value: val.$value,\n }));\n }\n\n public async setProperties(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n properties: { name: string; value: string }[],\n ): Promise<AzdoResponse<AzdoProperties>> {\n return await this.client\n .patch<AzdoResponse<AzdoProperties>>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/properties`,\n ),\n {\n headers: { 'Content-Type': 'application/json-patch+json' },\n json: properties.map((property) => {\n return {\n op: 'add',\n path: `/${property.name}`,\n value: property.value,\n };\n }),\n },\n )\n .json();\n }\n\n /**\n * Approve a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async approve(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n userId: string,\n ): Promise<AzdoIdentityRefWithVote> {\n return await this.client\n .put<AzdoIdentityRefWithVote>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/reviewers/${userId}`,\n // API version 7.1 is required to use the 'isReapprove' parameter\n // See: https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-reviewers/create-pull-request-reviewer?view=azure-devops-rest-7.1&tabs=HTTP#request-body\n // https://learn.microsoft.com/en-us/azure/devops/integrate/concepts/rest-api-versioning?view=azure-devops#supported-versions\n '7.1',\n ),\n {\n json: {\n // Vote 10 = \"approved\"; 5 = \"approved with suggestions\"; 0 = \"no vote\"; -5 = \"waiting for author\"; -10 = \"rejected\"\n vote: 10,\n // Reapprove must be set to true after the 2023 August 23 update;\n // Approval of a previous PR iteration does not count in later iterations, which means we must (re)approve every after push to the source branch\n // See: https://learn.microsoft.com/en-us/azure/devops/release-notes/2023/sprint-226-update#new-branch-policy-preventing-users-to-approve-their-own-changes\n // https://github.com/mburumaxwell/dependabot-azure-devops/issues/1069\n isReapprove: true,\n },\n },\n )\n .json();\n }\n\n /**\n * Abandon a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async abandon(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n userId: string,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .patch<AzdoPullRequest>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}`),\n {\n json: {\n status: 'abandoned',\n closedBy: { id: userId },\n } satisfies Pick<AzdoPullRequest, 'status' | 'closedBy'>,\n },\n )\n .json();\n }\n\n /**\n * Get commits of a pull request.\n * Requires scope \"Code (Read)\" (vso.code_read).\n */\n public async getCommits(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<AzdoGitCommitRef[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoGitCommitRef[]>>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/commits`,\n ),\n )\n .json();\n return response?.value;\n }\n\n /**\n * Create a comment thread on a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async createCommentThread(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n thread: Partial<AzdoPullRequestCommentThread>,\n ): Promise<AzdoPullRequestCommentThread> {\n return await this.client\n .post<AzdoPullRequestCommentThread>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/threads`,\n ),\n { json: thread },\n )\n .json();\n }\n}\n","import { isHTTPError } from 'ky';\nimport { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoGitBranchStats, AzdoGitRef, AzdoRepository, AzdoResponse } from './types';\n\nexport class RepositoriesClient extends BaseAzureDevOpsClient {\n public async list(projectIdOrName: string): Promise<AzdoRepository[] | undefined> {\n const repos = await this.client\n .get<AzdoResponse<AzdoRepository[]>>(\n this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories`),\n )\n .json();\n return repos?.value;\n }\n\n public async get(projectIdOrName: string, repositoryIdOrName: string): Promise<AzdoRepository | undefined> {\n try {\n const repo = await this.client\n .get<AzdoRepository>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}`,\n ),\n )\n .json();\n return repo;\n } catch (e) {\n if (isHTTPError(e) && e.response.status === 404) {\n // repository no longer exists\n return undefined;\n }\n throw e;\n }\n }\n\n /**\n * Get the list of refs (a.k.a branch names) for a repository.\n * Requires scope \"Code (Read)\" (vso.code).\n * @param projectIdOrName\n * @param repositoryIdOrName\n * @returns\n */\n public async getRefs(projectIdOrName: string, repositoryIdOrName: string): Promise<AzdoGitRef[] | undefined> {\n const refs = await this.client\n .get<AzdoResponse<AzdoGitRef[]>>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/refs`),\n )\n .json();\n\n return refs?.value;\n }\n\n public async getBranchStats(\n projectIdOrName: string,\n repositoryIdOrName: string,\n branchName: string,\n ): Promise<AzdoGitBranchStats | undefined> {\n return await this.client\n .get<AzdoGitBranchStats>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/stats/branches`, {\n name: branchName,\n }),\n )\n .json();\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoSubscription, AzdoSubscriptionsQuery, AzdoSubscriptionsQueryResponse } from './types';\n\nexport class HookSubscriptionsClient extends BaseAzureDevOpsClient {\n public async query(query: AzdoSubscriptionsQuery): Promise<AzdoSubscription[]> {\n const response = await this.client\n .post<AzdoSubscriptionsQueryResponse>(this.makeUrl('_apis/hooks/subscriptionsquery'), { json: query })\n .json();\n return response?.results;\n }\n\n public async create(subscription: Partial<AzdoSubscription>): Promise<AzdoSubscription> {\n const response = await this.client\n .post<AzdoSubscription>(this.makeUrl('_apis/hooks/subscriptions'), { json: subscription })\n .json();\n return response;\n }\n\n public async replace(subscriptionId: string, subscription: AzdoSubscription): Promise<AzdoSubscription> {\n const response = await this.client\n .put<AzdoSubscription>(this.makeUrl(`_apis/hooks/subscriptions/${subscriptionId}`), { json: subscription })\n .json();\n return response;\n }\n\n public async delete(subscriptionId: string): Promise<void> {\n await this.client.delete(this.makeUrl(`_apis/hooks/subscriptions/${subscriptionId}`)).json();\n }\n}\n","import ky, { isHTTPError, type Options as KyOptions } from 'ky';\nimport { logger } from '@/logger';\nimport type { AzureDevOpsOrganizationUrl } from '../url-parts';\nimport { ConnectionClient } from './client-connection';\nimport { GitClient } from './client-git';\nimport { IdentityClient } from './client-identity';\nimport { ProjectsClient } from './client-projects';\nimport { PullRequestsClient } from './client-pull-requests';\nimport { RepositoriesClient } from './client-repositories';\nimport { HookSubscriptionsClient } from './client-subscriptions';\n\nexport class AzureDevOpsClient {\n public readonly organizationSlug: string;\n public readonly organizationUrl: string;\n public readonly connection: ConnectionClient;\n public readonly identity: IdentityClient;\n public readonly projects: ProjectsClient;\n public readonly repositories: RepositoriesClient;\n public readonly git: GitClient;\n public readonly pullRequests: PullRequestsClient;\n public readonly subscriptions: HookSubscriptionsClient;\n\n constructor(url: AzureDevOpsOrganizationUrl, accessToken: string, debug: boolean = false) {\n this.organizationSlug = url.organisation;\n const organizationUrl = url.value.toString().replace(/\\/$/, ''); // trim trailing slash\n this.organizationUrl = organizationUrl;\n const mainClientOptions = AzureDevOpsClient.createClientOptions(accessToken, debug, {\n prefixUrl: organizationUrl,\n });\n const mainClient = ky.create(mainClientOptions);\n this.connection = new ConnectionClient(mainClient);\n this.projects = new ProjectsClient(mainClient);\n this.repositories = new RepositoriesClient(mainClient);\n this.git = new GitClient(mainClient);\n this.pullRequests = new PullRequestsClient(mainClient);\n this.subscriptions = new HookSubscriptionsClient(mainClient);\n\n const identityApiUrl = url['identity-api-url'].toString().replace(/\\/$/, ''); // trim trailing slash\n const identityClient = ky.create({ ...mainClientOptions, prefixUrl: identityApiUrl });\n this.identity = new IdentityClient(identityClient);\n }\n\n private static createClientOptions(accessToken: string, debug: boolean, options?: KyOptions): KyOptions {\n return {\n headers: {\n Authorization: `Basic ${Buffer.from(`:${accessToken}`).toString('base64')}`,\n Accept: 'application/json',\n },\n hooks: {\n beforeRequest: [\n async (request, options) => {\n if (debug) logger.debug(`🌎 🠊 [${request.method}] ${request.url}`);\n },\n ],\n afterResponse: [\n async (request, options, response) => {\n if (debug) {\n logger.debug(`🌎 🠈 [${response.status}] ${response.statusText}`);\n\n // log the request and response for debugging\n if (request.body) {\n logger.debug(`REQUEST: ${JSON.stringify(request.body)}`);\n }\n // const body = await response.text();\n // if (body) {\n // logger.debug(`RESPONSE: ${body}`);\n // }\n }\n },\n ],\n beforeRetry: [\n async ({ request, options, error, retryCount }) => {\n if (debug && isHTTPError(error)) {\n logger.debug(`⏳ Retrying failed request with status code: ${error.response.status}`);\n }\n },\n ],\n },\n retry: {\n limit: 3,\n delay: (attempt) => 3000, // all attempts after 3 seconds\n },\n ...options,\n };\n }\n}\n","import { z } from 'zod';\n\nexport const AzdoVersionControlChangeTypeSchema = z.enum([\n 'none',\n 'add',\n 'edit',\n 'encoding',\n 'rename',\n 'delete',\n 'undelete',\n 'branch',\n 'merge',\n 'lock',\n 'rollback',\n 'sourceRename',\n 'targetRename',\n 'property',\n 'all',\n]);\nexport type AzdoVersionControlChangeType = z.infer<typeof AzdoVersionControlChangeTypeSchema>;\n\nexport const AZDO_PULL_REQUEST_MERGE_STRATEGIES = ['noFastForward', 'squash', 'rebase', 'rebaseMerge'] as const;\nexport const AzdoPullRequestMergeStrategySchema = z.enum(AZDO_PULL_REQUEST_MERGE_STRATEGIES);\nexport type AzdoPullRequestMergeStrategy = z.infer<typeof AzdoPullRequestMergeStrategySchema>;\n\nexport const AzdoCommentThreadStatusSchema = z.enum([\n 'unknown',\n 'active',\n 'fixed',\n 'wontFix',\n 'closed',\n 'byDesign',\n 'pending',\n]);\nexport type AzdoCommentThreadStatus = z.infer<typeof AzdoCommentThreadStatusSchema>;\nexport const AzdoCommentTypeSchema = z.enum(['unknown', 'text', 'codeChange', 'system']);\nexport type AzdoCommentType = z.infer<typeof AzdoCommentTypeSchema>;\n\nexport const AzdoPullRequestAsyncStatusSchema = z.enum([\n 'notSet',\n 'queued',\n 'conflicts',\n 'succeeded',\n 'rejectedByPolicy',\n 'failure',\n]);\nexport type AzdoPullRequestAsyncStatus = z.infer<typeof AzdoPullRequestAsyncStatusSchema>;\nexport const AzdoPullRequestStatusSchema = z.enum(['notSet', 'active', 'abandoned', 'completed', 'all']);\nexport type AzdoPullRequestStatus = z.infer<typeof AzdoPullRequestStatusSchema>;\n\nexport const AzdoProjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n url: z.string(),\n state: z.enum(['deleting', 'new', 'wellFormed', 'createPending', 'all', 'unchanged', 'deleted']),\n _links: z\n .object({\n self: z.object({ href: z.string() }),\n collection: z.object({ href: z.string() }),\n web: z.object({ href: z.string() }),\n })\n .optional(),\n});\nexport type AzdoProject = z.infer<typeof AzdoProjectSchema>;\n\nexport const AzdoRepositorySchema = z.object({\n id: z.string(),\n name: z.string(),\n defaultBranch: z.string().optional(),\n project: AzdoProjectSchema,\n isDisabled: z.boolean().optional(),\n isFork: z.boolean().optional(),\n url: z.string(),\n remoteUrl: z.string(),\n webUrl: z.string(),\n});\nexport type AzdoRepository = z.infer<typeof AzdoRepositorySchema>;\n\nexport type AzdoResponse<T> = {\n value?: T;\n count: number;\n};\n\nexport const AzdoIdentitySchema = z.object({\n id: z.string(),\n displayName: z.string(),\n url: z.string(),\n});\nexport type AzdoIdentity = z.infer<typeof AzdoIdentitySchema>;\nexport const AzdoIdentityRefSchema = z.object({\n id: z.string().optional(),\n displayName: z.string().optional(),\n uniqueName: z.string().optional(),\n url: z.string().optional(),\n});\nexport type AzdoIdentityRef = z.infer<typeof AzdoIdentityRefSchema>;\n\nexport const AzdoConnectionDataSchema = z.object({\n authenticatedUser: AzdoIdentitySchema,\n authorizedUser: AzdoIdentitySchema,\n});\nexport type AzdoConnectionData = z.infer<typeof AzdoConnectionDataSchema>;\n\nexport const AzdoGitUserDateSchema = z.object({\n name: z.string(),\n email: z.string(),\n date: z.string().optional(),\n});\nexport type AzdoGitUserDate = z.infer<typeof AzdoGitUserDateSchema>;\nexport const AzdoGitRefSchema = z.object({\n name: z.string(),\n objectId: z.string(),\n isLocked: z.boolean().optional(),\n});\nexport type AzdoGitRef = z.infer<typeof AzdoGitRefSchema>;\nexport const AzdoGitRefUpdateResultSchema = AzdoGitRefSchema.extend({\n oldObjectId: z.string(),\n newObjectId: z.string(),\n success: z.boolean(),\n customMessage: z.string().optional(),\n});\nexport type AzdoGitRefUpdateResult = z.infer<typeof AzdoGitRefUpdateResultSchema>;\nexport const AzdoGitChangeSchema = z.object({\n changeType: AzdoVersionControlChangeTypeSchema,\n item: z.object({ path: z.string() }).optional(), // current version (path)\n newContent: z\n .object({\n content: z.string(),\n contentType: z.enum(['rawtext', 'base64encoded']),\n })\n .optional(),\n originalPath: z.string().optional(), // original path of the item if different from current path\n});\nexport type AzdoGitChange = z.infer<typeof AzdoGitChangeSchema>;\nexport const AzdoGitCommitRefSchema = z.object({\n commitId: z.string(),\n author: AzdoGitUserDateSchema.optional(),\n committer: AzdoGitUserDateSchema.optional(),\n changes: AzdoGitChangeSchema.array().optional(),\n});\nexport type AzdoGitCommitRef = z.infer<typeof AzdoGitCommitRefSchema>;\nexport const AzdoGitPushSchema = z.object({\n commits: AzdoGitCommitRefSchema.array(),\n refUpdates: AzdoGitRefSchema.array(),\n});\nexport type AzdoGitPush = z.infer<typeof AzdoGitPushSchema>;\nexport const AzdoGitRefUpdateSchema = z.object({\n name: z.string(),\n oldObjectId: z.string(),\n newObjectId: z.string().optional(),\n isLocked: z.boolean().optional(),\n});\nexport type AzdoGitRefUpdate = z.infer<typeof AzdoGitRefUpdateSchema>;\nexport const AzdoGitPushCreateSchema = z.object({\n refUpdates: AzdoGitRefUpdateSchema.array(),\n commits: z\n .object({\n comment: z.string(),\n author: AzdoGitUserDateSchema.optional(),\n changes: AzdoGitChangeSchema.array(),\n })\n .array(),\n});\nexport type AzdoGitPushCreate = z.infer<typeof AzdoGitPushCreateSchema>;\nexport const AzdoGitBranchStatsSchema = z.object({\n aheadCount: z.number(),\n behindCount: z.number(),\n});\nexport type AzdoGitBranchStats = z.infer<typeof AzdoGitBranchStatsSchema>;\nexport const AzdoGitCommitDiffsSchema = z.object({\n allChangesIncluded: z.boolean(),\n baseCommit: z.string(),\n changes: AzdoGitChangeSchema.array(),\n targetCommit: z.string(),\n});\nexport type AzdoGitCommitDiffs = z.infer<typeof AzdoGitCommitDiffsSchema>;\n\nexport const AzdoRepositoryItemSchema = z.object({\n latestProcessedChange: AzdoGitCommitRefSchema.optional(),\n content: z.string().optional(),\n});\nexport type AzdoRepositoryItem = z.infer<typeof AzdoRepositoryItemSchema>;\n\nexport const AzdoIdentityRefWithVoteSchema = z.object({\n id: z.string().optional(),\n displayName: z.string().optional(),\n vote: z.number().optional(),\n hasDeclined: z.boolean().optional(),\n isFlagged: z.boolean().optional(),\n isRequired: z.boolean().optional(),\n});\nexport type AzdoIdentityRefWithVote = z.infer<typeof AzdoIdentityRefWithVoteSchema>;\n\nexport const AzdoPullRequestSchema = z.object({\n pullRequestId: z.number(),\n status: AzdoPullRequestStatusSchema,\n isDraft: z.boolean(),\n sourceRefName: z.string(),\n targetRefName: z.string(),\n title: z.string(),\n description: z.string().optional(),\n lastMergeCommit: AzdoGitCommitRefSchema,\n lastMergeSourceCommit: AzdoGitCommitRefSchema,\n mergeStatus: AzdoPullRequestAsyncStatusSchema,\n reviewers: AzdoIdentityRefWithVoteSchema.array().optional(),\n workItemRefs: z.object({ id: z.string() }).array().optional(),\n labels: z.object({ name: z.string() }).array().optional(),\n autoCompleteSetBy: AzdoIdentityRefSchema.optional(),\n completionOptions: z\n .object({\n autoCompleteIgnoreConfigIds: z.number().array().optional(),\n deleteSourceBranch: z.boolean().optional(),\n mergeCommitMessage: z.string().optional(),\n mergeStrategy: AzdoPullRequestMergeStrategySchema.optional(),\n transitionWorkItems: z.boolean().optional(),\n })\n .optional(),\n closedBy: AzdoIdentityRefSchema.optional(),\n});\nexport type AzdoPullRequest = z.infer<typeof AzdoPullRequestSchema>;\n\nexport const AzdoPropertiesSchema = z.record(\n z.string(),\n z.object({\n $type: z.string(),\n $value: z.string(),\n }),\n);\nexport type AzdoProperties = z.infer<typeof AzdoPropertiesSchema>;\n\nexport const AzdoPullRequestCommentSchema = z.object({\n id: z.number().optional(),\n parentCommentId: z.number().optional(),\n content: z.string(),\n commentType: AzdoCommentTypeSchema,\n publishedDate: z.string().optional(),\n author: AzdoIdentityRefSchema,\n});\nexport type AzdoPullRequestComment = z.infer<typeof AzdoPullRequestCommentSchema>;\nexport const AzdoPullRequestCommentThreadSchema = z.object({\n id: z.number(),\n comments: AzdoPullRequestCommentSchema.array(),\n status: AzdoCommentThreadStatusSchema,\n});\nexport type AzdoPullRequestCommentThread = z.infer<typeof AzdoPullRequestCommentThreadSchema>;\n\nexport const AzdoSubscriptionSchema = z.object({\n id: z.string(),\n status: z.enum(['enabled', 'onProbation', 'disabledByUser', 'disabledBySystem', 'disabledByInactiveIdentity']),\n publisherId: z.string(),\n publisherInputs: z.record(z.string(), z.string()),\n consumerId: z.string().optional(),\n consumerActionId: z.string().optional(),\n consumerInputs: z.record(z.string(), z.string()),\n eventType: z.string(), // not enum because we do not know all the values\n resourceVersion: z.string(),\n eventDescription: z.string().optional(),\n actionDescription: z.string().optional(),\n});\nexport type AzdoSubscription = z.infer<typeof AzdoSubscriptionSchema>;\n\nexport const AzdoSubscriptionsQueryResponseSchema = z.object({\n results: AzdoSubscriptionSchema.array(),\n});\nexport type AzdoSubscriptionsQueryResponse = z.infer<typeof AzdoSubscriptionsQueryResponseSchema>;\n\nexport const AzdoSubscriptionsQueryInputFilterSchema = z.object({\n conditions: z\n .object({\n caseSensitive: z.boolean().optional(),\n inputId: z.string().optional(),\n inputValue: z.string().optional(),\n operator: z.enum(['equals', 'notEquals']),\n })\n .array()\n .optional(),\n});\nexport type AzdoSubscriptionsQueryInputFilter = z.infer<typeof AzdoSubscriptionsQueryInputFilterSchema>;\n\nexport const AzdoSubscriptionsQuerySchema = z.object({\n consumerActionId: z.string().optional(),\n consumerId: z.string().optional(),\n consumerInputFilters: AzdoSubscriptionsQueryInputFilterSchema.array().optional(),\n eventType: z.string().optional(),\n publisherId: z.string().optional(),\n publisherInputFilters: AzdoSubscriptionsQueryInputFilterSchema.array().optional(),\n subscriberId: z.string().optional(),\n});\nexport type AzdoSubscriptionsQuery = z.infer<typeof AzdoSubscriptionsQuerySchema>;\n\nexport type AzdoPrExtractedWithProperties = {\n pullRequestId: number;\n properties?: { name: string; value: string }[];\n};\n\nexport type AzdoFileChange = {\n changeType: AzdoVersionControlChangeType;\n path: string;\n content?: string;\n encoding?: 'utf-8' | 'base64';\n};\n","import * as path from 'node:path';\n\nimport {\n areEqual,\n type DependabotCreatePullRequest,\n type DependabotPersistedPr,\n DependabotPersistedPrSchema,\n type DependabotUpdatePullRequest,\n getDependencyNames,\n} from '@/dependabot';\nimport { PR_PROPERTY_DEPENDABOT_DEPENDENCIES, PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER } from './constants';\nimport type { AzdoFileChange, AzdoPrExtractedWithProperties, AzdoVersionControlChangeType } from './types';\n\nexport function buildPullRequestProperties(packageManager: string, dependencies: DependabotPersistedPr) {\n return [\n {\n name: PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER,\n value: packageManager,\n },\n {\n name: PR_PROPERTY_DEPENDABOT_DEPENDENCIES,\n value: JSON.stringify(dependencies),\n },\n ];\n}\n\nexport function parsePullRequestProperties(\n pullRequests: AzdoPrExtractedWithProperties[],\n packageManager: string | null,\n): Record<string, DependabotPersistedPr> {\n return Object.fromEntries(\n pullRequests\n .filter((pr) => {\n return pr.properties?.find(\n (p) =>\n p.name === PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER &&\n (packageManager === null || p.value === packageManager),\n );\n })\n .map((pr) => {\n return [\n pr.pullRequestId,\n DependabotPersistedPrSchema.parse(\n JSON.parse(pr.properties!.find((p) => p.name === PR_PROPERTY_DEPENDABOT_DEPENDENCIES)!.value),\n ),\n ];\n }),\n );\n}\n\nexport function getPullRequestForDependencyNames(\n existingPullRequests: AzdoPrExtractedWithProperties[],\n packageManager: string,\n dependencyNames: string[],\n): AzdoPrExtractedWithProperties | undefined {\n return existingPullRequests.find((pr) => {\n return (\n pr.properties?.find((p) => p.name === PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER && p.value === packageManager) &&\n pr.properties?.find(\n (p) =>\n p.name === PR_PROPERTY_DEPENDABOT_DEPENDENCIES &&\n areEqual(getDependencyNames(DependabotPersistedPrSchema.parse(JSON.parse(p.value))), dependencyNames),\n )\n );\n });\n}\n\nexport function getPullRequestChangedFiles(data: DependabotCreatePullRequest | DependabotUpdatePullRequest) {\n return data['updated-dependency-files']\n .filter((file) => file.type === 'file')\n .map((file) => {\n let changeType: AzdoVersionControlChangeType = 'none';\n if (file.deleted === true || file.operation === 'delete') {\n changeType = 'delete';\n } else if (file.operation === 'update') {\n changeType = 'edit';\n } else {\n changeType = 'add';\n }\n return {\n changeType: changeType,\n path: path.join(file.directory, file.name),\n content: file.content ?? undefined,\n encoding: file.content_encoding || 'utf-8', // default to 'utf-8' if nullish or empty string\n } satisfies AzdoFileChange;\n });\n}\n","import { normalizeBranchName, normalizeFilePath } from '@/dependabot';\nimport { logger } from '@/logger';\nimport type { AzdoEvent, AzdoEventType } from '../events';\nimport type { AzureDevOpsOrganizationUrl } from '../url-parts';\nimport { AzureDevOpsClient } from './client';\nimport type {\n AzdoFileChange,\n AzdoGitUserDate,\n AzdoIdentityRefWithVote,\n AzdoPrExtractedWithProperties,\n AzdoPullRequestMergeStrategy,\n AzdoSubscriptionsQuery,\n} from './types';\n\ntype AzdoRepositoryOptions = { project: string; repository: string };\n\ntype AzdoPullRequestCreateOptions = AzdoRepositoryOptions & {\n source: { branch: string; commit: string };\n target: { branch: string };\n author: AzdoGitUserDate;\n title: string;\n description: string;\n commitMessage: string;\n autoComplete?: {\n ignorePolicyConfigIds?: number[];\n mergeStrategy?: AzdoPullRequestMergeStrategy;\n };\n assignees?: string[];\n labels?: string[];\n workItems?: string[];\n changes: AzdoFileChange[];\n properties?: { name: string; value: string }[];\n};\n\ntype AzdoPullRequestOptions = AzdoRepositoryOptions & { pullRequestId: number };\n\ntype AzdoPullRequestUpdateOptions = AzdoPullRequestOptions & {\n commit: string;\n author: AzdoGitUserDate;\n changes: AzdoFileChange[];\n};\n\ntype AzdoPullRequestAbandonOptions = AzdoPullRequestOptions & {\n comment?: string;\n deleteSourceBranch?: boolean;\n};\n\ntype AzdoPullRequestCommentCreateOptions = AzdoPullRequestOptions & {\n content: string;\n userId?: string;\n};\n\nexport class AzureDevOpsClientWrapper {\n public readonly inner: AzureDevOpsClient;\n\n private authenticatedUserId?: string;\n private resolvedUserIds: Record<string, string> = {};\n\n /**\n * Create a new Azure DevOps client wrapper.\n * @param url The Azure DevOps organization URL\n * @param accessToken The personal access token for authentication\n * @param debug Enable debug logging for API requests (default: false)\n */\n constructor(url: AzureDevOpsOrganizationUrl, accessToken: string, debug: boolean = false) {\n this.inner = new AzureDevOpsClient(url, accessToken, debug);\n }\n\n /**\n * Get the identity of the authenticated user.\n * The result is cached after the first call to avoid repeated API requests.\n */\n public async getUserId(): Promise<string> {\n if (!this.authenticatedUserId) {\n const connectionData = await this.inner.connection.get();\n this.authenticatedUserId = connectionData?.authenticatedUser?.id;\n if (!this.authenticatedUserId) {\n throw new Error('Failed to get authenticated user ID');\n }\n }\n return this.authenticatedUserId;\n }\n\n /**\n * Get the identity id from a user name, email, or group name.\n * Results are cached to avoid repeated API requests for the same identifier.\n *\n * Requires scope \"Identity (Read)\" (vso.identity).\n * @param identifier Username, email, or group name to resolve\n * @returns The resolved identity ID, or undefined if not found or on error\n */\n public async resolveIdentityId(identifier: string): Promise<string | undefined> {\n if (this.resolvedUserIds[identifier]) {\n return this.resolvedUserIds[identifier];\n }\n try {\n const identities = await this.inner.identity.get(identifier);\n if (!identities || identities.length === 0) {\n return undefined;\n }\n this.resolvedUserIds[identifier] = identities[0]!.id;\n return this.resolvedUserIds[identifier];\n } catch (e) {\n logger.error(`Failed to resolve user id: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return undefined;\n }\n }\n\n /**\n * Get the default branch for a repository.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options (project and repository)\n * @returns The normalized default branch name (e.g., \"main\"), or undefined if not found\n */\n public async getDefaultBranch(options: AzdoRepositoryOptions): Promise<string | undefined> {\n return normalizeBranchName((await this.inner.repositories.get(options.project, options.repository))?.defaultBranch);\n }\n\n /**\n * Get the list of branch names for a repository.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options (project and repository)\n * @returns Array of normalized branch names, or undefined if not found\n */\n public async getBranchNames(options: AzdoRepositoryOptions): Promise<string[] | undefined> {\n return (await this.inner.repositories.getRefs(options.project, options.repository))?.map((r) =>\n normalizeBranchName(r.name),\n );\n }\n\n /**\n * Get the properties for all active pull requests created by the specified user.\n * This retrieves both the pull request IDs and their associated properties.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options including the creator user ID\n * @returns Array of pull request IDs with their properties, empty array on error\n */\n public async getActivePullRequestProperties({\n project,\n repository,\n creatorId,\n }: AzdoRepositoryOptions & { creatorId: string }): Promise<AzdoPrExtractedWithProperties[]> {\n try {\n const pullRequests = await this.inner.pullRequests.list(project, repository, creatorId, 'active');\n if (!pullRequests || pullRequests.length === 0) {\n return [];\n }\n\n return await Promise.all(\n pullRequests.map(async (pr) => {\n const properties = await this.inner.pullRequests.getProperties(project, repository, pr.pullRequestId);\n return { pullRequestId: pr.pullRequestId, properties };\n }),\n );\n } catch (e) {\n logger.error(`Failed to list active pull request properties: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return [];\n }\n }\n\n /**\n * Create a new pull request with the specified changes.\n * This method performs the following operations:\n * 1. Resolves assignee identities for assignees (if specified)\n * 2. Creates a new branch and pushes changes\n * 3. Creates the pull request with assignees (optional reviewers), labels, and work items\n * 4. Sets pull request properties for dependency metadata\n * 5. Configures auto-complete options (if specified)\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * Requires scope \"Identity (Read)\" (vso.identity), if assignees are specified.\n * @param options Pull request creation options including changes, assignees, and auto-complete settings\n * @returns The created pull request ID, or null on error\n */\n public async createPullRequest(options: AzdoPullRequestCreateOptions): Promise<number | null> {\n logger.info(`Creating pull request '${options.title}'...`);\n try {\n const userId = await this.getUserId();\n\n // Map the list of the pull request reviewer ids\n // NOTE: Azure DevOps does not have a concept of assignees.\n // We treat them as optional reviewers. Branch policies should be used for required reviewers.\n const reviewers: AzdoIdentityRefWithVote[] = [];\n if (options.assignees && options.assignees.length > 0) {\n for (const assignee of options.assignees) {\n const identityId = this.isGuid(assignee) ? assignee : await this.resolveIdentityId(assignee);\n if (identityId && !reviewers.some((r) => r.id === identityId)) {\n reviewers.push({ id: identityId });\n } else {\n logger.warn(`Unable to resolve assignee identity '${assignee}'`);\n }\n }\n }\n\n // Create the source branch and push a commit with the dependency file changes\n logger.info(` - Pushing ${options.changes.length} file change(s) to branch '${options.source.branch}'...`);\n const push = await this.inner.git.createPush(options.project, options.repository, {\n refUpdates: [\n {\n name: `refs/heads/${options.source.branch}`,\n oldObjectId: options.source.commit,\n },\n ],\n commits: [\n {\n comment: options.commitMessage,\n author: options.author,\n changes: options.changes\n .filter((change) => change.changeType !== 'none')\n .map(({ changeType, ...change }) => {\n return {\n changeType,\n item: { path: normalizeFilePath(change.path) },\n newContent:\n changeType !== 'delete'\n ? {\n content: Buffer.from(change.content!, <BufferEncoding>change.encoding).toString('base64'),\n contentType: 'base64encoded',\n }\n : undefined,\n };\n }),\n },\n ],\n });\n if (!push?.commits?.length) {\n throw new Error('Failed to push changes to source branch, no commits were created');\n }\n logger.info(` - Pushed commit: ${push.commits.map((c) => c.commitId).join(', ')}.`);\n\n // Create the pull request\n logger.info(` - Creating pull request to merge '${options.source.branch}' into '${options.target.branch}'...`);\n const pullRequest = await this.inner.pullRequests.create(options.project, options.repository, {\n sourceRefName: `refs/heads/${options.source.branch}`,\n targetRefName: `refs/heads/${options.target.branch}`,\n title: options.title,\n description: options.description,\n reviewers,\n workItemRefs: options.workItems?.map((id) => ({ id: id })),\n labels: options.labels?.map((label) => ({ name: label })),\n });\n if (!pullRequest?.pullRequestId) {\n throw new Error('Failed to create pull request, no pull request id was returned');\n }\n logger.info(` - Created pull request: #${pullRequest.pullRequestId}.`);\n\n // Add the pull request properties\n if (options.properties && options.properties.length > 0) {\n logger.info(` - Adding dependency metadata to pull request properties...`);\n const newProperties = await this.inner.pullRequests.setProperties(\n options.project,\n options.repository,\n pullRequest.pullRequestId,\n options.properties,\n );\n if (!newProperties?.count) {\n throw new Error('Failed to add dependency metadata properties to pull request');\n }\n }\n\n // TODO: Upload the pull request description as a 'changes.md' file attachment?\n // This might be a way to work around the 4000 character limit for PR descriptions, but needs more investigation.\n // https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-attachments/create?view=azure-devops-rest-7.1\n\n // Set the pull request auto-complete status\n if (options.autoComplete) {\n logger.info(` - Updating auto-complete options...`);\n const updatedPullRequest = await this.inner.pullRequests.update(\n options.project,\n options.repository,\n pullRequest.pullRequestId,\n {\n autoCompleteSetBy: { id: userId },\n completionOptions: {\n autoCompleteIgnoreConfigIds: options.autoComplete.ignorePolicyConfigIds,\n deleteSourceBranch: true,\n mergeCommitMessage: this.mergeCommitMessage(\n pullRequest.pullRequestId,\n options.title,\n options.description,\n ),\n mergeStrategy: options.autoComplete.mergeStrategy,\n transitionWorkItems: false,\n },\n },\n );\n if (!updatedPullRequest || updatedPullRequest.autoCompleteSetBy?.id !== userId) {\n throw new Error('Failed to set auto-complete on pull request');\n }\n }\n\n logger.info(` - Pull request was created successfully.`);\n return pullRequest.pullRequestId;\n } catch (e) {\n logger.error(`Failed to create pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return null;\n }\n }\n\n /**\n * Update an existing pull request with new changes.\n * This method performs the following operations:\n * 1. Validates the pull request hasn't been modified by another author\n * 2. Checks if the source branch is behind the target branch\n * 3. Rebases the target branch into the source branch if needed\n * 4. Pushes the new changes to the source branch\n *\n * Requires scope \"Code (Read & Write)\" (vso.code, vso.code_write).\n * @param options Pull request update options including the commit and changes\n * @returns True if successful, false on error\n */\n public async updatePullRequest(options: AzdoPullRequestUpdateOptions): Promise<boolean> {\n logger.info(`Updating pull request #${options.pullRequestId}...`);\n try {\n // Get the pull request details\n const pullRequest = await this.inner.pullRequests.get(options.project, options.repository, options.pullRequestId);\n if (!pullRequest) {\n throw new Error(`Pull request #${options.pullRequestId} not found`);\n }\n\n // Skip if the pull request has been modified by another author\n const commits = await this.inner.pullRequests.getCommits(\n options.project,\n options.repository,\n options.pullRequestId,\n );\n if (commits?.some((c) => c.author?.email !== options.author.email)) {\n logger.info(` - Skipping update as pull request has been modified by another user.`);\n return true;\n }\n\n // Get the branch stats to check if the source branch is behind the target branch\n const stats = await this.inner.repositories.getBranchStats(\n options.project,\n options.repository,\n normalizeBranchName(pullRequest.sourceRefName),\n );\n if (stats?.behindCount === undefined) {\n throw new Error(`Failed to get branch stats for '${pullRequest.sourceRefName}'`);\n }\n\n // Skip if the source branch is not behind the target branch\n if (stats.behindCount === 0) {\n logger.info(` - Skipping update as source branch is not behind target branch.`);\n return true;\n }\n\n // Rebase the target branch into the source branch to reset the \"behind\" count\n const sourceBranchName = normalizeBranchName(pullRequest.sourceRefName);\n const targetBranchName = normalizeBranchName(pullRequest.targetRefName);\n if (stats.behindCount > 0) {\n logger.info(\n ` - Rebasing '${targetBranchName}' into '${sourceBranchName}' (${stats.behindCount} commit(s) behind)...`,\n );\n const rebase = await this.inner.git.updateRef(options.project, options.repository, [\n {\n name: pullRequest.sourceRefName,\n oldObjectId: pullRequest.lastMergeSourceCommit.commitId,\n newObjectId: options.commit,\n },\n ]);\n if (rebase?.[0]?.success !== true) {\n throw new Error('Failed to rebase the target branch into the source branch');\n }\n }\n\n // Push all file changes to the source branch\n logger.info(` - Pushing ${options.changes.length} file change(s) to branch '${pullRequest.sourceRefName}'...`);\n const push = await this.inner.git.createPush(options.project, options.repository, {\n refUpdates: [\n {\n name: pullRequest.sourceRefName,\n oldObjectId: options.commit,\n },\n ],\n commits: [\n {\n comment:\n pullRequest.mergeStatus === 'conflicts'\n ? 'Resolve merge conflicts'\n : `Rebase '${sourceBranchName}' onto '${targetBranchName}'`,\n author: options.author,\n changes: options.changes\n .filter((change) => change.changeType !== 'none')\n .map(({ changeType, ...change }) => {\n return {\n changeType,\n item: { path: normalizeFilePath(change.path) },\n newContent:\n changeType !== 'delete'\n ? {\n content: Buffer.from(change.content!, <BufferEncoding>change.encoding).toString('base64'),\n contentType: 'base64encoded',\n }\n : undefined,\n };\n }),\n },\n ],\n });\n if (!push?.commits?.length) {\n throw new Error('Failed to push changes to source branch, no commits were created');\n }\n logger.info(` - Pushed commit: ${push.commits.map((c) => c.commitId).join(', ')}.`);\n\n logger.info(` - Pull request was updated successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to update pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Approve a pull request as the authenticated user.\n * Sets the reviewer vote to 10 (approved).\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Pull request identification options\n * @returns True if successful, false on error\n */\n public async approvePullRequest(options: AzdoPullRequestOptions): Promise<boolean> {\n logger.info(`Approving pull request #${options.pullRequestId}...`);\n try {\n // Approve the pull request\n logger.info(` - Updating reviewer vote on pull request...`);\n const userId = await this.getUserId();\n const userVote = await this.inner.pullRequests.approve(\n options.project,\n options.repository,\n options.pullRequestId,\n userId,\n );\n if (userVote?.vote !== 10) {\n throw new Error('Failed to approve pull request, vote was not recorded');\n }\n\n logger.info(` - Pull request was approved successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to approve pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Abandon a pull request and optionally delete its source branch.\n * This method performs the following operations:\n * 1. Adds an optional comment explaining the abandonment reason\n * 2. Sets the pull request status to abandoned\n * 3. Deletes the source branch if requested\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Pull request abandonment options including optional comment and branch deletion flag\n * @returns True if successful, false on error\n */\n public async abandonPullRequest(options: AzdoPullRequestAbandonOptions): Promise<boolean> {\n logger.info(`Abandoning pull request #${options.pullRequestId}...`);\n try {\n const userId = await this.getUserId();\n\n // Add a comment to the pull request, if supplied\n if (options.comment) {\n logger.info(` - Adding abandonment reason comment to pull request...`);\n const threadId = await this.addCommentThread({\n ...options,\n content: options.comment,\n userId,\n });\n if (!threadId) {\n throw new Error('Failed to add comment to pull request, thread was not created');\n }\n }\n\n // Abandon the pull request\n logger.info(` - Abandoning pull request...`);\n const abandonedPullRequest = await this.inner.pullRequests.abandon(\n options.project,\n options.repository,\n options.pullRequestId,\n userId,\n );\n if (abandonedPullRequest?.status !== 'abandoned') {\n throw new Error('Failed to abandon pull request, status was not updated');\n }\n\n // Delete the source branch if required\n if (options.deleteSourceBranch) {\n logger.info(` - Deleting source branch...`);\n const deletedBranch = await this.inner.git.updateRef(options.project, options.repository, [\n {\n name: abandonedPullRequest.sourceRefName,\n oldObjectId: abandonedPullRequest.lastMergeSourceCommit.commitId,\n newObjectId: '0000000000000000000000000000000000000000',\n isLocked: false,\n },\n ]);\n if (deletedBranch?.[0]?.success !== true) {\n throw new Error('Failed to delete the source branch');\n }\n }\n\n logger.info(` - Pull request was abandoned successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to abandon pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Add a comment thread on a pull request.\n * The comment thread is created with a closed status and system comment type.\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Comment creation options including content and optional user ID\n * @returns The created thread ID, or undefined on error\n */\n public async addCommentThread(options: AzdoPullRequestCommentCreateOptions): Promise<number | undefined> {\n const userId = options.userId ?? (await this.getUserId());\n const thread = await this.inner.pullRequests.createCommentThread(\n options.project,\n options.repository,\n options.pullRequestId,\n {\n status: 'closed',\n comments: [\n {\n author: { id: userId },\n content: options.content,\n commentType: 'system',\n },\n ],\n },\n );\n return thread?.id;\n }\n\n /**\n * Create or update webhook subscriptions for Azure DevOps events.\n * This sets up subscriptions for various git events (push, pull request updates, repository changes, etc.)\n * and ensures they are configured to send webhooks to the specified URL.\n * Existing subscriptions matching the URL will be updated, otherwise new subscriptions are created.\n *\n * Requires scope \"Service Hooks (Read & Write)\" (vso.hooks_write).\n * @returns Array of subscription IDs that were created or updated\n */\n public async createOrUpdateHookSubscriptions({\n url,\n headers,\n project,\n }: {\n url: string;\n headers: Record<string, string>;\n project: string;\n }) {\n // events are registered per project because, the git.repo.* events do not support global subscriptions\n const subscriptionTypes = new Map<AzdoEventType, AzdoEvent['resourceVersion']>([\n ['git.push', '1.0'],\n ['git.pullrequest.updated', '1.0'],\n ['git.pullrequest.merged', '1.0'],\n ['git.repo.created', '1.0-preview.1'],\n ['git.repo.deleted', '1.0-preview.1'],\n ['git.repo.renamed', '1.0-preview.1'],\n ['git.repo.statuschanged', '1.0-preview.1'],\n ['ms.vss-code.git-pullrequest-comment-event', '2.0'],\n ]);\n\n const query = this.buildSubscriptionsQuery({ url, project });\n const subscriptions = await this.inner.subscriptions.query(query);\n\n // iterate each subscription checking if creation or update is required\n const ids: string[] = [];\n for (const [eventType, resourceVersion] of subscriptionTypes) {\n // find existing one\n const existing = subscriptions.find((sub) => {\n return sub.eventType === eventType && sub.resourceVersion === resourceVersion;\n });\n\n let subscription: typeof existing;\n\n // if we have an existing one, update it, otherwise create a new one\n if (existing) {\n // publisherId, consumerId, and consumerActionId cannot be updated\n existing.status = 'enabled';\n existing.eventType = eventType;\n existing.resourceVersion = resourceVersion;\n existing.publisherInputs = this.makeTfsPublisherInputs({ eventType, project });\n existing.consumerInputs = this.makeWebhookConsumerInputs({ url, headers });\n subscription = await this.inner.subscriptions.replace(existing.id, existing);\n } else {\n subscription = await this.inner.subscriptions.create({\n status: 'enabled',\n eventType,\n resourceVersion,\n\n publisherId: 'tfs',\n publisherInputs: this.makeTfsPublisherInputs({ eventType, project }),\n consumerId: 'webHooks',\n consumerActionId: 'httpRequest',\n consumerInputs: this.makeWebhookConsumerInputs({ url, headers }),\n });\n }\n\n ids.push(subscription.id);\n }\n\n // delete any other existing subscriptions that are not in our desired list\n for (const sub of subscriptions) {\n if (!ids.includes(sub.id)) {\n await this.inner.subscriptions.delete(sub.id);\n }\n }\n }\n\n /**\n * Remove all webhook subscriptions for a specific URL.\n * This finds all subscriptions matching the provided URL and deletes them.\n *\n * Requires scope \"Service Hooks (Read & Write)\" (vso.hooks_write).\n */\n public async deleteHookSubscriptions({ url, project }: { url: string; project: string }) {\n const query = this.buildSubscriptionsQuery({ url, project });\n const subscriptions = await this.inner.subscriptions.query(query);\n\n // iterate each subscription and delete it\n for (const sub of subscriptions) {\n await this.inner.subscriptions.delete(sub.id);\n }\n }\n\n private mergeCommitMessage(id: number, title: string, description: string): string {\n //\n // The merge commit message should contain the PR number and title for tracking.\n // This is the default behaviour in Azure DevOps.\n // Example:\n // Merged PR 24093: Bump Tingle.Extensions.Logging.LogAnalytics from 3.4.2-ci0005 to 3.4.2-ci0006\n //\n // Bumps [Tingle.Extensions.Logging.LogAnalytics](...) from 3.4.2-ci0005 to 3.4.2-ci0006\n // - [Release notes](....)\n // - [Changelog](....)\n // - [Commits](....)\n //\n // There appears to be a DevOps bug when setting \"completeOptions\" with a \"mergeCommitMessage\" even when truncated to 4000 characters.\n // The error message is:\n // Invalid argument value.\n // Parameter name: Completion options have exceeded the maximum encoded length (4184/4000)\n //\n // The effective limit seems to be about 3500 characters:\n // https://developercommunity.visualstudio.com/t/raise-the-character-limit-for-pull-request-descrip/365708#T-N424531\n //\n return `Merged PR ${id}: ${title}\\n\\n${description}`.slice(0, 3500);\n }\n\n private isGuid(guid: string): boolean {\n const regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n return regex.test(guid);\n }\n\n private buildSubscriptionsQuery({ url, project }: { url: string; project: string }): AzdoSubscriptionsQuery {\n return {\n publisherId: 'tfs',\n publisherInputFilters: [\n {\n conditions: [{ operator: 'equals', inputId: 'projectId', caseSensitive: false, inputValue: project }],\n },\n ],\n consumerId: 'webHooks',\n consumerActionId: 'httpRequest',\n consumerInputFilters: [\n {\n conditions: [{ operator: 'equals', inputId: 'url', caseSensitive: false, inputValue: url }],\n },\n ],\n };\n }\n\n private makeTfsPublisherInputs({\n eventType,\n project,\n }: {\n eventType: AzdoEventType;\n project: string;\n }): Record<string, string> {\n // possible inputs are available via an authenticated request to\n // https://dev.azure.com/{organization}/_apis/hooks/publishers/tfs\n\n return {\n projectId: project, // project to restrict events to\n\n ...(eventType === 'git.pullrequest.updated' && {\n // only trigger on updates to the pull request status (e.g. active, abandoned, completed)\n notificationType: 'StatusUpdateNotification',\n }),\n ...(eventType === 'git.pullrequest.merged' && {\n // only trigger on conflicts\n mergeResult: 'Conflicts',\n }),\n };\n }\n\n private makeWebhookConsumerInputs({\n url,\n headers,\n }: {\n url: string;\n headers: Record<string, string>;\n }): Record<string, string> {\n return {\n // possible inputs are available via an authenticated request to\n // https://dev.azure.com/{organization}/_apis/hooks/consumers/webHooks\n\n url,\n acceptUntrustedCerts: 'false',\n httpHeaders: Object.entries(headers)\n .map(([key, value]) => `${key}:${value}`)\n .join('\\n'),\n messagesToSend: 'none',\n detailedMessagesToSend: 'none',\n };\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport ky from 'ky';\n\nimport {\n CONFIG_FILE_PATHS_AZURE,\n type DependabotConfig,\n parseDependabotConfig,\n type VariableFinderFn,\n} from '@/dependabot';\nimport { logger } from '@/logger';\nimport type { AzureDevOpsRepositoryUrl } from './url-parts';\n\n/**\n * Parse the dependabot config YAML file to specify update configuration.\n * The file should be located at any of `CONFIG_FILE_PATHS_AZURE`.\n *\n * To view YAML file format, visit\n * https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#allow\n *\n * @returns {DependabotConfig} config - the dependabot configuration\n */\nexport async function getDependabotConfig({\n url,\n token,\n remote,\n rootDir = process.cwd(),\n variableFinder,\n}: {\n url: AzureDevOpsRepositoryUrl;\n token: string;\n /**\n * Whether to fetch the configuration file via the REST API (true) or look for it locally (false).\n */\n remote: boolean;\n rootDir?: string;\n variableFinder: VariableFinderFn;\n}): Promise<DependabotConfig> {\n let configPath: undefined | string;\n let configContents: undefined | string;\n\n /*\n * The configuration file can be available locally if the repository is cloned.\n * Otherwise, we should get it via the API which supports 2 scenarios:\n * 1. Running the pipeline without cloning, which is useful for huge repositories (multiple submodules or large commit log)\n * 2. Running a single pipeline to update multiple repositories https://github.com/mburumaxwell/dependabot-azure-devops/issues/328\n */\n\n if (remote) {\n logger.debug(`Attempting to fetch configuration file via REST API ...`);\n for (const fp of CONFIG_FILE_PATHS_AZURE) {\n // make HTTP request\n const requestUrl = `${url.value}${url.project}/_apis/git/repositories/${url.repository}/items?path=/${fp}`;\n logger.debug(`GET ${requestUrl}`);\n\n try {\n const authHeader = `Basic ${Buffer.from(`x-access-token:${token}`).toString('base64')}`;\n const response = await ky.get(requestUrl, {\n headers: {\n Authorization: authHeader,\n Accept: '*/*', // Gotcha!!! without this SH*T fails terribly\n },\n // 401, 403 and 404 are handled explicitly\n throwHttpErrors: (status) => ![401, 403, 404].includes(status),\n });\n if (response.ok) {\n logger.debug(`Found configuration file at '${requestUrl}'`);\n configContents = await response.text();\n configPath = fp;\n break;\n } else if (response.status === 404) {\n logger.trace(`No configuration file at '${requestUrl}'`);\n // biome-ignore lint/complexity/noUselessContinue: continue is useful here for clarity\n continue;\n } else if (response.status === 401) {\n throw new Error(`No or invalid access token has been provided to access '${requestUrl}'`);\n } else if (response.status === 403) {\n throw new Error(`The access token provided does not have permissions to access '${requestUrl}'`);\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('access token')) {\n throw error;\n } else {\n throw error;\n }\n }\n }\n } else {\n for (const fp of CONFIG_FILE_PATHS_AZURE) {\n const filePath = path.join(rootDir, fp);\n if (existsSync(filePath)) {\n logger.debug(`Found configuration file cloned at ${filePath}`);\n configContents = await readFile(filePath, 'utf-8');\n configPath = filePath;\n break;\n } else {\n logger.trace(`No configuration file cloned at ${filePath}`);\n }\n }\n }\n\n // Ensure we have file contents. Otherwise throw a well readable error.\n if (!configContents || !configPath || typeof configContents !== 'string') {\n throw new Error(`Configuration file not found at possible locations: ${CONFIG_FILE_PATHS_AZURE.join(', ')}`);\n } else {\n logger.trace('Configuration file contents read.');\n }\n\n return await parseDependabotConfig({ configContents, configPath, variableFinder });\n}\n","import { z } from 'zod';\nimport {\n AzdoGitCommitRefSchema,\n AzdoIdentityRefSchema,\n AzdoPullRequestAsyncStatusSchema,\n AzdoPullRequestCommentSchema,\n AzdoPullRequestStatusSchema,\n} from './client/types';\n\nexport const AzdoEventTypeSchema = z.enum([\n // Code is pushed to a Git repository.\n 'git.push',\n // Pull request is updated – status, review list, reviewer vote\n // changed or the source branch is updated with a push.\n 'git.pullrequest.updated',\n // Pull request - Branch merge attempted.\n 'git.pullrequest.merged',\n // A repository is created.\n 'git.repo.created',\n // A repository is deleted.\n 'git.repo.deleted',\n // A repository is renamed.\n 'git.repo.renamed',\n // A repository's status is changed.\n 'git.repo.statuschanged',\n // Comments are added to a pull request.\n 'ms.vss-code.git-pullrequest-comment-event',\n]);\nexport type AzdoEventType = z.infer<typeof AzdoEventTypeSchema>;\n\nconst AzdoEventProjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n url: z.string(),\n});\n\nexport const AzdoEventRepositorySchema = z.object({\n id: z.string(),\n name: z.string(),\n project: AzdoEventProjectSchema,\n defaultBranch: z.string().optional(),\n remoteUrl: z.string(),\n});\n\nexport const AzdoEventCodePushResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n commits: AzdoGitCommitRefSchema.array(),\n refUpdates: z\n .object({\n name: z.string(),\n oldObjectId: z.string().nullish(),\n newObjectId: z.string().nullish(),\n })\n .array(),\n pushId: z.number(),\n url: z.string(), // e.g. \"https://dev.azure.com/fabrikam/_apis/git/repositories/2856c8c5-6f6b-4e6d-8a9f-4cf0d33f2f2a/pushes/22\"\n});\nexport type AzdoEventCodePushResource = z.infer<typeof AzdoEventCodePushResourceSchema>;\n\nexport const AzdoEventPullRequestResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n pullRequestId: z.number(),\n status: AzdoPullRequestStatusSchema,\n createdBy: AzdoIdentityRefSchema,\n title: z.string(),\n sourceRefName: z.string(),\n targetRefName: z.string(),\n mergeStatus: AzdoPullRequestAsyncStatusSchema,\n mergeId: z.string(),\n url: z.string(),\n});\nexport type AzdoEventPullRequestResource = z.infer<typeof AzdoEventPullRequestResourceSchema>;\n\nexport const AzdoEventRepositoryCreatedResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryCreatedResource = z.infer<typeof AzdoEventRepositoryCreatedResourceSchema>;\n\nexport const AzdoEventRepositoryDeletedResourceSchema = z.object({\n project: AzdoEventProjectSchema,\n repositoryId: z.string(),\n repositoryName: z.string(),\n isHardDelete: z.boolean(),\n});\nexport type AzdoEventRepositoryDeletedResource = z.infer<typeof AzdoEventRepositoryDeletedResourceSchema>;\n\nexport const AzdoEventRepositoryRenamedResourceSchema = z.object({\n oldName: z.string(),\n newName: z.string(),\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryRenamedResource = z.infer<typeof AzdoEventRepositoryRenamedResourceSchema>;\n\nexport const AzdoEventRepositoryStatusChangedResourceSchema = z.object({\n disabled: z.boolean(),\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryStatusChangedResource = z.infer<typeof AzdoEventRepositoryStatusChangedResourceSchema>;\n\nexport const AzdoEventPullRequestCommentEventResourceSchema = z.object({\n pullRequest: AzdoEventPullRequestResourceSchema,\n comment: AzdoPullRequestCommentSchema,\n});\nexport type AzdoEventPullRequestCommentEventResource = z.infer<typeof AzdoEventPullRequestCommentEventResourceSchema>;\n\nexport const AzdoEventSchema = z\n .object({\n subscriptionId: z.string(),\n notificationId: z.number(),\n id: z.string(),\n publisherId: z.string(),\n resourceVersion: z.enum(['1.0', '1.0-preview.1', '2.0']),\n createdDate: z.coerce.date(),\n })\n .and(\n z.discriminatedUnion('eventType', [\n z.object({ eventType: z.literal('git.push'), resource: AzdoEventCodePushResourceSchema }),\n z.object({ eventType: z.literal('git.pullrequest.updated'), resource: AzdoEventPullRequestResourceSchema }),\n z.object({ eventType: z.literal('git.pullrequest.merged'), resource: AzdoEventPullRequestResourceSchema }),\n z.object({ eventType: z.literal('git.repo.created'), resource: AzdoEventRepositoryCreatedResourceSchema }),\n z.object({ eventType: z.literal('git.repo.deleted'), resource: AzdoEventRepositoryDeletedResourceSchema }),\n z.object({ eventType: z.literal('git.repo.renamed'), resource: AzdoEventRepositoryRenamedResourceSchema }),\n z.object({\n eventType: z.literal('git.repo.statuschanged'),\n resource: AzdoEventRepositoryStatusChangedResourceSchema,\n }),\n z.object({\n eventType: z.literal('ms.vss-code.git-pullrequest-comment-event'),\n resource: AzdoEventPullRequestCommentEventResourceSchema,\n }),\n ]),\n );\nexport type AzdoEvent = z.infer<typeof AzdoEventSchema>;\n","export type AzureDevOpsOrganizationUrl = {\n /** URL of the organisation. This may lack the project name */\n value: URL;\n\n /** Organisation URL hostname */\n hostname: string;\n\n /** Organisation API endpoint URL */\n 'api-endpoint': string;\n\n /** Organisation name/slug */\n organisation: string;\n\n /** Virtual directory if present (on-premises only) */\n 'virtual-directory'?: string;\n\n /**\n * Organization Identity API URL (different from the API endpoint).\n * Used for querying user identities.\n */\n 'identity-api-url': URL;\n};\n\nexport type AzureDevOpsProjectUrl = AzureDevOpsOrganizationUrl & {\n /** Project ID or Name */\n project: string;\n};\n\nexport type AzureDevOpsRepositoryUrl = AzureDevOpsProjectUrl & {\n /** Repository ID or Name */\n repository: string;\n\n /** Slug of the repository e.g. `contoso/prj1/_git/repo1`, `tfs/contoso/prj1/_git/repo1` */\n 'repository-slug': string;\n};\n\nexport function extractOrganizationUrl({ organisationUrl }: { organisationUrl: string }): AzureDevOpsOrganizationUrl {\n // convert url string into a valid JS URL object\n const value = new URL(organisationUrl);\n const protocol = value.protocol.slice(0, -1);\n let { hostname } = value;\n const visualStudioUrlRegex = /^(?<prefix>\\S+)\\.visualstudio\\.com$/iu;\n if (visualStudioUrlRegex.test(hostname)) hostname = 'dev.azure.com';\n\n const organisation: string = extractOrganisation(organisationUrl);\n\n const virtualDirectory = extractVirtualDirectory(value);\n const apiEndpoint = `${protocol}://${hostname}${value.port ? `:${value.port}` : ''}/${virtualDirectory ? `${virtualDirectory}/` : ''}`;\n\n // determine identity api url\n // if hosted on Azure DevOps, use the 'vssps.dev.azure.com' domain\n const identityApiUrl =\n hostname === 'dev.azure.com' || hostname.endsWith('.visualstudio.com')\n ? // https://learn.microsoft.com/en-us/rest/api/azure/devops/ims/identities/read-identities\n new URL(`https://vssps.dev.azure.com/${organisation}/`)\n : value;\n\n return {\n value,\n hostname,\n 'api-endpoint': apiEndpoint,\n organisation,\n 'virtual-directory': virtualDirectory,\n 'identity-api-url': identityApiUrl,\n };\n}\n\nexport function extractProjectUrl({\n organisationUrl,\n project,\n}: {\n organisationUrl: string;\n project: string;\n}): AzureDevOpsProjectUrl {\n const extracted = extractOrganizationUrl({ organisationUrl });\n const escapedProject = encodeURI(project); // encode special characters like spaces\n\n return {\n ...extracted,\n project: escapedProject,\n };\n}\n\nexport function extractRepositoryUrl({\n organisationUrl,\n project,\n repository,\n}: {\n organisationUrl: string;\n project: string;\n repository: string;\n}): AzureDevOpsRepositoryUrl {\n const extracted = extractProjectUrl({ organisationUrl, project });\n const { organisation, 'virtual-directory': virtualDirectory, project: escapedProject } = extracted;\n\n const escapedRepository = encodeURI(repository); // encode special characters like spaces\n const repoSlug = `${virtualDirectory ? `${virtualDirectory}/` : ''}${organisation}/${escapedProject}/_git/${escapedRepository}`;\n\n return {\n ...extracted,\n repository: escapedRepository,\n 'repository-slug': repoSlug,\n };\n}\n\n/**\n * Extract organisation name from organisation URL\n *\n * @param organisationUrl\n *\n * @returns organisation name\n */\nfunction extractOrganisation(organisationUrl: string): string {\n const url = new URL(organisationUrl);\n const { hostname, pathname } = url;\n\n // Check for old style: https://x.visualstudio.com/\n if (hostname.endsWith('.visualstudio.com')) {\n return hostname.split('.')[0]!;\n }\n\n // For new style and on-premise, parse the pathname\n // pathname examples: '/contoso/', '/contoso', '/tfs/contoso/', '/tfs/contoso', '/contoso/Core'\n const pathSegments = pathname.split('/').filter((segment) => segment !== '');\n\n // Check for on-premise style: https://server.domain.com/tfs/contoso/\n if (pathSegments.length >= 2 && hostname !== 'dev.azure.com') {\n return pathSegments[1]!; // Return 'contoso' from '/tfs/contoso/'\n }\n\n // Check for new style: https://dev.azure.com/contoso/ or https://dev.azure.com/contoso or https://dev.azure.com/contoso/Core\n if (pathSegments.length >= 1) {\n return pathSegments[0]!; // Always return the first path segment for dev.azure.com\n }\n\n throw new Error(`Error parsing organisation from organisation url: '${organisationUrl}'.`);\n}\n\n/**\n * Extract virtual directory from organisation URL\n *\n * Virtual Directories are sometimes used in on-premises\n * @param organisationUrl\n *\n * @returns virtual directory\n *\n * @example URLs typically are like this:`https://server.domain.com/tfs/x/` and `tfs` is the virtual directory\n */\nfunction extractVirtualDirectory(organisationUrl: URL) {\n // extract the pathname from the url then split\n // pathname takes the shape '/tfs/x/'\n const path = organisationUrl.pathname.split('/');\n\n // Virtual Directories are sometimes used in on-premises\n // URLs typically are like this: https://server.domain.com/tfs/x/\n // The pathname extracted looks like this: '/tfs/x/'\n return path.length === 4 ? path[1]! : undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["client: KyInstance","path","changeType: AzdoVersionControlChangeType","reviewers: AzdoIdentityRefWithVote[]","ids: string[]","subscription: typeof existing","configPath: undefined | string","configContents: undefined | string","organisation: string","path"],"sources":["../../src/azure/client/constants.ts","../../src/azure/client/client-base.ts","../../src/azure/client/client-connection.ts","../../src/azure/client/client-git.ts","../../src/azure/client/client-identity.ts","../../src/azure/client/client-projects.ts","../../src/azure/client/client-pull-requests.ts","../../src/azure/client/client-repositories.ts","../../src/azure/client/client-subscriptions.ts","../../src/azure/client/client.ts","../../src/azure/client/types.ts","../../src/azure/client/utils.ts","../../src/azure/client/wrapper.ts","../../src/azure/config.ts","../../src/azure/events.ts","../../src/azure/url-parts.ts"],"sourcesContent":["export const API_VERSION = '5.0'; // this is the same version used by dependabot-core\nexport const API_VERSION_PREVIEW = '5.0-preview';\n\n/** Returned when no user is authenticated */\nexport const ANONYMOUS_USER_ID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';\n\n/**\n * Pull request property names used to store metadata about the pull request.\n * https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-properties\n */\nexport const PR_PROPERTY_MICROSOFT_GIT_SOURCE_REF_NAME = 'Microsoft.Git.PullRequest.SourceRefName';\nexport const PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER = 'Dependabot.PackageManager';\nexport const PR_PROPERTY_DEPENDABOT_DEPENDENCIES = 'Dependabot.Dependencies';\n\nexport const PR_DESCRIPTION_MAX_LENGTH = 4_000;\n","import type { KyInstance } from 'ky';\nimport { API_VERSION } from './constants';\n\nexport class BaseAzureDevOpsClient {\n constructor(protected readonly client: KyInstance) {}\n\n protected makeUrl(path: string): string;\n protected makeUrl(path: string, apiVersion: string): string;\n protected makeUrl(path: string, params: Record<string, unknown>): string;\n protected makeUrl(path: string, params: Record<string, unknown>, apiVersion: string): string;\n protected makeUrl(path: string, params?: Record<string, unknown> | string, apiVersion: string = API_VERSION): string {\n if (typeof params === 'string') {\n apiVersion = params;\n params = {};\n }\n\n const queryString = Object.entries({ 'api-version': apiVersion, ...params })\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join('&');\n return `${path}?${queryString}`;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport { API_VERSION_PREVIEW } from './constants';\nimport type { AzdoConnectionData } from './types';\n\nexport class ConnectionClient extends BaseAzureDevOpsClient {\n /**\n * Get the connection data for the current user.\n */\n public async get(): Promise<AzdoConnectionData> {\n return await this.client.get<AzdoConnectionData>(this.makeUrl('_apis/connectiondata', API_VERSION_PREVIEW)).json();\n }\n}\n","import { isHTTPError } from 'ky';\nimport { BaseAzureDevOpsClient } from './client-base';\nimport type {\n AzdoGitCommitDiffs,\n AzdoGitPush,\n AzdoGitPushCreate,\n AzdoGitRefUpdate,\n AzdoGitRefUpdateResult,\n AzdoRepositoryItem,\n AzdoResponse,\n} from './types';\n\nexport class GitClient extends BaseAzureDevOpsClient {\n public async getItem(\n projectIdOrName: string,\n repositoryIdOrName: string,\n path: string,\n includeContent: boolean = true,\n latestProcessedChange: boolean = true,\n ): Promise<AzdoRepositoryItem | undefined> {\n try {\n const item = await this.client\n .get<AzdoRepositoryItem>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/items`,\n {\n path,\n includeContent,\n latestProcessedChange,\n },\n ),\n )\n .json();\n return item;\n } catch (e) {\n if (isHTTPError(e) && e.response.status === 404) {\n // item does not exist\n return undefined;\n }\n throw e;\n }\n }\n\n public async getPush(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pushId: number,\n includeCommits?: number,\n includeRefUpdates?: boolean,\n ): Promise<AzdoGitPush> {\n return await this.client\n .get<AzdoGitPush>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pushes/${pushId}`,\n {\n includeCommits,\n includeRefUpdates,\n },\n ),\n )\n .json();\n }\n\n public async createPush(\n projectIdOrName: string,\n repositoryIdOrName: string,\n push: AzdoGitPushCreate,\n ): Promise<AzdoGitPush> {\n return await this.client\n .post<AzdoGitPush>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pushes`,\n ),\n { json: push },\n )\n .json();\n }\n\n public async getDiffCommits(\n projectIdOrName: string,\n repositoryIdOrName: string,\n baseVersion: string,\n targetVersion: string,\n ): Promise<AzdoGitCommitDiffs> {\n return await this.client\n .get<AzdoGitCommitDiffs>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/diffs/commits`,\n {\n baseVersion,\n baseVersionType: 'commit',\n targetVersion,\n targetVersionType: 'commit',\n },\n ),\n )\n .json();\n }\n\n public async updateRef(\n projectIdOrName: string,\n repositoryIdOrName: string,\n ref: AzdoGitRefUpdate[],\n ): Promise<AzdoGitRefUpdateResult[] | undefined> {\n const response = await this.client\n .post<AzdoResponse<AzdoGitRefUpdateResult[]>>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/refs`,\n ),\n { json: ref },\n )\n .json();\n return response.value;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoIdentity, AzdoResponse } from './types';\n\nexport class IdentityClient extends BaseAzureDevOpsClient {\n /**\n * Get the identities that match the given user name, email, or group name.\n * Requires scope \"Identity (Read)\" (vso.identity).\n * @param filterValue username, email, or group name\n * @returns\n */\n public async get(filterValue: string): Promise<AzdoIdentity[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoIdentity[]>>(\n this.makeUrl('_apis/identities', {\n searchFilter: 'General',\n filterValue,\n queryMembership: 'None',\n }),\n )\n .json();\n return response?.value;\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoProject, AzdoResponse } from './types';\n\nexport class ProjectsClient extends BaseAzureDevOpsClient {\n public async list(): Promise<AzdoProject[] | undefined> {\n const response = await this.client.get<AzdoResponse<AzdoProject[]>>(this.makeUrl('_apis/projects')).json();\n return response?.value;\n }\n\n public async get(idOrName: string): Promise<AzdoProject | undefined> {\n return await this.client.get<AzdoProject>(this.makeUrl(`_apis/projects/${encodeURIComponent(idOrName)}`)).json();\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type {\n AzdoGitCommitRef,\n AzdoIdentityRefWithVote,\n AzdoProperties,\n AzdoPullRequest,\n AzdoPullRequestCommentThread,\n AzdoPullRequestStatus,\n AzdoResponse,\n} from './types';\n\nexport class PullRequestsClient extends BaseAzureDevOpsClient {\n /**\n * List pull requests\n * Requires scope \"Code (Read)\" (vso.code).\n * @param projectIdOrName\n * @param repositoryIdOrName\n * @param creatorId ID of the user who created the pull requests\n * @param status The status of the pull requests to filter by\n */\n public async list(\n projectIdOrName: string,\n repositoryIdOrName: string,\n creatorId: string,\n status: AzdoPullRequestStatus,\n ): Promise<AzdoPullRequest[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoPullRequest[]>>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests`,\n {\n 'searchCriteria.creatorId': creatorId,\n 'searchCriteria.status': status,\n },\n ),\n )\n .json();\n return response?.value;\n }\n\n public async get(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<AzdoPullRequest | undefined> {\n return await this.client\n .get<AzdoPullRequest>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`,\n ),\n )\n .json();\n }\n\n public async create(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pr: Partial<AzdoPullRequest>,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .post<AzdoPullRequest>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests`,\n ),\n { json: pr },\n )\n .json();\n }\n\n public async update(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n pr: Partial<AzdoPullRequest>,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .patch<AzdoPullRequest>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`,\n ),\n { json: pr },\n )\n .json();\n }\n\n public async getProperties(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<{ name: string; value: string }[]> {\n const response = await this.client\n .get<AzdoResponse<AzdoProperties>>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/properties`,\n ),\n )\n .json();\n\n return Object.entries(response?.value || {})\n .filter(([, val]) => val?.$value)\n .map(([key, val]) => ({\n name: key,\n value: val.$value,\n }));\n }\n\n public async setProperties(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n properties: { name: string; value: string }[],\n ): Promise<AzdoResponse<AzdoProperties>> {\n return await this.client\n .patch<AzdoResponse<AzdoProperties>>(\n this.makeUrl(\n `${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/pullrequests/${pullRequestId}/properties`,\n ),\n {\n headers: { 'Content-Type': 'application/json-patch+json' },\n json: properties.map((property) => {\n return {\n op: 'add',\n path: `/${property.name}`,\n value: property.value,\n };\n }),\n },\n )\n .json();\n }\n\n /**\n * Approve a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async approve(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n userId: string,\n ): Promise<AzdoIdentityRefWithVote> {\n return await this.client\n .put<AzdoIdentityRefWithVote>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/reviewers/${userId}`,\n // API version 7.1 is required to use the 'isReapprove' parameter\n // See: https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-reviewers/create-pull-request-reviewer?view=azure-devops-rest-7.1&tabs=HTTP#request-body\n // https://learn.microsoft.com/en-us/azure/devops/integrate/concepts/rest-api-versioning?view=azure-devops#supported-versions\n '7.1',\n ),\n {\n json: {\n // Vote 10 = \"approved\"; 5 = \"approved with suggestions\"; 0 = \"no vote\"; -5 = \"waiting for author\"; -10 = \"rejected\"\n vote: 10,\n // Reapprove must be set to true after the 2023 August 23 update;\n // Approval of a previous PR iteration does not count in later iterations, which means we must (re)approve every after push to the source branch\n // See: https://learn.microsoft.com/en-us/azure/devops/release-notes/2023/sprint-226-update#new-branch-policy-preventing-users-to-approve-their-own-changes\n // https://github.com/mburumaxwell/dependabot-azure-devops/issues/1069\n isReapprove: true,\n },\n },\n )\n .json();\n }\n\n /**\n * Abandon a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async abandon(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n userId: string,\n ): Promise<AzdoPullRequest> {\n return await this.client\n .patch<AzdoPullRequest>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}`,\n ),\n {\n json: {\n status: 'abandoned',\n closedBy: { id: userId },\n } satisfies Pick<AzdoPullRequest, 'status' | 'closedBy'>,\n },\n )\n .json();\n }\n\n /**\n * Get commits of a pull request.\n * Requires scope \"Code (Read)\" (vso.code_read).\n */\n public async getCommits(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n ): Promise<AzdoGitCommitRef[] | undefined> {\n const response = await this.client\n .get<AzdoResponse<AzdoGitCommitRef[]>>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/commits`,\n ),\n )\n .json();\n return response?.value;\n }\n\n /**\n * Create a comment thread on a pull request.\n * Requires scope \"Code (Write)\" (vso.code_write).\n */\n public async createCommentThread(\n projectIdOrName: string,\n repositoryIdOrName: string,\n pullRequestId: number,\n thread: Partial<AzdoPullRequestCommentThread>,\n ): Promise<AzdoPullRequestCommentThread> {\n return await this.client\n .post<AzdoPullRequestCommentThread>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}/pullrequests/${pullRequestId}/threads`,\n ),\n { json: thread },\n )\n .json();\n }\n}\n","import { isHTTPError } from 'ky';\nimport { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoGitBranchStats, AzdoGitRef, AzdoRepository, AzdoResponse } from './types';\n\nexport class RepositoriesClient extends BaseAzureDevOpsClient {\n public async list(projectIdOrName: string): Promise<AzdoRepository[] | undefined> {\n const repos = await this.client\n .get<AzdoResponse<AzdoRepository[]>>(\n this.makeUrl(`${encodeURIComponent(projectIdOrName)}/_apis/git/repositories`),\n )\n .json();\n return repos?.value;\n }\n\n public async get(projectIdOrName: string, repositoryIdOrName: string): Promise<AzdoRepository | undefined> {\n try {\n const repo = await this.client\n .get<AzdoRepository>(\n this.makeUrl(\n `${encodeURIComponent(projectIdOrName)}/_apis/git/repositories/${encodeURIComponent(repositoryIdOrName)}`,\n ),\n )\n .json();\n return repo;\n } catch (e) {\n if (isHTTPError(e) && e.response.status === 404) {\n // repository no longer exists\n return undefined;\n }\n throw e;\n }\n }\n\n /**\n * Get the list of refs (a.k.a branch names) for a repository.\n * Requires scope \"Code (Read)\" (vso.code).\n * @param projectIdOrName\n * @param repositoryIdOrName\n * @returns\n */\n public async getRefs(projectIdOrName: string, repositoryIdOrName: string): Promise<AzdoGitRef[] | undefined> {\n const refs = await this.client\n .get<AzdoResponse<AzdoGitRef[]>>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/refs`),\n )\n .json();\n\n return refs?.value;\n }\n\n public async getBranchStats(\n projectIdOrName: string,\n repositoryIdOrName: string,\n branchName: string,\n ): Promise<AzdoGitBranchStats | undefined> {\n return await this.client\n .get<AzdoGitBranchStats>(\n this.makeUrl(`${projectIdOrName}/_apis/git/repositories/${repositoryIdOrName}/stats/branches`, {\n name: branchName,\n }),\n )\n .json();\n }\n}\n","import { BaseAzureDevOpsClient } from './client-base';\nimport type { AzdoSubscription, AzdoSubscriptionsQuery, AzdoSubscriptionsQueryResponse } from './types';\n\nexport class HookSubscriptionsClient extends BaseAzureDevOpsClient {\n public async query(query: AzdoSubscriptionsQuery): Promise<AzdoSubscription[]> {\n const response = await this.client\n .post<AzdoSubscriptionsQueryResponse>(this.makeUrl('_apis/hooks/subscriptionsquery'), { json: query })\n .json();\n return response?.results;\n }\n\n public async create(subscription: Partial<AzdoSubscription>): Promise<AzdoSubscription> {\n const response = await this.client\n .post<AzdoSubscription>(this.makeUrl('_apis/hooks/subscriptions'), { json: subscription })\n .json();\n return response;\n }\n\n public async replace(subscriptionId: string, subscription: AzdoSubscription): Promise<AzdoSubscription> {\n const response = await this.client\n .put<AzdoSubscription>(this.makeUrl(`_apis/hooks/subscriptions/${subscriptionId}`), { json: subscription })\n .json();\n return response;\n }\n\n public async delete(subscriptionId: string): Promise<void> {\n await this.client.delete(this.makeUrl(`_apis/hooks/subscriptions/${subscriptionId}`)).json();\n }\n}\n","import ky, { isHTTPError, type Options as KyOptions } from 'ky';\nimport { logger } from '@/logger';\nimport type { AzureDevOpsOrganizationUrl } from '../url-parts';\nimport { ConnectionClient } from './client-connection';\nimport { GitClient } from './client-git';\nimport { IdentityClient } from './client-identity';\nimport { ProjectsClient } from './client-projects';\nimport { PullRequestsClient } from './client-pull-requests';\nimport { RepositoriesClient } from './client-repositories';\nimport { HookSubscriptionsClient } from './client-subscriptions';\n\nexport class AzureDevOpsClient {\n public readonly organizationSlug: string;\n public readonly organizationUrl: string;\n public readonly connection: ConnectionClient;\n public readonly identity: IdentityClient;\n public readonly projects: ProjectsClient;\n public readonly repositories: RepositoriesClient;\n public readonly git: GitClient;\n public readonly pullRequests: PullRequestsClient;\n public readonly subscriptions: HookSubscriptionsClient;\n\n constructor(url: AzureDevOpsOrganizationUrl, accessToken: string, debug: boolean = false) {\n this.organizationSlug = url.organisation;\n const organizationUrl = url.value.toString().replace(/\\/$/, ''); // trim trailing slash\n this.organizationUrl = organizationUrl;\n const mainClientOptions = AzureDevOpsClient.createClientOptions(accessToken, debug, {\n prefixUrl: organizationUrl,\n });\n const mainClient = ky.create(mainClientOptions);\n this.connection = new ConnectionClient(mainClient);\n this.projects = new ProjectsClient(mainClient);\n this.repositories = new RepositoriesClient(mainClient);\n this.git = new GitClient(mainClient);\n this.pullRequests = new PullRequestsClient(mainClient);\n this.subscriptions = new HookSubscriptionsClient(mainClient);\n\n const identityApiUrl = url['identity-api-url'].toString().replace(/\\/$/, ''); // trim trailing slash\n const identityClient = ky.create({ ...mainClientOptions, prefixUrl: identityApiUrl });\n this.identity = new IdentityClient(identityClient);\n }\n\n private static createClientOptions(accessToken: string, debug: boolean, options?: KyOptions): KyOptions {\n return {\n headers: {\n Authorization: `Basic ${Buffer.from(`:${accessToken}`).toString('base64')}`,\n Accept: 'application/json',\n },\n hooks: {\n beforeRequest: [\n async (request, options) => {\n if (debug) logger.debug(`🌎 🠊 [${request.method}] ${request.url}`);\n },\n ],\n afterResponse: [\n async (request, options, response) => {\n if (debug) {\n logger.debug(`🌎 🠈 [${response.status}] ${response.statusText}`);\n\n // log the request and response for debugging\n if (request.body) {\n logger.debug(`REQUEST: ${JSON.stringify(request.body)}`);\n }\n // const body = await response.text();\n // if (body) {\n // logger.debug(`RESPONSE: ${body}`);\n // }\n }\n },\n ],\n beforeRetry: [\n async ({ request, options, error, retryCount }) => {\n if (debug && isHTTPError(error)) {\n logger.debug(`⏳ Retrying failed request with status code: ${error.response.status}`);\n }\n },\n ],\n },\n retry: {\n limit: 3,\n delay: (attempt) => 3000, // all attempts after 3 seconds\n },\n ...options,\n };\n }\n}\n","import { z } from 'zod';\n\nexport const AzdoVersionControlChangeTypeSchema = z.enum([\n 'none',\n 'add',\n 'edit',\n 'encoding',\n 'rename',\n 'delete',\n 'undelete',\n 'branch',\n 'merge',\n 'lock',\n 'rollback',\n 'sourceRename',\n 'targetRename',\n 'property',\n 'all',\n]);\nexport type AzdoVersionControlChangeType = z.infer<typeof AzdoVersionControlChangeTypeSchema>;\n\nexport const AZDO_PULL_REQUEST_MERGE_STRATEGIES = ['noFastForward', 'squash', 'rebase', 'rebaseMerge'] as const;\nexport const AzdoPullRequestMergeStrategySchema = z.enum(AZDO_PULL_REQUEST_MERGE_STRATEGIES);\nexport type AzdoPullRequestMergeStrategy = z.infer<typeof AzdoPullRequestMergeStrategySchema>;\n\nexport const AzdoCommentThreadStatusSchema = z.enum([\n 'unknown',\n 'active',\n 'fixed',\n 'wontFix',\n 'closed',\n 'byDesign',\n 'pending',\n]);\nexport type AzdoCommentThreadStatus = z.infer<typeof AzdoCommentThreadStatusSchema>;\nexport const AzdoCommentTypeSchema = z.enum(['unknown', 'text', 'codeChange', 'system']);\nexport type AzdoCommentType = z.infer<typeof AzdoCommentTypeSchema>;\n\nexport const AzdoPullRequestAsyncStatusSchema = z.enum([\n 'notSet',\n 'queued',\n 'conflicts',\n 'succeeded',\n 'rejectedByPolicy',\n 'failure',\n]);\nexport type AzdoPullRequestAsyncStatus = z.infer<typeof AzdoPullRequestAsyncStatusSchema>;\nexport const AzdoPullRequestStatusSchema = z.enum(['notSet', 'active', 'abandoned', 'completed', 'all']);\nexport type AzdoPullRequestStatus = z.infer<typeof AzdoPullRequestStatusSchema>;\n\nexport const AzdoProjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n url: z.string(),\n state: z.enum(['deleting', 'new', 'wellFormed', 'createPending', 'all', 'unchanged', 'deleted']),\n _links: z\n .object({\n self: z.object({ href: z.string() }),\n collection: z.object({ href: z.string() }),\n web: z.object({ href: z.string() }),\n })\n .optional(),\n});\nexport type AzdoProject = z.infer<typeof AzdoProjectSchema>;\n\nexport const AzdoRepositorySchema = z.object({\n id: z.string(),\n name: z.string(),\n defaultBranch: z.string().optional(),\n project: AzdoProjectSchema,\n isDisabled: z.boolean().optional(),\n isFork: z.boolean().optional(),\n url: z.string(),\n remoteUrl: z.string(),\n webUrl: z.string(),\n});\nexport type AzdoRepository = z.infer<typeof AzdoRepositorySchema>;\n\nexport type AzdoResponse<T> = {\n value?: T;\n count: number;\n};\n\nexport const AzdoIdentitySchema = z.object({\n id: z.string(),\n displayName: z.string(),\n url: z.string(),\n});\nexport type AzdoIdentity = z.infer<typeof AzdoIdentitySchema>;\nexport const AzdoIdentityRefSchema = z.object({\n id: z.string().optional(),\n displayName: z.string().optional(),\n uniqueName: z.string().optional(),\n url: z.string().optional(),\n});\nexport type AzdoIdentityRef = z.infer<typeof AzdoIdentityRefSchema>;\n\nexport const AzdoConnectionDataSchema = z.object({\n authenticatedUser: AzdoIdentitySchema,\n authorizedUser: AzdoIdentitySchema,\n});\nexport type AzdoConnectionData = z.infer<typeof AzdoConnectionDataSchema>;\n\nexport const AzdoGitUserDateSchema = z.object({\n name: z.string(),\n email: z.string(),\n date: z.string().optional(),\n});\nexport type AzdoGitUserDate = z.infer<typeof AzdoGitUserDateSchema>;\nexport const AzdoGitRefSchema = z.object({\n name: z.string(),\n objectId: z.string(),\n isLocked: z.boolean().optional(),\n});\nexport type AzdoGitRef = z.infer<typeof AzdoGitRefSchema>;\nexport const AzdoGitRefUpdateResultSchema = AzdoGitRefSchema.extend({\n oldObjectId: z.string(),\n newObjectId: z.string(),\n success: z.boolean(),\n customMessage: z.string().optional(),\n});\nexport type AzdoGitRefUpdateResult = z.infer<typeof AzdoGitRefUpdateResultSchema>;\nexport const AzdoGitChangeSchema = z.object({\n changeType: AzdoVersionControlChangeTypeSchema,\n item: z.object({ path: z.string() }).optional(), // current version (path)\n newContent: z\n .object({\n content: z.string(),\n contentType: z.enum(['rawtext', 'base64encoded']),\n })\n .optional(),\n originalPath: z.string().optional(), // original path of the item if different from current path\n});\nexport type AzdoGitChange = z.infer<typeof AzdoGitChangeSchema>;\nexport const AzdoGitCommitRefSchema = z.object({\n commitId: z.string(),\n author: AzdoGitUserDateSchema.optional(),\n committer: AzdoGitUserDateSchema.optional(),\n changes: AzdoGitChangeSchema.array().optional(),\n});\nexport type AzdoGitCommitRef = z.infer<typeof AzdoGitCommitRefSchema>;\nexport const AzdoGitPushSchema = z.object({\n commits: AzdoGitCommitRefSchema.array(),\n refUpdates: AzdoGitRefSchema.array(),\n});\nexport type AzdoGitPush = z.infer<typeof AzdoGitPushSchema>;\nexport const AzdoGitRefUpdateSchema = z.object({\n name: z.string(),\n oldObjectId: z.string(),\n newObjectId: z.string().optional(),\n isLocked: z.boolean().optional(),\n});\nexport type AzdoGitRefUpdate = z.infer<typeof AzdoGitRefUpdateSchema>;\nexport const AzdoGitPushCreateSchema = z.object({\n refUpdates: AzdoGitRefUpdateSchema.array(),\n commits: z\n .object({\n comment: z.string(),\n author: AzdoGitUserDateSchema.optional(),\n changes: AzdoGitChangeSchema.array(),\n })\n .array(),\n});\nexport type AzdoGitPushCreate = z.infer<typeof AzdoGitPushCreateSchema>;\nexport const AzdoGitBranchStatsSchema = z.object({\n aheadCount: z.number(),\n behindCount: z.number(),\n});\nexport type AzdoGitBranchStats = z.infer<typeof AzdoGitBranchStatsSchema>;\nexport const AzdoGitCommitDiffsSchema = z.object({\n allChangesIncluded: z.boolean(),\n baseCommit: z.string(),\n changes: AzdoGitChangeSchema.array(),\n targetCommit: z.string(),\n});\nexport type AzdoGitCommitDiffs = z.infer<typeof AzdoGitCommitDiffsSchema>;\n\nexport const AzdoRepositoryItemSchema = z.object({\n latestProcessedChange: AzdoGitCommitRefSchema.optional(),\n content: z.string().optional(),\n});\nexport type AzdoRepositoryItem = z.infer<typeof AzdoRepositoryItemSchema>;\n\nexport const AzdoIdentityRefWithVoteSchema = z.object({\n id: z.string().optional(),\n displayName: z.string().optional(),\n vote: z.number().optional(),\n hasDeclined: z.boolean().optional(),\n isFlagged: z.boolean().optional(),\n isRequired: z.boolean().optional(),\n});\nexport type AzdoIdentityRefWithVote = z.infer<typeof AzdoIdentityRefWithVoteSchema>;\n\nexport const AzdoPullRequestSchema = z.object({\n pullRequestId: z.number(),\n status: AzdoPullRequestStatusSchema,\n isDraft: z.boolean(),\n sourceRefName: z.string(),\n targetRefName: z.string(),\n title: z.string(),\n description: z.string().optional(),\n lastMergeCommit: AzdoGitCommitRefSchema,\n lastMergeSourceCommit: AzdoGitCommitRefSchema,\n mergeStatus: AzdoPullRequestAsyncStatusSchema,\n reviewers: AzdoIdentityRefWithVoteSchema.array().optional(),\n workItemRefs: z.object({ id: z.string() }).array().optional(),\n labels: z.object({ name: z.string() }).array().optional(),\n autoCompleteSetBy: AzdoIdentityRefSchema.optional(),\n completionOptions: z\n .object({\n autoCompleteIgnoreConfigIds: z.number().array().optional(),\n deleteSourceBranch: z.boolean().optional(),\n mergeCommitMessage: z.string().optional(),\n mergeStrategy: AzdoPullRequestMergeStrategySchema.optional(),\n transitionWorkItems: z.boolean().optional(),\n })\n .optional(),\n closedBy: AzdoIdentityRefSchema.optional(),\n});\nexport type AzdoPullRequest = z.infer<typeof AzdoPullRequestSchema>;\n\nexport const AzdoPropertiesSchema = z.record(\n z.string(),\n z.object({\n $type: z.string(),\n $value: z.string(),\n }),\n);\nexport type AzdoProperties = z.infer<typeof AzdoPropertiesSchema>;\n\nexport const AzdoPullRequestCommentSchema = z.object({\n id: z.number().optional(),\n parentCommentId: z.number().optional(),\n content: z.string(),\n commentType: AzdoCommentTypeSchema,\n publishedDate: z.string().optional(),\n author: AzdoIdentityRefSchema,\n});\nexport type AzdoPullRequestComment = z.infer<typeof AzdoPullRequestCommentSchema>;\nexport const AzdoPullRequestCommentThreadSchema = z.object({\n id: z.number(),\n comments: AzdoPullRequestCommentSchema.array(),\n status: AzdoCommentThreadStatusSchema,\n});\nexport type AzdoPullRequestCommentThread = z.infer<typeof AzdoPullRequestCommentThreadSchema>;\n\nexport const AzdoSubscriptionSchema = z.object({\n id: z.string(),\n status: z.enum(['enabled', 'onProbation', 'disabledByUser', 'disabledBySystem', 'disabledByInactiveIdentity']),\n publisherId: z.string(),\n publisherInputs: z.record(z.string(), z.string()),\n consumerId: z.string().optional(),\n consumerActionId: z.string().optional(),\n consumerInputs: z.record(z.string(), z.string()),\n eventType: z.string(), // not enum because we do not know all the values\n resourceVersion: z.string(),\n eventDescription: z.string().optional(),\n actionDescription: z.string().optional(),\n});\nexport type AzdoSubscription = z.infer<typeof AzdoSubscriptionSchema>;\n\nexport const AzdoSubscriptionsQueryResponseSchema = z.object({\n results: AzdoSubscriptionSchema.array(),\n});\nexport type AzdoSubscriptionsQueryResponse = z.infer<typeof AzdoSubscriptionsQueryResponseSchema>;\n\nexport const AzdoSubscriptionsQueryInputFilterSchema = z.object({\n conditions: z\n .object({\n caseSensitive: z.boolean().optional(),\n inputId: z.string().optional(),\n inputValue: z.string().optional(),\n operator: z.enum(['equals', 'notEquals']),\n })\n .array()\n .optional(),\n});\nexport type AzdoSubscriptionsQueryInputFilter = z.infer<typeof AzdoSubscriptionsQueryInputFilterSchema>;\n\nexport const AzdoSubscriptionsQuerySchema = z.object({\n consumerActionId: z.string().optional(),\n consumerId: z.string().optional(),\n consumerInputFilters: AzdoSubscriptionsQueryInputFilterSchema.array().optional(),\n eventType: z.string().optional(),\n publisherId: z.string().optional(),\n publisherInputFilters: AzdoSubscriptionsQueryInputFilterSchema.array().optional(),\n subscriberId: z.string().optional(),\n});\nexport type AzdoSubscriptionsQuery = z.infer<typeof AzdoSubscriptionsQuerySchema>;\n\nexport type AzdoPrExtractedWithProperties = {\n pullRequestId: number;\n properties?: { name: string; value: string }[];\n};\n\nexport type AzdoFileChange = {\n changeType: AzdoVersionControlChangeType;\n path: string;\n content?: string;\n encoding?: 'utf-8' | 'base64';\n};\n","import * as path from 'node:path';\n\nimport {\n areEqual,\n type DependabotCreatePullRequest,\n type DependabotPersistedPr,\n DependabotPersistedPrSchema,\n type DependabotUpdatePullRequest,\n getDependencyNames,\n} from '@/dependabot';\nimport { PR_PROPERTY_DEPENDABOT_DEPENDENCIES, PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER } from './constants';\nimport type { AzdoFileChange, AzdoPrExtractedWithProperties, AzdoVersionControlChangeType } from './types';\n\nexport function buildPullRequestProperties(packageManager: string, dependencies: DependabotPersistedPr) {\n return [\n {\n name: PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER,\n value: packageManager,\n },\n {\n name: PR_PROPERTY_DEPENDABOT_DEPENDENCIES,\n value: JSON.stringify(dependencies),\n },\n ];\n}\n\nexport function parsePullRequestProperties(\n pullRequests: AzdoPrExtractedWithProperties[],\n packageManager: string | null,\n): Record<string, DependabotPersistedPr> {\n return Object.fromEntries(\n pullRequests\n .filter((pr) => {\n return pr.properties?.find(\n (p) =>\n p.name === PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER &&\n (packageManager === null || p.value === packageManager),\n );\n })\n .map((pr) => {\n return [\n pr.pullRequestId,\n DependabotPersistedPrSchema.parse(\n JSON.parse(pr.properties!.find((p) => p.name === PR_PROPERTY_DEPENDABOT_DEPENDENCIES)!.value),\n ),\n ];\n }),\n );\n}\n\nexport function getPullRequestForDependencyNames(\n existingPullRequests: AzdoPrExtractedWithProperties[],\n packageManager: string,\n dependencyNames: string[],\n): AzdoPrExtractedWithProperties | undefined {\n return existingPullRequests.find((pr) => {\n return (\n pr.properties?.find((p) => p.name === PR_PROPERTY_DEPENDABOT_PACKAGE_MANAGER && p.value === packageManager) &&\n pr.properties?.find(\n (p) =>\n p.name === PR_PROPERTY_DEPENDABOT_DEPENDENCIES &&\n areEqual(getDependencyNames(DependabotPersistedPrSchema.parse(JSON.parse(p.value))), dependencyNames),\n )\n );\n });\n}\n\nexport function getPullRequestChangedFiles(data: DependabotCreatePullRequest | DependabotUpdatePullRequest) {\n return data['updated-dependency-files']\n .filter((file) => file.type === 'file')\n .map((file) => {\n let changeType: AzdoVersionControlChangeType = 'none';\n if (file.deleted === true || file.operation === 'delete') {\n changeType = 'delete';\n } else if (file.operation === 'update') {\n changeType = 'edit';\n } else {\n changeType = 'add';\n }\n return {\n changeType: changeType,\n path: path.join(file.directory, file.name),\n content: file.content ?? undefined,\n encoding: file.content_encoding || 'utf-8', // default to 'utf-8' if nullish or empty string\n } satisfies AzdoFileChange;\n });\n}\n","import { normalizeBranchName, normalizeFilePath } from '@/dependabot';\nimport { logger } from '@/logger';\nimport type { AzdoEvent, AzdoEventType } from '../events';\nimport type { AzureDevOpsOrganizationUrl } from '../url-parts';\nimport { AzureDevOpsClient } from './client';\nimport type {\n AzdoFileChange,\n AzdoGitUserDate,\n AzdoIdentityRefWithVote,\n AzdoPrExtractedWithProperties,\n AzdoPullRequestMergeStrategy,\n AzdoSubscriptionsQuery,\n} from './types';\n\ntype AzdoRepositoryOptions = { project: string; repository: string };\n\ntype AzdoPullRequestCreateOptions = AzdoRepositoryOptions & {\n source: { branch: string; commit: string };\n target: { branch: string };\n author: AzdoGitUserDate;\n title: string;\n description: string;\n commitMessage: string;\n autoComplete?: {\n ignorePolicyConfigIds?: number[];\n mergeStrategy?: AzdoPullRequestMergeStrategy;\n };\n assignees?: string[];\n labels?: string[];\n workItems?: string[];\n changes: AzdoFileChange[];\n properties?: { name: string; value: string }[];\n};\n\ntype AzdoPullRequestOptions = AzdoRepositoryOptions & { pullRequestId: number };\n\ntype AzdoPullRequestUpdateOptions = AzdoPullRequestOptions & {\n commit: string;\n author: AzdoGitUserDate;\n changes: AzdoFileChange[];\n};\n\ntype AzdoPullRequestAbandonOptions = AzdoPullRequestOptions & {\n comment?: string;\n deleteSourceBranch?: boolean;\n};\n\ntype AzdoPullRequestCommentCreateOptions = AzdoPullRequestOptions & {\n content: string;\n userId?: string;\n};\n\nexport class AzureDevOpsClientWrapper {\n public readonly inner: AzureDevOpsClient;\n\n private authenticatedUserId?: string;\n private resolvedUserIds: Record<string, string> = {};\n\n /**\n * Create a new Azure DevOps client wrapper.\n * @param url The Azure DevOps organization URL\n * @param accessToken The personal access token for authentication\n * @param debug Enable debug logging for API requests (default: false)\n */\n constructor(url: AzureDevOpsOrganizationUrl, accessToken: string, debug: boolean = false) {\n this.inner = new AzureDevOpsClient(url, accessToken, debug);\n }\n\n /**\n * Get the identity of the authenticated user.\n * The result is cached after the first call to avoid repeated API requests.\n */\n public async getUserId(): Promise<string> {\n if (!this.authenticatedUserId) {\n const connectionData = await this.inner.connection.get();\n this.authenticatedUserId = connectionData?.authenticatedUser?.id;\n if (!this.authenticatedUserId) {\n throw new Error('Failed to get authenticated user ID');\n }\n }\n return this.authenticatedUserId;\n }\n\n /**\n * Get the identity id from a user name, email, or group name.\n * Results are cached to avoid repeated API requests for the same identifier.\n *\n * Requires scope \"Identity (Read)\" (vso.identity).\n * @param identifier Username, email, or group name to resolve\n * @returns The resolved identity ID, or undefined if not found or on error\n */\n public async resolveIdentityId(identifier: string): Promise<string | undefined> {\n if (this.resolvedUserIds[identifier]) {\n return this.resolvedUserIds[identifier];\n }\n try {\n const identities = await this.inner.identity.get(identifier);\n if (!identities || identities.length === 0) {\n return undefined;\n }\n this.resolvedUserIds[identifier] = identities[0]!.id;\n return this.resolvedUserIds[identifier];\n } catch (e) {\n logger.error(`Failed to resolve user id: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return undefined;\n }\n }\n\n /**\n * Get the default branch for a repository.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options (project and repository)\n * @returns The normalized default branch name (e.g., \"main\"), or undefined if not found\n */\n public async getDefaultBranch(options: AzdoRepositoryOptions): Promise<string | undefined> {\n return normalizeBranchName((await this.inner.repositories.get(options.project, options.repository))?.defaultBranch);\n }\n\n /**\n * Get the list of branch names for a repository.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options (project and repository)\n * @returns Array of normalized branch names, or undefined if not found\n */\n public async getBranchNames(options: AzdoRepositoryOptions): Promise<string[] | undefined> {\n return (await this.inner.repositories.getRefs(options.project, options.repository))?.map((r) =>\n normalizeBranchName(r.name),\n );\n }\n\n /**\n * Get the properties for all active pull requests created by the specified user.\n * This retrieves both the pull request IDs and their associated properties.\n *\n * Requires scope \"Code (Read)\" (vso.code).\n * @param options Repository identification options including the creator user ID\n * @returns Array of pull request IDs with their properties, empty array on error\n */\n public async getActivePullRequestProperties({\n project,\n repository,\n creatorId,\n }: AzdoRepositoryOptions & { creatorId: string }): Promise<AzdoPrExtractedWithProperties[]> {\n try {\n const pullRequests = await this.inner.pullRequests.list(project, repository, creatorId, 'active');\n if (!pullRequests || pullRequests.length === 0) {\n return [];\n }\n\n return await Promise.all(\n pullRequests.map(async (pr) => {\n const properties = await this.inner.pullRequests.getProperties(project, repository, pr.pullRequestId);\n return { pullRequestId: pr.pullRequestId, properties };\n }),\n );\n } catch (e) {\n logger.error(`Failed to list active pull request properties: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return [];\n }\n }\n\n /**\n * Create a new pull request with the specified changes.\n * This method performs the following operations:\n * 1. Resolves assignee identities for assignees (if specified)\n * 2. Creates a new branch and pushes changes\n * 3. Creates the pull request with assignees (optional reviewers), labels, and work items\n * 4. Sets pull request properties for dependency metadata\n * 5. Configures auto-complete options (if specified)\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * Requires scope \"Identity (Read)\" (vso.identity), if assignees are specified.\n * @param options Pull request creation options including changes, assignees, and auto-complete settings\n * @returns The created pull request ID, or null on error\n */\n public async createPullRequest(options: AzdoPullRequestCreateOptions): Promise<number | null> {\n logger.info(`Creating pull request '${options.title}'...`);\n try {\n const userId = await this.getUserId();\n\n // Map the list of the pull request reviewer ids\n // NOTE: Azure DevOps does not have a concept of assignees.\n // We treat them as optional reviewers. Branch policies should be used for required reviewers.\n const reviewers: AzdoIdentityRefWithVote[] = [];\n if (options.assignees && options.assignees.length > 0) {\n for (const assignee of options.assignees) {\n const identityId = this.isGuid(assignee) ? assignee : await this.resolveIdentityId(assignee);\n if (identityId && !reviewers.some((r) => r.id === identityId)) {\n reviewers.push({ id: identityId });\n } else {\n logger.warn(`Unable to resolve assignee identity '${assignee}'`);\n }\n }\n }\n\n // Create the source branch and push a commit with the dependency file changes\n logger.info(` - Pushing ${options.changes.length} file change(s) to branch '${options.source.branch}'...`);\n const push = await this.inner.git.createPush(options.project, options.repository, {\n refUpdates: [\n {\n name: `refs/heads/${options.source.branch}`,\n oldObjectId: options.source.commit,\n },\n ],\n commits: [\n {\n comment: options.commitMessage,\n author: options.author,\n changes: options.changes\n .filter((change) => change.changeType !== 'none')\n .map(({ changeType, ...change }) => {\n return {\n changeType,\n item: { path: normalizeFilePath(change.path) },\n newContent:\n changeType !== 'delete'\n ? {\n content: Buffer.from(change.content!, <BufferEncoding>change.encoding).toString('base64'),\n contentType: 'base64encoded',\n }\n : undefined,\n };\n }),\n },\n ],\n });\n if (!push?.commits?.length) {\n throw new Error('Failed to push changes to source branch, no commits were created');\n }\n logger.info(` - Pushed commit: ${push.commits.map((c) => c.commitId).join(', ')}.`);\n\n // Create the pull request\n logger.info(` - Creating pull request to merge '${options.source.branch}' into '${options.target.branch}'...`);\n const pullRequest = await this.inner.pullRequests.create(options.project, options.repository, {\n sourceRefName: `refs/heads/${options.source.branch}`,\n targetRefName: `refs/heads/${options.target.branch}`,\n title: options.title,\n description: options.description,\n reviewers,\n workItemRefs: options.workItems?.map((id) => ({ id: id })),\n labels: options.labels?.map((label) => ({ name: label })),\n });\n if (!pullRequest?.pullRequestId) {\n throw new Error('Failed to create pull request, no pull request id was returned');\n }\n logger.info(` - Created pull request: #${pullRequest.pullRequestId}.`);\n\n // Add the pull request properties\n if (options.properties && options.properties.length > 0) {\n logger.info(` - Adding dependency metadata to pull request properties...`);\n const newProperties = await this.inner.pullRequests.setProperties(\n options.project,\n options.repository,\n pullRequest.pullRequestId,\n options.properties,\n );\n if (!newProperties?.count) {\n throw new Error('Failed to add dependency metadata properties to pull request');\n }\n }\n\n // TODO: Upload the pull request description as a 'changes.md' file attachment?\n // This might be a way to work around the 4000 character limit for PR descriptions, but needs more investigation.\n // https://learn.microsoft.com/en-us/rest/api/azure/devops/git/pull-request-attachments/create?view=azure-devops-rest-7.1\n\n // Set the pull request auto-complete status\n if (options.autoComplete) {\n logger.info(` - Updating auto-complete options...`);\n const updatedPullRequest = await this.inner.pullRequests.update(\n options.project,\n options.repository,\n pullRequest.pullRequestId,\n {\n autoCompleteSetBy: { id: userId },\n completionOptions: {\n autoCompleteIgnoreConfigIds: options.autoComplete.ignorePolicyConfigIds,\n deleteSourceBranch: true,\n mergeCommitMessage: this.mergeCommitMessage(\n pullRequest.pullRequestId,\n options.title,\n options.description,\n ),\n mergeStrategy: options.autoComplete.mergeStrategy,\n transitionWorkItems: false,\n },\n },\n );\n if (!updatedPullRequest || updatedPullRequest.autoCompleteSetBy?.id !== userId) {\n throw new Error('Failed to set auto-complete on pull request');\n }\n }\n\n logger.info(` - Pull request was created successfully.`);\n return pullRequest.pullRequestId;\n } catch (e) {\n logger.error(`Failed to create pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return null;\n }\n }\n\n /**\n * Update an existing pull request with new changes.\n * This method performs the following operations:\n * 1. Validates the pull request hasn't been modified by another author\n * 2. Checks if the source branch is behind the target branch\n * 3. Rebases the target branch into the source branch if needed\n * 4. Pushes the new changes to the source branch\n *\n * Requires scope \"Code (Read & Write)\" (vso.code, vso.code_write).\n * @param options Pull request update options including the commit and changes\n * @returns True if successful, false on error\n */\n public async updatePullRequest(options: AzdoPullRequestUpdateOptions): Promise<boolean> {\n logger.info(`Updating pull request #${options.pullRequestId}...`);\n try {\n // Get the pull request details\n const pullRequest = await this.inner.pullRequests.get(options.project, options.repository, options.pullRequestId);\n if (!pullRequest) {\n throw new Error(`Pull request #${options.pullRequestId} not found`);\n }\n\n // Skip if the pull request has been modified by another author\n const commits = await this.inner.pullRequests.getCommits(\n options.project,\n options.repository,\n options.pullRequestId,\n );\n if (commits?.some((c) => c.author?.email !== options.author.email)) {\n logger.info(` - Skipping update as pull request has been modified by another user.`);\n return true;\n }\n\n // Get the branch stats to check if the source branch is behind the target branch\n const stats = await this.inner.repositories.getBranchStats(\n options.project,\n options.repository,\n normalizeBranchName(pullRequest.sourceRefName),\n );\n if (stats?.behindCount === undefined) {\n throw new Error(`Failed to get branch stats for '${pullRequest.sourceRefName}'`);\n }\n\n // Skip if the source branch is not behind the target branch\n if (stats.behindCount === 0) {\n logger.info(` - Skipping update as source branch is not behind target branch.`);\n return true;\n }\n\n // Rebase the target branch into the source branch to reset the \"behind\" count\n const sourceBranchName = normalizeBranchName(pullRequest.sourceRefName);\n const targetBranchName = normalizeBranchName(pullRequest.targetRefName);\n if (stats.behindCount > 0) {\n logger.info(\n ` - Rebasing '${targetBranchName}' into '${sourceBranchName}' (${stats.behindCount} commit(s) behind)...`,\n );\n const rebase = await this.inner.git.updateRef(options.project, options.repository, [\n {\n name: pullRequest.sourceRefName,\n oldObjectId: pullRequest.lastMergeSourceCommit.commitId,\n newObjectId: options.commit,\n },\n ]);\n if (rebase?.[0]?.success !== true) {\n throw new Error('Failed to rebase the target branch into the source branch');\n }\n }\n\n // Push all file changes to the source branch\n logger.info(` - Pushing ${options.changes.length} file change(s) to branch '${pullRequest.sourceRefName}'...`);\n const push = await this.inner.git.createPush(options.project, options.repository, {\n refUpdates: [\n {\n name: pullRequest.sourceRefName,\n oldObjectId: options.commit,\n },\n ],\n commits: [\n {\n comment:\n pullRequest.mergeStatus === 'conflicts'\n ? 'Resolve merge conflicts'\n : `Rebase '${sourceBranchName}' onto '${targetBranchName}'`,\n author: options.author,\n changes: options.changes\n .filter((change) => change.changeType !== 'none')\n .map(({ changeType, ...change }) => {\n return {\n changeType,\n item: { path: normalizeFilePath(change.path) },\n newContent:\n changeType !== 'delete'\n ? {\n content: Buffer.from(change.content!, <BufferEncoding>change.encoding).toString('base64'),\n contentType: 'base64encoded',\n }\n : undefined,\n };\n }),\n },\n ],\n });\n if (!push?.commits?.length) {\n throw new Error('Failed to push changes to source branch, no commits were created');\n }\n logger.info(` - Pushed commit: ${push.commits.map((c) => c.commitId).join(', ')}.`);\n\n logger.info(` - Pull request was updated successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to update pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Approve a pull request as the authenticated user.\n * Sets the reviewer vote to 10 (approved).\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Pull request identification options\n * @returns True if successful, false on error\n */\n public async approvePullRequest(options: AzdoPullRequestOptions): Promise<boolean> {\n logger.info(`Approving pull request #${options.pullRequestId}...`);\n try {\n // Approve the pull request\n logger.info(` - Updating reviewer vote on pull request...`);\n const userId = await this.getUserId();\n const userVote = await this.inner.pullRequests.approve(\n options.project,\n options.repository,\n options.pullRequestId,\n userId,\n );\n if (userVote?.vote !== 10) {\n throw new Error('Failed to approve pull request, vote was not recorded');\n }\n\n logger.info(` - Pull request was approved successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to approve pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Abandon a pull request and optionally delete its source branch.\n * This method performs the following operations:\n * 1. Adds an optional comment explaining the abandonment reason\n * 2. Sets the pull request status to abandoned\n * 3. Deletes the source branch if requested\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Pull request abandonment options including optional comment and branch deletion flag\n * @returns True if successful, false on error\n */\n public async abandonPullRequest(options: AzdoPullRequestAbandonOptions): Promise<boolean> {\n logger.info(`Abandoning pull request #${options.pullRequestId}...`);\n try {\n const userId = await this.getUserId();\n\n // Add a comment to the pull request, if supplied\n if (options.comment) {\n logger.info(` - Adding abandonment reason comment to pull request...`);\n const threadId = await this.addCommentThread({\n ...options,\n content: options.comment,\n userId,\n });\n if (!threadId) {\n throw new Error('Failed to add comment to pull request, thread was not created');\n }\n }\n\n // Abandon the pull request\n logger.info(` - Abandoning pull request...`);\n const abandonedPullRequest = await this.inner.pullRequests.abandon(\n options.project,\n options.repository,\n options.pullRequestId,\n userId,\n );\n if (abandonedPullRequest?.status !== 'abandoned') {\n throw new Error('Failed to abandon pull request, status was not updated');\n }\n\n // Delete the source branch if required\n if (options.deleteSourceBranch) {\n logger.info(` - Deleting source branch...`);\n const deletedBranch = await this.inner.git.updateRef(options.project, options.repository, [\n {\n name: abandonedPullRequest.sourceRefName,\n oldObjectId: abandonedPullRequest.lastMergeSourceCommit.commitId,\n newObjectId: '0000000000000000000000000000000000000000',\n isLocked: false,\n },\n ]);\n if (deletedBranch?.[0]?.success !== true) {\n throw new Error('Failed to delete the source branch');\n }\n }\n\n logger.info(` - Pull request was abandoned successfully.`);\n return true;\n } catch (e) {\n logger.error(`Failed to abandon pull request: ${e}`);\n logger.debug(e); // Dump the error stack trace to help with debugging\n return false;\n }\n }\n\n /**\n * Add a comment thread on a pull request.\n * The comment thread is created with a closed status and system comment type.\n *\n * Requires scope \"Code (Write)\" (vso.code_write).\n * @param options Comment creation options including content and optional user ID\n * @returns The created thread ID, or undefined on error\n */\n public async addCommentThread(options: AzdoPullRequestCommentCreateOptions): Promise<number | undefined> {\n const userId = options.userId ?? (await this.getUserId());\n const thread = await this.inner.pullRequests.createCommentThread(\n options.project,\n options.repository,\n options.pullRequestId,\n {\n status: 'closed',\n comments: [\n {\n author: { id: userId },\n content: options.content,\n commentType: 'system',\n },\n ],\n },\n );\n return thread?.id;\n }\n\n /**\n * Create or update webhook subscriptions for Azure DevOps events.\n * This sets up subscriptions for various git events (push, pull request updates, repository changes, etc.)\n * and ensures they are configured to send webhooks to the specified URL.\n * Existing subscriptions matching the URL will be updated, otherwise new subscriptions are created.\n *\n * Requires scope \"Service Hooks (Read & Write)\" (vso.hooks_write).\n * @returns Array of subscription IDs that were created or updated\n */\n public async createOrUpdateHookSubscriptions({\n url,\n headers,\n project,\n }: {\n url: string;\n headers: Record<string, string>;\n project: string;\n }) {\n // events are registered per project because, the git.repo.* events do not support global subscriptions\n const subscriptionTypes = new Map<AzdoEventType, AzdoEvent['resourceVersion']>([\n ['git.push', '1.0'],\n ['git.pullrequest.updated', '1.0'],\n ['git.pullrequest.merged', '1.0'],\n ['git.repo.created', '1.0-preview.1'],\n ['git.repo.deleted', '1.0-preview.1'],\n ['git.repo.renamed', '1.0-preview.1'],\n ['git.repo.statuschanged', '1.0-preview.1'],\n ['ms.vss-code.git-pullrequest-comment-event', '2.0'],\n ]);\n\n const query = this.buildSubscriptionsQuery({ url, project });\n const subscriptions = await this.inner.subscriptions.query(query);\n\n // iterate each subscription checking if creation or update is required\n const ids: string[] = [];\n for (const [eventType, resourceVersion] of subscriptionTypes) {\n // find existing one\n const existing = subscriptions.find((sub) => {\n return sub.eventType === eventType && sub.resourceVersion === resourceVersion;\n });\n\n let subscription: typeof existing;\n\n // if we have an existing one, update it, otherwise create a new one\n if (existing) {\n // publisherId, consumerId, and consumerActionId cannot be updated\n existing.status = 'enabled';\n existing.eventType = eventType;\n existing.resourceVersion = resourceVersion;\n existing.publisherInputs = this.makeTfsPublisherInputs({ eventType, project });\n existing.consumerInputs = this.makeWebhookConsumerInputs({ url, headers });\n subscription = await this.inner.subscriptions.replace(existing.id, existing);\n } else {\n subscription = await this.inner.subscriptions.create({\n status: 'enabled',\n eventType,\n resourceVersion,\n\n publisherId: 'tfs',\n publisherInputs: this.makeTfsPublisherInputs({ eventType, project }),\n consumerId: 'webHooks',\n consumerActionId: 'httpRequest',\n consumerInputs: this.makeWebhookConsumerInputs({ url, headers }),\n });\n }\n\n ids.push(subscription.id);\n }\n\n // delete any other existing subscriptions that are not in our desired list\n for (const sub of subscriptions) {\n if (!ids.includes(sub.id)) {\n await this.inner.subscriptions.delete(sub.id);\n }\n }\n }\n\n /**\n * Remove all webhook subscriptions for a specific URL.\n * This finds all subscriptions matching the provided URL and deletes them.\n *\n * Requires scope \"Service Hooks (Read & Write)\" (vso.hooks_write).\n */\n public async deleteHookSubscriptions({ url, project }: { url: string; project: string }) {\n const query = this.buildSubscriptionsQuery({ url, project });\n const subscriptions = await this.inner.subscriptions.query(query);\n\n // iterate each subscription and delete it\n for (const sub of subscriptions) {\n await this.inner.subscriptions.delete(sub.id);\n }\n }\n\n private mergeCommitMessage(id: number, title: string, description: string): string {\n //\n // The merge commit message should contain the PR number and title for tracking.\n // This is the default behaviour in Azure DevOps.\n // Example:\n // Merged PR 24093: Bump Tingle.Extensions.Logging.LogAnalytics from 3.4.2-ci0005 to 3.4.2-ci0006\n //\n // Bumps [Tingle.Extensions.Logging.LogAnalytics](...) from 3.4.2-ci0005 to 3.4.2-ci0006\n // - [Release notes](....)\n // - [Changelog](....)\n // - [Commits](....)\n //\n // There appears to be a DevOps bug when setting \"completeOptions\" with a \"mergeCommitMessage\" even when truncated to 4000 characters.\n // The error message is:\n // Invalid argument value.\n // Parameter name: Completion options have exceeded the maximum encoded length (4184/4000)\n //\n // The effective limit seems to be about 3500 characters:\n // https://developercommunity.visualstudio.com/t/raise-the-character-limit-for-pull-request-descrip/365708#T-N424531\n //\n return `Merged PR ${id}: ${title}\\n\\n${description}`.slice(0, 3500);\n }\n\n private isGuid(guid: string): boolean {\n const regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n return regex.test(guid);\n }\n\n private buildSubscriptionsQuery({ url, project }: { url: string; project: string }): AzdoSubscriptionsQuery {\n return {\n publisherId: 'tfs',\n publisherInputFilters: [\n {\n conditions: [{ operator: 'equals', inputId: 'projectId', caseSensitive: false, inputValue: project }],\n },\n ],\n consumerId: 'webHooks',\n consumerActionId: 'httpRequest',\n consumerInputFilters: [\n {\n conditions: [{ operator: 'equals', inputId: 'url', caseSensitive: false, inputValue: url }],\n },\n ],\n };\n }\n\n private makeTfsPublisherInputs({\n eventType,\n project,\n }: {\n eventType: AzdoEventType;\n project: string;\n }): Record<string, string> {\n // possible inputs are available via an authenticated request to\n // https://dev.azure.com/{organization}/_apis/hooks/publishers/tfs\n\n return {\n projectId: project, // project to restrict events to\n\n ...(eventType === 'git.pullrequest.updated' && {\n // only trigger on updates to the pull request status (e.g. active, abandoned, completed)\n notificationType: 'StatusUpdateNotification',\n }),\n ...(eventType === 'git.pullrequest.merged' && {\n // only trigger on conflicts\n mergeResult: 'Conflicts',\n }),\n };\n }\n\n private makeWebhookConsumerInputs({\n url,\n headers,\n }: {\n url: string;\n headers: Record<string, string>;\n }): Record<string, string> {\n return {\n // possible inputs are available via an authenticated request to\n // https://dev.azure.com/{organization}/_apis/hooks/consumers/webHooks\n\n url,\n acceptUntrustedCerts: 'false',\n httpHeaders: Object.entries(headers)\n .map(([key, value]) => `${key}:${value}`)\n .join('\\n'),\n messagesToSend: 'none',\n detailedMessagesToSend: 'none',\n };\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport ky from 'ky';\n\nimport {\n CONFIG_FILE_PATHS_AZURE,\n type DependabotConfig,\n parseDependabotConfig,\n type VariableFinderFn,\n} from '@/dependabot';\nimport { logger } from '@/logger';\nimport type { AzureDevOpsRepositoryUrl } from './url-parts';\n\n/**\n * Parse the dependabot config YAML file to specify update configuration.\n * The file should be located at any of `CONFIG_FILE_PATHS_AZURE`.\n *\n * To view YAML file format, visit\n * https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#allow\n *\n * @returns {DependabotConfig} config - the dependabot configuration\n */\nexport async function getDependabotConfig({\n url,\n token,\n remote,\n rootDir = process.cwd(),\n variableFinder,\n}: {\n url: AzureDevOpsRepositoryUrl;\n token: string;\n /**\n * Whether to fetch the configuration file via the REST API (true) or look for it locally (false).\n */\n remote: boolean;\n rootDir?: string;\n variableFinder: VariableFinderFn;\n}): Promise<DependabotConfig> {\n let configPath: undefined | string;\n let configContents: undefined | string;\n\n /*\n * The configuration file can be available locally if the repository is cloned.\n * Otherwise, we should get it via the API which supports 2 scenarios:\n * 1. Running the pipeline without cloning, which is useful for huge repositories (multiple submodules or large commit log)\n * 2. Running a single pipeline to update multiple repositories https://github.com/mburumaxwell/dependabot-azure-devops/issues/328\n */\n\n if (remote) {\n logger.debug(`Attempting to fetch configuration file via REST API ...`);\n for (const fp of CONFIG_FILE_PATHS_AZURE) {\n // make HTTP request\n const requestUrl = `${url.value}${url.project}/_apis/git/repositories/${url.repository}/items?path=/${fp}`;\n logger.debug(`GET ${requestUrl}`);\n\n try {\n const authHeader = `Basic ${Buffer.from(`x-access-token:${token}`).toString('base64')}`;\n const response = await ky.get(requestUrl, {\n headers: {\n Authorization: authHeader,\n Accept: '*/*', // Gotcha!!! without this SH*T fails terribly\n },\n // 401, 403 and 404 are handled explicitly\n throwHttpErrors: (status) => ![401, 403, 404].includes(status),\n });\n if (response.ok) {\n logger.debug(`Found configuration file at '${requestUrl}'`);\n configContents = await response.text();\n configPath = fp;\n break;\n } else if (response.status === 404) {\n logger.trace(`No configuration file at '${requestUrl}'`);\n // biome-ignore lint/complexity/noUselessContinue: continue is useful here for clarity\n continue;\n } else if (response.status === 401) {\n throw new Error(`No or invalid access token has been provided to access '${requestUrl}'`);\n } else if (response.status === 403) {\n throw new Error(`The access token provided does not have permissions to access '${requestUrl}'`);\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('access token')) {\n throw error;\n } else {\n throw error;\n }\n }\n }\n } else {\n for (const fp of CONFIG_FILE_PATHS_AZURE) {\n const filePath = path.join(rootDir, fp);\n if (existsSync(filePath)) {\n logger.debug(`Found configuration file cloned at ${filePath}`);\n configContents = await readFile(filePath, 'utf-8');\n configPath = filePath;\n break;\n } else {\n logger.trace(`No configuration file cloned at ${filePath}`);\n }\n }\n }\n\n // Ensure we have file contents. Otherwise throw a well readable error.\n if (!configContents || !configPath || typeof configContents !== 'string') {\n throw new Error(`Configuration file not found at possible locations: ${CONFIG_FILE_PATHS_AZURE.join(', ')}`);\n } else {\n logger.trace('Configuration file contents read.');\n }\n\n return await parseDependabotConfig({ configContents, configPath, variableFinder });\n}\n","import { z } from 'zod';\nimport {\n AzdoGitCommitRefSchema,\n AzdoIdentityRefSchema,\n AzdoPullRequestAsyncStatusSchema,\n AzdoPullRequestCommentSchema,\n AzdoPullRequestStatusSchema,\n} from './client/types';\n\nexport const AzdoEventTypeSchema = z.enum([\n // Code is pushed to a Git repository.\n 'git.push',\n // Pull request is updated – status, review list, reviewer vote\n // changed or the source branch is updated with a push.\n 'git.pullrequest.updated',\n // Pull request - Branch merge attempted.\n 'git.pullrequest.merged',\n // A repository is created.\n 'git.repo.created',\n // A repository is deleted.\n 'git.repo.deleted',\n // A repository is renamed.\n 'git.repo.renamed',\n // A repository's status is changed.\n 'git.repo.statuschanged',\n // Comments are added to a pull request.\n 'ms.vss-code.git-pullrequest-comment-event',\n]);\nexport type AzdoEventType = z.infer<typeof AzdoEventTypeSchema>;\n\nconst AzdoEventProjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n url: z.string(),\n});\n\nexport const AzdoEventRepositorySchema = z.object({\n id: z.string(),\n name: z.string(),\n project: AzdoEventProjectSchema,\n defaultBranch: z.string().optional(),\n remoteUrl: z.string(),\n});\n\nexport const AzdoEventCodePushResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n commits: AzdoGitCommitRefSchema.array(),\n refUpdates: z\n .object({\n name: z.string(),\n oldObjectId: z.string().nullish(),\n newObjectId: z.string().nullish(),\n })\n .array(),\n pushId: z.number(),\n url: z.string(), // e.g. \"https://dev.azure.com/fabrikam/_apis/git/repositories/2856c8c5-6f6b-4e6d-8a9f-4cf0d33f2f2a/pushes/22\"\n});\nexport type AzdoEventCodePushResource = z.infer<typeof AzdoEventCodePushResourceSchema>;\n\nexport const AzdoEventPullRequestResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n pullRequestId: z.number(),\n status: AzdoPullRequestStatusSchema,\n createdBy: AzdoIdentityRefSchema,\n title: z.string(),\n sourceRefName: z.string(),\n targetRefName: z.string(),\n mergeStatus: AzdoPullRequestAsyncStatusSchema,\n mergeId: z.string(),\n url: z.string(),\n});\nexport type AzdoEventPullRequestResource = z.infer<typeof AzdoEventPullRequestResourceSchema>;\n\nexport const AzdoEventRepositoryCreatedResourceSchema = z.object({\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryCreatedResource = z.infer<typeof AzdoEventRepositoryCreatedResourceSchema>;\n\nexport const AzdoEventRepositoryDeletedResourceSchema = z.object({\n project: AzdoEventProjectSchema,\n repositoryId: z.string(),\n repositoryName: z.string(),\n isHardDelete: z.boolean(),\n});\nexport type AzdoEventRepositoryDeletedResource = z.infer<typeof AzdoEventRepositoryDeletedResourceSchema>;\n\nexport const AzdoEventRepositoryRenamedResourceSchema = z.object({\n oldName: z.string(),\n newName: z.string(),\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryRenamedResource = z.infer<typeof AzdoEventRepositoryRenamedResourceSchema>;\n\nexport const AzdoEventRepositoryStatusChangedResourceSchema = z.object({\n disabled: z.boolean(),\n repository: AzdoEventRepositorySchema,\n});\nexport type AzdoEventRepositoryStatusChangedResource = z.infer<typeof AzdoEventRepositoryStatusChangedResourceSchema>;\n\nexport const AzdoEventPullRequestCommentEventResourceSchema = z.object({\n pullRequest: AzdoEventPullRequestResourceSchema,\n comment: AzdoPullRequestCommentSchema,\n});\nexport type AzdoEventPullRequestCommentEventResource = z.infer<typeof AzdoEventPullRequestCommentEventResourceSchema>;\n\nexport const AzdoEventSchema = z\n .object({\n subscriptionId: z.string(),\n notificationId: z.number(),\n id: z.string(),\n publisherId: z.string(),\n resourceVersion: z.enum(['1.0', '1.0-preview.1', '2.0']),\n createdDate: z.coerce.date(),\n })\n .and(\n z.discriminatedUnion('eventType', [\n z.object({ eventType: z.literal('git.push'), resource: AzdoEventCodePushResourceSchema }),\n z.object({ eventType: z.literal('git.pullrequest.updated'), resource: AzdoEventPullRequestResourceSchema }),\n z.object({ eventType: z.literal('git.pullrequest.merged'), resource: AzdoEventPullRequestResourceSchema }),\n z.object({ eventType: z.literal('git.repo.created'), resource: AzdoEventRepositoryCreatedResourceSchema }),\n z.object({ eventType: z.literal('git.repo.deleted'), resource: AzdoEventRepositoryDeletedResourceSchema }),\n z.object({ eventType: z.literal('git.repo.renamed'), resource: AzdoEventRepositoryRenamedResourceSchema }),\n z.object({\n eventType: z.literal('git.repo.statuschanged'),\n resource: AzdoEventRepositoryStatusChangedResourceSchema,\n }),\n z.object({\n eventType: z.literal('ms.vss-code.git-pullrequest-comment-event'),\n resource: AzdoEventPullRequestCommentEventResourceSchema,\n }),\n ]),\n );\nexport type AzdoEvent = z.infer<typeof AzdoEventSchema>;\n","export type AzureDevOpsOrganizationUrl = {\n /** URL of the organisation. This may lack the project name */\n value: URL;\n\n /** Organisation URL hostname */\n hostname: string;\n\n /** Organisation API endpoint URL */\n 'api-endpoint': string;\n\n /** Organisation name/slug */\n organisation: string;\n\n /** Virtual directory if present (on-premises only) */\n 'virtual-directory'?: string;\n\n /**\n * Organization Identity API URL (different from the API endpoint).\n * Used for querying user identities.\n */\n 'identity-api-url': URL;\n};\n\nexport type AzureDevOpsProjectUrl = AzureDevOpsOrganizationUrl & {\n /**\n * Project ID or Name.\n * This value is not URL-encoded, clients must encode it when constructing URLs.\n */\n project: string;\n};\n\nexport type AzureDevOpsRepositoryUrl = AzureDevOpsProjectUrl & {\n /**\n * Repository ID or Name.\n * This value is not URL-encoded, clients must encode it when constructing URLs.\n */\n repository: string;\n\n /** Slug of the repository e.g. `contoso/prj1/_git/repo1`, `tfs/contoso/prj1/_git/repo1` */\n 'repository-slug': string;\n};\n\nexport function extractOrganizationUrl({ organisationUrl }: { organisationUrl: string }): AzureDevOpsOrganizationUrl {\n // convert url string into a valid JS URL object\n const value = new URL(organisationUrl);\n const protocol = value.protocol.slice(0, -1);\n let { hostname } = value;\n const visualStudioUrlRegex = /^(?<prefix>\\S+)\\.visualstudio\\.com$/iu;\n if (visualStudioUrlRegex.test(hostname)) hostname = 'dev.azure.com';\n\n const organisation: string = extractOrganisation(organisationUrl);\n\n const virtualDirectory = extractVirtualDirectory(value);\n const apiEndpoint = `${protocol}://${hostname}${value.port ? `:${value.port}` : ''}/${virtualDirectory ? `${virtualDirectory}/` : ''}`;\n\n // determine identity api url\n // if hosted on Azure DevOps, use the 'vssps.dev.azure.com' domain\n const identityApiUrl =\n hostname === 'dev.azure.com' || hostname.endsWith('.visualstudio.com')\n ? // https://learn.microsoft.com/en-us/rest/api/azure/devops/ims/identities/read-identities\n new URL(`https://vssps.dev.azure.com/${organisation}/`)\n : value;\n\n return {\n value,\n hostname,\n 'api-endpoint': apiEndpoint,\n organisation,\n 'virtual-directory': virtualDirectory,\n 'identity-api-url': identityApiUrl,\n };\n}\n\nexport function extractProjectUrl({\n organisationUrl,\n project,\n}: {\n organisationUrl: string;\n project: string;\n}): AzureDevOpsProjectUrl {\n const extracted = extractOrganizationUrl({ organisationUrl });\n // Decode to handle already-encoded inputs, store raw for client methods to encode\n const decodedProject = decodeURIComponent(project);\n\n return {\n ...extracted,\n project: decodedProject,\n };\n}\n\nexport function extractRepositoryUrl({\n organisationUrl,\n project,\n repository,\n}: {\n organisationUrl: string;\n project: string;\n repository: string;\n}): AzureDevOpsRepositoryUrl {\n const extracted = extractProjectUrl({ organisationUrl, project });\n const { organisation, 'virtual-directory': virtualDirectory, project: decodedProject } = extracted;\n\n // Decode to handle already-encoded inputs, store raw for client methods to encode\n const decodedRepository = decodeURIComponent(repository);\n // For the slug, encode since it's used in display/logging contexts\n const repoSlug = `${virtualDirectory ? `${virtualDirectory}/` : ''}${organisation}/${encodeURI(decodedProject)}/_git/${encodeURI(decodedRepository)}`;\n\n return {\n ...extracted,\n repository: decodedRepository,\n 'repository-slug': repoSlug,\n };\n}\n\n/**\n * Extract organisation name from organisation URL\n *\n * @param organisationUrl\n *\n * @returns organisation name\n */\nfunction extractOrganisation(organisationUrl: string): string {\n const url = new URL(organisationUrl);\n const { hostname, pathname } = url;\n\n // Check for old style: https://x.visualstudio.com/\n if (hostname.endsWith('.visualstudio.com')) {\n return hostname.split('.')[0]!;\n }\n\n // For new style and on-premise, parse the pathname\n // pathname examples: '/contoso/', '/contoso', '/tfs/contoso/', '/tfs/contoso', '/contoso/Core'\n const pathSegments = pathname.split('/').filter((segment) => segment !== '');\n\n // Check for on-premise style: https://server.domain.com/tfs/contoso/\n if (pathSegments.length >= 2 && hostname !== 'dev.azure.com') {\n return pathSegments[1]!; // Return 'contoso' from '/tfs/contoso/'\n }\n\n // Check for new style: https://dev.azure.com/contoso/ or https://dev.azure.com/contoso or https://dev.azure.com/contoso/Core\n if (pathSegments.length >= 1) {\n return pathSegments[0]!; // Always return the first path segment for dev.azure.com\n }\n\n throw new Error(`Error parsing organisation from organisation url: '${organisationUrl}'.`);\n}\n\n/**\n * Extract virtual directory from organisation URL\n *\n * Virtual Directories are sometimes used in on-premises\n * @param organisationUrl\n *\n * @returns virtual directory\n *\n * @example URLs typically are like this:`https://server.domain.com/tfs/x/` and `tfs` is the virtual directory\n */\nfunction extractVirtualDirectory(organisationUrl: URL) {\n // extract the pathname from the url then split\n // pathname takes the shape '/tfs/x/'\n const path = organisationUrl.pathname.split('/');\n\n // Virtual Directories are sometimes used in on-premises\n // URLs typically are like this: https://server.domain.com/tfs/x/\n // The pathname extracted looks like this: '/tfs/x/'\n return path.length === 4 ? path[1]! : undefined;\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { $ as DependabotJobBuilder, $t as DependabotRequirementSchema, A as DependabotRecordCooldownMeta, An as DependabotRegistrySchema, At as DependabotDependency, B as DependabotRecordUpdateJobWarning, Bn as parseRegistries, Bt as DependabotGroupRuleJob, C as DependabotIncrementMetricSchema, Cn as DependabotGroupSchema, Ct as DependabotCommandSchema, D as DependabotMarkAsProcessedSchema, Dn as DependabotMultiEcosystemGroupSchema, Dt as DependabotConditionSchema, E as DependabotMarkAsProcessed, En as DependabotMultiEcosystemGroup, Et as DependabotCondition, F as DependabotRecordEcosystemVersionsSchema, Fn as PackageEcosystem, Ft as DependabotExistingPRSchema, G as DependabotUpdatePullRequestSchema, Gn as extractPlaceholder, Gt as DependabotJobFileSchema, H as DependabotUpdateDependencyList, Hn as validateConfiguration, Ht as DependabotJobConfig, I as DependabotRecordUpdateJobError, In as PackageEcosystemSchema, It as DependabotExperiments, J as DependabotRequestSchema, Jn as GitAuthor, Jt as DependabotPersistedPr, K as CreateApiServerAppOptions, Kn as DEPENDABOT_DEFAULT_AUTHOR_EMAIL, Kt as DependabotPackageManager, L as DependabotRecordUpdateJobErrorSchema, Ln as VersioningStrategy, Lt as DependabotExperimentsSchema, M as DependabotRecordEcosystemMeta, Mn as DependabotScheduleSchema, Mt as DependabotExistingGroupPR, N as DependabotRecordEcosystemMetaSchema, Nn as DependabotUpdate, Nt as DependabotExistingGroupPRSchema, O as DependabotMetric, On as DependabotPullRequestBranchName, Ot as DependabotCredential, P as DependabotRecordEcosystemVersions, Pn as DependabotUpdateSchema, Pt as DependabotExistingPR, Q as createApiServerApp, Qt as DependabotRequirement, R as DependabotRecordUpdateJobUnknownError, Rn as VersioningStrategySchema, Rt as DependabotGroupJob, S as DependabotIncrementMetric, Sn as DependabotGroup, St as DependabotCommand, T as DependabotJobErrorSchema, Tn as DependabotIgnoreConditionSchema, Tt as DependabotCommitOptionsSchema, U as DependabotUpdateDependencyListSchema, Un as VariableFinderFn, Ut as DependabotJobConfigSchema, V as DependabotRecordUpdateJobWarningSchema, Vn as parseUpdates, Vt as DependabotGroupRuleJobSchema, W as DependabotUpdatePullRequest, Wn as convertPlaceholder, Wt as DependabotJobFile, X as DependabotRequestTypeSchema, Xt as DependabotProxyConfig, Y as DependabotRequestType, Yt as DependabotPersistedPrSchema, Z as DependabotTokenType, Zt as DependabotProxyConfigSchema, _ as DependabotDependencySubmissionSchema, _n as DependabotCommitMessageSchema, _t as CertificateAuthority, a as getPullRequestDescription, an as DependabotSourceProvider, at as mapGroupsFromDependabotConfigToJobConfig, b as DependabotEcosystemVersionManager, bn as DependabotCooldown, bt as DependabotAllowed, c as DependabotClosePullRequest, cn as FetchedFiles, ct as mapSecurityAdvisories, d as DependabotClosePullRequestSchema, dn as CONFIG_FILE_NAMES, dt as DEFAULT_EXPERIMENTS, en as DependabotRequirementSource, et as DependabotJobBuilderOutput, f as DependabotCreatePullRequest, fn as CONFIG_FILE_PATHS_AZURE, ft as parseExperiments, g as DependabotDependencySubmission, gn as DependabotCommitMessage, gt as sanitizeRef, h as DependabotDependencyFileSchema, hn as DependabotAllowConditionSchema, ht as getBranchNameForUpdate, i as getPullRequestDependencies, in as DependabotSource, it as mapExperiments, j as DependabotRecordCooldownMetaSchema, jn as DependabotSchedule, jt as DependabotDependencySchema, k as DependabotMetricSchema, kn as DependabotRegistry, kt as DependabotCredentialSchema, l as DependabotClosePullRequestReason, ln as FileFetcherInput, lt as mapSourceFromDependabotConfigToJobConfig, m as DependabotDependencyFile, mn as DependabotAllowCondition, mt as makeDirectoryKey, n as getDependencyNames, nn as DependabotSecurityAdvisory, nt as mapAllowedUpdatesFromDependabotConfigToJobConfig, o as normalizeBranchName, on as DependabotSourceProviderSchema, ot as mapIgnoreConditionsFromDependabotConfigToJobConfig, p as DependabotCreatePullRequestSchema, pn as CONFIG_FILE_PATHS_GITHUB, pt as setExperiment, q as DependabotRequest, qn as DEPENDABOT_DEFAULT_AUTHOR_NAME, qt as DependabotPackageManagerSchema, r as getPullRequestCloseReason, rn as DependabotSecurityAdvisorySchema, rt as mapCredentials, s as normalizeFilePath, sn as DependabotSourceSchema, st as mapPackageEcosystemToPackageManager, t as areEqual, tn as DependabotRequirementSourceSchema, tt as DependabotSourceInfo, u as DependabotClosePullRequestReasonEnum, un as FileUpdaterInput, ut as mapVersionStrategyToRequirementsUpdateStrategy, v as DependabotEcosystemMeta, vn as DependabotConfig, vt as CertificateAuthoritySchema, w as DependabotJobError, wn as DependabotIgnoreCondition, wt as DependabotCommitOptions, x as DependabotEcosystemVersionManagerSchema, xn as DependabotCooldownSchema, xt as DependabotAllowedSchema, y as DependabotEcosystemMetaSchema, yn as DependabotConfigSchema, yt as DEPENDABOT_COMMANDS, z as DependabotRecordUpdateJobUnknownErrorSchema, zn as parseDependabotConfig, zt as DependabotGroupJobSchema } from "../index-CFWMNvXg.mjs";
1
+ import { $ as DependabotJobBuilder, $t as DependabotRequirementSchema, A as DependabotRecordCooldownMeta, An as DependabotRegistrySchema, At as DependabotDependency, B as DependabotRecordUpdateJobWarning, Bn as parseRegistries, Bt as DependabotGroupRuleJob, C as DependabotIncrementMetricSchema, Cn as DependabotGroupSchema, Ct as DependabotCommandSchema, D as DependabotMarkAsProcessedSchema, Dn as DependabotMultiEcosystemGroupSchema, Dt as DependabotConditionSchema, E as DependabotMarkAsProcessed, En as DependabotMultiEcosystemGroup, Et as DependabotCondition, F as DependabotRecordEcosystemVersionsSchema, Fn as PackageEcosystem, Ft as DependabotExistingPRSchema, G as DependabotUpdatePullRequestSchema, Gn as extractPlaceholder, Gt as DependabotJobFileSchema, H as DependabotUpdateDependencyList, Hn as validateConfiguration, Ht as DependabotJobConfig, I as DependabotRecordUpdateJobError, In as PackageEcosystemSchema, It as DependabotExperiments, J as DependabotRequestSchema, Jn as GitAuthor, Jt as DependabotPersistedPr, K as CreateApiServerAppOptions, Kn as DEPENDABOT_DEFAULT_AUTHOR_EMAIL, Kt as DependabotPackageManager, L as DependabotRecordUpdateJobErrorSchema, Ln as VersioningStrategy, Lt as DependabotExperimentsSchema, M as DependabotRecordEcosystemMeta, Mn as DependabotScheduleSchema, Mt as DependabotExistingGroupPR, N as DependabotRecordEcosystemMetaSchema, Nn as DependabotUpdate, Nt as DependabotExistingGroupPRSchema, O as DependabotMetric, On as DependabotPullRequestBranchName, Ot as DependabotCredential, P as DependabotRecordEcosystemVersions, Pn as DependabotUpdateSchema, Pt as DependabotExistingPR, Q as createApiServerApp, Qt as DependabotRequirement, R as DependabotRecordUpdateJobUnknownError, Rn as VersioningStrategySchema, Rt as DependabotGroupJob, S as DependabotIncrementMetric, Sn as DependabotGroup, St as DependabotCommand, T as DependabotJobErrorSchema, Tn as DependabotIgnoreConditionSchema, Tt as DependabotCommitOptionsSchema, U as DependabotUpdateDependencyListSchema, Un as VariableFinderFn, Ut as DependabotJobConfigSchema, V as DependabotRecordUpdateJobWarningSchema, Vn as parseUpdates, Vt as DependabotGroupRuleJobSchema, W as DependabotUpdatePullRequest, Wn as convertPlaceholder, Wt as DependabotJobFile, X as DependabotRequestTypeSchema, Xt as DependabotProxyConfig, Y as DependabotRequestType, Yt as DependabotPersistedPrSchema, Z as DependabotTokenType, Zt as DependabotProxyConfigSchema, _ as DependabotDependencySubmissionSchema, _n as DependabotCommitMessageSchema, _t as CertificateAuthority, a as getPullRequestDescription, an as DependabotSourceProvider, at as mapGroupsFromDependabotConfigToJobConfig, b as DependabotEcosystemVersionManager, bn as DependabotCooldown, bt as DependabotAllowed, c as DependabotClosePullRequest, cn as FetchedFiles, ct as mapSecurityAdvisories, d as DependabotClosePullRequestSchema, dn as CONFIG_FILE_NAMES, dt as DEFAULT_EXPERIMENTS, en as DependabotRequirementSource, et as DependabotJobBuilderOutput, f as DependabotCreatePullRequest, fn as CONFIG_FILE_PATHS_AZURE, ft as parseExperiments, g as DependabotDependencySubmission, gn as DependabotCommitMessage, gt as sanitizeRef, h as DependabotDependencyFileSchema, hn as DependabotAllowConditionSchema, ht as getBranchNameForUpdate, i as getPullRequestDependencies, in as DependabotSource, it as mapExperiments, j as DependabotRecordCooldownMetaSchema, jn as DependabotSchedule, jt as DependabotDependencySchema, k as DependabotMetricSchema, kn as DependabotRegistry, kt as DependabotCredentialSchema, l as DependabotClosePullRequestReason, ln as FileFetcherInput, lt as mapSourceFromDependabotConfigToJobConfig, m as DependabotDependencyFile, mn as DependabotAllowCondition, mt as makeDirectoryKey, n as getDependencyNames, nn as DependabotSecurityAdvisory, nt as mapAllowedUpdatesFromDependabotConfigToJobConfig, o as normalizeBranchName, on as DependabotSourceProviderSchema, ot as mapIgnoreConditionsFromDependabotConfigToJobConfig, p as DependabotCreatePullRequestSchema, pn as CONFIG_FILE_PATHS_GITHUB, pt as setExperiment, q as DependabotRequest, qn as DEPENDABOT_DEFAULT_AUTHOR_NAME, qt as DependabotPackageManagerSchema, r as getPullRequestCloseReason, rn as DependabotSecurityAdvisorySchema, rt as mapCredentials, s as normalizeFilePath, sn as DependabotSourceSchema, st as mapPackageEcosystemToPackageManager, t as areEqual, tn as DependabotRequirementSourceSchema, tt as DependabotSourceInfo, u as DependabotClosePullRequestReasonEnum, un as FileUpdaterInput, ut as mapVersionStrategyToRequirementsUpdateStrategy, v as DependabotEcosystemMeta, vn as DependabotConfig, vt as CertificateAuthoritySchema, w as DependabotJobError, wn as DependabotIgnoreCondition, wt as DependabotCommitOptions, x as DependabotEcosystemVersionManagerSchema, xn as DependabotCooldownSchema, xt as DependabotAllowedSchema, y as DependabotEcosystemMetaSchema, yn as DependabotConfigSchema, yt as DEPENDABOT_COMMANDS, z as DependabotRecordUpdateJobUnknownErrorSchema, zn as parseDependabotConfig, zt as DependabotGroupJobSchema } from "../index-CjxvO_Pt.mjs";
2
2
  import "../index-BfwWezjJ.mjs";
3
3
  export { CONFIG_FILE_NAMES, CONFIG_FILE_PATHS_AZURE, CONFIG_FILE_PATHS_GITHUB, CertificateAuthority, CertificateAuthoritySchema, CreateApiServerAppOptions, DEFAULT_EXPERIMENTS, DEPENDABOT_COMMANDS, DEPENDABOT_DEFAULT_AUTHOR_EMAIL, DEPENDABOT_DEFAULT_AUTHOR_NAME, DependabotAllowCondition, DependabotAllowConditionSchema, DependabotAllowed, DependabotAllowedSchema, DependabotClosePullRequest, DependabotClosePullRequestReason, DependabotClosePullRequestReasonEnum, DependabotClosePullRequestSchema, DependabotCommand, DependabotCommandSchema, DependabotCommitMessage, DependabotCommitMessageSchema, DependabotCommitOptions, DependabotCommitOptionsSchema, DependabotCondition, DependabotConditionSchema, DependabotConfig, DependabotConfigSchema, DependabotCooldown, DependabotCooldownSchema, DependabotCreatePullRequest, DependabotCreatePullRequestSchema, DependabotCredential, DependabotCredentialSchema, DependabotDependency, DependabotDependencyFile, DependabotDependencyFileSchema, DependabotDependencySchema, DependabotDependencySubmission, DependabotDependencySubmissionSchema, DependabotEcosystemMeta, DependabotEcosystemMetaSchema, DependabotEcosystemVersionManager, DependabotEcosystemVersionManagerSchema, DependabotExistingGroupPR, DependabotExistingGroupPRSchema, DependabotExistingPR, DependabotExistingPRSchema, DependabotExperiments, DependabotExperimentsSchema, DependabotGroup, DependabotGroupJob, DependabotGroupJobSchema, DependabotGroupRuleJob, DependabotGroupRuleJobSchema, DependabotGroupSchema, DependabotIgnoreCondition, DependabotIgnoreConditionSchema, DependabotIncrementMetric, DependabotIncrementMetricSchema, DependabotJobBuilder, DependabotJobBuilderOutput, DependabotJobConfig, DependabotJobConfigSchema, DependabotJobError, DependabotJobErrorSchema, DependabotJobFile, DependabotJobFileSchema, DependabotMarkAsProcessed, DependabotMarkAsProcessedSchema, DependabotMetric, DependabotMetricSchema, DependabotMultiEcosystemGroup, DependabotMultiEcosystemGroupSchema, DependabotPackageManager, DependabotPackageManagerSchema, DependabotPersistedPr, DependabotPersistedPrSchema, DependabotProxyConfig, DependabotProxyConfigSchema, DependabotPullRequestBranchName, DependabotRecordCooldownMeta, DependabotRecordCooldownMetaSchema, DependabotRecordEcosystemMeta, DependabotRecordEcosystemMetaSchema, DependabotRecordEcosystemVersions, DependabotRecordEcosystemVersionsSchema, DependabotRecordUpdateJobError, DependabotRecordUpdateJobErrorSchema, DependabotRecordUpdateJobUnknownError, DependabotRecordUpdateJobUnknownErrorSchema, DependabotRecordUpdateJobWarning, DependabotRecordUpdateJobWarningSchema, DependabotRegistry, DependabotRegistrySchema, DependabotRequest, DependabotRequestSchema, DependabotRequestType, DependabotRequestTypeSchema, DependabotRequirement, DependabotRequirementSchema, DependabotRequirementSource, DependabotRequirementSourceSchema, DependabotSchedule, DependabotScheduleSchema, DependabotSecurityAdvisory, DependabotSecurityAdvisorySchema, DependabotSource, DependabotSourceInfo, DependabotSourceProvider, DependabotSourceProviderSchema, DependabotSourceSchema, DependabotTokenType, DependabotUpdate, DependabotUpdateDependencyList, DependabotUpdateDependencyListSchema, DependabotUpdatePullRequest, DependabotUpdatePullRequestSchema, DependabotUpdateSchema, FetchedFiles, FileFetcherInput, FileUpdaterInput, GitAuthor, PackageEcosystem, PackageEcosystemSchema, VariableFinderFn, VersioningStrategy, VersioningStrategySchema, areEqual, convertPlaceholder, createApiServerApp, extractPlaceholder, getBranchNameForUpdate, getDependencyNames, getPullRequestCloseReason, getPullRequestDependencies, getPullRequestDescription, makeDirectoryKey, mapAllowedUpdatesFromDependabotConfigToJobConfig, mapCredentials, mapExperiments, mapGroupsFromDependabotConfigToJobConfig, mapIgnoreConditionsFromDependabotConfigToJobConfig, mapPackageEcosystemToPackageManager, mapSecurityAdvisories, mapSourceFromDependabotConfigToJobConfig, mapVersionStrategyToRequirementsUpdateStrategy, normalizeBranchName, normalizeFilePath, parseDependabotConfig, parseExperiments, parseRegistries, parseUpdates, sanitizeRef, setExperiment, validateConfiguration };
@@ -228,10 +228,10 @@ declare const PackageEcosystemSchema: z.ZodEnum<{
228
228
  }>;
229
229
  type PackageEcosystem = z.infer<typeof PackageEcosystemSchema>;
230
230
  declare const VersioningStrategySchema: z.ZodEnum<{
231
- "lockfile-only": "lockfile-only";
232
231
  auto: "auto";
233
232
  increase: "increase";
234
233
  "increase-if-necessary": "increase-if-necessary";
234
+ "lockfile-only": "lockfile-only";
235
235
  widen: "widen";
236
236
  }>;
237
237
  type VersioningStrategy = z.infer<typeof VersioningStrategySchema>;
@@ -380,10 +380,10 @@ declare const DependabotUpdateSchema: z.ZodPipe<z.ZodObject<{
380
380
  'target-branch': z.ZodOptional<z.ZodString>;
381
381
  vendor: z.ZodOptional<z.ZodBoolean>;
382
382
  'versioning-strategy': z.ZodOptional<z.ZodEnum<{
383
- "lockfile-only": "lockfile-only";
384
383
  auto: "auto";
385
384
  increase: "increase";
386
385
  "increase-if-necessary": "increase-if-necessary";
386
+ "lockfile-only": "lockfile-only";
387
387
  widen: "widen";
388
388
  }>>;
389
389
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -443,7 +443,7 @@ declare const DependabotUpdateSchema: z.ZodPipe<z.ZodObject<{
443
443
  registries?: string[] | undefined;
444
444
  'target-branch'?: string | undefined;
445
445
  vendor?: boolean | undefined;
446
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
446
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
447
447
  patterns?: string[] | undefined;
448
448
  'multi-ecosystem-group'?: string | undefined;
449
449
  }, {
@@ -501,7 +501,7 @@ declare const DependabotUpdateSchema: z.ZodPipe<z.ZodObject<{
501
501
  registries?: string[] | undefined;
502
502
  'target-branch'?: string | undefined;
503
503
  vendor?: boolean | undefined;
504
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
504
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
505
505
  patterns?: string[] | undefined;
506
506
  'multi-ecosystem-group'?: string | undefined;
507
507
  }>>;
@@ -756,10 +756,10 @@ declare const DependabotConfigSchema: z.ZodPipe<z.ZodObject<{
756
756
  'target-branch': z.ZodOptional<z.ZodString>;
757
757
  vendor: z.ZodOptional<z.ZodBoolean>;
758
758
  'versioning-strategy': z.ZodOptional<z.ZodEnum<{
759
- "lockfile-only": "lockfile-only";
760
759
  auto: "auto";
761
760
  increase: "increase";
762
761
  "increase-if-necessary": "increase-if-necessary";
762
+ "lockfile-only": "lockfile-only";
763
763
  widen: "widen";
764
764
  }>>;
765
765
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -819,7 +819,7 @@ declare const DependabotConfigSchema: z.ZodPipe<z.ZodObject<{
819
819
  registries?: string[] | undefined;
820
820
  'target-branch'?: string | undefined;
821
821
  vendor?: boolean | undefined;
822
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
822
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
823
823
  patterns?: string[] | undefined;
824
824
  'multi-ecosystem-group'?: string | undefined;
825
825
  }, {
@@ -877,7 +877,7 @@ declare const DependabotConfigSchema: z.ZodPipe<z.ZodObject<{
877
877
  registries?: string[] | undefined;
878
878
  'target-branch'?: string | undefined;
879
879
  vendor?: boolean | undefined;
880
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
880
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
881
881
  patterns?: string[] | undefined;
882
882
  'multi-ecosystem-group'?: string | undefined;
883
883
  }>>>;
@@ -1007,7 +1007,7 @@ declare const DependabotConfigSchema: z.ZodPipe<z.ZodObject<{
1007
1007
  registries?: string[] | undefined;
1008
1008
  'target-branch'?: string | undefined;
1009
1009
  vendor?: boolean | undefined;
1010
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
1010
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
1011
1011
  patterns?: string[] | undefined;
1012
1012
  'multi-ecosystem-group'?: string | undefined;
1013
1013
  }[];
@@ -1108,7 +1108,7 @@ declare const DependabotConfigSchema: z.ZodPipe<z.ZodObject<{
1108
1108
  registries?: string[] | undefined;
1109
1109
  'target-branch'?: string | undefined;
1110
1110
  vendor?: boolean | undefined;
1111
- 'versioning-strategy'?: "lockfile-only" | "auto" | "increase" | "increase-if-necessary" | "widen" | undefined;
1111
+ 'versioning-strategy'?: "auto" | "increase" | "increase-if-necessary" | "lockfile-only" | "widen" | undefined;
1112
1112
  patterns?: string[] | undefined;
1113
1113
  'multi-ecosystem-group'?: string | undefined;
1114
1114
  }[];
@@ -2710,4 +2710,4 @@ declare function getPullRequestDescription({
2710
2710
  }): string;
2711
2711
  //#endregion
2712
2712
  export { DependabotJobBuilder as $, DependabotRequirementSchema as $t, DependabotRecordCooldownMeta as A, DependabotRegistrySchema as An, DependabotDependency as At, DependabotRecordUpdateJobWarning as B, parseRegistries as Bn, DependabotGroupRuleJob as Bt, DependabotIncrementMetricSchema as C, DependabotGroupSchema as Cn, DependabotCommandSchema as Ct, DependabotMarkAsProcessedSchema as D, DependabotMultiEcosystemGroupSchema as Dn, DependabotConditionSchema as Dt, DependabotMarkAsProcessed as E, DependabotMultiEcosystemGroup as En, DependabotCondition as Et, DependabotRecordEcosystemVersionsSchema as F, PackageEcosystem as Fn, DependabotExistingPRSchema as Ft, DependabotUpdatePullRequestSchema as G, extractPlaceholder as Gn, DependabotJobFileSchema as Gt, DependabotUpdateDependencyList as H, validateConfiguration as Hn, DependabotJobConfig as Ht, DependabotRecordUpdateJobError as I, PackageEcosystemSchema as In, DependabotExperiments as It, DependabotRequestSchema as J, GitAuthor as Jn, DependabotPersistedPr as Jt, CreateApiServerAppOptions as K, DEPENDABOT_DEFAULT_AUTHOR_EMAIL as Kn, DependabotPackageManager as Kt, DependabotRecordUpdateJobErrorSchema as L, VersioningStrategy as Ln, DependabotExperimentsSchema as Lt, DependabotRecordEcosystemMeta as M, DependabotScheduleSchema as Mn, DependabotExistingGroupPR as Mt, DependabotRecordEcosystemMetaSchema as N, DependabotUpdate as Nn, DependabotExistingGroupPRSchema as Nt, DependabotMetric as O, DependabotPullRequestBranchName as On, DependabotCredential as Ot, DependabotRecordEcosystemVersions as P, DependabotUpdateSchema as Pn, DependabotExistingPR as Pt, createApiServerApp as Q, DependabotRequirement as Qt, DependabotRecordUpdateJobUnknownError as R, VersioningStrategySchema as Rn, DependabotGroupJob as Rt, DependabotIncrementMetric as S, DependabotGroup as Sn, DependabotCommand as St, DependabotJobErrorSchema as T, DependabotIgnoreConditionSchema as Tn, DependabotCommitOptionsSchema as Tt, DependabotUpdateDependencyListSchema as U, VariableFinderFn as Un, DependabotJobConfigSchema as Ut, DependabotRecordUpdateJobWarningSchema as V, parseUpdates as Vn, DependabotGroupRuleJobSchema as Vt, DependabotUpdatePullRequest as W, convertPlaceholder as Wn, DependabotJobFile as Wt, DependabotRequestTypeSchema as X, DependabotProxyConfig as Xt, DependabotRequestType as Y, DependabotPersistedPrSchema as Yt, DependabotTokenType as Z, DependabotProxyConfigSchema as Zt, DependabotDependencySubmissionSchema as _, DependabotCommitMessageSchema as _n, CertificateAuthority as _t, getPullRequestDescription as a, DependabotSourceProvider as an, mapGroupsFromDependabotConfigToJobConfig as at, DependabotEcosystemVersionManager as b, DependabotCooldown as bn, DependabotAllowed as bt, DependabotClosePullRequest as c, FetchedFiles as cn, mapSecurityAdvisories as ct, DependabotClosePullRequestSchema as d, CONFIG_FILE_NAMES as dn, DEFAULT_EXPERIMENTS as dt, DependabotRequirementSource as en, DependabotJobBuilderOutput as et, DependabotCreatePullRequest as f, CONFIG_FILE_PATHS_AZURE as fn, parseExperiments as ft, DependabotDependencySubmission as g, DependabotCommitMessage as gn, sanitizeRef as gt, DependabotDependencyFileSchema as h, DependabotAllowConditionSchema as hn, getBranchNameForUpdate as ht, getPullRequestDependencies as i, DependabotSource as in, mapExperiments as it, DependabotRecordCooldownMetaSchema as j, DependabotSchedule as jn, DependabotDependencySchema as jt, DependabotMetricSchema as k, DependabotRegistry as kn, DependabotCredentialSchema as kt, DependabotClosePullRequestReason as l, FileFetcherInput as ln, mapSourceFromDependabotConfigToJobConfig as lt, DependabotDependencyFile as m, DependabotAllowCondition as mn, makeDirectoryKey as mt, getDependencyNames as n, DependabotSecurityAdvisory as nn, mapAllowedUpdatesFromDependabotConfigToJobConfig as nt, normalizeBranchName as o, DependabotSourceProviderSchema as on, mapIgnoreConditionsFromDependabotConfigToJobConfig as ot, DependabotCreatePullRequestSchema as p, CONFIG_FILE_PATHS_GITHUB as pn, setExperiment as pt, DependabotRequest as q, DEPENDABOT_DEFAULT_AUTHOR_NAME as qn, DependabotPackageManagerSchema as qt, getPullRequestCloseReason as r, DependabotSecurityAdvisorySchema as rn, mapCredentials as rt, normalizeFilePath as s, DependabotSourceSchema as sn, mapPackageEcosystemToPackageManager as st, areEqual as t, DependabotRequirementSourceSchema as tn, DependabotSourceInfo as tt, DependabotClosePullRequestReasonEnum as u, FileUpdaterInput as un, mapVersionStrategyToRequirementsUpdateStrategy as ut, DependabotEcosystemMeta as v, DependabotConfig as vn, CertificateAuthoritySchema as vt, DependabotJobError as w, DependabotIgnoreCondition as wn, DependabotCommitOptions as wt, DependabotEcosystemVersionManagerSchema as x, DependabotCooldownSchema as xn, DependabotAllowedSchema as xt, DependabotEcosystemMetaSchema as y, DependabotConfigSchema as yn, DEPENDABOT_COMMANDS as yt, DependabotRecordUpdateJobUnknownErrorSchema as z, parseDependabotConfig as zn, DependabotGroupJobSchema as zt };
2713
- //# sourceMappingURL=index-CFWMNvXg.d.mts.map
2713
+ //# sourceMappingURL=index-CjxvO_Pt.d.mts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paklo/core",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "author": "mburumaxwell",
@@ -55,21 +55,21 @@
55
55
  },
56
56
  "homepage": "https://github.com/mburumaxwell/dependabot-azure-devops#readme",
57
57
  "dependencies": {
58
- "@hono/zod-validator": "0.7.5",
59
- "hono": "4.11.0",
58
+ "@hono/zod-validator": "0.7.6",
59
+ "hono": "4.11.1",
60
60
  "js-yaml": "4.1.1",
61
61
  "ky": "1.14.1",
62
62
  "octokit": "5.0.5",
63
63
  "pino": "10.1.0",
64
64
  "pino-pretty": "13.1.3",
65
65
  "semver": "7.7.3",
66
- "zod": "4.1.13"
66
+ "zod": "4.2.1"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@types/js-yaml": "4.0.9",
70
- "@types/node": "25.0.1",
70
+ "@types/node": "25.0.3",
71
71
  "@types/semver": "7.7.1",
72
- "tsdown": "0.17.3"
72
+ "tsdown": "0.18.1"
73
73
  },
74
74
  "publishConfig": {
75
75
  "access": "public"