* update env vars * update middleware * remove pages router and move pages to /app * move to /team * update imports * fix * remove pages router and move org pages to /app * wip * fix orgSlug/user pages * fix orgSlug/user/type pages * remove generateMetadata from embed pages * fix * remove pages router for /user pages * generateMetadata is not needed in embed pages * remove future/org * no layout in [user] page * simplify * fix * fix OG image for [user] * fix OG images for org/user and team/slug * fix OG images for booking page * fix all metadata * use isBrandingHidden * remove BookerSeo and its usages * rename excludeAppNameFromTitle -> hideBranding * remove logic for meeting type in HeadSeo * remove BookerSeo instances from team-view and users-public-view * create generateMeetingMetadata util and use it to reduce duplicate code * remove BookerSeo imports * fix spacing * remove constructMeetingImage mock from head-seo.test * fetch avatarUrl using user id for user page metadata * fix test * remove unused test cases * index and follow must be true by default * invert noindex/nofollow flags * remove HeadSeo for already migrated pages and refactor prepareMetadata * fix organization-settings.e2e.ts * fix order * enable parallel test execution for dynamic-booking e2e test * fix * + could be %2B in app router * refactor handling logic for embeds in app router * fix isEmbed * fix embed-core * remove dead code * move embed pages back to /future * add back embed pages in pages router * revert some changes * fix import type checks * simplify * fix * feat: Implement generateBookingPageMetadata function for improved SEO and metadata handling across user and event pages (#18440) - Added a new utility function `generateBookingPageMetadata` to streamline the generation of metadata for booking and user profile pages. - Updated multiple page components to utilize the new function, enhancing SEO indexing and metadata consistency. - Removed redundant code related to previous metadata generation methods, improving code clarity and maintainability. * fix dirs * Pr-review-fixes-app-router-team-pages (#18450) * Remove unnecessary getPublicEvent call * Remove unused variable * Fix 404 for team page (#18451) * Remove console log --------- Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
80 lines
3.1 KiB
TypeScript
80 lines
3.1 KiB
TypeScript
import { getBucket } from "abTest/utils";
|
|
import type { NextMiddleware, NextRequest } from "next/server";
|
|
import { NextResponse, URLPattern } from "next/server";
|
|
import z from "zod";
|
|
|
|
import { FUTURE_ROUTES_ENABLED_COOKIE_NAME, FUTURE_ROUTES_OVERRIDE_COOKIE_NAME } from "@calcom/lib/constants";
|
|
|
|
const ROUTES: [URLPattern, boolean][] = [
|
|
["/event-types", process.env.APP_ROUTER_EVENT_TYPES_ENABLED === "1"] as const,
|
|
["/apps/installed/:category", process.env.APP_ROUTER_APPS_INSTALLED_CATEGORY_ENABLED === "1"] as const,
|
|
["/apps/:slug", process.env.APP_ROUTER_APPS_SLUG_ENABLED === "1"] as const,
|
|
["/apps/:slug/setup", process.env.APP_ROUTER_APPS_SLUG_SETUP_ENABLED === "1"] as const,
|
|
["/apps/categories", process.env.APP_ROUTER_APPS_CATEGORIES_ENABLED === "1"] as const,
|
|
["/apps/categories/:category", process.env.APP_ROUTER_APPS_CATEGORIES_CATEGORY_ENABLED === "1"] as const,
|
|
["/auth/forgot-password/:path*", process.env.APP_ROUTER_AUTH_FORGOT_PASSWORD_ENABLED === "1"] as const,
|
|
["/auth/login", process.env.APP_ROUTER_AUTH_LOGIN_ENABLED === "1"] as const,
|
|
["/auth/logout", process.env.APP_ROUTER_AUTH_LOGOUT_ENABLED === "1"] as const,
|
|
["/auth/new", process.env.APP_ROUTER_AUTH_NEW_ENABLED === "1"] as const,
|
|
["/auth/saml-idp", process.env.APP_ROUTER_AUTH_SAML_ENABLED === "1"] as const,
|
|
["/auth/error", process.env.APP_ROUTER_AUTH_ERROR_ENABLED === "1"] as const,
|
|
["/auth/platform/:path*", process.env.APP_ROUTER_AUTH_PLATFORM_ENABLED === "1"] as const,
|
|
["/auth/oauth2/:path*", process.env.APP_ROUTER_AUTH_OAUTH2_ENABLED === "1"] as const,
|
|
].map(([pathname, enabled]) => [
|
|
new URLPattern({
|
|
pathname,
|
|
}),
|
|
enabled,
|
|
]);
|
|
|
|
const bucketSchema = z.union([z.literal("legacy"), z.literal("future")]);
|
|
|
|
export const abTestMiddlewareFactory =
|
|
(next: (req: NextRequest) => Promise<NextResponse<unknown>>): NextMiddleware =>
|
|
async (req: NextRequest) => {
|
|
const response = await next(req);
|
|
|
|
const { pathname } = req.nextUrl;
|
|
|
|
const override = req.cookies.has(FUTURE_ROUTES_OVERRIDE_COOKIE_NAME);
|
|
|
|
const route = ROUTES.find(([regExp]) => regExp.test(req.url)) ?? null;
|
|
const enabled = route !== null ? route[1] || override : false;
|
|
|
|
if (pathname.includes("future") || !enabled) {
|
|
return response;
|
|
}
|
|
|
|
const safeParsedBucket = override
|
|
? { success: true as const, data: "future" as const }
|
|
: bucketSchema.safeParse(req.cookies.get(FUTURE_ROUTES_ENABLED_COOKIE_NAME)?.value);
|
|
|
|
if (!safeParsedBucket.success) {
|
|
// cookie does not exist or it has incorrect value
|
|
const bucket = getBucket();
|
|
|
|
response.cookies.set(FUTURE_ROUTES_ENABLED_COOKIE_NAME, bucket, {
|
|
expires: Date.now() + 1000 * 60 * 30,
|
|
httpOnly: true,
|
|
}); // 30 min in ms
|
|
|
|
if (bucket === "legacy") {
|
|
return response;
|
|
}
|
|
|
|
const url = req.nextUrl.clone();
|
|
url.pathname = `future${pathname}/`;
|
|
|
|
return NextResponse.rewrite(url, response);
|
|
}
|
|
|
|
if (safeParsedBucket.data === "legacy") {
|
|
return response;
|
|
}
|
|
|
|
const url = req.nextUrl.clone();
|
|
url.pathname = `future${pathname}/`;
|
|
|
|
return NextResponse.rewrite(url, response);
|
|
};
|