rsnext/test/unit/next-babel-loader-dev.test.ts
Balázs Orbán 33db463fe4
chore: upgrade jest (#56909)
### What?

Upgrade jest to its latest version

### Why?

#56899 fails because historically Jest stripped the globals in Node.js, but 28+ isn't doing that anymore. If we upgrade, we don't have to keep track of Node.js globals and when they are added. This will be useful in removing even more polyfills for things that are natively shipped in Node.js now.

### How?

Jest 29 introduced a change to the snapshot format: https://jestjs.io/blog/2022/08/25/jest-29

First, I tried setting the old compat option to not require updating snapshots, but some tests were still failing: https://dev.azure.com/nextjs/next.js/_build/results?buildId=70633&view=logs&j=8af7cf9c-43a1-584d-6f5c-57bad8880974&t=7ae70e63-3625-50f4-6764-5b3e72b4bd7a&l=273 So going through the pain now instead.
2023-10-19 17:38:24 +00:00

114 lines
3 KiB
TypeScript

/* eslint-env jest */
import os from 'os'
import path from 'path'
import { Span } from 'next/dist/trace'
import loader from 'next/dist/build/babel/loader'
const dir = path.resolve(os.tmpdir())
const babel = async (code: string, queryOpts = {} as any) => {
const { isServer = false, resourcePath = `index.js` } = queryOpts
let isAsync = false
const options = {
// loader opts
cwd: dir,
isServer,
distDir: path.resolve(dir, '.next'),
pagesDir:
'pagesDir' in queryOpts ? queryOpts.pagesDir : path.resolve(dir, 'pages'),
cache: false,
development: true,
hasReactRefresh: !isServer,
}
return new Promise<string>((resolve, reject) => {
function callback(err, content) {
if (err) {
reject(err)
} else {
resolve(content.replace(/\n/g, ''))
}
}
const res = loader.bind({
resourcePath,
async() {
isAsync = true
return callback
},
callback,
emitWarning() {},
query: options,
getOptions: function () {
return options
},
currentTraceSpan: new Span({ name: 'test' }),
})(code, null)
if (!isAsync) {
resolve(res)
}
})
}
describe('next-babel-loader', () => {
describe('replace constants', () => {
it('should replace NODE_ENV on client (dev)', async () => {
const code = await babel(`process.env.NODE_ENV`, {
isServer: false,
})
expect(code).toMatchInlineSnapshot(`""development";"`)
})
it('should replace NODE_ENV in statement (dev)', async () => {
const code = await babel(`if (process.env.NODE_ENV === 'development') {}`)
expect(code).toMatchInlineSnapshot(`"if (true) {}"`)
})
it('should support 9.4 regression', async () => {
const pageFile = path.resolve(dir, 'pages', 'index.js')
const output = await babel(
`
import React from "react";
import queryGraphql from "../graphql/schema";
const gql = String.raw;
export default function Home({ greeting }) {
return <h1>{greeting}</h1>;
}
export async function getStaticProps() {
const greeting = await getGreeting();
return {
props: {
greeting,
},
};
}
async function getGreeting() {
const result = await queryGraphql(
gql\`
{
query {
greeting
}
}
\`
);
return result.data.greeting;
}
`,
{ resourcePath: pageFile, isServer: false }
)
expect(output).toContain(
`var __jsx = React.createElement;import React from "react";export var __N_SSG = true;export default function Home(_ref) { var greeting = _ref.greeting; return __jsx("h1", { __self: this, __source: { fileName: _jsxFileName, lineNumber: 8, columnNumber: 20 } }, greeting);}_c = Home;var _c;$RefreshReg$(_c, "Home");`
)
})
})
})