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 +7 -7
- package/dist/create_use_case.d.ts.map +1 -1
- package/dist/create_use_case.js +84 -60
- package/dist/create_use_case.js.map +1 -1
- package/package.json +1 -1
- package/user-guide.md +33 -19
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 #
|
|
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
|
-
|
|
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
|
|
85
|
-
|
|
|
86
|
-
| `
|
|
87
|
-
| `JWT_SECRET`
|
|
88
|
-
| `PORT`
|
|
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,
|
|
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"}
|
package/dist/create_use_case.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
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 #
|
|
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
|
-
-
|
|
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
|
-
-
|
|
124
|
+
- Route is auto-discovered via `main.routes.ts` glob — no manual registration required
|
|
125
|
+
|
|
126
|
+
**`imports=` parameter:**
|
|
121
127
|
|
|
122
|
-
|
|
128
|
+
When you specify `imports=user,cohort,enrollment` the generator:
|
|
123
129
|
|
|
124
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
195
|
-
|
|
|
196
|
-
| `
|
|
197
|
-
| `JWT_SECRET`
|
|
198
|
-
| `PORT`
|
|
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
|
|