Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix NextApiRequestCookies and NextApiRequestQuery types #25532

Merged
merged 3 commits into from
May 23, 2022

Conversation

mattbrandlysonos
Copy link
Contributor

@mattbrandlysonos mattbrandlysonos commented May 27, 2021

Hello! Thanks for making next.js so great.

Bug

Right now, these types give false confidence. These keys are treated as though a value is defined for every string. However, given an arbitrary request, a particular cookie or query param could be undefined.

For example, when building an /api endpoint, the code might look like this:

import type { NextApiRequest, NextApiResponse } from "next"

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  // According to the old types, `value` is a string
  const value = req.cookies.value

  // Type-checking passes but leads to a runtime error when no `value` cookie is provided in the request
  //   Uncaught TypeError: Cannot read property 'toLowerCase' of undefined
  value.toLowerCause()

  // ...
}

By using Partial, TypeScript now knows that these objects don't have values defined for every key and accessing a given key might resolve to undefined.


The only obvious error this caused within this repo was on line 333 of the same file. For better or worse, I ended up casting that cookie value to a string. There's a series of if statements before it that, I guess, are guaranteeing that it's truly a string. Potentially, that stretch could be refactored such that TypeScript knows it's a string.

Also, I tried to follow the contributing guidelines. However, running yarn types kicked out a bunch of errors about overwriting files:

$ yarn types
yarn run v1.22.10
$ lerna run types --stream
lerna notice cli v4.0.0
lerna info Executing command in 2 packages: "yarn run types"
@next/env: $ tsc index.ts --declaration --emitDeclarationOnly --declarationDir types --esModuleInterop
next: $ tsc --declaration --emitDeclarationOnly --declarationDir dist
next: error TS5055: Cannot write file '/Users/mbrandly/code/next.js/packages/next/dist/build/index.d.ts' because it would overwrite input file.
next: error TS5055: Cannot write file '/Users/mbrandly/code/next.js/packages/next/dist/build/webpack/plugins/build-manifest-plugin.d.ts' because it would overwrite input file.
...
...
...

Let me know if there's anything I can improve here! Thanks again.

@ijjk
Copy link
Member

ijjk commented Aug 16, 2021

Stats from current PR

Default Build (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
buildDuration 22.5s 22s -494ms
buildDurationCached 8.7s 8.5s -234ms
nodeModulesSize 479 MB 479 MB ⚠️ +71 B
Page Load Tests Overall decrease ⚠️
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
/ failed reqs 0 0
/ total time (seconds) 5.711 5.808 ⚠️ +0.1
/ avg req/sec 437.79 430.45 ⚠️ -7.34
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.173 2.197 ⚠️ +0.02
/error-in-render avg req/sec 1150.55 1137.77 ⚠️ -12.78
Client Bundles (main, webpack)
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
925.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42 kB 42 kB
main-HASH.js gzip 29.2 kB 29.2 kB
webpack-HASH.js gzip 1.54 kB 1.54 kB
Overall change 72.9 kB 72.9 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
_app-HASH.js gzip 1.36 kB 1.36 kB
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 308 B 308 B
css-HASH.js gzip 327 B 327 B
dynamic-HASH.js gzip 2.71 kB 2.71 kB
head-HASH.js gzip 359 B 359 B
hooks-HASH.js gzip 920 B 920 B
image-HASH.js gzip 5.73 kB 5.73 kB
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 2.65 kB 2.65 kB
routerDirect..HASH.js gzip 320 B 320 B
script-HASH.js gzip 391 B 391 B
withRouter-HASH.js gzip 318 B 318 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 16 kB 16 kB
Client Build Manifests
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
_buildManifest.js gzip 458 B 458 B
Overall change 458 B 458 B
Rendered Page Sizes
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
index.html gzip 533 B 533 B
link.html gzip 547 B 547 B
withRouter.html gzip 528 B 528 B
Overall change 1.61 kB 1.61 kB

Default Build with SWC
General Overall increase ⚠️
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
buildDuration 24.8s 25.1s ⚠️ +283ms
buildDurationCached 9s 8.4s -639ms
nodeModulesSize 479 MB 479 MB ⚠️ +71 B
Page Load Tests Overall increase ✓
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
/ failed reqs 0 0
/ total time (seconds) 5.703 5.83 ⚠️ +0.13
/ avg req/sec 438.33 428.78 ⚠️ -9.55
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.161 2.137 -0.02
/error-in-render avg req/sec 1156.77 1169.96 +13.19
Client Bundles (main, webpack)
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
925.HASH.js gzip 178 B 178 B
framework-HASH.js gzip 42.7 kB 42.7 kB
main-HASH.js gzip 29.6 kB 29.6 kB
webpack-HASH.js gzip 1.54 kB 1.54 kB
Overall change 74 kB 74 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
_app-HASH.js gzip 1.35 kB 1.35 kB
_error-HASH.js gzip 179 B 179 B
amp-HASH.js gzip 311 B 311 B
css-HASH.js gzip 324 B 324 B
dynamic-HASH.js gzip 2.89 kB 2.89 kB
head-HASH.js gzip 357 B 357 B
hooks-HASH.js gzip 920 B 920 B
image-HASH.js gzip 5.82 kB 5.82 kB
index-HASH.js gzip 261 B 261 B
link-HASH.js gzip 2.78 kB 2.78 kB
routerDirect..HASH.js gzip 322 B 322 B
script-HASH.js gzip 392 B 392 B
withRouter-HASH.js gzip 317 B 317 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 16.3 kB 16.3 kB
Client Build Manifests
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
_buildManifest.js gzip 457 B 457 B
Overall change 457 B 457 B
Rendered Page Sizes
vercel/next.js canary mattbrandlysonos/next.js patch-1 Change
index.html gzip 532 B 532 B
link.html gzip 547 B 547 B
withRouter.html gzip 529 B 529 B
Overall change 1.61 kB 1.61 kB
Commit: 2fdf124

ijjk added 2 commits May 22, 2022 19:08
# Conflicts:
#	packages/next/next-server/server/api-utils.ts
Copy link
Member

@ijjk ijjk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, thanks for the PR!

@kodiakhq kodiakhq bot merged commit 3052144 into vercel:canary May 23, 2022
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jun 22, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants