import {z} from 'zod' export type GetApiV1AppsAppsIdServicesServicesIdVersionsArgs = {appsId: string, servicesId: string, pageSize?: number | undefined, pageToken?: string | undefined, view?: ('BASIC' | 'FULL') | undefined}; export type GetApiV1AppsAppsIdServicesServicesIdVersionsOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const apiConfigHandler = z.object({authFailAction: z.enum(["AUTH_FAIL_ACTION_UNSPECIFIED", "AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]).optional(), login: z.enum(["LOGIN_UNSPECIFIED", "LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]).optional(), script: z.string().optional(), securityLevel: z.enum(["SECURE_UNSPECIFIED", "SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]).optional(), url: z.string().optional()}); export const cpuUtilization = z.object({aggregationWindowLength: z.string().optional(), targetUtilization: z.number().optional()}); export const diskUtilization = z.object({targetReadBytesPerSecond: z.number().int().optional(), targetReadOpsPerSecond: z.number().int().optional(), targetWriteBytesPerSecond: z.number().int().optional(), targetWriteOpsPerSecond: z.number().int().optional()}); export const networkUtilization = z.object({targetReceivedBytesPerSecond: z.number().int().optional(), targetReceivedPacketsPerSecond: z.number().int().optional(), targetSentBytesPerSecond: z.number().int().optional(), targetSentPacketsPerSecond: z.number().int().optional()}); export const requestUtilization = z.object({targetConcurrentRequests: z.number().int().optional(), targetRequestCountPerSecond: z.number().int().optional()}); export const standardSchedulerSettings = z.object({maxInstances: z.number().int().optional(), minInstances: z.number().int().optional(), targetCpuUtilization: z.number().optional(), targetThroughputUtilization: z.number().optional()}); export const automaticScaling = z.object({coolDownPeriod: z.string().optional(), cpuUtilization: cpuUtilization.optional(), diskUtilization: diskUtilization.optional(), maxConcurrentRequests: z.number().int().optional(), maxIdleInstances: z.number().int().optional(), maxPendingLatency: z.string().optional(), maxTotalInstances: z.number().int().optional(), minIdleInstances: z.number().int().optional(), minPendingLatency: z.string().optional(), minTotalInstances: z.number().int().optional(), networkUtilization: networkUtilization.optional(), requestUtilization: requestUtilization.optional(), standardSchedulerSettings: standardSchedulerSettings.optional()}); export const basicScaling = z.object({idleTimeout: z.string().optional(), maxInstances: z.number().int().optional()}); export const cloudBuildOptions = z.object({appYamlPath: z.string().optional(), cloudBuildTimeout: z.string().optional()}); export const containerInfo = z.object({image: z.string().optional()}); export const fileInfo = z.object({mimeType: z.string().optional(), sha1Sum: z.string().optional(), sourceUrl: z.string().optional()}); export const zipInfo = z.object({filesCount: z.number().int().optional(), sourceUrl: z.string().optional()}); export const deployment = z.object({cloudBuildOptions: cloudBuildOptions.optional(), container: containerInfo.optional(), files: z.record(z.string(), fileInfo).optional(), zip: zipInfo.optional()}); export const endpointsApiService = z.object({configId: z.string().optional(), disableTraceSampling: z.boolean().optional(), name: z.string().optional(), rolloutStrategy: z.enum(["UNSPECIFIED_ROLLOUT_STRATEGY", "FIXED", "MANAGED"]).optional()}); export const entrypoint = z.object({shell: z.string().optional()}); export const errorHandler = z.object({errorCode: z.enum(["ERROR_CODE_UNSPECIFIED", "ERROR_CODE_DEFAULT", "ERROR_CODE_OVER_QUOTA", "ERROR_CODE_DOS_API_DENIAL", "ERROR_CODE_TIMEOUT"]).optional(), mimeType: z.string().optional(), staticFile: z.string().optional()}); export const flexibleRuntimeSettings = z.object({operatingSystem: z.string().optional(), runtimeVersion: z.string().optional()}); export const apiEndpointHandler = z.object({scriptPath: z.string().optional()}); export const scriptHandler = z.object({scriptPath: z.string().optional()}); export const staticFilesHandler = z.object({applicationReadable: z.boolean().optional(), expiration: z.string().optional(), httpHeaders: z.record(z.string(), z.string()).optional(), mimeType: z.string().optional(), path: z.string().optional(), requireMatchingFile: z.boolean().optional(), uploadPathRegex: z.string().optional()}); export const urlMap = z.object({apiEndpoint: apiEndpointHandler.optional(), authFailAction: z.enum(["AUTH_FAIL_ACTION_UNSPECIFIED", "AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]).optional(), login: z.enum(["LOGIN_UNSPECIFIED", "LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]).optional(), redirectHttpResponseCode: z.enum(["REDIRECT_HTTP_RESPONSE_CODE_UNSPECIFIED", "REDIRECT_HTTP_RESPONSE_CODE_301", "REDIRECT_HTTP_RESPONSE_CODE_302", "REDIRECT_HTTP_RESPONSE_CODE_303", "REDIRECT_HTTP_RESPONSE_CODE_307"]).optional(), script: scriptHandler.optional(), securityLevel: z.enum(["SECURE_UNSPECIFIED", "SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]).optional(), staticFiles: staticFilesHandler.optional(), urlRegex: z.string().optional()}); export const healthCheck = z.object({checkInterval: z.string().optional(), disableHealthCheck: z.boolean().optional(), healthyThreshold: z.number().int().optional(), host: z.string().optional(), restartThreshold: z.number().int().optional(), timeout: z.string().optional(), unhealthyThreshold: z.number().int().optional()}); export const library = z.object({name: z.string().optional(), version: z.string().optional()}); export const livenessCheck = z.object({checkInterval: z.string().optional(), failureThreshold: z.number().int().optional(), host: z.string().optional(), initialDelay: z.string().optional(), path: z.string().optional(), successThreshold: z.number().int().optional(), timeout: z.string().optional()}); export const manualScaling = z.object({instances: z.number().int().optional()}); export const network = z.object({forwardedPorts: z.array(z.string()).optional(), instanceIpMode: z.enum(["INSTANCE_IP_MODE_UNSPECIFIED", "EXTERNAL", "INTERNAL"]).optional(), instanceTag: z.string().optional(), name: z.string().optional(), sessionAffinity: z.boolean().optional(), subnetworkName: z.string().optional()}); export const readinessCheck = z.object({appStartTimeout: z.string().optional(), checkInterval: z.string().optional(), failureThreshold: z.number().int().optional(), host: z.string().optional(), path: z.string().optional(), successThreshold: z.number().int().optional(), timeout: z.string().optional()}); export const volume = z.object({name: z.string().optional(), sizeGb: z.number().optional(), volumeType: z.string().optional()}); export const resources = z.object({cpu: z.number().optional(), diskGb: z.number().optional(), kmsKeyReference: z.string().optional(), memoryGb: z.number().optional(), volumes: z.array(volume).optional()}); export const vpcNetworkInterface = z.object({network: z.string().optional(), subnet: z.string().optional(), tags: z.array(z.string()).optional()}); export const vpcAccess = z.object({networkInterfaces: z.array(vpcNetworkInterface).optional(), vpcEgress: z.enum(["VPC_EGRESS_UNSPECIFIED", "ALL_TRAFFIC", "PRIVATE_IP_RANGES"]).optional()}); export const vpcAccessConnector = z.object({egressSetting: z.enum(["EGRESS_SETTING_UNSPECIFIED", "ALL_TRAFFIC", "PRIVATE_IP_RANGES"]).optional(), name: z.string().optional()}); export const version = z.object({apiConfig: apiConfigHandler.optional(), appEngineApis: z.boolean().optional(), appEngineBundledServices: z.array(z.enum(["BUNDLED_SERVICE_TYPE_UNSPECIFIED", "BUNDLED_SERVICE_TYPE_APP_IDENTITY_SERVICE", "BUNDLED_SERVICE_TYPE_BLOBSTORE", "BUNDLED_SERVICE_TYPE_CAPABILITY_SERVICE", "BUNDLED_SERVICE_TYPE_DATASTORE_V3", "BUNDLED_SERVICE_TYPE_DEFERRED", "BUNDLED_SERVICE_TYPE_IMAGES", "BUNDLED_SERVICE_TYPE_MAIL", "BUNDLED_SERVICE_TYPE_MEMCACHE", "BUNDLED_SERVICE_TYPE_MODULES", "BUNDLED_SERVICE_TYPE_NAMESPACES", "BUNDLED_SERVICE_TYPE_NDB", "BUNDLED_SERVICE_TYPE_SEARCH", "BUNDLED_SERVICE_TYPE_TASKQUEUES", "BUNDLED_SERVICE_TYPE_URLFETCH", "BUNDLED_SERVICE_TYPE_USERS"])).optional(), automaticScaling: automaticScaling.optional(), basicScaling: basicScaling.optional(), betaSettings: z.record(z.string(), z.string()).optional(), buildEnvVariables: z.record(z.string(), z.string()).optional(), createTime: z.string().optional(), createdBy: z.string().optional(), defaultExpiration: z.string().optional(), deployment: deployment.optional(), diskUsageBytes: z.string().optional(), endpointsApiService: endpointsApiService.optional(), entrypoint: entrypoint.optional(), env: z.string().optional(), envVariables: z.record(z.string(), z.string()).optional(), errorHandlers: z.array(errorHandler).optional(), flexibleRuntimeSettings: flexibleRuntimeSettings.optional(), generatedCustomerMetadata: z.record(z.string(), z.unknown()).optional(), handlers: z.array(urlMap).optional(), healthCheck: healthCheck.optional(), id: z.string().optional(), inboundServices: z.array(z.enum(["INBOUND_SERVICE_UNSPECIFIED", "INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"])).optional(), instanceClass: z.string().optional(), libraries: z.array(library).optional(), livenessCheck: livenessCheck.optional(), manualScaling: manualScaling.optional(), name: z.string().optional(), network: network.optional(), nobuildFilesRegex: z.string().optional(), readinessCheck: readinessCheck.optional(), resources: resources.optional(), runtime: z.string().optional(), runtimeApiVersion: z.string().optional(), runtimeChannel: z.string().optional(), runtimeMainExecutablePath: z.string().optional(), serviceAccount: z.string().optional(), servingStatus: z.enum(["SERVING_STATUS_UNSPECIFIED", "SERVING", "STOPPED"]).optional(), threadsafe: z.boolean().optional(), versionUrl: z.string().optional(), vm: z.boolean().optional(), vpcAccess: vpcAccess.optional(), vpcAccessConnector: vpcAccessConnector.optional(), zones: z.array(z.string()).optional()}); export const listVersionsResponse = z.object({nextPageToken: z.string().optional(), versions: z.array(version).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 }; /** * Lists the versions of a service. * * GET /v1/apps/{appsId}/services/{servicesId}/versions * * Also accepts auth: Oauth2 + Oauth2c, Oauth2 + Oauth2c */ export const getApiV1AppsAppsIdServicesServicesIdVersions = async (args: GetApiV1AppsAppsIdServicesServicesIdVersionsArgs, options?: GetApiV1AppsAppsIdServicesServicesIdVersionsOptions) => { const {baseUrl = "https://appengine.googleapis.com", fetch: fetchFn = fetch, Oauth2, Oauth2c} = 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.pageToken != null) query.append("pageToken", String(args.pageToken)) if (args.view != null) query.append("view", String(args.view)) if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) if (Oauth2c !== undefined) headers.set('authorization', `Bearer ${Oauth2c}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/apps/${encodeURIComponent(String(args.appsId))}/services/${encodeURIComponent(String(args.servicesId))}/versions${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(listVersionsResponse, await res.json()) };