/**
* Stack Navigator Template (React Navigation)
*
* Usage: lunar g nav:stack
* Generates: src/navigation/main_navigator.tsx
*/
export interface StackNavigatorTemplateOptions {
stackName: string;
screens: string[];
}
export function generateStackNavigatorTemplate(options: StackNavigatorTemplateOptions): string {
const { stackName, screens } = options;
const exportName = `${toPascalCase(stackName)}Navigator`;
const screenImports = screens
.map((screen) => {
const screenName = toPascalCase(screen);
return `import ${screenName}Screen from '@screens/${toSnakeCase(screen)}_screen';`;
})
.join('\n');
const screenComponents = screens
.map((screen) => {
const screenName = toPascalCase(screen);
return ` `;
})
.join('\n');
const paramList = screens
.map((screen) => ` ${toPascalCase(screen)}: undefined;`)
.join('\n');
return `import { createStackNavigator } from '@react-navigation/stack';
${screenImports}
type ${toPascalCase(stackName)}ParamList = {
${paramList}
};
const Stack = createStackNavigator<${toPascalCase(stackName)}ParamList>();
export function ${exportName}() {
return (
${screenComponents}
);
}
`;
}
function toPascalCase(str: string): string {
return str
.replace(/([-_]\w)/g, (g) => g[1].toUpperCase())
.replace(/^\w/, (c) => c.toUpperCase());
}
function toSnakeCase(str: string): string {
return str
.replace(/([A-Z])/g, '_$1')
.toLowerCase()
.replace(/^_/, '');
}
export default generateStackNavigatorTemplate;