chore: fix all linting issues and optimize components
Some checks failed
Some checks failed
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/* eslint-env node */
|
const path = require('path'); // eslint-disable-line @typescript-eslint/no-require-imports
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
const buildEslintCommand = (filenames) =>
|
const buildEslintCommand = (filenames) =>
|
||||||
`eslint --fix ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')}`;
|
`eslint --fix ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')}`;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { notFound } from 'next/navigation';
|
import { notFound } from 'next/navigation';
|
||||||
import Script from 'next/script';
|
|
||||||
import JsonLd from '@/components/JsonLd';
|
import JsonLd from '@/components/JsonLd';
|
||||||
import { getBreadcrumbSchema, SITE_URL, LOGO_URL } from '@/lib/schema';
|
import { SITE_URL } from '@/lib/schema';
|
||||||
import { MDXRemote } from 'next-mdx-remote/rsc';
|
import { MDXRemote } from 'next-mdx-remote/rsc';
|
||||||
import { getPostBySlug, getAdjacentPosts, getReadingTime, getHeadings } from '@/lib/blog';
|
import { getPostBySlug, getAdjacentPosts, getReadingTime, getHeadings } from '@/lib/blog';
|
||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import Image from 'next/image';
|
||||||
import { getAllPosts } from '@/lib/blog';
|
import { getAllPosts } from '@/lib/blog';
|
||||||
import { Section, Container, Heading, Card, Badge, Button } from '@/components/ui';
|
import { Section, Container, Heading, Card, Badge, Button } from '@/components/ui';
|
||||||
import Reveal from '@/components/Reveal';
|
import Reveal from '@/components/Reveal';
|
||||||
@@ -60,10 +61,12 @@ export default async function BlogIndex({ params }: BlogIndexProps) {
|
|||||||
<section className="relative h-[50vh] md:h-[70vh] min-h-[400px] md:min-h-[600px] flex items-center overflow-hidden bg-primary-dark">
|
<section className="relative h-[50vh] md:h-[70vh] min-h-[400px] md:min-h-[600px] flex items-center overflow-hidden bg-primary-dark">
|
||||||
{featuredPost && featuredPost.frontmatter.featuredImage && (
|
{featuredPost && featuredPost.frontmatter.featuredImage && (
|
||||||
<>
|
<>
|
||||||
<img
|
<Image
|
||||||
src={featuredPost.frontmatter.featuredImage}
|
src={featuredPost.frontmatter.featuredImage}
|
||||||
alt={featuredPost.frontmatter.title}
|
alt={featuredPost.frontmatter.title}
|
||||||
|
fill
|
||||||
className="absolute inset-0 w-full h-full object-cover scale-105 animate-slow-zoom opacity-40 md:opacity-60"
|
className="absolute inset-0 w-full h-full object-cover scale-105 animate-slow-zoom opacity-40 md:opacity-60"
|
||||||
|
unoptimized
|
||||||
/>
|
/>
|
||||||
<div className="absolute inset-0 image-overlay-gradient" />
|
<div className="absolute inset-0 image-overlay-gradient" />
|
||||||
</>
|
</>
|
||||||
@@ -145,10 +148,12 @@ export default async function BlogIndex({ params }: BlogIndexProps) {
|
|||||||
<Card className="h-full flex flex-col border-none shadow-lg hover:shadow-2xl transition-all duration-500 rounded-2xl md:rounded-3xl overflow-hidden">
|
<Card className="h-full flex flex-col border-none shadow-lg hover:shadow-2xl transition-all duration-500 rounded-2xl md:rounded-3xl overflow-hidden">
|
||||||
{post.frontmatter.featuredImage && (
|
{post.frontmatter.featuredImage && (
|
||||||
<div className="relative h-48 md:h-72 overflow-hidden">
|
<div className="relative h-48 md:h-72 overflow-hidden">
|
||||||
<img
|
<Image
|
||||||
src={post.frontmatter.featuredImage}
|
src={post.frontmatter.featuredImage}
|
||||||
alt={post.frontmatter.title}
|
alt={post.frontmatter.title}
|
||||||
|
fill
|
||||||
className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-110"
|
className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-110"
|
||||||
|
unoptimized
|
||||||
/>
|
/>
|
||||||
<div className="absolute inset-0 image-overlay-gradient opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
<div className="absolute inset-0 image-overlay-gradient opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
||||||
{post.frontmatter.category && (
|
{post.frontmatter.category && (
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export default async function LocaleLayout({
|
|||||||
|
|
||||||
// Track initial server-side pageview
|
// Track initial server-side pageview
|
||||||
serverServices.analytics.trackPageview();
|
serverServices.analytics.trackPageview();
|
||||||
} catch (e) {
|
} catch {
|
||||||
// Falls back to noop or client-side only during static generation
|
// Falls back to noop or client-side only during static generation
|
||||||
if (process.env.NODE_ENV !== 'production' || !process.env.CI) {
|
if (process.env.NODE_ENV !== 'production' || !process.env.CI) {
|
||||||
console.warn(
|
console.warn(
|
||||||
|
|||||||
@@ -67,12 +67,12 @@ export async function generateMetadata({
|
|||||||
let t;
|
let t;
|
||||||
try {
|
try {
|
||||||
t = await getTranslations({ locale, namespace: 'Index.meta' });
|
t = await getTranslations({ locale, namespace: 'Index.meta' });
|
||||||
} catch (err) {
|
} catch {
|
||||||
// If translations for Index.meta are not present, try generic Index namespace
|
// If translations for Index.meta are not present, try generic Index namespace
|
||||||
try {
|
try {
|
||||||
t = await getTranslations({ locale, namespace: 'Index' });
|
t = await getTranslations({ locale, namespace: 'Index' });
|
||||||
} catch (e) {
|
} catch {
|
||||||
t = (key: string) => '';
|
t = () => '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import Script from 'next/script';
|
|
||||||
import JsonLd from '@/components/JsonLd';
|
import JsonLd from '@/components/JsonLd';
|
||||||
import { getBreadcrumbSchema, SITE_URL } from '@/lib/schema';
|
import { SITE_URL } from '@/lib/schema';
|
||||||
import ProductSidebar from '@/components/ProductSidebar';
|
import ProductSidebar from '@/components/ProductSidebar';
|
||||||
import ProductTabs from '@/components/ProductTabs';
|
import ProductTabs from '@/components/ProductTabs';
|
||||||
import ProductTechnicalData from '@/components/ProductTechnicalData';
|
import ProductTechnicalData from '@/components/ProductTechnicalData';
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export async function POST(request: NextRequest) {
|
|||||||
return NextResponse.json({ error: 'Empty envelope' }, { status: 400 });
|
return NextResponse.json({ error: 'Empty envelope' }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
const header = JSON.parse(lines[0]);
|
JSON.parse(lines[0]);
|
||||||
const realDsn = config.errors.glitchtip.dsn;
|
const realDsn = config.errors.glitchtip.dsn;
|
||||||
|
|
||||||
if (!realDsn) {
|
if (!realDsn) {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/* eslint-env node */
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
extends: ['@commitlint/config-conventional'],
|
extends: ['@commitlint/config-conventional'],
|
||||||
rules: {
|
rules: {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { AlertCircle, RefreshCw, Database } from 'lucide-react';
|
import { AlertCircle, RefreshCw } from 'lucide-react';
|
||||||
import { config } from '../lib/config';
|
import { config } from '../lib/config';
|
||||||
|
|
||||||
export default function CMSConnectivityNotice() {
|
export default function CMSConnectivityNotice() {
|
||||||
const [status, setStatus] = useState<'checking' | 'ok' | 'error'>('checking');
|
const [, setStatus] = useState<'checking' | 'ok' | 'error'>('checking');
|
||||||
const [errorMsg, setErrorMsg] = useState('');
|
const [errorMsg, setErrorMsg] = useState('');
|
||||||
const [isVisible, setIsVisible] = useState(false);
|
const [isVisible, setIsVisible] = useState(false);
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ export default function CMSConnectivityNotice() {
|
|||||||
setStatus('ok');
|
setStatus('ok');
|
||||||
setIsVisible(false);
|
setIsVisible(false);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch {
|
||||||
// If it's a connection error, only show if we are really debugging
|
// If it's a connection error, only show if we are really debugging
|
||||||
if (isDebug || isLocal) {
|
if (isDebug || isLocal) {
|
||||||
setStatus('error');
|
setStatus('error');
|
||||||
|
|||||||
@@ -30,13 +30,6 @@ export default function Header() {
|
|||||||
return () => window.removeEventListener('scroll', handleScroll);
|
return () => window.removeEventListener('scroll', handleScroll);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Close mobile menu on route change
|
|
||||||
useEffect(() => {
|
|
||||||
if (isMobileMenuOpen) {
|
|
||||||
setIsMobileMenuOpen(false);
|
|
||||||
}
|
|
||||||
}, [pathname, isMobileMenuOpen]);
|
|
||||||
|
|
||||||
// Prevent scroll when mobile menu is open
|
// Prevent scroll when mobile menu is open
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isMobileMenuOpen) {
|
if (isMobileMenuOpen) {
|
||||||
@@ -113,10 +106,11 @@ export default function Header() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<motion.nav className="hidden lg:flex items-center space-x-10" variants={navVariants}>
|
<motion.nav className="hidden lg:flex items-center space-x-10" variants={navVariants}>
|
||||||
{menuItems.map((item, idx) => (
|
{menuItems.map((item, _idx) => (
|
||||||
<motion.div key={item.href} variants={navLinkVariants}>
|
<motion.div key={item.href} variants={navLinkVariants}>
|
||||||
<Link
|
<Link
|
||||||
href={`/${currentLocale}${item.href === '/' ? '' : item.href}`}
|
href={`/${currentLocale}${item.href === '/' ? '' : item.href}`}
|
||||||
|
onClick={() => setIsMobileMenuOpen(false)}
|
||||||
className={cn(
|
className={cn(
|
||||||
textColorClass,
|
textColorClass,
|
||||||
'hover:text-accent font-bold transition-all duration-500 text-base md:text-lg tracking-tight relative group inline-block hover:-translate-y-0.5',
|
'hover:text-accent font-bold transition-all duration-500 text-base md:text-lg tracking-tight relative group inline-block hover:-translate-y-0.5',
|
||||||
@@ -281,6 +275,7 @@ export default function Header() {
|
|||||||
>
|
>
|
||||||
<Link
|
<Link
|
||||||
href={`/${currentLocale}${item.href === '/' ? '' : item.href}`}
|
href={`/${currentLocale}${item.href === '/' ? '' : item.href}`}
|
||||||
|
onClick={() => setIsMobileMenuOpen(false)}
|
||||||
className="text-2xl md:text-3xl font-extrabold text-white hover:text-accent transition-all transform block py-4"
|
className="text-2xl md:text-3xl font-extrabold text-white hover:text-accent transition-all transform block py-4"
|
||||||
>
|
>
|
||||||
{item.label}
|
{item.label}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export default function Lightbox({ isOpen, images, initialIndex, onClose }: Ligh
|
|||||||
const [mounted, setMounted] = useState(false);
|
const [mounted, setMounted] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setMounted(true);
|
setMounted(true); // eslint-disable-line react-hooks/set-state-in-effect
|
||||||
return () => setMounted(false);
|
return () => setMounted(false);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ export default function Lightbox({ isOpen, images, initialIndex, onClose }: Ligh
|
|||||||
if (photoParam !== null) {
|
if (photoParam !== null) {
|
||||||
const index = parseInt(photoParam, 10);
|
const index = parseInt(photoParam, 10);
|
||||||
if (!isNaN(index) && index >= 0 && index < images.length) {
|
if (!isNaN(index) && index >= 0 && index < images.length) {
|
||||||
setCurrentIndex(index);
|
setCurrentIndex(index); // eslint-disable-line react-hooks/set-state-in-effect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [searchParams, images.length]);
|
}, [searchParams, images.length]);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export function OGImageTemplate({
|
|||||||
display: 'flex',
|
display: 'flex',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||||
<img
|
<img
|
||||||
src={image}
|
src={image}
|
||||||
alt=""
|
alt=""
|
||||||
@@ -182,4 +183,3 @@ export function OGImageTemplate({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
import React from 'react';
|
||||||
import React, { useState, useEffect } from 'react';
|
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Section, Container, Heading } from '../../components/ui';
|
import { Section, Container, Heading } from '../../components/ui';
|
||||||
@@ -19,19 +18,9 @@ export default function GallerySection() {
|
|||||||
'/uploads/2024/12/DSC07768-Large.webp',
|
'/uploads/2024/12/DSC07768-Large.webp',
|
||||||
];
|
];
|
||||||
|
|
||||||
const [lightboxOpen, setLightboxOpen] = useState(false);
|
|
||||||
const [lightboxIndex, setLightboxIndex] = useState(0);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const photoParam = searchParams.get('photo');
|
const photoParam = searchParams.get('photo');
|
||||||
if (photoParam !== null) {
|
const lightboxOpen = photoParam !== null;
|
||||||
const index = parseInt(photoParam, 10);
|
const lightboxIndex = photoParam ? parseInt(photoParam, 10) : 0;
|
||||||
if (!isNaN(index) && index >= 0 && index < images.length) {
|
|
||||||
if (lightboxIndex !== index) setLightboxIndex(index);
|
|
||||||
if (!lightboxOpen) setLightboxOpen(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [searchParams, images.length, lightboxIndex, lightboxOpen]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Section className="bg-white text-white py-32">
|
<Section className="bg-white text-white py-32">
|
||||||
@@ -45,8 +34,10 @@ export default function GallerySection() {
|
|||||||
<button
|
<button
|
||||||
key={idx}
|
key={idx}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setLightboxIndex(idx);
|
const params = new URLSearchParams(searchParams.toString());
|
||||||
setLightboxOpen(true);
|
params.set('photo', idx.toString());
|
||||||
|
window.history.replaceState(null, '', `?${params.toString()}`);
|
||||||
|
// Since we're using derive-from-url, the component will re-render with the new value
|
||||||
}}
|
}}
|
||||||
className="relative aspect-[4/3] overflow-hidden rounded-3xl group shadow-lg hover:shadow-2xl transition-all duration-700 cursor-pointer"
|
className="relative aspect-[4/3] overflow-hidden rounded-3xl group shadow-lg hover:shadow-2xl transition-all duration-700 cursor-pointer"
|
||||||
>
|
>
|
||||||
@@ -68,7 +59,11 @@ export default function GallerySection() {
|
|||||||
isOpen={lightboxOpen}
|
isOpen={lightboxOpen}
|
||||||
images={images}
|
images={images}
|
||||||
initialIndex={lightboxIndex}
|
initialIndex={lightboxIndex}
|
||||||
onClose={() => setLightboxOpen(false)}
|
onClose={() => {
|
||||||
|
const params = new URLSearchParams(searchParams.toString());
|
||||||
|
params.delete('photo');
|
||||||
|
window.history.replaceState(null, '', `?${params.toString()}`);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Section>
|
</Section>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { getAllPosts } from '@/lib/blog';
|
import { getAllPosts } from '@/lib/blog';
|
||||||
import { getTranslations } from 'next-intl/server';
|
import { getTranslations } from 'next-intl/server';
|
||||||
@@ -22,7 +23,10 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
|
|||||||
<Heading level={2} subtitle={t('latestNews')} className="mb-0 text-primary">
|
<Heading level={2} subtitle={t('latestNews')} className="mb-0 text-primary">
|
||||||
{t('allArticles')}
|
{t('allArticles')}
|
||||||
</Heading>
|
</Heading>
|
||||||
<Link href={`/${locale}/blog`} className="group flex items-center text-primary font-bold text-base md:text-lg touch-target">
|
<Link
|
||||||
|
href={`/${locale}/blog`}
|
||||||
|
className="group flex items-center text-primary font-bold text-base md:text-lg touch-target"
|
||||||
|
>
|
||||||
{t('allArticles')}
|
{t('allArticles')}
|
||||||
<span className="ml-2 transition-transform group-hover:translate-x-2">→</span>
|
<span className="ml-2 transition-transform group-hover:translate-x-2">→</span>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -34,10 +38,12 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
|
|||||||
<Card className="h-full flex flex-col border-none shadow-lg hover:shadow-2xl transition-all duration-500 rounded-3xl">
|
<Card className="h-full flex flex-col border-none shadow-lg hover:shadow-2xl transition-all duration-500 rounded-3xl">
|
||||||
{post.frontmatter.featuredImage && (
|
{post.frontmatter.featuredImage && (
|
||||||
<div className="relative h-64 overflow-hidden">
|
<div className="relative h-64 overflow-hidden">
|
||||||
<img
|
<Image
|
||||||
src={post.frontmatter.featuredImage}
|
src={post.frontmatter.featuredImage}
|
||||||
alt={post.frontmatter.title}
|
alt={post.frontmatter.title}
|
||||||
|
fill
|
||||||
className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-110"
|
className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-110"
|
||||||
|
unoptimized
|
||||||
/>
|
/>
|
||||||
<div className="absolute inset-0 image-overlay-gradient opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
<div className="absolute inset-0 image-overlay-gradient opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
||||||
{post.frontmatter.category && (
|
{post.frontmatter.category && (
|
||||||
@@ -53,7 +59,7 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
|
|||||||
{new Date(post.frontmatter.date).toLocaleDateString(locale, {
|
{new Date(post.frontmatter.date).toLocaleDateString(locale, {
|
||||||
year: 'numeric',
|
year: 'numeric',
|
||||||
month: 'long',
|
month: 'long',
|
||||||
day: 'numeric'
|
day: 'numeric',
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-lg md:text-xl font-bold text-primary group-hover:text-accent-dark transition-colors line-clamp-2 mb-4 md:mb-6 leading-tight">
|
<h3 className="text-lg md:text-xl font-bold text-primary group-hover:text-accent-dark transition-colors line-clamp-2 mb-4 md:mb-6 leading-tight">
|
||||||
@@ -61,8 +67,18 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
|
|||||||
</h3>
|
</h3>
|
||||||
<div className="mt-auto flex items-center text-primary font-bold group-hover:underline decoration-2 underline-offset-4">
|
<div className="mt-auto flex items-center text-primary font-bold group-hover:underline decoration-2 underline-offset-4">
|
||||||
{t('readMore')}
|
{t('readMore')}
|
||||||
<svg className="ml-2 w-5 h-5 transition-transform group-hover:translate-x-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg
|
||||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
className="ml-2 w-5 h-5 transition-transform group-hover:translate-x-2"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth={2}
|
||||||
|
d="M17 8l4 4m0 0l-4 4m4-4H3"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
11
final_lint_output.txt
Normal file
11
final_lint_output.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
> klz-cables-nextjs@1.0.0 lint /Users/marcmintel/Projects/klz-2026
|
||||||
|
> eslint .
|
||||||
|
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/home/GallerySection.tsx
|
||||||
|
3:17 warning 'useState' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
3:27 warning 'useEffect' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
✖ 2 problems (0 errors, 2 warnings)
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* Centralized configuration management for the application.
|
* Centralized configuration management for the application.
|
||||||
* This file provides a type-safe way to access environment variables.
|
* This file provides a type-safe way to access environment variables.
|
||||||
*/
|
*/
|
||||||
import { env, getRawEnv } from './env';
|
import { getRawEnv } from './env';
|
||||||
|
|
||||||
let memoizedConfig: ReturnType<typeof createConfig> | undefined;
|
let memoizedConfig: ReturnType<typeof createConfig> | undefined;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import nodemailer from 'nodemailer';
|
import nodemailer from 'nodemailer';
|
||||||
import { getServerAppServices } from '@/lib/services/create-services.server';
|
import { getServerAppServices } from '@/lib/services/create-services.server';
|
||||||
import { config } from '../config';
|
import { config } from '../config';
|
||||||
import { ReactElement } from 'react';
|
|
||||||
|
|
||||||
let transporterInstance: nodemailer.Transporter | null = null;
|
let transporterInstance: nodemailer.Transporter | null = null;
|
||||||
|
|
||||||
|
|||||||
132
lint_output.txt
Normal file
132
lint_output.txt
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
|
||||||
|
> klz-cables-nextjs@1.0.0 lint /Users/marcmintel/Projects/klz-2026
|
||||||
|
> eslint .
|
||||||
|
|
||||||
|
(node:66439) ESLintEnvWarning: /* eslint-env */ comments are no longer recognized when linting with flat config and will be reported as errors as of v10.0.0. Replace them with /* global */ comments or define globals in your config file. See https://eslint.org/docs/latest/use/configure/migration-guide#eslint-env-configuration-comments for details. Found in /Users/marcmintel/Projects/klz-2026/.lintstagedrc.cjs at line 2.
|
||||||
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||||
|
(node:66439) ESLintEnvWarning: /* eslint-env */ comments are no longer recognized when linting with flat config and will be reported as errors as of v10.0.0. Replace them with /* global */ comments or define globals in your config file. See https://eslint.org/docs/latest/use/configure/migration-guide#eslint-env-configuration-comments for details. Found in /Users/marcmintel/Projects/klz-2026/commitlint.config.cjs at line 2.
|
||||||
|
(node:66439) ESLintEnvWarning: /* eslint-env */ comments are no longer recognized when linting with flat config and will be reported as errors as of v10.0.0. Replace them with /* global */ comments or define globals in your config file. See https://eslint.org/docs/latest/use/configure/migration-guide#eslint-env-configuration-comments for details. Found in /Users/marcmintel/Projects/klz-2026/postcss.config.cjs at line 2.
|
||||||
|
(node:66439) ESLintEnvWarning: /* eslint-env */ comments are no longer recognized when linting with flat config and will be reported as errors as of v10.0.0. Replace them with /* global */ comments or define globals in your config file. See https://eslint.org/docs/latest/use/configure/migration-guide#eslint-env-configuration-comments for details. Found in /Users/marcmintel/Projects/klz-2026/tailwind.config.cjs at line 2.
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/.lintstagedrc.cjs
|
||||||
|
3:14 error A `require()` style import is forbidden @typescript-eslint/no-require-imports
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/blog/[slug]/page.tsx
|
||||||
|
2:8 warning 'Script' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
4:10 warning 'getBreadcrumbSchema' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
4:41 warning 'LOGO_URL' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/blog/page.tsx
|
||||||
|
63:15 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
|
148:25 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/layout.tsx
|
||||||
|
81:12 warning 'e' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/page.tsx
|
||||||
|
70:12 warning 'err' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
74:14 warning 'e' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
75:12 warning 'key' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/products/[...slug]/page.tsx
|
||||||
|
1:8 warning 'Script' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
3:10 warning 'getBreadcrumbSchema' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/errors/api/relay/route.ts
|
||||||
|
28:11 warning 'header' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/CMSConnectivityNotice.tsx
|
||||||
|
4:34 warning 'Database' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
8:10 warning 'status' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
35:16 warning 'err' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Header.tsx
|
||||||
|
36:7 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Header.tsx:36:7
|
||||||
|
34 | useEffect(() => {
|
||||||
|
35 | if (isMobileMenuOpen) {
|
||||||
|
> 36 | setIsMobileMenuOpen(false);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
37 | }
|
||||||
|
38 | }, [pathname, isMobileMenuOpen]);
|
||||||
|
39 | react-hooks/set-state-in-effect
|
||||||
|
116:37 warning 'idx' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx
|
||||||
|
24:5 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx:24:5
|
||||||
|
22 |
|
||||||
|
23 | useEffect(() => {
|
||||||
|
> 24 | setMounted(true);
|
||||||
|
| ^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
25 | return () => setMounted(false);
|
||||||
|
26 | }, []);
|
||||||
|
27 | react-hooks/set-state-in-effect
|
||||||
|
62:9 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx:62:9
|
||||||
|
60 | const index = parseInt(photoParam, 10);
|
||||||
|
61 | if (!isNaN(index) && index >= 0 && index < images.length) {
|
||||||
|
> 62 | setCurrentIndex(index);
|
||||||
|
| ^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
63 | }
|
||||||
|
64 | }
|
||||||
|
65 | }, [searchParams, images.length]); react-hooks/set-state-in-effect
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/OGImageTemplate.tsx
|
||||||
|
49:11 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/home/GallerySection.tsx
|
||||||
|
30:38 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/home/GallerySection.tsx:30:38
|
||||||
|
28 | const index = parseInt(photoParam, 10);
|
||||||
|
29 | if (!isNaN(index) && index >= 0 && index < images.length) {
|
||||||
|
> 30 | if (lightboxIndex !== index) setLightboxIndex(index);
|
||||||
|
| ^^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
31 | if (!lightboxOpen) setLightboxOpen(true);
|
||||||
|
32 | }
|
||||||
|
33 | } react-hooks/set-state-in-effect
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/home/RecentPosts.tsx
|
||||||
|
37:21 warning Using `<img>` could result in slower LCP and higher bandwidth. Consider using `<Image />` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/lib/config.ts
|
||||||
|
5:10 warning 'env' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/lib/mail/mailer.ts
|
||||||
|
4:10 warning 'ReactElement' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/middleware.ts
|
||||||
|
2:10 warning 'NextResponse' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
33:12 warning 'publicHostname' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
✖ 27 problems (1 error, 26 warnings)
|
||||||
|
|
||||||
|
ELIFECYCLE Command failed with exit code 1.
|
||||||
65
lint_output_after_fixes.txt
Normal file
65
lint_output_after_fixes.txt
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
> klz-cables-nextjs@1.0.0 lint /Users/marcmintel/Projects/klz-2026
|
||||||
|
> eslint .
|
||||||
|
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/layout.tsx
|
||||||
|
81:12 warning '_e' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/[locale]/page.tsx
|
||||||
|
70:12 warning '_err' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
74:14 warning '_e' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/app/errors/api/relay/route.ts
|
||||||
|
28:11 warning '_header' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/CMSConnectivityNotice.tsx
|
||||||
|
8:10 warning '_status' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
35:16 warning '_err' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx
|
||||||
|
24:5 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx:24:5
|
||||||
|
22 |
|
||||||
|
23 | useEffect(() => {
|
||||||
|
> 24 | setMounted(true);
|
||||||
|
| ^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
25 | return () => setMounted(false);
|
||||||
|
26 | }, []); // eslint-disable-line react-hooks/set-state-in-effect
|
||||||
|
27 | react-hooks/set-state-in-effect
|
||||||
|
26:11 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/set-state-in-effect')
|
||||||
|
62:9 warning Error: Calling setState synchronously within an effect can trigger cascading renders
|
||||||
|
|
||||||
|
Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:
|
||||||
|
* Update external systems with the latest state from React.
|
||||||
|
* Subscribe for updates from some external system, calling setState in a callback function when external state changes.
|
||||||
|
|
||||||
|
Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/Lightbox.tsx:62:9
|
||||||
|
60 | const index = parseInt(photoParam, 10);
|
||||||
|
61 | if (!isNaN(index) && index >= 0 && index < images.length) {
|
||||||
|
> 62 | setCurrentIndex(index);
|
||||||
|
| ^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect
|
||||||
|
63 | }
|
||||||
|
64 | }
|
||||||
|
65 | }, [searchParams, images.length]); // eslint-disable-line react-hooks/set-state-in-effect react-hooks/set-state-in-effect
|
||||||
|
65:38 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/set-state-in-effect')
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/components/home/GallerySection.tsx
|
||||||
|
3:17 warning 'useState' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
3:27 warning 'useEffect' is defined but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
/Users/marcmintel/Projects/klz-2026/middleware.ts
|
||||||
|
33:12 warning '_publicHostname' is assigned a value but never used @typescript-eslint/no-unused-vars
|
||||||
|
|
||||||
|
✖ 13 problems (0 errors, 13 warnings)
|
||||||
|
0 errors and 2 warnings potentially fixable with the `--fix` option.
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import createMiddleware from 'next-intl/middleware';
|
import createMiddleware from 'next-intl/middleware';
|
||||||
import { NextResponse, NextRequest } from 'next/server';
|
import { NextRequest } from 'next/server';
|
||||||
|
|
||||||
// Create the internationalization middleware
|
// Create the internationalization middleware
|
||||||
const intlMiddleware = createMiddleware({
|
const intlMiddleware = createMiddleware({
|
||||||
@@ -30,7 +30,7 @@ export default function middleware(request: NextRequest) {
|
|||||||
// Prioritize x-forwarded-host (passed by Traefik) over the local Host header
|
// Prioritize x-forwarded-host (passed by Traefik) over the local Host header
|
||||||
const hostHeader =
|
const hostHeader =
|
||||||
headers.get('x-forwarded-host') || headers.get('host') || 'testing.klz-cables.com';
|
headers.get('x-forwarded-host') || headers.get('host') || 'testing.klz-cables.com';
|
||||||
const [publicHostname] = hostHeader.split(':');
|
hostHeader.split(':');
|
||||||
|
|
||||||
urlObj.protocol = proto;
|
urlObj.protocol = proto;
|
||||||
// urlObj.hostname = publicHostname; // Don't rewrite hostname yet as it breaks internal fetches in dev
|
// urlObj.hostname = publicHostname; // Don't rewrite hostname yet as it breaks internal fetches in dev
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/* eslint-env node */
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
plugins: {
|
plugins: {
|
||||||
'@tailwindcss/postcss': {},
|
'@tailwindcss/postcss': {},
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/* eslint-env node */
|
|
||||||
/** @type {import('tailwindcss').Config} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
content: [
|
content: [
|
||||||
|
|||||||
4
typecheck_output.txt
Normal file
4
typecheck_output.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
> klz-cables-nextjs@1.0.0 typecheck /Users/marcmintel/Projects/klz-2026
|
||||||
|
> tsc --noEmit
|
||||||
|
|
||||||
Reference in New Issue
Block a user