this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

test(e2e): import app-router from `@opennextjs/aws` (#274)

authored by

Victor Berchet and committed by
GitHub
baf8ff42 27ab1ab2

+1858 -120
+1 -1
.gitignore
··· 2 2 .DS_Store 3 3 4 4 output 5 - .worker-next 6 5 .open-next 7 6 .wrangler 7 + .turbo 8 8 dist
+36
examples/e2e/app-router/.gitignore
··· 1 + # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 + 3 + # dependencies 4 + /node_modules 5 + /.pnp 6 + .pnp.js 7 + 8 + # testing 9 + /coverage 10 + 11 + # next.js 12 + /.next/ 13 + .open-next 14 + /out/ 15 + 16 + # production 17 + /build 18 + 19 + # misc 20 + .DS_Store 21 + *.pem 22 + 23 + # debug 24 + npm-debug.log* 25 + yarn-debug.log* 26 + yarn-error.log* 27 + 28 + # local env files 29 + .env*.local 30 + 31 + # vercel 32 + .vercel 33 + 34 + # typescript 35 + *.tsbuildinfo 36 + next-env.d.ts
+29
examples/e2e/app-router/CHANGELOG.md
··· 1 + # app-router 2 + 3 + ## 0.1.4 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [[`9595714ac23e5f131b879d04d5cfb2a5d11bdbdd`](https://github.com/opennextjs/opennextjs-aws/commit/9595714ac23e5f131b879d04d5cfb2a5d11bdbdd), [`4e88b47935523de1d15da067b56105bd6be91e47`](https://github.com/opennextjs/opennextjs-aws/commit/4e88b47935523de1d15da067b56105bd6be91e47), [`7140ca56e1e88d7a7cae327eceb3ef8c2fde2a1e`](https://github.com/opennextjs/opennextjs-aws/commit/7140ca56e1e88d7a7cae327eceb3ef8c2fde2a1e)]: 8 + - @opennextjs/aws@3.3.1 9 + 10 + ## 0.1.3 11 + 12 + ### Patch Changes 13 + 14 + - Updated dependencies [[`4d328e3fc306b878e9497986baa65bfd1d4de66a`](https://github.com/opennextjs/opennextjs-aws/commit/4d328e3fc306b878e9497986baa65bfd1d4de66a), [`2b2a48b70ae95b5e600ac2e4b7f2df8702c5c26e`](https://github.com/opennextjs/opennextjs-aws/commit/2b2a48b70ae95b5e600ac2e4b7f2df8702c5c26e), [`f685ddea8f8a5c82591dc02713aff7138f2d9896`](https://github.com/opennextjs/opennextjs-aws/commit/f685ddea8f8a5c82591dc02713aff7138f2d9896), [`ef1fe48d570863266c271e5dedaf02b943849ded`](https://github.com/opennextjs/opennextjs-aws/commit/ef1fe48d570863266c271e5dedaf02b943849ded), [`8ab921f8b5bd40c7ba109ccef3e59a6c24283fb2`](https://github.com/opennextjs/opennextjs-aws/commit/8ab921f8b5bd40c7ba109ccef3e59a6c24283fb2), [`2202f36ce0f87357b249bd127cdd5e84d6deffd3`](https://github.com/opennextjs/opennextjs-aws/commit/2202f36ce0f87357b249bd127cdd5e84d6deffd3), [`44392ba82990d43e16a614113d9e7d8e257e5bdd`](https://github.com/opennextjs/opennextjs-aws/commit/44392ba82990d43e16a614113d9e7d8e257e5bdd), [`4dea7ea2f5ffd1848e51502c88d2efcc1896bb8c`](https://github.com/opennextjs/opennextjs-aws/commit/4dea7ea2f5ffd1848e51502c88d2efcc1896bb8c), [`0ac604e5867497cc93fb677b5ebc28ef87e057f8`](https://github.com/opennextjs/opennextjs-aws/commit/0ac604e5867497cc93fb677b5ebc28ef87e057f8), [`1ece6b479bb4e0309892ffbd1200870821a410c4`](https://github.com/opennextjs/opennextjs-aws/commit/1ece6b479bb4e0309892ffbd1200870821a410c4), [`697681bf9ce25212ce4e2e94d886ca425428280d`](https://github.com/opennextjs/opennextjs-aws/commit/697681bf9ce25212ce4e2e94d886ca425428280d)]: 15 + - @opennextjs/aws@3.3.0 16 + 17 + ## 0.1.2 18 + 19 + ### Patch Changes 20 + 21 + - Updated dependencies [[`6f798debb575b157acb2f5068658f95ace0fae50`](https://github.com/opennextjs/opennextjs-aws/commit/6f798debb575b157acb2f5068658f95ace0fae50), [`fe600ac6f5e513376cf233a5d2ce68affaa3aa5a`](https://github.com/opennextjs/opennextjs-aws/commit/fe600ac6f5e513376cf233a5d2ce68affaa3aa5a), [`5f0cbc8feac9eec728c27bb3b7ff5c3f3bc26716`](https://github.com/opennextjs/opennextjs-aws/commit/5f0cbc8feac9eec728c27bb3b7ff5c3f3bc26716), [`8b51108d9aee7e5ed3027c1ceda99091b579951d`](https://github.com/opennextjs/opennextjs-aws/commit/8b51108d9aee7e5ed3027c1ceda99091b579951d), [`b999c4e9a38499680bed77ddeb94b62a3301c0fa`](https://github.com/opennextjs/opennextjs-aws/commit/b999c4e9a38499680bed77ddeb94b62a3301c0fa), [`ba84259d2e35e79a562a7e3f055e350a03c9d651`](https://github.com/opennextjs/opennextjs-aws/commit/ba84259d2e35e79a562a7e3f055e350a03c9d651)]: 22 + - @opennextjs/aws@3.2.2 23 + 24 + ## 0.1.1 25 + 26 + ### Patch Changes 27 + 28 + - Updated dependencies [[`cf33973f3fbab73e77898fdd072a00a1f037257a`](https://github.com/opennextjs/opennextjs-aws/commit/cf33973f3fbab73e77898fdd072a00a1f037257a), [`77d87e7a870fad6afad022bf75aca18c8656c268`](https://github.com/opennextjs/opennextjs-aws/commit/77d87e7a870fad6afad022bf75aca18c8656c268), [`a43b82b4cb68889371ac8260aefef9e04eefb037`](https://github.com/opennextjs/opennextjs-aws/commit/a43b82b4cb68889371ac8260aefef9e04eefb037), [`bfa1a8c4056bd691fb57617dd6287693e51071b4`](https://github.com/opennextjs/opennextjs-aws/commit/bfa1a8c4056bd691fb57617dd6287693e51071b4), [`5839217411012d1df2874d299daa977ba3701c2c`](https://github.com/opennextjs/opennextjs-aws/commit/5839217411012d1df2874d299daa977ba3701c2c), [`dfc174d88b7bcc54eede09c98d9443dd84b93fd8`](https://github.com/opennextjs/opennextjs-aws/commit/dfc174d88b7bcc54eede09c98d9443dd84b93fd8)]: 29 + - @opennextjs/aws@3.2.1
+3
examples/e2e/app-router/README.md
··· 1 + # App Router 2 + 3 + This project uses the App Router exclusively...
+29
examples/e2e/app-router/app/albums/@modal/(.)[album]/[song]/page.tsx
··· 1 + import { getSong } from "@example/shared/api"; 2 + import Modal from "@example/shared/components/Modal"; 3 + 4 + type Props = { 5 + params: Promise<{ 6 + album: string; 7 + song: string; 8 + }>; 9 + }; 10 + export default async function SongPage(props: Props) { 11 + const params = await props.params; 12 + const song = await getSong(params.album, params.song); 13 + return ( 14 + <Modal> 15 + <h1>Modal</h1> 16 + Album: {decodeURIComponent(params.album)} 17 + <div className="absolute top-1/2 mt-10"> 18 + {/* <video width={1000} height={1000} autoPlay src={`https://youtube.com/watch?v=${params.song}`} /> */} 19 + <iframe 20 + width="560" 21 + height="315" 22 + title={params.song} 23 + allowFullScreen 24 + src={`https://youtube.com/embed/${song?.videoId}?autoplay=1`} 25 + ></iframe> 26 + </div> 27 + </Modal> 28 + ); 29 + }
+11
examples/e2e/app-router/app/albums/@modal/(.)[album]/page.tsx
··· 1 + import Modal from "@example/shared/components/Modal"; 2 + 3 + type Props = { 4 + params: Promise<{ 5 + artist: string; 6 + }>; 7 + }; 8 + export default async function ArtistPage(props: Props) { 9 + const params = await props.params; 10 + return <Modal>Artists {params.artist}</Modal>; 11 + }
+3
examples/e2e/app-router/app/albums/@modal/default.tsx
··· 1 + export default function Default() { 2 + return null; 3 + }
+25
examples/e2e/app-router/app/albums/[album]/[song]/page.tsx
··· 1 + import { getSong } from "@example/shared/api"; 2 + 3 + type Props = { 4 + params: Promise<{ 5 + album: string; 6 + song: string; 7 + }>; 8 + }; 9 + export default async function Song(props: Props) { 10 + const params = await props.params; 11 + const song = await getSong(params.album, params.song); 12 + 13 + return ( 14 + <div> 15 + <h1>Not Modal</h1> 16 + {decodeURIComponent(params.album)} 17 + <iframe 18 + width="560" 19 + height="315" 20 + allowFullScreen 21 + src={`https://youtube.com/embed/${song?.videoId}?autoplay=1`} 22 + ></iframe> 23 + </div> 24 + ); 25 + }
+3
examples/e2e/app-router/app/albums/[album]/page.tsx
··· 1 + export default function ArtistPage() { 2 + return <div>Artist</div>; 3 + }
+10
examples/e2e/app-router/app/albums/layout.tsx
··· 1 + import type { ReactNode } from "react"; 2 + 3 + export default function Layout({ children, modal }: { children: ReactNode; modal: ReactNode }) { 4 + return ( 5 + <div> 6 + {children} 7 + {modal} 8 + </div> 9 + ); 10 + }
+13
examples/e2e/app-router/app/albums/page.tsx
··· 1 + import { getAlbums } from "@example/shared/api"; 2 + import Album from "@example/shared/components/Album"; 3 + 4 + export default async function AlbumPage() { 5 + const albums = await getAlbums(); 6 + return ( 7 + <div> 8 + {albums.map((album) => ( 9 + <Album album={album} /> 10 + ))} 11 + </div> 12 + ); 13 + }
+16
examples/e2e/app-router/app/api/after/revalidate/route.ts
··· 1 + import { revalidateTag } from "next/cache"; 2 + import { NextResponse, after } from "next/server"; 3 + 4 + export function POST() { 5 + after( 6 + () => 7 + new Promise<void>((resolve) => 8 + setTimeout(() => { 9 + revalidateTag("date"); 10 + resolve(); 11 + }, 5000) 12 + ) 13 + ); 14 + 15 + return NextResponse.json({ success: true }); 16 + }
+12
examples/e2e/app-router/app/api/after/ssg/route.ts
··· 1 + import { unstable_cache } from "next/cache"; 2 + import { NextResponse } from "next/server"; 3 + 4 + export const dynamic = "force-static"; 5 + 6 + export async function GET() { 7 + const dateFn = unstable_cache(() => new Date().toISOString(), ["date"], { 8 + tags: ["date"], 9 + }); 10 + const date = await dateFn(); 11 + return NextResponse.json({ date }); 12 + }
+7
examples/e2e/app-router/app/api/client/route.ts
··· 1 + import { NextResponse } from "next/server"; 2 + 3 + export async function GET(request: Request) { 4 + return NextResponse.json({ 5 + hello: "client", 6 + }); 7 + }
+7
examples/e2e/app-router/app/api/host/route.ts
··· 1 + import { NextResponse } from "next/server"; 2 + 3 + export async function GET(request: Request) { 4 + return NextResponse.json({ 5 + url: request.url, 6 + }); 7 + }
+27
examples/e2e/app-router/app/api/isr/route.ts
··· 1 + import fs from "node:fs/promises"; 2 + import path from "node:path"; 3 + import type { NextRequest } from "next/server"; 4 + import { NextResponse } from "next/server"; 5 + 6 + export const dynamic = "force-dynamic"; 7 + 8 + // This endpoint simulates an on demand revalidation request 9 + export async function GET(request: NextRequest) { 10 + const cwd = process.cwd(); 11 + const prerenderManifest = await fs.readFile(path.join(cwd, ".next/prerender-manifest.json"), "utf-8"); 12 + const manifest = JSON.parse(prerenderManifest); 13 + const previewId = manifest.preview.previewModeId; 14 + 15 + const result = await fetch(`https://${request.headers.get("host")}/isr`, { 16 + headers: { "x-prerender-revalidate": previewId }, 17 + method: "HEAD", 18 + }); 19 + 20 + return NextResponse.json({ 21 + status: 200, 22 + body: { 23 + result: result.ok, 24 + cacheControl: result.headers.get("cache-control"), 25 + }, 26 + }); 27 + }
+72
examples/e2e/app-router/app/api/og/route.tsx
··· 1 + import { ImageResponse } from "next/og"; 2 + // App router includes @vercel/og. 3 + // No need to install it. 4 + // ?title=<title> 5 + 6 + export async function GET(request: Request) { 7 + try { 8 + const { searchParams } = new URL(request.url); 9 + 10 + // ?title=<title> 11 + const hasTitle = searchParams.has("title"); 12 + const title = hasTitle ? searchParams.get("title")?.slice(0, 100) : "My default title"; 13 + 14 + return new ImageResponse( 15 + ( 16 + <div 17 + style={{ 18 + backgroundColor: "black", 19 + backgroundSize: "150px 150px", 20 + height: "100%", 21 + width: "100%", 22 + display: "flex", 23 + textAlign: "center", 24 + alignItems: "center", 25 + justifyContent: "center", 26 + flexDirection: "column", 27 + flexWrap: "nowrap", 28 + }} 29 + > 30 + <div 31 + style={{ 32 + display: "flex", 33 + alignItems: "center", 34 + justifyContent: "center", 35 + justifyItems: "center", 36 + }} 37 + > 38 + <img 39 + alt="Vercel" 40 + height={200} 41 + src="data:image/svg+xml,%3Csvg width='116' height='100' fill='white' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M57.5 0L115 100H0L57.5 0z' /%3E%3C/svg%3E" 42 + style={{ margin: "0 30px" }} 43 + width={232} 44 + /> 45 + </div> 46 + <div 47 + style={{ 48 + fontSize: 60, 49 + fontStyle: "normal", 50 + letterSpacing: "-0.025em", 51 + color: "white", 52 + marginTop: 30, 53 + padding: "0 120px", 54 + lineHeight: 1.4, 55 + whiteSpace: "pre-wrap", 56 + }} 57 + > 58 + {title} 59 + </div> 60 + </div> 61 + ), 62 + { 63 + width: 1200, 64 + height: 630, 65 + } 66 + ); 67 + } catch (e: any) { 68 + return new Response("Failed to generate the image", { 69 + status: 500, 70 + }); 71 + } 72 + }
+40
examples/e2e/app-router/app/api/page.tsx
··· 1 + "use client"; 2 + 3 + import { useCallback, useState } from "react"; 4 + 5 + /** 6 + * Make /api/hello call exclusively on the client 7 + * - we already know SSR can fetch itself w/o issues 8 + */ 9 + export default function Page() { 10 + const [data, setData] = useState(); 11 + 12 + const onClientClick = useCallback(async () => { 13 + const { protocol, host } = window.location; 14 + const url = `${protocol}//${host}`; 15 + const r = await fetch(`${url}/api/client`); 16 + const d = await r.json(); 17 + setData(d); 18 + }, []); 19 + 20 + const onMiddlewareClick = useCallback(async () => { 21 + const { protocol, host } = window.location; 22 + const url = `${protocol}//${host}`; 23 + const r = await fetch(`${url}/api/middleware`); 24 + const d = await r.json(); 25 + setData(d); 26 + }, []); 27 + 28 + return ( 29 + <div> 30 + <div>API: {data ? JSON.stringify(data, null, 2) : "N/A"}</div> 31 + 32 + <button className="border p-2" onClick={onClientClick}> 33 + Call /api/client 34 + </button> 35 + <button className="border p-2" onClick={onMiddlewareClick}> 36 + Call /api/middleware 37 + </button> 38 + </div> 39 + ); 40 + }
+9
examples/e2e/app-router/app/api/revalidate-path/route.ts
··· 1 + import { revalidatePath } from "next/cache"; 2 + 3 + export const dynamic = "force-dynamic"; 4 + 5 + export async function GET() { 6 + revalidatePath("/revalidate-path"); 7 + 8 + return new Response("ok"); 9 + }
+9
examples/e2e/app-router/app/api/revalidate-tag/route.ts
··· 1 + import { revalidateTag } from "next/cache"; 2 + 3 + export const dynamic = "force-dynamic"; 4 + 5 + export async function GET() { 6 + revalidateTag("revalidate"); 7 + 8 + return new Response("ok"); 9 + }
+52
examples/e2e/app-router/app/api/sse/route.ts
··· 1 + import type { NextRequest } from "next/server"; 2 + 3 + function wait(ms: number) { 4 + return new Promise((resolve) => { 5 + setTimeout(resolve, ms); 6 + }); 7 + } 8 + 9 + export const dynamic = "force-dynamic"; 10 + 11 + export async function GET(request: NextRequest) { 12 + const resStream = new TransformStream(); 13 + const writer = resStream.writable.getWriter(); 14 + 15 + const res = new Response(resStream.readable, { 16 + headers: { 17 + "Content-Type": "text/event-stream", 18 + Connection: "keep-alive", 19 + "Cache-Control": "no-cache, no-transform", 20 + }, 21 + }); 22 + 23 + setTimeout(async () => { 24 + await writer.write( 25 + `data: ${JSON.stringify({ 26 + message: "open", 27 + time: new Date().toISOString(), 28 + })}\n\n` 29 + ); 30 + for (let i = 1; i <= 4; i++) { 31 + await wait(2000); 32 + await writer.write( 33 + `data: ${JSON.stringify({ 34 + message: `hello:${i}`, 35 + time: new Date().toISOString(), 36 + })}\n\n` 37 + ); 38 + } 39 + 40 + await wait(2000); // Wait for 4 seconds 41 + await writer.write( 42 + `data: ${JSON.stringify({ 43 + message: "close", 44 + time: new Date().toISOString(), 45 + })}\n\n` 46 + ); 47 + await wait(5000); 48 + await writer.close(); 49 + }, 100); 50 + 51 + return res; 52 + }
+8
examples/e2e/app-router/app/config-redirect/page.tsx
··· 1 + export default function RedirectDestination() { 2 + return ( 3 + <div> 4 + <h1>I was redirected from next.config.js</h1> 5 + <p>/next-config-redirect =&gt; /config-redirect</p> 6 + </div> 7 + ); 8 + }
+23
examples/e2e/app-router/app/globals.css
··· 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities; 4 + 5 + :root { 6 + --foreground-rgb: 0, 0, 0; 7 + --background-start-rgb: 214, 219, 220; 8 + --background-end-rgb: 255, 255, 255; 9 + } 10 + 11 + @media (prefers-color-scheme: dark) { 12 + :root { 13 + --foreground-rgb: 255, 255, 255; 14 + --background-start-rgb: 0, 0, 0; 15 + --background-end-rgb: 0, 0, 0; 16 + } 17 + } 18 + 19 + body { 20 + color: rgb(var(--foreground-rgb)); 21 + background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) 22 + rgb(var(--background-start-rgb)); 23 + }
+11
examples/e2e/app-router/app/headers/page.tsx
··· 1 + import { headers } from "next/headers"; 2 + 3 + export default async function Headers() { 4 + const middlewareHeader = (await headers()).get("request-header"); 5 + return ( 6 + <div> 7 + <h1>Headers</h1> 8 + <div>{middlewareHeader}</div> 9 + </div> 10 + ); 11 + }
+14
examples/e2e/app-router/app/image-optimization/page.tsx
··· 1 + import Image from "next/image"; 2 + 3 + export default function ImageOptimization() { 4 + return ( 5 + <div> 6 + <Image 7 + src="https://opennext.js.org/architecture.png" 8 + alt="Open Next architecture" 9 + width={300} 10 + height={300} 11 + /> 12 + </div> 13 + ); 14 + }
+9
examples/e2e/app-router/app/isr/page.tsx
··· 1 + async function getTime() { 2 + return new Date().toISOString(); 3 + } 4 + 5 + export const revalidate = 10; 6 + export default async function ISR() { 7 + const time = getTime(); 8 + return <div>Time: {time}</div>; 9 + }
+19
examples/e2e/app-router/app/layout.tsx
··· 1 + import "./globals.css"; 2 + 3 + import type { Metadata } from "next"; 4 + import { Inter } from "next/font/google"; 5 + 6 + const inter = Inter({ subsets: ["latin"] }); 7 + 8 + export const metadata: Metadata = { 9 + title: "Nextjs App Router", 10 + description: "Generated by create next app", 11 + }; 12 + 13 + export default function RootLayout({ children }: { children: React.ReactNode }) { 14 + return ( 15 + <html lang="en"> 16 + <body className={inter.className}>{children}</body> 17 + </html> 18 + ); 19 + }
+38
examples/e2e/app-router/app/og/opengraph-image.tsx
··· 1 + import { ImageResponse } from "next/og"; 2 + 3 + // Image metadata 4 + export const alt = "OpenNext"; 5 + export const size = { 6 + width: 1200, 7 + height: 630, 8 + }; 9 + 10 + export const contentType = "image/png"; 11 + 12 + // Image generation 13 + export default async function Image() { 14 + return new ImageResponse( 15 + ( 16 + // ImageResponse JSX element 17 + <div 18 + style={{ 19 + fontSize: 128, 20 + background: "white", 21 + width: "100%", 22 + height: "100%", 23 + display: "flex", 24 + alignItems: "center", 25 + justifyContent: "center", 26 + }} 27 + > 28 + OpenNext 29 + </div> 30 + ), 31 + // ImageResponse options 32 + { 33 + // For convenience, we can re-use the exported opengraph-image 34 + // size config to also set the ImageResponse's width and height. 35 + ...size, 36 + } 37 + ); 38 + }
+3
examples/e2e/app-router/app/og/page.tsx
··· 1 + export default function Page() { 2 + return <div></div>; 3 + }
+49
examples/e2e/app-router/app/page.tsx
··· 1 + import Nav from "@example/shared/components/Nav"; 2 + 3 + export default function Home() { 4 + return ( 5 + <> 6 + <h1>Nextjs App Router</h1> 7 + 8 + <main className="grid grid-cols-2 gap-4 p-10 [&>a]:border"> 9 + <Nav href={"/albums"} title="Albums"> 10 + Modal and interception of the greatest hits 11 + </Nav> 12 + <Nav href={"/rewrite"} title="Rewrite"> 13 + Middleware Rewrite of a page. /rewrite should rewrite the contents of /rewrite-destination 14 + </Nav> 15 + <Nav href={"/redirect"} title="Redirect"> 16 + Middleware Rewrite of a page. /redirect should redirect page to /redirect-destination 17 + </Nav> 18 + <Nav href={"/server-actions"} title="Server Actions"> 19 + Client component imports a 'use server' server action and calls it directly without setting up any 20 + api endpoints 21 + </Nav> 22 + <Nav href={"/isr"} title="ISR"> 23 + Incremental Static Regeneration revalidates every 10 seconds with a new timestamp 24 + </Nav> 25 + <Nav href={"/ssr"} title="SSR"> 26 + Server Side Render should generate a new timestamp on each load. Streaming support for loading... 27 + </Nav> 28 + <Nav href={"/api"} title="API"> 29 + Calls an API endpoint defined in app/api/hello/route and middleware 30 + </Nav> 31 + <Nav href={"/parallel"} title="Parallel"> 32 + Parallel routing 33 + </Nav> 34 + <Nav href={"/headers"} title="Headers"> 35 + Headers from middleware should be available via headers() 36 + </Nav> 37 + <Nav href={"/search-query"} title="Search Query"> 38 + Search Query Params should be available in middleware 39 + </Nav> 40 + <Nav href={"/sse"} title="Server Sent Events"> 41 + Server Sent Events via Streaming 42 + </Nav> 43 + <Nav href={"/image-optimization"} title="Image Optimization"> 44 + Image Optimization with next/image 45 + </Nav> 46 + </main> 47 + </> 48 + ); 49 + }
+3
examples/e2e/app-router/app/parallel/@a/a-page/page.tsx
··· 1 + export default function APage() { 2 + return <div>A Page</div>; 3 + }
+10
examples/e2e/app-router/app/parallel/@a/page.tsx
··· 1 + import Link from "next/link"; 2 + 3 + export default function A() { 4 + return ( 5 + <div className="border p-4"> 6 + <h1>Parallel Route A</h1> 7 + <Link href="/parallel/a-page">Go to a-page</Link> 8 + </div> 9 + ); 10 + }
+3
examples/e2e/app-router/app/parallel/@b/b-page/page.tsx
··· 1 + export default function BPage() { 2 + return <div>B Page</div>; 3 + }
+11
examples/e2e/app-router/app/parallel/@b/page.tsx
··· 1 + import Link from "next/link"; 2 + 3 + export default function B() { 4 + return ( 5 + <div className="border p-4"> 6 + <h1>Parallel Route B</h1> 7 + 8 + <Link href="/parallel/b-page">Go to b-page</Link> 9 + </div> 10 + ); 11 + }
+42
examples/e2e/app-router/app/parallel/layout.tsx
··· 1 + "use client"; 2 + import { useState } from "react"; 3 + 4 + import type { ReactNode } from "react"; 5 + 6 + export default function Layout({ a, b, children }: { children: ReactNode; a: ReactNode; b: ReactNode }) { 7 + const [routeA, setRouteA] = useState(false); 8 + const [routeB, setRouteB] = useState(false); 9 + 10 + return ( 11 + <div> 12 + <div className="flex flex-col mb-10"> 13 + <label htmlFor="a"> 14 + Enable A 15 + <input 16 + name="a" 17 + type="checkbox" 18 + checked={routeA} 19 + onChange={(e) => { 20 + setRouteA(e.target.checked); 21 + }} 22 + /> 23 + </label> 24 + <label htmlFor="b"> 25 + Enable B 26 + <input 27 + name="b" 28 + type="checkbox" 29 + checked={routeB} 30 + onChange={(e) => { 31 + setRouteB(e.target.checked); 32 + }} 33 + /> 34 + </label> 35 + </div> 36 + 37 + {routeA && a} 38 + {routeB && b} 39 + {/* {children} */} 40 + </div> 41 + ); 42 + }
+3
examples/e2e/app-router/app/parallel/page.tsx
··· 1 + export default function Page() { 2 + return null; 3 + }
+3
examples/e2e/app-router/app/redirect-destination/page.tsx
··· 1 + export default function RedirectDestination() { 2 + return <div>Redirect Destination</div>; 3 + }
+19
examples/e2e/app-router/app/revalidate-path/page.tsx
··· 1 + export default async function Page() { 2 + const responseSST = await fetch("https://sst.dev", { 3 + next: { 4 + tags: ["path"], 5 + }, 6 + }); 7 + // This one doesn't have a tag 8 + const responseOpenNext = await fetch("https://opennext.js.org"); 9 + const reqIdSst = responseSST.headers.get("x-amz-cf-id"); 10 + const dateInOpenNext = responseOpenNext.headers.get("date"); 11 + return ( 12 + <div> 13 + <h1>Request id from SST</h1> 14 + <p>RequestID: {reqIdSst}</p> 15 + <h1>Date from from OpenNext</h1> 16 + <p>Date: {dateInOpenNext}</p> 17 + </div> 18 + ); 19 + }
+15
examples/e2e/app-router/app/revalidate-tag/layout.tsx
··· 1 + import { unstable_cache } from "next/cache"; 2 + import type { ReactNode } from "react"; 3 + 4 + export default async function Layout({ children }: { children: ReactNode }) { 5 + const fakeFetch = unstable_cache(async () => new Date().getTime(), ["fakeFetch"], { 6 + tags: ["revalidate"], 7 + }); 8 + const fetchedDate = await fakeFetch(); 9 + return ( 10 + <div> 11 + <div>Fetched time: {new Date(fetchedDate).toISOString()}</div> 12 + {children} 13 + </div> 14 + ); 15 + }
+3
examples/e2e/app-router/app/revalidate-tag/nested/page.tsx
··· 1 + export default async function Nested() { 2 + return <div>Nested</div>; 3 + }
+8
examples/e2e/app-router/app/revalidate-tag/page.tsx
··· 1 + async function getTime() { 2 + return new Date().toISOString(); 3 + } 4 + 5 + export default async function ISR() { 6 + const time = getTime(); 7 + return <div>Time: {time}</div>; 8 + }
+3
examples/e2e/app-router/app/rewrite-destination/page.tsx
··· 1 + export default function RewriteDestination() { 2 + return <div>Rewritten Destination</div>; 3 + }
+25
examples/e2e/app-router/app/search-query/page.tsx
··· 1 + import { headers } from "next/headers"; 2 + 3 + export default async function SearchQuery(props: { 4 + searchParams: Promise<Record<string, string | string[]>>; 5 + }) { 6 + const propsSearchParams = await props.searchParams; 7 + const mwSearchParams = (await headers()).get("search-params"); 8 + const multiValueParams = propsSearchParams.multi; 9 + const multiValueArray = Array.isArray(multiValueParams) ? multiValueParams : [multiValueParams]; 10 + return ( 11 + <> 12 + <h1>Search Query</h1> 13 + <div>Search Params via Props: {propsSearchParams.searchParams}</div> 14 + <div>Search Params via Middleware: {mwSearchParams}</div> 15 + {multiValueParams && ( 16 + <> 17 + <div>Multi-value Params (key: multi): {multiValueArray.length}</div> 18 + {multiValueArray.map((value) => ( 19 + <div>{value}</div> 20 + ))} 21 + </> 22 + )} 23 + </> 24 + ); 25 + }
+26
examples/e2e/app-router/app/server-actions/client.tsx
··· 1 + "use client"; 2 + import { useCallback, useState, useTransition } from "react"; 3 + 4 + import type { Song as SongType } from "@example/shared/api"; 5 + import { getSong } from "@example/shared/api"; 6 + import Song from "@example/shared/components/Album/Song"; 7 + 8 + export default function Client() { 9 + const [isPending, startTransition] = useTransition(); 10 + const [song, setSong] = useState<SongType>(); 11 + 12 + const onClick = useCallback(() => { 13 + startTransition(async () => { 14 + const song = await getSong("Hold Me In Your Arms", "I'm never gonna give you up"); 15 + setSong(song); 16 + }); 17 + }, []); 18 + 19 + return ( 20 + <div> 21 + <button onClick={onClick}>Fire Server Actions</button> 22 + {isPending && <div>☎️ing Server Actions...</div>} 23 + {song && <Song song={song} play />} 24 + </div> 25 + ); 26 + }
+10
examples/e2e/app-router/app/server-actions/page.tsx
··· 1 + import Client from "./client"; 2 + 3 + export default function Page() { 4 + return ( 5 + <div> 6 + <h1>Server Actions</h1> 7 + <Client /> 8 + </div> 9 + ); 10 + }
+36
examples/e2e/app-router/app/sse/page.tsx
··· 1 + "use client"; 2 + 3 + import { useEffect, useState } from "react"; 4 + 5 + export default function SSE() { 6 + const [events, setEvents] = useState<any[]>([]); 7 + 8 + useEffect(() => { 9 + const e = new EventSource("/api/sse"); 10 + 11 + e.onmessage = (msg) => { 12 + console.log(msg); 13 + try { 14 + const data = JSON.parse(msg.data); 15 + if (data.message === "close") { 16 + e.close(); 17 + console.log("closing"); 18 + } 19 + setEvents((prev) => prev.concat(data)); 20 + } catch (err) { 21 + console.log("failed to parse: ", err, msg); 22 + } 23 + }; 24 + }, []); 25 + 26 + return ( 27 + <> 28 + <h1>Server Sent Event</h1> 29 + {events.map((e, i) => ( 30 + <div key={i}> 31 + Message {i}: {JSON.stringify(e)} 32 + </div> 33 + ))} 34 + </> 35 + ); 36 + }
+12
examples/e2e/app-router/app/ssr/layout.tsx
··· 1 + import type { PropsWithChildren } from "react"; 2 + 3 + export default function Layout({ children }: PropsWithChildren) { 4 + return ( 5 + <div> 6 + <h1>SSR</h1> 7 + {/* 16 kb seems necessary here to prevent any buffering*/} 8 + {/* <Filler size={16} /> */} 9 + {children} 10 + </div> 11 + ); 12 + }
+3
examples/e2e/app-router/app/ssr/loading.tsx
··· 1 + export default function Loading() { 2 + return <div>Loading...</div>; 3 + }
+25
examples/e2e/app-router/app/ssr/page.tsx
··· 1 + import { headers } from "next/headers"; 2 + 3 + async function getTime() { 4 + const res = await new Promise<string>((resolve) => { 5 + setTimeout(() => { 6 + resolve(new Date().toISOString()); 7 + }, 1500); 8 + }); 9 + return res; 10 + } 11 + 12 + export default async function SSR() { 13 + const time = await getTime(); 14 + const headerList = await headers(); 15 + const responseOpenNext = await fetch("https://opennext.js.org", { 16 + cache: "force-cache", 17 + }); 18 + return ( 19 + <div> 20 + <h1>Time: {time}</h1> 21 + <div> {headerList.get("host")}</div> 22 + <p>Cached fetch: {responseOpenNext.headers.get("date")}</p> 23 + </div> 24 + ); 25 + }
+71
examples/e2e/app-router/middleware.ts
··· 1 + import type { NextRequest } from "next/server"; 2 + import { NextResponse } from "next/server"; 3 + 4 + export function middleware(request: NextRequest) { 5 + const path = request.nextUrl.pathname; //new URL(request.url).pathname; 6 + 7 + const host = request.headers.get("host"); 8 + const protocol = host?.startsWith("localhost") ? "http" : "https"; 9 + if (path === "/redirect") { 10 + const u = new URL("/redirect-destination", `${protocol}://${host}`); 11 + return NextResponse.redirect(u, { 12 + headers: { "set-cookie": "test=success" }, 13 + }); 14 + } 15 + if (path === "/rewrite") { 16 + const u = new URL("/rewrite-destination", `${protocol}://${host}`); 17 + return NextResponse.rewrite(u); 18 + } 19 + if (path === "/api/middleware") { 20 + return new NextResponse(JSON.stringify({ hello: "middleware" }), { 21 + status: 200, 22 + headers: { 23 + "content-type": "application/json", 24 + }, 25 + }); 26 + } 27 + const requestHeaders = new Headers(); 28 + // Setting the Request Headers, this should be available in RSC 29 + requestHeaders.set("request-header", "request-header"); 30 + requestHeaders.set("search-params", `mw/${request.nextUrl.searchParams.get("searchParams") || ""}`); 31 + const responseHeaders = new Headers(); 32 + // Response headers should show up in the client's response headers 33 + responseHeaders.set("response-header", "response-header"); 34 + 35 + // Set the cache control header with custom swr 36 + // For: isr.test.ts 37 + if (path === "/isr" && !request.headers.get("x-prerender-revalidate")) { 38 + responseHeaders.set("cache-control", "max-age=10, stale-while-revalidate=999"); 39 + } 40 + 41 + // It is so that cloudfront doesn't cache the response 42 + if ( 43 + path.startsWith("/revalidate-tag") || 44 + path.startsWith("/revalidate-path") || 45 + path.startsWith("/api/after/ssg") 46 + ) { 47 + responseHeaders.set("cache-control", "private, no-cache, no-store, max-age=0, must-revalidate"); 48 + } 49 + 50 + const r = NextResponse.next({ 51 + headers: responseHeaders, 52 + request: { 53 + headers: requestHeaders, 54 + }, 55 + }); 56 + 57 + // Set cookies in middleware 58 + // For: middleware.cookies.test.ts 59 + r.cookies.set("from", "middleware", { 60 + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), 61 + }); 62 + r.cookies.set("with", "love", { 63 + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), 64 + }); 65 + 66 + return r; 67 + } 68 + 69 + export const config = { 70 + matcher: ["/((?!_next|favicon.ico|match|static|fonts|api/auth|og).*)"], 71 + };
+76
examples/e2e/app-router/next.config.ts
··· 1 + import type { NextConfig } from "next"; 2 + 3 + const nextConfig: NextConfig = { 4 + poweredByHeader: false, 5 + cleanDistDir: true, 6 + transpilePackages: ["@example/shared"], 7 + output: "standalone", 8 + // outputFileTracingRoot: "../sst", 9 + eslint: { 10 + ignoreDuringBuilds: true, 11 + }, 12 + images: { 13 + remotePatterns: [ 14 + { 15 + protocol: "https", 16 + hostname: "opennext.js.org", 17 + }, 18 + ], 19 + }, 20 + redirects: async () => { 21 + return [ 22 + { 23 + source: "/next-config-redirect-missing", 24 + destination: "/config-redirect?missing=true", 25 + permanent: true, 26 + missing: [{ type: "cookie", key: "missing-cookie" }], 27 + }, 28 + { 29 + source: "/next-config-redirect-not-missing", 30 + destination: "/config-redirect?missing=true", 31 + permanent: true, 32 + missing: [{ type: "cookie", key: "from" }], // middleware sets this cookie 33 + }, 34 + { 35 + source: "/next-config-redirect-has", 36 + destination: "/config-redirect?has=true", 37 + permanent: true, 38 + has: [{ type: "cookie", key: "from" }], 39 + }, 40 + { 41 + source: "/next-config-redirect-has-with-value", 42 + destination: "/config-redirect?hasWithValue=true", 43 + permanent: true, 44 + has: [{ type: "cookie", key: "from", value: "middleware" }], 45 + }, 46 + { 47 + source: "/next-config-redirect-has-with-bad-value", 48 + destination: "/config-redirect?hasWithBadValue=true", 49 + permanent: true, 50 + has: [{ type: "cookie", key: "from", value: "wrongvalue" }], 51 + }, 52 + { 53 + source: "/next-config-redirect-without-locale-support", 54 + destination: "https://opennext.js.org/", 55 + permanent: false, 56 + basePath: false, 57 + locale: false, 58 + }, 59 + ]; 60 + }, 61 + async headers() { 62 + return [ 63 + { 64 + source: "/(.*)", 65 + headers: [ 66 + { 67 + key: "e2e-headers", 68 + value: "next.config.js", 69 + }, 70 + ], 71 + }, 72 + ]; 73 + }, 74 + }; 75 + 76 + export default nextConfig;
+25
examples/e2e/app-router/open-next.config.ts
··· 1 + import type { OpenNextConfig } from "@opennextjs/aws/types/open-next"; 2 + 3 + const config: OpenNextConfig = { 4 + default: { 5 + override: { 6 + wrapper: "cloudflare-node", 7 + converter: "edge", 8 + // Unused implementation 9 + incrementalCache: "dummy", 10 + tagCache: "dummy", 11 + queue: "dummy", 12 + }, 13 + }, 14 + 15 + middleware: { 16 + external: true, 17 + override: { 18 + wrapper: "cloudflare-edge", 19 + converter: "edge", 20 + proxyExternalRequest: "fetch", 21 + }, 22 + }, 23 + }; 24 + 25 + export default config;
+32
examples/e2e/app-router/package.json
··· 1 + { 2 + "name": "app-router", 3 + "version": "0.1.4", 4 + "private": true, 5 + "scripts": { 6 + "openbuild": "node ../../packages/open-next/dist/index.js build --streaming --build-command \"npx turbo build\"", 7 + "dev": "next dev --turbopack --port 3001", 8 + "build": "next build", 9 + "start": "next start --port 3001", 10 + "lint": "next lint", 11 + "clean": "rm -rf .turbo node_modules .next .open-next", 12 + "build:worker-tofix": "pnpm opennextjs-cloudflare", 13 + "dev:worker": "wrangler dev --port 8770 --inspector-port 9330", 14 + "preview": "pnpm build:worker && pnpm dev:worker" 15 + }, 16 + "dependencies": { 17 + "@opennextjs/cloudflare": "workspace:*", 18 + "@example/shared": "workspace:*", 19 + "next": "catalog:e2e", 20 + "react": "catalog:e2e", 21 + "react-dom": "catalog:e2e" 22 + }, 23 + "devDependencies": { 24 + "@types/node": "catalog:e2e", 25 + "@types/react": "catalog:e2e", 26 + "@types/react-dom": "catalog:e2e", 27 + "autoprefixer": "catalog:e2e", 28 + "postcss": "catalog:e2e", 29 + "tailwindcss": "catalog:e2e", 30 + "typescript": "catalog:default" 31 + } 32 + }
+6
examples/e2e/app-router/postcss.config.js
··· 1 + module.exports = { 2 + plugins: { 3 + tailwindcss: {}, 4 + autoprefixer: {}, 5 + }, 6 + };
examples/e2e/app-router/public/favicon.ico

This is a binary file and will not be displayed.

examples/e2e/app-router/public/static/corporate_holiday_card.jpg

This is a binary file and will not be displayed.

examples/e2e/app-router/public/static/frank.webp

This is a binary file and will not be displayed.

+1
examples/e2e/app-router/sst-env.d.ts
··· 1 + /// <reference path="../example_sst/.sst/types/index.ts" />
+15
examples/e2e/app-router/tailwind.config.ts
··· 1 + import type { Config } from "tailwindcss"; 2 + 3 + const config: Config = { 4 + content: ["./app/**/*.{js,ts,jsx,tsx,mdx}", "../../examples/shared/**/*.{jsx,tsx}"], 5 + theme: { 6 + extend: { 7 + backgroundImage: { 8 + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 9 + "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 10 + }, 11 + }, 12 + }, 13 + plugins: [], 14 + }; 15 + export default config;
+29
examples/e2e/app-router/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "es5", 4 + "lib": ["dom", "dom.iterable", "esnext"], 5 + "allowJs": true, 6 + "skipLibCheck": true, 7 + "strict": true, 8 + "forceConsistentCasingInFileNames": true, 9 + "noEmit": true, 10 + "esModuleInterop": true, 11 + "module": "NodeNext", 12 + "moduleResolution": "NodeNext", 13 + "resolveJsonModule": true, 14 + "isolatedModules": true, 15 + "jsx": "preserve", 16 + "incremental": true, 17 + "plugins": [ 18 + { 19 + "name": "next" 20 + } 21 + ], 22 + "paths": { 23 + "@/*": ["./*"], 24 + "@example/shared": ["../shared"] 25 + } 26 + }, 27 + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 28 + "exclude": ["node_modules", "open-next.config.ts"] 29 + }
+11
examples/e2e/app-router/wrangler.json
··· 1 + { 2 + "$schema": "node_modules/wrangler/config-schema.json", 3 + "main": ".open-next/worker.js", 4 + "name": "app-router", 5 + "compatibility_date": "2024-12-30", 6 + "compatibility_flags": ["nodejs_compat"], 7 + "assets": { 8 + "directory": ".open-next/assets", 9 + "binding": "ASSETS" 10 + } 11 + }
+37
examples/e2e/shared/api/index.ts
··· 1 + "use server"; 2 + import data from "./songs.json"; 3 + 4 + export type Song = (typeof data.songs)[0]; 5 + export type Album = { album: string; artist: string; songs: Song[] }; 6 + const albumsMap: { [key: string]: Song[] } = {}; 7 + 8 + const albums: Album[] = []; 9 + data.songs.forEach((s) => { 10 + if (!albumsMap[s.album]) { 11 + albumsMap[s.album] = [s]; 12 + } else { 13 + albumsMap[s.album].push(s); 14 + } 15 + }); 16 + 17 + Object.entries(albumsMap).forEach(([key, album]) => { 18 + albums.push({ 19 + album: album[0].album, 20 + artist: album[0].artist, 21 + songs: album, 22 + }); 23 + }); 24 + 25 + export async function getAlbums() { 26 + return albums; 27 + } 28 + 29 + export async function getSongs() { 30 + return data.songs; 31 + } 32 + 33 + export async function getSong(album: string, title: string) { 34 + return data.songs.find( 35 + (song) => song.album === decodeURIComponent(album) && song.title === decodeURIComponent(title) 36 + ); 37 + }
+36
examples/e2e/shared/api/songs.json
··· 1 + { 2 + "songs": [ 3 + { 4 + "rank": 1, 5 + "title": "I'm never gonna give you up", 6 + "artist": "Rick Astley", 7 + "album": "Hold Me In Your Arms", 8 + "year": "1965", 9 + "videoId": "dQw4w9WgXcQ" 10 + }, 11 + { 12 + "rank": 2, 13 + "title": "My Wang", 14 + "artist": "Frank Wangnatra", 15 + "album": "@franjiewang", 16 + "year": "2023", 17 + "videoId": "qQzdAsjWGPg" 18 + }, 19 + { 20 + "rank": 3, 21 + "title": "Excuse me miSST", 22 + "artist": "Jay-Air", 23 + "album": "@Jayair", 24 + "year": "2023", 25 + "videoId": "tnDh0JhmaFw" 26 + }, 27 + { 28 + "rank": 4, 29 + "title": "I don't want another CONSOLE-RRY", 30 + "artist": "Dax", 31 + "album": "@thxdr", 32 + "year": "2023", 33 + "videoId": "4JI70_9acgE" 34 + } 35 + ] 36 + }
+17
examples/e2e/shared/components/Album/Album.tsx
··· 1 + import type { Album } from "../../api/index"; 2 + import Song from "./Song"; 3 + 4 + type Props = { 5 + album: Album; 6 + }; 7 + export default function Album({ album }: Props) { 8 + return ( 9 + <div className="border p-2 my-4 mx-2"> 10 + <div>Album: {album.album}</div> 11 + <div>Artist: {album.artist}</div> 12 + {album.songs.map((song) => ( 13 + <Song song={song} /> 14 + ))} 15 + </div> 16 + ); 17 + }
+23
examples/e2e/shared/components/Album/Song.tsx
··· 1 + import type { Song } from "../../api/index"; 2 + 3 + type Props = { 4 + song: Song; 5 + play?: boolean; 6 + }; 7 + export default function Song({ song, play }: Props) { 8 + return ( 9 + <div className="border p-1 hover:bg-green-600"> 10 + <div>Song: {song.title}</div> 11 + <div>Year: {song.year}</div> 12 + {play && ( 13 + <iframe 14 + width="560" 15 + height="315" 16 + title={song.title} 17 + allowFullScreen 18 + src={`https://youtube.com/embed/${song?.videoId}?autoplay=1`} 19 + ></iframe> 20 + )} 21 + </div> 22 + ); 23 + }
+21
examples/e2e/shared/components/Album/index.tsx
··· 1 + import Link from "next/link"; 2 + 3 + import type { Album } from "../../api/index"; 4 + import Song from "./Song"; 5 + 6 + type Props = { 7 + album: Album; 8 + }; 9 + export default function Album({ album }: Props) { 10 + return ( 11 + <div className="border p-2 my-4 mx-2"> 12 + <div>Album: {album.album}</div> 13 + <div>Artist: {album.artist}</div> 14 + {album.songs.map((song) => ( 15 + <Link href={`/albums/${encodeURIComponent(album.album)}/${song.title}`}> 16 + <Song song={song} /> 17 + </Link> 18 + ))} 19 + </div> 20 + ); 21 + }
+13
examples/e2e/shared/components/Filler/index.tsx
··· 1 + interface FillerProps { 2 + // Size in kb of the filler 3 + size: number; 4 + } 5 + 6 + //This component is there to demonstrate how you could bypass streaming buffering in aws lambda. 7 + //Hopefully, this will be fixed in the future and this component will be removed. 8 + // https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/issues/94 9 + export default function Filler({ size }: FillerProps) { 10 + const str = "a".repeat(size * 1024); 11 + const byteSize = new TextEncoder().encode(str).length; 12 + return <script type="application/json">{JSON.stringify({ filler: str, byteSize })}</script>; 13 + }
+51
examples/e2e/shared/components/Modal/index.tsx
··· 1 + "use client"; 2 + import { useCallback, useEffect, useRef } from "react"; 3 + 4 + import { useRouter } from "next/navigation"; 5 + import type { MouseEventHandler } from "react"; 6 + 7 + export default function Modal({ children }: { children: React.ReactNode }) { 8 + const overlay = useRef(null); 9 + const wrapper = useRef(null); 10 + const router = useRouter(); 11 + 12 + const onDismiss = useCallback(() => { 13 + router.back(); 14 + }, [router]); 15 + 16 + const onClick: MouseEventHandler = useCallback( 17 + (e) => { 18 + if (onDismiss && (e.target === overlay.current || e.target === wrapper.current)) { 19 + onDismiss(); 20 + } 21 + }, 22 + [onDismiss, overlay, wrapper] 23 + ); 24 + 25 + const onKeyDown = useCallback( 26 + (e: KeyboardEvent) => { 27 + if (e.key === "Escape") onDismiss(); 28 + }, 29 + [onDismiss] 30 + ); 31 + 32 + useEffect(() => { 33 + document.addEventListener("keydown", onKeyDown); 34 + return () => document.removeEventListener("keydown", onKeyDown); 35 + }, [onKeyDown]); 36 + 37 + return ( 38 + <div 39 + ref={overlay} 40 + className="fixed z-10 left-0 right-0 top-0 bottom-0 mx-auto bg-black/80" 41 + onClick={onClick} 42 + > 43 + <div 44 + ref={wrapper} 45 + className="absolute top-32 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full sm:w-10/12 md:w-8/12 lg:w-1/2 p-6" 46 + > 47 + {children} 48 + </div> 49 + </div> 50 + ); 51 + }
+27
examples/e2e/shared/components/Nav/index.tsx
··· 1 + "use client"; 2 + import Link from "next/link"; 3 + import type { PropsWithChildren } from "react"; 4 + 5 + type Props = PropsWithChildren & { 6 + href: string; 7 + title: string; 8 + icon?: string; 9 + }; 10 + export default function Nav(p: Props) { 11 + const { children, href, title, icon = "/static/frank.webp" } = p; 12 + return ( 13 + <Link href={href} className="flex flex-col group border p-2 rounded-sm border-orange-500"> 14 + <div className="flex items-center relative"> 15 + <div>{title}</div> 16 + <div> 17 + <img 18 + width={32} 19 + className="absolute -top-2 group-hover:rotate-12 group-hover:ml-10 group-hover:scale-125 transition-all" 20 + src={icon} 21 + /> 22 + </div> 23 + </div> 24 + <div>{children}</div> 25 + </Link> 26 + ); 27 + }
+19
examples/e2e/shared/package.json
··· 1 + { 2 + "name": "@example/shared", 3 + "version": "0.0.0", 4 + "private": true, 5 + "scripts": { 6 + "clean": "rm -rf .turbo && rm -rf node_modules" 7 + }, 8 + "dependencies": { 9 + "react": "catalog:e2e", 10 + "react-dom": "catalog:e2e" 11 + }, 12 + "devDependencies": { 13 + "@types/react": "catalog:e2e", 14 + "@types/react-dom": "catalog:e2e" 15 + }, 16 + "peerDependencies": { 17 + "next": "catalog:e2e" 18 + } 19 + }
+1
examples/e2e/shared/sst-env.d.ts
··· 1 + /// <reference path="../example_sst/.sst/types/index.ts" />
+32
examples/e2e/shared/tsconfig.json
··· 1 + { 2 + "include": ["."], 3 + "exclude": ["dist", "build", "node_modules"], 4 + "compilerOptions": { 5 + "composite": false, 6 + "declaration": false, 7 + "declarationMap": false, 8 + "esModuleInterop": true, 9 + "forceConsistentCasingInFileNames": true, 10 + "inlineSources": false, 11 + "isolatedModules": true, 12 + "emitDecoratorMetadata": true, 13 + "experimentalDecorators": true, 14 + "moduleResolution": "NodeNext", 15 + "noUnusedLocals": true, 16 + "noUnusedParameters": true, 17 + "preserveWatchOutput": true, 18 + "skipLibCheck": true, 19 + "strict": true, 20 + "removeComments": true, 21 + "resolveJsonModule": true, 22 + "sourceMap": true, 23 + "baseUrl": ".", 24 + "jsx": "react-jsx", 25 + "lib": ["ES2022", "DOM"], 26 + "module": "NodeNext", 27 + "target": "ESNext", 28 + "paths": { 29 + "~/*": ["./*"] 30 + } 31 + } 32 + }
+429 -95
pnpm-lock.yaml
··· 76 76 specifier: ^4.19.2 77 77 version: 4.19.2 78 78 typescript: 79 - specifier: ^5.5.4 80 - version: 5.5.4 79 + specifier: ^5.7.3 80 + version: 5.7.3 81 81 typescript-eslint: 82 82 specifier: ^8.7.0 83 83 version: 8.7.0 ··· 87 87 wrangler: 88 88 specifier: ^3.101.0 89 89 version: 3.101.0 90 + e2e: 91 + '@types/node': 92 + specifier: 20.17.6 93 + version: 20.17.6 94 + '@types/react': 95 + specifier: 19.0.0 96 + version: 19.0.0 97 + '@types/react-dom': 98 + specifier: 19.0.0 99 + version: 19.0.0 100 + autoprefixer: 101 + specifier: 10.4.15 102 + version: 10.4.15 103 + next: 104 + specifier: 15.1.0 105 + version: 15.1.0 106 + postcss: 107 + specifier: 8.4.27 108 + version: 8.4.27 109 + react: 110 + specifier: 19.0.0 111 + version: 19.0.0 112 + react-dom: 113 + specifier: 19.0.0 114 + version: 19.0.0 115 + tailwindcss: 116 + specifier: 3.3.3 117 + version: 3.3.3 90 118 91 119 importers: 92 120 ··· 177 205 version: 8.57.1 178 206 eslint-config-next: 179 207 specifier: 14.2.14 180 - version: 14.2.14(eslint@8.57.1)(typescript@5.5.4) 208 + version: 14.2.14(eslint@8.57.1)(typescript@5.7.3) 181 209 postcss: 182 210 specifier: ^8 183 211 version: 8.4.31 ··· 186 214 version: 3.4.11 187 215 typescript: 188 216 specifier: 'catalog:' 189 - version: 5.5.4 217 + version: 5.7.3 190 218 wrangler: 191 219 specifier: 'catalog:' 192 220 version: 3.101.0(@cloudflare/workers-types@4.20250109.0) 193 221 222 + examples/e2e/app-router: 223 + dependencies: 224 + '@example/shared': 225 + specifier: workspace:* 226 + version: link:../shared 227 + '@opennextjs/cloudflare': 228 + specifier: workspace:* 229 + version: link:../../../packages/cloudflare 230 + next: 231 + specifier: catalog:e2e 232 + version: 15.1.0(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 233 + react: 234 + specifier: catalog:e2e 235 + version: 19.0.0 236 + react-dom: 237 + specifier: catalog:e2e 238 + version: 19.0.0(react@19.0.0) 239 + devDependencies: 240 + '@types/node': 241 + specifier: catalog:e2e 242 + version: 20.17.6 243 + '@types/react': 244 + specifier: catalog:e2e 245 + version: 19.0.0 246 + '@types/react-dom': 247 + specifier: catalog:e2e 248 + version: 19.0.0 249 + autoprefixer: 250 + specifier: catalog:e2e 251 + version: 10.4.15(postcss@8.4.27) 252 + postcss: 253 + specifier: catalog:e2e 254 + version: 8.4.27 255 + tailwindcss: 256 + specifier: catalog:e2e 257 + version: 3.3.3 258 + typescript: 259 + specifier: catalog:default 260 + version: 5.7.3 261 + 262 + examples/e2e/shared: 263 + dependencies: 264 + next: 265 + specifier: catalog:e2e 266 + version: 15.1.0(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 267 + react: 268 + specifier: catalog:e2e 269 + version: 19.0.0 270 + react-dom: 271 + specifier: catalog:e2e 272 + version: 19.0.0(react@19.0.0) 273 + devDependencies: 274 + '@types/react': 275 + specifier: catalog:e2e 276 + version: 19.0.0 277 + '@types/react-dom': 278 + specifier: catalog:e2e 279 + version: 19.0.0 280 + 194 281 examples/middleware: 195 282 dependencies: 196 283 '@clerk/nextjs': ··· 226 313 version: 9.11.1(jiti@1.21.6) 227 314 typescript: 228 315 specifier: 'catalog:' 229 - version: 5.5.4 316 + version: 5.7.3 230 317 wrangler: 231 318 specifier: 'catalog:' 232 319 version: 3.101.0(@cloudflare/workers-types@4.20250109.0) ··· 281 368 version: 3.4.11 282 369 typescript: 283 370 specifier: 'catalog:' 284 - version: 5.5.4 371 + version: 5.7.3 285 372 wrangler: 286 373 specifier: 'catalog:' 287 374 version: 3.101.0(@cloudflare/workers-types@4.20250109.0) ··· 348 435 version: 3.4.11 349 436 typescript: 350 437 specifier: 'catalog:' 351 - version: 5.5.4 438 + version: 5.7.3 352 439 wrangler: 353 440 specifier: 'catalog:' 354 441 version: 3.101.0(@cloudflare/workers-types@4.20250109.0) ··· 397 484 version: 9.11.1(jiti@1.21.6) 398 485 eslint-plugin-import: 399 486 specifier: 'catalog:' 400 - version: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6)) 487 + version: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)) 401 488 eslint-plugin-simple-import-sort: 402 489 specifier: 'catalog:' 403 490 version: 12.1.1(eslint@9.11.1(jiti@1.21.6)) ··· 412 499 version: 5.4.1 413 500 next: 414 501 specifier: 'catalog:' 415 - version: 14.2.11(@playwright/test@1.47.0)(react-dom@19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730))(react@19.0.0-rc-3208e73e-20240730) 502 + version: 14.2.11(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 416 503 rimraf: 417 504 specifier: 'catalog:' 418 505 version: 6.0.1 419 506 typescript: 420 507 specifier: 'catalog:' 421 - version: 5.5.4 508 + version: 5.7.3 422 509 typescript-eslint: 423 510 specifier: 'catalog:' 424 - version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 511 + version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 425 512 vitest: 426 513 specifier: 'catalog:' 427 514 version: 2.1.1(@types/node@22.2.0)(terser@5.16.9) ··· 1787 1874 '@next/env@15.0.0-canary.113': 1788 1875 resolution: {integrity: sha512-hiD7ux+YPCUJi3up0dHnROYBYg/AuPErOcBBzjCkKQ1q4ufuUNBQms4oDeOiHG9+Qga8mN5+k2L5qm7rNhzU4g==} 1789 1876 1877 + '@next/env@15.1.0': 1878 + resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} 1879 + 1790 1880 '@next/eslint-plugin-next@14.2.14': 1791 1881 resolution: {integrity: sha512-kV+OsZ56xhj0rnTn6HegyTGkoa16Mxjrpk7pjWumyB2P8JVQb8S9qtkjy/ye0GnTr4JWtWG4x/2qN40lKZ3iVQ==} 1792 1882 ··· 1802 1892 cpu: [arm64] 1803 1893 os: [darwin] 1804 1894 1895 + '@next/swc-darwin-arm64@15.1.0': 1896 + resolution: {integrity: sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==} 1897 + engines: {node: '>= 10'} 1898 + cpu: [arm64] 1899 + os: [darwin] 1900 + 1805 1901 '@next/swc-darwin-x64@14.2.11': 1806 1902 resolution: {integrity: sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==} 1807 1903 engines: {node: '>= 10'} ··· 1814 1910 cpu: [x64] 1815 1911 os: [darwin] 1816 1912 1913 + '@next/swc-darwin-x64@15.1.0': 1914 + resolution: {integrity: sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==} 1915 + engines: {node: '>= 10'} 1916 + cpu: [x64] 1917 + os: [darwin] 1918 + 1817 1919 '@next/swc-linux-arm64-gnu@14.2.11': 1818 1920 resolution: {integrity: sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==} 1819 1921 engines: {node: '>= 10'} ··· 1826 1928 cpu: [arm64] 1827 1929 os: [linux] 1828 1930 1931 + '@next/swc-linux-arm64-gnu@15.1.0': 1932 + resolution: {integrity: sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==} 1933 + engines: {node: '>= 10'} 1934 + cpu: [arm64] 1935 + os: [linux] 1936 + 1829 1937 '@next/swc-linux-arm64-musl@14.2.11': 1830 1938 resolution: {integrity: sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==} 1831 1939 engines: {node: '>= 10'} ··· 1838 1946 cpu: [arm64] 1839 1947 os: [linux] 1840 1948 1949 + '@next/swc-linux-arm64-musl@15.1.0': 1950 + resolution: {integrity: sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==} 1951 + engines: {node: '>= 10'} 1952 + cpu: [arm64] 1953 + os: [linux] 1954 + 1841 1955 '@next/swc-linux-x64-gnu@14.2.11': 1842 1956 resolution: {integrity: sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==} 1843 1957 engines: {node: '>= 10'} ··· 1850 1964 cpu: [x64] 1851 1965 os: [linux] 1852 1966 1967 + '@next/swc-linux-x64-gnu@15.1.0': 1968 + resolution: {integrity: sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==} 1969 + engines: {node: '>= 10'} 1970 + cpu: [x64] 1971 + os: [linux] 1972 + 1853 1973 '@next/swc-linux-x64-musl@14.2.11': 1854 1974 resolution: {integrity: sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==} 1855 1975 engines: {node: '>= 10'} ··· 1862 1982 cpu: [x64] 1863 1983 os: [linux] 1864 1984 1985 + '@next/swc-linux-x64-musl@15.1.0': 1986 + resolution: {integrity: sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==} 1987 + engines: {node: '>= 10'} 1988 + cpu: [x64] 1989 + os: [linux] 1990 + 1865 1991 '@next/swc-win32-arm64-msvc@14.2.11': 1866 1992 resolution: {integrity: sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==} 1867 1993 engines: {node: '>= 10'} ··· 1870 1996 1871 1997 '@next/swc-win32-arm64-msvc@15.0.0-canary.113': 1872 1998 resolution: {integrity: sha512-VUGwcPda1WYpDfPPALntC31oJe5NJKyPLlQ7IIG5kFQQQeM37IxSA150r0TyaEXAI3Ug0xFsUuXvtZcKXKBs+g==} 1999 + engines: {node: '>= 10'} 2000 + cpu: [arm64] 2001 + os: [win32] 2002 + 2003 + '@next/swc-win32-arm64-msvc@15.1.0': 2004 + resolution: {integrity: sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==} 1873 2005 engines: {node: '>= 10'} 1874 2006 cpu: [arm64] 1875 2007 os: [win32] ··· 1894 2026 1895 2027 '@next/swc-win32-x64-msvc@15.0.0-canary.113': 1896 2028 resolution: {integrity: sha512-AAw87x6Td3tuE5t0CgkGM+IrCz/K8p1ZKMaRlH2f6XcQq/c86rZvkVnjpeS5Q5IPBSLMXSSaALeoizR7ZtqLtQ==} 2029 + engines: {node: '>= 10'} 2030 + cpu: [x64] 2031 + os: [win32] 2032 + 2033 + '@next/swc-win32-x64-msvc@15.1.0': 2034 + resolution: {integrity: sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==} 1897 2035 engines: {node: '>= 10'} 1898 2036 cpu: [x64] 1899 2037 os: [win32] ··· 2665 2803 '@swc/helpers@0.5.12': 2666 2804 resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} 2667 2805 2806 + '@swc/helpers@0.5.15': 2807 + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} 2808 + 2668 2809 '@swc/helpers@0.5.5': 2669 2810 resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 2670 2811 ··· 2729 2870 '@types/node@12.20.55': 2730 2871 resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 2731 2872 2873 + '@types/node@20.17.6': 2874 + resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} 2875 + 2732 2876 '@types/node@22.2.0': 2733 2877 resolution: {integrity: sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==} 2734 2878 ··· 2741 2885 '@types/react-dom@18.3.0': 2742 2886 resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 2743 2887 2888 + '@types/react-dom@19.0.0': 2889 + resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} 2890 + 2744 2891 '@types/react@18.3.3': 2745 2892 resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} 2893 + 2894 + '@types/react@19.0.0': 2895 + resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} 2746 2896 2747 2897 '@types/resolve@1.20.6': 2748 2898 resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} ··· 2960 3110 2961 3111 ast-types-flow@0.0.8: 2962 3112 resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} 3113 + 3114 + autoprefixer@10.4.15: 3115 + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} 3116 + engines: {node: ^10 || ^12 || >=14} 3117 + hasBin: true 3118 + peerDependencies: 3119 + postcss: ^8.1.0 2963 3120 2964 3121 autoprefixer@10.4.20: 2965 3122 resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} ··· 4610 4767 sass: 4611 4768 optional: true 4612 4769 4770 + next@15.1.0: 4771 + resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} 4772 + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} 4773 + hasBin: true 4774 + peerDependencies: 4775 + '@opentelemetry/api': ^1.1.0 4776 + '@playwright/test': ^1.41.2 4777 + babel-plugin-react-compiler: '*' 4778 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 4779 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 4780 + sass: ^1.3.0 4781 + peerDependenciesMeta: 4782 + '@opentelemetry/api': 4783 + optional: true 4784 + '@playwright/test': 4785 + optional: true 4786 + babel-plugin-react-compiler: 4787 + optional: true 4788 + sass: 4789 + optional: true 4790 + 4613 4791 no-case@3.0.4: 4614 4792 resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 4615 4793 ··· 4906 5084 postcss-value-parser@4.2.0: 4907 5085 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 4908 5086 5087 + postcss@8.4.27: 5088 + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} 5089 + engines: {node: ^10 || ^12 || >=14} 5090 + 4909 5091 postcss@8.4.31: 4910 5092 resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 4911 5093 engines: {node: ^10 || ^12 || >=14} ··· 5039 5221 peerDependencies: 5040 5222 react: ^18.3.1 5041 5223 5224 + react-dom@19.0.0: 5225 + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} 5226 + peerDependencies: 5227 + react: ^19.0.0 5228 + 5042 5229 react-dom@19.0.0-rc-3208e73e-20240730: 5043 5230 resolution: {integrity: sha512-jspKji5vQTTlFY7zFGh0VB+rZV+5FweCQkYxtLoPZvc5ZH6vEf1n8d+4h9YqNqF8nnhFkcHO8XLtKTtTyVGSXA==} 5044 5231 peerDependencies: ··· 5049 5236 5050 5237 react@18.3.1: 5051 5238 resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 5239 + engines: {node: '>=0.10.0'} 5240 + 5241 + react@19.0.0: 5242 + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} 5052 5243 engines: {node: '>=0.10.0'} 5053 5244 5054 5245 react@19.0.0-rc-3208e73e-20240730: ··· 5185 5376 scheduler@0.23.2: 5186 5377 resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 5187 5378 5379 + scheduler@0.25.0: 5380 + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} 5381 + 5188 5382 scheduler@0.25.0-rc-3208e73e-20240730: 5189 5383 resolution: {integrity: sha512-eCGy6Bm6PX2JB7dLumQuEYwmXku9HweMfdXCQQ2ZaRG3kwxK76RWFr7CsW/LHju8fiDSiJajl0Iq62uoaH9VLQ==} 5190 5384 ··· 5480 5674 tabbable@6.2.0: 5481 5675 resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 5482 5676 5677 + tailwindcss@3.3.3: 5678 + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} 5679 + engines: {node: '>=14.0.0'} 5680 + hasBin: true 5681 + 5483 5682 tailwindcss@3.4.11: 5484 5683 resolution: {integrity: sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==} 5485 5684 engines: {node: '>=14.0.0'} ··· 5572 5771 tslib@2.6.3: 5573 5772 resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 5574 5773 5774 + tslib@2.8.1: 5775 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 5776 + 5575 5777 tsx@4.19.2: 5576 5778 resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} 5577 5779 engines: {node: '>=18.0.0'} ··· 5634 5836 typescript: 5635 5837 optional: true 5636 5838 5637 - typescript@5.5.4: 5638 - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 5839 + typescript@5.7.3: 5840 + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 5639 5841 engines: {node: '>=14.17'} 5640 5842 hasBin: true 5641 5843 ··· 5647 5849 5648 5850 undici-types@6.13.0: 5649 5851 resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} 5852 + 5853 + undici-types@6.19.8: 5854 + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 5650 5855 5651 5856 undici@5.28.4: 5652 5857 resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} ··· 8035 8240 8036 8241 '@next/env@15.0.0-canary.113': {} 8037 8242 8243 + '@next/env@15.1.0': {} 8244 + 8038 8245 '@next/eslint-plugin-next@14.2.14': 8039 8246 dependencies: 8040 8247 glob: 10.3.10 ··· 8045 8252 '@next/swc-darwin-arm64@15.0.0-canary.113': 8046 8253 optional: true 8047 8254 8255 + '@next/swc-darwin-arm64@15.1.0': 8256 + optional: true 8257 + 8048 8258 '@next/swc-darwin-x64@14.2.11': 8049 8259 optional: true 8050 8260 8051 8261 '@next/swc-darwin-x64@15.0.0-canary.113': 8052 8262 optional: true 8053 8263 8264 + '@next/swc-darwin-x64@15.1.0': 8265 + optional: true 8266 + 8054 8267 '@next/swc-linux-arm64-gnu@14.2.11': 8055 8268 optional: true 8056 8269 8057 8270 '@next/swc-linux-arm64-gnu@15.0.0-canary.113': 8058 8271 optional: true 8059 8272 8273 + '@next/swc-linux-arm64-gnu@15.1.0': 8274 + optional: true 8275 + 8060 8276 '@next/swc-linux-arm64-musl@14.2.11': 8061 8277 optional: true 8062 8278 8063 8279 '@next/swc-linux-arm64-musl@15.0.0-canary.113': 8064 8280 optional: true 8065 8281 8282 + '@next/swc-linux-arm64-musl@15.1.0': 8283 + optional: true 8284 + 8066 8285 '@next/swc-linux-x64-gnu@14.2.11': 8067 8286 optional: true 8068 8287 8069 8288 '@next/swc-linux-x64-gnu@15.0.0-canary.113': 8289 + optional: true 8290 + 8291 + '@next/swc-linux-x64-gnu@15.1.0': 8070 8292 optional: true 8071 8293 8072 8294 '@next/swc-linux-x64-musl@14.2.11': 8073 8295 optional: true 8074 8296 8075 8297 '@next/swc-linux-x64-musl@15.0.0-canary.113': 8298 + optional: true 8299 + 8300 + '@next/swc-linux-x64-musl@15.1.0': 8076 8301 optional: true 8077 8302 8078 8303 '@next/swc-win32-arm64-msvc@14.2.11': ··· 8081 8306 '@next/swc-win32-arm64-msvc@15.0.0-canary.113': 8082 8307 optional: true 8083 8308 8309 + '@next/swc-win32-arm64-msvc@15.1.0': 8310 + optional: true 8311 + 8084 8312 '@next/swc-win32-ia32-msvc@14.2.11': 8085 8313 optional: true 8086 8314 ··· 8091 8319 optional: true 8092 8320 8093 8321 '@next/swc-win32-x64-msvc@15.0.0-canary.113': 8322 + optional: true 8323 + 8324 + '@next/swc-win32-x64-msvc@15.1.0': 8094 8325 optional: true 8095 8326 8096 8327 '@noble/ciphers@1.1.3': {} ··· 9187 9418 dependencies: 9188 9419 tslib: 2.6.3 9189 9420 9421 + '@swc/helpers@0.5.15': 9422 + dependencies: 9423 + tslib: 2.8.1 9424 + 9190 9425 '@swc/helpers@0.5.5': 9191 9426 dependencies: 9192 9427 '@swc/counter': 0.1.3 ··· 9255 9490 9256 9491 '@types/node@12.20.55': {} 9257 9492 9493 + '@types/node@20.17.6': 9494 + dependencies: 9495 + undici-types: 6.19.8 9496 + 9258 9497 '@types/node@22.2.0': 9259 9498 dependencies: 9260 9499 undici-types: 6.13.0 ··· 9267 9506 dependencies: 9268 9507 '@types/react': 18.3.3 9269 9508 9509 + '@types/react-dom@19.0.0': 9510 + dependencies: 9511 + '@types/react': 19.0.0 9512 + 9270 9513 '@types/react@18.3.3': 9271 9514 dependencies: 9272 9515 '@types/prop-types': 15.7.12 9516 + csstype: 3.1.3 9517 + 9518 + '@types/react@19.0.0': 9519 + dependencies: 9273 9520 csstype: 3.1.3 9274 9521 9275 9522 '@types/resolve@1.20.6': {} ··· 9278 9525 9279 9526 '@types/uuid@9.0.8': {} 9280 9527 9281 - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': 9528 + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': 9282 9529 dependencies: 9283 9530 '@eslint-community/regexpp': 4.11.0 9284 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 9531 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 9285 9532 '@typescript-eslint/scope-manager': 8.7.0 9286 - '@typescript-eslint/type-utils': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 9287 - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 9533 + '@typescript-eslint/type-utils': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 9534 + '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 9288 9535 '@typescript-eslint/visitor-keys': 8.7.0 9289 9536 eslint: 8.57.1 9290 9537 graphemer: 1.4.0 9291 9538 ignore: 5.3.2 9292 9539 natural-compare: 1.4.0 9293 - ts-api-utils: 1.3.0(typescript@5.5.4) 9540 + ts-api-utils: 1.3.0(typescript@5.7.3) 9294 9541 optionalDependencies: 9295 - typescript: 5.5.4 9542 + typescript: 5.7.3 9296 9543 transitivePeerDependencies: 9297 9544 - supports-color 9298 9545 9299 - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': 9546 + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)': 9300 9547 dependencies: 9301 9548 '@eslint-community/regexpp': 4.11.0 9302 - '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 9549 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 9303 9550 '@typescript-eslint/scope-manager': 8.7.0 9304 - '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 9305 - '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 9551 + '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 9552 + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 9306 9553 '@typescript-eslint/visitor-keys': 8.7.0 9307 9554 eslint: 9.11.1(jiti@1.21.6) 9308 9555 graphemer: 1.4.0 9309 9556 ignore: 5.3.2 9310 9557 natural-compare: 1.4.0 9311 - ts-api-utils: 1.3.0(typescript@5.5.4) 9558 + ts-api-utils: 1.3.0(typescript@5.7.3) 9312 9559 optionalDependencies: 9313 - typescript: 5.5.4 9560 + typescript: 5.7.3 9314 9561 transitivePeerDependencies: 9315 9562 - supports-color 9316 9563 9317 - '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4)': 9564 + '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3)': 9318 9565 dependencies: 9319 9566 '@typescript-eslint/scope-manager': 8.7.0 9320 9567 '@typescript-eslint/types': 8.7.0 9321 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9568 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9322 9569 '@typescript-eslint/visitor-keys': 8.7.0 9323 9570 debug: 4.3.6 9324 9571 eslint: 8.57.1 9325 9572 optionalDependencies: 9326 - typescript: 5.5.4 9573 + typescript: 5.7.3 9327 9574 transitivePeerDependencies: 9328 9575 - supports-color 9329 9576 9330 - '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': 9577 + '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)': 9331 9578 dependencies: 9332 9579 '@typescript-eslint/scope-manager': 8.7.0 9333 9580 '@typescript-eslint/types': 8.7.0 9334 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9581 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9335 9582 '@typescript-eslint/visitor-keys': 8.7.0 9336 9583 debug: 4.3.6 9337 9584 eslint: 9.11.1(jiti@1.21.6) 9338 9585 optionalDependencies: 9339 - typescript: 5.5.4 9586 + typescript: 5.7.3 9340 9587 transitivePeerDependencies: 9341 9588 - supports-color 9342 9589 ··· 9345 9592 '@typescript-eslint/types': 8.7.0 9346 9593 '@typescript-eslint/visitor-keys': 8.7.0 9347 9594 9348 - '@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)': 9595 + '@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.7.3)': 9349 9596 dependencies: 9350 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9351 - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 9597 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9598 + '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 9352 9599 debug: 4.3.6 9353 - ts-api-utils: 1.3.0(typescript@5.5.4) 9600 + ts-api-utils: 1.3.0(typescript@5.7.3) 9354 9601 optionalDependencies: 9355 - typescript: 5.5.4 9602 + typescript: 5.7.3 9356 9603 transitivePeerDependencies: 9357 9604 - eslint 9358 9605 - supports-color 9359 9606 9360 - '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': 9607 + '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)': 9361 9608 dependencies: 9362 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9363 - '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 9609 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9610 + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 9364 9611 debug: 4.3.6 9365 - ts-api-utils: 1.3.0(typescript@5.5.4) 9612 + ts-api-utils: 1.3.0(typescript@5.7.3) 9366 9613 optionalDependencies: 9367 - typescript: 5.5.4 9614 + typescript: 5.7.3 9368 9615 transitivePeerDependencies: 9369 9616 - eslint 9370 9617 - supports-color 9371 9618 9372 9619 '@typescript-eslint/types@8.7.0': {} 9373 9620 9374 - '@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.4)': 9621 + '@typescript-eslint/typescript-estree@8.7.0(typescript@5.7.3)': 9375 9622 dependencies: 9376 9623 '@typescript-eslint/types': 8.7.0 9377 9624 '@typescript-eslint/visitor-keys': 8.7.0 ··· 9380 9627 is-glob: 4.0.3 9381 9628 minimatch: 9.0.5 9382 9629 semver: 7.6.3 9383 - ts-api-utils: 1.3.0(typescript@5.5.4) 9630 + ts-api-utils: 1.3.0(typescript@5.7.3) 9384 9631 optionalDependencies: 9385 - typescript: 5.5.4 9632 + typescript: 5.7.3 9386 9633 transitivePeerDependencies: 9387 9634 - supports-color 9388 9635 9389 - '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)': 9636 + '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.7.3)': 9390 9637 dependencies: 9391 9638 '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) 9392 9639 '@typescript-eslint/scope-manager': 8.7.0 9393 9640 '@typescript-eslint/types': 8.7.0 9394 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9641 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9395 9642 eslint: 8.57.1 9396 9643 transitivePeerDependencies: 9397 9644 - supports-color 9398 9645 - typescript 9399 9646 9400 - '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': 9647 + '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)': 9401 9648 dependencies: 9402 9649 '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6)) 9403 9650 '@typescript-eslint/scope-manager': 8.7.0 9404 9651 '@typescript-eslint/types': 8.7.0 9405 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) 9652 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.7.3) 9406 9653 eslint: 9.11.1(jiti@1.21.6) 9407 9654 transitivePeerDependencies: 9408 9655 - supports-color ··· 9594 9841 assertion-error@2.0.1: {} 9595 9842 9596 9843 ast-types-flow@0.0.8: {} 9844 + 9845 + autoprefixer@10.4.15(postcss@8.4.27): 9846 + dependencies: 9847 + browserslist: 4.24.0 9848 + caniuse-lite: 1.0.30001664 9849 + fraction.js: 4.3.7 9850 + normalize-range: 0.1.2 9851 + picocolors: 1.1.0 9852 + postcss: 8.4.27 9853 + postcss-value-parser: 4.2.0 9597 9854 9598 9855 autoprefixer@10.4.20(postcss@8.4.47): 9599 9856 dependencies: ··· 10229 10486 10230 10487 escape-string-regexp@4.0.0: {} 10231 10488 10232 - eslint-config-next@14.2.14(eslint@8.57.1)(typescript@5.5.4): 10489 + eslint-config-next@14.2.14(eslint@8.57.1)(typescript@5.7.3): 10233 10490 dependencies: 10234 10491 '@next/eslint-plugin-next': 14.2.14 10235 10492 '@rushstack/eslint-patch': 1.10.4 10236 - '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) 10237 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 10493 + '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) 10494 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 10238 10495 eslint: 8.57.1 10239 10496 eslint-import-resolver-node: 0.3.9 10240 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) 10241 - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10497 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) 10498 + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10242 10499 eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) 10243 10500 eslint-plugin-react: 7.36.1(eslint@8.57.1) 10244 10501 eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) 10245 10502 optionalDependencies: 10246 - typescript: 5.5.4 10503 + typescript: 5.7.3 10247 10504 transitivePeerDependencies: 10248 10505 - eslint-import-resolver-webpack 10249 10506 - eslint-plugin-import-x ··· 10257 10514 transitivePeerDependencies: 10258 10515 - supports-color 10259 10516 10260 - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): 10517 + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): 10261 10518 dependencies: 10262 10519 '@nolyfill/is-core-module': 1.0.39 10263 10520 debug: 4.3.6 10264 10521 enhanced-resolve: 5.17.1 10265 10522 eslint: 8.57.1 10266 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10523 + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10267 10524 fast-glob: 3.3.2 10268 10525 get-tsconfig: 4.8.0 10269 10526 is-bun-module: 1.2.1 10270 10527 is-glob: 4.0.3 10271 10528 optionalDependencies: 10272 - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10529 + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10273 10530 transitivePeerDependencies: 10274 10531 - '@typescript-eslint/parser' 10275 10532 - eslint-import-resolver-node 10276 10533 - eslint-import-resolver-webpack 10277 10534 - supports-color 10278 10535 10279 - eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): 10536 + eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): 10280 10537 dependencies: 10281 10538 debug: 3.2.7 10282 10539 optionalDependencies: 10283 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 10540 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 10284 10541 eslint: 8.57.1 10285 10542 eslint-import-resolver-node: 0.3.9 10286 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) 10543 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) 10287 10544 transitivePeerDependencies: 10288 10545 - supports-color 10289 10546 10290 - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@1.21.6)): 10547 + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@1.21.6)): 10291 10548 dependencies: 10292 10549 debug: 3.2.7 10293 10550 optionalDependencies: 10294 - '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 10551 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 10295 10552 eslint: 9.11.1(jiti@1.21.6) 10296 10553 eslint-import-resolver-node: 0.3.9 10297 10554 transitivePeerDependencies: 10298 10555 - supports-color 10299 10556 10300 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): 10557 + eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): 10301 10558 dependencies: 10302 10559 '@rtsao/scc': 1.1.0 10303 10560 array-includes: 3.1.8 ··· 10308 10565 doctrine: 2.1.0 10309 10566 eslint: 8.57.1 10310 10567 eslint-import-resolver-node: 0.3.9 10311 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10568 + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) 10312 10569 hasown: 2.0.2 10313 10570 is-core-module: 2.15.1 10314 10571 is-glob: 4.0.3 ··· 10319 10576 semver: 6.3.1 10320 10577 tsconfig-paths: 3.15.0 10321 10578 optionalDependencies: 10322 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.5.4) 10579 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 10323 10580 transitivePeerDependencies: 10324 10581 - eslint-import-resolver-typescript 10325 10582 - eslint-import-resolver-webpack 10326 10583 - supports-color 10327 10584 10328 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6)): 10585 + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)): 10329 10586 dependencies: 10330 10587 '@rtsao/scc': 1.1.0 10331 10588 array-includes: 3.1.8 ··· 10336 10593 doctrine: 2.1.0 10337 10594 eslint: 9.11.1(jiti@1.21.6) 10338 10595 eslint-import-resolver-node: 0.3.9 10339 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@1.21.6)) 10596 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@1.21.6)) 10340 10597 hasown: 2.0.2 10341 10598 is-core-module: 2.15.1 10342 10599 is-glob: 4.0.3 ··· 10348 10605 string.prototype.trimend: 1.0.8 10349 10606 tsconfig-paths: 3.15.0 10350 10607 optionalDependencies: 10351 - '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 10608 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 10352 10609 transitivePeerDependencies: 10353 10610 - eslint-import-resolver-typescript 10354 10611 - eslint-import-resolver-webpack ··· 11600 11857 - '@babel/core' 11601 11858 - babel-plugin-macros 11602 11859 11603 - next@14.2.11(@playwright/test@1.47.0)(react-dom@19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730))(react@19.0.0-rc-3208e73e-20240730): 11860 + next@14.2.11(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): 11604 11861 dependencies: 11605 11862 '@next/env': 14.2.11 11606 11863 '@swc/helpers': 0.5.5 ··· 11608 11865 caniuse-lite: 1.0.30001664 11609 11866 graceful-fs: 4.2.11 11610 11867 postcss: 8.4.31 11611 - react: 19.0.0-rc-3208e73e-20240730 11612 - react-dom: 19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730) 11613 - styled-jsx: 5.1.1(react@19.0.0-rc-3208e73e-20240730) 11868 + react: 19.0.0 11869 + react-dom: 19.0.0(react@19.0.0) 11870 + styled-jsx: 5.1.1(react@19.0.0) 11614 11871 optionalDependencies: 11615 11872 '@next/swc-darwin-arm64': 14.2.11 11616 11873 '@next/swc-darwin-x64': 14.2.11 ··· 11654 11911 - '@babel/core' 11655 11912 - babel-plugin-macros 11656 11913 11914 + next@15.1.0(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): 11915 + dependencies: 11916 + '@next/env': 15.1.0 11917 + '@swc/counter': 0.1.3 11918 + '@swc/helpers': 0.5.15 11919 + busboy: 1.6.0 11920 + caniuse-lite: 1.0.30001664 11921 + postcss: 8.4.31 11922 + react: 19.0.0 11923 + react-dom: 19.0.0(react@19.0.0) 11924 + styled-jsx: 5.1.6(react@19.0.0) 11925 + optionalDependencies: 11926 + '@next/swc-darwin-arm64': 15.1.0 11927 + '@next/swc-darwin-x64': 15.1.0 11928 + '@next/swc-linux-arm64-gnu': 15.1.0 11929 + '@next/swc-linux-arm64-musl': 15.1.0 11930 + '@next/swc-linux-x64-gnu': 15.1.0 11931 + '@next/swc-linux-x64-musl': 15.1.0 11932 + '@next/swc-win32-arm64-msvc': 15.1.0 11933 + '@next/swc-win32-x64-msvc': 15.1.0 11934 + '@playwright/test': 1.47.0 11935 + sharp: 0.33.5 11936 + transitivePeerDependencies: 11937 + - '@babel/core' 11938 + - babel-plugin-macros 11939 + 11657 11940 no-case@3.0.4: 11658 11941 dependencies: 11659 11942 lower-case: 2.0.2 ··· 11894 12177 11895 12178 possible-typed-array-names@1.0.0: {} 11896 12179 11897 - postcss-import@15.1.0(postcss@8.4.31): 12180 + postcss-import@15.1.0(postcss@8.4.47): 11898 12181 dependencies: 11899 - postcss: 8.4.31 12182 + postcss: 8.4.47 11900 12183 postcss-value-parser: 4.2.0 11901 12184 read-cache: 1.0.0 11902 12185 resolve: 1.22.8 11903 12186 11904 - postcss-js@4.0.1(postcss@8.4.31): 12187 + postcss-js@4.0.1(postcss@8.4.47): 11905 12188 dependencies: 11906 12189 camelcase-css: 2.0.1 11907 - postcss: 8.4.31 12190 + postcss: 8.4.47 11908 12191 11909 - postcss-load-config@4.0.2(postcss@8.4.31): 12192 + postcss-load-config@4.0.2(postcss@8.4.47): 11910 12193 dependencies: 11911 12194 lilconfig: 3.1.2 11912 12195 yaml: 2.5.1 11913 12196 optionalDependencies: 11914 - postcss: 8.4.31 12197 + postcss: 8.4.47 11915 12198 11916 - postcss-nested@6.2.0(postcss@8.4.31): 12199 + postcss-nested@6.2.0(postcss@8.4.47): 11917 12200 dependencies: 11918 - postcss: 8.4.31 12201 + postcss: 8.4.47 11919 12202 postcss-selector-parser: 6.1.2 11920 12203 11921 12204 postcss-selector-parser@6.0.10: ··· 11930 12213 11931 12214 postcss-value-parser@4.2.0: {} 11932 12215 12216 + postcss@8.4.27: 12217 + dependencies: 12218 + nanoid: 3.3.7 12219 + picocolors: 1.1.0 12220 + source-map-js: 1.2.1 12221 + 11933 12222 postcss@8.4.31: 11934 12223 dependencies: 11935 12224 nanoid: 3.3.7 ··· 12011 12300 react: 18.3.1 12012 12301 scheduler: 0.23.2 12013 12302 12303 + react-dom@19.0.0(react@19.0.0): 12304 + dependencies: 12305 + react: 19.0.0 12306 + scheduler: 0.25.0 12307 + 12014 12308 react-dom@19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730): 12015 12309 dependencies: 12016 12310 react: 19.0.0-rc-3208e73e-20240730 ··· 12021 12315 react@18.3.1: 12022 12316 dependencies: 12023 12317 loose-envify: 1.4.0 12318 + 12319 + react@19.0.0: {} 12024 12320 12025 12321 react@19.0.0-rc-3208e73e-20240730: {} 12026 12322 ··· 12215 12511 scheduler@0.23.2: 12216 12512 dependencies: 12217 12513 loose-envify: 1.4.0 12514 + 12515 + scheduler@0.25.0: {} 12218 12516 12219 12517 scheduler@0.25.0-rc-3208e73e-20240730: {} 12220 12518 ··· 12510 12808 client-only: 0.0.1 12511 12809 react: 18.3.1 12512 12810 12513 - styled-jsx@5.1.1(react@19.0.0-rc-3208e73e-20240730): 12811 + styled-jsx@5.1.1(react@19.0.0): 12514 12812 dependencies: 12515 12813 client-only: 0.0.1 12516 - react: 19.0.0-rc-3208e73e-20240730 12814 + react: 19.0.0 12815 + 12816 + styled-jsx@5.1.6(react@19.0.0): 12817 + dependencies: 12818 + client-only: 0.0.1 12819 + react: 19.0.0 12517 12820 12518 12821 styled-jsx@5.1.6(react@19.0.0-rc-3208e73e-20240730): 12519 12822 dependencies: ··· 12548 12851 12549 12852 tabbable@6.2.0: {} 12550 12853 12854 + tailwindcss@3.3.3: 12855 + dependencies: 12856 + '@alloc/quick-lru': 5.2.0 12857 + arg: 5.0.2 12858 + chokidar: 3.6.0 12859 + didyoumean: 1.2.2 12860 + dlv: 1.1.3 12861 + fast-glob: 3.3.2 12862 + glob-parent: 6.0.2 12863 + is-glob: 4.0.3 12864 + jiti: 1.21.6 12865 + lilconfig: 2.1.0 12866 + micromatch: 4.0.7 12867 + normalize-path: 3.0.0 12868 + object-hash: 3.0.0 12869 + picocolors: 1.1.0 12870 + postcss: 8.4.47 12871 + postcss-import: 15.1.0(postcss@8.4.47) 12872 + postcss-js: 4.0.1(postcss@8.4.47) 12873 + postcss-load-config: 4.0.2(postcss@8.4.47) 12874 + postcss-nested: 6.2.0(postcss@8.4.47) 12875 + postcss-selector-parser: 6.1.2 12876 + resolve: 1.22.8 12877 + sucrase: 3.35.0 12878 + transitivePeerDependencies: 12879 + - ts-node 12880 + 12551 12881 tailwindcss@3.4.11: 12552 12882 dependencies: 12553 12883 '@alloc/quick-lru': 5.2.0 ··· 12564 12894 normalize-path: 3.0.0 12565 12895 object-hash: 3.0.0 12566 12896 picocolors: 1.0.1 12567 - postcss: 8.4.31 12568 - postcss-import: 15.1.0(postcss@8.4.31) 12569 - postcss-js: 4.0.1(postcss@8.4.31) 12570 - postcss-load-config: 4.0.2(postcss@8.4.31) 12571 - postcss-nested: 6.2.0(postcss@8.4.31) 12897 + postcss: 8.4.47 12898 + postcss-import: 15.1.0(postcss@8.4.47) 12899 + postcss-js: 4.0.1(postcss@8.4.47) 12900 + postcss-load-config: 4.0.2(postcss@8.4.47) 12901 + postcss-nested: 6.2.0(postcss@8.4.47) 12572 12902 postcss-selector-parser: 6.1.2 12573 12903 resolve: 1.22.8 12574 12904 sucrase: 3.35.0 ··· 12625 12955 12626 12956 trough@2.2.0: {} 12627 12957 12628 - ts-api-utils@1.3.0(typescript@5.5.4): 12958 + ts-api-utils@1.3.0(typescript@5.7.3): 12629 12959 dependencies: 12630 - typescript: 5.5.4 12960 + typescript: 5.7.3 12631 12961 12632 12962 ts-interface-checker@0.1.13: {} 12633 12963 ··· 12649 12979 12650 12980 tslib@2.6.3: {} 12651 12981 12982 + tslib@2.8.1: {} 12983 + 12652 12984 tsx@4.19.2: 12653 12985 dependencies: 12654 12986 esbuild: 0.23.1 ··· 12713 13045 is-typed-array: 1.1.13 12714 13046 possible-typed-array-names: 1.0.0 12715 13047 12716 - typescript-eslint@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4): 13048 + typescript-eslint@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3): 12717 13049 dependencies: 12718 - '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 12719 - '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 12720 - '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) 13050 + '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 13051 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 13052 + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 12721 13053 optionalDependencies: 12722 - typescript: 5.5.4 13054 + typescript: 5.7.3 12723 13055 transitivePeerDependencies: 12724 13056 - eslint 12725 13057 - supports-color 12726 13058 12727 - typescript@5.5.4: {} 13059 + typescript@5.7.3: {} 12728 13060 12729 13061 ufo@1.5.4: {} 12730 13062 ··· 12736 13068 which-boxed-primitive: 1.0.2 12737 13069 12738 13070 undici-types@6.13.0: {} 13071 + 13072 + undici-types@6.19.8: {} 12739 13073 12740 13074 undici@5.28.4: 12741 13075 dependencies:
+38 -24
pnpm-workspace.yaml
··· 1 1 packages: 2 - - "packages/*" 3 - - "examples/*" 4 - - "benchmarking" 2 + - packages/* 3 + - examples/* 4 + - examples/e2e/* 5 + - benchmarking 5 6 6 7 catalog: 7 8 "@cloudflare/workers-types": ^4.20241230.0 8 9 "@dotenvx/dotenvx": 1.31.0 9 10 "@eslint/js": ^9.11.1 10 11 "@playwright/test": 1.47.0 11 - "@tsconfig/strictest": "^2.0.5" 12 + "@tsconfig/strictest": ^2.0.5 12 13 "@types/mock-fs": ^4.13.4 13 14 "@types/node": ^22.2.0 14 15 "@types/react-dom": ^18 15 16 "@types/react": ^18 16 - "esbuild": ^0.23.0 17 - "eslint-plugin-import": "^2.31.0" 18 - "eslint-plugin-simple-import-sort": "^12.1.1" 19 - "eslint-plugin-unicorn": ^55.0.0 20 - "eslint": ^9.11.1 21 - "glob": ^11.0.0 22 - "globals": ^15.9.0 23 - "mock-fs": ^5.4.1 24 - "next": 14.2.11 25 - "package-manager-detector": ^0.2.0 26 - "react-dom": ^18 27 - "react": ^18 28 - "rimraf": "^6.0.1" 29 - "ts-morph": ^23.0.0 30 - "tsup": ^8.2.4 31 - "tsx": ^4.19.2 32 - "typescript-eslint": ^8.7.0 33 - "typescript": ^5.5.4 34 - "vitest": ^2.1.1 35 - "wrangler": ^3.101.0 17 + esbuild: ^0.23.0 18 + eslint-plugin-import: ^2.31.0 19 + eslint-plugin-simple-import-sort: ^12.1.1 20 + eslint-plugin-unicorn: ^55.0.0 21 + eslint: ^9.11.1 22 + glob: ^11.0.0 23 + globals: ^15.9.0 24 + mock-fs: ^5.4.1 25 + next: 14.2.11 26 + package-manager-detector: ^0.2.0 27 + react-dom: ^18 28 + react: ^18 29 + rimraf: ^6.0.1 30 + ts-morph: ^23.0.0 31 + tsup: ^8.2.4 32 + tsx: ^4.19.2 33 + typescript-eslint: ^8.7.0 34 + typescript: ^5.7.3 35 + vitest: ^2.1.1 36 + wrangler: ^3.101.0 37 + 38 + # e2e tests 39 + catalogs: 40 + e2e: 41 + "@types/node": 20.17.6 42 + "@types/react-dom": 19.0.0 43 + "@types/react": 19.0.0 44 + autoprefixer: 10.4.15 45 + next: 15.1.0 46 + postcss: 8.4.27 47 + react-dom: 19.0.0 48 + react: 19.0.0 49 + tailwindcss: 3.3.3