ignite-boilerplate-andross-typescript
Version:
Customized version of ignite Andross With TypeScript Support.
64 lines (53 loc) • 1.99 kB
JavaScript
// @cliDescription Generates an opinionated container.
const patterns = require('../lib/patterns')
module.exports = async function (context) {
// grab some features
const { parameters, print, strings, ignite, filesystem } = context
const { pascalCase, isBlank } = strings
const config = ignite.loadIgniteConfig()
// validation
if (isBlank(parameters.first)) {
print.info(`${context.runtime.brand} generate screen <name>\n`)
print.info('A name is required.')
return
}
const name = pascalCase(parameters.first)
const screenName = name.endsWith('Screen') ? name : `${name}Screen`
const props = { name: screenName }
const jobs = [
{
template: `screen.ejs`,
target: `js/App/Containers/${screenName}.tsx`
},
{
template: `screen-style.ejs`,
target: `js/App/Containers/Styles/${screenName}Style.tsx`
}
]
// make the templates
await ignite.copyBatch(context, jobs, props)
// if using `react-navigation` go the extra step
// and insert the screen into the nav router
if (config.navigation === 'react-navigation') {
const appNavFilePath = `${process.cwd()}/js/App/Navigation/AppNavigation.tsx`
const importToAdd = `import ${screenName} from '../Containers/${screenName}'`
const routeToAdd = ` ${screenName}: { screen: ${screenName} },`
if (!filesystem.exists(appNavFilePath)) {
const msg = `No '${appNavFilePath}' file found. Can't insert screen.`
print.error(msg)
process.exit(1)
}
// insert screen import
ignite.patchInFile(appNavFilePath, {
after: patterns[patterns.constants.PATTERN_IMPORTS],
insert: importToAdd
})
// insert screen route
ignite.patchInFile(appNavFilePath, {
after: patterns[patterns.constants.PATTERN_ROUTES],
insert: routeToAdd
})
} else {
print.info(`Screen ${screenName} created, manually add it to your navigation`)
}
}