import {z} from 'zod' export type GetApiGoalTemplatesIdOptions = {baseUrl: string, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const pullRequestMetricID = z.enum(["pr-wip-time", "pr-wip-time-below-threshold-ratio", "pr-wip-count", "pr-wip-count-q", "pr-review-time", "pr-review-count", "pr-review-count-q", "pr-review-time-below-threshold-ratio", "pr-merging-time", "pr-merging-time-below-threshold-ratio", "pr-merging-count", "pr-merging-count-q", "pr-release-time", "pr-release-count", "pr-release-count-q", "pr-open-time", "pr-open-count", "pr-open-count-q", "pr-open-time-below-threshold-ratio", "pr-lead-time", "pr-lead-time-below-threshold-ratio", "pr-lead-count", "pr-lead-count-q", "pr-cycle-time", "pr-cycle-time-below-threshold-ratio", "pr-cycle-count", "pr-cycle-count-q", "pr-live-cycle-time", "pr-live-cycle-count", "pr-live-cycle-count-q", "pr-all-count", "pr-wait-first-review-time", "pr-wait-first-review-count", "pr-wait-first-review-count-q", "pr-wait-first-review-time-below-threshold-ratio", "pr-deployment-time", "pr-deployment-count", "pr-deployment-count-q", "pr-lead-deployment-time", "pr-lead-deployment-count", "pr-lead-deployment-count-q", "pr-cycle-deployment-time", "pr-cycle-deployment-count", "pr-cycle-deployment-count-q", "pr-cycle-deployment-time-below-threshold-ratio", "pr-flow-ratio", "pr-opened", "pr-reviewed", "pr-reviewed-closed", "pr-not-reviewed", "pr-reviewed-ratio", "pr-merged", "pr-rejected", "pr-closed", "pr-done", "pr-size", "pr-size-below-threshold-ratio", "pr-median-size", "pr-wip-pending-count", "pr-review-pending-count", "pr-merging-pending-count", "pr-release-pending-count", "pr-opened-mapped-to-jira", "pr-done-mapped-to-jira", "pr-all-mapped-to-jira", "pr-participants-per", "pr-review-comments-per", "pr-review-comments-per-above-threshold-ratio", "pr-reviews-per", "pr-comments-per"]); export const jIRAMetricID = z.enum(["jira-open", "jira-resolved", "jira-raised", "jira-acknowledged", "jira-acknowledged-q", "jira-life-time", "jira-life-time-below-threshold-ratio", "jira-lead-time", "jira-lead-time-below-threshold-ratio", "jira-acknowledge-time", "jira-acknowledge-time-below-threshold-ratio", "jira-pr-lag-time", "jira-backlog-time", "jira-resolution-rate"]); export const releaseMetricID = z.enum(["release-count", "release-tag-count", "release-branch-count", "release-prs", "release-tag-prs", "release-branch-prs", "release-commits", "release-tag-commits", "release-branch-commits", "release-lines", "release-tag-lines", "release-branch-lines", "release-avg-prs", "release-tag-avg-prs", "release-branch-avg-prs", "release-avg-commits", "release-tag-avg-commits", "release-branch-avg-commits", "release-avg-lines", "release-tag-avg-lines", "release-branch-avg-lines", "release-age", "release-tag-age", "release-branch-age", "release-time-to-deploy"]); export const timeDuration = z.string(); export const goalMetricParams = z.object({threshold: z.union([z.number(), timeDuration]).optional()}); export const goalTemplateName = z.string().min(1); export const repositoryID = z.string(); export const repositorySet = z.array(repositoryID); export const goalTemplate = z.object({available: z.boolean(), id: z.number().int(), metric: z.union([pullRequestMetricID, jIRAMetricID, releaseMetricID]), metric_params: goalMetricParams.optional(), name: goalTemplateName, repositories: repositorySet.optional()}); export const goalTemplateList = z.array(goalTemplate); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List the goal templates for the account. * * GET /goal_templates/{id} * * Also accepts auth: apiKeyAuth */ export const getApiGoalTemplatesId = async (options: GetApiGoalTemplatesIdOptions) => { const {baseUrl, fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/goal_templates/${encodeURIComponent(String(args.id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(goalTemplateList, await res.json()) };