import {z} from 'zod' export type GetApiProjectsProjectIdSettingsArgs = {projectId: string}; export type GetApiProjectsProjectIdSettingsOptions = {baseUrl?: string | undefined, OAuth2?: string | undefined, fetch?: typeof fetch | undefined}; export const projectSettings = z.object({initialize: z.object({}), product_name: z.string(), product_code: z.string(), ui_uri_template: z.string(), variables_prefix: z.string(), bot_email: z.string(), application_config_file: z.string(), project_config_dir: z.string(), use_drupal_defaults: z.boolean(), use_legacy_subdomains: z.boolean(), development_service_size: z.enum(["2XL", "4XL", "L", "M", "S", "XL"]), development_application_size: z.enum(["2XL", "4XL", "L", "M", "S", "XL"]), enable_certificate_provisioning: z.boolean(), certificate_style: z.enum(["ecdsa", "rsa"]), certificate_renewal_activity: z.boolean(), development_domain_template: z.string().nullable(), enable_state_api_deployments: z.boolean(), temporary_disk_size: z.number().int().nullable(), local_disk_size: z.number().int().nullable(), cron_minimum_interval: z.number().int(), cron_maximum_jitter: z.number().int(), cron_production_expiry_interval: z.number().int(), cron_non_production_expiry_interval: z.number().int(), concurrency_limits: z.record(z.string(), z.number().int().nullable()), flexible_build_cache: z.boolean(), strict_configuration: z.boolean(), has_sleepy_crons: z.boolean(), crons_in_git: z.boolean(), custom_error_template: z.string().nullable(), app_error_page_template: z.string().nullable(), environment_name_strategy: z.enum(["hash", "name-and-hash"]), data_retention: z.record(z.string(), z.object({max_backups: z.number().int(), default_config: z.object({manual_count: z.number().int(), schedule: z.array(z.object({interval: z.string(), count: z.number().int()}))})})).nullable(), enable_codesource_integration_push: z.boolean(), enforce_mfa: z.boolean(), systemd: z.boolean(), router_gen2: z.boolean(), build_resources: z.object({cpu: z.number(), memory: z.number().int()}), outbound_restrictions_default_policy: z.enum(["allow", "deny"]), self_upgrade: z.boolean(), self_upgrade_latest_major: z.boolean(), additional_hosts: z.record(z.string(), z.string()), max_allowed_routes: z.number().int(), max_allowed_redirects_paths: z.number().int(), enable_incremental_backups: z.boolean(), sizing_api_enabled: z.boolean(), enable_cache_grace_period: z.boolean(), enable_zero_downtime_deployments: z.boolean(), enable_admin_agent: z.boolean(), certifier_url: z.string(), centralized_permissions: z.boolean(), glue_server_max_request_size: z.number().int(), persistent_endpoints_ssh: z.boolean(), persistent_endpoints_ssl_certificates: z.boolean(), enable_disk_health_monitoring: z.boolean(), enable_paused_environments: z.boolean(), enable_unified_configuration: z.boolean(), enable_routes_tracing: z.boolean(), image_deployment_validation: z.boolean(), support_generic_images: z.boolean(), enable_github_app_token_exchange: z.boolean(), continuous_profiling: z.object({supported_runtimes: z.array(z.string())}), disable_agent_error_reporter: z.boolean(), requires_domain_ownership: z.boolean(), enable_guaranteed_resources: z.boolean(), git_server: z.object({push_size_hard_limit: z.number().int()}), activity_logs_max_size: z.number().int(), allow_manual_deployments: z.boolean(), allow_rolling_deployments: z.boolean(), allow_burst: z.boolean(), router_resources: z.object({baseline_cpu: z.number(), baseline_memory: z.number().int(), max_cpu: z.number(), max_memory: z.number().int()})}); 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 }; /** * Get list of project settings * * GET /projects/{projectId}/settings */ export const getApiProjectsProjectIdSettings = async (args: GetApiProjectsProjectIdSettingsArgs, options?: GetApiProjectsProjectIdSettingsOptions) => { const {baseUrl = "https://api.upsun.com", fetch: fetchFn = fetch, OAuth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (OAuth2 !== undefined) headers.set('authorization', `Bearer ${OAuth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/projects/${encodeURIComponent(String(args.projectId))}/settings${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(projectSettings, await res.json()) };