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

test: exclude the ts testing files from tsconfig during local dev in nextjs repo #74647

Conversation

huozhi
Copy link
Member

@huozhi huozhi commented Jan 8, 2025

What

We're suffering from local dev that every time the *.test.ts files are resolved with the local tsconfig.json, which was intended to be handled by the root tsconfig.json in the Next.js monorepo as they require to resolve the utils alias.

By leveraing the NEXT_PRIVATE_SKIP_CANARY_CHECK flag which is renamed to NEXT_PRIVATE_LOCAL_DEV for our development. This only happen in local development in our monorepo, not in development of users or any other situations.

Benefits

This helps us to always write the tests with correct type hints especially for the rare cheerio or playwright interface APIs with our testing suite

@ijjk ijjk added created-by: Next.js team PRs by the Next.js team. type: next labels Jan 8, 2025
Copy link
Member Author

huozhi commented Jan 8, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@ijjk
Copy link
Member

ijjk commented Jan 8, 2025

Test Passed

@ijjk
Copy link
Member

ijjk commented Jan 8, 2025

Stats from current PR

Default Build
General Overall increase ⚠️
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
buildDuration 38.5s 36.1s N/A
buildDurationCached 40.1s 29s N/A
nodeModulesSize 417 MB 417 MB ⚠️ +6.01 kB
nextStartRea..uration (ms) 821ms 802ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
1187-HASH.js gzip 52.6 kB 52.6 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.44 kB 5.44 kB N/A
bccd1874-HASH.js gzip 53 kB 53 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 232 B 233 B N/A
main-HASH.js gzip 34.1 kB 34.1 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.57 kB 4.57 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
_buildManifest.js gzip 749 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
index.html gzip 524 B 524 B
link.html gzip 539 B 538 B N/A
withRouter.html gzip 520 B 521 B N/A
Overall change 524 B 524 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 206 kB 206 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
middleware-b..fest.js gzip 668 B 668 B
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.2 kB 31.2 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 1.51 kB 1.51 kB
Next Runtimes
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
274-experime...dev.js gzip 322 B 322 B
274.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 364 kB 364 kB
app-page-exp..prod.js gzip 129 kB 129 kB
app-page-tur..prod.js gzip 142 kB 142 kB
app-page-tur..prod.js gzip 138 kB 138 kB
app-page.run...dev.js gzip 352 kB 352 kB
app-page.run..prod.js gzip 125 kB 125 kB
app-route-ex...dev.js gzip 37.5 kB 37.5 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 39.2 kB 39.2 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.7 kB 21.7 kB
pages.runtim...dev.js gzip 27.5 kB 27.5 kB
pages.runtim..prod.js gzip 21.7 kB 21.7 kB
server.runti..prod.js gzip 916 kB 916 kB
Overall change 2.45 MB 2.45 MB
build cache
vercel/next.js canary vercel/next.js huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo Change
0.pack gzip 2.09 MB 2.09 MB N/A
index.pack gzip 73.7 kB 73.4 kB N/A
Overall change 0 B 0 B
Diff details
Diff for main-HASH.js

Diff too large to display

Commit: 6f7d6d3

@huozhi huozhi marked this pull request as ready for review January 8, 2025 16:33
Copy link

vercel bot commented Jan 8, 2025

Notifying the following users due to files changed in this PR based on this repo's notify modifiers:

@timneutkens, @ijjk, @shuding:

packages/next/src/server/config.ts

@ijjk
Copy link
Member

ijjk commented Jan 8, 2025

Failing test suites

Commit: 6f7d6d3

pnpm test-start-turbo test/e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts (turbopack)

  • app-dir action disallowed origins > should error if x-forwarded-host does not match the origin
Expand output

