Spaces:
Sleeping
Sleeping
Mark-Lasfar commited on
Commit ·
bd70680
1
Parent(s): b376f60
Deploy Next.js with draft mode fix
Browse files- .codesandbox/tasks.json +18 -0
- .dockerignore +5 -0
- .gitignore +41 -0
- Dockerfile +13 -0
- README.md +45 -11
- app/[[...path]]/page.tsx +38 -0
- app/api/diagnose/route.ts +212 -0
- app/api/render/route.ts +10 -0
- app/diagnose/page.tsx +63 -0
- app/favicon.ico +0 -0
- app/layout.tsx +11 -0
- next.config.js +1 -0
- next.config.ts +8 -0
- package.json +19 -0
- pnpm-lock.yaml +536 -0
- tsconfig.json +41 -0
- vercel.json +5 -0
.codesandbox/tasks.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"setupTasks": [
|
| 3 |
+
{
|
| 4 |
+
"name": "Install Dependencies",
|
| 5 |
+
"command": "pnpm install"
|
| 6 |
+
}
|
| 7 |
+
],
|
| 8 |
+
"tasks": {
|
| 9 |
+
"dev": {
|
| 10 |
+
"name": "dev",
|
| 11 |
+
"command": "pnpm update next@canary && pnpm dev",
|
| 12 |
+
"runAtStart": true,
|
| 13 |
+
"restartOn": {
|
| 14 |
+
"clone": true
|
| 15 |
+
}
|
| 16 |
+
}
|
| 17 |
+
}
|
| 18 |
+
}
|
.dockerignore
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.next
|
| 2 |
+
node_modules
|
| 3 |
+
.git
|
| 4 |
+
.vercel
|
| 5 |
+
README.md
|
.gitignore
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
| 2 |
+
|
| 3 |
+
# dependencies
|
| 4 |
+
/node_modules
|
| 5 |
+
/.pnp
|
| 6 |
+
.pnp.*
|
| 7 |
+
.yarn/*
|
| 8 |
+
!.yarn/patches
|
| 9 |
+
!.yarn/plugins
|
| 10 |
+
!.yarn/releases
|
| 11 |
+
!.yarn/versions
|
| 12 |
+
|
| 13 |
+
# testing
|
| 14 |
+
/coverage
|
| 15 |
+
|
| 16 |
+
# next.js
|
| 17 |
+
/.next/
|
| 18 |
+
/out/
|
| 19 |
+
|
| 20 |
+
# production
|
| 21 |
+
/build
|
| 22 |
+
|
| 23 |
+
# misc
|
| 24 |
+
.DS_Store
|
| 25 |
+
*.pem
|
| 26 |
+
|
| 27 |
+
# debug
|
| 28 |
+
npm-debug.log*
|
| 29 |
+
yarn-debug.log*
|
| 30 |
+
yarn-error.log*
|
| 31 |
+
.pnpm-debug.log*
|
| 32 |
+
|
| 33 |
+
# env files (can opt-in for committing if needed)
|
| 34 |
+
.env*
|
| 35 |
+
|
| 36 |
+
# vercel
|
| 37 |
+
.vercel
|
| 38 |
+
|
| 39 |
+
# typescript
|
| 40 |
+
*.tsbuildinfo
|
| 41 |
+
next-env.d.ts
|
Dockerfile
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM node:20-slim AS base
|
| 2 |
+
WORKDIR /app
|
| 3 |
+
|
| 4 |
+
# Copy only necessary files
|
| 5 |
+
COPY package.json pnpm-lock.yaml ./
|
| 6 |
+
RUN npm install -g pnpm && pnpm install --frozen-lockfile
|
| 7 |
+
|
| 8 |
+
COPY . .
|
| 9 |
+
RUN pnpm run build
|
| 10 |
+
|
| 11 |
+
EXPOSE 7860
|
| 12 |
+
ENV PORT=7860
|
| 13 |
+
CMD ["pnpm", "start"]
|
README.md
CHANGED
|
@@ -1,11 +1,45 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
--
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
This is a [Next.js](https://nextjs.org/) template to use when reporting a [bug in the Next.js repository](https://github.com/vercel/next.js/issues) with the `app/` directory.
|
| 2 |
+
|
| 3 |
+
## Getting Started
|
| 4 |
+
|
| 5 |
+
These are the steps you should follow when creating a bug report:
|
| 6 |
+
|
| 7 |
+
- Bug reports must be verified against the `next@canary` release. The canary version of Next.js ships daily and includes all features and fixes that have not been released to the stable version yet. Think of canary as a public beta. Some issues may already be fixed in the canary version, so please verify that your issue reproduces before opening a new issue. Issues not verified against `next@canary` will be closed after 30 days.
|
| 8 |
+
- Make sure your issue is not a duplicate. Use the [GitHub issue search](https://github.com/vercel/next.js/issues) to see if there is already an open issue that matches yours. If that is the case, upvoting the other issue's first comment is desirable as we often prioritize issues based on the number of votes they receive. Note: Adding a "+1" or "same issue" comment without adding more context about the issue should be avoided. If you only find closed related issues, you can link to them using the issue number and `#`, eg.: `I found this related issue: #3000`.
|
| 9 |
+
- If you think the issue is not in Next.js, the best place to ask for help is our [Discord community](https://nextjs.org/discord) or [GitHub discussions](https://github.com/vercel/next.js/discussions). Our community is welcoming and can often answer a project-related question faster than the Next.js core team.
|
| 10 |
+
- Make the reproduction as minimal as possible. Try to exclude any code that does not help reproducing the issue. E.g. if you experience problems with Routing, including ESLint configurations or API routes aren't necessary. The less lines of code is to read through, the easier it is for the Next.js team to investigate. It may also help catching bugs in your codebase before publishing an issue.
|
| 11 |
+
- Don't forget to create a new repository on GitHub and make it public so that anyone can view it and reproduce it.
|
| 12 |
+
|
| 13 |
+
## How to use this template
|
| 14 |
+
|
| 15 |
+
Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example:
|
| 16 |
+
|
| 17 |
+
```bash
|
| 18 |
+
npx create-next-app --example reproduction-template reproduction-app
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
```bash
|
| 22 |
+
yarn create next-app --example reproduction-template reproduction-app
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
```bash
|
| 26 |
+
pnpm create next-app --example reproduction-template reproduction-app
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
## Learn More
|
| 30 |
+
|
| 31 |
+
To learn more about Next.js, take a look at the following resources:
|
| 32 |
+
|
| 33 |
+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
| 34 |
+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
| 35 |
+
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc) - a video tutorial by Lee Robinson
|
| 36 |
+
- [Triaging in the Next.js repository](https://github.com/vercel/next.js/blob/canary/contributing.md#triaging) - how we work on issues
|
| 37 |
+
- [CodeSandbox](https://codesandbox.io/s/github/vercel/next.js/tree/canary/examples/reproduction-template) - Edit this repository on CodeSandbox
|
| 38 |
+
|
| 39 |
+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
| 40 |
+
|
| 41 |
+
## Deployment
|
| 42 |
+
|
| 43 |
+
If your reproduction needs to be deployed, the easiest way is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
| 44 |
+
|
| 45 |
+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
app/[[...path]]/page.tsx
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { draftMode } from "next/headers";
|
| 2 |
+
|
| 3 |
+
export const dynamic = 'force-dynamic'
|
| 4 |
+
|
| 5 |
+
/** Add your relevant code here for the issue to reproduce */
|
| 6 |
+
export default async function Home({
|
| 7 |
+
searchParams,
|
| 8 |
+
}: {
|
| 9 |
+
searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
|
| 10 |
+
}) {
|
| 11 |
+
const draft = await draftMode();
|
| 12 |
+
let params = undefined;
|
| 13 |
+
|
| 14 |
+
if (draft.isEnabled) {
|
| 15 |
+
params = await searchParams;
|
| 16 |
+
console.log("In draft mode with search params: ", params);
|
| 17 |
+
} else {
|
| 18 |
+
console.log("Not in draft mode");
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
return (
|
| 22 |
+
<div>
|
| 23 |
+
<p>Draft mode is {draft.isEnabled ? "enabled" : "disabled"}</p>
|
| 24 |
+
<p>Search params: {JSON.stringify(params)}</p>
|
| 25 |
+
</div>
|
| 26 |
+
);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
export const generateStaticParams = async () => {
|
| 30 |
+
return [
|
| 31 |
+
{
|
| 32 |
+
path: [],
|
| 33 |
+
},
|
| 34 |
+
{
|
| 35 |
+
path: ["test"],
|
| 36 |
+
},
|
| 37 |
+
];
|
| 38 |
+
};
|
app/api/diagnose/route.ts
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { draftMode, cookies, headers } from "next/headers";
|
| 2 |
+
import { NextRequest } from "next/server";
|
| 3 |
+
|
| 4 |
+
export async function GET(req: NextRequest) {
|
| 5 |
+
const results = {
|
| 6 |
+
environment: process.env.NODE_ENV,
|
| 7 |
+
vercel: !!process.env.VERCEL,
|
| 8 |
+
timestamp: new Date().toISOString(),
|
| 9 |
+
|
| 10 |
+
// 1. Draft Mode Detection
|
| 11 |
+
draftMode: {
|
| 12 |
+
isEnabled: false,
|
| 13 |
+
cookiePresent: false,
|
| 14 |
+
headerPresent: false,
|
| 15 |
+
},
|
| 16 |
+
|
| 17 |
+
// 2. Request Details
|
| 18 |
+
request: {
|
| 19 |
+
url: req.url,
|
| 20 |
+
method: req.method,
|
| 21 |
+
headers: {} as Record<string, string>,
|
| 22 |
+
cookies: {} as Record<string, string>,
|
| 23 |
+
searchParams: Object.fromEntries(req.nextUrl.searchParams),
|
| 24 |
+
},
|
| 25 |
+
|
| 26 |
+
// 3. Next.js Internal State
|
| 27 |
+
workStore: {} as any,
|
| 28 |
+
workUnitStore: {} as any,
|
| 29 |
+
|
| 30 |
+
// 4. Diagnostic Info
|
| 31 |
+
diagnostics: [] as string[],
|
| 32 |
+
errors: [] as string[],
|
| 33 |
+
};
|
| 34 |
+
|
| 35 |
+
// Capture all headers (limited to relevant ones)
|
| 36 |
+
const relevantHeaders = [
|
| 37 |
+
'rsc',
|
| 38 |
+
'next-router-prefetch',
|
| 39 |
+
'next-router-state-tree',
|
| 40 |
+
'next-url',
|
| 41 |
+
'x-nextjs-draft-mode',
|
| 42 |
+
'x-vercel-id',
|
| 43 |
+
'x-matched-path',
|
| 44 |
+
];
|
| 45 |
+
|
| 46 |
+
for (const header of relevantHeaders) {
|
| 47 |
+
const value = req.headers.get(header);
|
| 48 |
+
if (value) {
|
| 49 |
+
results.request.headers[header] = value;
|
| 50 |
+
}
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
// Capture cookies
|
| 54 |
+
const cookieStore = await cookies();
|
| 55 |
+
const allCookies = cookieStore.getAll();
|
| 56 |
+
for (const cookie of allCookies) {
|
| 57 |
+
results.request.cookies[cookie.name] = cookie.value;
|
| 58 |
+
if (cookie.name === '__prerender_bypass' || cookie.name === '__next_preview_data') {
|
| 59 |
+
results.draftMode.cookiePresent = true;
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
// Check draft mode header
|
| 64 |
+
const draftHeader = req.headers.get('x-nextjs-draft-mode');
|
| 65 |
+
if (draftHeader === '1') {
|
| 66 |
+
results.draftMode.headerPresent = true;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
// Try to enable draft mode (for testing)
|
| 70 |
+
let draft;
|
| 71 |
+
try {
|
| 72 |
+
draft = await draftMode();
|
| 73 |
+
results.draftMode.isEnabled = draft.isEnabled;
|
| 74 |
+
results.diagnostics.push("✅ draftMode() API accessible");
|
| 75 |
+
} catch (err: any) {
|
| 76 |
+
results.errors.push(`❌ draftMode() failed: ${err.message}`);
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
// Try to access cookies
|
| 80 |
+
try {
|
| 81 |
+
const cookieList = await cookies();
|
| 82 |
+
const cookieNames = cookieList.getAll().map(c => c.name);
|
| 83 |
+
results.diagnostics.push(`✅ cookies() accessible. Found: ${cookieNames.join(', ') || 'none'}`);
|
| 84 |
+
} catch (err: any) {
|
| 85 |
+
results.errors.push(`❌ cookies() failed: ${err.message}`);
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
// Try to access headers
|
| 89 |
+
try {
|
| 90 |
+
const headersList = await headers();
|
| 91 |
+
const headerNames = Array.from(headersList.entries()).map(([k]) => k);
|
| 92 |
+
results.diagnostics.push(`✅ headers() accessible. Sample: ${headerNames.slice(0, 5).join(', ')}...`);
|
| 93 |
+
} catch (err: any) {
|
| 94 |
+
results.errors.push(`❌ headers() failed: ${err.message}`);
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
// Check static generation flags
|
| 98 |
+
results.diagnostics.push(`
|
| 99 |
+
🔍 To check if isStaticGeneration is being overridden,
|
| 100 |
+
look for this log in the terminal:
|
| 101 |
+
"[Next.js] Draft Mode detected on static page: ... Switching to dynamic render."
|
| 102 |
+
`);
|
| 103 |
+
|
| 104 |
+
// Determine the issue
|
| 105 |
+
if (results.draftMode.cookiePresent && !results.draftMode.isEnabled) {
|
| 106 |
+
results.diagnostics.push(`
|
| 107 |
+
⚠️ ISSUE DETECTED: Draft Mode cookie exists but draftMode.isEnabled = false
|
| 108 |
+
This means the cookie is not being properly recognized.
|
| 109 |
+
Expected behavior: Cookie should enable draft mode.
|
| 110 |
+
`);
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
if (results.request.searchParams.language && results.request.searchParams.timestamp) {
|
| 114 |
+
if (results.draftMode.isEnabled) {
|
| 115 |
+
results.diagnostics.push(`
|
| 116 |
+
✅ SUCCESS: Draft mode enabled with searchParams:
|
| 117 |
+
language=${results.request.searchParams.language}
|
| 118 |
+
timestamp=${results.request.searchParams.timestamp}
|
| 119 |
+
`);
|
| 120 |
+
} else {
|
| 121 |
+
results.diagnostics.push(`
|
| 122 |
+
❌ FAILURE: Draft mode NOT enabled but searchParams were provided.
|
| 123 |
+
Expected: searchParams should be populated when draft mode is enabled.
|
| 124 |
+
`);
|
| 125 |
+
}
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
// Return as HTML for easy viewing
|
| 129 |
+
const html = `
|
| 130 |
+
<!DOCTYPE html>
|
| 131 |
+
<html>
|
| 132 |
+
<head>
|
| 133 |
+
<title>Next.js Draft Mode Diagnostic Tool</title>
|
| 134 |
+
<style>
|
| 135 |
+
body { font-family: monospace; padding: 20px; background: #0a0a0a; color: #e0e0e0; }
|
| 136 |
+
h1 { color: #00ff88; }
|
| 137 |
+
h2 { color: #ffaa00; margin-top: 30px; }
|
| 138 |
+
.success { color: #00ff88; }
|
| 139 |
+
.error { color: #ff4444; }
|
| 140 |
+
.warning { color: #ffaa00; }
|
| 141 |
+
pre { background: #1a1a1a; padding: 15px; border-radius: 8px; overflow-x: auto; }
|
| 142 |
+
.card { border: 1px solid #333; border-radius: 8px; padding: 15px; margin: 10px 0; }
|
| 143 |
+
.card h3 { margin-top: 0; }
|
| 144 |
+
</style>
|
| 145 |
+
</head>
|
| 146 |
+
<body>
|
| 147 |
+
<h1>🔍 Next.js Draft Mode Diagnostic Tool</h1>
|
| 148 |
+
<p>Use this tool to debug why searchParams are empty in production.</p>
|
| 149 |
+
|
| 150 |
+
<div class="card">
|
| 151 |
+
<h2>📊 Test Result</h2>
|
| 152 |
+
${results.diagnostics.map(d => `<pre>${d}</pre>`).join('')}
|
| 153 |
+
${results.errors.map(e => `<pre class="error">${e}</pre>`).join('')}
|
| 154 |
+
</div>
|
| 155 |
+
|
| 156 |
+
<div class="card">
|
| 157 |
+
<h2>🍪 Cookies Detected</h2>
|
| 158 |
+
<pre>${JSON.stringify(results.request.cookies, null, 2)}</pre>
|
| 159 |
+
</div>
|
| 160 |
+
|
| 161 |
+
<div class="card">
|
| 162 |
+
<h2>📨 Headers Detected</h2>
|
| 163 |
+
<pre>${JSON.stringify(results.request.headers, null, 2)}</pre>
|
| 164 |
+
</div>
|
| 165 |
+
|
| 166 |
+
<div class="card">
|
| 167 |
+
<h2>🔗 URL Parameters</h2>
|
| 168 |
+
<pre>${JSON.stringify(results.request.searchParams, null, 2)}</pre>
|
| 169 |
+
</div>
|
| 170 |
+
|
| 171 |
+
<div class="card">
|
| 172 |
+
<h2>🌍 Environment</h2>
|
| 173 |
+
<pre>${JSON.stringify({ environment: results.environment, isVercel: results.vercel }, null, 2)}</pre>
|
| 174 |
+
</div>
|
| 175 |
+
|
| 176 |
+
<div class="card">
|
| 177 |
+
<h2>💡 How to Fix</h2>
|
| 178 |
+
<pre>
|
| 179 |
+
If you see "Draft Mode cookie exists but draftMode.isEnabled = false":
|
| 180 |
+
|
| 181 |
+
1. Check if isStaticGeneration is being overridden in app-render.tsx
|
| 182 |
+
2. Look for the console log: "[Next.js] Draft Mode detected..."
|
| 183 |
+
3. Verify that forceDynamic is being set to true
|
| 184 |
+
|
| 185 |
+
The fix should be applied in:
|
| 186 |
+
- packages/next/src/server/app-render/app-render.tsx
|
| 187 |
+
- packages/next/src/server/app-render/work-async-storage.external.ts
|
| 188 |
+
- packages/next/src/server/app-render/dynamic-rendering.ts
|
| 189 |
+
</pre>
|
| 190 |
+
</div>
|
| 191 |
+
|
| 192 |
+
<div class="card">
|
| 193 |
+
<h2>🧪 Quick Test</h2>
|
| 194 |
+
<p>
|
| 195 |
+
<a href="/api/render?language=en×tamp=123456" target="_blank">
|
| 196 |
+
➡️ Test Draft Mode with /api/render
|
| 197 |
+
</a>
|
| 198 |
+
</p>
|
| 199 |
+
<p>
|
| 200 |
+
<a href="/diagnose?language=en×tamp=123456" target="_blank">
|
| 201 |
+
🔄 Run this diagnostic again with parameters
|
| 202 |
+
</a>
|
| 203 |
+
</p>
|
| 204 |
+
</div>
|
| 205 |
+
</body>
|
| 206 |
+
</html>
|
| 207 |
+
`;
|
| 208 |
+
|
| 209 |
+
return new Response(html, {
|
| 210 |
+
headers: { 'Content-Type': 'text/html' },
|
| 211 |
+
});
|
| 212 |
+
}
|
app/api/render/route.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { draftMode } from "next/headers";
|
| 2 |
+
import { redirect } from "next/navigation";
|
| 3 |
+
|
| 4 |
+
export async function GET() {
|
| 5 |
+
const draft = await draftMode();
|
| 6 |
+
|
| 7 |
+
draft.enable();
|
| 8 |
+
|
| 9 |
+
redirect(`/test?language=en×tamp=${Date.now()}`);
|
| 10 |
+
}
|
app/diagnose/page.tsx
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { cookies, headers, draftMode } from 'next/headers'
|
| 2 |
+
|
| 3 |
+
export default async function DiagnosePage({
|
| 4 |
+
searchParams,
|
| 5 |
+
}: {
|
| 6 |
+
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
|
| 7 |
+
}) {
|
| 8 |
+
const awaitedParams = await searchParams
|
| 9 |
+
const draft = await draftMode()
|
| 10 |
+
const cookieStore = await cookies()
|
| 11 |
+
const headersList = await headers()
|
| 12 |
+
|
| 13 |
+
// استخراج الكوكيز المهمة
|
| 14 |
+
const prerenderBypassCookie = cookieStore.get('__prerender_bypass')
|
| 15 |
+
const nextPreviewDataCookie = cookieStore.get('__next_preview_data')
|
| 16 |
+
const allCookies = cookieStore.getAll().map(c => `${c.name}=${c.value}`)
|
| 17 |
+
|
| 18 |
+
// استخراج الهيدرز المهمة
|
| 19 |
+
const draftModeHeader = headersList.get('x-nextjs-draft-mode')
|
| 20 |
+
const rscHeader = headersList.get('rsc')
|
| 21 |
+
|
| 22 |
+
// تحليل المشكلة
|
| 23 |
+
let diagnosis = ''
|
| 24 |
+
let diagnosisType = 'info'
|
| 25 |
+
if (draft.isEnabled) {
|
| 26 |
+
diagnosis = '✅ Draft mode is ENABLED. The issue might be elsewhere.'
|
| 27 |
+
diagnosisType = 'success'
|
| 28 |
+
} else if (prerenderBypassCookie) {
|
| 29 |
+
diagnosis = '⚠️ CRITICAL: Draft mode cookie exists but draftMode.isEnabled = false. This is the core bug.'
|
| 30 |
+
diagnosisType = 'error'
|
| 31 |
+
} else {
|
| 32 |
+
diagnosis = 'ℹ️ Draft mode is disabled because the __prerender_bypass cookie is missing.'
|
| 33 |
+
diagnosisType = 'info'
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
return (
|
| 37 |
+
<div style={{ fontFamily: 'monospace', padding: '20px' }}>
|
| 38 |
+
<h1>🔬 Next.js Draft Mode - Deep Diagnosis</h1>
|
| 39 |
+
|
| 40 |
+
<div style={{ background: '#f0f0f0', padding: '15px', borderRadius: '8px', margin: '20px 0' }}>
|
| 41 |
+
<h2 style={{ marginTop: 0, color: diagnosisType === 'error' ? 'red' : 'green' }}>{diagnosis}</h2>
|
| 42 |
+
</div>
|
| 43 |
+
|
| 44 |
+
<div style={{ background: '#eef', padding: '15px', borderRadius: '8px', margin: '20px 0' }}>
|
| 45 |
+
<h3>🍪 Cookies Analysis (Key to the problem)</h3>
|
| 46 |
+
<pre>{JSON.stringify({ __prerender_bypass: prerenderBypassCookie?.value, __next_preview_data: nextPreviewDataCookie?.value, all_cookies: allCookies }, null, 2)}</pre>
|
| 47 |
+
{prerenderBypassCookie && !draft.isEnabled && (
|
| 48 |
+
<p style={{ color: 'red', fontWeight: 'bold' }}>🔥 BUG CONFIRMED: The cookie is sent, but Next.js ignores it. This is what your PR must fix.</p>
|
| 49 |
+
)}
|
| 50 |
+
</div>
|
| 51 |
+
|
| 52 |
+
<div style={{ background: '#efe', padding: '15px', borderRadius: '8px', margin: '20px 0' }}>
|
| 53 |
+
<h3>📨 Key Headers</h3>
|
| 54 |
+
<pre>{JSON.stringify({ 'x-nextjs-draft-mode': draftModeHeader, rsc: rscHeader }, null, 2)}</pre>
|
| 55 |
+
</div>
|
| 56 |
+
|
| 57 |
+
<div style={{ background: '#ffe', padding: '15px', borderRadius: '8px', margin: '20px 0' }}>
|
| 58 |
+
<h3>🔗 Request Data</h3>
|
| 59 |
+
<pre>{JSON.stringify({ searchParams: awaitedParams }, null, 2)}</pre>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
)
|
| 63 |
+
}
|
app/favicon.ico
ADDED
|
|
app/layout.tsx
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
export default function RootLayout({
|
| 2 |
+
children,
|
| 3 |
+
}: Readonly<{
|
| 4 |
+
children: React.ReactNode;
|
| 5 |
+
}>) {
|
| 6 |
+
return (
|
| 7 |
+
<html lang="en">
|
| 8 |
+
<body>{children}</body>
|
| 9 |
+
</html>
|
| 10 |
+
);
|
| 11 |
+
}
|
next.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
const path = require('path'); module.exports = { turbopack: { root: path.join(__dirname, '..') } }
|
next.config.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { NextConfig } from "next";
|
| 2 |
+
|
| 3 |
+
const nextConfig: NextConfig = {
|
| 4 |
+
/* config options here */
|
| 5 |
+
reactStrictMode: true,
|
| 6 |
+
};
|
| 7 |
+
|
| 8 |
+
export default nextConfig;
|
package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"private": true,
|
| 3 |
+
"scripts": {
|
| 4 |
+
"dev": "next dev",
|
| 5 |
+
"build": "next build",
|
| 6 |
+
"start": "next start"
|
| 7 |
+
},
|
| 8 |
+
"dependencies": {
|
| 9 |
+
"next": "https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz",
|
| 10 |
+
"react": "18.2.0",
|
| 11 |
+
"react-dom": "18.2.0"
|
| 12 |
+
},
|
| 13 |
+
"devDependencies": {
|
| 14 |
+
"@types/node": "^22",
|
| 15 |
+
"@types/react": "^18",
|
| 16 |
+
"typescript": "^5"
|
| 17 |
+
},
|
| 18 |
+
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319"
|
| 19 |
+
}
|
pnpm-lock.yaml
ADDED
|
@@ -0,0 +1,536 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
lockfileVersion: '9.0'
|
| 2 |
+
|
| 3 |
+
settings:
|
| 4 |
+
autoInstallPeers: true
|
| 5 |
+
excludeLinksFromLockfile: false
|
| 6 |
+
|
| 7 |
+
importers:
|
| 8 |
+
|
| 9 |
+
.:
|
| 10 |
+
dependencies:
|
| 11 |
+
next:
|
| 12 |
+
specifier: https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz
|
| 13 |
+
version: https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
| 14 |
+
react:
|
| 15 |
+
specifier: 18.2.0
|
| 16 |
+
version: 18.2.0
|
| 17 |
+
react-dom:
|
| 18 |
+
specifier: 18.2.0
|
| 19 |
+
version: 18.2.0(react@18.2.0)
|
| 20 |
+
devDependencies:
|
| 21 |
+
'@types/node':
|
| 22 |
+
specifier: ^22
|
| 23 |
+
version: 22.19.17
|
| 24 |
+
'@types/react':
|
| 25 |
+
specifier: ^18
|
| 26 |
+
version: 18.3.28
|
| 27 |
+
typescript:
|
| 28 |
+
specifier: ^5
|
| 29 |
+
version: 5.9.3
|
| 30 |
+
|
| 31 |
+
packages:
|
| 32 |
+
|
| 33 |
+
'@emnapi/runtime@1.10.0':
|
| 34 |
+
resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
|
| 35 |
+
|
| 36 |
+
'@img/colour@1.1.0':
|
| 37 |
+
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
|
| 38 |
+
engines: {node: '>=18'}
|
| 39 |
+
|
| 40 |
+
'@img/sharp-darwin-arm64@0.34.5':
|
| 41 |
+
resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
|
| 42 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 43 |
+
cpu: [arm64]
|
| 44 |
+
os: [darwin]
|
| 45 |
+
|
| 46 |
+
'@img/sharp-darwin-x64@0.34.5':
|
| 47 |
+
resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
|
| 48 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 49 |
+
cpu: [x64]
|
| 50 |
+
os: [darwin]
|
| 51 |
+
|
| 52 |
+
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
| 53 |
+
resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
|
| 54 |
+
cpu: [arm64]
|
| 55 |
+
os: [darwin]
|
| 56 |
+
|
| 57 |
+
'@img/sharp-libvips-darwin-x64@1.2.4':
|
| 58 |
+
resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
|
| 59 |
+
cpu: [x64]
|
| 60 |
+
os: [darwin]
|
| 61 |
+
|
| 62 |
+
'@img/sharp-libvips-linux-arm64@1.2.4':
|
| 63 |
+
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
|
| 64 |
+
cpu: [arm64]
|
| 65 |
+
os: [linux]
|
| 66 |
+
libc: [glibc]
|
| 67 |
+
|
| 68 |
+
'@img/sharp-libvips-linux-arm@1.2.4':
|
| 69 |
+
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
|
| 70 |
+
cpu: [arm]
|
| 71 |
+
os: [linux]
|
| 72 |
+
libc: [glibc]
|
| 73 |
+
|
| 74 |
+
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
| 75 |
+
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
|
| 76 |
+
cpu: [ppc64]
|
| 77 |
+
os: [linux]
|
| 78 |
+
libc: [glibc]
|
| 79 |
+
|
| 80 |
+
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
| 81 |
+
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
|
| 82 |
+
cpu: [riscv64]
|
| 83 |
+
os: [linux]
|
| 84 |
+
libc: [glibc]
|
| 85 |
+
|
| 86 |
+
'@img/sharp-libvips-linux-s390x@1.2.4':
|
| 87 |
+
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
|
| 88 |
+
cpu: [s390x]
|
| 89 |
+
os: [linux]
|
| 90 |
+
libc: [glibc]
|
| 91 |
+
|
| 92 |
+
'@img/sharp-libvips-linux-x64@1.2.4':
|
| 93 |
+
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
|
| 94 |
+
cpu: [x64]
|
| 95 |
+
os: [linux]
|
| 96 |
+
libc: [glibc]
|
| 97 |
+
|
| 98 |
+
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
| 99 |
+
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
|
| 100 |
+
cpu: [arm64]
|
| 101 |
+
os: [linux]
|
| 102 |
+
libc: [musl]
|
| 103 |
+
|
| 104 |
+
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
| 105 |
+
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
|
| 106 |
+
cpu: [x64]
|
| 107 |
+
os: [linux]
|
| 108 |
+
libc: [musl]
|
| 109 |
+
|
| 110 |
+
'@img/sharp-linux-arm64@0.34.5':
|
| 111 |
+
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
|
| 112 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 113 |
+
cpu: [arm64]
|
| 114 |
+
os: [linux]
|
| 115 |
+
libc: [glibc]
|
| 116 |
+
|
| 117 |
+
'@img/sharp-linux-arm@0.34.5':
|
| 118 |
+
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
|
| 119 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 120 |
+
cpu: [arm]
|
| 121 |
+
os: [linux]
|
| 122 |
+
libc: [glibc]
|
| 123 |
+
|
| 124 |
+
'@img/sharp-linux-ppc64@0.34.5':
|
| 125 |
+
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
|
| 126 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 127 |
+
cpu: [ppc64]
|
| 128 |
+
os: [linux]
|
| 129 |
+
libc: [glibc]
|
| 130 |
+
|
| 131 |
+
'@img/sharp-linux-riscv64@0.34.5':
|
| 132 |
+
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
|
| 133 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 134 |
+
cpu: [riscv64]
|
| 135 |
+
os: [linux]
|
| 136 |
+
libc: [glibc]
|
| 137 |
+
|
| 138 |
+
'@img/sharp-linux-s390x@0.34.5':
|
| 139 |
+
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
|
| 140 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 141 |
+
cpu: [s390x]
|
| 142 |
+
os: [linux]
|
| 143 |
+
libc: [glibc]
|
| 144 |
+
|
| 145 |
+
'@img/sharp-linux-x64@0.34.5':
|
| 146 |
+
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
|
| 147 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 148 |
+
cpu: [x64]
|
| 149 |
+
os: [linux]
|
| 150 |
+
libc: [glibc]
|
| 151 |
+
|
| 152 |
+
'@img/sharp-linuxmusl-arm64@0.34.5':
|
| 153 |
+
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
|
| 154 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 155 |
+
cpu: [arm64]
|
| 156 |
+
os: [linux]
|
| 157 |
+
libc: [musl]
|
| 158 |
+
|
| 159 |
+
'@img/sharp-linuxmusl-x64@0.34.5':
|
| 160 |
+
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
|
| 161 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 162 |
+
cpu: [x64]
|
| 163 |
+
os: [linux]
|
| 164 |
+
libc: [musl]
|
| 165 |
+
|
| 166 |
+
'@img/sharp-wasm32@0.34.5':
|
| 167 |
+
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
|
| 168 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 169 |
+
cpu: [wasm32]
|
| 170 |
+
|
| 171 |
+
'@img/sharp-win32-arm64@0.34.5':
|
| 172 |
+
resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
|
| 173 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 174 |
+
cpu: [arm64]
|
| 175 |
+
os: [win32]
|
| 176 |
+
|
| 177 |
+
'@img/sharp-win32-ia32@0.34.5':
|
| 178 |
+
resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
|
| 179 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 180 |
+
cpu: [ia32]
|
| 181 |
+
os: [win32]
|
| 182 |
+
|
| 183 |
+
'@img/sharp-win32-x64@0.34.5':
|
| 184 |
+
resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
|
| 185 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 186 |
+
cpu: [x64]
|
| 187 |
+
os: [win32]
|
| 188 |
+
|
| 189 |
+
'@next/env@16.2.1-canary.34':
|
| 190 |
+
resolution: {integrity: sha512-MfLVQz6dX4wAeXhqiFHh7RTpRfAa23PnuYzYh2A/JVKQ9Ivs54Wvg3rjS99bUZmx4z2JvjQShYXA6G/YeR4L3g==}
|
| 191 |
+
|
| 192 |
+
'@swc/helpers@0.5.15':
|
| 193 |
+
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
|
| 194 |
+
|
| 195 |
+
'@types/node@22.19.17':
|
| 196 |
+
resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==}
|
| 197 |
+
|
| 198 |
+
'@types/prop-types@15.7.15':
|
| 199 |
+
resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
|
| 200 |
+
|
| 201 |
+
'@types/react@18.3.28':
|
| 202 |
+
resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==}
|
| 203 |
+
|
| 204 |
+
baseline-browser-mapping@2.10.23:
|
| 205 |
+
resolution: {integrity: sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==}
|
| 206 |
+
engines: {node: '>=6.0.0'}
|
| 207 |
+
hasBin: true
|
| 208 |
+
|
| 209 |
+
caniuse-lite@1.0.30001791:
|
| 210 |
+
resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==}
|
| 211 |
+
|
| 212 |
+
client-only@0.0.1:
|
| 213 |
+
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
|
| 214 |
+
|
| 215 |
+
csstype@3.2.3:
|
| 216 |
+
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
| 217 |
+
|
| 218 |
+
detect-libc@2.1.2:
|
| 219 |
+
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
| 220 |
+
engines: {node: '>=8'}
|
| 221 |
+
|
| 222 |
+
js-tokens@4.0.0:
|
| 223 |
+
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
| 224 |
+
|
| 225 |
+
loose-envify@1.4.0:
|
| 226 |
+
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
|
| 227 |
+
hasBin: true
|
| 228 |
+
|
| 229 |
+
nanoid@3.3.11:
|
| 230 |
+
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
|
| 231 |
+
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
| 232 |
+
hasBin: true
|
| 233 |
+
|
| 234 |
+
next@https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz:
|
| 235 |
+
resolution: {integrity: sha512-PymHAgyIzFNwvJLwtQvWMv6n3dMy8rn7eCdqpFrpe3U723KKXQKNv0I3Rg+7ZUEn/y6ruuHmdRsAsVJxg1ddEw==, tarball: https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz}
|
| 236 |
+
version: 16.2.1-canary.34
|
| 237 |
+
engines: {node: '>=20.9.0'}
|
| 238 |
+
hasBin: true
|
| 239 |
+
peerDependencies:
|
| 240 |
+
'@opentelemetry/api': ^1.1.0
|
| 241 |
+
'@playwright/test': ^1.51.1
|
| 242 |
+
babel-plugin-react-compiler: '*'
|
| 243 |
+
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
|
| 244 |
+
react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
|
| 245 |
+
sass: ^1.3.0
|
| 246 |
+
peerDependenciesMeta:
|
| 247 |
+
'@opentelemetry/api':
|
| 248 |
+
optional: true
|
| 249 |
+
'@playwright/test':
|
| 250 |
+
optional: true
|
| 251 |
+
babel-plugin-react-compiler:
|
| 252 |
+
optional: true
|
| 253 |
+
sass:
|
| 254 |
+
optional: true
|
| 255 |
+
|
| 256 |
+
picocolors@1.1.1:
|
| 257 |
+
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
| 258 |
+
|
| 259 |
+
postcss@8.4.31:
|
| 260 |
+
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
|
| 261 |
+
engines: {node: ^10 || ^12 || >=14}
|
| 262 |
+
|
| 263 |
+
react-dom@18.2.0:
|
| 264 |
+
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
|
| 265 |
+
peerDependencies:
|
| 266 |
+
react: ^18.2.0
|
| 267 |
+
|
| 268 |
+
react@18.2.0:
|
| 269 |
+
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
|
| 270 |
+
engines: {node: '>=0.10.0'}
|
| 271 |
+
|
| 272 |
+
scheduler@0.23.2:
|
| 273 |
+
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
|
| 274 |
+
|
| 275 |
+
semver@7.7.4:
|
| 276 |
+
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
|
| 277 |
+
engines: {node: '>=10'}
|
| 278 |
+
hasBin: true
|
| 279 |
+
|
| 280 |
+
sharp@0.34.5:
|
| 281 |
+
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
|
| 282 |
+
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
| 283 |
+
|
| 284 |
+
source-map-js@1.2.1:
|
| 285 |
+
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
| 286 |
+
engines: {node: '>=0.10.0'}
|
| 287 |
+
|
| 288 |
+
styled-jsx@5.1.6:
|
| 289 |
+
resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
|
| 290 |
+
engines: {node: '>= 12.0.0'}
|
| 291 |
+
peerDependencies:
|
| 292 |
+
'@babel/core': '*'
|
| 293 |
+
babel-plugin-macros: '*'
|
| 294 |
+
react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
|
| 295 |
+
peerDependenciesMeta:
|
| 296 |
+
'@babel/core':
|
| 297 |
+
optional: true
|
| 298 |
+
babel-plugin-macros:
|
| 299 |
+
optional: true
|
| 300 |
+
|
| 301 |
+
tslib@2.8.1:
|
| 302 |
+
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
|
| 303 |
+
|
| 304 |
+
typescript@5.9.3:
|
| 305 |
+
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
|
| 306 |
+
engines: {node: '>=14.17'}
|
| 307 |
+
hasBin: true
|
| 308 |
+
|
| 309 |
+
undici-types@6.21.0:
|
| 310 |
+
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
| 311 |
+
|
| 312 |
+
snapshots:
|
| 313 |
+
|
| 314 |
+
'@emnapi/runtime@1.10.0':
|
| 315 |
+
dependencies:
|
| 316 |
+
tslib: 2.8.1
|
| 317 |
+
optional: true
|
| 318 |
+
|
| 319 |
+
'@img/colour@1.1.0':
|
| 320 |
+
optional: true
|
| 321 |
+
|
| 322 |
+
'@img/sharp-darwin-arm64@0.34.5':
|
| 323 |
+
optionalDependencies:
|
| 324 |
+
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
| 325 |
+
optional: true
|
| 326 |
+
|
| 327 |
+
'@img/sharp-darwin-x64@0.34.5':
|
| 328 |
+
optionalDependencies:
|
| 329 |
+
'@img/sharp-libvips-darwin-x64': 1.2.4
|
| 330 |
+
optional: true
|
| 331 |
+
|
| 332 |
+
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
| 333 |
+
optional: true
|
| 334 |
+
|
| 335 |
+
'@img/sharp-libvips-darwin-x64@1.2.4':
|
| 336 |
+
optional: true
|
| 337 |
+
|
| 338 |
+
'@img/sharp-libvips-linux-arm64@1.2.4':
|
| 339 |
+
optional: true
|
| 340 |
+
|
| 341 |
+
'@img/sharp-libvips-linux-arm@1.2.4':
|
| 342 |
+
optional: true
|
| 343 |
+
|
| 344 |
+
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
| 345 |
+
optional: true
|
| 346 |
+
|
| 347 |
+
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
| 348 |
+
optional: true
|
| 349 |
+
|
| 350 |
+
'@img/sharp-libvips-linux-s390x@1.2.4':
|
| 351 |
+
optional: true
|
| 352 |
+
|
| 353 |
+
'@img/sharp-libvips-linux-x64@1.2.4':
|
| 354 |
+
optional: true
|
| 355 |
+
|
| 356 |
+
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
| 357 |
+
optional: true
|
| 358 |
+
|
| 359 |
+
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
| 360 |
+
optional: true
|
| 361 |
+
|
| 362 |
+
'@img/sharp-linux-arm64@0.34.5':
|
| 363 |
+
optionalDependencies:
|
| 364 |
+
'@img/sharp-libvips-linux-arm64': 1.2.4
|
| 365 |
+
optional: true
|
| 366 |
+
|
| 367 |
+
'@img/sharp-linux-arm@0.34.5':
|
| 368 |
+
optionalDependencies:
|
| 369 |
+
'@img/sharp-libvips-linux-arm': 1.2.4
|
| 370 |
+
optional: true
|
| 371 |
+
|
| 372 |
+
'@img/sharp-linux-ppc64@0.34.5':
|
| 373 |
+
optionalDependencies:
|
| 374 |
+
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
| 375 |
+
optional: true
|
| 376 |
+
|
| 377 |
+
'@img/sharp-linux-riscv64@0.34.5':
|
| 378 |
+
optionalDependencies:
|
| 379 |
+
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
| 380 |
+
optional: true
|
| 381 |
+
|
| 382 |
+
'@img/sharp-linux-s390x@0.34.5':
|
| 383 |
+
optionalDependencies:
|
| 384 |
+
'@img/sharp-libvips-linux-s390x': 1.2.4
|
| 385 |
+
optional: true
|
| 386 |
+
|
| 387 |
+
'@img/sharp-linux-x64@0.34.5':
|
| 388 |
+
optionalDependencies:
|
| 389 |
+
'@img/sharp-libvips-linux-x64': 1.2.4
|
| 390 |
+
optional: true
|
| 391 |
+
|
| 392 |
+
'@img/sharp-linuxmusl-arm64@0.34.5':
|
| 393 |
+
optionalDependencies:
|
| 394 |
+
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
| 395 |
+
optional: true
|
| 396 |
+
|
| 397 |
+
'@img/sharp-linuxmusl-x64@0.34.5':
|
| 398 |
+
optionalDependencies:
|
| 399 |
+
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
| 400 |
+
optional: true
|
| 401 |
+
|
| 402 |
+
'@img/sharp-wasm32@0.34.5':
|
| 403 |
+
dependencies:
|
| 404 |
+
'@emnapi/runtime': 1.10.0
|
| 405 |
+
optional: true
|
| 406 |
+
|
| 407 |
+
'@img/sharp-win32-arm64@0.34.5':
|
| 408 |
+
optional: true
|
| 409 |
+
|
| 410 |
+
'@img/sharp-win32-ia32@0.34.5':
|
| 411 |
+
optional: true
|
| 412 |
+
|
| 413 |
+
'@img/sharp-win32-x64@0.34.5':
|
| 414 |
+
optional: true
|
| 415 |
+
|
| 416 |
+
'@next/env@16.2.1-canary.34': {}
|
| 417 |
+
|
| 418 |
+
'@swc/helpers@0.5.15':
|
| 419 |
+
dependencies:
|
| 420 |
+
tslib: 2.8.1
|
| 421 |
+
|
| 422 |
+
'@types/node@22.19.17':
|
| 423 |
+
dependencies:
|
| 424 |
+
undici-types: 6.21.0
|
| 425 |
+
|
| 426 |
+
'@types/prop-types@15.7.15': {}
|
| 427 |
+
|
| 428 |
+
'@types/react@18.3.28':
|
| 429 |
+
dependencies:
|
| 430 |
+
'@types/prop-types': 15.7.15
|
| 431 |
+
csstype: 3.2.3
|
| 432 |
+
|
| 433 |
+
baseline-browser-mapping@2.10.23: {}
|
| 434 |
+
|
| 435 |
+
caniuse-lite@1.0.30001791: {}
|
| 436 |
+
|
| 437 |
+
client-only@0.0.1: {}
|
| 438 |
+
|
| 439 |
+
csstype@3.2.3: {}
|
| 440 |
+
|
| 441 |
+
detect-libc@2.1.2:
|
| 442 |
+
optional: true
|
| 443 |
+
|
| 444 |
+
js-tokens@4.0.0: {}
|
| 445 |
+
|
| 446 |
+
loose-envify@1.4.0:
|
| 447 |
+
dependencies:
|
| 448 |
+
js-tokens: 4.0.0
|
| 449 |
+
|
| 450 |
+
nanoid@3.3.11: {}
|
| 451 |
+
|
| 452 |
+
next@https://github.com/Mark-Lasfar/next.js/releases/download/v16.2.1-canary.38-draftmode-fix/next-16.2.1-canary.34.tgz(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
|
| 453 |
+
dependencies:
|
| 454 |
+
'@next/env': 16.2.1-canary.34
|
| 455 |
+
'@swc/helpers': 0.5.15
|
| 456 |
+
baseline-browser-mapping: 2.10.23
|
| 457 |
+
caniuse-lite: 1.0.30001791
|
| 458 |
+
postcss: 8.4.31
|
| 459 |
+
react: 18.2.0
|
| 460 |
+
react-dom: 18.2.0(react@18.2.0)
|
| 461 |
+
styled-jsx: 5.1.6(react@18.2.0)
|
| 462 |
+
optionalDependencies:
|
| 463 |
+
sharp: 0.34.5
|
| 464 |
+
transitivePeerDependencies:
|
| 465 |
+
- '@babel/core'
|
| 466 |
+
- babel-plugin-macros
|
| 467 |
+
|
| 468 |
+
picocolors@1.1.1: {}
|
| 469 |
+
|
| 470 |
+
postcss@8.4.31:
|
| 471 |
+
dependencies:
|
| 472 |
+
nanoid: 3.3.11
|
| 473 |
+
picocolors: 1.1.1
|
| 474 |
+
source-map-js: 1.2.1
|
| 475 |
+
|
| 476 |
+
react-dom@18.2.0(react@18.2.0):
|
| 477 |
+
dependencies:
|
| 478 |
+
loose-envify: 1.4.0
|
| 479 |
+
react: 18.2.0
|
| 480 |
+
scheduler: 0.23.2
|
| 481 |
+
|
| 482 |
+
react@18.2.0:
|
| 483 |
+
dependencies:
|
| 484 |
+
loose-envify: 1.4.0
|
| 485 |
+
|
| 486 |
+
scheduler@0.23.2:
|
| 487 |
+
dependencies:
|
| 488 |
+
loose-envify: 1.4.0
|
| 489 |
+
|
| 490 |
+
semver@7.7.4:
|
| 491 |
+
optional: true
|
| 492 |
+
|
| 493 |
+
sharp@0.34.5:
|
| 494 |
+
dependencies:
|
| 495 |
+
'@img/colour': 1.1.0
|
| 496 |
+
detect-libc: 2.1.2
|
| 497 |
+
semver: 7.7.4
|
| 498 |
+
optionalDependencies:
|
| 499 |
+
'@img/sharp-darwin-arm64': 0.34.5
|
| 500 |
+
'@img/sharp-darwin-x64': 0.34.5
|
| 501 |
+
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
| 502 |
+
'@img/sharp-libvips-darwin-x64': 1.2.4
|
| 503 |
+
'@img/sharp-libvips-linux-arm': 1.2.4
|
| 504 |
+
'@img/sharp-libvips-linux-arm64': 1.2.4
|
| 505 |
+
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
| 506 |
+
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
| 507 |
+
'@img/sharp-libvips-linux-s390x': 1.2.4
|
| 508 |
+
'@img/sharp-libvips-linux-x64': 1.2.4
|
| 509 |
+
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
| 510 |
+
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
| 511 |
+
'@img/sharp-linux-arm': 0.34.5
|
| 512 |
+
'@img/sharp-linux-arm64': 0.34.5
|
| 513 |
+
'@img/sharp-linux-ppc64': 0.34.5
|
| 514 |
+
'@img/sharp-linux-riscv64': 0.34.5
|
| 515 |
+
'@img/sharp-linux-s390x': 0.34.5
|
| 516 |
+
'@img/sharp-linux-x64': 0.34.5
|
| 517 |
+
'@img/sharp-linuxmusl-arm64': 0.34.5
|
| 518 |
+
'@img/sharp-linuxmusl-x64': 0.34.5
|
| 519 |
+
'@img/sharp-wasm32': 0.34.5
|
| 520 |
+
'@img/sharp-win32-arm64': 0.34.5
|
| 521 |
+
'@img/sharp-win32-ia32': 0.34.5
|
| 522 |
+
'@img/sharp-win32-x64': 0.34.5
|
| 523 |
+
optional: true
|
| 524 |
+
|
| 525 |
+
source-map-js@1.2.1: {}
|
| 526 |
+
|
| 527 |
+
styled-jsx@5.1.6(react@18.2.0):
|
| 528 |
+
dependencies:
|
| 529 |
+
client-only: 0.0.1
|
| 530 |
+
react: 18.2.0
|
| 531 |
+
|
| 532 |
+
tslib@2.8.1: {}
|
| 533 |
+
|
| 534 |
+
typescript@5.9.3: {}
|
| 535 |
+
|
| 536 |
+
undici-types@6.21.0: {}
|
tsconfig.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"target": "ES2017",
|
| 4 |
+
"lib": [
|
| 5 |
+
"dom",
|
| 6 |
+
"dom.iterable",
|
| 7 |
+
"esnext"
|
| 8 |
+
],
|
| 9 |
+
"allowJs": true,
|
| 10 |
+
"skipLibCheck": true,
|
| 11 |
+
"strict": true,
|
| 12 |
+
"noEmit": true,
|
| 13 |
+
"esModuleInterop": true,
|
| 14 |
+
"module": "esnext",
|
| 15 |
+
"moduleResolution": "bundler",
|
| 16 |
+
"resolveJsonModule": true,
|
| 17 |
+
"isolatedModules": true,
|
| 18 |
+
"jsx": "react-jsx",
|
| 19 |
+
"incremental": true,
|
| 20 |
+
"plugins": [
|
| 21 |
+
{
|
| 22 |
+
"name": "next"
|
| 23 |
+
}
|
| 24 |
+
],
|
| 25 |
+
"paths": {
|
| 26 |
+
"@/*": [
|
| 27 |
+
"./*"
|
| 28 |
+
]
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"include": [
|
| 32 |
+
"next-env.d.ts",
|
| 33 |
+
"**/*.ts",
|
| 34 |
+
"**/*.tsx",
|
| 35 |
+
".next/types/**/*.ts",
|
| 36 |
+
".next/dev/types/**/*.ts"
|
| 37 |
+
],
|
| 38 |
+
"exclude": [
|
| 39 |
+
"node_modules"
|
| 40 |
+
]
|
| 41 |
+
}
|
vercel.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"buildCommand": "npm run build",
|
| 3 |
+
"installCommand": "npm install --save-dev typescript @types/react @types/node",
|
| 4 |
+
"framework": "nextjs"
|
| 5 |
+
}
|