import {z} from 'zod' export type GetApiAppAppIdChannelChannelIdReleasesArgs = {app_id: string, channel_id: string, pageSize?: number | undefined, currentPage?: number | undefined, sortColumn?: string | undefined, sortDesc?: boolean | undefined, excludeDemoted?: boolean | undefined, includeSecuritySummary?: boolean | undefined, versionLabel?: string | undefined, includeInstallerImages?: ('online' | 'airgap') | undefined}; export type GetApiAppAppIdChannelChannelIdReleasesOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const actor = z.object({description: z.string().optional(), id: z.string().optional(), link: z.string().optional(), timestamp: z.string().optional(), type: z.string().optional()}); export const vulnCounts = z.object({critical: z.number().int().optional(), high: z.number().int().optional(), low: z.number().int().optional(), medium: z.number().int().optional(), total: z.number().int().optional()}); export const imageVulnCounts = z.object({counts: vulnCounts.optional(), digest: z.string().optional(), digest_first_seen_at: z.string().optional(), fixed_counts: vulnCounts.optional(), image_size_bytes: z.number().int().optional(), input: z.string().optional(), installation_phase: z.string().optional(), last_scanned_at: z.string().optional(), not_found: z.boolean().optional(), sbom_status: z.string().optional(), sbom_status_message: z.string().optional(), sbom_status_updated_at: z.string().optional(), scan_status: z.string().optional(), scan_status_message: z.string().optional(), scan_status_updated_at: z.string().optional(), scanned_images: z.number().int().optional(), total_images: z.number().int().optional()}); export const installerTypeEmbeddedCluster = z.object({proxyRegistryDomain: z.string().optional(), replicatedAppDomain: z.string().optional(), replicatedRegistryDomain: z.string().optional(), version: z.string().optional()}); export const installerTypeHelm = z.object({}); export const helmUnavailableResource = z.object({filePath: z.string().optional(), identifier: z.string().optional(), kind: z.string().optional(), name: z.string().optional()}); export const helmInstallabilityIssue = z.object({message: z.string().optional(), resources: z.array(helmUnavailableResource).optional()}); export const installerTypeKots = z.object({minKotsVersion: z.string().optional(), targetKotsVersion: z.string().optional()}); export const installerTypeKotsConfig = z.object({apiVersion: z.string().optional()}); export const installationTypeKurl = z.object({installerVersion: z.string().optional()}); export const installerTypePreflight = z.object({apiVersion: z.string().optional()}); export const installerTypeReplicatedSDK = z.object({sdkVersion: z.string().optional()}); export const installerTypeSupportBundle = z.object({apiVersion: z.string().optional()}); export const installationTypes = z.object({embeddedCluster: installerTypeEmbeddedCluster.optional(), helm: installerTypeHelm.optional(), helmInstallabilityIssue: helmInstallabilityIssue.optional(), kots: installerTypeKots.optional(), kotsConfig: installerTypeKotsConfig.optional(), kurl: installationTypeKurl.optional(), preflight: installerTypePreflight.optional(), replicatedSDK: installerTypeReplicatedSDK.optional(), supportBundle: installerTypeSupportBundle.optional()}); export const lintExpression = z.object({message: z.string().optional(), path: z.string().optional(), rule: z.string().optional(), type: z.string().optional()}); export const lintResult = z.object({isLintingComplete: z.boolean().optional(), lintError: z.string().optional(), lintExpressions: z.array(lintExpression).optional()}); export const kotsChannelRelease = z.object({airgapBuildError: z.string().optional(), airgapBuildStatus: z.string().optional(), airgapBundleImages: z.array(z.string()).optional(), channelIcon: z.string().optional(), channelId: z.string().optional(), channelName: z.string().optional(), channelSequence: z.number().int().optional(), created: z.string().optional(), createdBy: actor.optional(), customResourceError: z.string().optional(), customResourceWarnings: z.array(z.string()).optional(), demotedAt: z.string().optional(), embeddedClusterVersion: z.string().optional(), fullAirgapBuild: z.boolean().optional(), hasECInstaller: z.boolean().optional(), hasKurlInstaller: z.boolean().optional(), imageSecurityInfo: z.array(imageVulnCounts).optional(), imageSecuritySums: z.record(z.string(), imageVulnCounts).optional(), installationTypes: installationTypes.optional(), isDemoted: z.boolean().optional(), isRequired: z.boolean().optional(), kurlInstallerID: z.string().optional(), lintResult: lintResult.optional(), proxyRegistryDomain: z.string().optional(), registrySecret: z.string().optional(), releaseNotes: z.string().optional(), releasedAt: z.string().optional(), replicatedRegistryDomain: z.string().optional(), semver: z.string().optional(), sequence: z.number().int().optional(), updated: z.string().optional(), updatedBy: actor.optional()}); export const getApiAppAppIdChannelChannelIdReleasesResponse = z.object({matchedCount: z.number().int().optional(), releases: z.array(kotsChannelRelease).optional()}); 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 releases for an app channel. * * GET /app/{app_id}/channel/{channel_id}/releases */ export const getApiAppAppIdChannelChannelIdReleases = async (args: GetApiAppAppIdChannelChannelIdReleasesArgs, options?: GetApiAppAppIdChannelChannelIdReleasesOptions) => { const {baseUrl = "https://api.replicated.com/vendor/v3", fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.currentPage != null) query.append("currentPage", String(args.currentPage)) if (args.sortColumn != null) query.append("sortColumn", String(args.sortColumn)) if (args.sortDesc != null) query.append("sortDesc", String(args.sortDesc)) if (args.excludeDemoted != null) query.append("excludeDemoted", String(args.excludeDemoted)) if (args.includeSecuritySummary != null) query.append("includeSecuritySummary", String(args.includeSecuritySummary)) if (args.versionLabel != null) query.append("versionLabel", String(args.versionLabel)) if (args.includeInstallerImages != null) query.append("includeInstallerImages", String(args.includeInstallerImages)) if (apiKey !== undefined) headers.set("Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/app/${encodeURIComponent(String(args.app_id))}/channel/${encodeURIComponent(String(args.channel_id))}/releases${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(getApiAppAppIdChannelChannelIdReleasesResponse, await res.json()) };