UNPKG

crcf2

Version:

Creates single react component folder structure

414 lines (346 loc) 9.22 kB
const stringHelper = require('../utils/stringHelper'); /** * Creates default React component * * @param {String} componentName - Component name * @returns {String} */ function createReactComponent(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React, { Component } from 'react'; import './${name}.css' class ${name} extends Component { render() { return ( <div> ${name} </div> ); } } export default ${name}; `; } /** * Creates React stateless functional component * * @param {String} componentName - Component name * @returns {String} */ function createReactFunctionalComponent(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React from 'react'; import './${name}.css' const ${name} = () => { return ( <div> ${name} </div> ); } export default ${name}; `; } /** * Creates Redux container * * @param {String} containerName - Component name * @returns {String} */ function createReduxContainer(containerName) { const name = stringHelper.capitalizeFirstLetter(containerName); const componentName = containerName.substring(0, containerName.indexOf('Container')); return `import { connect } from 'react-redux'; import ${componentName} from '../../Components/${componentName}'; const mapStateToProps = state => ({ }); const mapDispatchToProps = { }; const ${name} = connect(mapStateToProps, mapDispatchToProps)(${componentName}); export default ${name}; `; } /** * Creates Redux action * * @param {String} actionName - Component name * @returns {String} */ function createReduxActions(actionName) { const name = stringHelper.capitalizeFirstLetter(actionName); return `import 'isomorphic-fetch'; `; } /** * Creates default React Native component * * @param {String} componentName - Component name * @returns {String} */ function createReactNativeComponent(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React, { Component } from 'react'; import { View, Text } from 'react-native'; class ${name} extends Component { render() { return ( <View> <Text>${name}</Text> </View> ); } } export default ${name}; `; } /** * Creates default Typescript React Native component * * @param {String} componentName - Component name * @returns {String} */ function createTypeScriptReactNativeComponent(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import * as React from 'react'; import { View, Text } from 'react-native'; class ${name} extends React.Component<any, any> { public render() { return ( <View> <Text>${name}</Text> </View> ); } } export default ${name}; `; } /** * Creates default Typescript React component * * @param {String} componentName - Component name * @returns {String} */ function createTypeScriptReactComponent(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import * as React from 'react'; class ${name} extends React.Component<any, any> { public render() { return ( <div> ${name} </div> ); } } export default ${name}; `; } /** * Creates default React component with prop types * * @param {String} componentName - Component name * @returns {String} */ function createReactComponentWithProps(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React, { Component } from 'react'; import './${name}.css' import PropTypes from 'prop-types'; class ${name} extends Component { render() { return ( <div> ${name} </div> ); } } ${name}.propTypes = { }; export default ${name}; `; } /** * Creates React stateless functional component with prop types * * @param {String} componentName - Component name * @returns {String} */ function createReactFunctionalComponentWithProps(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React from 'react'; import PropTypes from 'prop-types'; const ${name} = () => { return ( <div> ${name} </div> ); } ${name}.propTypes = { }; export default ${name}; `; } /** * Creates default index file * * @param {String} componentName - Component name * @param {Boolean} upperCase - If true then capitalize first letter * @returns {String} */ function createIndex(componentName, upperCase) { const name = upperCase === true ? stringHelper.capitalizeFirstLetter(componentName) : componentName return `import ${name} from './${name}'; export default ${name};`; } /** * Creates default index file * * @param {String} actionName - Action name * @param {Boolean} upperCase - If true then capitalize first letter * @returns {String} */ function createIndexForActions(actionName, upperCase) { const name = upperCase === true ? stringHelper.capitalizeFirstLetter(actionName) : actionName return `import * as ${name} from './${name}'; export default ${name};`; } /** * Creates index file includes all folder * * @param {Array} folders - folders array * @returns {String} */ function createIndexForFolders(folders) { return `${folders .map(folderName => `import ${folderName} from './${folderName}' \n`) .join('')}export { ${folders .map((folderName, index) => { if (index === folders.length - 1) return folderName; return `${folderName}, \n`; }) .join('')} }`; } /** * Creates default React Native component with prop types * * @param {String} componentName - Component name * @returns {String} */ function createReactNativeComponentWithProps(componentName) { const name = stringHelper.capitalizeFirstLetter(componentName); return `import React, { Component } from 'react'; import { View, Text } from 'react-native'; import PropTypes from 'prop-types'; class ${name} extends Component { render() { return ( <View> <Text>${name}</Text> </View> ); } } ${name}.propTypes = { }; export default ${name}; `; } /** * Creates default test file for component * * @param {String} componentName - Component name * @param {Boolean} upperCase - If true then capitalize first letter * @param {Boolean} isTypeScript - Boolean check for Typescript * @returns {String} */ function createTest(componentName, upperCase, isTypeScript) { const componentNameUpperCase = stringHelper.capitalizeFirstLetter(componentName); return `import ${isTypeScript ? '* as' : ''} React from 'react'; import { shallow } from 'enzyme'; import ${componentNameUpperCase} from './${ upperCase === true ? componentNameUpperCase : componentName }'; describe('${componentNameUpperCase} ', () => { let wrapper; beforeEach(() => { wrapper = shallow(<${componentNameUpperCase} />); }) it('renders', () => { expect(wrapper).toMatchSnapshot(); }); }); `; } /** * Creates default test file for container * * @param {String} containerName - Container name * @param {Boolean} upperCase - If true then capitalize first letter * @returns {String} */ function createTestForContainer(containerName, upperCase) { const containerNameUpperCase = stringHelper.capitalizeFirstLetter(containerName); return `import React from 'react'; import { shallow } from 'enzyme'; import { Provider } from 'react-redux'; import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import ${containerNameUpperCase} from './${ upperCase === true ? containerNameUpperCase : containerName }'; const mockStore = configureStore([thunk]); const { initialState } = global; describe('${containerNameUpperCase}', () => { let wrapper; let store; beforeEach(() => { store = mockStore(initialState); wrapper = shallow(<Provider store={store}><${containerNameUpperCase} /></Provider>); }); it('renders without crashing', () => { expect(wrapper.html()).toMatchSnapshot(); }); }); `; } /** * Creates default test file for actions * * @param {String} actionName - Container name * @param {Boolean} upperCase - If true then capitalize first letter * @returns {String} */ function createTestForActions(actionName, upperCase) { const actionNameUpperCase = stringHelper.capitalizeFirstLetter(actionName); return `import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import { fetchMock } from 'fetch-mock'; import * as ${actionNameUpperCase} from './${ upperCase === true ? actionNameUpperCase : actionName }'; const middlewares = [thunk]; const mockStore = configureMockStore(middlewares); `; } module.exports = { createReactComponent, createReduxContainer, createReduxActions, createReactFunctionalComponent, createReactNativeComponent, createTypeScriptReactComponent, createTypeScriptReactNativeComponent, createReactComponentWithProps, createReactFunctionalComponentWithProps, createReactNativeComponentWithProps, createIndex, createIndexForFolders, createIndexForActions, createTest, createTestForContainer, createTestForActions, };