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.
Files changed (71) hide show
  1. package/README.md +96 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +53 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/create_module.d.ts +2 -0
  7. package/dist/create_module.d.ts.map +1 -0
  8. package/dist/create_module.js +439 -0
  9. package/dist/create_module.js.map +1 -0
  10. package/dist/generate_skeleton.d.ts +2 -0
  11. package/dist/generate_skeleton.d.ts.map +1 -0
  12. package/dist/generate_skeleton.js +249 -0
  13. package/dist/generate_skeleton.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +3 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/templates/.env.development +3 -0
  19. package/dist/templates/AppModule.ts +7 -0
  20. package/dist/templates/Config.ts +98 -0
  21. package/dist/templates/UseCaseModule.ts +5 -0
  22. package/dist/templates/config/getConfigModule.ts +12 -0
  23. package/dist/templates/db/DbService.ts +18 -0
  24. package/dist/templates/db/getDb.ts +11 -0
  25. package/dist/templates/db/getDbModule.ts +15 -0
  26. package/dist/templates/db/initDb.ts +11 -0
  27. package/dist/templates/main.routes.ts +10 -0
  28. package/dist/templates/main.ts +91 -0
  29. package/dist/templates/package.json +51 -0
  30. package/dist/templates/schema.ts +1 -0
  31. package/dist/templates/src/BaseRepository.ts +136 -0
  32. package/dist/templates/src/BaseService.ts +78 -0
  33. package/dist/templates/src/IRepository.ts +11 -0
  34. package/dist/templates/src/IService.ts +6 -0
  35. package/dist/templates/src/core/baseSchema.ts +13 -0
  36. package/dist/templates/src/lib/AuthenticationUtils.ts +49 -0
  37. package/dist/templates/src/lib/errors/BadRequestException.ts +11 -0
  38. package/dist/templates/src/lib/errors/ConflictException.ts +9 -0
  39. package/dist/templates/src/lib/errors/ForbiddenException.ts +11 -0
  40. package/dist/templates/src/lib/errors/HttpException.ts +22 -0
  41. package/dist/templates/src/lib/errors/InternalServerException.ts +13 -0
  42. package/dist/templates/src/lib/errors/NotFoundException.ts +11 -0
  43. package/dist/templates/src/lib/errors/UnauthorizedException.ts +11 -0
  44. package/dist/templates/src/lib/functions/getEnvFile.ts +19 -0
  45. package/dist/templates/src/lib/functions/getHostname.ts +18 -0
  46. package/dist/templates/src/lib/functions/isNotNullNorUndefined.ts +5 -0
  47. package/dist/templates/src/lib/functions/tableName.ts +5 -0
  48. package/dist/templates/src/lib/functions/withBaseSchema.ts +30 -0
  49. package/dist/templates/src/lib/types/BaseEntityInterface.ts +9 -0
  50. package/dist/templates/src/lib/types/EnvFileNames.ts +7 -0
  51. package/dist/templates/src/lib/types/Envs.ts +7 -0
  52. package/dist/templates/src/lib/types/FailedOperation.ts +9 -0
  53. package/dist/templates/src/lib/types/OperationResult.ts +5 -0
  54. package/dist/templates/src/lib/types/SharedStubs.ts +16 -0
  55. package/dist/templates/src/lib/types/SuccessfullOperation.ts +9 -0
  56. package/dist/templates/src/lib/types/TableNameToken.ts +1 -0
  57. package/dist/templates/src/lib/types/TokenPayload.ts +6 -0
  58. package/dist/templates/src/lib/types/UserInterface.ts +10 -0
  59. package/dist/templates/src/lib/types/getCorsOrigin.ts +20 -0
  60. package/dist/templates/src/main.routes.ts +11 -0
  61. package/dist/templates/src/use-case/IUseCase.ts +3 -0
  62. package/dist/templates/src/use-case/UseCaseModule.ts +6 -0
  63. package/dist/templates/src/use-case/health-check/HealthCheck.ts +24 -0
  64. package/dist/templates/src/use-case/health-check/healthCheckRoutes.ts +23 -0
  65. package/dist/templates/src/use-case/health-check/outputs/HealthCheckSuccess.ts +14 -0
  66. package/dist/templates/tsconfig.json +46 -0
  67. package/package.json +41 -0
  68. package/src/templates/.env.development +3 -0
  69. package/src/templates/package.json +51 -0
  70. package/src/templates/tsconfig.json +46 -0
  71. 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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,2 @@
1
+ export declare function createModule(rawName: string): Promise<void>;
2
+ //# sourceMappingURL=create_module.d.ts.map
@@ -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,2 @@
1
+ export declare function generateSkeleton(projectName: string): Promise<void>;
2
+ //# sourceMappingURL=generate_skeleton.d.ts.map
@@ -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"}