web: bump to node 22, next 15, react 19, etc.

This commit is contained in:
2025-04-30 19:21:33 +02:00
parent 7030950850
commit cc2a11cd64
21 changed files with 2384 additions and 2580 deletions

View File

@ -1,6 +1,6 @@
# Based on https://github.com/vercel/next.js/tree/canary/examples/with-docker # Based on https://github.com/vercel/next.js/tree/canary/examples/with-docker
FROM node:20-alpine AS base FROM node:22-alpine AS base
# Install dependencies only when needed # Install dependencies only when needed
FROM base AS deps FROM base AS deps

2
web/mise.toml Normal file
View File

@ -0,0 +1,2 @@
[tools]
node = "22"

4722
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,31 +10,31 @@
"codegen": "graphql-codegen" "codegen": "graphql-codegen"
}, },
"dependencies": { "dependencies": {
"@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/cli": "^5.0.5",
"@graphql-codegen/client-preset": "^4.3.3", "@graphql-codegen/client-preset": "^4.8.0",
"@parcel/watcher": "^2.4.1", "@parcel/watcher": "^2.5.1",
"@sindresorhus/slugify": "^2.2.1", "@sindresorhus/slugify": "^2.2.1",
"@urql/next": "^1.1.1", "@urql/next": "^1.1.5",
"date-fns": "^3.6.0", "date-fns": "^4.1.0",
"date-fns-tz": "^3.1.3", "date-fns-tz": "^3.2.0",
"graphql": "^16.9.0", "graphql": "^16.11.0",
"next": "^14.2.6", "next": "^15.3.1",
"nuqs": "^1.17.8", "nuqs": "^2.4.3",
"react": "^18", "react": "^19.1.0",
"react-dom": "^18", "react-dom": "^19.1.0",
"react-intersection-observer": "^9.13.0", "react-intersection-observer": "^9.16.0",
"sass": "^1.77.8", "sass": "^1.87.0",
"sharp": "^0.33.5", "sharp": "^0.34.1",
"swiper": "^11.1.10", "swiper": "^11.2.6",
"urql": "^4.1.0", "urql": "^4.2.2",
"use-debounce": "^10.0.3" "use-debounce": "^10.0.4"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20", "@types/node": "^22",
"@types/react": "^18", "@types/react": "^19",
"@types/react-dom": "^18", "@types/react-dom": "^19",
"eslint": "^8", "eslint": "^9",
"eslint-config-next": "14.2.6", "eslint-config-next": "^15.3.1",
"typescript": "^5" "typescript": "^5"
} }
} }

View File

