mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
This PR removes the deprecated sync access to Dynamic APIs. - Removed UnsafeUnwrapped* types. - Replaced `as unknown as UnsafeUnwrapped ` type casts to `as any` for dev warning. - Removed tests that expected sync access to not error. - Removed `UntrackedExotic` functions. - Modified tests that were accidentally doing sync access. - Updated warnings to emphasize that it is a Promise and must be awaited. - Removed paragraph that states access is allowed from `errors/sync-dynamic-apis.mdx`. --------- Co-authored-by: Josh Story <[email protected]>
271 lines
5.6 KiB
TypeScript
271 lines
5.6 KiB
TypeScript
import type { cookies } from 'next/headers'
|
|
|
|
type ReadonlyRequestCookies = Awaited<ReturnType<typeof cookies>>
|
|
|
|
export function AllComponents({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
return (
|
|
<>
|
|
<ForOf cookies={cookies} expression={expression} />
|
|
<Spread cookies={cookies} expression={expression} />
|
|
<Size cookies={cookies} expression={expression} />
|
|
<GetAndGetAll cookies={cookies} expression={expression} />
|
|
<Has cookies={cookies} expression={expression} />
|
|
<Set cookies={cookies} expression={expression} />
|
|
<Delete cookies={cookies} expression={expression} />
|
|
<Clear cookies={cookies} expression={expression} />
|
|
<ToString cookies={cookies} expression={expression} />
|
|
</>
|
|
)
|
|
}
|
|
|
|
function ForOf({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
let output = []
|
|
for (let [cookieName, cookie] of cookies) {
|
|
if (cookieName.startsWith('x-sentinel')) {
|
|
output.push(
|
|
<div key={cookieName} id={'for-of-' + cookieName}>
|
|
<pre>{print(cookie)}</pre>
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<section>
|
|
<h2>for...of cookies()</h2>
|
|
{output.length ? output : <div>no cookies found</div>}
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Spread({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
let output = [...cookies]
|
|
.filter(([cookieName]) => cookieName.startsWith('x-sentinel'))
|
|
.map((v) => {
|
|
return (
|
|
<div key={v[0]} id={'spread-' + v[0]}>
|
|
<pre>{print(v[1])}</pre>
|
|
</div>
|
|
)
|
|
})
|
|
|
|
return (
|
|
<section>
|
|
<h2>...cookies()</h2>
|
|
{output.length ? output : <div>no cookies found</div>}
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Size({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
return (
|
|
<section>
|
|
<h2>cookies().size</h2>
|
|
<div id={'size-cookies'}>{cookies.size}</div>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function GetAndGetAll({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
return (
|
|
<section>
|
|
<h2>cookies().get('...')</h2>
|
|
<div id={'get-x-sentinel'}>
|
|
<pre>{print(cookies.get('x-sentinel'))}</pre>
|
|
</div>
|
|
<h2>{"cookies().get({ name: '...' })"}</h2>
|
|
<div id={'get-x-sentinel-path'}>
|
|
<pre>
|
|
{print(cookies.get({ name: 'x-sentinel-path', value: undefined }))}
|
|
</pre>
|
|
</div>
|
|
<h2>cookies().getAll('...')</h2>
|
|
<div id={'get-x-sentinel-rand'}>
|
|
<pre>{print(cookies.getAll('x-sentinel-rand'))}</pre>
|
|
</div>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Has({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
return (
|
|
<section>
|
|
<h2>cookies().has('...')</h2>
|
|
<ul>
|
|
<li>
|
|
<label>x-sentinel</label>
|
|
<span id={'has-x-sentinel'}>: {'' + cookies.has('x-sentinel')}</span>
|
|
</li>
|
|
<li>
|
|
<label>x-sentinel-foobar</label>
|
|
<span id={'has-x-sentinel-foobar'}>
|
|
: {'' + cookies.has('x-sentinel-foobar')}
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Set({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
let result = 'no error'
|
|
try {
|
|
cookies.set('x-sentinel', 'goodbye')
|
|
} catch (e) {
|
|
result = e.message
|
|
}
|
|
return (
|
|
<section>
|
|
<h2>cookies().set('...')</h2>
|
|
<ul>
|
|
<li>
|
|
<label>cookies().set('x-sentinel', 'goodbye')</label>
|
|
<span id={'set-result-x-sentinel'}>: {result}</span>
|
|
</li>
|
|
<li>
|
|
<label>x-sentinel value</label>
|
|
<span id={'set-value-x-sentinel'}>
|
|
: {cookies.get('x-sentinel').value}
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Delete({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
let result = 'no error'
|
|
try {
|
|
cookies.delete('x-sentinel')
|
|
} catch (e) {
|
|
result = e.message
|
|
}
|
|
return (
|
|
<section>
|
|
<h2>cookies().delete('...')</h2>
|
|
<ul>
|
|
<li>
|
|
<label>cookies().delete('x-sentinel')</label>
|
|
<span id={'delete-result-x-sentinel'}>: {result}</span>
|
|
</li>
|
|
<li>
|
|
<label>x-sentinel value</label>
|
|
<span id={'delete-value-x-sentinel'}>
|
|
: {cookies.get('x-sentinel').value}
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function Clear({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
let result = 'no error'
|
|
try {
|
|
;(cookies as any).clear()
|
|
} catch (e) {
|
|
result = e.message
|
|
}
|
|
return (
|
|
<section>
|
|
<h2>cookies().clear()</h2>
|
|
<ul>
|
|
<li>
|
|
<label>cookies().clear()</label>
|
|
<span id={'clear-result'}>: {result}</span>
|
|
</li>
|
|
<li>
|
|
<label>x-sentinel value</label>
|
|
<span id={'clear-value-x-sentinel'}>
|
|
: {cookies.get('x-sentinel').value}
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function ToString({
|
|
cookies,
|
|
expression,
|
|
}: {
|
|
cookies: ReadonlyRequestCookies
|
|
expression: string
|
|
}) {
|
|
// filter out real cookies, no point in leaking and not stable for testing
|
|
let result = cookies
|
|
.toString()
|
|
.split('; ')
|
|
.filter((p) => p.startsWith('x-sentinel'))
|
|
.join('; ')
|
|
return (
|
|
<section>
|
|
<h2>cookies().toString()</h2>
|
|
<ul>
|
|
<li>
|
|
<label>cookies().toString()</label>
|
|
<pre id="toString">{result}</pre>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function print(model: any) {
|
|
return JSON.stringify(model, null, 2)
|
|
}
|