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

NextResponse: add JSON support #30275

Closed
wants to merge 5 commits into from
Closed

NextResponse: add JSON support #30275

wants to merge 5 commits into from

Conversation

Kikobeats
Copy link
Member

Bug

  • Related issues linked using fixes #number
  • Integration tests added
  • Errors have helpful link attached, see contributing.md

Feature

  • Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR.
  • Related issues linked using fixes #number
  • Integration tests added
  • Documentation added
  • Telemetry added. In case of a feature if it's used or not.
  • Errors have helpful link attached, see contributing.md

Documentation / Examples

  • Make sure the linting passes by running yarn lint

@ijjk
Copy link
Member

ijjk commented Oct 25, 2021

Stats from current PR

Default Build (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js json Change
buildDuration 21.8s 23.3s ⚠️ +1.5s
buildDurationCached 4.3s 4.4s ⚠️ +86ms
nodeModulesSize 475 MB 475 MB ⚠️ +429 B
Page Load Tests Overall decrease ⚠️
vercel/next.js canary vercel/next.js json Change
/ failed reqs 0 0
/ total time (seconds) 3.709 4.1 ⚠️ +0.39
/ avg req/sec 674.12 609.83 ⚠️ -64.29
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.082 2.024 -0.06
/error-in-render avg req/sec 1200.49 1234.96 +34.47
Client Bundles (main, webpack, commons)
vercel/next.js canary vercel/next.js json Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.2 kB 42.2 kB
main-HASH.js gzip 27.7 kB 27.7 kB
webpack-HASH.js gzip 1.45 kB 1.45 kB
Overall change 71.5 kB 71.5 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js json Change
polyfills-a4..dd70.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary vercel/next.js json Change
_app-HASH.js gzip 1.23 kB 1.23 kB
_error-HASH.js gzip 194 B 194 B
amp-HASH.js gzip 312 B 312 B
css-HASH.js gzip 327 B 327 B
dynamic-HASH.js gzip 2.38 kB 2.38 kB
head-HASH.js gzip 350 B 350 B
hooks-HASH.js gzip 635 B 635 B
image-HASH.js gzip 4.44 kB 4.44 kB
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 1.87 kB 1.87 kB
routerDirect..HASH.js gzip 321 B 321 B
script-HASH.js gzip 383 B 383 B
withRouter-HASH.js gzip 318 B 318 B
334f979574ae..6f4.css gzip 106 B 106 B
Overall change 13.1 kB 13.1 kB
Client Build Manifests
vercel/next.js canary vercel/next.js json Change
_buildManifest.js gzip 459 B 459 B
Overall change 459 B 459 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js json Change
index.html gzip 534 B 534 B
link.html gzip 546 B 546 B
withRouter.html gzip 528 B 528 B
Overall change 1.61 kB 1.61 kB

Default Build with SWC (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js json Change
buildDuration 18.5s 18.4s -59ms
buildDurationCached 4.4s 4.3s -149ms
nodeModulesSize 475 MB 475 MB ⚠️ +429 B
Page Load Tests Overall increase ✓
vercel/next.js canary vercel/next.js json Change
/ failed reqs 0 0
/ total time (seconds) 3.919 3.73 -0.19
/ avg req/sec 637.91 670.21 +32.3
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.023 2.023
/error-in-render avg req/sec 1236.07 1236.06 ⚠️ -0.01
Client Bundles (main, webpack, commons)
vercel/next.js canary vercel/next.js json Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.2 kB 42.2 kB
main-HASH.js gzip 27.8 kB 27.8 kB
webpack-HASH.js gzip 1.43 kB 1.43 kB
Overall change 71.6 kB 71.6 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js json Change
polyfills-a4..dd70.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary vercel/next.js json Change
_app-HASH.js gzip 1.22 kB 1.22 kB
_error-HASH.js gzip 180 B 180 B
amp-HASH.js gzip 305 B 305 B
css-HASH.js gzip 321 B 321 B
dynamic-HASH.js gzip 2.38 kB 2.38 kB
head-HASH.js gzip 342 B 342 B
hooks-HASH.js gzip 621 B 621 B
image-HASH.js gzip 4.46 kB 4.46 kB
index-HASH.js gzip 256 B 256 B
link-HASH.js gzip 1.9 kB 1.9 kB
routerDirect..HASH.js gzip 314 B 314 B
script-HASH.js gzip 375 B 375 B
withRouter-HASH.js gzip 309 B 309 B
334f979574ae..6f4.css gzip 106 B 106 B
Overall change 13.1 kB 13.1 kB
Client Build Manifests
vercel/next.js canary vercel/next.js json Change
_buildManifest.js gzip 459 B 459 B
Overall change 459 B 459 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js json Change
index.html gzip 534 B 534 B
link.html gzip 547 B 547 B
withRouter.html gzip 527 B 527 B
Overall change 1.61 kB 1.61 kB
Commit: 2cc9d50

@ijjk
Copy link
Member

ijjk commented Oct 25, 2021

Failing test suites

Commit: 2cc9d50

test/integration/middleware-core/test/index.test.js

  • Middleware base tests > dev mode > should rewrite without hard navigation
  • Middleware base tests > dev mode > /fr should rewrite without hard navigation
  • Middleware base tests > production mode > should rewrite without hard navigation
  • Middleware base tests > production mode > /fr should rewrite without hard navigation
Expand output

● Middleware base tests › dev mode › should rewrite without hard navigation

page.waitForSelector: Timeout 30000ms exceeded.
=========================== logs ===========================
waiting for selector "#link-with-rewritten-url"
============================================================

  252 |     return this.chain(() => {
  253 |       return page
> 254 |         .waitForSelector(selector, { timeout, state: 'attached' })
      |          ^
  255 |         .then(async (el) => {
  256 |           // it seems selenium waits longer and tests rely on this behavior
  257 |           // so we wait for the load event fire before returning

  at lib/browsers/playwright.ts:254:10

● Middleware base tests › dev mode › /fr should rewrite without hard navigation

page.waitForSelector: Timeout 30000ms exceeded.
=========================== logs ===========================
waiting for selector "#link-with-rewritten-url"
============================================================

  252 |     return this.chain(() => {
  253 |       return page
> 254 |         .waitForSelector(selector, { timeout, state: 'attached' })
      |          ^
  255 |         .then(async (el) => {
  256 |           // it seems selenium waits longer and tests rely on this behavior
  257 |           // so we wait for the load event fire before returning

  at lib/browsers/playwright.ts:254:10

● Middleware base tests › production mode › should rewrite without hard navigation

page.waitForSelector: Timeout 30000ms exceeded.
=========================== logs ===========================
waiting for selector "#link-with-rewritten-url"
============================================================

  252 |     return this.chain(() => {
  253 |       return page
> 254 |         .waitForSelector(selector, { timeout, state: 'attached' })
      |          ^
  255 |         .then(async (el) => {
  256 |           // it seems selenium waits longer and tests rely on this behavior
  257 |           // so we wait for the load event fire before returning

  at lib/browsers/playwright.ts:254:10

● Middleware base tests › production mode › /fr should rewrite without hard navigation

page.waitForSelector: Timeout 30000ms exceeded.
=========================== logs ===========================
waiting for selector "#link-with-rewritten-url"
============================================================

  252 |     return this.chain(() => {
  253 |       return page
> 254 |         .waitForSelector(selector, { timeout, state: 'attached' })
      |          ^
  255 |         .then(async (el) => {
  256 |           // it seems selenium waits longer and tests rely on this behavior
  257 |           // so we wait for the load event fire before returning

  at lib/browsers/playwright.ts:254:10

@Kikobeats
Copy link
Member Author

Maybe should be considered the case where the body is a buffer 🤔

Copy link
Member

@styfle styfle left a comment

Choose a reason for hiding this comment

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

It would be good to add a test

constructor(body?: BodyInit | object | null, init: ResponseInit = {}) {
if (body && typeof body === 'object' && !Buffer.isBuffer(objet)) {
body = JSON.stringify(body)
init.headers = {
Copy link
Member

@TooTallNate TooTallNate Oct 27, 2021

Choose a reason for hiding this comment

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

I don't think we can use spread operator here. Consider when init.headers is a Headers instance already. Should be something like:

const headers = new Headers(init.headers);
headers.set('content-type', ...);
init.headers = headers;

Copy link

@weyert weyert Oct 28, 2021

Choose a reason for hiding this comment

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

shouldn't it be !Buffer.isBuffer(object)? Not the missing c in objet

@Kikobeats
Copy link
Member Author

Closing in favour of #31024

@Kikobeats Kikobeats closed this Nov 5, 2021
@ijjk ijjk deleted the json branch November 5, 2021 15:06
@vercel vercel locked as resolved and limited conversation to collaborators Jan 27, 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.

5 participants