@shipfox/client-integrations 13.0.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/application/complete-integration-callback.d.ts +11 -0
- package/dist/application/complete-integration-callback.d.ts.map +1 -1
- package/dist/application/complete-integration-callback.js +38 -8
- package/dist/application/complete-integration-callback.js.map +1 -1
- package/dist/components/callback-status-shell.d.ts +1 -1
- package/dist/components/callback-status-shell.d.ts.map +1 -1
- package/dist/components/callback-status-shell.js.map +1 -1
- package/dist/core/models.d.ts +6 -0
- package/dist/core/models.d.ts.map +1 -1
- package/dist/core/models.js +12 -0
- package/dist/core/models.js.map +1 -1
- package/dist/feature.d.ts +8 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +10 -0
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/integration-mapper.d.ts +3 -1
- package/dist/hooks/api/integration-mapper.d.ts.map +1 -1
- package/dist/hooks/api/integration-mapper.js +8 -0
- package/dist/hooks/api/integration-mapper.js.map +1 -1
- package/dist/hooks/api/integrations.d.ts +25 -1
- package/dist/hooks/api/integrations.d.ts.map +1 -1
- package/dist/hooks/api/integrations.js +44 -1
- package/dist/hooks/api/integrations.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jira-callback-state.d.ts +9 -0
- package/dist/jira-callback-state.d.ts.map +1 -0
- package/dist/jira-callback-state.js +16 -0
- package/dist/jira-callback-state.js.map +1 -0
- package/dist/jira-callback.d.ts +11 -0
- package/dist/jira-callback.d.ts.map +1 -0
- package/dist/jira-callback.js +59 -0
- package/dist/jira-callback.js.map +1 -0
- package/dist/jira-form-errors.d.ts +8 -0
- package/dist/jira-form-errors.d.ts.map +1 -0
- package/dist/jira-form-errors.js +55 -0
- package/dist/jira-form-errors.js.map +1 -0
- package/dist/pages/jira-callback-page.d.ts +2 -0
- package/dist/pages/jira-callback-page.d.ts.map +1 -0
- package/dist/pages/jira-callback-page.js +341 -0
- package/dist/pages/jira-callback-page.js.map +1 -0
- package/dist/pages/jira-install-page.d.ts +2 -0
- package/dist/pages/jira-install-page.d.ts.map +1 -0
- package/dist/pages/jira-install-page.js +26 -0
- package/dist/pages/jira-install-page.js.map +1 -0
- package/dist/provider-catalog.d.ts +1 -1
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +5 -0
- package/dist/provider-catalog.js.map +1 -1
- package/dist/routes/jira-callback.d.ts +8 -0
- package/dist/routes/jira-callback.d.ts.map +1 -0
- package/dist/routes/jira-callback.js +9 -0
- package/dist/routes/jira-callback.js.map +1 -0
- package/dist/routes/jira.d.ts +6 -0
- package/dist/routes/jira.d.ts.map +1 -0
- package/dist/routes/jira.js +7 -0
- package/dist/routes/jira.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +9 -8
- package/src/application/complete-integration-callback.test.ts +44 -1
- package/src/application/complete-integration-callback.ts +61 -8
- package/src/components/callback-status-shell.tsx +4 -1
- package/src/components/integration-usage-events.test.ts +13 -0
- package/src/core/models.ts +18 -0
- package/src/feature.ts +10 -0
- package/src/hooks/api/integration-mapper.ts +6 -0
- package/src/hooks/api/integrations.test.ts +92 -0
- package/src/hooks/api/integrations.ts +71 -0
- package/src/index.ts +4 -0
- package/src/jira-callback-state.ts +19 -0
- package/src/jira-callback.test.ts +76 -0
- package/src/jira-callback.ts +67 -0
- package/src/jira-form-errors.test.ts +57 -0
- package/src/jira-form-errors.ts +94 -0
- package/src/pages/jira-callback-page.test.tsx +250 -0
- package/src/pages/jira-callback-page.tsx +366 -0
- package/src/pages/jira-install-page.tsx +28 -0
- package/src/provider-catalog.test.ts +6 -0
- package/src/provider-catalog.ts +7 -1
- package/src/routes/jira-callback.tsx +8 -0
- package/src/routes/jira.tsx +4 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/integrations.ts"],"sourcesContent":["import type {\n IntegrationCapabilityDto,\n UpdateIntegrationConnectionBodyDto,\n} from '@shipfox/api-integration-core-dto';\nimport {\n integrationConnectionDtoSchema,\n listIntegrationConnectionsResponseSchema,\n listIntegrationProvidersResponseSchema,\n listRepositoriesResponseSchema,\n} from '@shipfox/api-integration-core-dto';\nimport type {CreateGiteaConnectionBodyDto} from '@shipfox/api-integration-gitea-dto';\nimport {createGiteaConnectionResponseSchema} from '@shipfox/api-integration-gitea-dto';\nimport type {CreateGithubInstallBodyDto} from '@shipfox/api-integration-github-dto';\nimport {\n createGithubInstallResponseSchema,\n githubCallbackResponseSchema,\n} from '@shipfox/api-integration-github-dto';\nimport type {\n CreateLinearInstallBodyDto,\n LinearCallbackQueryDto,\n} from '@shipfox/api-integration-linear-dto';\nimport {\n createLinearInstallResponseSchema,\n linearCallbackResponseSchema,\n} from '@shipfox/api-integration-linear-dto';\nimport type {\n CreateSentryInstallBodyDto,\n SentryConnectBodyDto,\n} from '@shipfox/api-integration-sentry-dto';\nimport {\n createSentryInstallResponseSchema,\n sentryConnectResponseSchema,\n} from '@shipfox/api-integration-sentry-dto';\nimport type {\n CreateSlackInstallBodyDto,\n SlackCallbackQueryDto,\n} from '@shipfox/api-integration-slack-dto';\nimport {\n createSlackInstallResponseSchema,\n slackCallbackResponseSchema,\n} from '@shipfox/api-integration-slack-dto';\nimport {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n type InfiniteData,\n infiniteQueryOptions,\n queryOptions,\n type UseInfiniteQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport {\n type InstallRedirect,\n type IntegrationConnection,\n type IntegrationProvider,\n isUsableConnection,\n type RepositoryPage,\n} from '#core/models.js';\nimport {serializeLinearCallbackQuery} from '#linear-callback.js';\nimport {serializeSlackCallbackQuery} from '#slack-callback.js';\nimport {\n toInstallRedirect,\n toIntegrationConnection,\n toIntegrationProvider,\n toRepository,\n} from './integration-mapper.js';\n\nexport const integrationsQueryKeys = {\n all: ['integrations'] as const,\n providers: (capability: IntegrationCapabilityDto | 'all') =>\n [...integrationsQueryKeys.all, 'providers', capability] as const,\n connections: (workspaceId: string, capability: IntegrationCapabilityDto | 'all') =>\n [...integrationsQueryKeys.all, 'connections', workspaceId, capability] as const,\n // Prefix matching every per-capability connections query for a workspace, so\n // a mutation can refresh all connection views without touching providers or\n // repositories.\n connectionsByWorkspace: (workspaceId: string) =>\n [...integrationsQueryKeys.all, 'connections', workspaceId] as const,\n sourceConnections: (workspaceId: string) =>\n integrationsQueryKeys.connections(workspaceId, 'source_control'),\n repositories: (connectionId: string, search: string) =>\n [...integrationsQueryKeys.all, 'repositories', connectionId, search] as const,\n};\n\ntype SourceConnectionsQueryKey =\n | ReturnType<typeof integrationsQueryKeys.sourceConnections>\n | readonly ['integrations', 'source-connections'];\n\ntype SourceConnectionsQueryOptions = FetchQueryOptions<\n IntegrationConnection[],\n Error,\n IntegrationConnection[],\n SourceConnectionsQueryKey\n>;\n\ntype ProvidersQueryKey = ReturnType<typeof integrationsQueryKeys.providers>;\n\ntype ProvidersQueryOptions = FetchQueryOptions<\n IntegrationProvider[],\n Error,\n IntegrationProvider[],\n ProvidersQueryKey\n>;\n\ntype ConnectionsQueryKey =\n | ReturnType<typeof integrationsQueryKeys.connections>\n | readonly ['integrations', 'connections'];\n\ntype ConnectionsQueryOptions = FetchQueryOptions<\n IntegrationConnection[],\n Error,\n IntegrationConnection[],\n ConnectionsQueryKey\n>;\n\ntype RepositoriesQueryKey =\n | ReturnType<typeof integrationsQueryKeys.repositories>\n | readonly ['integrations', 'repositories'];\n\ntype RepositoriesInfiniteQueryOptions = UseInfiniteQueryOptions<\n RepositoryPage,\n Error,\n InfiniteData<RepositoryPage, string | undefined>,\n RepositoriesQueryKey,\n string | undefined\n>;\n\nexport async function listIntegrationProviders({\n capability,\n signal,\n}: {\n capability?: IntegrationCapabilityDto;\n signal?: AbortSignal;\n}): Promise<IntegrationProvider[]> {\n const search = new URLSearchParams();\n if (capability) search.set('capability', capability);\n const query = search.toString();\n const path = query ? `/integration-providers?${query}` : '/integration-providers';\n const response = await checkedApiRequest(listIntegrationProvidersResponseSchema, path, {signal});\n return response.providers.map(toIntegrationProvider);\n}\n\nexport async function listIntegrationConnections({\n workspaceId,\n capability,\n signal,\n}: {\n workspaceId: string;\n capability?: IntegrationCapabilityDto | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<IntegrationConnection[]> {\n const search = new URLSearchParams({workspace_id: workspaceId});\n if (capability) search.set('capability', capability);\n const response = await checkedApiRequest(\n listIntegrationConnectionsResponseSchema,\n `/integration-connections?${search.toString()}`,\n {signal},\n );\n return response.connections.map(toIntegrationConnection);\n}\n\nexport async function listSourceConnections({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<IntegrationConnection[]> {\n const connections = await listIntegrationConnections({\n workspaceId,\n capability: 'source_control',\n signal,\n });\n // The endpoint returns every lifecycle status (the settings hub needs that),\n // but source-control consumers (onboarding redirect, project creation) only\n // act on usable connections. A disabled/error one must read as \"not there\".\n return connections.filter(isUsableConnection);\n}\n\nexport function sourceConnectionsQueryOptions(\n workspaceId: string | undefined,\n): SourceConnectionsQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? integrationsQueryKeys.sourceConnections(workspaceId)\n : ([...integrationsQueryKeys.all, 'source-connections'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listSourceConnections({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport async function createGiteaConnection(\n body: CreateGiteaConnectionBodyDto,\n): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n createGiteaConnectionResponseSchema,\n '/integrations/gitea/connections',\n {\n method: 'POST',\n body,\n },\n );\n return toIntegrationConnection(response);\n}\n\nexport async function createGithubInstall(\n body: CreateGithubInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createGithubInstallResponseSchema, '/integrations/github/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function completeGithubCallback({\n code,\n installationId,\n state,\n setupAction,\n token,\n}: {\n code: string;\n installationId: number;\n state: string;\n setupAction?: string;\n token: string;\n}): Promise<IntegrationConnection> {\n const query = new URLSearchParams({code, installation_id: String(installationId), state});\n if (setupAction) query.set('setup_action', setupAction);\n const response = await checkedApiRequest(\n githubCallbackResponseSchema,\n `/integrations/github/callback/api?${query.toString()}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function createSentryInstall(\n body: CreateSentryInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createSentryInstallResponseSchema, '/integrations/sentry/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function createLinearInstall(\n body: CreateLinearInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createLinearInstallResponseSchema, '/integrations/linear/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function createSlackInstall(\n body: CreateSlackInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createSlackInstallResponseSchema, '/integrations/slack/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function completeLinearCallback({\n query,\n token,\n}: {\n query: LinearCallbackQueryDto;\n token: string;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n linearCallbackResponseSchema,\n `/integrations/linear/callback/api?${serializeLinearCallbackQuery(query)}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function completeSlackCallback({\n query,\n token,\n}: {\n query: SlackCallbackQueryDto;\n token: string;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n slackCallbackResponseSchema,\n `/integrations/slack/callback/api?${serializeSlackCallbackQuery(query)}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\n// Called from the callback route with an explicit bearer (same as the GitHub\n// callback): the route refreshes auth itself before forwarding the grant code.\nexport async function connectSentry({body, token}: {body: SentryConnectBodyDto; token: string}) {\n const response = await checkedApiRequest(\n sentryConnectResponseSchema,\n '/integrations/sentry/connect',\n {\n method: 'POST',\n body,\n headers: {authorization: `Bearer ${token}`},\n },\n );\n return toIntegrationConnection(response);\n}\n\nexport async function listRepositories({\n connectionId,\n cursor,\n search,\n signal,\n}: {\n connectionId: string;\n cursor?: string;\n search?: string;\n signal?: AbortSignal;\n}): Promise<RepositoryPage> {\n const params = new URLSearchParams();\n if (cursor) params.set('cursor', cursor);\n if (search) params.set('search', search);\n const query = params.toString();\n const path = query\n ? `/integration-connections/${connectionId}/repositories?${query}`\n : `/integration-connections/${connectionId}/repositories`;\n const response = await checkedApiRequest(listRepositoriesResponseSchema, path, {signal});\n return {\n repositories: response.repositories.map(toRepository),\n ...(response.next_cursor == null ? {} : {nextCursor: response.next_cursor}),\n };\n}\n\nexport async function updateIntegrationConnection({\n connectionId,\n body,\n}: {\n connectionId: string;\n body: UpdateIntegrationConnectionBodyDto;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n integrationConnectionDtoSchema,\n `/integration-connections/${encodeURIComponent(connectionId)}`,\n {method: 'PATCH', body},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function deleteIntegrationConnection({connectionId}: {connectionId: string}) {\n await checkedApiRequest(\n emptyResponseSchema,\n `/integration-connections/${encodeURIComponent(connectionId)}`,\n {\n method: 'DELETE',\n },\n );\n}\n\nexport function useIntegrationProvidersQuery(params?: {capability?: IntegrationCapabilityDto}) {\n return useQuery(integrationProvidersQueryOptions(params?.capability));\n}\n\nexport function integrationProvidersQueryOptions(\n capability?: IntegrationCapabilityDto,\n): ProvidersQueryOptions {\n return queryOptions({\n queryKey: integrationsQueryKeys.providers(capability ?? 'all'),\n queryFn: ({signal}) => listIntegrationProviders(capability ? {capability, signal} : {signal}),\n });\n}\n\nexport function useSourceConnectionsQuery(workspaceId: string | undefined) {\n return useQuery(sourceConnectionsQueryOptions(workspaceId));\n}\n\nexport function useIntegrationConnectionsQuery(workspaceId: string | undefined) {\n return useQuery(integrationConnectionsQueryOptions(workspaceId));\n}\n\nexport function integrationConnectionsQueryOptions(\n workspaceId: string | undefined,\n): ConnectionsQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? integrationsQueryKeys.connections(workspaceId, 'all')\n : ([...integrationsQueryKeys.all, 'connections'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listIntegrationConnections({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport function repositoriesInfiniteQueryOptions(\n connectionId: string | undefined,\n options?: {search?: string},\n): RepositoriesInfiniteQueryOptions {\n const trimmedSearch = options?.search?.trim() ?? '';\n return infiniteQueryOptions({\n queryKey: connectionId\n ? integrationsQueryKeys.repositories(connectionId, trimmedSearch)\n : ([...integrationsQueryKeys.all, 'repositories'] as const),\n enabled: Boolean(connectionId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) => {\n const args: {connectionId: string; cursor?: string; search?: string; signal: AbortSignal} = {\n connectionId: connectionId ?? '',\n signal,\n };\n if (pageParam) args.cursor = pageParam;\n if (trimmedSearch) args.search = trimmedSearch;\n return listRepositories(args);\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n });\n}\n\nexport function useRepositoriesInfiniteQuery(\n connectionId: string | undefined,\n options?: {search?: string},\n) {\n return useInfiniteQuery(repositoriesInfiniteQueryOptions(connectionId, options));\n}\n\nexport function useCreateGiteaConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createGiteaConnection,\n onSuccess: async (connection) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(connection.workspaceId),\n refetchType: 'all',\n });\n },\n });\n}\n\nexport function useCreateLinearInstallMutation() {\n return useMutation({mutationFn: createLinearInstall});\n}\n\nexport function useCreateSlackInstallMutation() {\n return useMutation({mutationFn: createSlackInstall});\n}\n\nexport function useCompleteLinearCallbackMutation() {\n return useMutation({mutationFn: completeLinearCallback});\n}\n\nexport function useCompleteSlackCallbackMutation() {\n return useMutation({mutationFn: completeSlackCallback});\n}\n\nexport function useUpdateIntegrationConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateIntegrationConnection,\n onSuccess: async (connection) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(connection.workspaceId),\n });\n },\n });\n}\n\nexport function useDeleteIntegrationConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n workspaceId: _workspaceId,\n connectionId,\n }: {\n workspaceId: string;\n connectionId: string;\n }) => deleteIntegrationConnection({connectionId}),\n onSuccess: async (_result, variables) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(variables.workspaceId),\n });\n },\n });\n}\n"],"names":["integrationConnectionDtoSchema","listIntegrationConnectionsResponseSchema","listIntegrationProvidersResponseSchema","listRepositoriesResponseSchema","createGiteaConnectionResponseSchema","createGithubInstallResponseSchema","githubCallbackResponseSchema","createLinearInstallResponseSchema","linearCallbackResponseSchema","createSentryInstallResponseSchema","sentryConnectResponseSchema","createSlackInstallResponseSchema","slackCallbackResponseSchema","checkedApiRequest","emptyResponseSchema","infiniteQueryOptions","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","isUsableConnection","serializeLinearCallbackQuery","serializeSlackCallbackQuery","toInstallRedirect","toIntegrationConnection","toIntegrationProvider","toRepository","integrationsQueryKeys","all","providers","capability","connections","workspaceId","connectionsByWorkspace","sourceConnections","repositories","connectionId","search","listIntegrationProviders","signal","URLSearchParams","set","query","toString","path","response","map","listIntegrationConnections","workspace_id","listSourceConnections","filter","sourceConnectionsQueryOptions","queryKey","enabled","Boolean","queryFn","createGiteaConnection","body","method","createGithubInstall","completeGithubCallback","code","installationId","state","setupAction","token","installation_id","String","headers","authorization","createSentryInstall","createLinearInstall","createSlackInstall","completeLinearCallback","completeSlackCallback","connectSentry","listRepositories","cursor","params","next_cursor","nextCursor","updateIntegrationConnection","encodeURIComponent","deleteIntegrationConnection","useIntegrationProvidersQuery","integrationProvidersQueryOptions","useSourceConnectionsQuery","useIntegrationConnectionsQuery","integrationConnectionsQueryOptions","repositoriesInfiniteQueryOptions","options","trimmedSearch","trim","initialPageParam","undefined","pageParam","args","getNextPageParam","lastPage","useRepositoriesInfiniteQuery","useCreateGiteaConnectionMutation","queryClient","mutationFn","onSuccess","connection","invalidateQueries","refetchType","useCreateLinearInstallMutation","useCreateSlackInstallMutation","useCompleteLinearCallbackMutation","useCompleteSlackCallbackMutation","useUpdateIntegrationConnectionMutation","useDeleteIntegrationConnectionMutation","_workspaceId","_result","variables"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/integrations.ts"],"sourcesContent":["import type {\n IntegrationCapabilityDto,\n UpdateIntegrationConnectionBodyDto,\n} from '@shipfox/api-integration-core-dto';\nimport {\n integrationConnectionDtoSchema,\n listIntegrationConnectionsResponseSchema,\n listIntegrationProvidersResponseSchema,\n listRepositoriesResponseSchema,\n} from '@shipfox/api-integration-core-dto';\nimport type {CreateGiteaConnectionBodyDto} from '@shipfox/api-integration-gitea-dto';\nimport {createGiteaConnectionResponseSchema} from '@shipfox/api-integration-gitea-dto';\nimport type {CreateGithubInstallBodyDto} from '@shipfox/api-integration-github-dto';\nimport {\n createGithubInstallResponseSchema,\n githubCallbackResponseSchema,\n} from '@shipfox/api-integration-github-dto';\nimport type {\n CompleteJiraSiteSelectionBodyDto,\n CreateJiraInstallBodyDto,\n JiraCallbackQueryDto,\n} from '@shipfox/api-integration-jira-dto';\nimport {\n createJiraInstallResponseSchema,\n jiraCallbackResponseSchema,\n} from '@shipfox/api-integration-jira-dto';\nimport type {\n CreateLinearInstallBodyDto,\n LinearCallbackQueryDto,\n} from '@shipfox/api-integration-linear-dto';\nimport {\n createLinearInstallResponseSchema,\n linearCallbackResponseSchema,\n} from '@shipfox/api-integration-linear-dto';\nimport type {\n CreateSentryInstallBodyDto,\n SentryConnectBodyDto,\n} from '@shipfox/api-integration-sentry-dto';\nimport {\n createSentryInstallResponseSchema,\n sentryConnectResponseSchema,\n} from '@shipfox/api-integration-sentry-dto';\nimport type {\n CreateSlackInstallBodyDto,\n SlackCallbackQueryDto,\n} from '@shipfox/api-integration-slack-dto';\nimport {\n createSlackInstallResponseSchema,\n slackCallbackResponseSchema,\n} from '@shipfox/api-integration-slack-dto';\nimport {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n type InfiniteData,\n infiniteQueryOptions,\n queryOptions,\n type UseInfiniteQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport {\n type InstallRedirect,\n type IntegrationConnection,\n type IntegrationProvider,\n isUsableConnection,\n type JiraSite,\n type RepositoryPage,\n} from '#core/models.js';\nimport {serializeJiraCallbackQuery} from '#jira-callback.js';\nimport {serializeLinearCallbackQuery} from '#linear-callback.js';\nimport {serializeSlackCallbackQuery} from '#slack-callback.js';\nimport {\n toInstallRedirect,\n toIntegrationConnection,\n toIntegrationProvider,\n toJiraSite,\n toRepository,\n} from './integration-mapper.js';\n\nexport const integrationsQueryKeys = {\n all: ['integrations'] as const,\n providers: (capability: IntegrationCapabilityDto | 'all') =>\n [...integrationsQueryKeys.all, 'providers', capability] as const,\n connections: (workspaceId: string, capability: IntegrationCapabilityDto | 'all') =>\n [...integrationsQueryKeys.all, 'connections', workspaceId, capability] as const,\n // Prefix matching every per-capability connections query for a workspace, so\n // a mutation can refresh all connection views without touching providers or\n // repositories.\n connectionsByWorkspace: (workspaceId: string) =>\n [...integrationsQueryKeys.all, 'connections', workspaceId] as const,\n sourceConnections: (workspaceId: string) =>\n integrationsQueryKeys.connections(workspaceId, 'source_control'),\n repositories: (connectionId: string, search: string) =>\n [...integrationsQueryKeys.all, 'repositories', connectionId, search] as const,\n};\n\ntype SourceConnectionsQueryKey =\n | ReturnType<typeof integrationsQueryKeys.sourceConnections>\n | readonly ['integrations', 'source-connections'];\n\ntype SourceConnectionsQueryOptions = FetchQueryOptions<\n IntegrationConnection[],\n Error,\n IntegrationConnection[],\n SourceConnectionsQueryKey\n>;\n\ntype ProvidersQueryKey = ReturnType<typeof integrationsQueryKeys.providers>;\n\ntype ProvidersQueryOptions = FetchQueryOptions<\n IntegrationProvider[],\n Error,\n IntegrationProvider[],\n ProvidersQueryKey\n>;\n\ntype ConnectionsQueryKey =\n | ReturnType<typeof integrationsQueryKeys.connections>\n | readonly ['integrations', 'connections'];\n\ntype ConnectionsQueryOptions = FetchQueryOptions<\n IntegrationConnection[],\n Error,\n IntegrationConnection[],\n ConnectionsQueryKey\n>;\n\ntype RepositoriesQueryKey =\n | ReturnType<typeof integrationsQueryKeys.repositories>\n | readonly ['integrations', 'repositories'];\n\ntype RepositoriesInfiniteQueryOptions = UseInfiniteQueryOptions<\n RepositoryPage,\n Error,\n InfiniteData<RepositoryPage, string | undefined>,\n RepositoriesQueryKey,\n string | undefined\n>;\n\nexport async function listIntegrationProviders({\n capability,\n signal,\n}: {\n capability?: IntegrationCapabilityDto;\n signal?: AbortSignal;\n}): Promise<IntegrationProvider[]> {\n const search = new URLSearchParams();\n if (capability) search.set('capability', capability);\n const query = search.toString();\n const path = query ? `/integration-providers?${query}` : '/integration-providers';\n const response = await checkedApiRequest(listIntegrationProvidersResponseSchema, path, {signal});\n return response.providers.map(toIntegrationProvider);\n}\n\nexport async function listIntegrationConnections({\n workspaceId,\n capability,\n signal,\n}: {\n workspaceId: string;\n capability?: IntegrationCapabilityDto | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<IntegrationConnection[]> {\n const search = new URLSearchParams({workspace_id: workspaceId});\n if (capability) search.set('capability', capability);\n const response = await checkedApiRequest(\n listIntegrationConnectionsResponseSchema,\n `/integration-connections?${search.toString()}`,\n {signal},\n );\n return response.connections.map(toIntegrationConnection);\n}\n\nexport async function listSourceConnections({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<IntegrationConnection[]> {\n const connections = await listIntegrationConnections({\n workspaceId,\n capability: 'source_control',\n signal,\n });\n // The endpoint returns every lifecycle status (the settings hub needs that),\n // but source-control consumers (onboarding redirect, project creation) only\n // act on usable connections. A disabled/error one must read as \"not there\".\n return connections.filter(isUsableConnection);\n}\n\nexport function sourceConnectionsQueryOptions(\n workspaceId: string | undefined,\n): SourceConnectionsQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? integrationsQueryKeys.sourceConnections(workspaceId)\n : ([...integrationsQueryKeys.all, 'source-connections'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listSourceConnections({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport async function createGiteaConnection(\n body: CreateGiteaConnectionBodyDto,\n): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n createGiteaConnectionResponseSchema,\n '/integrations/gitea/connections',\n {\n method: 'POST',\n body,\n },\n );\n return toIntegrationConnection(response);\n}\n\nexport async function createGithubInstall(\n body: CreateGithubInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createGithubInstallResponseSchema, '/integrations/github/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function completeGithubCallback({\n code,\n installationId,\n state,\n setupAction,\n token,\n}: {\n code: string;\n installationId: number;\n state: string;\n setupAction?: string;\n token: string;\n}): Promise<IntegrationConnection> {\n const query = new URLSearchParams({code, installation_id: String(installationId), state});\n if (setupAction) query.set('setup_action', setupAction);\n const response = await checkedApiRequest(\n githubCallbackResponseSchema,\n `/integrations/github/callback/api?${query.toString()}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function createSentryInstall(\n body: CreateSentryInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createSentryInstallResponseSchema, '/integrations/sentry/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function createLinearInstall(\n body: CreateLinearInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createLinearInstallResponseSchema, '/integrations/linear/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function createJiraInstall(body: CreateJiraInstallBodyDto): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createJiraInstallResponseSchema, '/integrations/jira/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function createSlackInstall(\n body: CreateSlackInstallBodyDto,\n): Promise<InstallRedirect> {\n return toInstallRedirect(\n await checkedApiRequest(createSlackInstallResponseSchema, '/integrations/slack/install', {\n method: 'POST',\n body,\n }),\n );\n}\n\nexport async function completeLinearCallback({\n query,\n token,\n}: {\n query: LinearCallbackQueryDto;\n token: string;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n linearCallbackResponseSchema,\n `/integrations/linear/callback/api?${serializeLinearCallbackQuery(query)}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function completeSlackCallback({\n query,\n token,\n}: {\n query: SlackCallbackQueryDto;\n token: string;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n slackCallbackResponseSchema,\n `/integrations/slack/callback/api?${serializeSlackCallbackQuery(query)}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return toIntegrationConnection(response);\n}\n\nexport type JiraCallbackResult = IntegrationConnection | {sites: JiraSite[]};\n\nexport async function completeJiraCallback({\n query,\n token,\n}: {\n query: JiraCallbackQueryDto;\n token: string;\n}): Promise<JiraCallbackResult> {\n const response = await checkedApiRequest(\n jiraCallbackResponseSchema,\n `/integrations/jira/callback/api?${serializeJiraCallbackQuery(query)}`,\n {headers: {authorization: `Bearer ${token}`}},\n );\n return 'sites' in response\n ? {sites: response.sites.map(toJiraSite)}\n : toIntegrationConnection(response);\n}\n\nexport async function completeJiraSiteSelection({\n body,\n token,\n}: {\n body: CompleteJiraSiteSelectionBodyDto;\n token: string;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n integrationConnectionDtoSchema,\n '/integrations/jira/callback/site',\n {\n method: 'POST',\n body,\n headers: {authorization: `Bearer ${token}`},\n },\n );\n return toIntegrationConnection(response);\n}\n\n// Called from the callback route with an explicit bearer (same as the GitHub\n// callback): the route refreshes auth itself before forwarding the grant code.\nexport async function connectSentry({body, token}: {body: SentryConnectBodyDto; token: string}) {\n const response = await checkedApiRequest(\n sentryConnectResponseSchema,\n '/integrations/sentry/connect',\n {\n method: 'POST',\n body,\n headers: {authorization: `Bearer ${token}`},\n },\n );\n return toIntegrationConnection(response);\n}\n\nexport async function listRepositories({\n connectionId,\n cursor,\n search,\n signal,\n}: {\n connectionId: string;\n cursor?: string;\n search?: string;\n signal?: AbortSignal;\n}): Promise<RepositoryPage> {\n const params = new URLSearchParams();\n if (cursor) params.set('cursor', cursor);\n if (search) params.set('search', search);\n const query = params.toString();\n const path = query\n ? `/integration-connections/${connectionId}/repositories?${query}`\n : `/integration-connections/${connectionId}/repositories`;\n const response = await checkedApiRequest(listRepositoriesResponseSchema, path, {signal});\n return {\n repositories: response.repositories.map(toRepository),\n ...(response.next_cursor == null ? {} : {nextCursor: response.next_cursor}),\n };\n}\n\nexport async function updateIntegrationConnection({\n connectionId,\n body,\n}: {\n connectionId: string;\n body: UpdateIntegrationConnectionBodyDto;\n}): Promise<IntegrationConnection> {\n const response = await checkedApiRequest(\n integrationConnectionDtoSchema,\n `/integration-connections/${encodeURIComponent(connectionId)}`,\n {method: 'PATCH', body},\n );\n return toIntegrationConnection(response);\n}\n\nexport async function deleteIntegrationConnection({connectionId}: {connectionId: string}) {\n await checkedApiRequest(\n emptyResponseSchema,\n `/integration-connections/${encodeURIComponent(connectionId)}`,\n {\n method: 'DELETE',\n },\n );\n}\n\nexport function useIntegrationProvidersQuery(params?: {capability?: IntegrationCapabilityDto}) {\n return useQuery(integrationProvidersQueryOptions(params?.capability));\n}\n\nexport function integrationProvidersQueryOptions(\n capability?: IntegrationCapabilityDto,\n): ProvidersQueryOptions {\n return queryOptions({\n queryKey: integrationsQueryKeys.providers(capability ?? 'all'),\n queryFn: ({signal}) => listIntegrationProviders(capability ? {capability, signal} : {signal}),\n });\n}\n\nexport function useSourceConnectionsQuery(workspaceId: string | undefined) {\n return useQuery(sourceConnectionsQueryOptions(workspaceId));\n}\n\nexport function useIntegrationConnectionsQuery(workspaceId: string | undefined) {\n return useQuery(integrationConnectionsQueryOptions(workspaceId));\n}\n\nexport function integrationConnectionsQueryOptions(\n workspaceId: string | undefined,\n): ConnectionsQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? integrationsQueryKeys.connections(workspaceId, 'all')\n : ([...integrationsQueryKeys.all, 'connections'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listIntegrationConnections({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport function repositoriesInfiniteQueryOptions(\n connectionId: string | undefined,\n options?: {search?: string},\n): RepositoriesInfiniteQueryOptions {\n const trimmedSearch = options?.search?.trim() ?? '';\n return infiniteQueryOptions({\n queryKey: connectionId\n ? integrationsQueryKeys.repositories(connectionId, trimmedSearch)\n : ([...integrationsQueryKeys.all, 'repositories'] as const),\n enabled: Boolean(connectionId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) => {\n const args: {connectionId: string; cursor?: string; search?: string; signal: AbortSignal} = {\n connectionId: connectionId ?? '',\n signal,\n };\n if (pageParam) args.cursor = pageParam;\n if (trimmedSearch) args.search = trimmedSearch;\n return listRepositories(args);\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n });\n}\n\nexport function useRepositoriesInfiniteQuery(\n connectionId: string | undefined,\n options?: {search?: string},\n) {\n return useInfiniteQuery(repositoriesInfiniteQueryOptions(connectionId, options));\n}\n\nexport function useCreateGiteaConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createGiteaConnection,\n onSuccess: async (connection) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(connection.workspaceId),\n refetchType: 'all',\n });\n },\n });\n}\n\nexport function useCreateLinearInstallMutation() {\n return useMutation({mutationFn: createLinearInstall});\n}\n\nexport function useCreateSlackInstallMutation() {\n return useMutation({mutationFn: createSlackInstall});\n}\n\nexport function useCreateJiraInstallMutation() {\n return useMutation({mutationFn: createJiraInstall});\n}\n\nexport function useCompleteLinearCallbackMutation() {\n return useMutation({mutationFn: completeLinearCallback});\n}\n\nexport function useCompleteSlackCallbackMutation() {\n return useMutation({mutationFn: completeSlackCallback});\n}\n\nexport function useCompleteJiraCallbackMutation() {\n return useMutation({mutationFn: completeJiraCallback});\n}\n\nexport function useCompleteJiraSiteSelectionMutation() {\n return useMutation({mutationFn: completeJiraSiteSelection});\n}\n\nexport function useUpdateIntegrationConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateIntegrationConnection,\n onSuccess: async (connection) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(connection.workspaceId),\n });\n },\n });\n}\n\nexport function useDeleteIntegrationConnectionMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n workspaceId: _workspaceId,\n connectionId,\n }: {\n workspaceId: string;\n connectionId: string;\n }) => deleteIntegrationConnection({connectionId}),\n onSuccess: async (_result, variables) => {\n await queryClient.invalidateQueries({\n queryKey: integrationsQueryKeys.connectionsByWorkspace(variables.workspaceId),\n });\n },\n });\n}\n"],"names":["integrationConnectionDtoSchema","listIntegrationConnectionsResponseSchema","listIntegrationProvidersResponseSchema","listRepositoriesResponseSchema","createGiteaConnectionResponseSchema","createGithubInstallResponseSchema","githubCallbackResponseSchema","createJiraInstallResponseSchema","jiraCallbackResponseSchema","createLinearInstallResponseSchema","linearCallbackResponseSchema","createSentryInstallResponseSchema","sentryConnectResponseSchema","createSlackInstallResponseSchema","slackCallbackResponseSchema","checkedApiRequest","emptyResponseSchema","infiniteQueryOptions","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","isUsableConnection","serializeJiraCallbackQuery","serializeLinearCallbackQuery","serializeSlackCallbackQuery","toInstallRedirect","toIntegrationConnection","toIntegrationProvider","toJiraSite","toRepository","integrationsQueryKeys","all","providers","capability","connections","workspaceId","connectionsByWorkspace","sourceConnections","repositories","connectionId","search","listIntegrationProviders","signal","URLSearchParams","set","query","toString","path","response","map","listIntegrationConnections","workspace_id","listSourceConnections","filter","sourceConnectionsQueryOptions","queryKey","enabled","Boolean","queryFn","createGiteaConnection","body","method","createGithubInstall","completeGithubCallback","code","installationId","state","setupAction","token","installation_id","String","headers","authorization","createSentryInstall","createLinearInstall","createJiraInstall","createSlackInstall","completeLinearCallback","completeSlackCallback","completeJiraCallback","sites","completeJiraSiteSelection","connectSentry","listRepositories","cursor","params","next_cursor","nextCursor","updateIntegrationConnection","encodeURIComponent","deleteIntegrationConnection","useIntegrationProvidersQuery","integrationProvidersQueryOptions","useSourceConnectionsQuery","useIntegrationConnectionsQuery","integrationConnectionsQueryOptions","repositoriesInfiniteQueryOptions","options","trimmedSearch","trim","initialPageParam","undefined","pageParam","args","getNextPageParam","lastPage","useRepositoriesInfiniteQuery","useCreateGiteaConnectionMutation","queryClient","mutationFn","onSuccess","connection","invalidateQueries","refetchType","useCreateLinearInstallMutation","useCreateSlackInstallMutation","useCreateJiraInstallMutation","useCompleteLinearCallbackMutation","useCompleteSlackCallbackMutation","useCompleteJiraCallbackMutation","useCompleteJiraSiteSelectionMutation","useUpdateIntegrationConnectionMutation","useDeleteIntegrationConnectionMutation","_workspaceId","_result","variables"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,12 @@ export * from './components/redirect-install-page.js';
|
|
|
6
6
|
export * from './components/repository-picker.js';
|
|
7
7
|
export * from './connection-status-badge.js';
|
|
8
8
|
export * from './hooks/api/integrations.js';
|
|
9
|
+
export * from './jira-callback.js';
|
|
10
|
+
export * from './jira-form-errors.js';
|
|
9
11
|
export * from './pages/gitea-install-page.js';
|
|
10
12
|
export * from './pages/github-install-page.js';
|
|
13
|
+
export * from './pages/jira-callback-page.js';
|
|
14
|
+
export * from './pages/jira-install-page.js';
|
|
11
15
|
export * from './pages/linear-callback-page.js';
|
|
12
16
|
export * from './pages/linear-install-page.js';
|
|
13
17
|
export * from './pages/sentry-callback-page.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,8 +6,12 @@ export * from './components/redirect-install-page.js';
|
|
|
6
6
|
export * from './components/repository-picker.js';
|
|
7
7
|
export * from './connection-status-badge.js';
|
|
8
8
|
export * from './hooks/api/integrations.js';
|
|
9
|
+
export * from './jira-callback.js';
|
|
10
|
+
export * from './jira-form-errors.js';
|
|
9
11
|
export * from './pages/gitea-install-page.js';
|
|
10
12
|
export * from './pages/github-install-page.js';
|
|
13
|
+
export * from './pages/jira-callback-page.js';
|
|
14
|
+
export * from './pages/jira-install-page.js';
|
|
11
15
|
export * from './pages/linear-callback-page.js';
|
|
12
16
|
export * from './pages/linear-install-page.js';
|
|
13
17
|
export * from './pages/sentry-callback-page.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from '@shipfox/integration-icons';\nexport * from '#core/models.js';\nexport * from './components/connection-picker.js';\nexport * from './components/integration-gallery.js';\nexport * from './components/redirect-install-page.js';\nexport * from './components/repository-picker.js';\nexport * from './connection-status-badge.js';\nexport * from './hooks/api/integrations.js';\nexport * from './pages/gitea-install-page.js';\nexport * from './pages/github-install-page.js';\nexport * from './pages/linear-callback-page.js';\nexport * from './pages/linear-install-page.js';\nexport * from './pages/sentry-callback-page.js';\nexport * from './pages/sentry-install-page.js';\nexport * from './pages/slack-callback-page.js';\nexport * from './pages/slack-install-page.js';\nexport * from './pages/source-control-onboarding-page.js';\nexport * from './provider-catalog.js';\nexport * from './sentry-callback.js';\nexport * from './slack-callback.js';\n"],"names":[],"mappings":"AAAA,cAAc,6BAA6B;AAC3C,cAAc,kBAAkB;AAChC,cAAc,oCAAoC;AAClD,cAAc,sCAAsC;AACpD,cAAc,wCAAwC;AACtD,cAAc,oCAAoC;AAClD,cAAc,+BAA+B;AAC7C,cAAc,8BAA8B;AAC5C,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,kCAAkC;AAChD,cAAc,iCAAiC;AAC/C,cAAc,kCAAkC;AAChD,cAAc,iCAAiC;AAC/C,cAAc,iCAAiC;AAC/C,cAAc,gCAAgC;AAC9C,cAAc,4CAA4C;AAC1D,cAAc,wBAAwB;AACtC,cAAc,uBAAuB;AACrC,cAAc,sBAAsB"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from '@shipfox/integration-icons';\nexport * from '#core/models.js';\nexport * from './components/connection-picker.js';\nexport * from './components/integration-gallery.js';\nexport * from './components/redirect-install-page.js';\nexport * from './components/repository-picker.js';\nexport * from './connection-status-badge.js';\nexport * from './hooks/api/integrations.js';\nexport * from './jira-callback.js';\nexport * from './jira-form-errors.js';\nexport * from './pages/gitea-install-page.js';\nexport * from './pages/github-install-page.js';\nexport * from './pages/jira-callback-page.js';\nexport * from './pages/jira-install-page.js';\nexport * from './pages/linear-callback-page.js';\nexport * from './pages/linear-install-page.js';\nexport * from './pages/sentry-callback-page.js';\nexport * from './pages/sentry-install-page.js';\nexport * from './pages/slack-callback-page.js';\nexport * from './pages/slack-install-page.js';\nexport * from './pages/source-control-onboarding-page.js';\nexport * from './provider-catalog.js';\nexport * from './sentry-callback.js';\nexport * from './slack-callback.js';\n"],"names":[],"mappings":"AAAA,cAAc,6BAA6B;AAC3C,cAAc,kBAAkB;AAChC,cAAc,oCAAoC;AAClD,cAAc,sCAAsC;AACpD,cAAc,wCAAwC;AACtD,cAAc,oCAAoC;AAClD,cAAc,+BAA+B;AAC7C,cAAc,8BAA8B;AAC5C,cAAc,qBAAqB;AACnC,cAAc,wBAAwB;AACtC,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,gCAAgC;AAC9C,cAAc,+BAA+B;AAC7C,cAAc,kCAAkC;AAChD,cAAc,iCAAiC;AAC/C,cAAc,kCAAkC;AAChD,cAAc,iCAAiC;AAC/C,cAAc,iCAAiC;AAC/C,cAAc,gCAAgC;AAC9C,cAAc,4CAA4C;AAC1D,cAAc,wBAAwB;AACtC,cAAc,uBAAuB;AACrC,cAAc,sBAAsB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IntegrationConnection } from '#core/models.js';
|
|
2
|
+
import type { JiraCallbackResult } from '#hooks/api/integrations.js';
|
|
3
|
+
export declare const JIRA_CALLBACK_CACHE_SIZE = 32;
|
|
4
|
+
export declare const jiraCallbackRequests: import("@shipfox/client-ui").SingleFlight<string, JiraCallbackResult>;
|
|
5
|
+
export declare const jiraSiteSelectionRequests: import("@shipfox/client-ui").SingleFlight<string, IntegrationConnection>;
|
|
6
|
+
export declare const jiraCompletedConnections: Map<string, IntegrationConnection>;
|
|
7
|
+
export declare const jiraToastedCallbacks: Set<string>;
|
|
8
|
+
export declare function resetJiraCallbackState(): void;
|
|
9
|
+
//# sourceMappingURL=jira-callback-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-callback-state.d.ts","sourceRoot":"","sources":["../src/jira-callback-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAEnE,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,eAAO,MAAM,oBAAoB,uEAE/B,CAAC;AACH,eAAO,MAAM,yBAAyB,0EAAsD,CAAC;AAC7F,eAAO,MAAM,wBAAwB,oCAA2C,CAAC;AACjF,eAAO,MAAM,oBAAoB,aAAoB,CAAC;AAEtD,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createSingleFlight } from '@shipfox/client-ui';
|
|
2
|
+
export const JIRA_CALLBACK_CACHE_SIZE = 32;
|
|
3
|
+
export const jiraCallbackRequests = createSingleFlight({
|
|
4
|
+
maxTerminalResults: JIRA_CALLBACK_CACHE_SIZE
|
|
5
|
+
});
|
|
6
|
+
export const jiraSiteSelectionRequests = createSingleFlight();
|
|
7
|
+
export const jiraCompletedConnections = new Map();
|
|
8
|
+
export const jiraToastedCallbacks = new Set();
|
|
9
|
+
export function resetJiraCallbackState() {
|
|
10
|
+
jiraCallbackRequests.clear();
|
|
11
|
+
jiraSiteSelectionRequests.clear();
|
|
12
|
+
jiraCompletedConnections.clear();
|
|
13
|
+
jiraToastedCallbacks.clear();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=jira-callback-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jira-callback-state.ts"],"sourcesContent":["import {createSingleFlight} from '@shipfox/client-ui';\nimport type {IntegrationConnection} from '#core/models.js';\nimport type {JiraCallbackResult} from '#hooks/api/integrations.js';\n\nexport const JIRA_CALLBACK_CACHE_SIZE = 32;\n\nexport const jiraCallbackRequests = createSingleFlight<string, JiraCallbackResult>({\n maxTerminalResults: JIRA_CALLBACK_CACHE_SIZE,\n});\nexport const jiraSiteSelectionRequests = createSingleFlight<string, IntegrationConnection>();\nexport const jiraCompletedConnections = new Map<string, IntegrationConnection>();\nexport const jiraToastedCallbacks = new Set<string>();\n\nexport function resetJiraCallbackState(): void {\n jiraCallbackRequests.clear();\n jiraSiteSelectionRequests.clear();\n jiraCompletedConnections.clear();\n jiraToastedCallbacks.clear();\n}\n"],"names":["createSingleFlight","JIRA_CALLBACK_CACHE_SIZE","jiraCallbackRequests","maxTerminalResults","jiraSiteSelectionRequests","jiraCompletedConnections","Map","jiraToastedCallbacks","Set","resetJiraCallbackState","clear"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,qBAAqB;AAItD,OAAO,MAAMC,2BAA2B,GAAG;AAE3C,OAAO,MAAMC,uBAAuBF,mBAA+C;IACjFG,oBAAoBF;AACtB,GAAG;AACH,OAAO,MAAMG,4BAA4BJ,qBAAoD;AAC7F,OAAO,MAAMK,2BAA2B,IAAIC,MAAqC;AACjF,OAAO,MAAMC,uBAAuB,IAAIC,MAAc;AAEtD,OAAO,SAASC;IACdP,qBAAqBQ,KAAK;IAC1BN,0BAA0BM,KAAK;IAC/BL,yBAAyBK,KAAK;IAC9BH,qBAAqBG,KAAK;AAC5B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JiraCallbackQueryDto } from '@shipfox/api-integration-jira-dto';
|
|
2
|
+
import { type BrowserStorage } from '@shipfox/client-ui';
|
|
3
|
+
export declare const JIRA_INSTALL_WORKSPACE_KEY = "shipfox.jira-install.workspace-id";
|
|
4
|
+
type WorkspaceStorage = BrowserStorage | undefined;
|
|
5
|
+
export declare function saveJiraInstallWorkspace(storage: WorkspaceStorage, workspaceId: string): void;
|
|
6
|
+
export declare function readJiraInstallWorkspace(storage: WorkspaceStorage): string | undefined;
|
|
7
|
+
export declare function clearJiraInstallWorkspace(storage: WorkspaceStorage): void;
|
|
8
|
+
export declare function parseJiraCallbackQuery(search: Record<string, unknown>): JiraCallbackQueryDto | undefined;
|
|
9
|
+
export declare function serializeJiraCallbackQuery(query: JiraCallbackQueryDto): string;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=jira-callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-callback.d.ts","sourceRoot":"","sources":["../src/jira-callback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAE9E,KAAK,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;AAanD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAE7F;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAEtF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEzE;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,oBAAoB,GAAG,SAAS,CAWlC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAS9E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createTypedBrowserStorage } from '@shipfox/client-ui';
|
|
2
|
+
export const JIRA_INSTALL_WORKSPACE_KEY = 'shipfox.jira-install.workspace-id';
|
|
3
|
+
const jiraInstallWorkspaceStorageKey = {
|
|
4
|
+
key: JIRA_INSTALL_WORKSPACE_KEY,
|
|
5
|
+
lifetime: 'session',
|
|
6
|
+
// This is a one-shot navigation hint, not private workspace state. It must
|
|
7
|
+
// remain readable on an OAuth callback before workspace hydration completes;
|
|
8
|
+
// the signed callback state and returned connection are authoritative.
|
|
9
|
+
principalScope: 'global',
|
|
10
|
+
serialize: (workspaceId)=>workspaceId,
|
|
11
|
+
parse: (value)=>value || undefined
|
|
12
|
+
};
|
|
13
|
+
export function saveJiraInstallWorkspace(storage, workspaceId) {
|
|
14
|
+
installWorkspaceStorage(storage).write(workspaceId);
|
|
15
|
+
}
|
|
16
|
+
export function readJiraInstallWorkspace(storage) {
|
|
17
|
+
return installWorkspaceStorage(storage).read();
|
|
18
|
+
}
|
|
19
|
+
export function clearJiraInstallWorkspace(storage) {
|
|
20
|
+
installWorkspaceStorage(storage).remove();
|
|
21
|
+
}
|
|
22
|
+
function installWorkspaceStorage(storage) {
|
|
23
|
+
return createTypedBrowserStorage(()=>storage, jiraInstallWorkspaceStorageKey);
|
|
24
|
+
}
|
|
25
|
+
export function parseJiraCallbackQuery(search) {
|
|
26
|
+
const state = stringParam(search.state);
|
|
27
|
+
if (!state) return undefined;
|
|
28
|
+
const code = stringParam(search.code);
|
|
29
|
+
if (code) return {
|
|
30
|
+
code,
|
|
31
|
+
state
|
|
32
|
+
};
|
|
33
|
+
const error = stringParam(search.error);
|
|
34
|
+
if (!error) return undefined;
|
|
35
|
+
const errorDescription = stringParam(search.error_description);
|
|
36
|
+
return errorDescription ? {
|
|
37
|
+
error,
|
|
38
|
+
error_description: errorDescription,
|
|
39
|
+
state
|
|
40
|
+
} : {
|
|
41
|
+
error,
|
|
42
|
+
state
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function serializeJiraCallbackQuery(query) {
|
|
46
|
+
const params = new URLSearchParams();
|
|
47
|
+
if ('code' in query) params.set('code', query.code);
|
|
48
|
+
else {
|
|
49
|
+
params.set('error', query.error);
|
|
50
|
+
if (query.error_description) params.set('error_description', query.error_description);
|
|
51
|
+
}
|
|
52
|
+
params.set('state', query.state);
|
|
53
|
+
return params.toString();
|
|
54
|
+
}
|
|
55
|
+
function stringParam(value) {
|
|
56
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=jira-callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jira-callback.ts"],"sourcesContent":["import type {JiraCallbackQueryDto} from '@shipfox/api-integration-jira-dto';\nimport {\n type BrowserStorage,\n type BrowserStorageKey,\n createTypedBrowserStorage,\n} from '@shipfox/client-ui';\n\nexport const JIRA_INSTALL_WORKSPACE_KEY = 'shipfox.jira-install.workspace-id';\n\ntype WorkspaceStorage = BrowserStorage | undefined;\n\nconst jiraInstallWorkspaceStorageKey = {\n key: JIRA_INSTALL_WORKSPACE_KEY,\n lifetime: 'session',\n // This is a one-shot navigation hint, not private workspace state. It must\n // remain readable on an OAuth callback before workspace hydration completes;\n // the signed callback state and returned connection are authoritative.\n principalScope: 'global',\n serialize: (workspaceId: string) => workspaceId,\n parse: (value: string) => value || undefined,\n} satisfies BrowserStorageKey<string>;\n\nexport function saveJiraInstallWorkspace(storage: WorkspaceStorage, workspaceId: string): void {\n installWorkspaceStorage(storage).write(workspaceId);\n}\n\nexport function readJiraInstallWorkspace(storage: WorkspaceStorage): string | undefined {\n return installWorkspaceStorage(storage).read();\n}\n\nexport function clearJiraInstallWorkspace(storage: WorkspaceStorage): void {\n installWorkspaceStorage(storage).remove();\n}\n\nfunction installWorkspaceStorage(storage: WorkspaceStorage) {\n return createTypedBrowserStorage(() => storage, jiraInstallWorkspaceStorageKey);\n}\n\nexport function parseJiraCallbackQuery(\n search: Record<string, unknown>,\n): JiraCallbackQueryDto | undefined {\n const state = stringParam(search.state);\n if (!state) return undefined;\n\n const code = stringParam(search.code);\n if (code) return {code, state};\n\n const error = stringParam(search.error);\n if (!error) return undefined;\n const errorDescription = stringParam(search.error_description);\n return errorDescription ? {error, error_description: errorDescription, state} : {error, state};\n}\n\nexport function serializeJiraCallbackQuery(query: JiraCallbackQueryDto): string {\n const params = new URLSearchParams();\n if ('code' in query) params.set('code', query.code);\n else {\n params.set('error', query.error);\n if (query.error_description) params.set('error_description', query.error_description);\n }\n params.set('state', query.state);\n return params.toString();\n}\n\nfunction stringParam(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n"],"names":["createTypedBrowserStorage","JIRA_INSTALL_WORKSPACE_KEY","jiraInstallWorkspaceStorageKey","key","lifetime","principalScope","serialize","workspaceId","parse","value","undefined","saveJiraInstallWorkspace","storage","installWorkspaceStorage","write","readJiraInstallWorkspace","read","clearJiraInstallWorkspace","remove","parseJiraCallbackQuery","search","state","stringParam","code","error","errorDescription","error_description","serializeJiraCallbackQuery","query","params","URLSearchParams","set","toString","length"],"mappings":"AACA,SAGEA,yBAAyB,QACpB,qBAAqB;AAE5B,OAAO,MAAMC,6BAA6B,oCAAoC;AAI9E,MAAMC,iCAAiC;IACrCC,KAAKF;IACLG,UAAU;IACV,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvEC,gBAAgB;IAChBC,WAAW,CAACC,cAAwBA;IACpCC,OAAO,CAACC,QAAkBA,SAASC;AACrC;AAEA,OAAO,SAASC,yBAAyBC,OAAyB,EAAEL,WAAmB;IACrFM,wBAAwBD,SAASE,KAAK,CAACP;AACzC;AAEA,OAAO,SAASQ,yBAAyBH,OAAyB;IAChE,OAAOC,wBAAwBD,SAASI,IAAI;AAC9C;AAEA,OAAO,SAASC,0BAA0BL,OAAyB;IACjEC,wBAAwBD,SAASM,MAAM;AACzC;AAEA,SAASL,wBAAwBD,OAAyB;IACxD,OAAOZ,0BAA0B,IAAMY,SAASV;AAClD;AAEA,OAAO,SAASiB,uBACdC,MAA+B;IAE/B,MAAMC,QAAQC,YAAYF,OAAOC,KAAK;IACtC,IAAI,CAACA,OAAO,OAAOX;IAEnB,MAAMa,OAAOD,YAAYF,OAAOG,IAAI;IACpC,IAAIA,MAAM,OAAO;QAACA;QAAMF;IAAK;IAE7B,MAAMG,QAAQF,YAAYF,OAAOI,KAAK;IACtC,IAAI,CAACA,OAAO,OAAOd;IACnB,MAAMe,mBAAmBH,YAAYF,OAAOM,iBAAiB;IAC7D,OAAOD,mBAAmB;QAACD;QAAOE,mBAAmBD;QAAkBJ;IAAK,IAAI;QAACG;QAAOH;IAAK;AAC/F;AAEA,OAAO,SAASM,2BAA2BC,KAA2B;IACpE,MAAMC,SAAS,IAAIC;IACnB,IAAI,UAAUF,OAAOC,OAAOE,GAAG,CAAC,QAAQH,MAAML,IAAI;SAC7C;QACHM,OAAOE,GAAG,CAAC,SAASH,MAAMJ,KAAK;QAC/B,IAAII,MAAMF,iBAAiB,EAAEG,OAAOE,GAAG,CAAC,qBAAqBH,MAAMF,iBAAiB;IACtF;IACAG,OAAOE,GAAG,CAAC,SAASH,MAAMP,KAAK;IAC/B,OAAOQ,OAAOG,QAAQ;AACxB;AAEA,SAASV,YAAYb,KAAc;IACjC,OAAO,OAAOA,UAAU,YAAYA,MAAMwB,MAAM,GAAG,IAAIxB,QAAQC;AACjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-form-errors.d.ts","sourceRoot":"","sources":["../src/jira-form-errors.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAwE7E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ApiError } from '@shipfox/client-api';
|
|
2
|
+
export function classifyJiraCallbackError(error) {
|
|
3
|
+
if (error instanceof ApiError) {
|
|
4
|
+
switch(error.code){
|
|
5
|
+
case 'invalid-jira-install-state':
|
|
6
|
+
return failure('Jira install link expired', 'Jira install link expired. Start again from workspace settings.', true);
|
|
7
|
+
case 'jira-install-state-actor-mismatch':
|
|
8
|
+
case 'unauthorized':
|
|
9
|
+
return {
|
|
10
|
+
...failure('Different Shipfox account', 'Different Shipfox account. Sign in with the account that started this install.', true),
|
|
11
|
+
signIn: true
|
|
12
|
+
};
|
|
13
|
+
case 'not-found':
|
|
14
|
+
case 'forbidden':
|
|
15
|
+
case 'workspace-inactive':
|
|
16
|
+
return failure('Workspace access changed', 'You no longer have access to this workspace. Return to Shipfox to continue.', false);
|
|
17
|
+
case 'jira-installation-already-linked':
|
|
18
|
+
case 'jira-connection-already-linked':
|
|
19
|
+
return failure('Jira already linked', 'This Jira site is already linked to another workspace.', false);
|
|
20
|
+
case 'jira-authorization-scope-mismatch':
|
|
21
|
+
case 'jira-offline-access-not-granted':
|
|
22
|
+
case 'jira-oauth-callback-error':
|
|
23
|
+
case 'access-denied':
|
|
24
|
+
return failure('Jira permissions needed', 'Jira did not authorize the permissions Shipfox needs. Review the consent and start again.', true);
|
|
25
|
+
case 'jira-site-selection-mismatch':
|
|
26
|
+
case 'jira-pending-selection-not-found':
|
|
27
|
+
return failure('Jira site selection expired', 'This Jira site selection is no longer valid. Start the install again from workspace settings.', true);
|
|
28
|
+
case 'network-error':
|
|
29
|
+
return failure('Could not reach Shipfox', 'Check your connection and start again.', true);
|
|
30
|
+
case 'rate-limited':
|
|
31
|
+
case 'timeout':
|
|
32
|
+
case 'provider-unavailable':
|
|
33
|
+
case 'malformed-provider-response':
|
|
34
|
+
return failure('Jira is temporarily unavailable', 'Start a new install when Jira is available.', true);
|
|
35
|
+
case 'slug-conflict':
|
|
36
|
+
return failure('Jira install could not be completed', 'Could not complete the Jira install. Start again from workspace settings.', true);
|
|
37
|
+
default:
|
|
38
|
+
return fallback();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return fallback();
|
|
42
|
+
}
|
|
43
|
+
function failure(title, message, startOver) {
|
|
44
|
+
return {
|
|
45
|
+
title,
|
|
46
|
+
message,
|
|
47
|
+
startOver,
|
|
48
|
+
signIn: false
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function fallback() {
|
|
52
|
+
return failure('Jira install could not be completed', 'Could not complete the Jira install. Start again from workspace settings.', true);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=jira-form-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jira-form-errors.ts"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\n\nexport interface JiraCallbackFailure {\n title: string;\n message: string;\n startOver: boolean;\n signIn: boolean;\n}\n\nexport function classifyJiraCallbackError(error: unknown): JiraCallbackFailure {\n if (error instanceof ApiError) {\n switch (error.code) {\n case 'invalid-jira-install-state':\n return failure(\n 'Jira install link expired',\n 'Jira install link expired. Start again from workspace settings.',\n true,\n );\n case 'jira-install-state-actor-mismatch':\n case 'unauthorized':\n return {\n ...failure(\n 'Different Shipfox account',\n 'Different Shipfox account. Sign in with the account that started this install.',\n true,\n ),\n signIn: true,\n };\n case 'not-found':\n case 'forbidden':\n case 'workspace-inactive':\n return failure(\n 'Workspace access changed',\n 'You no longer have access to this workspace. Return to Shipfox to continue.',\n false,\n );\n case 'jira-installation-already-linked':\n case 'jira-connection-already-linked':\n return failure(\n 'Jira already linked',\n 'This Jira site is already linked to another workspace.',\n false,\n );\n case 'jira-authorization-scope-mismatch':\n case 'jira-offline-access-not-granted':\n case 'jira-oauth-callback-error':\n case 'access-denied':\n return failure(\n 'Jira permissions needed',\n 'Jira did not authorize the permissions Shipfox needs. Review the consent and start again.',\n true,\n );\n case 'jira-site-selection-mismatch':\n case 'jira-pending-selection-not-found':\n return failure(\n 'Jira site selection expired',\n 'This Jira site selection is no longer valid. Start the install again from workspace settings.',\n true,\n );\n case 'network-error':\n return failure('Could not reach Shipfox', 'Check your connection and start again.', true);\n case 'rate-limited':\n case 'timeout':\n case 'provider-unavailable':\n case 'malformed-provider-response':\n return failure(\n 'Jira is temporarily unavailable',\n 'Start a new install when Jira is available.',\n true,\n );\n case 'slug-conflict':\n return failure(\n 'Jira install could not be completed',\n 'Could not complete the Jira install. Start again from workspace settings.',\n true,\n );\n default:\n return fallback();\n }\n }\n return fallback();\n}\n\nfunction failure(title: string, message: string, startOver: boolean): JiraCallbackFailure {\n return {title, message, startOver, signIn: false};\n}\n\nfunction fallback(): JiraCallbackFailure {\n return failure(\n 'Jira install could not be completed',\n 'Could not complete the Jira install. Start again from workspace settings.',\n true,\n );\n}\n"],"names":["ApiError","classifyJiraCallbackError","error","code","failure","signIn","fallback","title","message","startOver"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,sBAAsB;AAS7C,OAAO,SAASC,0BAA0BC,KAAc;IACtD,IAAIA,iBAAiBF,UAAU;QAC7B,OAAQE,MAAMC,IAAI;YAChB,KAAK;gBACH,OAAOC,QACL,6BACA,mEACA;YAEJ,KAAK;YACL,KAAK;gBACH,OAAO;oBACL,GAAGA,QACD,6BACA,kFACA,KACD;oBACDC,QAAQ;gBACV;YACF,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOD,QACL,4BACA,+EACA;YAEJ,KAAK;YACL,KAAK;gBACH,OAAOA,QACL,uBACA,0DACA;YAEJ,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOA,QACL,2BACA,6FACA;YAEJ,KAAK;YACL,KAAK;gBACH,OAAOA,QACL,+BACA,iGACA;YAEJ,KAAK;gBACH,OAAOA,QAAQ,2BAA2B,0CAA0C;YACtF,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOA,QACL,mCACA,+CACA;YAEJ,KAAK;gBACH,OAAOA,QACL,uCACA,6EACA;YAEJ;gBACE,OAAOE;QACX;IACF;IACA,OAAOA;AACT;AAEA,SAASF,QAAQG,KAAa,EAAEC,OAAe,EAAEC,SAAkB;IACjE,OAAO;QAACF;QAAOC;QAASC;QAAWJ,QAAQ;IAAK;AAClD;AAEA,SAASC;IACP,OAAOF,QACL,uCACA,6EACA;AAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-callback-page.d.ts","sourceRoot":"","sources":["../../src/pages/jira-callback-page.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,gBAAgB,gCA2N/B"}
|