simpledi-app-generator 0.0.18 → 0.1.0

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 CHANGED
@@ -63,7 +63,7 @@ my-project/
63
63
  └── src/
64
64
  ├── AppModule.ts # Root module
65
65
  ├── schema.ts # Drizzle schema exports
66
- ├── main.routes.ts # Route registrations
66
+ ├── main.routes.ts # Auto-discovers *Routes.{ts,js} files via Bun glob
67
67
  ├── core/ # Entity modules (generated)
68
68
  ├── lib/ # Utilities, types, errors
69
69
  └── use-case/ # Use case modules
@@ -76,16 +76,16 @@ my-project/
76
76
  Generated projects use [Neon](https://neon.tech) serverless PostgreSQL. Add your connection string to `.env.development`:
77
77
 
78
78
  ```env
79
- DATABASE_URL=postgres://user:password@your-neon-host.neon.tech/dbname?sslmode=require
79
+ CONNECTION_STRING=postgres://user:password@your-neon-host.neon.tech/dbname?sslmode=require
80
80
  ```
81
81
 
82
82
  ### Environment Variables
83
83
 
84
- | Variable | Description |
85
- | -------------- | --------------------------------- |
86
- | `DATABASE_URL` | Neon PostgreSQL connection string |
87
- | `JWT_SECRET` | Secret key for JWT tokens |
88
- | `PORT` | Server port (default: 3000) |
84
+ | Variable | Description |
85
+ | ------------------- | --------------------------------- |
86
+ | `CONNECTION_STRING` | Neon PostgreSQL connection string |
87
+ | `JWT_SECRET` | Secret key for JWT tokens |
88
+ | `PORT` | Server port (default: 3000) |
89
89
 
90
90
  ## Tech Stack
91
91
 
@@ -1 +1 @@
1
- {"version":3,"file":"create_use_case.d.ts","sourceRoot":"","sources":["../src/create_use_case.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAM,EAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Rf"}
1
+ {"version":3,"file":"create_use_case.d.ts","sourceRoot":"","sources":["../src/create_use_case.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAM,EAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAiUf"}
@@ -110,7 +110,8 @@ import { inject } from '@kanian77/simple-di';
110
110
  import { ${EntityName}, ${TOKEN_BASE}_USE_CASE_TOKEN } from './${EntityName}';
111
111
  import { ${EntityName}Failure } from './outputs/${EntityName}Failure';
112
112
 
113
- const ${entityName}Routes = new Hono();
113
+ export const ${entityName}Routes = new Hono();
114
+ export const ${entityName}RoutesPath = '/${kebabName}';
114
115
 
115
116
  ${entityName}Routes.get('/', async (c) => {
116
117
  try {
@@ -127,9 +128,83 @@ ${entityName}Routes.get('/', async (c) => {
127
128
  }
128
129
  });
129
130
 
130
- const ${entityName}RoutesPath = '/${kebabName}';
131
+ export { ${entityName}Routes as Route, ${entityName}RoutesPath as Path };
132
+ `;
133
+ // 5. <EntityName>.e2e.spec.ts (Stub E2E Test)
134
+ const importDefs = imports.map((imp) => {
135
+ const pascal = toPascalCase(imp);
136
+ const camel = toCamelCase(imp);
137
+ const kebab = toKebabCase(imp);
138
+ const upper = toUpperSnakeCase(imp);
139
+ return { pascal, camel, kebab, upper };
140
+ });
141
+ const coreModuleImports = importDefs
142
+ .map((d) => `import { ${d.pascal}Module } from '@root/core/${d.kebab}/${d.pascal}Module';`)
143
+ .join('\n');
144
+ const repoTypeImports = importDefs
145
+ .map((d) => `import type { ${d.pascal}Repository } from '@root/core/${d.kebab}/${d.pascal}Repository';\nimport { ${d.upper}_REPOSITORY_INTERFACE } from '@root/core/${d.kebab}/I${d.pascal}Repository';`)
146
+ .join('\n');
147
+ const letDeclarations = importDefs
148
+ .map((d) => ` let ${d.camel}Repository: ${d.pascal}Repository;`)
149
+ .join('\n');
150
+ // Deletes in reverse order (dependencies last)
151
+ const schemaDeletes = [...importDefs]
152
+ .reverse()
153
+ .map((d) => ` await db.delete(schema.${d.camel}Schema).execute();`)
154
+ .join('\n');
155
+ const bootstrapModules = [
156
+ ...importDefs.map((d) => ` ${d.pascal}Module`),
157
+ ` ${EntityName}Module`,
158
+ ].join(',\n');
159
+ const injectCalls = importDefs
160
+ .map((d) => ` ${d.camel}Repository = inject(${d.upper}_REPOSITORY_INTERFACE);`)
161
+ .join('\n');
162
+ const smokeAssertions = importDefs
163
+ .map((d) => ` expect(${d.camel}Repository).toBeDefined();`)
164
+ .join('\n');
165
+ const specContent = `import { afterAll, afterEach, beforeAll, describe, expect, test } from 'bun:test';
166
+ import { inject, bootstrap, Module } from '@kanian77/simple-di';
167
+ import { getDb } from 'db/getDb';
168
+ import * as schema from '@root/schema';
169
+ ${coreModuleImports}
170
+ import { getDbModule } from 'db/getDbModule';
171
+ import { getConfigModule } from 'config/getConfigModule';
172
+ import { EnvFileNames } from '@root/lib';
173
+ import { ${EntityName}Module } from './${EntityName}';
174
+ ${repoTypeImports}
175
+
176
+ describe('${EntityName} Use Case', () => {
177
+ ${letDeclarations}
131
178
 
132
- export { ${entityName}Routes, ${entityName}RoutesPath };
179
+ const clear = async (db: ReturnType<typeof getDb>) => {
180
+ ${schemaDeletes}
181
+ };
182
+
183
+ beforeAll(async () => {
184
+ bootstrap(
185
+ new Module({
186
+ imports: [
187
+ getConfigModule(EnvFileNames.TESTING),
188
+ getDbModule(EnvFileNames.TESTING),
189
+ ${bootstrapModules},
190
+ ],
191
+ }),
192
+ );
193
+ ${injectCalls}
194
+ });
195
+
196
+ afterEach(async () => {
197
+ await clear(getDb());
198
+ });
199
+
200
+ afterAll(async () => {
201
+ await clear(getDb());
202
+ });
203
+
204
+ test('repos are defined', async () => {
205
+ ${smokeAssertions}
206
+ });
207
+ });
133
208
  `;
134
209
  // Write files
135
210
  const files = [
@@ -144,6 +219,12 @@ export { ${entityName}Routes, ${entityName}RoutesPath };
144
219
  { path: join(targetDir, `${EntityName}.ts`), content: useCaseContent },
145
220
  { path: join(targetDir, `${entityName}Routes.ts`), content: routesContent },
146
221
  ];
222
+ if (imports.length > 0) {
223
+ files.push({
224
+ path: join(targetDir, `${EntityName}.e2e.spec.ts`),
225
+ content: specContent,
226
+ });
227
+ }
147
228
  for (const file of files) {
148
229
  await writeFile(file.path, file.content);
149
230
  console.log(`Created: ${file.path.replace(process.cwd() + '/', '')}`);
@@ -204,63 +285,6 @@ export { ${entityName}Routes, ${entityName}RoutesPath };
204
285
  else {
205
286
  console.warn('Warning: src/use-case/UseCaseModule.ts not found');
206
287
  }
207
- // 2. src/main.routes.ts
208
- const mainRoutesPath = join(srcDir, 'main.routes.ts');
209
- if (existsSync(mainRoutesPath)) {
210
- let content = await readFile(mainRoutesPath, 'utf8');
211
- const importStatement = `import {\n ${entityName}Routes,\n ${entityName}RoutesPath,\n} from './use-case/${kebabName}/${entityName}Routes';`;
212
- if (!content.includes(`${entityName}Routes`)) {
213
- // Add import after last import
214
- const lastImportIndex = content.lastIndexOf('import ');
215
- if (lastImportIndex !== -1) {
216
- // Find the end of this import (could be multi-line)
217
- let searchPos = lastImportIndex;
218
- let importEndIndex = -1;
219
- // Look for the semicolon that ends the import
220
- while (searchPos < content.length) {
221
- if (content[searchPos] === ';') {
222
- importEndIndex = searchPos;
223
- break;
224
- }
225
- searchPos++;
226
- }
227
- if (importEndIndex !== -1) {
228
- content =
229
- content.slice(0, importEndIndex + 1) +
230
- '\n' +
231
- importStatement +
232
- content.slice(importEndIndex + 1);
233
- }
234
- }
235
- else {
236
- content = importStatement + '\n' + content;
237
- }
238
- // Add route registration before export
239
- const routeRegistration = `mainRoutes.route(${entityName}RoutesPath, ${entityName}Routes);`;
240
- if (!content.includes(routeRegistration)) {
241
- // Find line before 'export { mainRoutes }'
242
- const exportIndex = content.indexOf('export { mainRoutes }');
243
- if (exportIndex !== -1) {
244
- content =
245
- content.slice(0, exportIndex) +
246
- routeRegistration +
247
- '\n\n' +
248
- content.slice(exportIndex);
249
- }
250
- else {
251
- // Fallback: add before last line
252
- const lines = content.split('\n');
253
- lines.splice(lines.length - 1, 0, routeRegistration);
254
- content = lines.join('\n');
255
- }
256
- }
257
- await writeFile(mainRoutesPath, content);
258
- console.log(`Updated: src/main.routes.ts`);
259
- }
260
- }
261
- else {
262
- console.warn('Warning: src/main.routes.ts not found');
263
- }
264
288
  console.log('\n✅ Use case generation complete!');
265
289
  }
266
290
  //# sourceMappingURL=create_use_case.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create_use_case.js","sourceRoot":"","sources":["../src/create_use_case.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create_use_case.js","sourceRoot":"","sources":["../src/create_use_case.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simpledi-app-generator",
3
- "version": "0.0.18",
3
+ "version": "0.1.0",
4
4
  "description": "generates a @kanian77/simple-di app",
5
5
  "author": {
6
6
  "name": "Patrick Assoa Adou",
package/user-guide.md CHANGED
@@ -37,7 +37,7 @@ my-app/
37
37
  └── src/
38
38
  ├── AppModule.ts # Root DI module
39
39
  ├── schema.ts # Drizzle schema exports
40
- ├── main.routes.ts # Route registrations
40
+ ├── main.routes.ts # Auto-discovers *Routes.{ts,js} via Bun glob
41
41
  ├── core/ # Entity modules
42
42
  │ └── CoreModule.ts
43
43
  ├── lib/ # Utilities, types, errors
@@ -47,6 +47,9 @@ my-app/
47
47
  └── health-check/
48
48
  ```
49
49
 
50
+ > [!NOTE]
51
+ > Routes are **automatically registered** — any file matching `*Routes.{ts,js}` that exports `Route` and `Path` is picked up by the glob scanner. No manual wiring needed.
52
+
50
53
  ---
51
54
 
52
55
  ### `simpledi module <entity-name>`
@@ -88,7 +91,7 @@ simpledi module blog-post
88
91
  - Adds export to `src/schema.ts`
89
92
  - Adds module to `src/core/CoreModule.ts`
90
93
  - Adds use case module to `src/use-case/UseCaseModule.ts`
91
- - Registers routes in `src/main.routes.ts`
94
+ - Routes are auto-discovered via `main.routes.ts` glob — no manual registration required
92
95
 
93
96
  ---
94
97
 
@@ -107,25 +110,36 @@ simpledi use-case assign-role imports=user
107
110
 
108
111
  **Generated files** in `src/use-case/<name>/`:
109
112
 
110
- | File | Purpose |
111
- | -------------------------- | ---------------------------------------------------------- |
112
- | `<Name>.ts` | Use case class with `@Service` decorator and Module export |
113
- | `<name>Routes.ts` | Hono route handler |
114
- | `outputs/<Name>Success.ts` | Typed success response + payload type |
115
- | `outputs/<Name>Failure.ts` | Typed failure response |
113
+ | File | Purpose |
114
+ | -------------------------- | ------------------------------------------------------------------ |
115
+ | `<Name>.ts` | Use case class with `@Service` decorator and Module export |
116
+ | `<name>Routes.ts` | Hono route handler — exports `Route` and `Path` for auto-discovery |
117
+ | `outputs/<Name>Success.ts` | Typed success response + payload type |
118
+ | `outputs/<Name>Failure.ts` | Typed failure response |
119
+ | `<Name>.e2e.spec.ts` | Stub E2E test _(only when `imports=` is provided)_ |
116
120
 
117
121
  **Auto-registration:**
118
122
 
119
123
  - Adds module to `src/use-case/UseCaseModule.ts`
120
- - Adds routes to `src/main.routes.ts`
124
+ - Route is auto-discovered via `main.routes.ts` glob — no manual registration required
125
+
126
+ **`imports=` parameter:**
121
127
 
122
- **Imports parameter:**
128
+ When you specify `imports=user,cohort,enrollment` the generator:
123
129
 
124
- When you specify `imports=user`, the generator:
130
+ 1. Adds each entity's `Module` to the use case module's `imports` array
131
+ 2. Generates a ready-to-run stub E2E spec (`<Name>.e2e.spec.ts`) that:
132
+ - Imports each entity's `Repository` type and `*_REPOSITORY_INTERFACE` token
133
+ - Declares `let` variables for each repository
134
+ - Wires up `bootstrap()` with all modules + the use case module
135
+ - Calls `inject()` for each repository
136
+ - Cleans up schemas in **reverse** import order (dependencies last)
137
+ - Includes a `test('repos are defined')` smoke test to verify DI is wired correctly
125
138
 
126
- 1. Converts entity name to module: `user` → `UserModule`
127
- 2. Generates import path: `@root/core/user/UserModule`
128
- 3. Adds to the module's imports array
139
+ ```bash
140
+ # Generates EnrollStudent.e2e.spec.ts with user, cohort, enrollment repo setup
141
+ simpledi use-case enroll-student imports=user,cohort,enrollment
142
+ ```
129
143
 
130
144
  ---
131
145
 
@@ -191,11 +205,11 @@ bun run prepare
191
205
 
192
206
  ## Environment Variables
193
207
 
194
- | Variable | Description |
195
- | -------------- | --------------------------------- |
196
- | `DATABASE_URL` | Neon PostgreSQL connection string |
197
- | `JWT_SECRET` | Secret key for JWT tokens |
198
- | `PORT` | Server port (default: 3000) |
208
+ | Variable | Description |
209
+ | ------------------- | --------------------------------- |
210
+ | `CONNECTION_STRING` | Neon PostgreSQL connection string |
211
+ | `JWT_SECRET` | Secret key for JWT tokens |
212
+ | `PORT` | Server port (default: 3000) |
199
213
 
200
214
  ---
201
215