93 lines
2.3 KiB
TypeScript
93 lines
2.3 KiB
TypeScript
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
|
|
);
|