Merged in feat/sw-2863-move-contentstack-router-to-trpc-package (pull request #2389)

feat(SW-2863): Move contentstack router to trpc package

* 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

* WIP first step

* update internal imports in trpc

* Fix most errors in scandic-web

Just 100 left...

* Move Props type out of trpc

* Fix CategorizedFilters types

* Move more schemas in hotel router

* Fix deps

* fix getNonContentstackUrls

* Fix import error

* Fix entry error handling

* Fix generateMetadata metrics

* Fix alertType enum

* Fix duplicated types

* lint:fix

* Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package

* Fix broken imports

* Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package


Approved-by: Linus Flood
This commit is contained in:
Anton Gunnarsson
2025-06-26 07:53:01 +00:00
parent 0263ab8c87
commit 002d093af4
921 changed files with 3112 additions and 3008 deletions

View File

@@ -0,0 +1,57 @@
import { z } from "zod"
import { RoomPackageCodeEnum } from "../../../../enums/roomFilter"
import { AvailabilityEnum } from "../../../../enums/selectHotel"
import {
corporateChequeProduct,
priceProduct,
productSchema,
redemptionProduct,
voucherProduct,
} from "./product"
export const roomConfigurationSchema = z.object({
breakfastIncludedInAllRatesMember: z.boolean().default(false),
breakfastIncludedInAllRates: z.boolean().default(false),
features: z
.array(
z.object({
inventory: z.number(),
code: z.enum([
RoomPackageCodeEnum.PET_ROOM,
RoomPackageCodeEnum.ALLERGY_ROOM,
RoomPackageCodeEnum.ACCESSIBILITY_ROOM,
]),
})
)
.default([]),
products: z.array(productSchema).default([]),
roomsLeft: z.number(),
roomType: z.string(),
roomTypeCode: z.string(),
status: z
.nativeEnum(AvailabilityEnum)
.nullish()
.default(AvailabilityEnum.NotAvailable),
// Red
campaign: z
.array(priceProduct)
.optional()
.transform((val) => (val ? val.filter(Boolean) : [])),
// Blue
code: z
.array(z.union([corporateChequeProduct, priceProduct, voucherProduct]))
.optional()
.transform((val) => (val ? val.filter(Boolean) : [])),
// Beige
regular: z
.array(priceProduct)
.optional()
.transform((val) => (val ? val.filter(Boolean) : [])),
// Burgundy
redemptions: z
.array(redemptionProduct)
.optional()
.transform((val) => (val ? val.filter(Boolean) : [])),
})

View File

@@ -0,0 +1,132 @@
import { z } from "zod"
import { RateEnum } from "../../../../enums/rate"
import {
productTypeCorporateChequeSchema,
productTypePointsSchema,
productTypePriceSchema,
productTypeVoucherSchema,
} from "../productTypePrice"
import { rateDefinitionSchema } from "./rateDefinition"
const baseProductSchema = z.object({
// transform empty string to undefined
bookingCode: z
.string()
.optional()
.transform((val) => val),
// Used to set the rate that we use to chose titles etc.
rate: z.nativeEnum(RateEnum).default(RateEnum.save),
rateDefinition: rateDefinitionSchema.optional().transform((val) =>
val
? val
: {
breakfastIncluded: false,
cancellationRule: "",
cancellationText: "",
displayPriceRed: false,
isCampaignRate: false,
isMemberRate: false,
isPackageRate: false,
generalTerms: [],
mustBeGuaranteed: false,
rateCode: "",
rateType: "",
title: "",
}
),
rateDefinitionMember: rateDefinitionSchema.optional(),
})
function mapBaseProduct(baseProduct: typeof baseProductSchema._type) {
return {
bookingCode: baseProduct.bookingCode,
rate: baseProduct.rate,
rateDefinition: baseProduct.rateDefinition,
rateDefinitionMember: baseProduct.rateDefinitionMember,
}
}
export const corporateChequeProduct = z
.object({
productType: z
.object({
bonusCheque: productTypeCorporateChequeSchema,
})
.transform((data) => ({
corporateCheque: data.bonusCheque,
})),
})
.merge(baseProductSchema)
.transform((data) => ({
...data.productType,
...mapBaseProduct(data),
}))
export const priceProduct = z
.object({
productType: z.object({
member: productTypePriceSchema.nullish().default(null),
public: productTypePriceSchema.nullish().default(null),
}),
})
.merge(baseProductSchema)
.transform((data) => ({
...data.productType,
...mapBaseProduct(data),
}))
export const redemptionProduct = z
.object({
redemption: productTypePointsSchema,
})
.merge(baseProductSchema)
.transform((data) => ({
redemption: data.redemption,
...mapBaseProduct(data),
}))
export const redemptionsProduct = z
.object({
productType: z.object({
redemptions: z
.array(productTypePointsSchema.merge(baseProductSchema))
.transform((data) =>
data.map(
({
bookingCode,
rate,
rateDefinition,
rateDefinitionMember,
...redemption
}) => ({
bookingCode,
rate,
rateDefinition,
rateDefinitionMember,
redemption,
})
)
),
}),
})
.transform((data) => data.productType.redemptions)
export const voucherProduct = z
.object({
productType: z.object({
voucher: productTypeVoucherSchema,
}),
})
.merge(baseProductSchema)
.transform((data) => ({
...data.productType,
...mapBaseProduct(data),
}))
export const productSchema = z.union([
corporateChequeProduct,
redemptionsProduct,
voucherProduct,
priceProduct,
])

View File

@@ -0,0 +1,18 @@
import { z } from "zod"
import { nullableStringValidator } from "@scandic-hotels/common/utils/zod/stringValidator"
export const rateDefinitionSchema = z.object({
breakfastIncluded: z.boolean(),
cancellationRule: z.string(),
cancellationText: nullableStringValidator,
displayPriceRed: z.boolean().default(false),
generalTerms: z.array(z.string()),
isCampaignRate: z.boolean().default(false),
isMemberRate: z.boolean().default(false),
isPackageRate: z.boolean().default(false),
mustBeGuaranteed: z.boolean(),
rateCode: z.string(),
rateType: nullableStringValidator,
title: z.string(),
})