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,7 +1,8 @@
import { type NextRequest, NextResponse } from "next/server"
import { AuthError } from "next-auth"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { env } from "@/env/server"
import { internalServerError } from "@/server/errors/next"
import { getPublicURL } from "@/server/utils"

View File

@@ -1,5 +1,7 @@
import { notFound } from "next/navigation"
import { getServiceToken } from "@scandic-hotels/common/tokenManager"
import {
BookingErrorCodeEnum,
PaymentCallbackStatusEnum,
@@ -10,7 +12,6 @@ import {
} from "@/constants/routes/hotelReservation"
import { serverClient } from "@/lib/trpc/server"
import { getBooking } from "@/server/routers/booking/utils"
import { getServiceToken } from "@/server/tokenManager"
import { auth } from "@/auth"
import HandleErrorCallback from "@/components/HotelReservation/EnterDetails/Payment/PaymentCallback/HandleErrorCallback"

View File

@@ -1,7 +1,8 @@
import { type NextRequest, NextResponse } from "next/server"
import { AuthError } from "next-auth"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { env } from "@/env/server"
import { internalServerError } from "@/server/errors/next"
import { getPublicURL } from "@/server/utils"

View File

@@ -6,7 +6,7 @@ import { getPublicURL } from "@/server/utils"
import { signIn } from "@/auth"
import type { Lang } from "@/constants/languages"
import type { Lang } from "@scandic-hotels/common/constants/language"
export async function GET(
request: NextRequest,

View File

@@ -5,9 +5,10 @@ import { useParams, useRouter, useSearchParams } from "next/navigation"
import { startTransition, useEffect, useRef } from "react"
import { useIntl } from "react-intl"
import { SESSION_EXPIRED } from "@scandic-hotels/trpc/errors"
import { login } from "@/constants/routes/handleAuth"
import { env } from "@/env/client"
import { SESSION_EXPIRED } from "@/server/errors/trpc"
import styles from "./error.module.css"

View File

@@ -7,7 +7,8 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools"
import Script from "next/script"
import { SessionProvider } from "next-auth/react"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import TrpcProvider from "@/lib/trpc/Provider"
import { SessionRefresher } from "@/components/Auth/TokenRefresher"

View File

@@ -7,7 +7,7 @@ import "@scandic-hotels/design-system/style.css"
import Script from "next/script"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import TokenRefresher from "@/components/Auth/TokenRefresher"
import CookieBotConsent from "@/components/CookieBot"
@@ -35,12 +35,9 @@ export default async function RootLayout(
LayoutArgs<LangParams> & { header: React.ReactNode }
>
) {
const params = await props.params;
const params = await props.params
const {
children,
header
} = props;
const { children, header } = props
setLang(params.lang)
const messages = await getMessages(params.lang)

View File

@@ -7,7 +7,8 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools"
import Script from "next/script"
import { SessionProvider } from "next-auth/react"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import TrpcProvider from "@/lib/trpc/Provider"
import { SessionRefresher } from "@/components/Auth/TokenRefresher"
@@ -23,12 +24,12 @@ import { setLang } from "@/i18n/serverContext"
import type { LangParams, LayoutArgs } from "@/types/params"
export default async function RootLayout(props: React.PropsWithChildren<LayoutArgs<LangParams>>) {
const params = await props.params;
export default async function RootLayout(
props: React.PropsWithChildren<LayoutArgs<LangParams>>
) {
const params = await props.params
const {
children
} = props;
const { children } = props
setLang(params.lang)
const messages = await getMessages(params.lang)

View File

@@ -14,8 +14,9 @@ import { getIntl } from "@/i18n"
import { SASModal } from "../components/SASModal"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { LangParams, PageArgs, SearchParams } from "@/types/params"
import type { Lang } from "@/constants/languages"
import type { State } from "../sasUtils"
const searchParamsSchema = z.object({
@@ -24,9 +25,11 @@ const searchParamsSchema = z.object({
type Intent = z.infer<typeof searchParamsSchema>["intent"]
export default async function SASxScandicLoginPage(props: PageArgs<LangParams> & SearchParams) {
const params = await props.params;
const searchParams = await props.searchParams;
export default async function SASxScandicLoginPage(
props: PageArgs<LangParams> & SearchParams
) {
const params = await props.params
const searchParams = await props.searchParams
const result = searchParamsSchema.safeParse(searchParams)
if (!result.success) {
// TOOD where to redirect?

View File

@@ -14,10 +14,10 @@ import OneTimePasswordForm, {
type OnSubmitHandler,
} from "./OneTimePasswordForm"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { ReactNode } from "react"
import type { LangParams, PageArgs, SearchParams } from "@/types/params"
import type { Lang } from "@/constants/languages"
const otpError = z.enum(["invalidCode", "expiredCode"])
const intent = z.enum(["link", "unlink", "transfer"])

View File

@@ -17,8 +17,9 @@ import { SASModal } from "../../components/SASModal"
import styles from "./transferSuccess.module.css"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { LangParams, PageArgs, SearchParams } from "@/types/params"
import type { Lang } from "@/constants/languages"
export default async function SASxScandicTransferSuccessPage(
props: PageArgs<LangParams> & SearchParams<{ p?: string }>

View File

@@ -6,7 +6,8 @@ import "@scandic-hotels/design-system/style.css"
import { ReactQueryDevtools } from "@tanstack/react-query-devtools"
import Script from "next/script"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { env } from "@/env/server"
import TrpcProvider from "@/lib/trpc/Provider"

View File

@@ -5,7 +5,8 @@ import "@scandic-hotels/design-system/style.css"
import Script from "next/script"
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import TrpcProvider from "@/lib/trpc/Provider"
import { ToastHandler } from "@/components/TempDesignSystem/Toasts"

View File

@@ -1,4 +1,5 @@
import { Lang } from "@/constants/languages"
import { Lang } from "@scandic-hotels/common/constants/language"
import { profile } from "@/constants/routes/myPages"
import { serverClient } from "@/lib/trpc/server"
import { getPublicURL } from "@/server/utils"

View File

@@ -2,9 +2,9 @@ import { revalidateTag } from "next/cache"
import { headers } from "next/headers"
import { z } from "zod"
import { Lang } from "@scandic-hotels/common/constants/language"
import { getCacheClient } from "@scandic-hotels/common/dataCache"
import { Lang } from "@/constants/languages"
import { env } from "@/env/server"
import { badRequest, internalServerError, notFound } from "@/server/errors/next"

View File

@@ -2,9 +2,9 @@ import { revalidateTag } from "next/cache"
import { headers } from "next/headers"
import { z } from "zod"
import { Lang } from "@scandic-hotels/common/constants/language"
import { getCacheClient } from "@scandic-hotels/common/dataCache"
import { Lang } from "@/constants/languages"
import { env } from "@/env/server"
import { badRequest, internalServerError, notFound } from "@/server/errors/next"

View File

@@ -8,7 +8,7 @@ import { badRequest, internalServerError } from "@/server/errors/next"
import { generateTag } from "@/utils/generateTag"
import type { Lang } from "@/constants/languages"
import type { Lang } from "@scandic-hotels/common/constants/language"
// This file is primarily to be used locally to test
// purging your cache for new (and old) requests

View File

@@ -2,9 +2,9 @@ import { revalidateTag } from "next/cache"
import { headers } from "next/headers"
import { z } from "zod"
import { Lang } from "@scandic-hotels/common/constants/language"
import { getCacheClient } from "@scandic-hotels/common/dataCache"
import { Lang } from "@/constants/languages"
import { env } from "@/env/server"
import { badRequest, internalServerError } from "@/server/errors/next"
import { affix as breadcrumbsAffix } from "@/server/routers/contentstack/breadcrumbs/utils"

View File

@@ -1,8 +1,9 @@
import { type NextRequest, NextResponse } from "next/server"
import { createCounter } from "@scandic-hotels/common/telemetry"
import { env } from "@/env/server"
import { dt } from "@/lib/dt"
import { createCounter } from "@/server/telemetry"
import {
getEntries,

View File

@@ -1,7 +1,8 @@
import { Region, Stack } from "contentstack"
import { createCounter } from "@scandic-hotels/common/telemetry"
import { env } from "@/env/server"
import { createCounter } from "@/server/telemetry"
import type { SyncResponse } from "@/types/sitemap"

View File

@@ -1,10 +1,12 @@
import { createCounter } from "@scandic-hotels/common/telemetry"
import { env } from "@/env/server"
import { createCounter } from "@/server/telemetry"
import { removeTrailingSlash } from "@/utils/url"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { SyncItem } from "@/types/sitemap"
import type { Lang } from "@/constants/languages"
export function mergeEntries(
currentEntries: SyncItem[],

View File

@@ -1,11 +1,11 @@
import { fetchRequestHandler } from "@trpc/server/adapters/fetch"
import { createAppContext } from "@/lib/trpc/server"
import { appRouter } from "@/server"
import { createContext } from "@/server/context"
async function handler(req: Request) {
return fetchRequestHandler({
createContext,
createContext: createAppContext,
endpoint: "/api/web/trpc",
req,
router: appRouter,