Compare commits
30 Commits
v2.3.18-rc
...
v2.3.22
| Author | SHA1 | Date | |
|---|---|---|---|
| d51e220802 | |||
| ce6436ab0a | |||
| de0089f068 | |||
| 263640bce5 | |||
| 1cc8fa4db4 | |||
| 1db7f3af6c | |||
| 909bad573b | |||
| 24a19adf19 | |||
| 3313206734 | |||
| ec989690ce | |||
| 37807079cd | |||
| af4213ad59 | |||
| dc1ba4def3 | |||
| f87c714402 | |||
| f989e0604f | |||
| 4a2d094cbd | |||
| 77181fc983 | |||
| 32b56696a6 | |||
| 9b28dd20d9 | |||
| 1970ae310f | |||
| 7bc8811a60 | |||
| 530503fa09 | |||
| a539e3c498 | |||
| 14574fb312 | |||
| fdeb34ea3c | |||
| ac189f84f5 | |||
| 06dac33ef8 | |||
| 529696ba8e | |||
| 7922210ef0 | |||
| 5021259d22 |
@@ -532,6 +532,7 @@ jobs:
|
||||
env:
|
||||
NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }}
|
||||
GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || 'klz2026' }}
|
||||
PAYLOAD_SECRET: ${{ secrets.PAYLOAD_SECRET || vars.PAYLOAD_SECRET || 'you-need-to-set-a-payload-secret' }}
|
||||
PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium
|
||||
run: pnpm run check:forms
|
||||
|
||||
|
||||
25
app/api/health/fix-avb-now/route.ts
Normal file
25
app/api/health/fix-avb-now/route.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { getPayload } from 'payload';
|
||||
import config from '@/payload.config';
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const payload = await getPayload({ config });
|
||||
|
||||
// Clear the excerpt for page ID 6
|
||||
await payload.update({
|
||||
collection: 'pages',
|
||||
id: 6,
|
||||
data: {
|
||||
excerpt: '',
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ success: true, message: 'AVB excerpt cleared successfully on production!' });
|
||||
} catch (error: any) {
|
||||
console.error('Error fixing AVB:', error);
|
||||
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
|
||||
}
|
||||
}
|
||||
@@ -4,11 +4,58 @@ import configPromise from '@payload-config';
|
||||
import { renderToStream } from '@react-pdf/renderer';
|
||||
import React from 'react';
|
||||
import { PDFPage } from '@/lib/pdf-page';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export async function GET(req: NextRequest, { params }: { params: Promise<{ slug: string }> }) {
|
||||
try {
|
||||
const { slug } = await params;
|
||||
|
||||
// Handle AGBs specifically - either fetch from collection or use fallback file
|
||||
if (slug === 'agbs') {
|
||||
const payload = await getPayload({ config: configPromise });
|
||||
const currentAgbs = await payload.find({
|
||||
collection: 'agbs-collection',
|
||||
where: {
|
||||
isCurrent: { equals: true },
|
||||
},
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
if (currentAgbs.totalDocs > 0) {
|
||||
const agb = currentAgbs.docs[0];
|
||||
const media = agb.file as any;
|
||||
if (media && media.url) {
|
||||
// If it's a remote URL or absolute path, we might need to fetch it
|
||||
// For now assume it's a local file in public/media
|
||||
const filePath = path.join(process.cwd(), 'public', media.url);
|
||||
if (fs.existsSync(filePath)) {
|
||||
const fileBuffer = fs.readFileSync(filePath);
|
||||
return new NextResponse(fileBuffer, {
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/pdf',
|
||||
'Content-Disposition': `attachment; filename="${media.filename}"`,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback for hardcoded legacy AGB
|
||||
const filePath = path.join(process.cwd(), 'public', 'AVB-KLZ-4-2026.pdf');
|
||||
if (fs.existsSync(filePath)) {
|
||||
const fileBuffer = fs.readFileSync(filePath);
|
||||
return new NextResponse(fileBuffer, {
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/pdf',
|
||||
'Content-Disposition': `attachment; filename="AVB-KLZ-4-2026.pdf"`,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Get Payload App
|
||||
const payload = await getPayload({ config: configPromise });
|
||||
|
||||
|
||||
16
app/health/fix-avb/route.ts
Normal file
16
app/health/fix-avb/route.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { getPayload } from 'payload'
|
||||
import config from '@payload-config'
|
||||
|
||||
export async function GET() {
|
||||
const payload = await getPayload({ config })
|
||||
|
||||
await payload.update({
|
||||
collection: 'pages',
|
||||
id: 6,
|
||||
data: {
|
||||
excerpt: '',
|
||||
},
|
||||
})
|
||||
|
||||
return Response.json({ success: true, message: 'AVB excerpt cleared' })
|
||||
}
|
||||
76
components/AgbHistoryBlock.tsx
Normal file
76
components/AgbHistoryBlock.tsx
Normal file
@@ -0,0 +1,76 @@
|
||||
import React from 'react';
|
||||
import { getPayload } from 'payload';
|
||||
import configPromise from '@payload-config';
|
||||
import { Heading } from '@/components/ui';
|
||||
|
||||
export const AgbHistoryBlock: React.FC<{ title: string }> = async ({ title }) => {
|
||||
const payload = await getPayload({ config: configPromise });
|
||||
|
||||
const agbs = await payload.find({
|
||||
collection: 'agbs-collection',
|
||||
sort: '-versionDate',
|
||||
limit: 100,
|
||||
});
|
||||
|
||||
if (agbs.totalDocs === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="my-16 p-8 md:p-12 bg-neutral-light rounded-3xl shadow-sm border border-neutral-medium">
|
||||
<Heading level={3} className="mb-8 text-saturated">
|
||||
{title || 'Vorherige Versionen'}
|
||||
</Heading>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
{agbs.docs.map((agb: any) => {
|
||||
const date = new Date(agb.versionDate).toLocaleDateString('de-DE', {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
});
|
||||
|
||||
const fileUrl = typeof agb.file === 'object' ? agb.file.url : '';
|
||||
const filename = typeof agb.file === 'object' ? agb.file.filename : 'agb.pdf';
|
||||
|
||||
return (
|
||||
<div
|
||||
key={agb.id}
|
||||
className="flex items-center justify-between p-6 bg-white rounded-2xl shadow-sm border border-neutral-medium hover:border-primary transition-all group"
|
||||
>
|
||||
<div>
|
||||
<h4 className="font-bold text-saturated group-hover:text-primary transition-colors">
|
||||
{agb.title}
|
||||
</h4>
|
||||
<p className="text-sm text-text-secondary mt-1">Gültig ab {date}</p>
|
||||
</div>
|
||||
{fileUrl && (
|
||||
<a
|
||||
href={fileUrl}
|
||||
download={filename}
|
||||
className="p-3 bg-neutral-light text-primary rounded-full hover:bg-primary hover:text-white transition-all shadow-sm"
|
||||
title="PDF herunterladen"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
>
|
||||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
|
||||
<polyline points="7 10 12 15 17 10" />
|
||||
<line x1="12" x2="12" y1="15" y2="3" />
|
||||
</svg>
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -38,6 +38,7 @@ import GallerySection from '@/components/home/GallerySection';
|
||||
import VideoSection from '@/components/home/VideoSection';
|
||||
import CTA from '@/components/home/CTA';
|
||||
import { PDFDownloadBlock } from '@/components/PDFDownloadBlock';
|
||||
import { AgbHistoryBlock } from '@/components/AgbHistoryBlock';
|
||||
|
||||
/**
|
||||
* Splits a text string on \n and intersperses <br /> elements.
|
||||
@@ -436,6 +437,8 @@ const jsxConverters: JSXConverters = {
|
||||
'block-pdfDownload': ({ node }: any) => (
|
||||
<PDFDownloadBlock label={node.fields.label} style={node.fields.style} />
|
||||
),
|
||||
agbHistory: ({ node }: any) => <AgbHistoryBlock title={node.fields.title} />,
|
||||
'block-agbHistory': ({ node }: any) => <AgbHistoryBlock title={node.fields.title} />,
|
||||
// ─── New Page Blocks ───────────────────────────────────────────
|
||||
heroSection: ({ node }: any) => {
|
||||
const f = node.fields;
|
||||
@@ -793,8 +796,8 @@ const jsxConverters: JSXConverters = {
|
||||
</Section>
|
||||
);
|
||||
},
|
||||
imageGallery: ({ node }: any) => <Gallery />,
|
||||
'block-imageGallery': ({ node }: any) => <Gallery />,
|
||||
imageGallery: ({ node: _node }: any) => <Gallery />,
|
||||
'block-imageGallery': ({ node: _node }: any) => <Gallery />,
|
||||
categoryGrid: ({ node }: any) => {
|
||||
const cats = node.fields.categories || [];
|
||||
return (
|
||||
|
||||
@@ -73,7 +73,7 @@ services:
|
||||
networks:
|
||||
- default
|
||||
ports:
|
||||
- "54322:5432"
|
||||
- "54324:5432"
|
||||
|
||||
networks:
|
||||
default:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as React from 'react';
|
||||
import { Document, Page, View, Text, StyleSheet, Font, Image } from '@react-pdf/renderer';
|
||||
import { Document, Page, View, Text, StyleSheet } from '@react-pdf/renderer';
|
||||
import { ProductData, ProductDatasheetPage } from './pdf-datasheet';
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as React from 'react';
|
||||
import { Document, Page, View, Text, Image, StyleSheet, Font } from '@react-pdf/renderer';
|
||||
import { Document, Page, View, Text, Image, StyleSheet } from '@react-pdf/renderer';
|
||||
|
||||
// Standard fonts like Helvetica are built-in to PDF and don't require registration
|
||||
// unless we want to use specific TTF files. Using built-in Helvetica for maximum stability.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Document, Page, View, Text, StyleSheet, Font, Link, Image } from '@react-pdf/renderer';
|
||||
import path from 'path';
|
||||
import React from 'react';
|
||||
|
||||
import { Document, Page, View, Text, StyleSheet, Link, Image } from '@react-pdf/renderer';
|
||||
|
||||
// Standard fonts like Helvetica are built-in to PDF and don't require registration
|
||||
// unless we want to use specific TTF files. Using built-in Helvetica for maximum stability.
|
||||
@@ -26,7 +27,7 @@ const styles = StyleSheet.create({
|
||||
color: C.gray900,
|
||||
lineHeight: 1.6,
|
||||
backgroundColor: C.white,
|
||||
paddingTop: 0,
|
||||
paddingTop: 50,
|
||||
paddingBottom: 80,
|
||||
fontFamily: 'Helvetica',
|
||||
},
|
||||
@@ -34,10 +35,11 @@ const styles = StyleSheet.create({
|
||||
// Premium Header Layout
|
||||
hero: {
|
||||
backgroundColor: C.offWhite,
|
||||
paddingTop: 40,
|
||||
paddingBottom: 32,
|
||||
paddingTop: 24,
|
||||
paddingBottom: 24,
|
||||
paddingHorizontal: MARGIN,
|
||||
marginBottom: 40,
|
||||
marginTop: -50, // Counters the page padding to achieve full-bleed top
|
||||
borderBottomWidth: 1,
|
||||
borderBottomColor: C.gray200,
|
||||
position: 'relative',
|
||||
@@ -51,8 +53,9 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
|
||||
logo: {
|
||||
width: 60,
|
||||
height: 'auto',
|
||||
width: 140, // Increased to fit full logo
|
||||
height: 45,
|
||||
objectFit: 'contain',
|
||||
},
|
||||
|
||||
docType: {
|
||||
@@ -69,12 +72,12 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
|
||||
pageTitle: {
|
||||
fontSize: 28,
|
||||
fontSize: 16,
|
||||
fontWeight: 700,
|
||||
color: C.navyDeep,
|
||||
marginBottom: 4,
|
||||
textTransform: 'uppercase',
|
||||
letterSpacing: -0.5,
|
||||
letterSpacing: 0,
|
||||
},
|
||||
|
||||
accentBar: {
|
||||
@@ -103,10 +106,15 @@ const styles = StyleSheet.create({
|
||||
fontSize: 14,
|
||||
fontWeight: 700,
|
||||
color: C.navyDeep,
|
||||
marginTop: 24,
|
||||
marginBottom: 12,
|
||||
textTransform: 'uppercase',
|
||||
letterSpacing: 0.8,
|
||||
marginTop: 0,
|
||||
marginBottom: 0,
|
||||
},
|
||||
|
||||
heading1Wrapper: {
|
||||
marginTop: 24,
|
||||
marginBottom: 12,
|
||||
borderLeftWidth: 3,
|
||||
borderLeftColor: C.accent,
|
||||
paddingLeft: 12,
|
||||
@@ -186,7 +194,6 @@ const styles = StyleSheet.create({
|
||||
|
||||
footerInfo: {
|
||||
flexDirection: 'column',
|
||||
gap: 2,
|
||||
},
|
||||
|
||||
footerBrand: {
|
||||
@@ -195,7 +202,7 @@ const styles = StyleSheet.create({
|
||||
color: C.navyDeep,
|
||||
textTransform: 'uppercase',
|
||||
letterSpacing: 1,
|
||||
marginBottom: 2,
|
||||
marginBottom: 4,
|
||||
},
|
||||
|
||||
footerText: {
|
||||
@@ -235,32 +242,49 @@ const renderLexicalNode = (node: any, idx: number): React.ReactNode => {
|
||||
}
|
||||
|
||||
case 'paragraph': {
|
||||
if (!node.children || node.children.length === 0) return null;
|
||||
return (
|
||||
<Text key={idx} style={styles.paragraph}>
|
||||
<Text key={idx} style={styles.paragraph} minPresenceAhead={15}>
|
||||
{node.children?.map((child: any, i: number) => renderLexicalNode(child, i))}
|
||||
</Text>
|
||||
);
|
||||
}
|
||||
|
||||
case 'heading': {
|
||||
if (!node.children || node.children.length === 0) return null;
|
||||
let hStyle = styles.heading3;
|
||||
if (node.tag === 'h1') hStyle = styles.heading1;
|
||||
let isH1 = false;
|
||||
if (node.tag === 'h1') {
|
||||
hStyle = styles.heading1;
|
||||
isH1 = true;
|
||||
}
|
||||
if (node.tag === 'h2') hStyle = styles.heading2;
|
||||
|
||||
return (
|
||||
<Text key={idx} style={hStyle}>
|
||||
const content = (
|
||||
<Text key={idx} style={hStyle} wrap={false} minPresenceAhead={100}>
|
||||
{node.children?.map((child: any, i: number) => renderLexicalNode(child, i))}
|
||||
</Text>
|
||||
);
|
||||
|
||||
if (isH1) {
|
||||
return (
|
||||
<View key={idx} style={styles.heading1Wrapper} wrap={false} minPresenceAhead={100}>
|
||||
{content}
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
case 'list': {
|
||||
if (!node.children || node.children.length === 0) return null;
|
||||
return (
|
||||
<View key={idx} style={styles.list}>
|
||||
{node.children?.map((child: any, i: number) => {
|
||||
if (child.type === 'listitem') {
|
||||
return (
|
||||
<View key={i} style={styles.listItem}>
|
||||
<View key={i} style={styles.listItem} wrap={false}>
|
||||
<Text style={styles.listItemBullet}>
|
||||
{node.listType === 'number' ? `${i + 1}.` : '•'}
|
||||
</Text>
|
||||
@@ -317,18 +341,15 @@ export const PDFPage: React.FC<PDFPageProps> = ({ page, locale = 'de' }) => {
|
||||
day: 'numeric',
|
||||
});
|
||||
|
||||
const logoPath = path.join(process.cwd(), 'public/logo.png');
|
||||
const logoPath = `${process.cwd()}/public/logo-full.png`;
|
||||
|
||||
return (
|
||||
<Document>
|
||||
<Page size="A4" style={styles.page}>
|
||||
{/* Improved Hero Header */}
|
||||
<View style={styles.hero} fixed>
|
||||
{/* Improved Hero Header - No longer fixed so it doesn't repeat on all pages */}
|
||||
<View style={styles.hero}>
|
||||
<View style={styles.headerTop}>
|
||||
<Image src={logoPath} style={styles.logo} />
|
||||
<Text style={styles.docType}>
|
||||
{locale === 'en' ? 'Official Document' : 'Offizielles Dokument'}
|
||||
</Text>
|
||||
</View>
|
||||
|
||||
<View style={styles.headerTitleArea}>
|
||||
@@ -346,7 +367,7 @@ export const PDFPage: React.FC<PDFPageProps> = ({ page, locale = 'de' }) => {
|
||||
</View>
|
||||
|
||||
{/* Industrial footer with page numbers */}
|
||||
<View style={styles.footer} fixed>
|
||||
<View style={{ ...styles.footer, position: 'absolute', bottom: 40, height: 40 }} fixed>
|
||||
<View style={styles.footerInfo}>
|
||||
<Text style={styles.footerBrand}>KLZ VERTRIEBS GMBH</Text>
|
||||
<Text style={styles.footerText}>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
"legalNoticeSlug": "impressum",
|
||||
"privacyPolicy": "Datenschutz",
|
||||
"privacyPolicySlug": "datenschutz",
|
||||
"terms": "AGB",
|
||||
"terms": "AVB",
|
||||
"termsSlug": "terms",
|
||||
"products": "Produkte",
|
||||
"lowVoltage": "Niederspannungskabel",
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
"pdf:datasheets": "tsx ./scripts/generate-pdf-datasheets.ts",
|
||||
"pdf:datasheets:legacy": "tsx ./scripts/generate-pdf-datasheets-pdf-lib.ts",
|
||||
"cms:migrate": "payload migrate",
|
||||
"cms:migrate:create": "payload migrate:create",
|
||||
"cms:seed": "tsx ./scripts/seed-payload.ts",
|
||||
"assets:push:testing": "bash ./scripts/assets-sync.sh local testing",
|
||||
"assets:push:staging": "bash ./scripts/assets-sync.sh local staging",
|
||||
@@ -139,7 +140,7 @@
|
||||
"prepare": "husky",
|
||||
"preinstall": "npx only-allow pnpm"
|
||||
},
|
||||
"version": "2.3.18-rc.2",
|
||||
"version": "2.3.22-rc.4",
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@parcel/watcher",
|
||||
|
||||
@@ -73,6 +73,7 @@ export interface Config {
|
||||
'form-submissions': FormSubmission;
|
||||
products: Product;
|
||||
pages: Page;
|
||||
'agbs-collection': AgbsCollection;
|
||||
'payload-kv': PayloadKv;
|
||||
'payload-locked-documents': PayloadLockedDocument;
|
||||
'payload-preferences': PayloadPreference;
|
||||
@@ -86,6 +87,7 @@ export interface Config {
|
||||
'form-submissions': FormSubmissionsSelect<false> | FormSubmissionsSelect<true>;
|
||||
products: ProductsSelect<false> | ProductsSelect<true>;
|
||||
pages: PagesSelect<false> | PagesSelect<true>;
|
||||
'agbs-collection': AgbsCollectionSelect<false> | AgbsCollectionSelect<true>;
|
||||
'payload-kv': PayloadKvSelect<false> | PayloadKvSelect<true>;
|
||||
'payload-locked-documents':
|
||||
| PayloadLockedDocumentsSelect<false>
|
||||
@@ -360,6 +362,19 @@ export interface Page {
|
||||
createdAt: string;
|
||||
_status?: ('draft' | 'published') | null;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "agbs-collection".
|
||||
*/
|
||||
export interface AgbsCollection {
|
||||
id: number;
|
||||
title: string;
|
||||
versionDate: string;
|
||||
file: number | Media;
|
||||
isCurrent?: boolean | null;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "payload-kv".
|
||||
@@ -407,6 +422,10 @@ export interface PayloadLockedDocument {
|
||||
| ({
|
||||
relationTo: 'pages';
|
||||
value: number | Page;
|
||||
} | null)
|
||||
| ({
|
||||
relationTo: 'agbs-collection';
|
||||
value: number | AgbsCollection;
|
||||
} | null);
|
||||
globalSlug?: string | null;
|
||||
user: {
|
||||
@@ -594,6 +613,18 @@ export interface PagesSelect<T extends boolean = true> {
|
||||
createdAt?: T;
|
||||
_status?: T;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "agbs-collection_select".
|
||||
*/
|
||||
export interface AgbsCollectionSelect<T extends boolean = true> {
|
||||
title?: T;
|
||||
versionDate?: T;
|
||||
file?: T;
|
||||
isCurrent?: T;
|
||||
updatedAt?: T;
|
||||
createdAt?: T;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "payload-kv_select".
|
||||
|
||||
@@ -21,6 +21,7 @@ import { Posts } from './src/payload/collections/Posts';
|
||||
import { FormSubmissions } from './src/payload/collections/FormSubmissions';
|
||||
import { Products } from './src/payload/collections/Products';
|
||||
import { Pages } from './src/payload/collections/Pages';
|
||||
import { Agbs } from './src/payload/collections/Agbs';
|
||||
import { seedDatabase } from './src/payload/seed';
|
||||
|
||||
const filename = fileURLToPath(import.meta.url);
|
||||
@@ -56,7 +57,7 @@ export default buildConfig({
|
||||
defaultLocale: 'de',
|
||||
fallback: true,
|
||||
},
|
||||
collections: [Users, Media, Posts, FormSubmissions, Products, Pages],
|
||||
collections: [Users, Media, Posts, FormSubmissions, Products, Pages, Agbs],
|
||||
editor: lexicalEditor({
|
||||
features: ({ defaultFeatures }) => [
|
||||
...defaultFeatures,
|
||||
|
||||
124
pnpm-lock.yaml
generated
124
pnpm-lock.yaml
generated
@@ -13,17 +13,17 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
'@mintel/mail':
|
||||
specifier: ^1.8.21
|
||||
version: 1.9.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
'@mintel/next-config':
|
||||
specifier: ^1.8.21
|
||||
version: 1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12))
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12))
|
||||
'@mintel/next-feedback':
|
||||
specifier: ^1.8.21
|
||||
version: 1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)
|
||||
'@mintel/next-utils':
|
||||
specifier: ^1.8.21
|
||||
version: 1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)
|
||||
'@payloadcms/db-postgres':
|
||||
specifier: ^3.77.0
|
||||
version: 3.79.0(@opentelemetry/api@1.9.0)(payload@3.79.0(graphql@16.13.1)(typescript@5.9.3))
|
||||
@@ -40,8 +40,8 @@ importers:
|
||||
specifier: ^3.77.0
|
||||
version: 3.79.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0))(payload@3.79.0(graphql@16.13.1)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
|
||||
'@react-email/components':
|
||||
specifier: ^1.0.7
|
||||
version: 1.0.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
specifier: 1.0.8
|
||||
version: 1.0.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
'@react-pdf/renderer':
|
||||
specifier: ^4.3.2
|
||||
version: 4.3.2(react@19.2.4)
|
||||
@@ -155,11 +155,11 @@ importers:
|
||||
specifier: ^0.15.1
|
||||
version: 0.15.1
|
||||
'@mintel/eslint-config':
|
||||
specifier: 1.8.21
|
||||
version: 1.8.21(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
|
||||
'@mintel/tsconfig':
|
||||
specifier: ^1.8.21
|
||||
version: 1.9.11
|
||||
specifier: 1.9.18
|
||||
version: 1.9.18
|
||||
'@next/bundle-analyzer':
|
||||
specifier: ^16.1.6
|
||||
version: 16.1.6
|
||||
@@ -1690,29 +1690,29 @@ packages:
|
||||
'@medv/finder@4.0.2':
|
||||
resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==}
|
||||
|
||||
'@mintel/eslint-config@1.8.21':
|
||||
resolution: {integrity: sha512-GH5tm1y89AhD+Lxf95BGCOdy7Nv1OPNLWrUpaTR6jsuKfH2dm9fU66LF7sDH5THmrkfAZ8zSzHJsKPjintv3IA==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Feslint-config/-/1.8.21/eslint-config-1.8.21.tgz}
|
||||
'@mintel/eslint-config@1.9.18':
|
||||
resolution: {integrity: sha512-+A237erdbiXnXJSU2vJJ0kjgE9SMvagPh+IYYXIdQ4KI1C2hjlEOZnD5UKi70drKif11Mucd4btsMPLCLr7gSQ==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Feslint-config/-/1.9.18/eslint-config-1.9.18.tgz}
|
||||
|
||||
'@mintel/mail@1.9.11':
|
||||
resolution: {integrity: sha512-kvmrYYpFqtyqft5wCCY5kUhgDm7D7ocCLrv0SMPXp6w8ULuv7cuCEPWoJ+BbfJ1eXDGDnCpW3CYJSKGjoVrLIA==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fmail/-/1.9.11/mail-1.9.11.tgz}
|
||||
'@mintel/mail@1.9.18':
|
||||
resolution: {integrity: sha512-hgFt7aP0i6nKDNf+KbGWczQYBMucGa4MPOLSNsl3ycdmYRNI/EW3nnIQt0Ldppob6PpwBKLVrZZ4vskryBZjLA==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fmail/-/1.9.18/mail-1.9.18.tgz}
|
||||
peerDependencies:
|
||||
react: ^19.0.0
|
||||
react-dom: ^19.0.0
|
||||
|
||||
'@mintel/next-config@1.9.11':
|
||||
resolution: {integrity: sha512-9MvrTdXvkl8uneLdlq8DBx2g/5kq7LfN369LkYMm65tKqJMgKFxjBlzzBhbjeMgPZimyj7E87boqEaHcIJZttA==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-config/-/1.9.11/next-config-1.9.11.tgz}
|
||||
'@mintel/next-config@1.9.18':
|
||||
resolution: {integrity: sha512-fLEFqJqVBuUEM8wf51GE1cv75H19U14WaBlqITKyYVnC0fd9bP2tjYPM/APkSd3+5EYg2uhONfdIimyRUttQ7w==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-config/-/1.9.18/next-config-1.9.18.tgz}
|
||||
|
||||
'@mintel/next-feedback@1.9.11':
|
||||
resolution: {integrity: sha512-qMmU/LSXnXe4KyQI+8qwv8JpBz9ZdqK7gqHLSla6s2QZyv1woRAIYM3Ryr+Uhho56Ehyv/no50K6sOnra5iKPw==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-feedback/-/1.9.11/next-feedback-1.9.11.tgz}
|
||||
'@mintel/next-feedback@1.9.18':
|
||||
resolution: {integrity: sha512-/WgFnrtpfIzaVx5sVCp/YpgXCE4iyX/xKswIvmLb0HGbJjeNR6If9MJPgrWR/AUn+QbrdIGpPdRSEHj+cueOsw==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-feedback/-/1.9.18/next-feedback-1.9.18.tgz}
|
||||
peerDependencies:
|
||||
react: ^19.0.0
|
||||
react-dom: ^19.0.0
|
||||
|
||||
'@mintel/next-utils@1.9.11':
|
||||
resolution: {integrity: sha512-Yxg2EdKbWfjQ9/HcOQN0/TDwVXwCkWaEo1DXKekJF1V2Au3y01py2qD+0yVXZ5l80vLj95ct5/O4s6i6l27MlA==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-utils/-/1.9.11/next-utils-1.9.11.tgz}
|
||||
'@mintel/next-utils@1.9.18':
|
||||
resolution: {integrity: sha512-7s5nh3ooSoaI4T9Iv3Af6dk2cnbuEhekJeZVdgO2Pjrqdv867jOKb0//TMTolQlszQYf17737UYv3LR3w3CGoQ==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-utils/-/1.9.18/next-utils-1.9.18.tgz}
|
||||
|
||||
'@mintel/tsconfig@1.9.11':
|
||||
resolution: {integrity: sha512-nZ6RfIgvcT2kMtskHAprR8SIQFDxStMoIe1X7GMFzA/5lP5QQyv5rGpSQY8KcPwB17Dcz9rxO+QilE0Gj86qkg==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Ftsconfig/-/1.9.11/tsconfig-1.9.11.tgz}
|
||||
'@mintel/tsconfig@1.9.18':
|
||||
resolution: {integrity: sha512-4Xocw3mnC25Rfkd4NfKwepYO5QgA6yVztcX6c1QLT1tKKW8pkM9PUVWfzuAeJDM1yy+FBmcrQaF2Wfr4P4+dWQ==, tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Ftsconfig/-/1.9.18/tsconfig-1.9.18.tgz}
|
||||
|
||||
'@monaco-editor/loader@1.7.0':
|
||||
resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
|
||||
@@ -2190,191 +2190,223 @@ packages:
|
||||
|
||||
'@react-email/body@0.0.11':
|
||||
resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/body@0.3.0':
|
||||
resolution: {integrity: sha512-uGo0BOOzjbMUo3lu+BIDWayvn5o6Xyfmnlla5VGf05n8gHMvO1ll7U4FtzWe3hxMLwt53pmc4iE0M+B5slG+Ug==}
|
||||
'@react-email/body@0.2.1':
|
||||
resolution: {integrity: sha512-ljDiQiJDu/Fq//vSIIP0z5Nuvt4+DX1RqGasstChDGJB/14ogd4VdNS9aacoede/ZjGy3o3Qb+cxyS+XgM6SwQ==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/button@0.0.19':
|
||||
resolution: {integrity: sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/button@0.2.1':
|
||||
resolution: {integrity: sha512-qXyj7RZLE7POy9BMKSoqQ00tOXThjOZSUnI2Yu9i29IHngPlmrNayIWBoVKtElES7OWwypUcpiajwi1mUWx6/A==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-block@0.0.11':
|
||||
resolution: {integrity: sha512-4D43p+LIMjDzm66gTDrZch0Flkip5je91mAT7iGs6+SbPyalHgIA+lFQoQwhz/VzHHLxuD0LV6gwmU/WUQ2WEg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-block@0.2.1':
|
||||
resolution: {integrity: sha512-M3B7JpVH4ytgn83/ujRR1k1DQHvTeABiDM61OvAbjLRPhC/5KLHU5KkzIbbuGIrjWwxAbL1kSQzU8MhLEtSxyw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-inline@0.0.5':
|
||||
resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-inline@0.0.6':
|
||||
resolution: {integrity: sha512-jfhebvv3dVsp3OdPgKXnk8+e2pBiDVZejDOBFzBa/IblrAJ9cQDkN6rBD5IyEg8hTOxwbw3iaI/yZFmDmIguIA==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/column@0.0.13':
|
||||
resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/column@0.0.14':
|
||||
resolution: {integrity: sha512-f+W+Bk2AjNO77zynE33rHuQhyqVICx4RYtGX9NKsGUg0wWjdGP0qAuIkhx9Rnmk4/hFMo1fUrtYNqca9fwJdHg==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/components@0.0.33':
|
||||
resolution: {integrity: sha512-/GKdT3YijT1iEWPAXF644jr12w5xVgzUr0zlbZGt2KOkGeFHNZUCL5UtRopmnjrH/Fayf8Gjv6q/4E2cZgDtdQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/components@1.0.9':
|
||||
resolution: {integrity: sha512-2vi1w423KdjGa9rLUJAq8daTq5xVvB5VHDuI8fRu3/JfqqihzUu5r0bET3qWDw9QpKOIXcZzWO3jN2+yMVtzUw==}
|
||||
'@react-email/components@1.0.8':
|
||||
resolution: {integrity: sha512-zY81ED6o5MWMzBkr9uZFuT24lWarT+xIbOZxI6C9dsFmCWBczM8IE1BgOI8rhpUK4JcYVDy1uKxYAFqsx2Bc4w==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/container@0.0.15':
|
||||
resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/container@0.0.16':
|
||||
resolution: {integrity: sha512-QWBB56RkkU0AJ9h+qy33gfT5iuZknPC7Un/IjZv9B0QmMIK+WWacc0cH6y2SV5Cv/b99hU94fjEMOOO4enpkbQ==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/font@0.0.10':
|
||||
resolution: {integrity: sha512-0urVSgCmQIfx5r7Xc586miBnQUVnGp3OTYUm8m5pwtQRdTRO5XrTtEfNJ3JhYhSOruV0nD8fd+dXtKXobum6tA==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/font@0.0.9':
|
||||
resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/head@0.0.12':
|
||||
resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/head@0.0.13':
|
||||
resolution: {integrity: sha512-AJg6le/08Gz4tm+6MtKXqtNNyKHzmooOCdmtqmWxD7FxoAdU1eVcizhtQ0gcnVaY6ethEyE/hnEzQxt1zu5Kog==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/heading@0.0.15':
|
||||
resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/heading@0.0.16':
|
||||
resolution: {integrity: sha512-jmsKnQm1ykpBzw4hCYHwBkt5pW2jScXffPeEH5ZRF5tZeF5b1pvlFTO9han7C0pCkZYo1kEvWiRtx69yfCIwuw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/hr@0.0.11':
|
||||
resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/hr@0.0.12':
|
||||
resolution: {integrity: sha512-TwmOmBDibavUQpXBxpmZYi2Iks/yeZOzFYh+di9EltMSnEabH8dMZXrl+pxNXzCgZ2XE8HY7VmUL65Lenfu5PA==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/html@0.0.11':
|
||||
resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/html@0.0.12':
|
||||
resolution: {integrity: sha512-KTShZesan+UsreU7PDUV90afrZwU5TLwYlALuCSU0OT+/U8lULNNbAUekg+tGwCnOfIKYtpDPKkAMRdYlqUznw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/img@0.0.11':
|
||||
resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/img@0.0.12':
|
||||
resolution: {integrity: sha512-sRCpEARNVTf3FQhZOC+JTvu5r6ubiYWkT0ucYXg8ctkyi4G8QG+jgYPiNUqVeTLA2STOfmPM/nrk1nb84y6CPQ==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/link@0.0.12':
|
||||
resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/link@0.0.13':
|
||||
resolution: {integrity: sha512-lkWc/NjOcefRZMkQoSDDbuKBEBDES9aXnFEOuPH845wD3TxPwh+QTf0fStuzjoRLUZWpHnio4z7qGGRYusn/sw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/markdown@0.0.14':
|
||||
resolution: {integrity: sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/markdown@0.0.18':
|
||||
resolution: {integrity: sha512-gSuYK5fsMbGk87jDebqQ6fa2fKcWlkf2Dkva8kMONqLgGCq8/0d+ZQYMEJsdidIeBo3kmsnHZPrwdFB4HgjUXg==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/preview@0.0.12':
|
||||
resolution: {integrity: sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/preview@0.0.14':
|
||||
resolution: {integrity: sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
@@ -2402,36 +2434,42 @@ packages:
|
||||
'@react-email/row@0.0.12':
|
||||
resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/row@0.0.13':
|
||||
resolution: {integrity: sha512-bYnOac40vIKCId7IkwuLAAsa3fKfSfqCvv6epJKmPE0JBuu5qI4FHFCl9o9dVpIIS08s/ub+Y/txoMt0dYziGw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/section@0.0.16':
|
||||
resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/section@0.0.17':
|
||||
resolution: {integrity: sha512-qNl65ye3W0Rd5udhdORzTV9ezjb+GFqQQSae03NDzXtmJq6sqVXNWNiVolAjvJNypim+zGXmv6J9TcV5aNtE/w==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/tailwind@1.0.4':
|
||||
resolution: {integrity: sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/tailwind@2.0.5':
|
||||
resolution: {integrity: sha512-7Ey+kiWliJdxPMCLYsdDts8ffp4idlP//w4Ui3q/A5kokVaLSNKG8DOg/8qAuzWmRiGwNQVOKBk7PXNlK5W+sg==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
'@react-email/body': 0.2.1
|
||||
'@react-email/button': 0.2.1
|
||||
@@ -2470,12 +2508,14 @@ packages:
|
||||
'@react-email/text@0.0.11':
|
||||
resolution: {integrity: sha512-a7nl/2KLpRHOYx75YbYZpWspUbX1DFY7JIZbOv5x0QU8SvwDbJt+Hm01vG34PffFyYvHEXrc6Qnip2RTjljNjg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/text@0.1.6':
|
||||
resolution: {integrity: sha512-TYqkioRS45wTR5il3dYk/SbUjjEdhSwh9BtRNB99qNH1pXAwA45H7rAuxehiu8iJQJH0IyIr+6n62gBz9ezmsw==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
@@ -9786,7 +9826,7 @@ snapshots:
|
||||
|
||||
'@medv/finder@4.0.2': {}
|
||||
|
||||
'@mintel/eslint-config@1.8.21(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
|
||||
'@mintel/eslint-config@1.9.18(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
|
||||
dependencies:
|
||||
'@eslint/eslintrc': 3.3.5
|
||||
'@eslint/js': 9.39.4
|
||||
@@ -9803,13 +9843,13 @@ snapshots:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
'@mintel/mail@1.9.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||
'@mintel/mail@1.9.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||
dependencies:
|
||||
'@react-email/components': 0.0.33(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
react: 19.2.4
|
||||
react-dom: 19.2.4(react@19.2.4)
|
||||
|
||||
'@mintel/next-config@1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12))':
|
||||
'@mintel/next-config@1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12))':
|
||||
dependencies:
|
||||
'@sentry/nextjs': 10.43.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0))(react@19.2.4)(webpack@5.105.4(esbuild@0.25.12))
|
||||
next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)
|
||||
@@ -9832,7 +9872,7 @@ snapshots:
|
||||
- typescript
|
||||
- webpack
|
||||
|
||||
'@mintel/next-feedback@1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)':
|
||||
'@mintel/next-feedback@1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)':
|
||||
dependencies:
|
||||
'@medv/finder': 4.0.2
|
||||
clsx: 2.1.1
|
||||
@@ -9852,7 +9892,7 @@ snapshots:
|
||||
- babel-plugin-react-compiler
|
||||
- sass
|
||||
|
||||
'@mintel/next-utils@1.9.11(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)':
|
||||
'@mintel/next-utils@1.9.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@swc/helpers@0.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)(typescript@5.9.3)':
|
||||
dependencies:
|
||||
next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0)
|
||||
next-intl: 4.8.3(@swc/helpers@0.5.19)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.98.0))(react@19.2.4)(typescript@5.9.3)
|
||||
@@ -9869,7 +9909,7 @@ snapshots:
|
||||
- sass
|
||||
- typescript
|
||||
|
||||
'@mintel/tsconfig@1.9.11': {}
|
||||
'@mintel/tsconfig@1.9.18': {}
|
||||
|
||||
'@monaco-editor/loader@1.7.0':
|
||||
dependencies:
|
||||
@@ -10535,7 +10575,7 @@ snapshots:
|
||||
dependencies:
|
||||
react: 19.2.4
|
||||
|
||||
'@react-email/body@0.3.0(react@19.2.4)':
|
||||
'@react-email/body@0.2.1(react@19.2.4)':
|
||||
dependencies:
|
||||
react: 19.2.4
|
||||
|
||||
@@ -10599,9 +10639,9 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- react-dom
|
||||
|
||||
'@react-email/components@1.0.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||
'@react-email/components@1.0.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||
dependencies:
|
||||
'@react-email/body': 0.3.0(react@19.2.4)
|
||||
'@react-email/body': 0.2.1(react@19.2.4)
|
||||
'@react-email/button': 0.2.1(react@19.2.4)
|
||||
'@react-email/code-block': 0.2.1(react@19.2.4)
|
||||
'@react-email/code-inline': 0.0.6(react@19.2.4)
|
||||
@@ -10619,7 +10659,7 @@ snapshots:
|
||||
'@react-email/render': 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||
'@react-email/row': 0.0.13(react@19.2.4)
|
||||
'@react-email/section': 0.0.17(react@19.2.4)
|
||||
'@react-email/tailwind': 2.0.5(@react-email/body@0.3.0(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)
|
||||
'@react-email/tailwind': 2.0.5(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)
|
||||
'@react-email/text': 0.1.6(react@19.2.4)
|
||||
react: 19.2.4
|
||||
transitivePeerDependencies:
|
||||
@@ -10750,13 +10790,13 @@ snapshots:
|
||||
dependencies:
|
||||
react: 19.2.4
|
||||
|
||||
'@react-email/tailwind@2.0.5(@react-email/body@0.3.0(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)':
|
||||
'@react-email/tailwind@2.0.5(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)':
|
||||
dependencies:
|
||||
'@react-email/text': 0.1.6(react@19.2.4)
|
||||
react: 19.2.4
|
||||
tailwindcss: 4.2.1
|
||||
optionalDependencies:
|
||||
'@react-email/body': 0.3.0(react@19.2.4)
|
||||
'@react-email/body': 0.2.1(react@19.2.4)
|
||||
'@react-email/button': 0.2.1(react@19.2.4)
|
||||
'@react-email/code-block': 0.2.1(react@19.2.4)
|
||||
'@react-email/code-inline': 0.0.6(react@19.2.4)
|
||||
|
||||
BIN
public/AVB-KLZ-4-2026.docx
Normal file
BIN
public/AVB-KLZ-4-2026.docx
Normal file
Binary file not shown.
BIN
public/AVB-KLZ-4-2026.pdf
Normal file
BIN
public/AVB-KLZ-4-2026.pdf
Normal file
Binary file not shown.
BIN
public/logo-full.png
Normal file
BIN
public/logo-full.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
@@ -115,8 +115,10 @@ async function main() {
|
||||
// Intercept Next.js chunks and data to bypass Varnish 404-caching
|
||||
// Includes standard /_next/ and subpath /gatekeeper/_next/
|
||||
if (
|
||||
(url.includes('/_next/static/') || url.includes('/_next/data/') || url.includes('/gatekeeper/_next/')) &&
|
||||
!url.includes('?cb=') &&
|
||||
(url.includes('/_next/static/') ||
|
||||
url.includes('/_next/data/') ||
|
||||
url.includes('/gatekeeper/_next/')) &&
|
||||
!url.includes('?cb=') &&
|
||||
!url.includes('&cb=')
|
||||
) {
|
||||
const buster = `cb=${Date.now()}`;
|
||||
@@ -154,10 +156,10 @@ async function main() {
|
||||
const navigateWithRetry = async (url: string, label: string) => {
|
||||
chunkErrorsDetected = false;
|
||||
console.log(`\n🧪 Testing ${label} on: ${url}`);
|
||||
|
||||
|
||||
// First attempt: Wait for network to be relatively idle
|
||||
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
|
||||
|
||||
|
||||
// REDIRECTION CHECK: Logging redirected landing page
|
||||
const finalUrl = page.url();
|
||||
if (finalUrl !== url && !finalUrl.includes(url)) {
|
||||
@@ -167,7 +169,9 @@ async function main() {
|
||||
if (chunkErrorsDetected) {
|
||||
const buster = `cb=${Date.now()}`;
|
||||
const cbUrl = finalUrl.includes('?') ? `${finalUrl}&${buster}` : `${finalUrl}?${buster}`;
|
||||
console.warn(` ⚠️ Assets failed to load (Varnish staleness suspected). Retrying with cache-buster: ${cbUrl}`);
|
||||
console.warn(
|
||||
` ⚠️ Assets failed to load (Varnish staleness suspected). Retrying with cache-buster: ${cbUrl}`,
|
||||
);
|
||||
chunkErrorsDetected = false;
|
||||
await page.goto(cbUrl, { waitUntil: 'networkidle2', timeout: 30000 });
|
||||
}
|
||||
@@ -266,10 +270,10 @@ async function main() {
|
||||
console.log(` 🔔 Alert text: ${alertText}`);
|
||||
|
||||
// Detection robust for both English and German versions
|
||||
const isError =
|
||||
alertText?.toLowerCase().includes('failed') ||
|
||||
const isError =
|
||||
alertText?.toLowerCase().includes('failed') ||
|
||||
alertText?.toLowerCase().includes('wrong') ||
|
||||
alertText?.toLowerCase().includes('fehlgeschlagen') ||
|
||||
alertText?.toLowerCase().includes('fehlgeschlagen') ||
|
||||
alertText?.toLowerCase().includes('schief gelaufen') ||
|
||||
alertText?.toLowerCase().includes('fehler');
|
||||
|
||||
@@ -329,10 +333,10 @@ async function main() {
|
||||
const alertText = await page.$eval('[role="alert"]', (el) => el.textContent);
|
||||
console.log(` 🔔 Alert text: ${alertText}`);
|
||||
|
||||
const isError =
|
||||
alertText?.toLowerCase().includes('failed') ||
|
||||
const isError =
|
||||
alertText?.toLowerCase().includes('failed') ||
|
||||
alertText?.toLowerCase().includes('wrong') ||
|
||||
alertText?.toLowerCase().includes('fehlgeschlagen') ||
|
||||
alertText?.toLowerCase().includes('fehlgeschlagen') ||
|
||||
alertText?.toLowerCase().includes('schief gelaufen') ||
|
||||
alertText?.toLowerCase().includes('fehler');
|
||||
|
||||
@@ -348,13 +352,29 @@ async function main() {
|
||||
|
||||
// 5. Cleanup: Delete test submissions from Payload CMS
|
||||
console.log(`\n🧹 Starting cleanup of test submissions...`);
|
||||
const payloadSecret = process.env.PAYLOAD_SECRET;
|
||||
|
||||
if (!payloadSecret) {
|
||||
console.warn(
|
||||
` ⚠️ PAYLOAD_SECRET not found in environment. Cleanup will likely fail with 403 if the server expects a secret.`,
|
||||
);
|
||||
} else {
|
||||
console.log(
|
||||
` 🔐 PAYLOAD_SECRET found (${payloadSecret.substring(0, 3)}...). Sending x-e2e-secret header.`,
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
const apiUrl = `${targetUrl.replace(/\/$/, '')}/api/form-submissions`;
|
||||
const searchUrl = `${apiUrl}?where[email][equals]=testing@mintel.me`;
|
||||
// We fetch ALL submissions matching the test email to clean up potential lefovers from previous runs
|
||||
const searchUrl = `${apiUrl}?where[email][equals]=testing@mintel.me&limit=100`;
|
||||
|
||||
// Fetch test submissions
|
||||
// Fetch test submissions with bypass header
|
||||
const searchResponse = await axios.get(searchUrl, {
|
||||
headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` },
|
||||
headers: {
|
||||
Cookie: `klz_gatekeeper_session=${gatekeeperPassword}`,
|
||||
'x-e2e-secret': payloadSecret || '',
|
||||
},
|
||||
});
|
||||
|
||||
const testSubmissions = searchResponse.data.docs || [];
|
||||
@@ -363,25 +383,32 @@ async function main() {
|
||||
for (const doc of testSubmissions) {
|
||||
try {
|
||||
await axios.delete(`${apiUrl}/${doc.id}`, {
|
||||
headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` },
|
||||
headers: {
|
||||
Cookie: `klz_gatekeeper_session=${gatekeeperPassword}`,
|
||||
'x-e2e-secret': payloadSecret || '',
|
||||
},
|
||||
});
|
||||
console.log(` ✅ Deleted submission: ${doc.id}`);
|
||||
console.log(` ✅ Deleted submission: ${doc.id} (${doc.name})`);
|
||||
} catch (delErr: any) {
|
||||
// Log but don't fail, 403s on Directus / Payload APIs for guest Gatekeeper sessions are normal
|
||||
console.warn(
|
||||
` ⚠️ Cleanup attempt on ${doc.id} returned an error, typically due to API Auth separation: ${delErr.message}`,
|
||||
);
|
||||
console.warn(` ⚠️ Cleanup attempt on ${doc.id} failed: ${delErr.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (testSubmissions.length > 0) {
|
||||
console.log(`✅ Cleanup completed successfully.`);
|
||||
}
|
||||
} catch (err: any) {
|
||||
if (err.response?.status === 403) {
|
||||
console.warn(
|
||||
` ⚠️ Cleanup fetch failed with 403 Forbidden. This is expected if the runner lacks admin API credentials. Test submissions remain in the database.`,
|
||||
);
|
||||
console.error(` ❌ Cleanup failed with 403 Forbidden.`);
|
||||
console.error(` Detail: The server rejected the x-e2e-secret header.`);
|
||||
console.error(` Server Response: ${JSON.stringify(err.response.data)}`);
|
||||
} else {
|
||||
console.error(` ❌ Cleanup fetch failed: ${err.message}`);
|
||||
if (err.response) {
|
||||
console.error(` Status: ${err.response.status}`);
|
||||
console.error(` Body: ${JSON.stringify(err.response.data)}`);
|
||||
}
|
||||
}
|
||||
// Don't mark the whole test as failed just because cleanup failed
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
|
||||
37
scripts/update-cms-avb.ts
Normal file
37
scripts/update-cms-avb.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { getPayload } from 'payload';
|
||||
import configPromise from '../payload.config';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const filename = fileURLToPath(import.meta.url);
|
||||
const dirname = path.dirname(filename);
|
||||
|
||||
async function run() {
|
||||
process.env.PAYLOAD_MIGRATE = 'false';
|
||||
process.env.PAYLOAD_MIGRATE_SKIP_PROMPTS = 'true';
|
||||
const payload = await getPayload({ config: configPromise });
|
||||
|
||||
console.log('📖 Reading lexical_avb.json...');
|
||||
const lexicalContent = JSON.parse(fs.readFileSync(path.resolve(dirname, '../lexical_avb.json'), 'utf8'));
|
||||
|
||||
console.log('🚀 Updating AGB page (ID 6) to AVB...');
|
||||
|
||||
const updatedPage = await payload.update({
|
||||
collection: 'pages',
|
||||
id: 6,
|
||||
data: {
|
||||
title: 'Allgemeine Verkaufsbedingungen (AVB)',
|
||||
excerpt: '',
|
||||
content: lexicalContent,
|
||||
},
|
||||
});
|
||||
|
||||
console.log('✅ Page updated successfully:', updatedPage.title);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
run().catch((err) => {
|
||||
console.error('❌ Update failed:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"id": "20260225_003500_add_pages_collection",
|
||||
"name": "20260225_003500_add_pages_collection",
|
||||
"batch": 3
|
||||
}
|
||||
56
src/migrations/20260427_123000_add_agbs_collection.ts
Normal file
56
src/migrations/20260427_123000_add_agbs_collection.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres';
|
||||
|
||||
export async function up({ db }: MigrateUpArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
CREATE TABLE IF NOT EXISTS "agbs_collection" (
|
||||
"id" serial PRIMARY KEY NOT NULL,
|
||||
"version_date" timestamp(3) with time zone NOT NULL,
|
||||
"file_id" integer NOT NULL,
|
||||
"is_current" boolean DEFAULT false,
|
||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "agbs_collection_locales" (
|
||||
"id" serial PRIMARY KEY NOT NULL,
|
||||
"title" varchar,
|
||||
"_locale" "enum__locales" NOT NULL,
|
||||
"_parent_id" integer NOT NULL
|
||||
);
|
||||
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "agbs_collection_locales" ADD CONSTRAINT "agbs_collection_locales_locale_parent_id_unique" UNIQUE("_locale", "_parent_id");
|
||||
EXCEPTION WHEN duplicate_object THEN null; END $$;
|
||||
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "agbs_collection_locales" ADD CONSTRAINT "agbs_collection_locales_parent_id_fk"
|
||||
FOREIGN KEY ("_parent_id") REFERENCES "agbs_collection"("id") ON DELETE cascade;
|
||||
EXCEPTION WHEN duplicate_object THEN null; END $$;
|
||||
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "agbs_collection" ADD CONSTRAINT "agbs_collection_file_id_media_id_fk"
|
||||
FOREIGN KEY ("file_id") REFERENCES "public"."media"("id") ON DELETE set null;
|
||||
EXCEPTION WHEN duplicate_object THEN null; END $$;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "agbs_collection_updated_at_idx" ON "agbs_collection" USING btree ("updated_at");
|
||||
CREATE INDEX IF NOT EXISTS "agbs_collection_created_at_idx" ON "agbs_collection" USING btree ("created_at");
|
||||
|
||||
-- Add to payload_locked_documents_rels
|
||||
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN IF NOT EXISTS "agbs_collection_id" integer;
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_agbs_collection_fk"
|
||||
FOREIGN KEY ("agbs_collection_id") REFERENCES "public"."agbs_collection"("id") ON DELETE cascade;
|
||||
EXCEPTION WHEN duplicate_object THEN null; END $$;
|
||||
CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_agbs_collection_id_idx"
|
||||
ON "payload_locked_documents_rels" USING btree ("agbs_collection_id");
|
||||
`);
|
||||
}
|
||||
|
||||
export async function down({ db }: MigrateDownArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT IF EXISTS "payload_locked_documents_rels_agbs_collection_fk";
|
||||
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN IF EXISTS "agbs_collection_id";
|
||||
DROP TABLE IF EXISTS "agbs_collection_locales" CASCADE;
|
||||
DROP TABLE IF EXISTS "agbs_collection" CASCADE;
|
||||
`);
|
||||
}
|
||||
@@ -5,6 +5,8 @@ import * as migration_20260225_175000_native_localization from './20260225_17500
|
||||
import * as migration_20260305_215000_products_featured_image from './20260305_215000_products_featured_image';
|
||||
import * as migration_20260312_120000_pages_redirect_fields from './20260312_120000_pages_redirect_fields';
|
||||
|
||||
import * as migration_20260427_123000_add_agbs_collection from './20260427_123000_add_agbs_collection';
|
||||
|
||||
export const migrations = [
|
||||
{
|
||||
up: migration_20260223_195005_products_collection.up,
|
||||
@@ -36,4 +38,9 @@ export const migrations = [
|
||||
down: migration_20260312_120000_pages_redirect_fields.down,
|
||||
name: '20260312_120000_pages_redirect_fields',
|
||||
},
|
||||
{
|
||||
up: migration_20260427_123000_add_agbs_collection.up,
|
||||
down: migration_20260427_123000_add_agbs_collection.down,
|
||||
name: '20260427_123000_add_agbs_collection',
|
||||
},
|
||||
];
|
||||
|
||||
18
src/payload/blocks/AgbHistory.ts
Normal file
18
src/payload/blocks/AgbHistory.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Block } from 'payload';
|
||||
|
||||
export const AgbHistory: Block = {
|
||||
slug: 'agbHistory',
|
||||
labels: {
|
||||
singular: 'AGB Historie',
|
||||
plural: 'AGB Historien',
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'title',
|
||||
type: 'text',
|
||||
label: 'Titel',
|
||||
localized: true,
|
||||
defaultValue: 'Vorherige Versionen',
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -17,6 +17,7 @@ import { TeamProfile } from './TeamProfile';
|
||||
import { TechnicalGrid } from './TechnicalGrid';
|
||||
import { VisualLinkPreview } from './VisualLinkPreview';
|
||||
import { PDFDownload } from './PDFDownload';
|
||||
import { AgbHistory } from './AgbHistory';
|
||||
import { homeBlocksArray } from './HomeBlocks';
|
||||
|
||||
export const payloadBlocks = [
|
||||
@@ -40,4 +41,5 @@ export const payloadBlocks = [
|
||||
TechnicalGrid,
|
||||
VisualLinkPreview,
|
||||
PDFDownload,
|
||||
AgbHistory,
|
||||
];
|
||||
|
||||
49
src/payload/collections/Agbs.ts
Normal file
49
src/payload/collections/Agbs.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { CollectionConfig } from 'payload';
|
||||
|
||||
export const Agbs: CollectionConfig = {
|
||||
slug: 'agbs-collection',
|
||||
admin: {
|
||||
useAsTitle: 'title',
|
||||
defaultColumns: ['title', 'versionDate', 'updatedAt'],
|
||||
group: 'Rechtliches',
|
||||
},
|
||||
access: {
|
||||
read: () => true,
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'title',
|
||||
type: 'text',
|
||||
required: true,
|
||||
localized: true,
|
||||
label: 'Titel (z.B. AGB April 2026)',
|
||||
},
|
||||
{
|
||||
name: 'versionDate',
|
||||
type: 'date',
|
||||
required: true,
|
||||
label: 'Gültig ab',
|
||||
admin: {
|
||||
date: {
|
||||
pickerAppearance: 'dayOnly',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'file',
|
||||
type: 'upload',
|
||||
relationTo: 'media',
|
||||
required: true,
|
||||
label: 'PDF Datei',
|
||||
},
|
||||
{
|
||||
name: 'isCurrent',
|
||||
type: 'checkbox',
|
||||
label: 'Aktuelle Version',
|
||||
defaultValue: false,
|
||||
admin: {
|
||||
position: 'sidebar',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -9,9 +9,19 @@ export const FormSubmissions: CollectionConfig = {
|
||||
},
|
||||
access: {
|
||||
// Only Admins can view and delete leads via dashboard.
|
||||
read: ({ req: { user } }) => Boolean(user) || process.env.NODE_ENV === 'development',
|
||||
update: ({ req: { user } }) => Boolean(user) || process.env.NODE_ENV === 'development',
|
||||
delete: ({ req: { user } }) => Boolean(user) || process.env.NODE_ENV === 'development',
|
||||
// E2E scripts can bypass if they provide the correct secret header.
|
||||
read: ({ req }) => {
|
||||
const isE2E = req.headers.get('x-e2e-secret') === process.env.PAYLOAD_SECRET;
|
||||
return Boolean(req.user) || isE2E || process.env.NODE_ENV === 'development';
|
||||
},
|
||||
update: ({ req }) => {
|
||||
const isE2E = req.headers.get('x-e2e-secret') === process.env.PAYLOAD_SECRET;
|
||||
return Boolean(req.user) || isE2E || process.env.NODE_ENV === 'development';
|
||||
},
|
||||
delete: ({ req }) => {
|
||||
const isE2E = req.headers.get('x-e2e-secret') === process.env.PAYLOAD_SECRET;
|
||||
return Boolean(req.user) || isE2E || process.env.NODE_ENV === 'development';
|
||||
},
|
||||
// Next.js server actions handle secure inserts natively. No public client create access.
|
||||
create: () => false,
|
||||
},
|
||||
|
||||
16
test-html.js
16
test-html.js
@@ -1,16 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const html = fs.readFileSync('.htmlvalidate-tmp/page-8.html', 'utf8');
|
||||
console.log('--- MAIN TAGS ---');
|
||||
const mainTags = html.match(/<main[^>]*>/g);
|
||||
console.log(mainTags);
|
||||
|
||||
console.log('--- DUP CLASS EXAMPLES ---');
|
||||
const classAttr = html.match(/class="[^"]*text-slate-500[^"]*"/g);
|
||||
if (classAttr) {
|
||||
console.log(classAttr[0]);
|
||||
}
|
||||
|
||||
const dupText10 = html.match(/class="[^"]*text-\[10px\][^"]*"/g);
|
||||
if (dupText10) {
|
||||
console.log(dupText10[0]);
|
||||
}
|
||||
Reference in New Issue
Block a user