simpledi-app-generator 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/create_module.d.ts +2 -0
- package/dist/create_module.d.ts.map +1 -0
- package/dist/create_module.js +439 -0
- package/dist/create_module.js.map +1 -0
- package/dist/generate_skeleton.d.ts +2 -0
- package/dist/generate_skeleton.d.ts.map +1 -0
- package/dist/generate_skeleton.js +249 -0
- package/dist/generate_skeleton.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/.env.development +3 -0
- package/dist/templates/AppModule.ts +7 -0
- package/dist/templates/Config.ts +98 -0
- package/dist/templates/UseCaseModule.ts +5 -0
- package/dist/templates/config/getConfigModule.ts +12 -0
- package/dist/templates/db/DbService.ts +18 -0
- package/dist/templates/db/getDb.ts +11 -0
- package/dist/templates/db/getDbModule.ts +15 -0
- package/dist/templates/db/initDb.ts +11 -0
- package/dist/templates/main.routes.ts +10 -0
- package/dist/templates/main.ts +91 -0
- package/dist/templates/package.json +51 -0
- package/dist/templates/schema.ts +1 -0
- package/dist/templates/src/BaseRepository.ts +136 -0
- package/dist/templates/src/BaseService.ts +78 -0
- package/dist/templates/src/IRepository.ts +11 -0
- package/dist/templates/src/IService.ts +6 -0
- package/dist/templates/src/core/baseSchema.ts +13 -0
- package/dist/templates/src/lib/AuthenticationUtils.ts +49 -0
- package/dist/templates/src/lib/errors/BadRequestException.ts +11 -0
- package/dist/templates/src/lib/errors/ConflictException.ts +9 -0
- package/dist/templates/src/lib/errors/ForbiddenException.ts +11 -0
- package/dist/templates/src/lib/errors/HttpException.ts +22 -0
- package/dist/templates/src/lib/errors/InternalServerException.ts +13 -0
- package/dist/templates/src/lib/errors/NotFoundException.ts +11 -0
- package/dist/templates/src/lib/errors/UnauthorizedException.ts +11 -0
- package/dist/templates/src/lib/functions/getEnvFile.ts +19 -0
- package/dist/templates/src/lib/functions/getHostname.ts +18 -0
- package/dist/templates/src/lib/functions/isNotNullNorUndefined.ts +5 -0
- package/dist/templates/src/lib/functions/tableName.ts +5 -0
- package/dist/templates/src/lib/functions/withBaseSchema.ts +30 -0
- package/dist/templates/src/lib/types/BaseEntityInterface.ts +9 -0
- package/dist/templates/src/lib/types/EnvFileNames.ts +7 -0
- package/dist/templates/src/lib/types/Envs.ts +7 -0
- package/dist/templates/src/lib/types/FailedOperation.ts +9 -0
- package/dist/templates/src/lib/types/OperationResult.ts +5 -0
- package/dist/templates/src/lib/types/SharedStubs.ts +16 -0
- package/dist/templates/src/lib/types/SuccessfullOperation.ts +9 -0
- package/dist/templates/src/lib/types/TableNameToken.ts +1 -0
- package/dist/templates/src/lib/types/TokenPayload.ts +6 -0
- package/dist/templates/src/lib/types/UserInterface.ts +10 -0
- package/dist/templates/src/lib/types/getCorsOrigin.ts +20 -0
- package/dist/templates/src/main.routes.ts +11 -0
- package/dist/templates/src/use-case/IUseCase.ts +3 -0
- package/dist/templates/src/use-case/UseCaseModule.ts +6 -0
- package/dist/templates/src/use-case/health-check/HealthCheck.ts +24 -0
- package/dist/templates/src/use-case/health-check/healthCheckRoutes.ts +23 -0
- package/dist/templates/src/use-case/health-check/outputs/HealthCheckSuccess.ts +14 -0
- package/dist/templates/tsconfig.json +46 -0
- package/package.json +41 -0
- package/src/templates/.env.development +3 -0
- package/src/templates/package.json +51 -0
- package/src/templates/tsconfig.json +46 -0
- package/tsconfig.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# simpledi-app-generator
|
|
2
|
+
|
|
3
|
+
CLI tool to generate [simple-di](https://www.npmjs.com/package/@kanian77/simple-di) projects with a complete backend architecture.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g simpledi-app-generator
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or link locally for development:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone <repo>
|
|
15
|
+
cd simpledi-app-generator
|
|
16
|
+
bun install
|
|
17
|
+
bun run prepare
|
|
18
|
+
npm link
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
### Create a new project
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
simpledi new my-project
|
|
27
|
+
cd my-project
|
|
28
|
+
bun install
|
|
29
|
+
bun run dev
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Generate a module
|
|
33
|
+
|
|
34
|
+
Inside an existing project:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
simpledi module user
|
|
38
|
+
simpledi module blog-post
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This creates a complete module with:
|
|
42
|
+
|
|
43
|
+
- Entity schema (Drizzle ORM)
|
|
44
|
+
- Repository + Interface
|
|
45
|
+
- Service + Interface
|
|
46
|
+
- Module definitions
|
|
47
|
+
- Test file
|
|
48
|
+
- Auto-registers in `schema.ts` and `CoreModule.ts`
|
|
49
|
+
|
|
50
|
+
## Prerequisites
|
|
51
|
+
|
|
52
|
+
### Neon PostgreSQL
|
|
53
|
+
|
|
54
|
+
Generated projects use [Neon](https://neon.tech) serverless PostgreSQL. You **must** add your connection string to `.env.development`:
|
|
55
|
+
|
|
56
|
+
```env
|
|
57
|
+
DATABASE_URL=postgres://user:password@your-neon-host.neon.tech/dbname?sslmode=require
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Required Environment Variables
|
|
61
|
+
|
|
62
|
+
| Variable | Description |
|
|
63
|
+
| -------------- | --------------------------------- |
|
|
64
|
+
| `DATABASE_URL` | Neon PostgreSQL connection string |
|
|
65
|
+
| `JWT_SECRET` | Secret key for JWT tokens |
|
|
66
|
+
| `PORT` | Server port (default: 3000) |
|
|
67
|
+
|
|
68
|
+
## Project Structure
|
|
69
|
+
|
|
70
|
+
Generated projects follow this structure:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
my-project/
|
|
74
|
+
├── main.ts # Entry point
|
|
75
|
+
├── config/ # Configuration module
|
|
76
|
+
├── db/ # Database service module
|
|
77
|
+
└── src/
|
|
78
|
+
├── AppModule.ts # Root module
|
|
79
|
+
├── schema.ts # Drizzle schema exports
|
|
80
|
+
├── core/ # Entity modules (generated)
|
|
81
|
+
├── lib/ # Utilities, types, errors
|
|
82
|
+
└── use-case/ # Use case modules
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Tech Stack
|
|
86
|
+
|
|
87
|
+
- **Runtime**: [Bun](https://bun.sh)
|
|
88
|
+
- **Framework**: [Hono](https://hono.dev)
|
|
89
|
+
- **DI**: [@kanian77/simple-di](https://www.npmjs.com/package/@kanian77/simple-di)
|
|
90
|
+
- **ORM**: [Drizzle](https://orm.drizzle.team)
|
|
91
|
+
- **Database**: [Neon PostgreSQL](https://neon.tech)
|
|
92
|
+
- **Validation**: [Zod](https://zod.dev)
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { generateSkeleton } from './generate_skeleton.js';
|
|
3
|
+
import { createModule } from './create_module.js';
|
|
4
|
+
const args = process.argv.slice(2);
|
|
5
|
+
const command = args[0];
|
|
6
|
+
const name = args[1];
|
|
7
|
+
function printUsage() {
|
|
8
|
+
console.log(`
|
|
9
|
+
simpledi - Simple DI App Generator
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
simpledi new <project-name> Create a new simple-di project
|
|
13
|
+
simpledi module <entity-name> Generate a module in current project
|
|
14
|
+
|
|
15
|
+
Examples:
|
|
16
|
+
simpledi new my-app
|
|
17
|
+
simpledi module user
|
|
18
|
+
simpledi module blog-post
|
|
19
|
+
`);
|
|
20
|
+
}
|
|
21
|
+
async function main() {
|
|
22
|
+
if (!command) {
|
|
23
|
+
printUsage();
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
switch (command) {
|
|
27
|
+
case 'new':
|
|
28
|
+
if (!name) {
|
|
29
|
+
console.error('Error: Project name is required');
|
|
30
|
+
console.error('Usage: simpledi new <project-name>');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
await generateSkeleton(name);
|
|
34
|
+
break;
|
|
35
|
+
case 'module':
|
|
36
|
+
if (!name) {
|
|
37
|
+
console.error('Error: Entity name is required');
|
|
38
|
+
console.error('Usage: simpledi module <entity-name>');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
await createModule(name);
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
console.error(`Unknown command: ${command}`);
|
|
45
|
+
printUsage();
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
main().catch((err) => {
|
|
50
|
+
console.error('Error:', err.message);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAErB,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACjD,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM;QAER,KAAK,QAAQ;YACX,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_module.d.ts","sourceRoot":"","sources":["../src/create_module.ts"],"names":[],"mappings":"AAyCA,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuajE"}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { mkdir, writeFile, readFile } from 'fs/promises';
|
|
2
|
+
import { join, resolve } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
// Helper functions for string manipulation
|
|
5
|
+
function toPascalCase(str) {
|
|
6
|
+
return str
|
|
7
|
+
.replace(/(?:^\w|[A-Z]|\b\w)/g, (word) => word.toUpperCase())
|
|
8
|
+
.replace(/[\s-_]+/g, '');
|
|
9
|
+
}
|
|
10
|
+
function toCamelCase(str) {
|
|
11
|
+
const pascal = toPascalCase(str);
|
|
12
|
+
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
13
|
+
}
|
|
14
|
+
function toKebabCase(str) {
|
|
15
|
+
return str
|
|
16
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
17
|
+
.replace(/[\s_]+/g, '-')
|
|
18
|
+
.toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
function toSnakeCase(str) {
|
|
21
|
+
return str
|
|
22
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
23
|
+
.replace(/[\s-]+/g, '_')
|
|
24
|
+
.toLowerCase();
|
|
25
|
+
}
|
|
26
|
+
function toUpperSnakeCase(str) {
|
|
27
|
+
return toSnakeCase(str).toUpperCase();
|
|
28
|
+
}
|
|
29
|
+
// Simple pluralizer (naive but works for most standard English words)
|
|
30
|
+
function pluralize(str) {
|
|
31
|
+
if (str.endsWith('y'))
|
|
32
|
+
return str.slice(0, -1) + 'ies';
|
|
33
|
+
if (str.endsWith('s'))
|
|
34
|
+
return str + 'es';
|
|
35
|
+
return str + 's';
|
|
36
|
+
}
|
|
37
|
+
export async function createModule(rawName) {
|
|
38
|
+
if (!rawName) {
|
|
39
|
+
throw new Error('Entity name is required');
|
|
40
|
+
}
|
|
41
|
+
const EntityName = toPascalCase(rawName); // e.g. BlogPost
|
|
42
|
+
const entityName = toCamelCase(rawName); // e.g. blogPost
|
|
43
|
+
const kebabName = toKebabCase(rawName); // e.g. blog-post
|
|
44
|
+
const snakeName = toSnakeCase(rawName); // e.g. blog_post
|
|
45
|
+
const TOKEN_BASE = toUpperSnakeCase(rawName); // e.g. BLOG_POST
|
|
46
|
+
const tableName = pluralize(snakeName); // e.g. blog_posts
|
|
47
|
+
console.log(`Creating module for entity: ${EntityName}`);
|
|
48
|
+
console.log(`Directory: src/core/${kebabName}`);
|
|
49
|
+
console.log(`Table: ${tableName}`);
|
|
50
|
+
const srcDir = resolve(process.cwd(), 'src');
|
|
51
|
+
const targetDir = resolve(srcDir, 'core', kebabName);
|
|
52
|
+
if (existsSync(targetDir)) {
|
|
53
|
+
throw new Error(`Directory ${targetDir} already exists`);
|
|
54
|
+
}
|
|
55
|
+
await mkdir(targetDir, { recursive: true });
|
|
56
|
+
// File Templates
|
|
57
|
+
// 1. baseZod[Entity]Schema.ts (New in Phase 4)
|
|
58
|
+
const baseZodSchemaContent = `import { z } from "zod";
|
|
59
|
+
import { baseZodSchema } from "@root/core/baseZodSchema";
|
|
60
|
+
|
|
61
|
+
export const baseZod${EntityName}Schema = baseZodSchema.extend({
|
|
62
|
+
// add other properties here
|
|
63
|
+
});
|
|
64
|
+
export type ${EntityName}Interface = z.infer<typeof baseZod${EntityName}Schema>;
|
|
65
|
+
`;
|
|
66
|
+
// 2. [Entity].ts
|
|
67
|
+
const schemaContent = `import { withBaseSchema } from '@root/lib/functions/withBaseSchema';
|
|
68
|
+
import { text } from 'drizzle-orm/pg-core';
|
|
69
|
+
import {
|
|
70
|
+
createInsertSchema,
|
|
71
|
+
createSelectSchema,
|
|
72
|
+
createUpdateSchema,
|
|
73
|
+
} from 'drizzle-zod';
|
|
74
|
+
import { baseZod${EntityName}Schema } from './baseZod${EntityName}Schema';
|
|
75
|
+
|
|
76
|
+
// Table name constant
|
|
77
|
+
export const ${TOKEN_BASE}_TABLE_NAME = '${tableName}';
|
|
78
|
+
|
|
79
|
+
// Schema definition
|
|
80
|
+
export const ${entityName}Schema = withBaseSchema(${TOKEN_BASE}_TABLE_NAME, {
|
|
81
|
+
// TODO: Add entity fields here
|
|
82
|
+
name: text('name').notNull(),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Relations definition
|
|
86
|
+
// import { relations } from 'drizzle-orm';
|
|
87
|
+
// export const ${entityName}Relations = relations(${entityName}Schema, ({ one, many }) => ({
|
|
88
|
+
// // TODO: Add relationships here
|
|
89
|
+
// }));
|
|
90
|
+
|
|
91
|
+
// Type exports
|
|
92
|
+
export type ${EntityName}SchemaType = typeof ${entityName}Schema;
|
|
93
|
+
|
|
94
|
+
// Zod validation schemas
|
|
95
|
+
export const ${EntityName}InsertSchema = createInsertSchema(${entityName}Schema).merge(
|
|
96
|
+
baseZod${EntityName}Schema.partial({
|
|
97
|
+
createdAt: true,
|
|
98
|
+
updatedAt: true,
|
|
99
|
+
deletedAt: true,
|
|
100
|
+
deleted: true,
|
|
101
|
+
})
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
export const ${EntityName}SelectSchema = createSelectSchema(${entityName}Schema).merge(
|
|
105
|
+
baseZod${EntityName}Schema
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
export const ${EntityName}UpdateSchema = createUpdateSchema(${entityName}Schema).merge(
|
|
109
|
+
baseZod${EntityName}Schema.partial()
|
|
110
|
+
);
|
|
111
|
+
`;
|
|
112
|
+
// 3. I[Entity]Repository.ts
|
|
113
|
+
const iRepoContent = `import type { IRepository } from '@root/IRepository';
|
|
114
|
+
import type { ${EntityName}Interface } from './baseZod${EntityName}Schema';
|
|
115
|
+
|
|
116
|
+
export const ${TOKEN_BASE}_REPOSITORY_INTERFACE = 'I${EntityName}Repository';
|
|
117
|
+
|
|
118
|
+
export interface I${EntityName}Repository extends IRepository<${EntityName}Interface> {
|
|
119
|
+
// Add entity-specific repository methods here
|
|
120
|
+
}
|
|
121
|
+
`;
|
|
122
|
+
// 4. [Entity]Repository.ts
|
|
123
|
+
const repoContent = `import { BaseRepository } from '@root/BaseRepository';
|
|
124
|
+
import {
|
|
125
|
+
${TOKEN_BASE}_REPOSITORY_INTERFACE,
|
|
126
|
+
type I${EntityName}Repository,
|
|
127
|
+
} from './I${EntityName}Repository';
|
|
128
|
+
import { ${entityName}Schema, type ${EntityName}SchemaType } from './${EntityName}';
|
|
129
|
+
import { type ${EntityName}Interface } from './baseZod${EntityName}Schema';
|
|
130
|
+
import { Inject, Service } from '@kanian77/simple-di';
|
|
131
|
+
import { DB_SERVICE, DbService } from 'db/DbService';
|
|
132
|
+
|
|
133
|
+
@Service({ token: ${TOKEN_BASE}_REPOSITORY_INTERFACE })
|
|
134
|
+
export class ${EntityName}Repository
|
|
135
|
+
extends BaseRepository<${EntityName}Interface, ${EntityName}SchemaType>
|
|
136
|
+
implements I${EntityName}Repository
|
|
137
|
+
{
|
|
138
|
+
constructor(@Inject(DB_SERVICE) private dbService: DbService) {
|
|
139
|
+
super(${entityName}Schema, dbService);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async find(config?: any): Promise<${EntityName}Interface[]> {
|
|
143
|
+
return (await this.db.query.${entityName}Schema.findMany(
|
|
144
|
+
config
|
|
145
|
+
)) as unknown as ${EntityName}Interface[];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async findOne(config?: any): Promise<${EntityName}Interface> {
|
|
149
|
+
return (await this.db.query.${entityName}Schema.findFirst(
|
|
150
|
+
config
|
|
151
|
+
)) as unknown as ${EntityName}Interface;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
`;
|
|
155
|
+
// 5. [Entity]RepositoryModule.ts
|
|
156
|
+
const repoModuleContent = `import { Module } from '@kanian77/simple-di';
|
|
157
|
+
import { ${TOKEN_BASE}_REPOSITORY_INTERFACE } from './I${EntityName}Repository';
|
|
158
|
+
import { ${EntityName}Repository } from './${EntityName}Repository';
|
|
159
|
+
import { getConfigModule } from 'config/getConfigModule';
|
|
160
|
+
import { getDbModule } from 'db/getDbModule';
|
|
161
|
+
|
|
162
|
+
export const ${EntityName}RepositoryModule = new Module({
|
|
163
|
+
imports: [getConfigModule(), getDbModule()],
|
|
164
|
+
providers: [
|
|
165
|
+
{
|
|
166
|
+
provide: ${TOKEN_BASE}_REPOSITORY_INTERFACE,
|
|
167
|
+
useClass: ${EntityName}Repository,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
});
|
|
171
|
+
`;
|
|
172
|
+
// 6. I[Entity]Service.ts
|
|
173
|
+
const iServiceContent = `import type { IService } from '@root/IService';
|
|
174
|
+
import type { ${EntityName}Interface } from './baseZod${EntityName}Schema';
|
|
175
|
+
|
|
176
|
+
export const ${TOKEN_BASE}_SERVICE_INTERFACE = 'I${EntityName}Service';
|
|
177
|
+
|
|
178
|
+
export interface I${EntityName}Service extends IService<${EntityName}Interface> {
|
|
179
|
+
// Add entity-specific service methods here
|
|
180
|
+
}
|
|
181
|
+
`;
|
|
182
|
+
// 7. [Entity]Service.ts
|
|
183
|
+
const serviceContent = `import { BaseService } from '@root/BaseService';
|
|
184
|
+
import type { ${EntityName}Interface } from './baseZod${EntityName}Schema';
|
|
185
|
+
import {
|
|
186
|
+
${TOKEN_BASE}_SERVICE_INTERFACE,
|
|
187
|
+
type I${EntityName}Service,
|
|
188
|
+
} from './I${EntityName}Service';
|
|
189
|
+
import {
|
|
190
|
+
${TOKEN_BASE}_REPOSITORY_INTERFACE,
|
|
191
|
+
type I${EntityName}Repository,
|
|
192
|
+
} from './I${EntityName}Repository';
|
|
193
|
+
import {
|
|
194
|
+
${EntityName}InsertSchema,
|
|
195
|
+
${EntityName}SelectSchema,
|
|
196
|
+
${EntityName}UpdateSchema,
|
|
197
|
+
} from './${EntityName}';
|
|
198
|
+
import { Inject, Service } from '@kanian77/simple-di';
|
|
199
|
+
|
|
200
|
+
@Service({ token: ${TOKEN_BASE}_SERVICE_INTERFACE })
|
|
201
|
+
export class ${EntityName}Service
|
|
202
|
+
extends BaseService<${EntityName}Interface>
|
|
203
|
+
implements I${EntityName}Service
|
|
204
|
+
{
|
|
205
|
+
constructor(
|
|
206
|
+
@Inject(${TOKEN_BASE}_REPOSITORY_INTERFACE)
|
|
207
|
+
private readonly ${entityName}Repository: I${EntityName}Repository
|
|
208
|
+
) {
|
|
209
|
+
super(
|
|
210
|
+
${entityName}Repository,
|
|
211
|
+
${EntityName}InsertSchema,
|
|
212
|
+
${EntityName}UpdateSchema,
|
|
213
|
+
${EntityName}SelectSchema
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
`;
|
|
218
|
+
// 8. [Entity]ServiceModule.ts
|
|
219
|
+
const serviceModuleContent = `import { Module } from '@kanian77/simple-di';
|
|
220
|
+
import { ${EntityName}Service } from './${EntityName}Service';
|
|
221
|
+
import { ${EntityName}RepositoryModule } from './${EntityName}RepositoryModule';
|
|
222
|
+
import { ${TOKEN_BASE}_SERVICE_INTERFACE } from './I${EntityName}Service';
|
|
223
|
+
|
|
224
|
+
export const ${EntityName}ServiceModule = new Module({
|
|
225
|
+
imports: [${EntityName}RepositoryModule],
|
|
226
|
+
providers: [
|
|
227
|
+
{
|
|
228
|
+
provide: ${TOKEN_BASE}_SERVICE_INTERFACE,
|
|
229
|
+
useClass: ${EntityName}Service,
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
});
|
|
233
|
+
`;
|
|
234
|
+
// 9. [Entity]Module.ts
|
|
235
|
+
const mainModuleContent = `import { Module } from '@kanian77/simple-di';
|
|
236
|
+
import { ${EntityName}RepositoryModule } from './${EntityName}RepositoryModule';
|
|
237
|
+
import { ${EntityName}ServiceModule } from './${EntityName}ServiceModule';
|
|
238
|
+
|
|
239
|
+
export const ${EntityName}Module = new Module({
|
|
240
|
+
imports: [${EntityName}RepositoryModule, ${EntityName}ServiceModule],
|
|
241
|
+
});
|
|
242
|
+
`;
|
|
243
|
+
// 10. [Entity]Repository.spec.ts
|
|
244
|
+
const testContent = `import { afterAll, afterEach, beforeAll, describe, expect, it } from 'bun:test';
|
|
245
|
+
import { ${EntityName}Repository } from './${EntityName}Repository';
|
|
246
|
+
import { randomUUIDv7 } from 'bun';
|
|
247
|
+
import * as schema from '@root/schema';
|
|
248
|
+
import { NeonHttpDatabase } from 'drizzle-orm/neon-http';
|
|
249
|
+
import {
|
|
250
|
+
EnvFileNames,
|
|
251
|
+
} from '@root/lib';
|
|
252
|
+
import { ${TOKEN_BASE}_REPOSITORY_INTERFACE } from './I${EntityName}Repository';
|
|
253
|
+
import { bootstrap, inject, Module } from '@kanian77/simple-di';
|
|
254
|
+
import { DB_SERVICE, DbService } from 'db/DbService';
|
|
255
|
+
import { getConfigModule } from 'config/getConfigModule';
|
|
256
|
+
|
|
257
|
+
describe('${EntityName}Repository', () => {
|
|
258
|
+
let ${entityName}Repository: ${EntityName}Repository;
|
|
259
|
+
let db: NeonHttpDatabase<typeof schema>;
|
|
260
|
+
|
|
261
|
+
const clear = async (db: NeonHttpDatabase<typeof schema>) => {
|
|
262
|
+
// await db.delete(schema.${entityName}Schema).execute();
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
beforeAll(async () => {
|
|
266
|
+
const ConfigModule = getConfigModule(EnvFileNames.TESTING);
|
|
267
|
+
const DbModule = getConfigModule(EnvFileNames.TESTING);
|
|
268
|
+
|
|
269
|
+
const ${EntityName}RepositoryModule = new Module({
|
|
270
|
+
imports: [ConfigModule, DbModule],
|
|
271
|
+
providers: [
|
|
272
|
+
{
|
|
273
|
+
provide: ${TOKEN_BASE}_REPOSITORY_INTERFACE,
|
|
274
|
+
useClass: ${EntityName}Repository,
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
const TestModule = new Module({
|
|
280
|
+
imports: [
|
|
281
|
+
ConfigModule,
|
|
282
|
+
DbModule,
|
|
283
|
+
${EntityName}RepositoryModule,
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
bootstrap(TestModule);
|
|
288
|
+
|
|
289
|
+
db = inject<DbService>(DB_SERVICE).getDb();
|
|
290
|
+
${entityName}Repository = inject<${EntityName}Repository>(${TOKEN_BASE}_REPOSITORY_INTERFACE);
|
|
291
|
+
|
|
292
|
+
await clear(db);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
afterEach(async () => {
|
|
296
|
+
// await db.delete(schema.${entityName}Schema).execute();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
afterAll(async () => {
|
|
300
|
+
await clear(db);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('should be defined', () => {
|
|
304
|
+
expect(${entityName}Repository).toBeDefined();
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
`;
|
|
308
|
+
// Write files
|
|
309
|
+
const files = [
|
|
310
|
+
{ name: `baseZod${EntityName}Schema.ts`, content: baseZodSchemaContent },
|
|
311
|
+
{ name: `${EntityName}.ts`, content: schemaContent },
|
|
312
|
+
{ name: `I${EntityName}Repository.ts`, content: iRepoContent },
|
|
313
|
+
{ name: `${EntityName}Repository.ts`, content: repoContent },
|
|
314
|
+
{ name: `${EntityName}RepositoryModule.ts`, content: repoModuleContent },
|
|
315
|
+
{ name: `I${EntityName}Service.ts`, content: iServiceContent },
|
|
316
|
+
{ name: `${EntityName}Service.ts`, content: serviceContent },
|
|
317
|
+
{ name: `${EntityName}ServiceModule.ts`, content: serviceModuleContent },
|
|
318
|
+
{ name: `${EntityName}Module.ts`, content: mainModuleContent },
|
|
319
|
+
{ name: `${EntityName}Repository.spec.ts`, content: testContent },
|
|
320
|
+
];
|
|
321
|
+
for (const file of files) {
|
|
322
|
+
await writeFile(join(targetDir, file.name), file.content);
|
|
323
|
+
console.log(`Created: ${file.name}`);
|
|
324
|
+
}
|
|
325
|
+
// Auto-Registration
|
|
326
|
+
// 1. src/schema.ts
|
|
327
|
+
const schemaPath = join(srcDir, 'schema.ts');
|
|
328
|
+
if (existsSync(schemaPath)) {
|
|
329
|
+
let content = await readFile(schemaPath, 'utf8');
|
|
330
|
+
const exportStatement = `export * from "@root/core/${kebabName}/${EntityName}";`;
|
|
331
|
+
if (!content.includes(exportStatement)) {
|
|
332
|
+
content += `\n${exportStatement}\n`;
|
|
333
|
+
await writeFile(schemaPath, content);
|
|
334
|
+
console.log(`Updated src/schema.ts`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.warn(`Warning: src/schema.ts not found`);
|
|
339
|
+
}
|
|
340
|
+
// 2. src/core/CoreModule.ts
|
|
341
|
+
const coreModulePath = join(srcDir, 'core/CoreModule.ts');
|
|
342
|
+
if (existsSync(coreModulePath)) {
|
|
343
|
+
let content = await readFile(coreModulePath, 'utf8');
|
|
344
|
+
const importStatement = `import { ${EntityName}Module } from './${kebabName}/${EntityName}Module';`;
|
|
345
|
+
if (!content.includes(importStatement)) {
|
|
346
|
+
// Add import
|
|
347
|
+
// Attempt to insert after last import or at top
|
|
348
|
+
const lastImportIndex = content.lastIndexOf('import ');
|
|
349
|
+
if (lastImportIndex !== -1) {
|
|
350
|
+
const nextLineIndex = content.indexOf('\n', lastImportIndex);
|
|
351
|
+
content =
|
|
352
|
+
content.slice(0, nextLineIndex + 1) +
|
|
353
|
+
importStatement +
|
|
354
|
+
'\n' +
|
|
355
|
+
content.slice(nextLineIndex + 1);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
content = importStatement + '\n' + content;
|
|
359
|
+
}
|
|
360
|
+
// Add to imports array
|
|
361
|
+
const importsStartIndex = content.indexOf('imports: [');
|
|
362
|
+
if (importsStartIndex !== -1) {
|
|
363
|
+
const arrayStart = importsStartIndex + 'imports: ['.length;
|
|
364
|
+
let depth = 1;
|
|
365
|
+
let endIndex = -1;
|
|
366
|
+
for (let i = arrayStart; i < content.length; i++) {
|
|
367
|
+
if (content[i] === '[')
|
|
368
|
+
depth++;
|
|
369
|
+
if (content[i] === ']')
|
|
370
|
+
depth--;
|
|
371
|
+
if (depth === 0) {
|
|
372
|
+
endIndex = i;
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (endIndex !== -1) {
|
|
377
|
+
const arrayContent = content.slice(arrayStart, endIndex);
|
|
378
|
+
if (!arrayContent.includes(`${EntityName}Module`)) {
|
|
379
|
+
const trimmed = arrayContent.trim();
|
|
380
|
+
const hasTrailingComma = trimmed.endsWith(',');
|
|
381
|
+
const separator = trimmed.length > 0 && !hasTrailingComma ? ', ' : '';
|
|
382
|
+
// Determine indentation
|
|
383
|
+
const insertion = `${separator}\n ${EntityName}Module,`;
|
|
384
|
+
content =
|
|
385
|
+
content.slice(0, endIndex) + insertion + content.slice(endIndex);
|
|
386
|
+
await writeFile(coreModulePath, content);
|
|
387
|
+
console.log(`Updated src/core/CoreModule.ts`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
console.warn('Warning: Could not find closing bracket for imports array in CoreModule.ts');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// Try regex if exact string 'imports: [' not found (e.g. whitespace differences)
|
|
396
|
+
const importsRegex = /imports:\s*\[/g;
|
|
397
|
+
const match = importsRegex.exec(content);
|
|
398
|
+
if (match) {
|
|
399
|
+
const arrayStart = match.index + match[0].length;
|
|
400
|
+
let depth = 1;
|
|
401
|
+
let endIndex = -1;
|
|
402
|
+
for (let i = arrayStart; i < content.length; i++) {
|
|
403
|
+
if (content[i] === '[')
|
|
404
|
+
depth++;
|
|
405
|
+
if (content[i] === ']')
|
|
406
|
+
depth--;
|
|
407
|
+
if (depth === 0) {
|
|
408
|
+
endIndex = i;
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (endIndex !== -1) {
|
|
413
|
+
const arrayContent = content.slice(arrayStart, endIndex);
|
|
414
|
+
if (!arrayContent.includes(`${EntityName}Module`)) {
|
|
415
|
+
const trimmed = arrayContent.trim();
|
|
416
|
+
const hasTrailingComma = trimmed.endsWith(',');
|
|
417
|
+
const separator = trimmed.length > 0 && !hasTrailingComma ? ', ' : '';
|
|
418
|
+
const insertion = `${separator}\n ${EntityName}Module,`;
|
|
419
|
+
content =
|
|
420
|
+
content.slice(0, endIndex) +
|
|
421
|
+
insertion +
|
|
422
|
+
content.slice(endIndex);
|
|
423
|
+
await writeFile(coreModulePath, content);
|
|
424
|
+
console.log(`Updated src/core/CoreModule.ts`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
console.warn('Warning: Could not find imports array in CoreModule.ts');
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
console.warn('Warning: src/core/CoreModule.ts not found');
|
|
436
|
+
}
|
|
437
|
+
console.log('\n✅ Module generation complete!');
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=create_module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_module.js","sourceRoot":"","sources":["../src/create_module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate_skeleton.d.ts","sourceRoot":"","sources":["../src/generate_skeleton.ts"],"names":[],"mappings":"AAUA,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwQzE"}
|