● app-dir action disallowed origins › should error if x-forwarded-host does not match the origin

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  252 |   let next: NextInstance | undefined
  253 |   if (!skipped) {
> 254 |     beforeAll(async () => {
      |     ^
  255 |       next = await createNext(options)
  256 |     })
  257 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:254:5)
  at e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts:6:42
  at Object.describe (e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts:5:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev test/e2e/middleware-matcher/index.test.ts

  • using a single matcher with i18n > adds the header for a matched path
  • using a single matcher with i18n > adds the header for a mathed root path with /index
  • using a single matcher with i18n > adds the headers for a matched data path
  • using a single matcher with i18n > does not add the header for an unmatched path
  • using a single matcher with i18n and basePath > adds the header for a matched path
  • using a single matcher with i18n and basePath > adds the header for a mathed root path with /index
  • using a single matcher with i18n and basePath > adds the headers for a matched data path
  • using a single matcher with i18n and basePath > does not add the header for an unmatched path
  • using a single matcher with i18n and basePath and trailingSlash > adds the header for a matched path
  • using a single matcher with i18n and basePath and trailingSlash > adds the header for a mathed root path with /index
  • using a single matcher with i18n and basePath and trailingSlash > adds the headers for a matched data path
  • using a single matcher with i18n and basePath and trailingSlash > does not add the header for an unmatched path
  • using root matcher > adds the header to the /
  • using root matcher > adds the header to the /index
  • using root matcher > adds the header for a matched data path (with header)
  • using root matcher > adds the header for a matched data path (without header)
Expand output

● using root matcher › adds the header to the /

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  246 | describe('using root matcher', () => {
  247 |   let next: NextInstance
> 248 |   beforeAll(async () => {
      |   ^
  249 |     next = await createNext({
  250 |       files: {
  251 |         'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:248:3)
  at Object.describe (e2e/middleware-matcher/index.test.ts:246:1)

● using root matcher › adds the header to the /index

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  246 | describe('using root matcher', () => {
  247 |   let next: NextInstance
> 248 |   beforeAll(async () => {
      |   ^
  249 |     next = await createNext({
  250 |       files: {
  251 |         'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:248:3)
  at Object.describe (e2e/middleware-matcher/index.test.ts:246:1)

● using root matcher › adds the header for a matched data path (with header)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  246 | describe('using root matcher', () => {
  247 |   let next: NextInstance
> 248 |   beforeAll(async () => {
      |   ^
  249 |     next = await createNext({
  250 |       files: {
  251 |         'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:248:3)
  at Object.describe (e2e/middleware-matcher/index.test.ts:246:1)

● using root matcher › adds the header for a matched data path (without header)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  246 | describe('using root matcher', () => {
  247 |   let next: NextInstance
> 248 |   beforeAll(async () => {
      |   ^
  249 |     next = await createNext({
  250 |       files: {
  251 |         'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:248:3)
  at Object.describe (e2e/middleware-matcher/index.test.ts:246:1)

● using a single matcher with i18n › adds the header for a matched path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:330:28)

● using a single matcher with i18n › adds the header for a mathed root path with /index

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:330:28)

● using a single matcher with i18n › adds the headers for a matched data path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:330:28)

● using a single matcher with i18n › does not add the header for an unmatched path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:330:28)

● using a single matcher with i18n and basePath › adds the header for a matched path

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  430 |   ({ trailingSlash }) => {
  431 |     let next: NextInstance
> 432 |     beforeAll(async () => {
      |     ^
  433 |       next = await createNext({
  434 |         files: {
  435 |           'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:432:5)
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:428:2)

● using a single matcher with i18n and basePath › adds the header for a mathed root path with /index

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  430 |   ({ trailingSlash }) => {
  431 |     let next: NextInstance
> 432 |     beforeAll(async () => {
      |     ^
  433 |       next = await createNext({
  434 |         files: {
  435 |           'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:432:5)
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:428:2)

● using a single matcher with i18n and basePath › adds the headers for a matched data path

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  430 |   ({ trailingSlash }) => {
  431 |     let next: NextInstance
> 432 |     beforeAll(async () => {
      |     ^
  433 |       next = await createNext({
  434 |         files: {
  435 |           'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:432:5)
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:428:2)

● using a single matcher with i18n and basePath › does not add the header for an unmatched path

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  430 |   ({ trailingSlash }) => {
  431 |     let next: NextInstance
> 432 |     beforeAll(async () => {
      |     ^
  433 |       next = await createNext({
  434 |         files: {
  435 |           'pages/index.js': `

  at beforeAll (e2e/middleware-matcher/index.test.ts:432:5)
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:428:2)

● using a single matcher with i18n and basePath and trailingSlash › adds the header for a matched path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:433:30)

● using a single matcher with i18n and basePath and trailingSlash › adds the header for a mathed root path with /index

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:433:30)

● using a single matcher with i18n and basePath and trailingSlash › adds the headers for a matched data path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:433:30)

● using a single matcher with i18n and basePath and trailingSlash › does not add the header for an unmatched path

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.<anonymous> (e2e/middleware-matcher/index.test.ts:433:30)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  276 |     })
  277 |   })
> 278 |   afterAll(() => next.destroy())
      |                       ^
  279 |
  280 |   it('adds the header to the /', async () => {
  281 |     const response = await fetchViaHTTP(next.url, '/')

  at Object.destroy (e2e/middleware-matcher/index.test.ts:278:23)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  374 |     })
  375 |   })
> 376 |   afterAll(() => next.destroy())
      |                       ^
  377 |
  378 |   it(`adds the header for a matched path`, async () => {
  379 |     const res1 = await fetchViaHTTP(next.url, `/`)

  at Object.destroy (e2e/middleware-matcher/index.test.ts:376:23)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  479 |       })
  480 |     })
> 481 |     afterAll(() => next.destroy())
      |                         ^
  482 |
  483 |     it(`adds the header for a matched path`, async () => {
  484 |       const res1 = await fetchViaHTTP(next.url, `/root`)

  at Object.destroy (e2e/middleware-matcher/index.test.ts:481:25)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  479 |       })
  480 |     })
> 481 |     afterAll(() => next.destroy())
      |                         ^
  482 |
  483 |     it(`adds the header for a matched path`, async () => {
  484 |       const res1 = await fetchViaHTTP(next.url, `/root`)

  at Object.destroy (e2e/middleware-matcher/index.test.ts:481:25)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts (turbopack)

  • scripts > encodes characters in app router
  • scripts > encodes characters in pages router
  • styles > encodes characters in app router
  • styles > encodes characters in pages router
Expand output

● scripts › encodes characters in app router

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  252 |   let next: NextInstance | undefined
  253 |   if (!skipped) {
> 254 |     beforeAll(async () => {
      |     ^
  255 |       next = await createNext(options)
  256 |     })
  257 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:254:5)
  at e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts:5:33
  at Object.describe (e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts:4:1)

● scripts › encodes characters in pages router

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  252 |   let next: NextInstance | undefined
  253 |   if (!skipped) {
> 254 |     beforeAll(async () => {
      |     ^
  255 |       next = await createNext(options)
  256 |     })
  257 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:254:5)
  at e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts:5:33
  at Object.describe (e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts:4:1)

● styles › encodes characters in app router

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:255:20)

● styles › encodes characters in pages router

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:255:20)

Read more about building and testing Next.js in contributing.md.

@huozhi huozhi requested review from ztanner, eps1lon and ijjk January 8, 2025 20:08
@huozhi huozhi merged commit 6e6a330 into canary Jan 8, 2025
129 of 131 checks passed
@huozhi huozhi deleted the huozhi/01-08-test_exclude_the_ts_testing_files_from_tsconfig_during_local_dev_in_nextjs_repo branch January 8, 2025 20:39
huozhi added a commit that referenced this pull request Jan 9, 2025
Follow up on #74647 , do not log this changes during dev
huozhi added a commit that referenced this pull request Jan 14, 2025
### What

Follow up of #74647, do not enque warnings otherwise it's showing a
message of updating `tsconfig.json` inside nextjs monorepo when you do
`pnpm next <app path>`

```
   We detected TypeScript in your project and reconfigured your tsconfig.json file for you. Strict-mode is set to false by default.
```

This is because when there's action we'll always log this.
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 23, 2025
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