/
schema.ts
76 lines (69 loc) · 1.91 KB
/
schema.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { z } from 'zod';
import { logger } from '../../../logger';
import { LooseArray } from '../../../util/schema-utils';
const BitbucketSourceTypeSchema = z.enum(['commit_directory', 'commit_file']);
const SourceResultsSchema = z.object({
path: z.string(),
type: BitbucketSourceTypeSchema,
commit: z.object({
hash: z.string(),
}),
});
const PagedSchema = z.object({
page: z.number().optional(),
pagelen: z.number(),
size: z.number().optional(),
next: z.string().optional(),
});
export const PagedSourceResultsSchema = PagedSchema.extend({
values: z.array(SourceResultsSchema),
});
export const RepoInfo = z
.object({
parent: z.unknown().optional().catch(undefined),
mainbranch: z.object({
name: z.string(),
}),
has_issues: z.boolean().catch(() => {
logger.once.warn('Bitbucket: "has_issues" field missing from repo info');
return false;
}),
uuid: z.string(),
full_name: z
.string()
.regex(
/^[^/]+\/[^/]+$/,
'Expected repository full_name to be in the format "owner/repo"',
),
is_private: z.boolean().catch(() => {
logger.once.warn('Bitbucket: "is_private" field missing from repo info');
return true;
}),
project: z
.object({
name: z.string(),
})
.nullable()
.catch(null),
})
.transform((repoInfoBody) => {
const isFork = !!repoInfoBody.parent;
const [owner, name] = repoInfoBody.full_name.split('/');
return {
isFork,
owner,
name,
mainbranch: repoInfoBody.mainbranch.name,
mergeMethod: 'merge',
has_issues: repoInfoBody.has_issues,
uuid: repoInfoBody.uuid,
is_private: repoInfoBody.is_private,
projectName: repoInfoBody.project?.name,
};
});
export type RepoInfo = z.infer<typeof RepoInfo>;
export const Repositories = z
.object({
values: LooseArray(RepoInfo),
})
.transform((body) => body.values);