import { transform } from '@babel/core'; import dedent from 'dedent'; function runPlugin( code: string, opts: { cwd: string; plugins?: any[]; filename: string }, ) { const res = transform(dedent`${code}`, { babelrc: false, sourceType: 'module', presets: [ [ require.resolve('@umijs/deps/compiled/babel/preset-react'), { development: true, }, ], ], plugins: [[require.resolve('./index')]], ...opts, }); if (!res) { throw new Error('plugin failed'); } return res; } test('normal arrow function', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/index.tsx', }; expect( runPlugin( ` export default () => { return
Hello
; }; `, opts, ).code, ).toEqual( runPlugin( ` const SrcIndex = () => { returnHello
; }; export default SrcIndex; `, { ...opts, plugins: [] }, ).code, ); // change filename const componentOpts = { cwd: '/a/b/c', filename: '/a/b/c/components/About.tsx', }; expect( runPlugin( ` export default () => { returnHello
; }; `, componentOpts, ).code, ).toEqual( runPlugin( ` const ComponentsAbout = () => { returnHello
; }; export default ComponentsAbout; `, { ...componentOpts, plugins: [] }, ).code, ); }); test('HOC not support', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/index.tsx', }; expect( runPlugin( ` import { connect } from 'dva'; export default connect()(() => { returnHello
; }); `, opts, ).code, ).toEqual( runPlugin( ` import { connect } from 'dva'; export default connect()(() => { returnHello
; }); `, { ...opts, plugins: [] }, ).code, ); }); test('normal anonymous function', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/index.tsx', }; expect( runPlugin( ` export default function () { returnHello
; }; `, opts, ).code, ).toEqual( runPlugin( ` export default function SrcIndex() { returnHello
; }; `, { ...opts, plugins: [] }, ).code, ); }); test('conflict declaration anonymous arrow function', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/index.tsx', }; expect( runPlugin( ` function SrcIndex() {} export default () => { returnHello
; }; `, opts, ).code, ).toEqual( runPlugin( ` function SrcIndex() {} const SrcIndex0 = () => { returnHello
; }; export default SrcIndex0; `, { ...opts, plugins: [] }, ).code, ); }); test('conflict declaration anonymous function', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/index.tsx', }; expect( runPlugin( ` function SrcIndex() {} export default function () { returnHello
; }; `, opts, ).code, ).toEqual( runPlugin( ` function SrcIndex() {} export default function SrcIndex0() { returnHello
; }; `, { ...opts, plugins: [] }, ).code, ); }); test('no valid path', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/node_modules/antd/index.tsx', }; const source = ` export default () => { returnHello
; }; `; expect(runPlugin(source, opts).code).toEqual( runPlugin(source, { ...opts, plugins: [] }).code, ); }); test('normal arrow function dynamic path', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/pages/[id].tsx', }; expect( runPlugin( ` export default () => { returnHello
; }; `, opts, ).code, ).toEqual( runPlugin( ` const SrcPagesId = () => { returnHello
; }; export default SrcPagesId; `, { ...opts, plugins: [] }, ).code, ); }); test('with chinese name', () => { const opts = { cwd: '/a/b/c', filename: '/a/b/c/src/pages/主页.tsx', }; expect( runPlugin( ` export default () => { returnHello
; }; `, opts, ).code, ).toEqual( runPlugin( ` const SrcPages = () => { returnHello
; }; export default SrcPages; `, { ...opts, plugins: [] }, ).code, ); });