@@ -28,7 +28,6 @@ import {
2828import { createDedupedByCallsiteServerErrorLoggerDev } from '../create-deduped-by-callsite-server-error-logger'
2929import { isRequestAPICallableInsideAfter } from './utils'
3030import { InvariantError } from '../../shared/lib/invariant-error'
31- import { ReflectAdapter } from '../web/spec-extension/adapters/reflect'
3231import { RenderStage } from '../app-render/staged-rendering'
3332
3433export function cookies ( ) : Promise < ReadonlyRequestCookies > {
@@ -198,7 +197,7 @@ function makeUntrackedCookiesWithDevWarnings(
198197 promise = requestStore . asyncApiPromises . cookies
199198 } else {
200199 throw new InvariantError (
201- 'Received a underlying cookies object that does not match either `cookies` or `mutableCookies`'
200+ 'Received an underlying cookies object that does not match either `cookies` or `mutableCookies`'
202201 )
203202 }
204203 return instrumentCookiesPromiseWithDevWarnings ( promise , route )
@@ -230,35 +229,65 @@ function instrumentCookiesPromiseWithDevWarnings(
230229 promise : Promise < ReadonlyRequestCookies > ,
231230 route : string | undefined
232231) {
233- return new Proxy ( promise , {
234- get ( target , prop , receiver ) {
235- switch ( prop ) {
236- case Symbol . iterator : {
237- warnForSyncAccess ( route , '`...cookies()` or similar iteration' )
238- break
239- }
240- case 'size' :
241- case 'get' :
242- case 'getAll' :
243- case 'has' :
244- case 'set' :
245- case 'delete' :
246- case 'clear' :
247- case 'toString' : {
248- warnForSyncAccess ( route , `\`cookies().${ prop } \`` )
249- break
250- }
251- default : {
252- // We only warn for well-defined properties of the cookies object.
253- }
254- }
232+ Object . defineProperties ( promise , {
233+ [ Symbol . iterator ] : replaceableWarningDescriptorForSymbolIterator (
234+ promise ,
235+ route
236+ ) ,
237+ size : replaceableWarningDescriptor ( promise , 'size' , route ) ,
238+ get : replaceableWarningDescriptor ( promise , 'get' , route ) ,
239+ getAll : replaceableWarningDescriptor ( promise , 'getAll' , route ) ,
240+ has : replaceableWarningDescriptor ( promise , 'has' , route ) ,
241+ set : replaceableWarningDescriptor ( promise , 'set' , route ) ,
242+ delete : replaceableWarningDescriptor ( promise , 'delete' , route ) ,
243+ clear : replaceableWarningDescriptor ( promise , 'clear' , route ) ,
244+ toString : replaceableWarningDescriptor ( promise , 'toString' , route ) ,
245+ } )
246+ return promise
247+ }
255248
256- return ReflectAdapter . get ( target , prop , receiver )
249+ function replaceableWarningDescriptor (
250+ target : unknown ,
251+ prop : string ,
252+ route : string | undefined
253+ ) {
254+ return {
255+ enumerable : false ,
256+ get ( ) {
257+ warnForSyncAccess ( route , `\`cookies().${ prop } \`` )
258+ return undefined
257259 } ,
258- set ( target , prop , newValue , receiver ) {
259- return ReflectAdapter . set ( target , prop , newValue , receiver )
260+ set ( value : unknown ) {
261+ Object . defineProperty ( target , prop , {
262+ value,
263+ writable : true ,
264+ configurable : true ,
265+ } )
260266 } ,
261- } )
267+ configurable : true ,
268+ }
269+ }
270+
271+ function replaceableWarningDescriptorForSymbolIterator (
272+ target : unknown ,
273+ route : string | undefined
274+ ) {
275+ return {
276+ enumerable : false ,
277+ get ( ) {
278+ warnForSyncAccess ( route , '`...cookies()` or similar iteration' )
279+ return undefined
280+ } ,
281+ set ( value : unknown ) {
282+ Object . defineProperty ( target , Symbol . iterator , {
283+ value,
284+ writable : true ,
285+ enumerable : true ,
286+ configurable : true ,
287+ } )
288+ } ,
289+ configurable : true ,
290+ }
262291}
263292
264293function createCookiesAccessError (
0 commit comments