Skip to content

Commit

Permalink
Add experimental flag to force SWC transforms (#36789)
Browse files Browse the repository at this point in the history
fixes #36763
fixes #36590

## Feature

- [x] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR.
   - It hasn't been accepted for implementation, although that process isn't clear, and this is a pretty trivial fix.
- [x] Related issues linked using `fixes #number`
- [x] Integration tests added
- [x] Documentation added
- [ ] Telemetry added. In case of a feature if it's used or not.
   - This is somewhat inherent in the error log
- [x] Errors have helpful link attached, see `contributing.md`

## Documentation / Examples

- [x] Make sure the linting passes by running `yarn lint`
  • Loading branch information
erikbrinkman committed May 10, 2022
1 parent 7d52589 commit c7b2083
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 1 deletion.
13 changes: 13 additions & 0 deletions errors/swc-disabled.md
Expand Up @@ -13,3 +13,16 @@ Many of the integrations with external libraries that currently require custom B
- Emotion

In order to prioritize transforms that will help you adopt SWC please provide your `.babelrc` on [the feedback thread](https://github.com/vercel/next.js/discussions/30174).

#### Possible Ways to Fix It

If you want to use SWC despite the presence of a `.babelrc` file you can force it in your `next.config.js` file.

```js
// next.config.js
module.exports = {
experimental: {
forceSwcTransforms: true,
},
}
```
2 changes: 1 addition & 1 deletion packages/next/build/webpack-config.ts
Expand Up @@ -411,7 +411,7 @@ export default async function getBaseWebpackConfig(

const distDir = path.join(dir, config.distDir)

let useSWCLoader = !babelConfigFile
let useSWCLoader = !babelConfigFile || config.experimental.forceSwcTransforms
let SWCBinaryTarget: [Feature, boolean] | undefined = undefined
if (useSWCLoader) {
// TODO: we do not collect wasm target yet
Expand Down
2 changes: 2 additions & 0 deletions packages/next/server/config-shared.ts
Expand Up @@ -135,6 +135,7 @@ export interface ExperimentalConfig {
}
>
swcTraceProfiling?: boolean
forceSwcTransforms?: boolean
}

/**
Expand Down Expand Up @@ -505,6 +506,7 @@ export const defaultConfig: NextConfig = {
layoutRaw: false,
remotePatterns: [],
},
forceSwcTransforms: false,
},
}

Expand Down
68 changes: 68 additions & 0 deletions test/e2e/swc-warnings/index.test.ts
@@ -0,0 +1,68 @@
import { createNext } from 'e2e-utils'
import { NextInstance } from 'test/lib/next-modes/base'
import { renderViaHTTP } from 'next-test-utils'

describe('swc warnings by default', () => {
let next: NextInstance

beforeAll(async () => {
next = await createNext({
files: {
'pages/index.js': `
export default function Page() {
return <p>hello world</p>
}
`,
'.babelrc': `
{
"presets": ["next/babel"]
}
`,
},
dependencies: {},
})
})
afterAll(() => next.destroy())

it('should have warning', async () => {
await renderViaHTTP(next.url, '/')
expect(next.cliOutput).toContain(
'Disabled SWC as replacement for Babel because of custom Babel configuration'
)
})
})

describe('can force swc', () => {
let next: NextInstance

beforeAll(async () => {
next = await createNext({
nextConfig: {
experimental: {
forceSwcTransforms: true,
},
},
files: {
'pages/index.js': `
export default function Page() {
return <p>hello world</p>
}
`,
'.babelrc': `
{
"presets": ["next/babel"]
}
`,
},
dependencies: {},
})
})
afterAll(() => next.destroy())

it('should not have warning', async () => {
await renderViaHTTP(next.url, '/')
expect(next.cliOutput).not.toContain(
'Disabled SWC as replacement for Babel because of custom Babel configuration'
)
})
})

0 comments on commit c7b2083

Please sign in to comment.