diff --git a/.stats.yml b/.stats.yml index 031a738..c57d3dc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ configured_endpoints: 111 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-a058dd6f8c83b32adb6f30bae2db8295468b8ffc391342a960ec6f393c50b83e.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-988164042da1361feb3d28364c6f14fee775ceab496b9d79d048141c0fa6da19.yml diff --git a/src/resources/accounts.ts b/src/resources/accounts.ts index 8695351..abd7aac 100644 --- a/src/resources/accounts.ts +++ b/src/resources/accounts.ts @@ -52,9 +52,7 @@ export class Accounts extends APIResource { export type LoginProvidersLoginProvidersPage = LoginProvidersPage; export interface Account { - id?: string; - - avatarUrl?: string; + id: string; /** * A Timestamp represents a point in time independent of any time zone or local @@ -146,27 +144,17 @@ export interface Account { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - createdAt?: string; - - email?: string; - - joinables?: Array; - - memberships?: Array; + createdAt: string; - name?: string; + email: string; - /** - * organization_id is the ID of the organization the account is owned by if it's - * created through custom SSO - */ - organizationId?: string | null; + name: string; /** * public_email_provider is true if the email for the Account matches a known * public email provider */ - publicEmailProvider?: boolean; + publicEmailProvider: boolean; /** * A Timestamp represents a point in time independent of any time zone or local @@ -258,70 +246,82 @@ export interface Account { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - updatedAt?: string; + updatedAt: string; + + avatarUrl?: string; + + joinables?: Array; + + memberships?: Array; + + /** + * organization_id is the ID of the organization the account is owned by if it's + * created through custom SSO + */ + organizationId?: string | null; } export interface AccountMembership { /** * organization_id is the id of the organization the user is a member of */ - organizationId?: string; + organizationId: string; /** * organization_name is the member count of the organization the user is a member * of */ - organizationMemberCount?: number; + organizationMemberCount: number; /** * organization_name is the name of the organization the user is a member of */ - organizationName?: string; + organizationName: string; /** * user_id is the ID the user has in the organization */ - userId?: string; + userId: string; /** * user_role is the role the user has in the organization */ - userRole?: Shared.OrganizationRole; + userRole: Shared.OrganizationRole; } export interface JoinableOrganization { /** * organization_id is the id of the organization the user can join */ - organizationId?: string; + organizationId: string; /** * organization_member_count is the member count of the organization the user can * join */ - organizationMemberCount?: number; + organizationMemberCount: number; /** * organization_name is the name of the organization the user can join */ - organizationName?: string; + organizationName: string; } export interface LoginProvider { /** * login_url is the URL to redirect the browser agent to for login */ - loginUrl?: string; + loginUrl: string; /** * provider is the provider used by this login method, e.g. "github", "google", * "custom" */ - provider?: string; + provider: string; } export interface AccountRetrieveResponse { - account?: Account; + account: Account; } export type AccountDeleteResponse = unknown; @@ -330,7 +330,7 @@ export interface AccountGetSSOLoginURLResponse { /** * login_url is the URL to redirect the user to for SSO login */ - loginUrl?: string; + loginUrl: string; } export interface AccountRetrieveParams { @@ -338,14 +338,14 @@ export interface AccountRetrieveParams { } export interface AccountDeleteParams { - accountId?: string; + accountId: string; } export interface AccountGetSSOLoginURLParams { /** * email is the email the user wants to login with */ - email?: string; + email: string; /** * return_to is the URL the user will be redirected to after login diff --git a/src/resources/environments/classes.ts b/src/resources/environments/classes.ts index 2f98fc3..d1a03ee 100644 --- a/src/resources/environments/classes.ts +++ b/src/resources/environments/classes.ts @@ -9,9 +9,24 @@ import { RequestOptions } from '../../internal/request-options'; export class Classes extends APIResource { /** - * ListEnvironmentClasses returns the list of environment classes with runner - * details a user is able to use based on the query buf:lint:ignore - * RPC_REQUEST_RESPONSE_UNIQUE + * Lists available environment classes with their specifications and resource + * limits. + * + * Use this method to understand what types of environments you can create and + * their capabilities. Environment classes define the compute resources and + * features available to your environments. + * + * ### Examples + * + * - List all available classes: + * + * Retrieves a list of all environment classes with their specifications. + * + * ```yaml + * {} + * ``` + * + * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE */ list( params: ClassListParams, diff --git a/src/resources/environments/environments.ts b/src/resources/environments/environments.ts index e1dff10..270f659 100644 --- a/src/resources/environments/environments.ts +++ b/src/resources/environments/environments.ts @@ -23,21 +23,22 @@ export class Environments extends APIResource { classes: ClassesAPI.Classes = new ClassesAPI.Classes(this._client); /** - * CreateEnvironment creates a new environment and starts it. + * Creates a development environment from a context URL (e.g. Git repository) and + * starts it. * * The `class` field must be a valid environment class ID. You can find a list of * available environment classes with the `ListEnvironmentClasses` method. * * ### Examples * - * - from context URL: + * - Create from context URL: * - * Creates an environment from a context URL, e.g. a GitHub repository. + * Creates an environment from a Git repository URL with default settings. * * ```yaml * spec: * machine: - * class: "61000000-0000-0000-0000-000000000000" + * class: "d2c94c27-3b76-4a42-b88c-95a85e392c68" * content: * initializer: * specs: @@ -45,15 +46,14 @@ export class Environments extends APIResource { * url: "https://github.com/gitpod-io/gitpod" * ``` * - * - from Git repository: + * - Create from Git repository: * - * Creates an environment from a Git repository directly. While less convenient, - * this is useful if you want to specify a specific branch, commit, etc. + * Creates an environment from a Git repository with specific branch targeting. * * ```yaml * spec: * machine: - * class: "61000000-0000-0000-0000-000000000000" + * class: "d2c94c27-3b76-4a42-b88c-95a85e392c68" * content: * initializer: * specs: @@ -62,13 +62,54 @@ export class Environments extends APIResource { * cloneTarget: "main" * targetMode: "CLONE_TARGET_MODE_REMOTE_BRANCH" * ``` + * + * - Create with custom timeout and ports: + * + * Creates an environment with custom inactivity timeout and exposed port + * configuration. + * + * ```yaml + * spec: + * machine: + * class: "d2c94c27-3b76-4a42-b88c-95a85e392c68" + * content: + * initializer: + * specs: + * - contextUrl: + * url: "https://github.com/gitpod-io/gitpod" + * timeout: + * disconnected: "7200s" # 2 hours in seconds + * ports: + * - port: 3000 + * admission: "ADMISSION_LEVEL_EVERYONE" + * name: "Web App" + * ``` */ create(body: EnvironmentCreateParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/CreateEnvironment', { body, ...options }); } /** - * GetEnvironment returns a single environment. + * Gets details about a specific environment including its status, configuration, + * and context URL. + * + * Use this method to: + * + * - Check if an environment is ready to use + * - Get connection details for IDE and exposed ports + * - Monitor environment health and resource usage + * - Debug environment setup issues + * + * ### Examples + * + * - Get environment details: + * + * Retrieves detailed information about a specific environment using its unique + * identifier. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * ``` */ retrieve( body: EnvironmentRetrieveParams, @@ -78,14 +119,99 @@ export class Environments extends APIResource { } /** - * UpdateEnvironment updates the environment partially. + * Updates an environment's configuration while it is running. + * + * Updates are limited to: + * + * - Git credentials (username, email) + * - SSH public keys + * - Content initialization + * - Port configurations + * - Automation files + * - Environment timeouts + * + * ### Examples + * + * - Update Git credentials: + * + * Updates the Git configuration for the environment. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * spec: + * content: + * gitUsername: "example-user" + * gitEmail: "user@example.com" + * ``` + * + * - Add SSH public key: + * + * Adds a new SSH public key for authentication. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * spec: + * sshPublicKeys: + * - id: "0194b7c1-c954-718d-91a4-9a742aa5fc11" + * value: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI..." + * ``` + * + * - Update content session: + * + * Updates the content session identifier for the environment. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * spec: + * content: + * session: "0194b7c1-c954-718d-91a4-9a742aa5fc11" + * ``` + * + * Note: Machine class changes require stopping the environment and creating a new + * one. */ update(body: EnvironmentUpdateParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/UpdateEnvironment', { body, ...options }); } /** - * ListEnvironments returns a list of environments that match the query. + * Lists all environments matching the specified criteria. + * + * Use this method to find and monitor environments across your organization. + * Results are ordered by creation time with newest environments first. + * + * ### Examples + * + * - List running environments for a project: + * + * Retrieves all running environments for a specific project with pagination. + * + * ```yaml + * filter: + * statusPhases: ["ENVIRONMENT_PHASE_RUNNING"] + * projectIds: ["b0e12f6c-4c67-429d-a4a6-d9838b5da047"] + * pagination: + * pageSize: 10 + * ``` + * + * - List all environments for a specific runner: + * + * Filters environments by runner ID and creator ID. + * + * ```yaml + * filter: + * runnerIds: ["e6aa9c54-89d3-42c1-ac31-bd8d8f1concentrate"] + * creatorIds: ["f53d2330-3795-4c5d-a1f3-453121af9c60"] + * ``` + * + * - List stopped and deleted environments: + * + * Retrieves all environments in stopped or deleted state. + * + * ```yaml + * filter: + * statusPhases: ["ENVIRONMENT_PHASE_STOPPED", "ENVIRONMENT_PHASE_DELETED"] + * ``` */ list( params: EnvironmentListParams, @@ -100,16 +226,66 @@ export class Environments extends APIResource { } /** - * DeleteEnvironment deletes an environment. When the environment is running, it - * will be stopped as well. Deleted environments cannot be started again. + * Permanently deletes an environment. + * + * Running environments are automatically stopped before deletion. If force is + * true, the environment is deleted immediately without graceful shutdown. + * + * ### Examples + * + * - Delete with graceful shutdown: + * + * Deletes an environment after gracefully stopping it. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * force: false + * ``` + * + * - Force delete: + * + * Immediately deletes an environment without waiting for graceful shutdown. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * force: true + * ``` */ delete(body: EnvironmentDeleteParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/DeleteEnvironment', { body, ...options }); } /** - * CreateAbdStartEnvironmentFromProject creates a new environment from a project - * and starts it. + * Creates an environment from an existing project configuration and starts it. + * + * This method uses project settings as defaults but allows overriding specific + * configurations. Project settings take precedence over default configurations, + * while custom specifications in the request override project settings. + * + * ### Examples + * + * - Create with project defaults: + * + * Creates an environment using all default settings from the project + * configuration. + * + * ```yaml + * projectId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047" + * ``` + * + * - Create with custom compute resources: + * + * Creates an environment from project with custom machine class and timeout + * settings. + * + * ```yaml + * projectId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047" + * spec: + * machine: + * class: "d2c94c27-3b76-4a42-b88c-95a85e392c68" + * timeout: + * disconnected: "14400s" # 4 hours in seconds + * ``` */ createFromProject( body: EnvironmentCreateFromProjectParams, @@ -122,8 +298,20 @@ export class Environments extends APIResource { } /** - * CreateEnvironmentLogsToken creates a token that can be used to access the logs - * of an environment. + * Creates an access token for retrieving environment logs. + * + * Generated tokens are valid for one hour and provide read-only access to the + * environment's logs. + * + * ### Examples + * + * - Generate logs token: + * + * Creates a temporary access token for retrieving environment logs. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * ``` */ createLogsToken( body: EnvironmentCreateLogsTokenParams, @@ -136,22 +324,64 @@ export class Environments extends APIResource { } /** - * MarkEnvironmentActive allows tools to signal activity for an environment. + * Records environment activity to prevent automatic shutdown. + * + * Activity signals should be sent every 5 minutes while the environment is + * actively being used. The source must be between 3-80 characters. + * + * ### Examples + * + * - Signal VS Code activity: + * + * Records VS Code editor activity to prevent environment shutdown. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * activitySignal: + * source: "VS Code" + * timestamp: "2025-02-12T14:30:00Z" + * ``` */ markActive(body: EnvironmentMarkActiveParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/MarkEnvironmentActive', { body, ...options }); } /** - * StartEnvironment starts an environment. This function is idempotent, i.e. if the - * environment is already running no error is returned. + * Starts a stopped environment. + * + * Use this method to resume work on a previously stopped environment. The + * environment retains its configuration and workspace content from when it was + * stopped. + * + * ### Examples + * + * - Start an environment: + * + * Resumes a previously stopped environment with its existing configuration. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * ``` */ start(body: EnvironmentStartParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/StartEnvironment', { body, ...options }); } /** - * StopEnvironment stops a running environment. + * Stops a running environment. + * + * Use this method to pause work while preserving the environment's state. The + * environment can be resumed later using StartEnvironment. + * + * ### Examples + * + * - Stop an environment: + * + * Gracefully stops a running environment while preserving its state. + * + * ```yaml + * environmentId: "07e03a28-65a5-4d98-b532-8ea67b188048" + * ``` */ stop(body: EnvironmentStopParams, options?: RequestOptions): APIPromise { return this._client.post('/gitpod.v1.EnvironmentService/StopEnvironment', { body, ...options }); @@ -1325,7 +1555,7 @@ export interface EnvironmentRetrieveParams { /** * environment_id specifies the environment to get */ - environmentId?: string; + environmentId: string; } export interface EnvironmentUpdateParams { diff --git a/src/resources/organizations/domain-verifications.ts b/src/resources/organizations/domain-verifications.ts index 2b25d6f..0f242e7 100644 --- a/src/resources/organizations/domain-verifications.ts +++ b/src/resources/organizations/domain-verifications.ts @@ -62,13 +62,13 @@ export class DomainVerifications extends APIResource { export type DomainVerificationsDomainVerificationsPage = DomainVerificationsPage; export interface DomainVerification { - id?: string; + id: string; - domain?: string; + domain: string; - organizationId?: string; + organizationId: string; - state?: DomainVerificationState; + state: DomainVerificationState; /** * A Timestamp represents a point in time independent of any time zone or local @@ -160,7 +160,7 @@ export interface DomainVerification { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - verifiedAt?: string; + verifiedAt: string; } export type DomainVerificationState = @@ -169,34 +169,34 @@ export type DomainVerificationState = | 'DOMAIN_VERIFICATION_STATE_VERIFIED'; export interface DomainVerificationCreateResponse { - domainVerification?: DomainVerification; + domainVerification: DomainVerification; } export interface DomainVerificationRetrieveResponse { - domainVerification?: DomainVerification; + domainVerification: DomainVerification; } export type DomainVerificationDeleteResponse = unknown; export interface DomainVerificationVerifyResponse { - domainVerification?: DomainVerification; + domainVerification: DomainVerification; } export interface DomainVerificationCreateParams { - domain?: string; + domain: string; - organizationId?: string; + organizationId: string; } export interface DomainVerificationRetrieveParams { - domainVerificationId?: string; + domainVerificationId: string; } export interface DomainVerificationListParams extends DomainVerificationsPageParams { /** * Body param: */ - organizationId?: string; + organizationId: string; /** * Body param: @@ -221,11 +221,11 @@ export namespace DomainVerificationListParams { } export interface DomainVerificationDeleteParams { - domainVerificationId?: string; + domainVerificationId: string; } export interface DomainVerificationVerifyParams { - domainVerificationId?: string; + domainVerificationId: string; } export declare namespace DomainVerifications { diff --git a/src/resources/organizations/invites.ts b/src/resources/organizations/invites.ts index 9b38700..60f2d63 100644 --- a/src/resources/organizations/invites.ts +++ b/src/resources/organizations/invites.ts @@ -38,19 +38,19 @@ export interface OrganizationInvite { * invite_id is the unique identifier of the invite to join the organization. Use * JoinOrganization with this ID to join the organization. */ - inviteId?: string; + inviteId: string; } export interface InviteCreateResponse { - invite?: OrganizationInvite; + invite: OrganizationInvite; } export interface InviteRetrieveResponse { - invite?: OrganizationInvite; + invite: OrganizationInvite; } export interface InviteGetSummaryResponse { - organizationId?: string; + organizationId: string; organizationMemberCount?: number; @@ -58,15 +58,15 @@ export interface InviteGetSummaryResponse { } export interface InviteCreateParams { - organizationId?: string; + organizationId: string; } export interface InviteRetrieveParams { - organizationId?: string; + organizationId: string; } export interface InviteGetSummaryParams { - inviteId?: string; + inviteId: string; } export declare namespace Invites { diff --git a/src/resources/organizations/organizations.ts b/src/resources/organizations/organizations.ts index 77a5c58..ee9f2b5 100644 --- a/src/resources/organizations/organizations.ts +++ b/src/resources/organizations/organizations.ts @@ -159,7 +159,7 @@ export interface InviteDomains { } export interface Organization { - id?: string; + id: string; /** * A Timestamp represents a point in time independent of any time zone or local @@ -251,11 +251,9 @@ export interface Organization { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - createdAt?: string; + createdAt: string; - inviteDomains?: InviteDomains; - - name?: string; + name: string; /** * A Timestamp represents a point in time independent of any time zone or local @@ -347,20 +345,20 @@ export interface Organization { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - updatedAt?: string; + updatedAt: string; + + inviteDomains?: InviteDomains; } export interface OrganizationMember { - avatarUrl?: string; - - email?: string; + email: string; - fullName?: string; + fullName: string; /** * login_provider is the login provider the user uses to sign in */ - loginProvider?: string; + loginProvider: string; /** * A Timestamp represents a point in time independent of any time zone or local @@ -452,42 +450,44 @@ export interface OrganizationMember { * [`ISODateTimeFormat.dateTime()`]() * to obtain a formatter capable of generating timestamps in this format. */ - memberSince?: string; + memberSince: string; - role?: Shared.OrganizationRole; + role: Shared.OrganizationRole; + + status: Shared.UserStatus; - status?: Shared.UserStatus; + userId: string; - userId?: string; + avatarUrl?: string; } export type Scope = 'SCOPE_UNSPECIFIED' | 'SCOPE_MEMBER' | 'SCOPE_ALL'; export interface OrganizationCreateResponse { /** - * member is the member that joined the org on creation. Only set if specified - * "join_organization" is "true" in the request. + * organization is the created organization */ - member?: OrganizationMember; + organization: Organization; /** - * organization is the created organization + * member is the member that joined the org on creation. Only set if specified + * "join_organization" is "true" in the request. */ - organization?: Organization; + member?: OrganizationMember; } export interface OrganizationRetrieveResponse { /** * organization is the requested organization */ - organization?: Organization; + organization: Organization; } export interface OrganizationUpdateResponse { /** * organization is the updated organization */ - organization?: Organization; + organization: Organization; } export type OrganizationDeleteResponse = unknown; @@ -496,7 +496,7 @@ export interface OrganizationJoinResponse { /** * member is the member that was created by joining the organization. */ - member?: OrganizationMember; + member: OrganizationMember; } export type OrganizationLeaveResponse = unknown; @@ -504,6 +504,11 @@ export type OrganizationLeaveResponse = unknown; export type OrganizationSetRoleResponse = unknown; export interface OrganizationCreateParams { + /** + * name is the organization name + */ + name: string; + /** * Should other Accounts with the same domain be automatically invited to the * organization? @@ -515,21 +520,21 @@ export interface OrganizationCreateParams { * org on creation */ joinOrganization?: boolean; - - /** - * name is the organization name - */ - name?: string; } export interface OrganizationRetrieveParams { /** * organization_id is the unique identifier of the Organization to retreive. */ - organizationId?: string; + organizationId: string; } export interface OrganizationUpdateParams { + /** + * organization_id is the ID of the organization to update the settings for. + */ + organizationId: string; + /** * invite_domains is the domain allowlist of the organization */ @@ -539,11 +544,6 @@ export interface OrganizationUpdateParams { * name is the new name of the organization */ name?: string | null; - - /** - * organization_id is the ID of the organization to update the settings for. - */ - organizationId?: string; } export interface OrganizationListParams extends OrganizationsPageParams { @@ -581,7 +581,7 @@ export interface OrganizationDeleteParams { /** * organization_id is the ID of the organization to delete */ - organizationId?: string; + organizationId: string; } export interface OrganizationJoinParams { @@ -597,14 +597,14 @@ export interface OrganizationJoinParams { } export interface OrganizationLeaveParams { - userId?: string; + userId: string; } export interface OrganizationListMembersParams extends MembersPageParams { /** * Body param: organization_id is the ID of the organization to list members for */ - organizationId?: string; + organizationId: string; /** * Body param: pagination contains the pagination options for listing members @@ -632,11 +632,11 @@ export namespace OrganizationListMembersParams { } export interface OrganizationSetRoleParams { - organizationId?: string; + organizationId: string; - role?: Shared.OrganizationRole; + userId: string; - userId?: string; + role?: Shared.OrganizationRole; } Organizations.DomainVerifications = DomainVerifications; diff --git a/src/resources/organizations/sso-configurations.ts b/src/resources/organizations/sso-configurations.ts index 35a42d4..9705cf5 100644 --- a/src/resources/organizations/sso-configurations.ts +++ b/src/resources/organizations/sso-configurations.ts @@ -64,36 +64,36 @@ export interface SSOConfiguration { /** * id is the unique identifier of the SSO configuration */ - id?: string; - - /** - * claims are key/value pairs that defines a mapping of claims issued by the IdP. - */ - claims?: Record; + id: string; /** * client_id is the client ID of the OIDC application set on the IdP */ - clientId?: string; + clientId: string; - emailDomain?: string; + emailDomain: string; /** * issuer_url is the URL of the IdP issuer */ - issuerUrl?: string; + issuerUrl: string; - organizationId?: string; + organizationId: string; /** * provider_type defines the type of the SSO configuration */ - providerType?: ProviderType; + providerType: ProviderType; /** * state is the state of the SSO configuration */ - state?: SSOConfigurationState; + state: SSOConfigurationState; + + /** + * claims are key/value pairs that defines a mapping of claims issued by the IdP. + */ + claims?: Record; } export type SSOConfigurationState = @@ -105,14 +105,14 @@ export interface SSOConfigurationCreateResponse { /** * sso_configuration is the created SSO configuration */ - ssoConfiguration?: SSOConfiguration; + ssoConfiguration: SSOConfiguration; } export interface SSOConfigurationRetrieveResponse { /** * sso_configuration is the SSO configuration identified by the ID */ - ssoConfiguration?: SSOConfiguration; + ssoConfiguration: SSOConfiguration; } export type SSOConfigurationUpdateResponse = unknown; @@ -123,34 +123,39 @@ export interface SSOConfigurationCreateParams { /** * client_id is the client ID of the OIDC application set on the IdP */ - clientId?: string; + clientId: string; /** * client_secret is the client secret of the OIDC application set on the IdP */ - clientSecret?: string; + clientSecret: string; /** * email_domain is the domain that is allowed to sign in to the organization */ - emailDomain?: string; + emailDomain: string; /** * issuer_url is the URL of the IdP issuer */ - issuerUrl?: string; + issuerUrl: string; - organizationId?: string; + organizationId: string; } export interface SSOConfigurationRetrieveParams { /** * sso_configuration_id is the ID of the SSO configuration to get */ - ssoConfigurationId?: string; + ssoConfigurationId: string; } export interface SSOConfigurationUpdateParams { + /** + * sso_configuration_id is the ID of the SSO configuration to update + */ + ssoConfigurationId: string; + /** * claims are key/value pairs that defines a mapping of claims issued by the IdP. */ @@ -173,11 +178,6 @@ export interface SSOConfigurationUpdateParams { */ issuerUrl?: string | null; - /** - * sso_configuration_id is the ID of the SSO configuration to update - */ - ssoConfigurationId?: string; - /** * state is the state of the SSO configuration */ @@ -189,7 +189,7 @@ export interface SSOConfigurationListParams extends SSOConfigurationsPageParams * Body param: organization_id is the ID of the organization to list SSO * configurations for. */ - organizationId?: string; + organizationId: string; /** * Body param: @@ -214,7 +214,7 @@ export namespace SSOConfigurationListParams { } export interface SSOConfigurationDeleteParams { - ssoConfigurationId?: string; + ssoConfigurationId: string; } export declare namespace SSOConfigurations { diff --git a/src/resources/runners/configurations/environment-classes.ts b/src/resources/runners/configurations/environment-classes.ts index 02d2c5b..36ac039 100644 --- a/src/resources/runners/configurations/environment-classes.ts +++ b/src/resources/runners/configurations/environment-classes.ts @@ -46,8 +46,8 @@ export class EnvironmentClasses extends APIResource { } /** - * ListEnvironmentClasses returns all environment classes configured for a runner. - * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE + * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE ListEnvironmentClasses returns all + * environment classes configured for a runner. */ list( params: EnvironmentClassListParams, diff --git a/tests/api-resources/accounts.test.ts b/tests/api-resources/accounts.test.ts index 8158563..932d80d 100644 --- a/tests/api-resources/accounts.test.ts +++ b/tests/api-resources/accounts.test.ts @@ -21,8 +21,8 @@ describe('resource accounts', () => { }); // skipped: tests are disabled for the time being - test.skip('delete', async () => { - const responsePromise = client.accounts.delete({}); + test.skip('delete: only required params', async () => { + const responsePromise = client.accounts.delete({ accountId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -33,8 +33,13 @@ describe('resource accounts', () => { }); // skipped: tests are disabled for the time being - test.skip('getSSOLoginURL', async () => { - const responsePromise = client.accounts.getSSOLoginURL({}); + test.skip('delete: required and optional params', async () => { + const response = await client.accounts.delete({ accountId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e' }); + }); + + // skipped: tests are disabled for the time being + test.skip('getSSOLoginURL: only required params', async () => { + const responsePromise = client.accounts.getSSOLoginURL({ email: 'dev@stainlessapi.com' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -44,6 +49,14 @@ describe('resource accounts', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // skipped: tests are disabled for the time being + test.skip('getSSOLoginURL: required and optional params', async () => { + const response = await client.accounts.getSSOLoginURL({ + email: 'dev@stainlessapi.com', + returnTo: 'https://example.com', + }); + }); + // skipped: tests are disabled for the time being test.skip('listLoginProviders', async () => { const responsePromise = client.accounts.listLoginProviders({}); diff --git a/tests/api-resources/environments/environments.test.ts b/tests/api-resources/environments/environments.test.ts index 8d166f5..22b33f8 100644 --- a/tests/api-resources/environments/environments.test.ts +++ b/tests/api-resources/environments/environments.test.ts @@ -21,8 +21,10 @@ describe('resource environments', () => { }); // skipped: tests are disabled for the time being - test.skip('retrieve', async () => { - const responsePromise = client.environments.retrieve({}); + test.skip('retrieve: only required params', async () => { + const responsePromise = client.environments.retrieve({ + environmentId: '07e03a28-65a5-4d98-b532-8ea67b188048', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -32,6 +34,13 @@ describe('resource environments', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // skipped: tests are disabled for the time being + test.skip('retrieve: required and optional params', async () => { + const response = await client.environments.retrieve({ + environmentId: '07e03a28-65a5-4d98-b532-8ea67b188048', + }); + }); + // skipped: tests are disabled for the time being test.skip('update', async () => { const responsePromise = client.environments.update({}); diff --git a/tests/api-resources/organizations/domain-verifications.test.ts b/tests/api-resources/organizations/domain-verifications.test.ts index ff6f411..3c66d36 100644 --- a/tests/api-resources/organizations/domain-verifications.test.ts +++ b/tests/api-resources/organizations/domain-verifications.test.ts @@ -9,8 +9,11 @@ const client = new Gitpod({ describe('resource domainVerifications', () => { // skipped: tests are disabled for the time being - test.skip('create', async () => { - const responsePromise = client.organizations.domainVerifications.create({}); + test.skip('create: only required params', async () => { + const responsePromise = client.organizations.domainVerifications.create({ + domain: 'xxxx', + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -21,8 +24,18 @@ describe('resource domainVerifications', () => { }); // skipped: tests are disabled for the time being - test.skip('retrieve', async () => { - const responsePromise = client.organizations.domainVerifications.retrieve({}); + test.skip('create: required and optional params', async () => { + const response = await client.organizations.domainVerifications.create({ + domain: 'xxxx', + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('retrieve: only required params', async () => { + const responsePromise = client.organizations.domainVerifications.retrieve({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -33,8 +46,17 @@ describe('resource domainVerifications', () => { }); // skipped: tests are disabled for the time being - test.skip('list', async () => { - const responsePromise = client.organizations.domainVerifications.list({}); + test.skip('retrieve: required and optional params', async () => { + const response = await client.organizations.domainVerifications.retrieve({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('list: only required params', async () => { + const responsePromise = client.organizations.domainVerifications.list({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -45,8 +67,20 @@ describe('resource domainVerifications', () => { }); // skipped: tests are disabled for the time being - test.skip('delete', async () => { - const responsePromise = client.organizations.domainVerifications.delete({}); + test.skip('list: required and optional params', async () => { + const response = await client.organizations.domainVerifications.list({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + token: 'token', + pageSize: 0, + pagination: { token: 'token', pageSize: 100 }, + }); + }); + + // skipped: tests are disabled for the time being + test.skip('delete: only required params', async () => { + const responsePromise = client.organizations.domainVerifications.delete({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -57,8 +91,17 @@ describe('resource domainVerifications', () => { }); // skipped: tests are disabled for the time being - test.skip('verify', async () => { - const responsePromise = client.organizations.domainVerifications.verify({}); + test.skip('delete: required and optional params', async () => { + const response = await client.organizations.domainVerifications.delete({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('verify: only required params', async () => { + const responsePromise = client.organizations.domainVerifications.verify({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -67,4 +110,11 @@ describe('resource domainVerifications', () => { expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); + + // skipped: tests are disabled for the time being + test.skip('verify: required and optional params', async () => { + const response = await client.organizations.domainVerifications.verify({ + domainVerificationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); }); diff --git a/tests/api-resources/organizations/invites.test.ts b/tests/api-resources/organizations/invites.test.ts index f01d6a1..381656c 100644 --- a/tests/api-resources/organizations/invites.test.ts +++ b/tests/api-resources/organizations/invites.test.ts @@ -9,8 +9,10 @@ const client = new Gitpod({ describe('resource invites', () => { // skipped: tests are disabled for the time being - test.skip('create', async () => { - const responsePromise = client.organizations.invites.create({}); + test.skip('create: only required params', async () => { + const responsePromise = client.organizations.invites.create({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -21,8 +23,17 @@ describe('resource invites', () => { }); // skipped: tests are disabled for the time being - test.skip('retrieve', async () => { - const responsePromise = client.organizations.invites.retrieve({}); + test.skip('create: required and optional params', async () => { + const response = await client.organizations.invites.create({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('retrieve: only required params', async () => { + const responsePromise = client.organizations.invites.retrieve({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -33,8 +44,17 @@ describe('resource invites', () => { }); // skipped: tests are disabled for the time being - test.skip('getSummary', async () => { - const responsePromise = client.organizations.invites.getSummary({}); + test.skip('retrieve: required and optional params', async () => { + const response = await client.organizations.invites.retrieve({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('getSummary: only required params', async () => { + const responsePromise = client.organizations.invites.getSummary({ + inviteId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -43,4 +63,11 @@ describe('resource invites', () => { expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); + + // skipped: tests are disabled for the time being + test.skip('getSummary: required and optional params', async () => { + const response = await client.organizations.invites.getSummary({ + inviteId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); }); diff --git a/tests/api-resources/organizations/organizations.test.ts b/tests/api-resources/organizations/organizations.test.ts index b1557ed..db75850 100644 --- a/tests/api-resources/organizations/organizations.test.ts +++ b/tests/api-resources/organizations/organizations.test.ts @@ -9,8 +9,8 @@ const client = new Gitpod({ describe('resource organizations', () => { // skipped: tests are disabled for the time being - test.skip('create', async () => { - const responsePromise = client.organizations.create({}); + test.skip('create: only required params', async () => { + const responsePromise = client.organizations.create({ name: 'xxx' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -21,8 +21,19 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('retrieve', async () => { - const responsePromise = client.organizations.retrieve({}); + test.skip('create: required and optional params', async () => { + const response = await client.organizations.create({ + name: 'xxx', + inviteAccountsWithMatchingDomain: true, + joinOrganization: true, + }); + }); + + // skipped: tests are disabled for the time being + test.skip('retrieve: only required params', async () => { + const responsePromise = client.organizations.retrieve({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -33,8 +44,17 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('update', async () => { - const responsePromise = client.organizations.update({}); + test.skip('retrieve: required and optional params', async () => { + const response = await client.organizations.retrieve({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('update: only required params', async () => { + const responsePromise = client.organizations.update({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -44,6 +64,15 @@ describe('resource organizations', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // skipped: tests are disabled for the time being + test.skip('update: required and optional params', async () => { + const response = await client.organizations.update({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + inviteDomains: { domains: ['sfN2.l.iJR-BU.u9JV9.a.m.o2D-4b-Jd.0Z-kX.L.n.S.f.UKbxB'] }, + name: 'name', + }); + }); + // skipped: tests are disabled for the time being test.skip('list', async () => { const responsePromise = client.organizations.list({}); @@ -57,8 +86,10 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('delete', async () => { - const responsePromise = client.organizations.delete({}); + test.skip('delete: only required params', async () => { + const responsePromise = client.organizations.delete({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -68,6 +99,13 @@ describe('resource organizations', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // skipped: tests are disabled for the time being + test.skip('delete: required and optional params', async () => { + const response = await client.organizations.delete({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + // skipped: tests are disabled for the time being test.skip('join', async () => { const responsePromise = client.organizations.join({}); @@ -81,8 +119,8 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('leave', async () => { - const responsePromise = client.organizations.leave({}); + test.skip('leave: only required params', async () => { + const responsePromise = client.organizations.leave({ userId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -93,8 +131,15 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('listMembers', async () => { - const responsePromise = client.organizations.listMembers({}); + test.skip('leave: required and optional params', async () => { + const response = await client.organizations.leave({ userId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e' }); + }); + + // skipped: tests are disabled for the time being + test.skip('listMembers: only required params', async () => { + const responsePromise = client.organizations.listMembers({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -105,8 +150,21 @@ describe('resource organizations', () => { }); // skipped: tests are disabled for the time being - test.skip('setRole', async () => { - const responsePromise = client.organizations.setRole({}); + test.skip('listMembers: required and optional params', async () => { + const response = await client.organizations.listMembers({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + token: 'token', + pageSize: 0, + pagination: { token: 'token', pageSize: 100 }, + }); + }); + + // skipped: tests are disabled for the time being + test.skip('setRole: only required params', async () => { + const responsePromise = client.organizations.setRole({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + userId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -115,4 +173,13 @@ describe('resource organizations', () => { expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); + + // skipped: tests are disabled for the time being + test.skip('setRole: required and optional params', async () => { + const response = await client.organizations.setRole({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + userId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + role: 'ORGANIZATION_ROLE_UNSPECIFIED', + }); + }); }); diff --git a/tests/api-resources/organizations/sso-configurations.test.ts b/tests/api-resources/organizations/sso-configurations.test.ts index eaa5943..661d6c1 100644 --- a/tests/api-resources/organizations/sso-configurations.test.ts +++ b/tests/api-resources/organizations/sso-configurations.test.ts @@ -9,8 +9,14 @@ const client = new Gitpod({ describe('resource ssoConfigurations', () => { // skipped: tests are disabled for the time being - test.skip('create', async () => { - const responsePromise = client.organizations.ssoConfigurations.create({}); + test.skip('create: only required params', async () => { + const responsePromise = client.organizations.ssoConfigurations.create({ + clientId: 'x', + clientSecret: 'x', + emailDomain: 'xxxx', + issuerUrl: 'https://example.com', + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -21,8 +27,21 @@ describe('resource ssoConfigurations', () => { }); // skipped: tests are disabled for the time being - test.skip('retrieve', async () => { - const responsePromise = client.organizations.ssoConfigurations.retrieve({}); + test.skip('create: required and optional params', async () => { + const response = await client.organizations.ssoConfigurations.create({ + clientId: 'x', + clientSecret: 'x', + emailDomain: 'xxxx', + issuerUrl: 'https://example.com', + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('retrieve: only required params', async () => { + const responsePromise = client.organizations.ssoConfigurations.retrieve({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -33,8 +52,17 @@ describe('resource ssoConfigurations', () => { }); // skipped: tests are disabled for the time being - test.skip('update', async () => { - const responsePromise = client.organizations.ssoConfigurations.update({}); + test.skip('retrieve: required and optional params', async () => { + const response = await client.organizations.ssoConfigurations.retrieve({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('update: only required params', async () => { + const responsePromise = client.organizations.ssoConfigurations.update({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -45,8 +73,23 @@ describe('resource ssoConfigurations', () => { }); // skipped: tests are disabled for the time being - test.skip('list', async () => { - const responsePromise = client.organizations.ssoConfigurations.list({}); + test.skip('update: required and optional params', async () => { + const response = await client.organizations.ssoConfigurations.update({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + claims: { foo: 'string' }, + clientId: 'x', + clientSecret: 'x', + emailDomain: 'xxxx', + issuerUrl: 'https://example.com', + state: 'SSO_CONFIGURATION_STATE_UNSPECIFIED', + }); + }); + + // skipped: tests are disabled for the time being + test.skip('list: only required params', async () => { + const responsePromise = client.organizations.ssoConfigurations.list({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -57,8 +100,20 @@ describe('resource ssoConfigurations', () => { }); // skipped: tests are disabled for the time being - test.skip('delete', async () => { - const responsePromise = client.organizations.ssoConfigurations.delete({}); + test.skip('list: required and optional params', async () => { + const response = await client.organizations.ssoConfigurations.list({ + organizationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + token: 'token', + pageSize: 0, + pagination: { token: 'token', pageSize: 100 }, + }); + }); + + // skipped: tests are disabled for the time being + test.skip('delete: only required params', async () => { + const responsePromise = client.organizations.ssoConfigurations.delete({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -67,4 +122,11 @@ describe('resource ssoConfigurations', () => { expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); + + // skipped: tests are disabled for the time being + test.skip('delete: required and optional params', async () => { + const response = await client.organizations.ssoConfigurations.delete({ + ssoConfigurationId: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', + }); + }); });