From c091a19f50efb881ef663bdcc6c405e6a91840f7 Mon Sep 17 00:00:00 2001 From: Chris Brown <1731074+ccbrown@users.noreply.github.com> Date: Tue, 22 Apr 2025 01:45:06 -0400 Subject: [PATCH] don't index dev, add opengraph image --- aws/bin/aws.ts | 1 + aws/lib/environment.ts | 2 ++ aws/lib/regional-stack.ts | 2 ++ frontend/Dockerfile | 1 + frontend/next.config.ts | 1 + .../src/app/(public-area)/articles/[slug]/page.tsx | 6 ++++-- frontend/src/app/layout.tsx | 10 ++++++++++ frontend/src/image-loader.ts | 2 -- 8 files changed, 21 insertions(+), 4 deletions(-) diff --git a/aws/bin/aws.ts b/aws/bin/aws.ts index 4a4c6a07..9b07eaf8 100644 --- a/aws/bin/aws.ts +++ b/aws/bin/aws.ts @@ -31,6 +31,7 @@ new Environment(app, { stripePublishableKey: 'pk_test_51R8r2g2ejpbHZUu9RxWKmyDJTK7amXkB4vE5nRhrd0qvWCnViJsazl9oNjM144gwopnJi1zi3abUk3W4qEk7aWLy00fVUZIeTO', userRegistrationAllowlist: ['.*@ccb\\.sh', '.*@paragoncybersecurity\\.sh'], + noIndex: true, }); new Environment(app, { diff --git a/aws/lib/environment.ts b/aws/lib/environment.ts index 4ddad1ad..f5161be4 100644 --- a/aws/lib/environment.ts +++ b/aws/lib/environment.ts @@ -21,6 +21,7 @@ interface Props { pricing: Pricing; stripeEventSourceName?: string; userRegistrationAllowlist?: string[]; + noIndex?: boolean; } export class Environment { @@ -72,6 +73,7 @@ export class Environment { stripeSecretKeySecretName: globalBaseStack.stripeSecretKeySecretName, triggerReportGeneration: region === props.regions[0], userRegistrationAllowlist: props.userRegistrationAllowlist, + noIndex: props.noIndex, }); regionalStacks.push(regionalStack); regionalStack.addDependency(globalBaseStack); diff --git a/aws/lib/regional-stack.ts b/aws/lib/regional-stack.ts index 914a7ec2..c8f72a24 100644 --- a/aws/lib/regional-stack.ts +++ b/aws/lib/regional-stack.ts @@ -57,6 +57,7 @@ interface Props extends StackProps { stripeSecretKeySecretName: string; triggerReportGeneration?: boolean; userRegistrationAllowlist?: string[]; + noIndex?: boolean; } export class RegionalStack extends Stack { @@ -330,6 +331,7 @@ export class RegionalStack extends Stack { NEXT_PUBLIC_CDN_URL: `https://${s3BucketDistDomainName}/public/frontend`, NEXT_PUBLIC_PUBLIC_S3_BUCKET_NAME: publicS3BucketName, NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: props.stripePublishableKey, + NEXT_PUBLIC_NO_INDEX: props.noIndex ? 'true' : '', OPENAPI_YAML: fs.readFileSync(path.join(__dirname, '../../backend/api/apispec/openapi.yaml'), 'utf8'), }, directory: path.join(__dirname, '../../frontend'), diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 1c746fcd..1b59cae2 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -17,6 +17,7 @@ ARG NEXT_PUBLIC_CDN_URL ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY ARG NEXT_PUBLIC_AWS_ACCOUNT_ID ARG NEXT_PUBLIC_PUBLIC_S3_BUCKET_NAME +ARG NEXT_PUBLIC_NO_INDEX RUN npm run generate RUN npm run build diff --git a/frontend/next.config.ts b/frontend/next.config.ts index c4c480de..412265d9 100644 --- a/frontend/next.config.ts +++ b/frontend/next.config.ts @@ -7,6 +7,7 @@ const nextConfig: NextConfig = { ? { loader: 'custom', loaderFile: './src/image-loader.ts', + unoptimized: true, } : undefined, experimental: { diff --git a/frontend/src/app/(public-area)/articles/[slug]/page.tsx b/frontend/src/app/(public-area)/articles/[slug]/page.tsx index 492c1479..c0ce0d11 100644 --- a/frontend/src/app/(public-area)/articles/[slug]/page.tsx +++ b/frontend/src/app/(public-area)/articles/[slug]/page.tsx @@ -1,5 +1,5 @@ import { ArrowUturnLeftIcon } from '@heroicons/react/24/outline'; -import type { Metadata } from 'next'; +import type { Metadata, ResolvingMetadata } from 'next'; import Image from 'next/image'; import Link from 'next/link'; @@ -15,9 +15,10 @@ export async function generateStaticParams() { type Props = { params: Promise<{ slug: string }> }; -export async function generateMetadata({ params }: Props): Promise { +export async function generateMetadata({ params }: Props, parent: ResolvingMetadata): Promise { const { slug } = await params; const article = articles[slug]; + const previousImages = (await parent).openGraph?.images || []; return { title: article.title, @@ -27,6 +28,7 @@ export async function generateMetadata({ params }: Props): Promise { description: article.description, type: 'article', publishedTime: article.date.toISOString(), + images: previousImages, }, }; } diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 57c69ff2..96fdeb97 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -16,6 +16,16 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { + metadataBase: process.env.NEXT_PUBLIC_CDN_URL ? new URL(process.env.NEXT_PUBLIC_CDN_URL) : undefined, + openGraph: { + images: ['/images/opengraph.png'], + }, + robots: process.env.NEXT_PUBLIC_NO_INDEX + ? { + index: false, + follow: false, + } + : undefined, title: { template: '%s | Cloud Snitch', default: 'Cloud Snitch', diff --git a/frontend/src/image-loader.ts b/frontend/src/image-loader.ts index 47a1bbb9..a3ba97e1 100644 --- a/frontend/src/image-loader.ts +++ b/frontend/src/image-loader.ts @@ -1,5 +1,3 @@ -'use client'; - export default function imageLoader({ src }: { src: string }) { if (!src.startsWith('/')) { return src;