@ -71,11 +71,13 @@ export async function generateStaticParams() {
}); });
} }
type Params = Promise<{ url: string[] }>;
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Params },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { url } = params; const { url } = await params;
const urlPath = getWagtailUrlPath(url); const urlPath = getWagtailUrlPath(url);
const { data, error } = await getClient().query(genericPageByUrlPathQuery, { const { data, error } = await getClient().query(genericPageByUrlPathQuery, {
urlPath: urlPath, urlPath: urlPath,
@ -93,8 +95,8 @@ export async function generateMetadata(
return metadata; return metadata;
} }
export default async function Page({ params }: { params: { url: string[] } }) { export default async function Page({ params }: { params: Params }) {
const { url } = params; const { url } = await params;
const urlPath = getWagtailUrlPath(url); const urlPath = getWagtailUrlPath(url);
const { data, error } = await getClient().query(genericPageByUrlPathQuery, { const { data, error } = await getClient().query(genericPageByUrlPathQuery, {
urlPath: urlPath, urlPath: urlPath,

View File

@ -44,12 +44,15 @@ export async function generateStaticParams() {
})); }));
} }
type Params = Promise<{ slug: string }>;
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { slug: string } }, { params }: { params: Params },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { slug } = await params;
const { data, error } = await getClient().query(newsBySlugQuery, { const { data, error } = await getClient().query(newsBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {
throw new Error(error.message); throw new Error(error.message);
@ -62,9 +65,10 @@ export async function generateMetadata(
return metadata; return metadata;
} }
export default async function Page({ params }: { params: { slug: string } }) { export default async function Page({ params }: { params: Params }) {
const { slug } = await params;
const { data, error } = await getClient().query(newsBySlugQuery, { const { data, error } = await getClient().query(newsBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {

View File

@ -6,7 +6,7 @@ import { newsQuery, NewsFragment, NewsIndexFragment } from "@/lib/news";
import { getSeoMetadata } from "@/lib/seo"; import { getSeoMetadata } from "@/lib/seo";
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(newsQuery, {}); const { data, error } = await getClient().query(newsQuery, {});

View File

@ -34,15 +34,7 @@ type ResponseData = {
total: number; total: number;
}; };
const whitelistFilter = (obj: Record<string, any>, whitelist: string[]) => export async function GET(req: NextRequest) {
Object.entries(obj)
.filter(([key, value]) => whitelist.includes(key))
.reduce(
(obj: Record<string, any>, [key, value]) => ((obj[key] = value), obj),
{}
);
export async function GET(req: NextRequest, res: NextResponse<ResponseData>) {
const searchParams = req.nextUrl.searchParams; const searchParams = req.nextUrl.searchParams;
const view = searchParams.get("view"); const view = searchParams.get("view");
@ -80,15 +72,20 @@ export async function GET(req: NextRequest, res: NextResponse<ResponseData>) {
: null; : null;
return { return {
url: `${process.env.URL}/arrangementer/${event.slug}`, id: event.id,
slug: event.slug,
title: event.title,
subtitle: event.subtitle,
nextOccurrence: nextOccurrence, nextOccurrence: nextOccurrence,
url: `${process.env.URL}/arrangementer/${event.slug}`,
futureOccurrencesCount: futureOccurrences.length, futureOccurrencesCount: futureOccurrences.length,
...whitelistFilter(event, keepKeys), } as CompactEvent;
};
}); });
return NextResponse.json( const responseData: ResponseData = {
{ events: compactEvents, total: compactEvents.length }, events: compactEvents,
{ status: 200 } total: compactEvents.length,
); };
return NextResponse.json(responseData, { status: 200 });
} }

View File

@ -45,12 +45,15 @@ export async function generateStaticParams() {
})); }));
} }
type Params = Promise<{ slug: string }>;
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { slug: string } }, { params }: { params: Params },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { slug } = await params;
const { data, error } = await getClient().query(eventBySlugQuery, { const { data, error } = await getClient().query(eventBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {
@ -65,9 +68,10 @@ export async function generateMetadata(
return metadata; return metadata;
} }
export default async function Page({ params }: { params: { slug: string } }) { export default async function Page({ params }: { params: Params }) {
const { slug } = await params;
const { data, error } = await getClient().query(eventBySlugQuery, { const { data, error } = await getClient().query(eventBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {

View File

@ -14,7 +14,7 @@ import { EventIndexFragment, VenueFragment } from "@/gql/graphql";
import { getSeoMetadata } from "@/lib/seo"; import { getSeoMetadata } from "@/lib/seo";
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(eventIndexMetadataQuery, {}); const { data, error } = await getClient().query(eventIndexMetadataQuery, {});

View File

@ -20,12 +20,15 @@ const associationBySlugQuery = graphql(`
} }
`); `);
type Params = Promise<{ slug: string }>;
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { slug: string } }, { params }: { params: Params },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { slug } = await params;
const { data, error } = await getClient().query(associationBySlugQuery, { const { data, error } = await getClient().query(associationBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {
@ -65,9 +68,10 @@ export async function generateStaticParams() {
})); }));
} }
export default async function Page({ params }: { params: { slug: string } }) { export default async function Page({ params }: { params: Params }) {
const { slug } = await params;
const { data, error } = await getClient().query(associationBySlugQuery, { const { data, error } = await getClient().query(associationBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {

View File

@ -26,7 +26,7 @@ const allAssociationsQuery = graphql(`
`); `);
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(allAssociationsQuery, {}); const { data, error } = await getClient().query(allAssociationsQuery, {});

View File

@ -33,7 +33,7 @@ const ContactIndexDefinition = graphql(`
`); `);
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(contactQuery, {}); const { data, error } = await getClient().query(contactQuery, {});

View File

@ -2,6 +2,7 @@ import "@/css/main.scss";
import { Header } from "@/components/layout/Header"; import { Header } from "@/components/layout/Header";
import { Footer } from "@/components/layout/Footer"; import { Footer } from "@/components/layout/Footer";
import { Metadata } from "next"; import { Metadata } from "next";
import { NuqsAdapter } from "nuqs/adapters/next/app";
const baseUrlMetadata = process.env.URL const baseUrlMetadata = process.env.URL
? { metadataBase: new URL(process.env.URL) } ? { metadataBase: new URL(process.env.URL) }
@ -43,9 +44,11 @@ export default function RootLayout({
)} )}
</head> </head>
<body> <body>
<NuqsAdapter>
<Header /> <Header />
{children} {children}
<Footer /> <Footer />
</NuqsAdapter>
</body> </body>
</html> </html>
); );

View File

@ -20,12 +20,15 @@ const venueBySlugQuery = graphql(`
} }
`); `);
type Params = Promise<{ slug: string }>;
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { slug: string } }, { params }: { params: Params },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { slug } = await params;
const { data, error } = await getClient().query(venueBySlugQuery, { const { data, error } = await getClient().query(venueBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {
@ -65,9 +68,10 @@ export async function generateStaticParams() {
})); }));
} }
export default async function Page({ params }: { params: { slug: string } }) { export default async function Page({ params }: { params: Params }) {
const { slug } = await params;
const { data, error } = await getClient().query(venueBySlugQuery, { const { data, error } = await getClient().query(venueBySlugQuery, {
slug: params.slug, slug,
}); });
if (error) { if (error) {

View File

@ -70,7 +70,7 @@ const VenueFragmentDefinition = graphql(`
`); `);
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(venueIndexQuery, {}); const { data, error } = await getClient().query(venueIndexQuery, {});

View File

@ -8,11 +8,11 @@ import { Suspense } from "react";
export default async function Page({ export default async function Page({
searchParams, searchParams,
}: { }: {
searchParams?: { searchParams?: Promise<{
q?: string; q?: string;
}; }>;
}) { }) {
const { q: query } = searchParams ?? {}; const { q: query } = (await searchParams) ?? {};
let results = []; let results = [];
if (query) { if (query) {

View File

@ -38,7 +38,7 @@ const VenueRentalIndexDefinition = graphql(`
`); `);
export async function generateMetadata( export async function generateMetadata(
{ params }: { params: { url: string[] } }, { params }: { params: Promise<{}> },
parent: ResolvingMetadata parent: ResolvingMetadata
): Promise<Metadata | null> { ): Promise<Metadata | null> {
const { data, error } = await getClient().query(venueRentalIndexQuery, {}); const { data, error } = await getClient().query(venueRentalIndexQuery, {});

View File

@ -1,8 +1,8 @@
@import 'fonts.scss'; @use 'fonts.scss';
@import 'variables.scss'; @use 'variables.scss';
@import 'animations.scss'; @use 'animations.scss';
@import 'base.scss'; @use 'base.scss';
@import 'button.scss'; @use 'button.scss';
@import 'news.scss'; @use 'news.scss';

View File

@ -11,8 +11,50 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
* 3. It does not support dead code elimination, so it will add unused operations. * 3. It does not support dead code elimination, so it will add unused operations.
* *
* Therefore it is highly recommended to use the babel or swc plugin for production. * Therefore it is highly recommended to use the babel or swc plugin for production.
* Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
*/ */
const documents = { type Documents = {
"\n fragment Generic on GenericPage {\n __typename\n id\n urlPath\n seoTitle\n searchDescription\n title\n lead\n pig\n body {\n ...Blocks\n }\n }\n": typeof types.GenericFragmentDoc,
"\n query genericPageByUrl($urlPath: String!) {\n page: page(contentType: \"generic.GenericPage\", urlPath: $urlPath) {\n ... on GenericPage {\n ...Generic\n }\n }\n }\n": typeof types.GenericPageByUrlDocument,
"\n query allGenericSlugs {\n pages(contentType: \"generic.GenericPage\") {\n id\n urlPath\n }\n }\n ": typeof types.AllGenericSlugsDocument,
"\n query newsBySlug($slug: String!) {\n news: page(contentType: \"news.NewsPage\", slug: $slug) {\n ... on NewsPage {\n ...News\n }\n }\n }\n": typeof types.NewsBySlugDocument,
"\n query allNewsSlugs {\n pages(contentType: \"news.NewsPage\") {\n id\n slug\n }\n }\n ": typeof types.AllNewsSlugsDocument,
"\n query eventBySlug($slug: String!) {\n event: page(contentType: \"events.EventPage\", slug: $slug) {\n ... on EventPage {\n ...Event\n }\n }\n }\n": typeof types.EventBySlugDocument,
"\n query allEventSlugs {\n pages(contentType: \"events.EventPage\") {\n id\n slug\n }\n }\n ": typeof types.AllEventSlugsDocument,
"\n query associationBySlug($slug: String!) {\n association: page(\n contentType: \"associations.AssociationPage\"\n slug: $slug\n ) {\n ... on AssociationPage {\n ...Association\n }\n }\n }\n": typeof types.AssociationBySlugDocument,
"\n query allAssociationSlugs {\n pages(contentType: \"associations.AssociationPage\") {\n id\n slug\n }\n }\n ": typeof types.AllAssociationSlugsDocument,
"\n query allAssociations {\n index: associationIndex {\n ... on AssociationIndex {\n ...AssociationIndex\n }\n }\n associations: pages(\n contentType: \"associations.AssociationPage\"\n limit: 1000\n ) {\n ... on AssociationPage {\n ...Association\n }\n }\n }\n": typeof types.AllAssociationsDocument,
"\n fragment AssociationIndex on AssociationIndex {\n ... on AssociationIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": typeof types.AssociationIndexFragmentDoc,
"\n fragment Association on AssociationPage {\n __typename\n id\n slug\n title\n seoTitle\n searchDescription\n excerpt\n lead\n body {\n ...Blocks\n }\n logo {\n url\n width\n height\n }\n associationType\n websiteUrl\n }\n": typeof types.AssociationFragmentDoc,
"\n query contacts {\n index: contactIndex {\n ... on ContactIndex {\n ...ContactIndex\n }\n }\n }\n": typeof types.ContactsDocument,
"\n fragment ContactIndex on ContactIndex {\n ... on ContactIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": typeof types.ContactIndexFragmentDoc,
"\n query venueBySlug($slug: String!) {\n venue: page(contentType: \"venues.VenuePage\", slug: $slug) {\n ... on VenuePage {\n ...Venue\n }\n }\n }\n": typeof types.VenueBySlugDocument,
"\n query allVenueSlugs {\n pages(contentType: \"venues.VenuePage\", limit: 100) {\n id\n slug\n }\n }\n ": typeof types.AllVenueSlugsDocument,
"\n query venueIndex {\n index: venueIndex {\n ... on VenueIndex {\n ...VenueIndex\n }\n }\n venues: pages(contentType: \"venues.VenuePage\", limit: 100) {\n ... on VenuePage {\n ...Venue\n }\n }\n }\n": typeof types.VenueIndexDocument,
"\n fragment VenueIndex on VenueIndex {\n ... on VenueIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": typeof types.VenueIndexFragmentDoc,
"\n fragment Venue on VenuePage {\n __typename\n id\n slug\n title\n seoTitle\n searchDescription\n images {\n ...Blocks\n }\n body {\n ...Blocks\n }\n featuredImage {\n ...Image\n }\n showAsBookable\n showInOverview\n floor\n preposition\n usedFor\n techSpecsUrl\n capabilityAudio\n capabilityAudioVideo\n capabilityBar\n capabilityLighting\n capacityLegal\n capacityStanding\n capacitySitting\n }\n": typeof types.VenueFragmentDoc,
"\n fragment Home on HomePage {\n ... on HomePage {\n featuredEvents {\n id\n }\n }\n }\n": typeof types.HomeFragmentDoc,
"\n query home {\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n home: page(contentType: \"home.HomePage\", urlPath: \"/home/\") {\n ... on HomePage {\n ...Home\n }\n }\n news: pages(contentType: \"news.newsPage\", order: \"-first_published_at\", limit: 4) {\n ... on NewsPage {\n ...News\n }\n }\n }\n ": typeof types.HomeDocument,
"\n query search($query: String) {\n results: search(query: $query) {\n __typename\n ... on PageInterface {\n slug\n }\n ... on NewsPage {\n id\n title\n }\n ... on EventPage {\n id\n title\n }\n ... on GenericPage {\n id\n title\n }\n ... on VenuePage {\n id\n title\n }\n ... on AssociationPage {\n id\n title\n associationType\n }\n }\n }\n ": typeof types.SearchDocument,
"\n query venueRentalIndex {\n index: venueRentalIndex {\n ... on VenueRentalIndex {\n ...VenueRentalIndex\n }\n }\n venues: pages(contentType: \"venues.VenuePage\", limit: 100) {\n ... on VenuePage {\n ...Venue\n }\n }\n }\n": typeof types.VenueRentalIndexDocument,
"\n fragment VenueRentalIndex on VenueRentalIndex {\n ... on VenueRentalIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": typeof types.VenueRentalIndexFragmentDoc,
"\n fragment OneLevelOfBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n }\n": typeof types.OneLevelOfBlocksFragmentDoc,
"\n fragment Blocks on StreamFieldInterface {\n ... on AccordionBlock {\n heading\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on ContactSectionBlock {\n title\n text\n blocks {\n ... on ContactSubsectionBlock {\n title\n text\n blocks {\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n": typeof types.BlocksFragmentDoc,
"\n fragment Image on CustomImage {\n id\n url\n width\n height\n alt\n attribution\n }\n": typeof types.ImageFragmentDoc,
"\n fragment ContactEntity on ContactEntity {\n id\n name\n contactType\n title\n email\n phoneNumber\n image {\n ...Image\n }\n }\n": typeof types.ContactEntityFragmentDoc,
"\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n": typeof types.EventFragmentDoc,
"\n fragment EventIndex on EventIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n }\n": typeof types.EventIndexFragmentDoc,
"\n query eventIndexMetadata {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n }\n": typeof types.EventIndexMetadataDocument,
"\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n": typeof types.FutureEventsDocument,
"\n fragment News on NewsPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n firstPublishedAt\n excerpt\n lead\n featuredImage {\n ...Image\n }\n body {\n ...Blocks\n }\n }\n": typeof types.NewsFragmentDoc,
"\n fragment NewsIndex on NewsIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n lead\n }\n": typeof types.NewsIndexFragmentDoc,
"\n query news {\n index: newsIndex {\n ... on NewsIndex {\n ...NewsIndex\n }\n }\n news: pages(contentType: \"news.NewsPage\", order: \"-first_published_at\", limit: 1000) {\n ... on NewsPage {\n ...News\n }\n }\n }\n": typeof types.NewsDocument,
"\n query openingHoursSets {\n openingHoursSets {\n ...OpeningHoursSetFragment\n }\n }\n": typeof types.OpeningHoursSetsDocument,
"\n fragment OpeningHoursSetFragment on OpeningHoursSet {\n name\n effectiveFrom\n effectiveTo\n announcement\n items {\n id\n function\n week {\n id\n blockType\n ... on OpeningHoursWeekBlock {\n ...OpeningHoursWeekBlock\n }\n }\n }\n }\n": typeof types.OpeningHoursSetFragmentFragmentDoc,
"\n fragment OpeningHoursRangeBlock on OpeningHoursRangeBlock {\n timeFrom\n timeTo\n custom\n }\n": typeof types.OpeningHoursRangeBlockFragmentDoc,
"\n fragment OpeningHoursWeekBlock on OpeningHoursWeekBlock {\n monday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n tuesday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n wednesday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n thursday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n friday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n saturday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n sunday {\n ... on OpeningHoursRangeBlock {\n ...OpeningHoursRangeBlock\n }\n }\n }\n": typeof types.OpeningHoursWeekBlockFragmentDoc,
};
const documents: Documents = {
"\n fragment Generic on GenericPage {\n __typename\n id\n urlPath\n seoTitle\n searchDescription\n title\n lead\n pig\n body {\n ...Blocks\n }\n }\n": types.GenericFragmentDoc, "\n fragment Generic on GenericPage {\n __typename\n id\n urlPath\n seoTitle\n searchDescription\n title\n lead\n pig\n body {\n ...Blocks\n }\n }\n": types.GenericFragmentDoc,
"\n query genericPageByUrl($urlPath: String!) {\n page: page(contentType: \"generic.GenericPage\", urlPath: $urlPath) {\n ... on GenericPage {\n ...Generic\n }\n }\n }\n": types.GenericPageByUrlDocument, "\n query genericPageByUrl($urlPath: String!) {\n page: page(contentType: \"generic.GenericPage\", urlPath: $urlPath) {\n ... on GenericPage {\n ...Generic\n }\n }\n }\n": types.GenericPageByUrlDocument,
"\n query allGenericSlugs {\n pages(contentType: \"generic.GenericPage\") {\n id\n urlPath\n }\n }\n ": types.AllGenericSlugsDocument, "\n query allGenericSlugs {\n pages(contentType: \"generic.GenericPage\") {\n id\n urlPath\n }\n }\n ": types.AllGenericSlugsDocument,

View File

@ -1,6 +1,10 @@
{ {
"compilerOptions": { "compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"], "lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,
@ -18,9 +22,19 @@
} }
], ],
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": [
} "./src/*"
]
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "target": "ES2017"
"exclude": ["node_modules"] },
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
} }