feat(repo): add @tools/typeorm:tomg generator (single version)

This commit is contained in:
Francesco Spilla 2025-02-05 22:37:28 +01:00
parent 6526a42f46
commit be20999edf
7 changed files with 32 additions and 59 deletions

View File

@ -5,12 +5,6 @@
"schema": "./src/generators/typeorm-model-generator/schema.json",
"aliases": ["tomg"],
"description": "Creates typeorm entities via typeorm-model-generator."
},
"typeorm-model-generator-scaffold": {
"factory": "./src/generators/typeorm-model-generator-scaffold/typeorm-model-generator-scaffold",
"schema": "./src/generators/typeorm-model-generator-scaffold/schema.json",
"aliases": ["tomg-scaffold"],
"description": "Scaffolds a project with typeorm-model-generator config files."
}
}
}

View File

@ -1,3 +0,0 @@
export interface TomgGeneratorSchema {
project: string;
}

View File

@ -1,17 +0,0 @@
{
"$schema": "https://json-schema.org/schema",
"$id": "typeorm-model-generator-scaffold",
"title": "",
"description": "Scaffolds a project with typeorm-model-generator config files.",
"type": "object",
"properties": {
"project": {
"description": "The project to scaffold.",
"type": "string",
"alias": "p",
"x-prompt": "Which project to scaffold?",
"x-dropdown": "projects"
}
},
"required": []
}

View File

@ -1,29 +0,0 @@
import {
formatFiles,
generateFiles,
joinPathFragments,
OverwriteStrategy,
readProjectConfiguration,
Tree,
} from '@nx/devkit';
import { TomgGeneratorSchema } from './schema';
export async function tomgScaffoldGenerator(
tree: Tree,
options: TomgGeneratorSchema
) {
const libraryRoot = readProjectConfiguration(tree, options.project).root;
generateFiles(
tree,
joinPathFragments(__dirname, './files'),
libraryRoot,
options,
{ overwriteStrategy: OverwriteStrategy.KeepExisting }
);
await formatFiles(tree);
}
export default tomgScaffoldGenerator;

View File

@ -1,22 +1,34 @@
import {
FileChange,
formatFiles,
generateFiles,
joinPathFragments,
OverwriteStrategy,
readProjectConfiguration,
Tree,
workspaceRoot,
} from '@nx/devkit';
import execa from 'execa';
import os from 'node:os';
import fs from 'node:fs/promises';
import path from 'node:path';
import { mkdirSync, writeFileSync, chmodSync, rmSync } from 'node:fs';
import { mkdtemp, rm } from 'node:fs/promises';
import { dirname, join } from 'node:path';
import { TomgGeneratorSchema } from './schema';
export async function tomgGenerator(tree: Tree, options: TomgGeneratorSchema) {
const libraryRoot = readProjectConfiguration(tree, options.project).root;
const tmpDirPath = await fs.mkdtemp(path.join(os.tmpdir(), 'tomg-'));
generateFiles(
tree,
joinPathFragments(__dirname, './files'),
libraryRoot,
options,
{ overwriteStrategy: OverwriteStrategy.KeepExisting }
);
flushChanges(workspaceRoot, tree.listChanges());
const tmpDirPath = await mkdtemp(join(os.tmpdir(), 'tomg-'));
const { stdout, stderr } = await execa(
`typeorm-model-generator`,
[
@ -49,7 +61,7 @@ export async function tomgGenerator(tree: Tree, options: TomgGeneratorSchema) {
);
await formatFiles(tree);
await fs.rm(tmpDirPath, { recursive: true, force: true });
await rm(tmpDirPath, { recursive: true, force: true });
console.log();
console.log('Generation complete.');
@ -57,3 +69,19 @@ export async function tomgGenerator(tree: Tree, options: TomgGeneratorSchema) {
}
export default tomgGenerator;
function flushChanges(root: string, fileChanges: FileChange[]): void {
fileChanges.forEach((f) => {
const fpath = join(root, f.path);
if (f.type === 'CREATE') {
mkdirSync(dirname(fpath), { recursive: true });
writeFileSync(fpath, f.content);
if (f.options?.mode) chmodSync(fpath, f.options.mode);
} else if (f.type === 'UPDATE') {
writeFileSync(fpath, f.content);
if (f.options?.mode) chmodSync(fpath, f.options.mode);
} else if (f.type === 'DELETE') {
rmSync(fpath, { recursive: true, force: true });
}
});
}