to-esx
Version:
Converts JSX and `React.createElement` into [esx](https://github.com/esxjs/esx)
1,530 lines (1,430 loc) • 75.3 kB
JavaScript
'use strict'
const { test, only } = require('tap')
const { readFileSync } = require('fs')
const { join } = require('path')
const toEsx = require('..')
const check = require('./check')
const convert = (source) => {
const result = toEsx(source)
// check(result)
return result
}
test.only = only
test('empty files are left unmodified', async ({ is }) => {
is(convert(``), ``)
})
test('includes if react is loaded', async ({ is }) => {
is(convert(`import React from 'react'`), `const esx = require('esx')();\nimport React from 'react'`)
is(convert(`const React = require('react')`), `const esx = require('esx')();\nconst React = require('react')`)
is(convert(`import React from 'react';`), `const esx = require('esx')();\nimport React from 'react';`)
is(convert(`const React = require('react');`), `const esx = require('esx')();\nconst React = require('react');`)
})
test('includes if react-dom/server is loaded', async ({ is }) => {
is(convert(`import ReactDomServer from 'react-dom/server'`), `const esx = require('esx')();\nimport ReactDomServer from 'react-dom/server'`)
is(convert(`const ReactDomServer = require('react-dom/server')`), `const esx = require('esx')();\nconst ReactDomServer = require('react-dom/server')`)
})
test('does not include unless react or react-dom/server are loaded', async ({ is }) => {
is(convert(`'use strict'`), `'use strict'`)
is(convert(`'use strict';`), `'use strict';`)
})
test('JSX basic', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX basic - semi-colons', async ({ is }) => {
const src = [
`const React = require('react');`,
'module.exports = () => (<div><p>hi</p></div>);'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react');`,
'module.exports = () => esx `<div><p>hi</p></div>`;'
].join('\n')
is(convert(src), esx)
})
test('JSX basic - no parens', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => <div><p>hi</p></div>'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX basic - no parens, semi-colons', async ({ is }) => {
const src = [
`const React = require('react');`,
'module.exports = () => <div><p>hi</p></div>;'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react');`,
'module.exports = () => esx `<div><p>hi</p></div>`;'
].join('\n')
is(convert(src), esx)
})
test('JSX basic - multiline', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (',
' <div><p>hi</p></div>',
')'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `',
' <div><p>hi</p></div>',
'`'
].join('\n')
is(convert(src), esx)
})
test('JSX basic - multiline, semi-colon', async ({ is }) => {
const src = [
`const React = require('react');`,
'module.exports = () => (',
' <div><p>hi</p></div>',
');'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react');`,
'module.exports = () => esx `',
' <div><p>hi</p></div>',
'`;'
].join('\n')
is(convert(src), esx)
})
test('JSX child expression', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div>{42}</div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div>${42}</div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX attr expression', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div attr={42}></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div attr=${42}></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX attr spread props', async ({ is }) => {
const src = [
`const React = require('react')`,
`const props = {a:1, b:2}`,
'module.exports = () => (<div {...props}></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const props = {a:1, b:2}`,
'module.exports = () => esx `<div ...${props}></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX component registration – function', async ({ is }) => {
const src = [
`const React = require('react')`,
`const Foo = require('./foo')`,
'module.exports = () => (<div><Foo>hi</Foo></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const Foo = require('./foo')`,
'esx.register({ Foo });',
'module.exports = () => esx `<div><Foo>hi</Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX registration of components via member expression', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
'module.exports = () => (<div><o.Foo>hi</o.Foo></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`esx.register({ "o.Foo": o.Foo });`,
'module.exports = () => esx `<div><o.Foo>hi</o.Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX registration of components via member expression multilevel', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
'module.exports = () => (<div><o.x.Foo>hi</o.x.Foo></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
`esx.register({ "o.x.Foo": o.x.Foo });`,
'module.exports = () => esx `<div><o.x.Foo>hi</o.x.Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX multiple levels of component registration', async ({ is }) => {
const src = [
`const lib = require('./lib')`,
`const React = require('react')`,
'const Bar = ({children}) => (<div>{children}</div>)',
'const Foo = ({val}) => (<Bar>{val}</Bar>)',
'module.exports = (props) => (<div><Foo val={props.val}/></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const lib = require('./lib')`,
`const React = require('react')`,
'const Bar = ({children}) => esx `<div>${children}</div>`',
'esx.register({ Bar });',
'const Foo = ({val}) => esx `<Bar>${val}</Bar>`',
'esx.register({ Foo });',
'module.exports = (props) => esx `<div><Foo val=${props.val}/></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX multiple levels of component registration (import)', async ({ is }) => {
const src = [
`import lib from 'lib'`,
`import React from 'react'`,
'const Bar = ({children}) => (<div>{children}</div>)',
'const Foo = ({val}) => (<Bar>{val}</Bar>)',
'module.exports = (props) => (<div><Foo val={props.val}/></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import lib from 'lib'`,
`import React from 'react'`,
'const Bar = ({children}) => esx `<div>${children}</div>`',
'esx.register({ Bar });',
'const Foo = ({val}) => esx `<Bar>${val}</Bar>`',
'esx.register({ Foo });',
'module.exports = (props) => esx `<div><Foo val=${props.val}/></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX registration of nested component tree', async ({ is }) => {
const src = [
'const React = require("react")',
'const A = require("A")',
'const B = require("B")',
'function AppShell () {',
' return <A><B/></A>',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'const A = require("A")',
'const B = require("B")',
'esx.register({ A, B });',
'function AppShell () {',
' return esx `<A><B/></A>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('JSX inline registration', async ({ is }) => {
const src = [
'const React = require("react")',
'function AppShell (props) {',
' const { Component } = props',
' return <Component/>',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'function AppShell (props) {',
' const { Component } = props',
' return esx._r("Component", Component) `<Component/>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('JSX multiple inline components registration', async ({ is }) => {
const src = [
'const React = require("react")',
'function AppShell (props) {',
' const { A, B } = props',
' return <div><A/><B/></div>',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'function AppShell (props) {',
' const { A, B } = props',
' return esx._r("A", A)._r("B", B) `<div><A/><B/></div>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('JSX registration of destructured assignment', async ({ is }) => {
const src = [
'const React = require("react")',
'function AppShell (props) {',
' const { component: Component } = props',
' return <Component/>',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'function AppShell (props) {',
' const { component: Component } = props',
' return esx._r("Component", Component) `<Component/>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('JSX inlined interpolated template string expression', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div attr={`${4}${2}`}></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div attr=${`${4}${2}`}></div>`'
].join('\n')
is(convert(src), esx)
})
test('JSX fragment', async ({ is }) => {
const src = [
`const { createElement } = require('react')`,
`const App = () => (<>`,
` <div>hi</div>`,
` <div>hi2</div>`,
`</>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { createElement } = require('react')`,
'const App = () => esx `<>',
' <div>hi</div>',
' <div>hi2</div>',
'</>`'
].join('\n')
is(convert(src), esx)
})
test('createElement minimum basic', async ({ is }) => {
const src = [
`const React = require('react')`,
`React.createElement('div', null, React.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement var assignment basic', async ({ is }) => {
const src = [
`const React = require('react')`,
`const el = React.createElement('div', null, React.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'const el = esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement property assignment basic', async ({ is }) => {
const src = [
`const React = require('react')`,
`const els = {}`,
`els.el = React.createElement('div', null, React.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const els = {}`,
'els.el = esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement pure function basic', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = () => React.createElement('div', null, React.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement basic - semi-colons', async ({ is }) => {
const src = [
`const React = require('react');`,
`module.exports = () => React.createElement('div', null, React.createElement('p', null, 'hi'));`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react');`,
'module.exports = () => esx `<div><p>hi</p></div>`;'
].join('\n')
is(convert(src), esx)
})
test('createElement self closing / zero children', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = () => React.createElement('img')`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<img/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement hardcoded props', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = () => React.createElement('img', {a: 42, b: 'test'})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<img a="42" b="test"/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement literal key props', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = () => React.createElement('img', {"a-b": 42, "b": 'test'})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<img a-b="42" b="test"/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement hardcoded boolean props', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = () => React.createElement('img', {attr: true})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<img attr=${true}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced props variable', async ({ is }) => {
const src = [
`const React = require('react')`,
`const val = 42`,
`module.exports = () => React.createElement('img', {attr: val})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const val = 42`,
'module.exports = () => esx `<img attr=${val}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced props property accessor', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = (props) => React.createElement('img', {attr: props.val})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = (props) => esx `<img attr=${props.val}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced props object, param reference', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = (props) => React.createElement('img', props)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = (props) => esx `<img ...${props}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced props object from property accessor', async ({ is }) => {
const src = [
`const React = require('react')`,
`module.exports = (props) => React.createElement('img', props.data)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = (props) => esx `<img ...${props.data}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced props object from function call', async ({ is }) => {
const src = [
`const React = require('react')`,
`const getProps = () => { return {a: 1} }`,
`module.exports = () => React.createElement('img', getProps())`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const getProps = () => { return {a: 1} }`,
'module.exports = () => esx `<img ...${getProps()}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced children as param', async ({ is }) => {
const src = [
`const React = require('react')`,
'const val = 42',
`module.exports = () => React.createElement('div', null, val)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'const val = 42',
'module.exports = () => esx `<div>${val}</div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement referenced children as prop', async ({ is }) => {
const src = [
`const React = require('react')`,
'const val = 42',
`module.exports = () => React.createElement('div', {children: val})`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'const val = 42',
'module.exports = () => esx `<div children=${val}/>`'
].join('\n')
is(convert(src), esx)
})
test('createElement component registration', async ({ is }) => {
const src = [
`const React = require('react')`,
`const Foo = require('./foo')`,
`module.exports = () => React.createElement('div', null, React.createElement(Foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const Foo = require('./foo')`,
'esx.register({ Foo });',
'module.exports = () => esx `<div><Foo>hi</Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement component registration - non-PascalCase tag', async ({ is }) => {
const src = [
`const React = require('react')`,
`const foo = require('./foo')`,
`module.exports = () => React.createElement('div', null, React.createElement(foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const foo = require('./foo')`,
'esx.register({ "$foo": foo });',
'module.exports = () => esx `<div><$foo>hi</$foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of nested component tree', async ({ is }) => {
const src = [
'const { createElement } = require("react")',
'const A = require("A")',
'const B = require("B")',
'function AppShell () {',
' return createElement(A, null, createElement(B))',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const { createElement } = require("react")',
'const A = require("A")',
'const B = require("B")',
'esx.register({ A, B });',
'function AppShell () {',
' return esx `<A><B/></A>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('createElement inline registration', async ({ is }) => {
const src = [
'const React = require("react")',
'function AppShell (props) {',
' const { Component } = props',
' return React.createElement(Component)',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'function AppShell (props) {',
' const { Component } = props',
' return esx._r("Component", Component) `<Component/>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('createElement multiple inline components registration', async ({ is }) => {
const src = [
'const React = require("react")',
'function AppShell (props) {',
' const { A, B } = props',
' return React.createElement("div", null, React.createElement(A), React.createElement(B))',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const React = require("react")',
'function AppShell (props) {',
' const { A, B } = props',
' return esx._r("A", A)._r("B", B) `<div><A/><B/></div>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of destructured assignment', async ({ is }) => {
const src = [
'const { createElement } = require("react")',
'function AppShell (props) {',
' const { component: Component } = props',
' return createElement(Component)',
'}'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'const { createElement } = require("react")',
'function AppShell (props) {',
' const { component: Component } = props',
' return esx._r("Component", Component) `<Component/>`',
'}'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o.Foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`esx.register({ "o.Foo": o.Foo });`,
'module.exports = () => esx `<div><o.Foo>hi</o.Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression, lowercase property', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o.foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`esx.register({ "o.$foo": o.foo });`,
'module.exports = () => esx `<div><o.$foo>hi</o.$foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression multilevel', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
`module.exports = () => React.createElement('div', null, React.createElement(o.x.Foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
`esx.register({ "o.x.Foo": o.x.Foo });`,
'module.exports = () => esx `<div><o.x.Foo>hi</o.x.Foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression multilevel, lowercase property', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {x: { foo: require('./foo')}}`,
`module.exports = () => React.createElement('div', null, React.createElement(o.x.foo, null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {x: { foo: require('./foo')}}`,
`esx.register({ "o.x.$foo": o.x.foo });`,
'module.exports = () => esx `<div><o.x.$foo>hi</o.x.$foo></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, single quotes)', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o['Foo'], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`esx.register({ "o['Foo']": o['Foo'] });`,
'module.exports = () => esx `<div><o[\'Foo\']>hi</o[\'Foo\']></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, single quotes), lowercase property', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o['foo'], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`esx.register({ "o['$foo']": o['foo'] });`,
'module.exports = () => esx `<div><o[\'$foo\']>hi</o[\'$foo\']></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, double quotes)', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o["Foo"], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`esx.register({ "o[\\"Foo\\"]": o["Foo"] });`,
'module.exports = () => esx `<div><o["Foo"]>hi</o["Foo"]></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, double quotes), lowercase prop', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o["foo"], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`esx.register({ "o[\\"$foo\\"]": o["foo"] });`,
'module.exports = () => esx `<div><o["$foo"]>hi</o["$foo"]></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, backticks)', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o[\`Foo\`], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {Foo: require('./foo')}`,
'esx.register({ "o[`Foo`]": o[`Foo`] });',
'module.exports = () => esx `<div><o[\\`Foo\\`]>hi</o[\\`Foo\\`]></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement registration of components via member expression (square brackets, backticks), lowercase prop', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
`module.exports = () => React.createElement('div', null, React.createElement(o[\`foo\`], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {foo: require('./foo')}`,
'esx.register({ "o[`$foo`]": o[`foo`] });',
'module.exports = () => esx `<div><o[\\`$foo\\`]>hi</o[\\`$foo\\`]></div>`'
].join('\n')
is(convert(src), esx)
})
// test('createElement registration of components via member expression (square brackets, reflection)', async ({is}) => {
// const src = [
// `const React = require('react')`,
// `const o = {Foo: require('./foo')}`,
// `const Foo = 'Foo'`,
// `module.exports = () => React.createElement('div', null, React.createElement(o[Foo], null, 'hi'))`
// ].join('\n')
// const esx = [
// `const esx = require('esx')();`,
// `const React = require('react')`,
// `const o = {Foo: require('./foo')}`,
// `const Foo = 'Foo'`,
// `esx._r("o[Foo]", o[Foo])`,
// 'module.exports = () => esx `<div><o[Foo]>hi</o[Foo]></div>`',
// ].join('\n')
// is(convert(src), esx)
// })
// test('createElement registration of components via member expression (square brackets, reflection), lowercase key', async ({is}) => {
// const src = [
// `const React = require('react')`,
// `const o = {Foo: require('./foo')}`,
// `const foo = 'Foo'`,
// `module.exports = () => React.createElement('div', null, React.createElement(o[foo], null, 'hi'))`
// ].join('\n')
// const esx = [
// `const esx = require('esx')();`,
// `const React = require('react')`,
// `const o = {Foo: require('./foo')}`,
// `const foo = 'Foo'`,
// `esx._r("o[$foo]", o[foo])`,
// 'module.exports = () => esx `<div><o[$foo]>hi</o[$foo]></div>`',
// ].join('\n')
// is(convert(src), esx)
// })
test('createElement registration of components via member expression multilevel mixed (dot notation and square brackets, single quotes)', async ({ is }) => {
const src = [
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
`module.exports = () => React.createElement('div', null, React.createElement(o.x['Foo'], null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`const o = {x: { Foo: require('./foo')}}`,
`esx.register({ "o.x['Foo']": o.x['Foo'] });`,
'module.exports = () => esx `<div><o.x[\'Foo\']>hi</o.x[\'Foo\']></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement multiple levels of component registration', async ({ is }) => {
const src = [
`const lib = require('./lib')`,
`const React = require('react')`,
'const Bar = ({children}) => React.createElement("div", null, children)',
'const Foo = ({val}) => React.createElement(Bar, null, val)',
'module.exports = ({val}) => React.createElement("div", null, React.createElement(Foo, {val}))'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const lib = require('./lib')`,
`const React = require('react')`,
'const Bar = ({children}) => esx `<div>${children}</div>`',
'esx.register({ Bar });',
'const Foo = ({val}) => esx `<Bar>${val}</Bar>`',
'esx.register({ Foo });',
'module.exports = ({val}) => esx `<div><Foo val=${val}/></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement multiple levels of component registration (import)', async ({ is }) => {
const src = [
`import lib from 'lib'`,
`import React from 'react'`,
'const Bar = ({children}) => React.createElement("div", null, children)',
'const Foo = ({val}) => React.createElement(Bar, null, val)',
'module.exports = ({val}) => React.createElement("div", null, React.createElement(Foo, {val}))'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import lib from 'lib'`,
`import React from 'react'`,
'const Bar = ({children}) => esx `<div>${children}</div>`',
'esx.register({ Bar });',
'const Foo = ({val}) => esx `<Bar>${val}</Bar>`',
'esx.register({ Foo });',
'module.exports = ({val}) => esx `<div><Foo val=${val}/></div>`'
].join('\n')
is(convert(src), esx)
})
test('final newline', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div attr={42}></div>)',
''
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div attr=${42}></div>`',
''
].join('\n')
is(convert(src), esx)
})
test('semi-colons on converted code', async ({ is }) => {
const src = [
`const React = require('react');`,
'module.exports = () => (<div attr={42}></div>);',
''
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react');`,
'module.exports = () => esx `<div attr=${42}></div>`;',
''
].join('\n')
is(convert(src), esx)
})
test('newline consistency', async ({ is }) => {
const src = [
`const React = require('react')`,
'module.exports = () => (<div attr={42}></div>)',
`console.log('some code after')`,
`const el = <div attr={42}></div>`,
`console.log('some code after')`,
`;(<div attr={42}></div>)`,
`console.log('some code after')`,
`function f () {`,
' return (<div attr={42}></div>)',
` console.log('some code after')`,
`}`,
`function g () {`,
' return <div attr={42}></div>',
` console.log('some code after')`,
`}`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div attr=${42}></div>`',
`console.log('some code after')`,
'const el = esx `<div attr=${42}></div>`',
`console.log('some code after')`,
';esx `<div attr=${42}></div>`',
`console.log('some code after')`,
`function f () {`,
' return esx `<div attr=${42}></div>`',
` console.log('some code after')`,
`}`,
`function g () {`,
' return esx `<div attr=${42}></div>`',
` console.log('some code after')`,
`}`
].join('\n')
is(convert(src), esx)
})
test('esx already required and initialized', async ({ is }) => {
const src = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required and initialized, but not at top', async ({ is }) => {
const src = [
`const React = require('react')`,
`const esx = require('esx')();`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const React = require('react')`,
`const esx = require('esx')();`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required and initialized, assigned to other var name', async ({ is }) => {
const src = [
`const React = require('react')`,
`const x = require('esx')()`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const React = require('react')`,
`const x = require('esx')()`,
'module.exports = () => x `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required, but separately initialized', async ({ is }) => {
const src = [
`const React = require('react')`,
`const createEsx = require('esx');`,
`const esx = createEsx();`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const React = require('react')`,
`const createEsx = require('esx');`,
`const esx = createEsx();`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx imported, and separately initialized', async ({ is }) => {
const src = [
`import React from 'react'`,
`import createEsx from 'esx'`,
`const esx = createEsx()`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`import React from 'react'`,
`import createEsx from 'esx'`,
`const esx = createEsx()`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required, but not initialized', async ({ is }) => {
const src = [
`const React = require('react')`,
`const esx = require('esx')`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const React = require('react')`,
`const esx = require('esx')()`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx imported, but not initialized', async ({ is }) => {
const src = [
`import React from 'react'`,
`import createEsx from 'esx'`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`import React from 'react'`,
`import createEsx from 'esx';`,
`const esx = createEsx();`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required and initialized but not assigned', async ({ is }) => {
const src = [
`const React = require('react')`,
`require('esx')()`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`require('esx')()`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('esx already required but not initialized or assigned', async ({ is }) => {
const src = [
`const React = require('react')`,
`require('esx')`,
'module.exports = () => (<div><p>hi</p></div>)'
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`require('esx')`,
'module.exports = () => esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the React assigned reference - import', async ({ is }) => {
const src = [
`import unconventional from 'react'`,
`unconventional.createElement('div', null, unconventional.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import unconventional from 'react'`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the React assigned reference - require', async ({ is }) => {
const src = [
`const unconventional = require('react')`,
`unconventional.createElement('div', null, unconventional.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const unconventional = require('react')`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the React reference reassignment', async ({ is }) => {
const src = [
`const unconventional = require('react')`,
`const r = unconventional`,
`r.createElement('div', null, r.createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const unconventional = require('react')`,
`const r = unconventional`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - deconstruct require', async ({ is }) => {
const src = [
`const { createElement } = require('react')`,
`createElement('div', null, createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { createElement } = require('react')`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - deconstruct map require', async ({ is }) => {
const src = [
`const { createElement: h } = require('react')`,
`h('div', null, h('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { createElement: h } = require('react')`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - require result property', async ({ is }) => {
const src = [
`var createElement= require('react').createElement`,
`createElement('div', null, createElement('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`var createElement= require('react').createElement`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - require result property assignment to different name', async ({ is }) => {
const src = [
`var h = require('react').createElement`,
`h('div', null, h('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`var h = require('react').createElement`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('createElement called directly from function return value', async ({ is }) => {
const src = [
`require('react').createElement('div')`
].join('\n')
const esx = [
`const esx = require('esx')();`,
'esx `<div/>`'
].join('\n')
is(convert(src), esx)
})
test('ignores createElement on objects that are not react module', async ({ is }) => {
const src = [
`const React = require('react')`,
`document.createElement('div')`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const React = require('react')`,
`document.createElement('div')`
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - import named export', async ({ is }) => {
const src = [
`import { createElement } from 'react'`,
`createElement('div', null, createElement ('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import { createElement } from 'react'`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - import as', async ({ is }) => {
const src = [
`import { createElement as h } from 'react'`,
`h('div', null, h('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import { createElement as h } from 'react'`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the createElement reference - reassignment', async ({ is }) => {
const src = [
`const { createElement } = require('react')`,
`const h = createElement`,
`h('div', null, h('p', null, 'hi'))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { createElement } = require('react')`,
`const h = createElement`,
'esx `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('renderToString - jsx passed directly', async ({ is }) => {
const src = [
`const ReactDomServer = require('react-dom/server')`,
`const React = require('react')`,
`ReactDomServer.renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const ReactDomServer = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('renderToString - createElement passed directly', async ({ is }) => {
const src = [
`const ReactDomServer = require('react-dom/server')`,
`const React = require('react')`,
`ReactDomServer.renderToString(React.createElement('div', null, React.createElement('p', null, 'hi')))`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const ReactDomServer = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the ReactDomServer assigned reference - import', async ({ is }) => {
const src = [
`import unconventional from 'react-dom/server'`,
`const React = require('react')`,
`unconventional.renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import unconventional from 'react-dom/server'`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the ReactDomServer assigned reference - require', async ({ is }) => {
const src = [
`const unconventional = require('react-dom/server')`,
`const React = require('react')`,
`unconventional.renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const unconventional = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks the ReactDomServer reference reassignment', async ({ is }) => {
const src = [
`const unconventional = require('react-dom/server')`,
`const React = require('react')`,
`const r = unconventional`,
`r.renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const unconventional = require('react-dom/server')`,
`const React = require('react')`,
`const r = unconventional`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString ', async ({ is }) => {
const src = [
`const { renderToString } = require('react-dom/server')`,
`const React = require('react')`,
`renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { renderToString } = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - deconstruct require', async ({ is }) => {
const src = [
`const { renderToString } = require('react-dom/server')`,
`const React = require('react')`,
`renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { renderToString } = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - deconstruct map require', async ({ is }) => {
const src = [
`const { renderToString: r } = require('react-dom/server')`,
`const React = require('react')`,
`r(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { renderToString: r } = require('react-dom/server')`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - require result property', async ({ is }) => {
const src = [
`var r = require('react-dom/server').renderToString`,
`const React = require('react')`,
`r(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`var r = require('react-dom/server').renderToString`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - import named export', async ({ is }) => {
const src = [
`import { renderToString } from 'react-dom/server'`,
`const React = require('react')`,
`renderToString(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import { renderToString } from 'react-dom/server'`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - import as', async ({ is }) => {
const src = [
`import { renderToString as r } from 'react-dom/server'`,
`const React = require('react')`,
`r(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`import { renderToString as r } from 'react-dom/server'`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('tracks renderToString reference - reassignment', async ({ is }) => {
const src = [
`const { renderToString } = require('react-dom/server')`,
`const r = renderToString`,
`const React = require('react')`,
`r(<div><p>hi</p></div>)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { renderToString } = require('react-dom/server')`,
`const r = renderToString`,
`const React = require('react')`,
'esx.renderToString `<div><p>hi</p></div>`'
].join('\n')
is(convert(src), esx)
})
test('element passed to React.renderToString', async ({ is }) => {
const src = [
`const { renderToString } = require('react-dom/server')`,
`const { createElement } = require('react')`,
`const el = <div><p>hi</p></div>`,
`renderToString(el)`
].join('\n')
const esx = [
`const esx = require('esx')();`,
`const { renderToString } = require('react-dom/server')`,
`const { createElement } = require('react')`,
'const el = esx `<div><p>hi</p></div>`',
`esx.renderToString(el)`
].join('\n')
is(convert(src), esx)
})
test('babel compatibility - _interopRequireDefault', async ({ is }) => {
const src = [
'var _react = _interopRequireDefault(require("react"))',
'function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }',
'const App = () => _react.default.createElement("svg", {',
' xmlns: "http://www.w3.org/2000/svg",',
' width: "48",',
' height: "48",',
' "aria-hidden": "true"',
'}, _react.default.createElement("title", null, "Menu"))'
].join('\n')
const esx = [
`const esx = require('esx')();`,
'var _react = _interopRequireDefault(require("react"))',
'function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }',
'const App = () => esx `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" aria-hidden="true"><title>Menu</title></svg>`'
].join('\n')
is(convert(src), esx)
})
test('babel compatibility - _interopRequireWildcard', async ({ is }) => {
const src = [
'var _react = _interopRequireWildcard(require("react"))',
'function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set)