Merged in feat/sw-2859-set-up-shared-trpc-package (pull request #2319)

feat(SW-2859): Create trpc package

* Add isEdge, safeTry and dataCache to new common package

* Add eslint and move prettier config

* Clean up tests

* Create trpc package and move initialization

* Move errors and a few procedures

* Move telemetry to common package

* Move tokenManager to common package

* Add Sentry to procedures

* Clean up procedures

* Fix self-referencing imports

* Add exports to packages and lint rule to prevent relative imports

* Add env to trpc package

* Add eslint to trpc package

* Apply lint rules

* Use direct imports from trpc package

* Add lint-staged config to trpc

* Move lang enum to common

* Restructure trpc package folder structure

* Fix lang imports


Approved-by: Linus Flood
This commit is contained in:
Anton Gunnarsson
2025-06-18 12:14:20 +00:00
parent 2f38bdf0b1
commit 846fd904a6
211 changed files with 989 additions and 627 deletions

View File

@@ -2,7 +2,8 @@ import "server-only"
import { ClientError, type GraphQLClient } from "graphql-request"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { env } from "@/env/server"
import type { DocumentNode } from "graphql"

View File

@@ -8,10 +8,11 @@ import {
import { httpLink, loggerLink, TRPCClientError } from "@trpc/client"
import { useState } from "react"
import { SessionExpiredError } from "@scandic-hotels/trpc/errors"
import { transformer } from "@scandic-hotels/trpc/transformer"
import { login } from "@/constants/routes/handleAuth"
import { env } from "@/env/client"
import { SessionExpiredError } from "@/server/errors/trpc"
import { transformer } from "@/server/transformer"
import useLang from "@/hooks/useLang"

View File

@@ -7,6 +7,8 @@ import { cache } from "@/utils/cache"
import { serverClient } from "../server"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { Country } from "@/types/enums/country"
import type {
AncillaryPackagesInput,
@@ -18,7 +20,6 @@ import type {
CityCoordinatesInput,
HotelInput,
} from "@/types/trpc/routers/hotel/hotel"
import type { Lang } from "@/constants/languages"
import type { GetHotelsByCSFilterInput } from "@/server/routers/hotels/input"
import type { GetSavedPaymentCardsInput } from "@/server/routers/user/input"

View File

@@ -1,18 +1,57 @@
import * as Sentry from "@sentry/nextjs"
import { TRPCError } from "@trpc/server"
import { cookies, headers } from "next/headers"
import { redirect } from "next/navigation"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { createCallerFactory } from "@scandic-hotels/trpc"
import { createContext } from "@scandic-hotels/trpc/context"
import { login } from "@/constants/routes/handleAuth"
import { webviews } from "@/constants/routes/webviews"
import { appRouter } from "@/server"
import { createContext } from "@/server/context"
import { createCallerFactory } from "@/server/trpc"
import { auth } from "@/auth"
import type { Session } from "next-auth"
const createCaller = createCallerFactory(appRouter)
export async function createAppContext() {
const headersList = await headers()
const cookie = await cookies()
const webviewTokenCookie = cookie.get("webviewToken")
const loginType = headersList.get("loginType")
const ctx = createContext({
lang: headersList.get("x-lang") as Lang,
pathname: headersList.get("x-pathname")!,
uid: headersList.get("x-uid"),
url: headersList.get("x-url")!,
webToken: webviewTokenCookie?.value,
contentType: headersList.get("x-contenttype")!,
auth: async () => {
const session = await auth()
const webToken = webviewTokenCookie?.value
if (!session?.token && !webToken) {
return null
}
return (
session ||
({
token: { access_token: webToken, loginType },
} as Session)
)
},
})
return ctx
}
export async function serverClient() {
const ctx = await createContext()
const ctx = await createAppContext()
return createCaller(ctx, {
onError: ({ ctx, error, input, path, type }) => {
console.error(`[serverClient] error for ${type}: ${path}`, error)