import { Schema } from './schema'; import { applyChangesToString, convertNxGenerator, formatFiles, generateFiles, getProjects, joinPathFragments, toJS, Tree, } from '@nrwl/devkit'; import { NormalizedSchema, normalizeOptions } from './lib/normalize-options'; import { addImport } from './lib/add-import'; import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export async function reactNativeComponentGenerator( host: Tree, schema: Schema ) { const options = await normalizeOptions(host, schema); createComponentFiles(host, options); addExportsToBarrel(host, options); await formatFiles(host); } function createComponentFiles(host: Tree, options: NormalizedSchema) { const componentDir = joinPathFragments( options.projectSourceRoot, options.directory ); generateFiles(host, joinPathFragments(__dirname, './files'), componentDir, { ...options, tmpl: '', }); for (const c of host.listChanges()) { let deleteFile = false; if (options.skipTests && /.*spec.tsx/.test(c.path)) { deleteFile = true; } if (deleteFile) { host.delete(c.path); } } if (options.js) { toJS(host); } } let tsModule: typeof import('typescript'); function addExportsToBarrel(host: Tree, options: NormalizedSchema) { if (!tsModule) { tsModule = ensureTypescript(); } const workspace = getProjects(host); const isApp = workspace.get(options.project).projectType === 'application'; if (options.export && !isApp) { const indexFilePath = joinPathFragments( options.projectSourceRoot, options.js ? 'index.js' : 'index.ts' ); const indexSource = host.read(indexFilePath, 'utf-8'); if (indexSource !== null) { const indexSourceFile = tsModule.createSourceFile( indexFilePath, indexSource, tsModule.ScriptTarget.Latest, true ); const changes = applyChangesToString( indexSource, addImport( indexSourceFile, `export * from './${options.directory}/${options.fileName}';` ) ); host.write(indexFilePath, changes); } } } export default reactNativeComponentGenerator; export const reactNativeComponentSchematic = convertNxGenerator( reactNativeComponentGenerator );