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

@@ -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)