renovate 44.84.0 → 44.85.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.
- package/dist/config/presets/forgejo/index.js +3 -2
- package/dist/config/presets/forgejo/index.js.map +1 -1
- package/dist/config/presets/gitea/index.js +10 -3
- package/dist/config/presets/gitea/index.js.map +1 -1
- package/dist/modules/platform/api.js +6 -6
- package/dist/modules/platform/forgejo/index.js +21 -587
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +90 -74
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +561 -529
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/labels.js +42 -0
- package/dist/modules/platform/gitea/labels.js.map +1 -0
- package/dist/modules/platform/gitea/pr-cache.js +66 -28
- package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
- package/dist/modules/platform/gitea/schema.js +141 -5
- package/dist/modules/platform/gitea/schema.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +10 -8
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/util/cache/repository/types.d.ts +13 -8
- package/dist/util/http/forgejo.js +6 -35
- package/dist/util/http/forgejo.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js +1 -1
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitea/index.js +3 -3
- package/dist/workers/repository/update/pr/changelog/gitea/index.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
- package/dist/modules/platform/forgejo/forgejo-helper.js +0 -235
- package/dist/modules/platform/forgejo/forgejo-helper.js.map +0 -1
- package/dist/modules/platform/forgejo/pr-cache.js +0 -114
- package/dist/modules/platform/forgejo/pr-cache.js.map +0 -1
- package/dist/modules/platform/forgejo/schema.js +0 -149
- package/dist/modules/platform/forgejo/schema.js.map +0 -1
- package/dist/modules/platform/forgejo/utils.js +0 -115
- package/dist/modules/platform/forgejo/utils.js.map +0 -1
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { logger } from "../../../logger/index.js";
|
|
2
|
-
import { getQueryString } from "../../../util/url.js";
|
|
3
|
-
import { getCache } from "../../../util/cache/repository/index.js";
|
|
4
|
-
import { ForgejoHttp } from "../../../util/http/forgejo.js";
|
|
5
|
-
import { Comment, CommitStatus, Issue, Label, PR, Repo, RepoContents, RepoSearchResults, User, Version } from "./schema.js";
|
|
6
|
-
import { API_PATH } from "./utils.js";
|
|
7
|
-
import { isBoolean } from "@sindresorhus/is";
|
|
8
|
-
import { z } from "zod/v4";
|
|
9
|
-
//#region lib/modules/platform/forgejo/forgejo-helper.ts
|
|
10
|
-
const forgejoHttp = new ForgejoHttp();
|
|
11
|
-
function urlEscape(raw) {
|
|
12
|
-
return encodeURIComponent(raw);
|
|
13
|
-
}
|
|
14
|
-
const commitStatusStates = [
|
|
15
|
-
"unknown",
|
|
16
|
-
"success",
|
|
17
|
-
"pending",
|
|
18
|
-
"warning",
|
|
19
|
-
"failure",
|
|
20
|
-
"error"
|
|
21
|
-
];
|
|
22
|
-
async function getCurrentUser(options = {}) {
|
|
23
|
-
const url = `${API_PATH}/user`;
|
|
24
|
-
return (await forgejoHttp.getJson(url, options, User)).body;
|
|
25
|
-
}
|
|
26
|
-
async function getVersion(options = {}) {
|
|
27
|
-
const url = `${API_PATH}/version`;
|
|
28
|
-
return (await forgejoHttp.getJson(url, options, Version)).body.version;
|
|
29
|
-
}
|
|
30
|
-
async function isOrg(organization) {
|
|
31
|
-
const repoCache = getCache();
|
|
32
|
-
repoCache.platform ??= {};
|
|
33
|
-
repoCache.platform.forgejo ??= {};
|
|
34
|
-
repoCache.platform.forgejo.orgs ??= {};
|
|
35
|
-
const cached = repoCache.platform.forgejo.orgs[organization];
|
|
36
|
-
if (isBoolean(cached)) return cached;
|
|
37
|
-
try {
|
|
38
|
-
const url = `${API_PATH}/orgs/${organization}`;
|
|
39
|
-
const res = await forgejoHttp.getJsonUnchecked(url);
|
|
40
|
-
repoCache.platform.forgejo.orgs[organization] = res.statusCode === 200;
|
|
41
|
-
return res.statusCode === 200;
|
|
42
|
-
} catch (err) {
|
|
43
|
-
if (err.statusCode === 404) return false;
|
|
44
|
-
throw err;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async function searchRepos(params, options) {
|
|
48
|
-
const query = getQueryString(params);
|
|
49
|
-
const url = `${API_PATH}/repos/search?${query}`;
|
|
50
|
-
const res = await forgejoHttp.getJson(url, {
|
|
51
|
-
...options,
|
|
52
|
-
paginate: true
|
|
53
|
-
}, RepoSearchResults);
|
|
54
|
-
if (!res.body.ok) throw new Error("Unable to search for repositories, ok flag has not been set");
|
|
55
|
-
return res.body.data;
|
|
56
|
-
}
|
|
57
|
-
async function orgListRepos(organization, options) {
|
|
58
|
-
const url = `${API_PATH}/orgs/${organization}/repos`;
|
|
59
|
-
return (await forgejoHttp.getJson(url, {
|
|
60
|
-
...options,
|
|
61
|
-
paginate: true
|
|
62
|
-
}, z.array(Repo))).body;
|
|
63
|
-
}
|
|
64
|
-
async function getRepo(repoPath, options = {}) {
|
|
65
|
-
const url = `${API_PATH}/repos/${repoPath}`;
|
|
66
|
-
return (await forgejoHttp.getJson(url, options, Repo)).body;
|
|
67
|
-
}
|
|
68
|
-
async function getRepoContents(repoPath, filePath, ref, options = {}) {
|
|
69
|
-
const query = getQueryString(ref ? { ref } : {});
|
|
70
|
-
const url = `${API_PATH}/repos/${repoPath}/contents/${urlEscape(filePath)}?${query}`;
|
|
71
|
-
return (await forgejoHttp.getJson(url, options, RepoContents)).body;
|
|
72
|
-
}
|
|
73
|
-
async function createPR(repoPath, params, options) {
|
|
74
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls`;
|
|
75
|
-
return (await forgejoHttp.postJson(url, {
|
|
76
|
-
...options,
|
|
77
|
-
body: params
|
|
78
|
-
}, PR)).body;
|
|
79
|
-
}
|
|
80
|
-
async function updatePR(repoPath, idx, params, options) {
|
|
81
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;
|
|
82
|
-
return (await forgejoHttp.patchJson(url, {
|
|
83
|
-
...options,
|
|
84
|
-
body: params
|
|
85
|
-
}, PR)).body;
|
|
86
|
-
}
|
|
87
|
-
async function mergePR(repoPath, idx, params, options) {
|
|
88
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;
|
|
89
|
-
await forgejoHttp.postJson(url, {
|
|
90
|
-
...options,
|
|
91
|
-
body: params
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
async function getPR(repoPath, idx, options = {}) {
|
|
95
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;
|
|
96
|
-
return (await forgejoHttp.getJson(url, options, PR)).body;
|
|
97
|
-
}
|
|
98
|
-
async function getPRByBranch(repoPath, base, head, options = {}) {
|
|
99
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;
|
|
100
|
-
try {
|
|
101
|
-
return (await forgejoHttp.getJson(url, options, PR)).body;
|
|
102
|
-
} catch (err) {
|
|
103
|
-
logger.trace({ err }, "Error while fetching PR");
|
|
104
|
-
if (err.statusCode !== 404) logger.debug({ err }, "Error while fetching PR");
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
async function requestPrReviewers(repoPath, idx, params, options) {
|
|
109
|
-
const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;
|
|
110
|
-
await forgejoHttp.postJson(url, {
|
|
111
|
-
...options,
|
|
112
|
-
body: params
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
async function createIssue(repoPath, params, options) {
|
|
116
|
-
const url = `${API_PATH}/repos/${repoPath}/issues`;
|
|
117
|
-
return (await forgejoHttp.postJson(url, {
|
|
118
|
-
...options,
|
|
119
|
-
body: params
|
|
120
|
-
}, Issue)).body;
|
|
121
|
-
}
|
|
122
|
-
async function updateIssue(repoPath, idx, params, options) {
|
|
123
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;
|
|
124
|
-
return (await forgejoHttp.patchJson(url, {
|
|
125
|
-
...options,
|
|
126
|
-
body: params
|
|
127
|
-
}, Issue)).body;
|
|
128
|
-
}
|
|
129
|
-
async function updateIssueLabels(repoPath, idx, params, options) {
|
|
130
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;
|
|
131
|
-
return (await forgejoHttp.putJson(url, {
|
|
132
|
-
...options,
|
|
133
|
-
body: params
|
|
134
|
-
}, z.array(Label))).body;
|
|
135
|
-
}
|
|
136
|
-
async function closeIssue(repoPath, idx, options) {
|
|
137
|
-
await updateIssue(repoPath, idx, {
|
|
138
|
-
...options,
|
|
139
|
-
state: "closed"
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
async function searchIssues(repoPath, params, options) {
|
|
143
|
-
const query = getQueryString({
|
|
144
|
-
...params,
|
|
145
|
-
type: "issues"
|
|
146
|
-
});
|
|
147
|
-
const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;
|
|
148
|
-
return (await forgejoHttp.getJson(url, {
|
|
149
|
-
...options,
|
|
150
|
-
paginate: true
|
|
151
|
-
}, z.array(Issue))).body;
|
|
152
|
-
}
|
|
153
|
-
async function getIssue(repoPath, idx, options = {}) {
|
|
154
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;
|
|
155
|
-
return (await forgejoHttp.getJson(url, options, Issue)).body;
|
|
156
|
-
}
|
|
157
|
-
async function getRepoLabels(repoPath, options = {}) {
|
|
158
|
-
const url = `${API_PATH}/repos/${repoPath}/labels`;
|
|
159
|
-
return (await forgejoHttp.getJson(url, options, z.array(Label))).body;
|
|
160
|
-
}
|
|
161
|
-
async function getOrgLabels(orgName, options = {}) {
|
|
162
|
-
const url = `${API_PATH}/orgs/${orgName}/labels`;
|
|
163
|
-
return (await forgejoHttp.getJson(url, options, z.array(Label))).body;
|
|
164
|
-
}
|
|
165
|
-
async function unassignLabel(repoPath, issue, label, options) {
|
|
166
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;
|
|
167
|
-
await forgejoHttp.deleteJson(url, options);
|
|
168
|
-
}
|
|
169
|
-
async function createComment(repoPath, issue, body, options) {
|
|
170
|
-
const params = { body };
|
|
171
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;
|
|
172
|
-
return (await forgejoHttp.postJson(url, {
|
|
173
|
-
...options,
|
|
174
|
-
body: params
|
|
175
|
-
}, Comment)).body;
|
|
176
|
-
}
|
|
177
|
-
async function updateComment(repoPath, idx, body, options) {
|
|
178
|
-
const params = { body };
|
|
179
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;
|
|
180
|
-
return (await forgejoHttp.patchJson(url, {
|
|
181
|
-
...options,
|
|
182
|
-
body: params
|
|
183
|
-
}, Comment)).body;
|
|
184
|
-
}
|
|
185
|
-
async function deleteComment(repoPath, idx, options) {
|
|
186
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;
|
|
187
|
-
await forgejoHttp.deleteJson(url, options);
|
|
188
|
-
}
|
|
189
|
-
async function getComments(repoPath, issue, options = {}) {
|
|
190
|
-
const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;
|
|
191
|
-
return (await forgejoHttp.getJson(url, options, z.array(Comment))).body;
|
|
192
|
-
}
|
|
193
|
-
async function createCommitStatus(repoPath, branchCommit, params, options) {
|
|
194
|
-
const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;
|
|
195
|
-
return (await forgejoHttp.postJson(url, {
|
|
196
|
-
...options,
|
|
197
|
-
body: params
|
|
198
|
-
}, CommitStatus)).body;
|
|
199
|
-
}
|
|
200
|
-
const forgejoToRenovateStatusMapping = {
|
|
201
|
-
unknown: "yellow",
|
|
202
|
-
success: "green",
|
|
203
|
-
pending: "yellow",
|
|
204
|
-
warning: "red",
|
|
205
|
-
failure: "red",
|
|
206
|
-
error: "red"
|
|
207
|
-
};
|
|
208
|
-
const renovateToForgejoStatusMapping = {
|
|
209
|
-
green: "success",
|
|
210
|
-
yellow: "pending",
|
|
211
|
-
red: "failure"
|
|
212
|
-
};
|
|
213
|
-
function filterStatus(data) {
|
|
214
|
-
const ret = {};
|
|
215
|
-
for (const i of data) if (!ret[i.context] || ret[i.context].id < i.id) ret[i.context] = i;
|
|
216
|
-
return Object.values(ret);
|
|
217
|
-
}
|
|
218
|
-
async function getCombinedCommitStatus(repoPath, branchName, options) {
|
|
219
|
-
const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(branchName)}/statuses`;
|
|
220
|
-
const res = await forgejoHttp.getJson(url, {
|
|
221
|
-
...options,
|
|
222
|
-
paginate: true
|
|
223
|
-
}, z.array(CommitStatus));
|
|
224
|
-
let worstState = 0;
|
|
225
|
-
const statuses = filterStatus(res.body);
|
|
226
|
-
for (const cs of statuses) worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));
|
|
227
|
-
return {
|
|
228
|
-
worstStatus: commitStatusStates[worstState],
|
|
229
|
-
statuses
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
//#endregion
|
|
233
|
-
export { closeIssue, createComment, createCommitStatus, createIssue, createPR, deleteComment, forgejoHttp, forgejoToRenovateStatusMapping, getCombinedCommitStatus, getComments, getCurrentUser, getIssue, getOrgLabels, getPR, getPRByBranch, getRepo, getRepoContents, getRepoLabels, getVersion, isOrg, mergePR, orgListRepos, renovateToForgejoStatusMapping, requestPrReviewers, searchIssues, searchRepos, unassignLabel, updateComment, updateIssue, updateIssueLabels, updatePR };
|
|
234
|
-
|
|
235
|
-
//# sourceMappingURL=forgejo-helper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgejo-helper.js","names":[],"sources":["../../../../lib/modules/platform/forgejo/forgejo-helper.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { ForgejoHttpOptions } from '../../../util/http/forgejo.ts';\nimport { ForgejoHttp } from '../../../util/http/forgejo.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport {\n Branch,\n Comment,\n CommitStatus,\n type CommitStatusType,\n Issue,\n Label,\n PR,\n Repo,\n RepoContents,\n RepoSearchResults,\n User,\n Version,\n} from './schema.ts';\nimport type {\n CombinedCommitStatus,\n CommentCreateParams,\n CommitStatusCreateParams,\n IssueCreateParams,\n IssueSearchParams,\n IssueUpdateLabelsParams,\n IssueUpdateParams,\n PRCreateParams,\n PRMergeParams,\n PRUpdateParams,\n PrReviewersParams,\n RepoSearchParams,\n} from './types.ts';\nimport { API_PATH } from './utils.ts';\n\nexport const forgejoHttp = new ForgejoHttp();\n\nfunction urlEscape(raw: string): string {\n return encodeURIComponent(raw);\n}\nconst commitStatusStates: CommitStatusType[] = [\n 'unknown',\n 'success',\n 'pending',\n 'warning',\n 'failure',\n 'error',\n];\n\nexport async function getCurrentUser(\n options: ForgejoHttpOptions = {},\n): Promise<User> {\n const url = `${API_PATH}/user`;\n const res = await forgejoHttp.getJson(url, options, User);\n return res.body;\n}\n\nexport async function getVersion(\n options: ForgejoHttpOptions = {},\n): Promise<string> {\n const url = `${API_PATH}/version`;\n const res = await forgejoHttp.getJson(url, options, Version);\n return res.body.version;\n}\n\nexport async function isOrg(organization: string): Promise<boolean> {\n const repoCache = getCache();\n repoCache.platform ??= {};\n repoCache.platform.forgejo ??= {};\n repoCache.platform.forgejo.orgs ??= {};\n const cached = repoCache.platform.forgejo.orgs[organization];\n if (isBoolean(cached)) {\n return cached;\n }\n try {\n const url = `${API_PATH}/orgs/${organization}`;\n const res = await forgejoHttp.getJsonUnchecked(url);\n repoCache.platform.forgejo.orgs[organization] = res.statusCode === 200;\n return res.statusCode === 200;\n } catch (err) {\n if (err.statusCode === 404) {\n return false;\n }\n // throw other errors\n throw err;\n }\n}\n\nexport async function searchRepos(\n params: RepoSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const query = getQueryString(params);\n const url = `${API_PATH}/repos/search?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n RepoSearchResults,\n );\n\n if (!res.body.ok) {\n throw new Error(\n 'Unable to search for repositories, ok flag has not been set',\n );\n }\n\n return res.body.data;\n}\n\nexport async function orgListRepos(\n organization: string,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const url = `${API_PATH}/orgs/${organization}/repos`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Repo),\n );\n\n return res.body;\n}\n\nexport async function getRepo(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Repo> {\n const url = `${API_PATH}/repos/${repoPath}`;\n const res = await forgejoHttp.getJson(url, options, Repo);\n return res.body;\n}\n\nexport async function getRepoContents(\n repoPath: string,\n filePath: string,\n ref?: string | null,\n options: ForgejoHttpOptions = {},\n): Promise<RepoContents> {\n const query = getQueryString(ref ? { ref } : {});\n const url = `${API_PATH}/repos/${repoPath}/contents/${urlEscape(\n filePath,\n )}?${query}`;\n const res = await forgejoHttp.getJson(url, options, RepoContents);\n\n return res.body;\n}\n\nexport async function createPR(\n repoPath: string,\n params: PRCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function updatePR(\n repoPath: string,\n idx: number,\n params: PRUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function closePR(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updatePR(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function mergePR(\n repoPath: string,\n idx: number,\n params: PRMergeParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function getPR(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n}\n\nexport async function getPRByBranch(\n repoPath: string,\n base: string,\n head: string,\n options: ForgejoHttpOptions = {},\n): Promise<PR | null> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;\n try {\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n } catch (err) {\n logger.trace({ err }, 'Error while fetching PR');\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Error while fetching PR');\n }\n return null;\n }\n}\n\nexport async function requestPrReviewers(\n repoPath: string,\n idx: number,\n params: PrReviewersParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function createIssue(\n repoPath: string,\n params: IssueCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssue(\n repoPath: string,\n idx: number,\n params: IssueUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssueLabels(\n repoPath: string,\n idx: number,\n params: IssueUpdateLabelsParams,\n options?: ForgejoHttpOptions,\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;\n const res = await forgejoHttp.putJson(\n url,\n {\n ...options,\n body: params,\n },\n z.array(Label),\n );\n\n return res.body;\n}\n\nexport async function closeIssue(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updateIssue(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function searchIssues(\n repoPath: string,\n params: IssueSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue[]> {\n const query = getQueryString({ ...params, type: 'issues' });\n const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Issue),\n );\n\n return res.body;\n}\n\nexport async function getIssue(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.getJson(url, options, Issue);\n return res.body;\n}\n\nexport async function getRepoLabels(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function getOrgLabels(\n orgName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/orgs/${orgName}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function unassignLabel(\n repoPath: string,\n issue: number,\n label: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function createComment(\n repoPath: string,\n issue: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function updateComment(\n repoPath: string,\n idx: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function deleteComment(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function getComments(\n repoPath: string,\n issue: number,\n options: ForgejoHttpOptions = {},\n): Promise<Comment[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.getJson(url, options, z.array(Comment));\n\n return res.body;\n}\n\nexport async function createCommitStatus(\n repoPath: string,\n branchCommit: string,\n params: CommitStatusCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<CommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n CommitStatus,\n );\n\n return res.body;\n}\n\nexport const forgejoToRenovateStatusMapping: Record<\n CommitStatusType,\n BranchStatus\n> = {\n unknown: 'yellow',\n success: 'green',\n pending: 'yellow',\n warning: 'red',\n failure: 'red',\n error: 'red',\n};\n\nexport const renovateToForgejoStatusMapping: Record<\n BranchStatus,\n CommitStatusType\n> = {\n green: 'success',\n yellow: 'pending',\n red: 'failure',\n};\n\nfunction filterStatus(data: CommitStatus[]): CommitStatus[] {\n const ret: Record<string, CommitStatus> = {};\n for (const i of data) {\n if (!ret[i.context] || ret[i.context].id < i.id) {\n ret[i.context] = i;\n }\n }\n return Object.values(ret);\n}\n\nexport async function getCombinedCommitStatus(\n repoPath: string,\n branchName: string,\n options?: ForgejoHttpOptions,\n): Promise<CombinedCommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(\n branchName,\n )}/statuses`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(CommitStatus),\n );\n\n let worstState = 0;\n const statuses = filterStatus(res.body);\n for (const cs of statuses) {\n worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));\n }\n\n return {\n worstStatus: commitStatusStates[worstState],\n statuses,\n };\n}\n\nexport async function getBranch(\n repoPath: string,\n branchName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Branch> {\n const url = `${API_PATH}/repos/${repoPath}/branches/${urlEscape(branchName)}`;\n const res = await forgejoHttp.getJson(url, options, Branch);\n\n return res.body;\n}\n"],"mappings":"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"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { TEMPORARY_ERROR } from "../../../constants/error-messages.js";
|
|
2
|
-
import { get, set } from "../../../util/cache/memory/index.js";
|
|
3
|
-
import { logger } from "../../../logger/index.js";
|
|
4
|
-
import { getQueryString, parseLinkHeader, parseUrl } from "../../../util/url.js";
|
|
5
|
-
import { getCache } from "../../../util/cache/repository/index.js";
|
|
6
|
-
import { PRList } from "./schema.js";
|
|
7
|
-
import { API_PATH, toRenovatePR } from "./utils.js";
|
|
8
|
-
import { isNullOrUndefined } from "@sindresorhus/is";
|
|
9
|
-
import { dequal } from "dequal";
|
|
10
|
-
import { DateTime } from "luxon";
|
|
11
|
-
//#region lib/modules/platform/forgejo/pr-cache.ts
|
|
12
|
-
var ForgejoPrCache = class ForgejoPrCache {
|
|
13
|
-
cache;
|
|
14
|
-
items = [];
|
|
15
|
-
repo;
|
|
16
|
-
ignorePrAuthor;
|
|
17
|
-
author;
|
|
18
|
-
constructor(repo, ignorePrAuthor, author) {
|
|
19
|
-
this.repo = repo;
|
|
20
|
-
this.ignorePrAuthor = ignorePrAuthor;
|
|
21
|
-
this.author = author;
|
|
22
|
-
const repoCache = getCache();
|
|
23
|
-
repoCache.platform ??= {};
|
|
24
|
-
repoCache.platform.forgejo ??= {};
|
|
25
|
-
let pullRequestCache = repoCache.platform.forgejo.pullRequestsCache;
|
|
26
|
-
if (isNullOrUndefined(pullRequestCache) || pullRequestCache.author !== author) pullRequestCache = {
|
|
27
|
-
items: {},
|
|
28
|
-
updated_at: null,
|
|
29
|
-
author
|
|
30
|
-
};
|
|
31
|
-
repoCache.platform.forgejo.pullRequestsCache = pullRequestCache;
|
|
32
|
-
this.cache = pullRequestCache;
|
|
33
|
-
this.updateItems();
|
|
34
|
-
}
|
|
35
|
-
static forceSync() {
|
|
36
|
-
set("forgejo-pr-cache-synced", false);
|
|
37
|
-
}
|
|
38
|
-
static async init(http, repo, ignorePrAuthor, author) {
|
|
39
|
-
const res = new ForgejoPrCache(repo, ignorePrAuthor, author);
|
|
40
|
-
if (!get("forgejo-pr-cache-synced")) {
|
|
41
|
-
await res.sync(http);
|
|
42
|
-
set("forgejo-pr-cache-synced", true);
|
|
43
|
-
}
|
|
44
|
-
return res;
|
|
45
|
-
}
|
|
46
|
-
getPrs() {
|
|
47
|
-
return this.items;
|
|
48
|
-
}
|
|
49
|
-
static async getPrs(http, repo, ignorePrAuthor, author) {
|
|
50
|
-
return (await ForgejoPrCache.init(http, repo, ignorePrAuthor, author)).getPrs();
|
|
51
|
-
}
|
|
52
|
-
setPr(item) {
|
|
53
|
-
this.cache.items[item.number] = item;
|
|
54
|
-
this.updateItems();
|
|
55
|
-
}
|
|
56
|
-
static async setPr(http, repo, ignorePrAuthor, author, item) {
|
|
57
|
-
(await ForgejoPrCache.init(http, repo, ignorePrAuthor, author)).setPr(item);
|
|
58
|
-
}
|
|
59
|
-
reconcile(rawItems) {
|
|
60
|
-
const { items } = this.cache;
|
|
61
|
-
let { updated_at } = this.cache;
|
|
62
|
-
const cacheTime = updated_at ? DateTime.fromISO(updated_at) : null;
|
|
63
|
-
let needNextPage = true;
|
|
64
|
-
for (const rawItem of rawItems) {
|
|
65
|
-
if (!rawItem) {
|
|
66
|
-
logger.warn("Forgejo PR is empty, throwing temporary error");
|
|
67
|
-
throw new Error(TEMPORARY_ERROR);
|
|
68
|
-
}
|
|
69
|
-
const id = rawItem.number;
|
|
70
|
-
const newItem = toRenovatePR(rawItem, this.author);
|
|
71
|
-
if (!newItem) continue;
|
|
72
|
-
const oldItem = items[id];
|
|
73
|
-
if (dequal(oldItem, newItem)) {
|
|
74
|
-
needNextPage = false;
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
items[id] = newItem;
|
|
78
|
-
const itemTime = DateTime.fromISO(rawItem.updated_at);
|
|
79
|
-
if (!cacheTime || itemTime > cacheTime) updated_at = rawItem.updated_at;
|
|
80
|
-
}
|
|
81
|
-
this.cache.updated_at = updated_at;
|
|
82
|
-
return needNextPage;
|
|
83
|
-
}
|
|
84
|
-
async sync(http) {
|
|
85
|
-
let query = getQueryString({
|
|
86
|
-
state: "all",
|
|
87
|
-
sort: "recentupdate",
|
|
88
|
-
limit: this.items.length ? 20 : 100,
|
|
89
|
-
...this.ignorePrAuthor ? {} : { poster: this.author }
|
|
90
|
-
});
|
|
91
|
-
while (query) {
|
|
92
|
-
const res = await http.getJson(`${API_PATH}/repos/${this.repo}/pulls?${query}`, {
|
|
93
|
-
memCache: false,
|
|
94
|
-
paginate: false
|
|
95
|
-
}, PRList);
|
|
96
|
-
if (!this.reconcile(res.body)) break;
|
|
97
|
-
const uri = parseUrl(parseLinkHeader(res.headers.link)?.next?.url);
|
|
98
|
-
query = uri ? uri.search : null;
|
|
99
|
-
}
|
|
100
|
-
this.updateItems();
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Ensure the pr cache starts with the most recent PRs.
|
|
105
|
-
* JavaScript ensures that the cache is sorted by PR number.
|
|
106
|
-
*/
|
|
107
|
-
updateItems() {
|
|
108
|
-
this.items = Object.values(this.cache.items).reverse();
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
//#endregion
|
|
112
|
-
export { ForgejoPrCache };
|
|
113
|
-
|
|
114
|
-
//# sourceMappingURL=pr-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pr-cache.js","names":["memCache.get"],"sources":["../../../../lib/modules/platform/forgejo/pr-cache.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { ForgejoHttp } from '../../../util/http/forgejo.ts';\nimport {\n getQueryString,\n parseLinkHeader,\n parseUrl,\n} from '../../../util/url.ts';\nimport type { Pr } from '../types.ts';\nimport type { PR } from './schema.ts';\nimport { PRList } from './schema.ts';\nimport type { ForgejoPrCacheData } from './types.ts';\nimport { API_PATH, toRenovatePR } from './utils.ts';\n\nexport class ForgejoPrCache {\n private cache: ForgejoPrCacheData;\n private items: Pr[] = [];\n private repo: string;\n private readonly ignorePrAuthor: boolean;\n private author: string | null;\n\n private constructor(\n repo: string,\n ignorePrAuthor: boolean,\n author: string | null,\n ) {\n this.repo = repo;\n this.ignorePrAuthor = ignorePrAuthor;\n this.author = author;\n const repoCache = getCache();\n repoCache.platform ??= {};\n repoCache.platform.forgejo ??= {};\n let pullRequestCache = repoCache.platform.forgejo.pullRequestsCache as\n ForgejoPrCacheData | undefined;\n if (\n isNullOrUndefined(pullRequestCache) ||\n pullRequestCache.author !== author\n ) {\n pullRequestCache = {\n items: {},\n updated_at: null,\n author,\n };\n }\n repoCache.platform.forgejo.pullRequestsCache = pullRequestCache;\n this.cache = pullRequestCache;\n this.updateItems();\n }\n\n static forceSync(): void {\n memCache.set('forgejo-pr-cache-synced', false);\n }\n\n private static async init(\n http: ForgejoHttp,\n repo: string,\n ignorePrAuthor: boolean,\n author: string | null,\n ): Promise<ForgejoPrCache> {\n const res = new ForgejoPrCache(repo, ignorePrAuthor, author);\n const isSynced = memCache.get<true | undefined>('forgejo-pr-cache-synced');\n\n if (!isSynced) {\n await res.sync(http);\n memCache.set('forgejo-pr-cache-synced', true);\n }\n\n return res;\n }\n\n private getPrs(): Pr[] {\n return this.items;\n }\n\n static async getPrs(\n http: ForgejoHttp,\n repo: string,\n ignorePrAuthor: boolean,\n author: string,\n ): Promise<Pr[]> {\n const prCache = await ForgejoPrCache.init(\n http,\n repo,\n ignorePrAuthor,\n author,\n );\n return prCache.getPrs();\n }\n\n private setPr(item: Pr): void {\n this.cache.items[item.number] = item;\n this.updateItems();\n }\n\n static async setPr(\n http: ForgejoHttp,\n repo: string,\n ignorePrAuthor: boolean,\n author: string,\n item: Pr,\n ): Promise<void> {\n const prCache = await ForgejoPrCache.init(\n http,\n repo,\n ignorePrAuthor,\n author,\n );\n prCache.setPr(item);\n }\n\n private reconcile(rawItems: (PR | null)[]): boolean {\n const { items } = this.cache;\n let { updated_at } = this.cache;\n const cacheTime = updated_at ? DateTime.fromISO(updated_at) : null;\n\n let needNextPage = true;\n\n for (const rawItem of rawItems) {\n if (!rawItem) {\n logger.warn('Forgejo PR is empty, throwing temporary error');\n // Forgejo API sometimes returns empty PRs, so we throw a temporary error\n // https://github.com/go-forgejo/forgejo/blob/fcd096231ac2deaefbca10a7db1b9b01f1da93d7/services/convert/pull.go#L34-L52\n throw new Error(TEMPORARY_ERROR);\n }\n const id = rawItem.number;\n\n const newItem = toRenovatePR(rawItem, this.author);\n if (!newItem) {\n continue;\n }\n\n const oldItem = items[id];\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n items[id] = newItem;\n\n const itemTime = DateTime.fromISO(rawItem.updated_at);\n if (!cacheTime || itemTime > cacheTime) {\n updated_at = rawItem.updated_at;\n }\n }\n\n this.cache.updated_at = updated_at;\n\n return needNextPage;\n }\n\n private async sync(http: ForgejoHttp): Promise<ForgejoPrCache> {\n let query: string | null = getQueryString({\n state: 'all',\n sort: 'recentupdate',\n // Fetch 100 PRs on the first run to ensure we have the most recent PRs.\n // Forgejo will cap appropriate (50 by default, see `MAX_RESPONSE_ITEMS`).\n // https://docs.forgejo.com/administration/config-cheat-sheet#api-api\n // https://forgejo.org/docs/latest/admin/config-cheat-sheet/#api-api\n limit: this.items.length ? 20 : 100,\n // Supported since Forgejo v10.0.0.\n // Will be ignored by older instances.\n ...(this.ignorePrAuthor ? {} : { poster: this.author }),\n });\n\n while (query) {\n const res = await http.getJson(\n `${API_PATH}/repos/${this.repo}/pulls?${query}`,\n {\n memCache: false,\n paginate: false,\n },\n PRList,\n );\n\n const needNextPage = this.reconcile(res.body);\n if (!needNextPage) {\n break;\n }\n\n const uri = parseUrl(parseLinkHeader(res.headers.link)?.next?.url);\n query = uri ? uri.search : null;\n }\n\n this.updateItems();\n\n return this;\n }\n\n /**\n * Ensure the pr cache starts with the most recent PRs.\n * JavaScript ensures that the cache is sorted by PR number.\n */\n private updateItems(): void {\n this.items = Object.values(this.cache.items).reverse();\n }\n}\n"],"mappings":";;;;;;;;;;;AAmBA,IAAa,iBAAb,MAAa,eAAe;CAC1B;CACA,QAAsB,CAAC;CACvB;CACA;CACA;CAEA,YACE,MACA,gBACA,QACA;EACA,KAAK,OAAO;EACZ,KAAK,iBAAiB;EACtB,KAAK,SAAS;EACd,MAAM,YAAY,SAAS;EAC3B,UAAU,aAAa,CAAC;EACxB,UAAU,SAAS,YAAY,CAAC;EAChC,IAAI,mBAAmB,UAAU,SAAS,QAAQ;EAElD,IACE,kBAAkB,gBAAgB,KAClC,iBAAiB,WAAW,QAE5B,mBAAmB;GACjB,OAAO,CAAC;GACR,YAAY;GACZ;EACF;EAEF,UAAU,SAAS,QAAQ,oBAAoB;EAC/C,KAAK,QAAQ;EACb,KAAK,YAAY;CACnB;CAEA,OAAO,YAAkB;EACvB,IAAa,2BAA2B,KAAK;CAC/C;CAEA,aAAqB,KACnB,MACA,MACA,gBACA,QACyB;EACzB,MAAM,MAAM,IAAI,eAAe,MAAM,gBAAgB,MAAM;EAG3D,IAAI,CAFaA,IAA+B,yBAEpC,GAAG;GACb,MAAM,IAAI,KAAK,IAAI;GACnB,IAAa,2BAA2B,IAAI;EAC9C;EAEA,OAAO;CACT;CAEA,SAAuB;EACrB,OAAO,KAAK;CACd;CAEA,aAAa,OACX,MACA,MACA,gBACA,QACe;EAOf,QAAO,MANe,eAAe,KACnC,MACA,MACA,gBACA,MACF,EAAA,CACe,OAAO;CACxB;CAEA,MAAc,MAAgB;EAC5B,KAAK,MAAM,MAAM,KAAK,UAAU;EAChC,KAAK,YAAY;CACnB;CAEA,aAAa,MACX,MACA,MACA,gBACA,QACA,MACe;EAOf,CAAA,MANsB,eAAe,KACnC,MACA,MACA,gBACA,MACF,EAAA,CACQ,MAAM,IAAI;CACpB;CAEA,UAAkB,UAAkC;EAClD,MAAM,EAAE,UAAU,KAAK;EACvB,IAAI,EAAE,eAAe,KAAK;EAC1B,MAAM,YAAY,aAAa,SAAS,QAAQ,UAAU,IAAI;EAE9D,IAAI,eAAe;EAEnB,KAAK,MAAM,WAAW,UAAU;GAC9B,IAAI,CAAC,SAAS;IACZ,OAAO,KAAK,+CAA+C;IAG3D,MAAM,IAAI,MAAM,eAAe;GACjC;GACA,MAAM,KAAK,QAAQ;GAEnB,MAAM,UAAU,aAAa,SAAS,KAAK,MAAM;GACjD,IAAI,CAAC,SACH;GAGF,MAAM,UAAU,MAAM;GACtB,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,MAAM,MAAM;GAEZ,MAAM,WAAW,SAAS,QAAQ,QAAQ,UAAU;GACpD,IAAI,CAAC,aAAa,WAAW,WAC3B,aAAa,QAAQ;EAEzB;EAEA,KAAK,MAAM,aAAa;EAExB,OAAO;CACT;CAEA,MAAc,KAAK,MAA4C;EAC7D,IAAI,QAAuB,eAAe;GACxC,OAAO;GACP,MAAM;GAKN,OAAO,KAAK,MAAM,SAAS,KAAK;GAGhC,GAAI,KAAK,iBAAiB,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO;EACvD,CAAC;EAED,OAAO,OAAO;GACZ,MAAM,MAAM,MAAM,KAAK,QACrB,GAAG,SAAS,SAAS,KAAK,KAAK,SAAS,SACxC;IACE,UAAU;IACV,UAAU;GACZ,GACA,MACF;GAGA,IAAI,CADiB,KAAK,UAAU,IAAI,IACxB,GACd;GAGF,MAAM,MAAM,SAAS,gBAAgB,IAAI,QAAQ,IAAI,CAAC,EAAE,MAAM,GAAG;GACjE,QAAQ,MAAM,IAAI,SAAS;EAC7B;EAEA,KAAK,YAAY;EAEjB,OAAO;CACT;;;;;CAMA,cAA4B;EAC1B,KAAK,QAAQ,OAAO,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,QAAQ;CACvD;AACF"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { fromBase64 } from "../../../util/string.js";
|
|
2
|
-
import { DeepNullish, EmailAddress, LooseArray } from "../../../util/schema-utils/index.js";
|
|
3
|
-
import { LongCommitSha } from "../../../util/schema-utils/git.js";
|
|
4
|
-
import { z } from "zod/v4";
|
|
5
|
-
//#region lib/modules/platform/forgejo/schema.ts
|
|
6
|
-
const ContentsCommon = z.object({
|
|
7
|
-
name: z.string(),
|
|
8
|
-
path: z.string()
|
|
9
|
-
});
|
|
10
|
-
const ContentsFile = ContentsCommon.extend({
|
|
11
|
-
type: z.literal("file"),
|
|
12
|
-
content: z.string().nullable()
|
|
13
|
-
}).transform((input) => ({
|
|
14
|
-
...input,
|
|
15
|
-
contentString: input.content ? fromBase64(input.content) : ""
|
|
16
|
-
}));
|
|
17
|
-
const ContentsDir = ContentsCommon.extend({ type: z.literal("dir") });
|
|
18
|
-
const ContentsSymlink = ContentsCommon.extend({ type: z.literal("symlink") });
|
|
19
|
-
const ContentsSubmodule = ContentsCommon.extend({ type: z.literal("submodule") });
|
|
20
|
-
const RepoContents = z.discriminatedUnion("type", [
|
|
21
|
-
ContentsFile,
|
|
22
|
-
ContentsDir,
|
|
23
|
-
ContentsSymlink,
|
|
24
|
-
ContentsSubmodule
|
|
25
|
-
]);
|
|
26
|
-
const ContentsListResponse = z.array(RepoContents);
|
|
27
|
-
const User = DeepNullish(z.object({
|
|
28
|
-
id: z.number(),
|
|
29
|
-
email: EmailAddress.optional().catch(void 0),
|
|
30
|
-
full_name: z.string().optional(),
|
|
31
|
-
login: z.string()
|
|
32
|
-
}));
|
|
33
|
-
const RepoPermission = z.object({
|
|
34
|
-
admin: z.boolean(),
|
|
35
|
-
pull: z.boolean(),
|
|
36
|
-
push: z.boolean()
|
|
37
|
-
});
|
|
38
|
-
const PRMergeMethod = z.enum([
|
|
39
|
-
"fast-forward-only",
|
|
40
|
-
"merge",
|
|
41
|
-
"rebase",
|
|
42
|
-
"rebase-merge",
|
|
43
|
-
"squash"
|
|
44
|
-
]);
|
|
45
|
-
const Repo = DeepNullish(z.object({
|
|
46
|
-
id: z.number(),
|
|
47
|
-
allow_fast_forward_only_merge: z.boolean().default(false),
|
|
48
|
-
allow_merge_commits: z.boolean().default(false),
|
|
49
|
-
allow_rebase: z.boolean().default(false),
|
|
50
|
-
allow_rebase_explicit: z.boolean().default(false),
|
|
51
|
-
allow_squash_merge: z.boolean().default(false),
|
|
52
|
-
archived: z.boolean().optional(),
|
|
53
|
-
clone_url: z.string().optional(),
|
|
54
|
-
default_merge_style: PRMergeMethod.optional().catch(void 0),
|
|
55
|
-
external_tracker: z.unknown().optional(),
|
|
56
|
-
has_issues: z.boolean().optional().default(false),
|
|
57
|
-
has_pull_requests: z.boolean().optional(),
|
|
58
|
-
ssh_url: z.string().optional(),
|
|
59
|
-
default_branch: z.string(),
|
|
60
|
-
empty: z.boolean().optional(),
|
|
61
|
-
fork: z.boolean().optional(),
|
|
62
|
-
full_name: z.string(),
|
|
63
|
-
mirror: z.boolean().optional(),
|
|
64
|
-
owner: User,
|
|
65
|
-
permissions: RepoPermission
|
|
66
|
-
}));
|
|
67
|
-
const Label = DeepNullish(z.object({
|
|
68
|
-
id: z.number(),
|
|
69
|
-
name: z.string(),
|
|
70
|
-
description: z.string().optional(),
|
|
71
|
-
color: z.string().optional()
|
|
72
|
-
}));
|
|
73
|
-
const PRState = z.enum([
|
|
74
|
-
"open",
|
|
75
|
-
"closed",
|
|
76
|
-
"all"
|
|
77
|
-
]);
|
|
78
|
-
const IssueState = z.enum([
|
|
79
|
-
"open",
|
|
80
|
-
"closed",
|
|
81
|
-
"all"
|
|
82
|
-
]);
|
|
83
|
-
const PartialRepo = z.object({ full_name: z.string() });
|
|
84
|
-
const PR = DeepNullish(z.object({
|
|
85
|
-
number: z.number(),
|
|
86
|
-
state: PRState,
|
|
87
|
-
title: z.string(),
|
|
88
|
-
body: z.string(),
|
|
89
|
-
mergeable: z.boolean(),
|
|
90
|
-
merged: z.boolean().optional(),
|
|
91
|
-
created_at: z.string(),
|
|
92
|
-
updated_at: z.string(),
|
|
93
|
-
closed_at: z.string().optional(),
|
|
94
|
-
diff_url: z.string().optional(),
|
|
95
|
-
base: z.object({ ref: z.string() }).optional(),
|
|
96
|
-
head: z.object({
|
|
97
|
-
label: z.string(),
|
|
98
|
-
sha: LongCommitSha,
|
|
99
|
-
repo: PartialRepo.optional()
|
|
100
|
-
}).optional(),
|
|
101
|
-
assignee: User.optional(),
|
|
102
|
-
assignees: z.array(User).optional(),
|
|
103
|
-
user: User.optional(),
|
|
104
|
-
labels: z.array(Label).optional()
|
|
105
|
-
}));
|
|
106
|
-
const NullablePR = PR.nullable();
|
|
107
|
-
const PRList = LooseArray(NullablePR);
|
|
108
|
-
const Issue = DeepNullish(z.object({
|
|
109
|
-
number: z.number(),
|
|
110
|
-
state: IssueState.optional(),
|
|
111
|
-
title: z.string(),
|
|
112
|
-
body: z.string(),
|
|
113
|
-
assignees: z.array(User).optional(),
|
|
114
|
-
labels: z.array(Label).optional()
|
|
115
|
-
}));
|
|
116
|
-
const Comment = z.object({
|
|
117
|
-
id: z.number(),
|
|
118
|
-
body: z.string()
|
|
119
|
-
});
|
|
120
|
-
const CommitStatusType = z.enum([
|
|
121
|
-
"pending",
|
|
122
|
-
"success",
|
|
123
|
-
"error",
|
|
124
|
-
"failure",
|
|
125
|
-
"warning",
|
|
126
|
-
"unknown"
|
|
127
|
-
]).catch("unknown");
|
|
128
|
-
const CommitStatus = DeepNullish(z.object({
|
|
129
|
-
id: z.number(),
|
|
130
|
-
status: CommitStatusType,
|
|
131
|
-
context: z.string(),
|
|
132
|
-
description: z.string().optional(),
|
|
133
|
-
target_url: z.string().optional(),
|
|
134
|
-
created_at: z.string()
|
|
135
|
-
}));
|
|
136
|
-
const Commit = z.object({ id: z.string() });
|
|
137
|
-
z.object({
|
|
138
|
-
name: z.string(),
|
|
139
|
-
commit: Commit
|
|
140
|
-
});
|
|
141
|
-
const RepoSearchResults = z.object({
|
|
142
|
-
ok: z.boolean(),
|
|
143
|
-
data: z.array(Repo)
|
|
144
|
-
});
|
|
145
|
-
const Version = z.object({ version: z.string() });
|
|
146
|
-
//#endregion
|
|
147
|
-
export { Comment, Commit, CommitStatus, CommitStatusType, ContentsListResponse, Issue, IssueState, Label, NullablePR, PR, PRList, PRMergeMethod, PRState, Repo, RepoContents, RepoPermission, RepoSearchResults, User, Version };
|
|
148
|
-
|
|
149
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/platform/forgejo/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LongCommitSha } from '../../../util/schema-utils/git.ts';\nimport {\n DeepNullish,\n EmailAddress,\n LooseArray,\n} from '../../../util/schema-utils/index.ts';\nimport { fromBase64 } from '../../../util/string.ts';\n\nconst ContentsCommon = z.object({\n name: z.string(),\n path: z.string(),\n});\n\nconst ContentsFile = ContentsCommon.extend({\n type: z.literal('file'),\n content: z.string().nullable(),\n}).transform((input) => ({\n ...input,\n contentString: input.content ? fromBase64(input.content) : '',\n}));\n\nconst ContentsDir = ContentsCommon.extend({ type: z.literal('dir') });\nconst ContentsSymlink = ContentsCommon.extend({ type: z.literal('symlink') });\nconst ContentsSubmodule = ContentsCommon.extend({\n type: z.literal('submodule'),\n});\n\nexport const RepoContents = z.discriminatedUnion('type', [\n ContentsFile,\n ContentsDir,\n ContentsSymlink,\n ContentsSubmodule,\n]);\nexport type RepoContents = z.infer<typeof RepoContents>;\n\nexport const ContentsListResponse = z.array(RepoContents);\n\nexport const User = DeepNullish(\n z.object({\n id: z.number(),\n // catch empty strings which are returned if an organization has no email\n email: EmailAddress.optional().catch(undefined),\n full_name: z.string().optional(),\n login: z.string(),\n }),\n);\nexport type User = z.infer<typeof User>;\n\nexport const RepoPermission = z.object({\n admin: z.boolean(),\n pull: z.boolean(),\n push: z.boolean(),\n});\nexport type RepoPermission = z.infer<typeof RepoPermission>;\n\nexport const PRMergeMethod = z.enum([\n 'fast-forward-only',\n 'merge',\n 'rebase',\n 'rebase-merge',\n 'squash',\n]);\nexport type PRMergeMethod = z.infer<typeof PRMergeMethod>;\n\n// Lenient Repo schema - only validates fields Renovate reads, most are optional\nexport const Repo = DeepNullish(\n z.object({\n id: z.number(),\n allow_fast_forward_only_merge: z.boolean().default(false),\n allow_merge_commits: z.boolean().default(false),\n allow_rebase: z.boolean().default(false),\n allow_rebase_explicit: z.boolean().default(false),\n allow_squash_merge: z.boolean().default(false),\n archived: z.boolean().optional(),\n clone_url: z.string().optional(),\n // catch unknown merge methods e.g. `manually-merged`\n default_merge_style: PRMergeMethod.optional().catch(undefined),\n external_tracker: z.unknown().optional(),\n has_issues: z.boolean().optional().default(false),\n has_pull_requests: z.boolean().optional(),\n ssh_url: z.string().optional(),\n default_branch: z.string(),\n empty: z.boolean().optional(),\n fork: z.boolean().optional(),\n full_name: z.string(),\n mirror: z.boolean().optional(),\n owner: User,\n permissions: RepoPermission,\n }),\n);\nexport type Repo = z.infer<typeof Repo>;\n\nexport const Label = DeepNullish(\n z.object({\n id: z.number(),\n name: z.string(),\n description: z.string().optional(),\n color: z.string().optional(),\n }),\n);\nexport type Label = z.infer<typeof Label>;\n\nexport const PRState = z.enum(['open', 'closed', 'all']);\nexport type PRState = z.infer<typeof PRState>;\n\nexport const IssueState = z.enum(['open', 'closed', 'all']);\nexport type IssueState = z.infer<typeof IssueState>;\n\n// Lenient partial repo schema for embedded repo references in PRs (only full_name is read)\nconst PartialRepo = z.object({\n full_name: z.string(),\n});\n\nexport const PR = DeepNullish(\n z.object({\n number: z.number(),\n state: PRState,\n title: z.string(),\n body: z.string(),\n mergeable: z.boolean(),\n merged: z.boolean().optional(),\n created_at: z.string(),\n updated_at: z.string(),\n closed_at: z.string().optional(),\n diff_url: z.string().optional(),\n base: z\n .object({\n ref: z.string(),\n })\n .optional(),\n head: z\n .object({\n label: z.string(),\n sha: LongCommitSha,\n repo: PartialRepo.optional(),\n })\n .optional(),\n assignee: User.optional(),\n assignees: z.array(User).optional(),\n user: User.optional(),\n labels: z.array(Label).optional(),\n }),\n);\nexport type PR = z.infer<typeof PR>;\n\n// TODO remove when the TEMPORARY_ERROR in pr-cache.ts is no longer needed\nexport const NullablePR = PR.nullable();\n\nexport const PRList = LooseArray(NullablePR);\n\nexport const Issue = DeepNullish(\n z.object({\n number: z.number(),\n state: IssueState.optional(),\n title: z.string(),\n body: z.string(),\n assignees: z.array(User).optional(),\n labels: z.array(Label).optional(),\n }),\n);\nexport type Issue = z.infer<typeof Issue>;\n\nexport const Comment = z.object({\n id: z.number(),\n body: z.string(),\n});\nexport type Comment = z.infer<typeof Comment>;\n\nexport const CommitStatusType = z\n .enum(['pending', 'success', 'error', 'failure', 'warning', 'unknown'])\n .catch('unknown');\nexport type CommitStatusType = z.infer<typeof CommitStatusType>;\n\nexport const CommitStatus = DeepNullish(\n z.object({\n id: z.number(),\n status: CommitStatusType,\n context: z.string(),\n description: z.string().optional(),\n target_url: z.string().optional(),\n created_at: z.string(),\n }),\n);\nexport type CommitStatus = z.infer<typeof CommitStatus>;\n\nexport const Commit = z.object({\n id: z.string(),\n});\nexport type Commit = z.infer<typeof Commit>;\n\nexport const Branch = z.object({\n name: z.string(),\n commit: Commit,\n});\nexport type Branch = z.infer<typeof Branch>;\n\nexport const RepoSearchResults = z.object({\n ok: z.boolean(),\n data: z.array(Repo),\n});\n\nexport const Version = z.object({\n version: z.string(),\n});\n"],"mappings":"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"}
|