Co-authored-by: Joe Haddad <joe.haddad@zeit.co>
This commit is contained in:
parent
a26c69d11d
commit
e57b2091aa
16 changed files with 77 additions and 92 deletions
|
@ -944,7 +944,8 @@ export default async function getBaseWebpackConfig(
|
|||
new ProfilingPlugin({
|
||||
tracer,
|
||||
}),
|
||||
config.experimental.modern &&
|
||||
!isWebpack5 &&
|
||||
config.experimental.modern &&
|
||||
!isServer &&
|
||||
!dev &&
|
||||
(() => {
|
||||
|
|
|
@ -102,6 +102,7 @@ export class DropClientPage implements Plugin {
|
|||
// @ts-ignore TODO: webpack 5 types
|
||||
const module = compilation.moduleGraph.getModule(dependency)
|
||||
if (module?.buildInfo?.NEXT_ampFirst) {
|
||||
ampFirstEntryNamesItem.push(name)
|
||||
// @ts-ignore @types/webpack has outdated types for webpack 5
|
||||
compilation.entries.delete(name)
|
||||
}
|
||||
|
|
|
@ -41,7 +41,11 @@ async function tryApplyUpdates() {
|
|||
const res = await fetch(`${hotUpdatePath}${curHash}.hot-update.json`)
|
||||
const jsonData = await res.json()
|
||||
const curPage = page === '/' ? 'index' : page
|
||||
const pageUpdated = Object.keys(jsonData.c).some((mod) => {
|
||||
// webpack 5 uses an array instead
|
||||
const pageUpdated = (Array.isArray(jsonData.c)
|
||||
? jsonData.c
|
||||
: Object.keys(jsonData.c)
|
||||
).some((mod) => {
|
||||
return (
|
||||
mod.indexOf(
|
||||
`pages${curPage.substr(0, 1) === '/' ? curPage : `/${curPage}`}`
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
// @ts-ignore exists in webpack 5
|
||||
RuntimeGlobals,
|
||||
version,
|
||||
// @ts-ignore exists in webpack 5
|
||||
compilation as Compilation,
|
||||
} from 'webpack'
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
import { loader } from 'webpack'
|
||||
import {
|
||||
// @ts-ignore exists in webpack 5
|
||||
loader,
|
||||
} from 'webpack'
|
||||
import RefreshModuleRuntime from './internal/ReactRefreshModule.runtime'
|
||||
|
||||
let refreshModuleRuntime = RefreshModuleRuntime.toString()
|
||||
|
|
|
@ -172,7 +172,8 @@ describe('CSS Module client-side navigation in Production', () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe('CSS Module client-side navigation in Production (Modern)', () => {
|
||||
// TODO: Make webpack 5 work with nest-esm-plugin
|
||||
describe.skip('CSS Module client-side navigation in Production (Modern)', () => {
|
||||
const appDir = join(fixturesDir, 'multi-module-modern')
|
||||
|
||||
beforeAll(async () => {
|
||||
|
|
|
@ -519,7 +519,8 @@ function runTests(dev) {
|
|||
}
|
||||
})
|
||||
} else {
|
||||
it('should output modern bundles with dynamic route correctly', async () => {
|
||||
// TODO: Make webpack 5 work with nest-esm-plugin
|
||||
it.skip('should output modern bundles with dynamic route correctly', async () => {
|
||||
const buildManifest = require(join('../.next', 'build-manifest.json'))
|
||||
|
||||
const files = buildManifest.pages[
|
||||
|
|
|
@ -5,12 +5,19 @@ import { findPort, killApp, launchApp, nextBuild } from 'next-test-utils'
|
|||
import webdriver from 'next-webdriver'
|
||||
import { recursiveReadDir } from 'next/dist/lib/recursive-readdir'
|
||||
import { join } from 'path'
|
||||
import { version } from 'webpack'
|
||||
|
||||
const isWebpack5 = parseInt(version) === 5
|
||||
|
||||
jest.setTimeout(1000 * 60 * 1)
|
||||
|
||||
const appDir = join(__dirname, '../')
|
||||
|
||||
describe('Legacy Sass Support Should Disable New CSS', () => {
|
||||
// TODO: Make legacy Sass support work with webpack 5
|
||||
const describeFn = isWebpack5 ? describe.skip : describe
|
||||
|
||||
// TODO: Make legacy Sass support work with webpack 5
|
||||
describeFn('Legacy Sass Support Should Disable New CSS', () => {
|
||||
beforeAll(async () => {
|
||||
await remove(join(appDir, '.next'))
|
||||
await nextBuild(appDir)
|
||||
|
@ -26,7 +33,7 @@ describe('Legacy Sass Support Should Disable New CSS', () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe('Legacy Sass Support should work in development', () => {
|
||||
describeFn('Legacy Sass Support should work in development', () => {
|
||||
beforeAll(async () => {
|
||||
await remove(join(appDir, '.next'))
|
||||
})
|
||||
|
|
|
@ -19,7 +19,8 @@ let appDir = join(__dirname, '..')
|
|||
let server
|
||||
let appPort
|
||||
|
||||
describe('Modern Mode', () => {
|
||||
// TODO: Make webpack 5 work with nest-esm-plugin
|
||||
describe.skip('Modern Mode', () => {
|
||||
beforeAll(async () => {
|
||||
await runNextCommand(['build'], {
|
||||
cwd: appDir,
|
||||
|
|
|
@ -15,7 +15,7 @@ jest.setTimeout(1000 * 60 * 3)
|
|||
const appDir = join(__dirname, '../')
|
||||
|
||||
describe('no duplicate compile error output', () => {
|
||||
it('show not show compile error on page refresh', async () => {
|
||||
it('should not show compile error on page refresh', async () => {
|
||||
let stdout = ''
|
||||
let stderr = ''
|
||||
|
||||
|
|
|
@ -7,7 +7,8 @@ const appDir = join(__dirname, '../')
|
|||
const profileEventsPath = join(appDir, '.next', 'profile-events.json')
|
||||
jest.setTimeout(1000 * 60 * 5)
|
||||
|
||||
describe('Profiling Usage', () => {
|
||||
// TODO: Make profiling experimental flag work with webpack 5
|
||||
describe.skip('Profiling Usage', () => {
|
||||
beforeAll(async () => {
|
||||
// Delete file if it already exists
|
||||
if (await fs.existsSync(profileEventsPath))
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
experimental: { modern: true },
|
||||
}
|
|
@ -1,2 +1,2 @@
|
|||
// Below type error is intentional, it helps check typescript → ignoreDevErrors / ignoreBuildErrors flags in next.config.js
|
||||
// Below type error is intentional, it helps check typescript → ignoreBuildErrors flags in next.config.js
|
||||
export default (): boolean => 'Index page'
|
||||
|
|
|
@ -1,14 +1,7 @@
|
|||
/* eslint-env jest */
|
||||
|
||||
import { join } from 'path'
|
||||
import {
|
||||
renderViaHTTP,
|
||||
nextBuild,
|
||||
findPort,
|
||||
launchApp,
|
||||
killApp,
|
||||
File,
|
||||
} from 'next-test-utils'
|
||||
import { nextBuild, File } from 'next-test-utils'
|
||||
|
||||
jest.setTimeout(1000 * 60 * 2)
|
||||
|
||||
|
@ -18,71 +11,40 @@ const nextConfigFile = new File(join(appDir, 'next.config.js'))
|
|||
describe('TypeScript with error handling options', () => {
|
||||
// Dev can no longer show errors (for now), logbox will cover this in the
|
||||
// future.
|
||||
for (const ignoreDevErrors of [/*false,*/ true]) {
|
||||
for (const ignoreBuildErrors of [false, true]) {
|
||||
describe(`ignoreDevErrors: ${ignoreDevErrors}, ignoreBuildErrors: ${ignoreBuildErrors}`, () => {
|
||||
beforeAll(() => {
|
||||
const nextConfig = {
|
||||
experimental: { modern: true },
|
||||
typescript: { ignoreDevErrors, ignoreBuildErrors },
|
||||
}
|
||||
nextConfigFile.write('module.exports = ' + JSON.stringify(nextConfig))
|
||||
})
|
||||
afterAll(() => {
|
||||
nextConfigFile.restore()
|
||||
})
|
||||
|
||||
it(
|
||||
ignoreDevErrors
|
||||
? 'Next renders the page in dev despite type errors'
|
||||
: 'Next dev does not render the page in dev because of type errors',
|
||||
async () => {
|
||||
let app
|
||||
let output = ''
|
||||
try {
|
||||
const appPort = await findPort()
|
||||
app = await launchApp(appDir, appPort, {
|
||||
onStdout: (msg) => (output += msg),
|
||||
onStderr: (msg) => (output += msg),
|
||||
})
|
||||
await renderViaHTTP(appPort, '')
|
||||
|
||||
if (ignoreDevErrors) {
|
||||
expect(output).not.toContain('waiting for typecheck results...')
|
||||
expect(output).not.toContain("not assignable to type 'boolean'")
|
||||
} else {
|
||||
expect(output).toContain('waiting for typecheck results...')
|
||||
expect(output).toContain("not assignable to type 'boolean'")
|
||||
}
|
||||
} finally {
|
||||
await killApp(app)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
it(
|
||||
ignoreBuildErrors
|
||||
? 'Next builds the application despite type errors'
|
||||
: 'Next fails to build the application despite type errors',
|
||||
async () => {
|
||||
const { stdout, stderr } = await nextBuild(appDir, [], {
|
||||
stdout: true,
|
||||
stderr: true,
|
||||
})
|
||||
|
||||
if (ignoreBuildErrors) {
|
||||
expect(stdout).toContain('Compiled successfully')
|
||||
expect(stderr).not.toContain('Failed to compile.')
|
||||
expect(stderr).not.toContain("not assignable to type 'boolean'")
|
||||
} else {
|
||||
expect(stdout).not.toContain('Compiled successfully')
|
||||
expect(stderr).toContain('Failed to compile.')
|
||||
expect(stderr).toContain('./pages/index.tsx:2:31')
|
||||
expect(stderr).toContain("not assignable to type 'boolean'")
|
||||
}
|
||||
}
|
||||
)
|
||||
for (const ignoreBuildErrors of [false, true]) {
|
||||
describe(`ignoreBuildErrors: ${ignoreBuildErrors}`, () => {
|
||||
beforeAll(() => {
|
||||
const nextConfig = {
|
||||
typescript: { ignoreBuildErrors },
|
||||
}
|
||||
nextConfigFile.write('module.exports = ' + JSON.stringify(nextConfig))
|
||||
})
|
||||
}
|
||||
afterAll(() => {
|
||||
nextConfigFile.restore()
|
||||
})
|
||||
|
||||
it(
|
||||
ignoreBuildErrors
|
||||
? 'Next builds the application despite type errors'
|
||||
: 'Next fails to build the application despite type errors',
|
||||
async () => {
|
||||
const { stdout, stderr } = await nextBuild(appDir, [], {
|
||||
stdout: true,
|
||||
stderr: true,
|
||||
})
|
||||
|
||||
if (ignoreBuildErrors) {
|
||||
expect(stdout).toContain('Compiled successfully')
|
||||
expect(stderr).not.toContain('Failed to compile.')
|
||||
expect(stderr).not.toContain("not assignable to type 'boolean'")
|
||||
} else {
|
||||
expect(stdout).not.toContain('Compiled successfully')
|
||||
expect(stderr).toContain('Failed to compile.')
|
||||
expect(stderr).toContain('./pages/index.tsx:2:31')
|
||||
expect(stderr).toContain("not assignable to type 'boolean'")
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
|
|
@ -9,7 +9,8 @@ const context = {}
|
|||
|
||||
jest.setTimeout(1000 * 60 * 2)
|
||||
|
||||
describe('Web Workers with Fast Refresh', () => {
|
||||
// TODO: Upgrade worker-loader when it's published with webpack 5 support
|
||||
describe.skip('Web Workers with Fast Refresh', () => {
|
||||
beforeAll(async () => {
|
||||
context.appPort = await findPort()
|
||||
context.server = await launchApp(appDir, context.appPort)
|
||||
|
|
|
@ -24,7 +24,7 @@ export function initNextServerScript(
|
|||
opts
|
||||
) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const instance = spawn('node', [scriptPath], { env })
|
||||
const instance = spawn('node', ['--no-deprecation', scriptPath], { env })
|
||||
|
||||
function handleStdout(data) {
|
||||
const message = data.toString()
|
||||
|
@ -99,7 +99,7 @@ export function runNextCommand(argv, options = {}) {
|
|||
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log(`Running command "next ${argv.join(' ')}"`)
|
||||
const instance = spawn('node', [nextBin, ...argv], {
|
||||
const instance = spawn('node', ['--no-deprecation', nextBin, ...argv], {
|
||||
...options.spawnOptions,
|
||||
cwd,
|
||||
env,
|
||||
|
@ -159,7 +159,11 @@ export function runNextCommandDev(argv, stdOut, opts = {}) {
|
|||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const instance = spawn('node', ['dist/bin/next', ...argv], { cwd, env })
|
||||
const instance = spawn(
|
||||
'node',
|
||||
['--no-deprecation', 'dist/bin/next', ...argv],
|
||||
{ cwd, env }
|
||||
)
|
||||
let didResolve = false
|
||||
|
||||
function handleStdout(data) {
|
||||
|
@ -246,7 +250,7 @@ export function buildTS(args = [], cwd, env = {}) {
|
|||
return new Promise((resolve, reject) => {
|
||||
const instance = spawn(
|
||||
'node',
|
||||
[require.resolve('typescript/lib/tsc'), ...args],
|
||||
['--no-deprecation', require.resolve('typescript/lib/tsc'), ...args],
|
||||
{ cwd, env }
|
||||
)
|
||||
let output = ''
|
||||
|
|
Loading…
Reference in a new issue