UNPKG

@assylman/riverpod-cli

Version:

nodejs cli for creating well structured flutter riverpod folders and files needed to work with Riverpod plugin

109 lines (84 loc) 3.65 kB
import fs from 'fs'; import { Commands, formattingTarget, toPascalCase } from "../utils"; import { generateFeatureIndexFile } from '../features'; const repositoryDart = '_repository.dart'; const indexDart = 'repositories.dart'; export function generateRepository(name: string, options: any) { const target = options.target; const libDir = target != null ? formattingTarget(target) : '/lib/features'; const featureDirectory = '.' + libDir + '/' + name; const repositoryDirectory = featureDirectory + '/repositories'; const repositoryAbstractFileName = repositoryDirectory + '/' + name + repositoryDart; const repositoryImplFileName = repositoryDirectory + '/' + name + '_repository_impl.dart'; const repositoryIndexFileName = repositoryDirectory + '/' + indexDart; const dirs = repositoryDirectory.split('/').filter(n => n && n != 'lib'); var fullDirs; for (const dir of dirs) { if (!fullDirs) { fullDirs = './lib/' + dir; } else { fullDirs += '/' + dir; } if (!fs.existsSync(fullDirs)) { try { fs.mkdirSync(fullDirs, { recursive: true }); } catch (err) { console.error(err); } } } fs.writeFileSync( repositoryAbstractFileName, generateAbstractInterface(name), { flag: "w" }, ); fs.writeFileSync( repositoryImplFileName, generateImplClass(name, options, libDir), { flag: "w" }, ); if (options.i) { fs.writeFileSync( repositoryIndexFileName, generateIndexBarrelFile(name, options, libDir), { flag: "w" }, ); generateFeatureIndexFile(name, Commands.repository, featureDirectory); } } function generateAbstractInterface(name: string) { return [ `abstract interface class ${toPascalCase(name) + 'Repository'} {`, ` /// Your abstract methods goes here`, `}`, ].join('\n'); } function generateImplClass(name: string, options: any, libDir: string) { const repositoryName = toPascalCase(name); const repositoryFileName = name + repositoryDart; const repositoryImplName = repositoryName + 'RepositoryImpl'; const useAbsoluteImports = options.useAbsoluteImports; var importName = useAbsoluteImports ? `import 'package:${options.packageName}${libDir}/${name}/repositories/${repositoryFileName}';` : `import './${repositoryFileName}';`; if (options.i) { importName = useAbsoluteImports ? `import 'package:${options.packageName}${libDir}/${name}/repositories/${indexDart}';` : `import './${indexDart}';`; } return [ `${importName}`, ``, `class ${repositoryImplName} implements ${repositoryName}Repository {`, ` const ${repositoryImplName}();`, ` /// Your override methods goes here`, `}`, ].join('\n'); } function generateIndexBarrelFile(name: string, options: any, libDir: string) { const repositoryFileName = name + repositoryDart; const useAbsoluteImports = options.useAbsoluteImports; const exportRepositoryName = useAbsoluteImports ? `export 'package:${options.packageName}${libDir}/${name}/repositories/${repositoryFileName}';` : `export './${repositoryFileName}';`; const exportImplName = useAbsoluteImports ? `export 'package:${options.packageName}${libDir}/${name}/repositories/${name}_repository_impl.dart';` : `export './${name}_repository_impl.dart';`; const content = [ `${exportRepositoryName}`, `${exportImplName}`, ]; return content.join('\n'); }