diff --git a/.changeset/purple-foxes-arrive.md b/.changeset/purple-foxes-arrive.md new file mode 100644 index 000000000..a771c94ff --- /dev/null +++ b/.changeset/purple-foxes-arrive.md @@ -0,0 +1,5 @@ +--- +'@gitbook/integration-gitlab': minor +--- + +Use ExposableError for public errors in GitLab integration diff --git a/integrations/gitlab/src/api.ts b/integrations/gitlab/src/api.ts index 3026f14a6..41b1a8d05 100644 --- a/integrations/gitlab/src/api.ts +++ b/integrations/gitlab/src/api.ts @@ -1,7 +1,6 @@ import LinkHeader from 'http-link-header'; -import { StatusError } from 'itty-router'; -import { Logger } from '@gitbook/runtime'; +import { Logger, ExposableError } from '@gitbook/runtime'; import type { GitLabSpaceConfiguration } from './types'; @@ -275,7 +274,7 @@ async function requestGitLab( logger.error(`[${options.method}] (${response.status}) GitLab API error: ${text}`); - throw new StatusError(response.status, `GitLab API error: ${response.statusText}`); + throw new ExposableError(`GitLab API error: ${response.statusText}`, response.status); } return response; @@ -296,7 +295,10 @@ function getEndpoint(config: GitLabSpaceConfiguration): string { export function getAccessTokenOrThrow(config: GitLabSpaceConfiguration): string { const { accessToken } = config; if (!accessToken) { - throw new StatusError(401, 'Unauthorized: kindly re-authenticate with a new access token.'); + throw new ExposableError( + 'Unauthorized: kindly re-authenticate with a new access token.', + 401, + ); } return accessToken; diff --git a/integrations/gitlab/src/index.ts b/integrations/gitlab/src/index.ts index 85f54ac62..11a890c4c 100644 --- a/integrations/gitlab/src/index.ts +++ b/integrations/gitlab/src/index.ts @@ -1,8 +1,13 @@ -import { StatusError, error } from 'itty-router'; -import { Router } from 'itty-router'; +import { Router, error } from 'itty-router'; import { ContentKitIcon, ContentKitSelectOption, GitSyncOperationState } from '@gitbook/api'; -import { createIntegration, FetchEventCallback, Logger, EventCallback } from '@gitbook/runtime'; +import { + createIntegration, + FetchEventCallback, + Logger, + EventCallback, + ExposableError, +} from '@gitbook/runtime'; import { fetchProject, fetchProjectBranches, fetchProjects, searchUserProjects } from './api'; import { configBlock } from './components'; @@ -70,7 +75,7 @@ const handleFetchEvent: FetchEventCallback = async (reques if (!verified) { const message = `Invalid signature for integration task`; logger.error(message); - throw new StatusError(400, message); + throw new ExposableError(message); } const { task } = JSON.parse(payloadString) as { task: IntegrationTask }; @@ -110,11 +115,11 @@ const handleFetchEvent: FetchEventCallback = async (reques if (!valid) { const message = `Invalid signature for webhook event ${eventUuid}`; logger.error(message); - throw new StatusError(400, message); + throw new ExposableError(message); } } catch (error: any) { logger.error(`Error verifying signature ${error}`); - throw new StatusError(400, error.message); + throw new ExposableError(error.message); } } diff --git a/integrations/gitlab/src/installation.ts b/integrations/gitlab/src/installation.ts index dcaebe718..f4b6da388 100644 --- a/integrations/gitlab/src/installation.ts +++ b/integrations/gitlab/src/installation.ts @@ -1,7 +1,5 @@ -import { StatusError } from 'itty-router'; - import { IntegrationSpaceInstallation } from '@gitbook/api'; -import { Logger } from '@gitbook/runtime'; +import { Logger, ExposableError } from '@gitbook/runtime'; import { fetchProject } from './api'; import { createGitLabWebhookURL, installWebhook } from './provider'; @@ -30,7 +28,7 @@ export async function saveSpaceConfiguration( assertIsDefined(spaceInstallation, { label: 'spaceInstallation' }); if (!state.project || !state.branch) { - throw new StatusError(400, 'Incomplete configuration: missing project or branch'); + throw new ExposableError('Incomplete configuration: missing project or branch'); } const projectId = parseInt(state.project, 10);