Improve debug page

This commit is contained in:
Fergal Moran
2024-01-17 18:10:00 +00:00
parent 4b4d7630d9
commit ea22db925d
7 changed files with 70 additions and 18 deletions

14
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,14 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Next.js: debug server-side",
"type": "node-terminal",
"request": "launch",
"command": "NODE_ENV=development next dev -p 3002 & local-ssl-proxy --config ./ssl-proxy.json"
}
]
}

View File

@@ -1,10 +1,18 @@
import { SecureDebugDetails } from "@/components/debug/SecureDebugDetails"; import { SecureDebugDetails } from "@/components/debug/SecureDebugDetails";
import React from "react";
import HeadersPrinter from "@/components/debug/HeadersPrinter";
const DebugPage = async () => { const DebugPage = async () => {
return ( return (
<div> <>
{/* <SecureDebugDetails /> */} <h1 className="hidden text-center text-3xl font-bold leading-tight tracking-tighter md:block md:text-6xl lg:leading-[1.1]">
</div> This is what we know
</h1>
<div className="flex flex-col space-y-2 px-2">
<HeadersPrinter />
<SecureDebugDetails />
</div>
</>
); );
}; };
export default DebugPage; export default DebugPage;

View File

@@ -0,0 +1,18 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
import React from "react";
import { headers } from "next/headers";
import { getRequestHeaders } from "@/lib/helpers/headers";
import { Card, CardContent, CardHeader } from "@/components/ui/card";
const HeadersPrinter = () => {
const header = headers();
const request = getRequestHeaders(header);
return (
<Card>
<CardHeader>Request Headers</CardHeader>
<CardContent>{request}</CardContent>
</Card>
);
};
export default HeadersPrinter;

View File

@@ -7,11 +7,5 @@ import { headers } from "next/headers";
export const SecureDebugDetails = async () => { export const SecureDebugDetails = async () => {
const session = await getServerSession(authOptions); const session = await getServerSession(authOptions);
const request = headers(); const request = headers();
return ( return <PrintEnv session={session} request={request} />;
<div>
<div className="p-6">
<PrintEnv session={session} request={request} />
</div>
</div>
);
}; };

View File

@@ -11,7 +11,7 @@ type PrintEnvProps = {
const PrintEnv: React.FC<PrintEnvProps> = ({ session, request }) => { const PrintEnv: React.FC<PrintEnvProps> = ({ session, request }) => {
return ( return (
<div className="flex flex-col space-x-2 space-y-2"> <div className="flex flex-col space-y-4">
{session && ( {session && (
<Card> <Card>
<CardHeader>Session</CardHeader> <CardHeader>Session</CardHeader>

View File

@@ -1,5 +1,5 @@
import { createEnv } from "@t3-oss/env-nextjs"; import { createEnv } from '@t3-oss/env-nextjs';
import { z } from "zod"; import { z } from 'zod';
export const env = createEnv({ export const env = createEnv({
/** /**
@@ -11,14 +11,14 @@ export const env = createEnv({
.string() .string()
.url() .url()
.refine( .refine(
(str) => !str.includes("YOUR_PG_URL_HERE"), (str) => !str.includes('YOUR_PG_URL_HERE'),
"You forgot to change the default URL", 'You forgot to change the default URL',
), ),
NODE_ENV: z NODE_ENV: z
.enum(["development", "test", "production"]) .enum(['development', 'test', 'production'])
.default("development"), .default('development'),
NEXTAUTH_SECRET: NEXTAUTH_SECRET:
process.env.NODE_ENV === "production" process.env.NODE_ENV === 'production'
? z.string() ? z.string()
: z.string().optional(), : z.string().optional(),
NEXTAUTH_URL: z.preprocess( NEXTAUTH_URL: z.preprocess(
@@ -30,6 +30,7 @@ export const env = createEnv({
), ),
GOOGLE_CLIENT_ID: z.string(), GOOGLE_CLIENT_ID: z.string(),
GOOGLE_CLIENT_SECRET: z.string(), GOOGLE_CLIENT_SECRET: z.string(),
ALLOWED_DEBUG_IP: z.string().optional(),
}, },
/** /**
@@ -52,6 +53,7 @@ export const env = createEnv({
NEXTAUTH_URL: process.env.NEXTAUTH_URL, NEXTAUTH_URL: process.env.NEXTAUTH_URL,
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
ALLOWED_DEBUG_IP: process.env.ALLOWED_DEBUG_IP,
}, },
/** /**
* Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially

View File

@@ -0,0 +1,16 @@
import { type ReadonlyHeaders } from "next/dist/server/web/spec-extension/adapters/headers";
import { type ReactElement } from "react";
export const getRequestHeaders = (headers: ReadonlyHeaders) => {
const result: ReactElement[] = [];
for (const pair of headers.entries()) {
result.push(
<div>
{pair[0]}: {pair[1]}
</div>,
);
}
return result;
};