ed1a9450f0
* Disable SSG Transform on Non-SSG Pages * correct test
335 lines
9.7 KiB
JavaScript
335 lines
9.7 KiB
JavaScript
/* eslint-env jest */
|
|
import { transform } from '@babel/core'
|
|
|
|
const trim = s =>
|
|
s
|
|
.join('\n')
|
|
.trim()
|
|
.replace(/^\s+/gm, '')
|
|
|
|
// avoid generating __source annotations in JSX during testing:
|
|
const NODE_ENV = process.env.NODE_ENV
|
|
process.env.NODE_ENV = 'production'
|
|
const plugin = require('next/dist/build/babel/plugins/next-ssg-transform')
|
|
process.env.NODE_ENV = NODE_ENV
|
|
|
|
const babel = (code, esm = true, pluginOptions = {}) =>
|
|
transform(code, {
|
|
filename: 'noop.js',
|
|
presets: [['@babel/preset-react', { development: false, pragma: '__jsx' }]],
|
|
plugins: [[plugin, pluginOptions]],
|
|
babelrc: false,
|
|
configFile: false,
|
|
sourceType: 'module',
|
|
compact: true,
|
|
caller: {
|
|
name: 'tests',
|
|
supportsStaticESM: esm,
|
|
},
|
|
}).code
|
|
|
|
describe('babel plugin (next-ssg-transform)', () => {
|
|
describe('getStaticProps support', () => {
|
|
it('should remove separate named export specifiers', () => {
|
|
const output = babel(trim`
|
|
export { unstable_getStaticPaths } from '.'
|
|
export { a as unstable_getStaticProps } from '.'
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove combined named export specifiers', () => {
|
|
const output = babel(trim`
|
|
export { unstable_getStaticPaths, a as unstable_getStaticProps } from '.'
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should retain extra named export specifiers', () => {
|
|
const output = babel(trim`
|
|
export { unstable_getStaticPaths, a as unstable_getStaticProps, foo, bar as baz } from '.'
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"export{foo,bar as baz}from'.';const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove named export function declarations', () => {
|
|
const output = babel(trim`
|
|
export function unstable_getStaticPaths() {
|
|
return []
|
|
}
|
|
|
|
export function unstable_getStaticProps() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove named export function declarations (async)', () => {
|
|
const output = babel(trim`
|
|
export async function unstable_getStaticPaths() {
|
|
return []
|
|
}
|
|
|
|
export async function unstable_getStaticProps() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should not remove extra named export function declarations', () => {
|
|
const output = babel(trim`
|
|
export function unstable_getStaticProps() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export function Noop() {}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"export function Noop(){}const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove named export variable declarations', () => {
|
|
const output = babel(trim`
|
|
export const unstable_getStaticPaths = () => {
|
|
return []
|
|
}
|
|
|
|
export const unstable_getStaticProps = function() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove named export variable declarations (async)', () => {
|
|
const output = babel(trim`
|
|
export const unstable_getStaticPaths = async () => {
|
|
return []
|
|
}
|
|
|
|
export const unstable_getStaticProps = async function() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should not remove extra named export variable declarations', () => {
|
|
const output = babel(trim`
|
|
export const unstable_getStaticPaths = () => {
|
|
return []
|
|
}, foo = 2
|
|
|
|
export const unstable_getStaticProps = function() {
|
|
return { props: {} }
|
|
}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"export const foo=2;const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove re-exported variable declarations', () => {
|
|
const output = babel(trim`
|
|
const unstable_getStaticPaths = () => {
|
|
return []
|
|
}
|
|
|
|
export { unstable_getStaticPaths }
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove re-exported variable declarations (safe)', () => {
|
|
const output = babel(trim`
|
|
const unstable_getStaticPaths = () => {
|
|
return []
|
|
}, a = 2
|
|
|
|
export { unstable_getStaticPaths }
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const a=2;const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should remove re-exported function declarations', () => {
|
|
const output = babel(trim`
|
|
function unstable_getStaticPaths() {
|
|
return []
|
|
}
|
|
|
|
export { unstable_getStaticPaths }
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should not crash for class declarations', () => {
|
|
const output = babel(trim`
|
|
function unstable_getStaticPaths() {
|
|
return []
|
|
}
|
|
|
|
export { unstable_getStaticPaths }
|
|
|
|
export class MyClass {}
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"export class MyClass{}const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it(`should remove re-exported function declarations' dependents (variables, functions, imports)`, () => {
|
|
const output = babel(trim`
|
|
import keep_me from 'hello'
|
|
import {keep_me2} from 'hello2'
|
|
import * as keep_me3 from 'hello3'
|
|
|
|
import drop_me from 'bla'
|
|
import { drop_me2 } from 'foo'
|
|
import { drop_me3, but_not_me } from 'bar'
|
|
import * as remove_mua from 'hehe'
|
|
|
|
var leave_me_alone = 1;
|
|
function dont_bug_me_either() {}
|
|
|
|
const inceptionVar = 'hahaa';
|
|
var var1 = 1;
|
|
let var2 = 2;
|
|
const var3 = inceptionVar + remove_mua;
|
|
|
|
function inception1() {var2;drop_me2;}
|
|
|
|
function abc() {}
|
|
const b = function() {var3;drop_me3;};
|
|
const b2 = function apples() {};
|
|
const bla = () => {inception1};
|
|
|
|
function unstable_getStaticProps() {
|
|
abc();
|
|
drop_me;
|
|
b;
|
|
b2;
|
|
bla();
|
|
return { props: {var1} }
|
|
}
|
|
|
|
export { unstable_getStaticProps }
|
|
|
|
export default function Test() {
|
|
return <div />
|
|
}
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"import keep_me from'hello';import{keep_me2}from'hello2';import*as keep_me3 from'hello3';import{but_not_me}from'bar';var leave_me_alone=1;function dont_bug_me_either(){}const __NEXT_COMP=function Test(){return __jsx(\\"div\\",null);};__NEXT_COMP.__NEXT_SPR=true export default __NEXT_COMP;"`
|
|
)
|
|
})
|
|
|
|
it('should not mix up bindings', () => {
|
|
const output = babel(trim`
|
|
function Function1() {
|
|
return {
|
|
a: function bug(a) {
|
|
return 2;
|
|
}
|
|
};
|
|
}
|
|
|
|
function Function2() {
|
|
var bug = 1;
|
|
return { bug };
|
|
}
|
|
|
|
export { unstable_getStaticProps } from 'a'
|
|
`)
|
|
|
|
expect(output).toMatchInlineSnapshot(
|
|
`"function Function1(){return{a:function bug(a){return 2;}};}function Function2(){var bug=1;return{bug};}"`
|
|
)
|
|
})
|
|
})
|
|
})
|