first commit
Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled

This commit is contained in:
Arian Tron
2026-03-10 19:37:31 +03:30
commit 61f56f997c
27684 changed files with 2784175 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
import Link from 'next/link'
import { ReactNode } from 'react'
export default function Root({ children }: { children: ReactNode }) {
return (
<html>
<body>
<nav>
<p>
<Link href="/server-action">Server Action</Link>
</p>
<p>
<Link href="/nested-cache">Nested Cache</Link>
</p>
</nav>
<main>{children}</main>
</body>
</html>
)
}

View File

@@ -0,0 +1,29 @@
'use client'
import { useActionState } from 'react'
export function Form({
getDate,
getRandom,
}: {
getDate: () => Promise<string>
getRandom: () => Promise<number>
}) {
const [date, formAction, isDatePending] = useActionState(getDate, null)
const [random, buttonAction, isRandomPending] = useActionState(
getRandom,
null
)
return (
<form action={formAction}>
<button id="submit-button-date">Get Date</button>{' '}
<button id="submit-button-random" formAction={buttonAction}>
Get Random
</button>
<p id="date">{isDatePending ? 'loading...' : date}</p>
<p id="random">{isRandomPending ? 'loading...' : random}</p>
</form>
)
}

View File

@@ -0,0 +1,36 @@
import { connection } from 'next/server'
import { Suspense } from 'react'
import { Form } from './form'
export default function Page() {
return (
<div>
<Suspense fallback={<h1>Loading...</h1>}>
<Dynamic />
</Suspense>
<CachedForm />
</div>
)
}
async function CachedForm() {
'use cache'
return (
<Form
getDate={async () => {
'use cache'
return new Date().toISOString()
}}
getRandom={async function getRandom() {
'use cache'
return Math.random()
}}
/>
)
}
const Dynamic = async () => {
await connection()
return <h1>Dynamic</h1>
}

View File

@@ -0,0 +1,3 @@
export default function Page() {
return null
}

View File

@@ -0,0 +1,25 @@
'use client'
import { useActionState } from 'react'
export function Form({
sayHi,
sayHello,
}: {
sayHi: () => Promise<string>
sayHello: () => Promise<string>
}) {
const [hi, hiAction, isHiPending] = useActionState(sayHi, null)
const [hello, helloAction, isHelloPending] = useActionState(sayHello, null)
return (
<form action={hiAction}>
<button id="submit-button-hi">Say Hi</button>{' '}
<button id="submit-button-hello" formAction={helloAction}>
Say Hello
</button>
<p id="hi">{isHiPending ? 'loading...' : hi}</p>
<p id="hello">{isHelloPending ? 'loading...' : hello}</p>
</form>
)
}

View File

@@ -0,0 +1,36 @@
import { connection } from 'next/server'
import { Suspense } from 'react'
import { Form } from './form'
export default function Page() {
return (
<div>
<Suspense fallback={<h1>Loading...</h1>}>
<Dynamic />
</Suspense>
<CachedForm subject="World" />
</div>
)
}
async function CachedForm({ subject }: { subject: string }) {
'use cache'
return (
<Form
sayHi={async function hi() {
'use server'
return `Hi, ${subject}!`
}}
sayHello={async () => {
'use server'
return `Hello, ${subject}!`
}}
/>
)
}
const Dynamic = async () => {
await connection()
return <h1>Dynamic</h1>
}

View File

@@ -0,0 +1,9 @@
/**
* @type {import('next').NextConfig}
*/
const nextConfig = {
cacheComponents: true,
experimental: { useCache: true },
}
module.exports = nextConfig

View File

@@ -0,0 +1,39 @@
import { nextTestSetup } from 'e2e-utils'
import { retry } from 'next-test-utils'
const isoDateRegExp = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
const randomRegExp = /^\d+\.\d+$/
describe('use-cache-with-server-function-props', () => {
const { next } = nextTestSetup({
files: __dirname,
})
it('should be able to use inline server actions as props', async () => {
const browser = await next.browser('/server-action')
await browser.elementById('submit-button-hi').click()
await retry(async () => {
expect(await browser.elementById('hi').text()).toMatch('Hi, World!')
})
await browser.elementById('submit-button-hello').click()
await retry(async () => {
expect(await browser.elementById('hello').text()).toMatch('Hello, World!')
})
})
it('should be able to use nested cache functions as props', async () => {
const browser = await next.browser('/nested-cache')
await browser.elementById('submit-button-date').click()
await retry(async () => {
expect(await browser.elementById('date').text()).toMatch(isoDateRegExp)
})
await browser.elementById('submit-button-random').click()
await retry(async () => {
expect(await browser.elementById('random').text()).toMatch(randomRegExp)
})
})
})