db-model-router 1.0.0 → 1.0.2
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 +13 -13
- package/docker-compose.yml +13 -9
- package/docs/README.md +6 -6
- package/docs/SKILL.md +3 -3
- package/package.json +9 -12
- package/src/cli/generate-app.js +4 -4
- package/src/cli/generate-model.js +4 -4
- package/src/cli/generate-openapi.js +5 -1
- package/src/cli/generate-route.js +5 -5
- package/src/serve.js +2 -7
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# db-model-router
|
|
2
2
|
|
|
3
3
|
A database-agnostic REST API generator for Node.js. Works with Express or ultimate-express (a high-performance drop-in replacement). Define a model, get a full CRUD API with filtering, pagination, and bulk operations — backed by any of 9 supported databases.
|
|
4
4
|
|
|
@@ -284,13 +284,13 @@ The fastest way to go from database to running API. Scaffolds a complete Express
|
|
|
284
284
|
|
|
285
285
|
```bash
|
|
286
286
|
# Full app from MySQL
|
|
287
|
-
|
|
287
|
+
db-model-router-generate-app --type mysql --env .env
|
|
288
288
|
|
|
289
289
|
# SQLite3 into a specific directory
|
|
290
|
-
|
|
290
|
+
db-model-router-generate-app --type sqlite3 --database ./myapp.db --output ./my-api
|
|
291
291
|
|
|
292
292
|
# Postgres with specific tables and relationships
|
|
293
|
-
|
|
293
|
+
db-model-router-generate-app --type postgres --env .env --tables users,posts,posts.comments
|
|
294
294
|
```
|
|
295
295
|
|
|
296
296
|
Options:
|
|
@@ -348,16 +348,16 @@ Connects to your database, introspects all tables, and generates model files wit
|
|
|
348
348
|
|
|
349
349
|
```bash
|
|
350
350
|
# Basic usage
|
|
351
|
-
|
|
351
|
+
db-model-router-generate-model --type mysql --host localhost --database mydb --user root --password secret
|
|
352
352
|
|
|
353
353
|
# Using an .env file
|
|
354
|
-
|
|
354
|
+
db-model-router-generate-model --type postgres --env .env --output ./src/models
|
|
355
355
|
|
|
356
356
|
# SQLite3
|
|
357
|
-
|
|
357
|
+
db-model-router-generate-model --type sqlite3 --database ./myapp.db --output ./models
|
|
358
358
|
|
|
359
359
|
# Only specific tables
|
|
360
|
-
|
|
360
|
+
db-model-router-generate-model --type mysql --env .env --tables users,posts,comments
|
|
361
361
|
```
|
|
362
362
|
|
|
363
363
|
Options:
|
|
@@ -397,13 +397,13 @@ Generates Express route files for each model. If models don't exist yet, it auto
|
|
|
397
397
|
|
|
398
398
|
```bash
|
|
399
399
|
# From existing models
|
|
400
|
-
|
|
400
|
+
db-model-router-generate-route --models ./models --output ./routes
|
|
401
401
|
|
|
402
402
|
# Auto-generate models + routes in one step
|
|
403
|
-
|
|
403
|
+
db-model-router-generate-route --type mysql --env .env --models ./models --output ./routes
|
|
404
404
|
|
|
405
405
|
# SQLite3 one-liner
|
|
406
|
-
|
|
406
|
+
db-model-router-generate-route --type sqlite3 --database ./myapp.db
|
|
407
407
|
```
|
|
408
408
|
|
|
409
409
|
Options:
|
|
@@ -428,10 +428,10 @@ Use dot notation in `--tables` to declare parent-child relationships. This works
|
|
|
428
428
|
|
|
429
429
|
```bash
|
|
430
430
|
# Declare that comments belong to posts
|
|
431
|
-
|
|
431
|
+
db-model-router-generate-route --type mysql --env .env --tables users,posts,posts.comments
|
|
432
432
|
|
|
433
433
|
# Same via generate-app
|
|
434
|
-
|
|
434
|
+
db-model-router-generate-app --type mysql --env .env --tables users,posts,posts.comments
|
|
435
435
|
```
|
|
436
436
|
|
|
437
437
|
The FK column is derived by convention: `<parent_singular>_id` (e.g., `posts.comments` → `post_id`).
|
package/docker-compose.yml
CHANGED
|
@@ -5,7 +5,7 @@ networks:
|
|
|
5
5
|
services:
|
|
6
6
|
mysql:
|
|
7
7
|
image: mysql:8.0
|
|
8
|
-
container_name:
|
|
8
|
+
container_name: db-model-router-mysql
|
|
9
9
|
restart: unless-stopped
|
|
10
10
|
ports:
|
|
11
11
|
- "3306:3306"
|
|
@@ -25,7 +25,7 @@ services:
|
|
|
25
25
|
|
|
26
26
|
postgres:
|
|
27
27
|
image: postgres:16
|
|
28
|
-
container_name:
|
|
28
|
+
container_name: db-model-router-postgres
|
|
29
29
|
restart: unless-stopped
|
|
30
30
|
ports:
|
|
31
31
|
- "5432:5432"
|
|
@@ -44,7 +44,7 @@ services:
|
|
|
44
44
|
|
|
45
45
|
mongodb:
|
|
46
46
|
image: mongo:7
|
|
47
|
-
container_name:
|
|
47
|
+
container_name: db-model-router-mongodb
|
|
48
48
|
restart: unless-stopped
|
|
49
49
|
ports:
|
|
50
50
|
- "27017:27017"
|
|
@@ -59,7 +59,7 @@ services:
|
|
|
59
59
|
|
|
60
60
|
redis:
|
|
61
61
|
image: redis:7
|
|
62
|
-
container_name:
|
|
62
|
+
container_name: db-model-router-redis
|
|
63
63
|
restart: unless-stopped
|
|
64
64
|
ports:
|
|
65
65
|
- "6379:6379"
|
|
@@ -74,7 +74,7 @@ services:
|
|
|
74
74
|
|
|
75
75
|
cockroachdb:
|
|
76
76
|
image: cockroachdb/cockroach:latest
|
|
77
|
-
container_name:
|
|
77
|
+
container_name: db-model-router-cockroachdb
|
|
78
78
|
restart: unless-stopped
|
|
79
79
|
ports:
|
|
80
80
|
- "26257:26257"
|
|
@@ -91,7 +91,7 @@ services:
|
|
|
91
91
|
|
|
92
92
|
mssql:
|
|
93
93
|
image: mcr.microsoft.com/mssql/server
|
|
94
|
-
container_name:
|
|
94
|
+
container_name: db-model-router-mssql
|
|
95
95
|
restart: unless-stopped
|
|
96
96
|
ports:
|
|
97
97
|
- "1433:1433"
|
|
@@ -99,7 +99,11 @@ services:
|
|
|
99
99
|
ACCEPT_EULA: "Y"
|
|
100
100
|
MSSQL_SA_PASSWORD: "Password123!"
|
|
101
101
|
healthcheck:
|
|
102
|
-
test:
|
|
102
|
+
test:
|
|
103
|
+
[
|
|
104
|
+
"CMD-SHELL",
|
|
105
|
+
"/opt/mssql-tools*/bin/sqlcmd -S localhost -U sa -P 'Password123!' -Q 'SELECT 1' || exit 1",
|
|
106
|
+
]
|
|
103
107
|
interval: 10s
|
|
104
108
|
timeout: 5s
|
|
105
109
|
retries: 10
|
|
@@ -109,7 +113,7 @@ services:
|
|
|
109
113
|
|
|
110
114
|
dynamodb:
|
|
111
115
|
image: amazon/dynamodb-local
|
|
112
|
-
container_name:
|
|
116
|
+
container_name: db-model-router-dynamodb
|
|
113
117
|
restart: unless-stopped
|
|
114
118
|
ports:
|
|
115
119
|
- "8000:8000"
|
|
@@ -125,7 +129,7 @@ services:
|
|
|
125
129
|
|
|
126
130
|
oracle:
|
|
127
131
|
image: gvenzl/oracle-xe:21-slim
|
|
128
|
-
container_name:
|
|
132
|
+
container_name: db-model-router-oracle
|
|
129
133
|
restart: unless-stopped
|
|
130
134
|
ports:
|
|
131
135
|
- "1521:1521"
|
package/docs/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# db-model-router
|
|
2
2
|
|
|
3
3
|
A database-agnostic REST API generator for Node.js. Works with Express or ultimate-express (a high-performance drop-in replacement). Define a model, get a full CRUD API with filtering, pagination, and bulk operations — backed by any of 9 supported databases.
|
|
4
4
|
|
|
@@ -174,9 +174,9 @@ The model and route APIs remain identical across all adapters.
|
|
|
174
174
|
Scaffolds a complete Express REST API from an existing database.
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
db-model-router-generate-app --type mysql --env .env
|
|
178
|
+
db-model-router-generate-app --type sqlite3 --database ./myapp.db --output ./my-api
|
|
179
|
+
db-model-router-generate-app --type postgres --env .env --tables users,posts,posts.comments
|
|
180
180
|
```
|
|
181
181
|
|
|
182
182
|
Creates: `app.js`, `models/`, `routes/`, `middleware/logger.js`, `.env.example`, `openapi.json`
|
|
@@ -186,7 +186,7 @@ Creates: `app.js`, `models/`, `routes/`, `middleware/logger.js`, `.env.example`,
|
|
|
186
186
|
Introspects DB → generates model files with auto-detected PK, unique indexes, timestamps, soft-delete.
|
|
187
187
|
|
|
188
188
|
```bash
|
|
189
|
-
|
|
189
|
+
db-model-router-generate-model --type mysql --env .env --output ./models [--tables users,posts]
|
|
190
190
|
```
|
|
191
191
|
|
|
192
192
|
### generate-route
|
|
@@ -194,7 +194,7 @@ rest-router-generate-model --type mysql --env .env --output ./models [--tables u
|
|
|
194
194
|
Generates route files + OpenAPI spec from models. Supports parent-child via dot notation.
|
|
195
195
|
|
|
196
196
|
```bash
|
|
197
|
-
|
|
197
|
+
db-model-router-generate-route --models ./models --output ./routes [--tables posts,posts.comments]
|
|
198
198
|
```
|
|
199
199
|
|
|
200
200
|
`posts.comments` → nested route `posts/:post_id/comments` with FK scoping.
|
package/docs/SKILL.md
CHANGED
|
@@ -118,7 +118,7 @@ Generates Express Router with 9 endpoints:
|
|
|
118
118
|
### generate-app (full scaffold)
|
|
119
119
|
|
|
120
120
|
```bash
|
|
121
|
-
|
|
121
|
+
db-model-router-generate-app --type mysql --env .env [--output ./dir] [--tables users,posts,posts.comments]
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
Creates: `app.js`, `models/`, `routes/`, `middleware/logger.js`, `.env.example`, `.gitignore`, `migrations/`, `sessions/`, `openapi.json`
|
|
@@ -126,7 +126,7 @@ Creates: `app.js`, `models/`, `routes/`, `middleware/logger.js`, `.env.example`,
|
|
|
126
126
|
### generate-model (DB introspection → model files)
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
|
|
129
|
+
db-model-router-generate-model --type <db> --env .env [--output ./models] [--tables t1,t2] [--schema public]
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
Auto-detects: PK, unique indexes, DEFAULT→optional, timestamp cols, soft-delete cols.
|
|
@@ -134,7 +134,7 @@ Auto-detects: PK, unique indexes, DEFAULT→optional, timestamp cols, soft-delet
|
|
|
134
134
|
### generate-route (model files → route files + OpenAPI)
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
|
-
|
|
137
|
+
db-model-router-generate-route --models ./models --output ./routes [--tables posts,posts.comments]
|
|
138
138
|
```
|
|
139
139
|
|
|
140
140
|
Dot notation `parent.child` creates nested routes: `parent/:parent_id/child` with FK scoping via `<parent_singular>_id`.
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "db-model-router",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Generative API Creation using mysql2 and express libraries in node js",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
|
-
"generate-model": "src/cli/generate-model.js",
|
|
8
|
-
"generate-route": "src/cli/generate-route.js",
|
|
9
|
-
"generate-app": "src/cli/generate-app.js"
|
|
7
|
+
"db-model-router-generate-model": "src/cli/generate-model.js",
|
|
8
|
+
"db-model-router-generate-route": "src/cli/generate-route.js",
|
|
9
|
+
"db-model-router-generate-app": "src/cli/generate-app.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"dev": "nodemon src/serve.js",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"keywords": [
|
|
31
31
|
"mysql2",
|
|
32
32
|
"express",
|
|
33
|
+
"ultimate-express",
|
|
33
34
|
"generative",
|
|
34
35
|
"rest",
|
|
35
36
|
"api"
|
|
@@ -46,18 +47,17 @@
|
|
|
46
47
|
"node-input-validator": "^4.5.0"
|
|
47
48
|
},
|
|
48
49
|
"peerDependencies": {
|
|
49
|
-
"express": "^4.17.2 || ^5.0.0",
|
|
50
|
-
"ultimate-express": "^2.0.0",
|
|
51
|
-
"body-parser": "^1.20.0",
|
|
52
50
|
"@aws-sdk/client-dynamodb": "^3.1029.0",
|
|
53
51
|
"@aws-sdk/lib-dynamodb": "^3.1029.0",
|
|
54
52
|
"better-sqlite3": "^12.9.0",
|
|
53
|
+
"express": "^4.17.2 || ^5.0.0",
|
|
55
54
|
"ioredis": "^5.10.1",
|
|
56
55
|
"mongodb": "^7.1.1",
|
|
57
56
|
"mssql": "^12.2.1",
|
|
58
57
|
"mysql2": "^3.14.4",
|
|
59
58
|
"oracledb": "^6.10.0",
|
|
60
|
-
"pg": "^8.20.0"
|
|
59
|
+
"pg": "^8.20.0",
|
|
60
|
+
"ultimate-express": "^2.0.0"
|
|
61
61
|
},
|
|
62
62
|
"peerDependenciesMeta": {
|
|
63
63
|
"express": {
|
|
@@ -66,9 +66,6 @@
|
|
|
66
66
|
"ultimate-express": {
|
|
67
67
|
"optional": true
|
|
68
68
|
},
|
|
69
|
-
"body-parser": {
|
|
70
|
-
"optional": true
|
|
71
|
-
},
|
|
72
69
|
"@aws-sdk/client-dynamodb": {
|
|
73
70
|
"optional": true
|
|
74
71
|
},
|
|
@@ -98,7 +95,7 @@
|
|
|
98
95
|
}
|
|
99
96
|
},
|
|
100
97
|
"devDependencies": {
|
|
101
|
-
"
|
|
98
|
+
"better-sqlite3": "^12.9.0",
|
|
102
99
|
"dotenv-cli": "^11.0.0",
|
|
103
100
|
"express": "^4.21.0",
|
|
104
101
|
"faker": "^5.5.3",
|
package/src/cli/generate-app.js
CHANGED
|
@@ -320,7 +320,7 @@ function parseArgs(argv) {
|
|
|
320
320
|
|
|
321
321
|
function printUsage() {
|
|
322
322
|
console.log(`
|
|
323
|
-
Usage:
|
|
323
|
+
Usage: db-model-router-generate-app --type <db_type> [options]
|
|
324
324
|
|
|
325
325
|
Scaffolds a complete Express REST API app from an existing database.
|
|
326
326
|
Creates: app.js, models/, routes/, middleware/logger.js, migrations/, sessions/, .env.example
|
|
@@ -339,9 +339,9 @@ Options:
|
|
|
339
339
|
--help Show this help message
|
|
340
340
|
|
|
341
341
|
Examples:
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
342
|
+
db-model-router-generate-app --type mysql --env .env
|
|
343
|
+
db-model-router-generate-app --type sqlite3 --database ./myapp.db --output ./my-api
|
|
344
|
+
db-model-router-generate-app --type postgres --env .env --tables users,posts,posts.comments
|
|
345
345
|
`);
|
|
346
346
|
}
|
|
347
347
|
|
|
@@ -711,7 +711,7 @@ function parseArgs(argv) {
|
|
|
711
711
|
|
|
712
712
|
function printUsage() {
|
|
713
713
|
console.log(`
|
|
714
|
-
Usage:
|
|
714
|
+
Usage: db-model-router-generate-model --type <db_type> [options]
|
|
715
715
|
|
|
716
716
|
Options:
|
|
717
717
|
--type Database type (${SUPPORTED_TYPES.join(", ")})
|
|
@@ -728,9 +728,9 @@ Options:
|
|
|
728
728
|
--help Show this help message
|
|
729
729
|
|
|
730
730
|
Examples:
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
731
|
+
db-model-router-generate-model --type mysql --host localhost --database mydb --user root --password secret
|
|
732
|
+
db-model-router-generate-model --type sqlite3 --database ./myapp.db --output ./src/models
|
|
733
|
+
db-model-router-generate-model --type postgres --env .env --output ./models
|
|
734
734
|
`);
|
|
735
735
|
}
|
|
736
736
|
|
|
@@ -8,7 +8,11 @@ function generateOpenAPISpec(models, options = {}) {
|
|
|
8
8
|
|
|
9
9
|
const spec = {
|
|
10
10
|
openapi: "3.0.3",
|
|
11
|
-
info: {
|
|
11
|
+
info: {
|
|
12
|
+
title,
|
|
13
|
+
version,
|
|
14
|
+
description: "Auto-generated by db-model-router CLI",
|
|
15
|
+
},
|
|
12
16
|
paths: {},
|
|
13
17
|
components: { schemas: {} },
|
|
14
18
|
};
|
|
@@ -143,7 +143,7 @@ async function main() {
|
|
|
143
143
|
if (!dbType) {
|
|
144
144
|
console.error(
|
|
145
145
|
`Error: No models found in "${modelsDir}" and no --type provided to generate them.\n` +
|
|
146
|
-
`Either generate models first with
|
|
146
|
+
`Either generate models first with db-model-router-generate-model, or provide --type to auto-generate.`,
|
|
147
147
|
);
|
|
148
148
|
process.exit(1);
|
|
149
149
|
}
|
|
@@ -302,7 +302,7 @@ function parseArgs(argv) {
|
|
|
302
302
|
|
|
303
303
|
function printUsage() {
|
|
304
304
|
console.log(`
|
|
305
|
-
Usage:
|
|
305
|
+
Usage: db-model-router-generate-route [options]
|
|
306
306
|
|
|
307
307
|
Options:
|
|
308
308
|
--models Path to models directory (default: ./models)
|
|
@@ -320,13 +320,13 @@ Options:
|
|
|
320
320
|
|
|
321
321
|
Examples:
|
|
322
322
|
# Generate routes from existing models
|
|
323
|
-
|
|
323
|
+
db-model-router-generate-route --models ./models --output ./routes
|
|
324
324
|
|
|
325
325
|
# Auto-generate models + routes in one step
|
|
326
|
-
|
|
326
|
+
db-model-router-generate-route --type mysql --env .env --models ./models --output ./routes
|
|
327
327
|
|
|
328
328
|
# SQLite3 example
|
|
329
|
-
|
|
329
|
+
db-model-router-generate-route --type sqlite3 --database ./myapp.db
|
|
330
330
|
`);
|
|
331
331
|
}
|
|
332
332
|
|
package/src/serve.js
CHANGED
|
@@ -6,13 +6,8 @@ try {
|
|
|
6
6
|
express = require("express");
|
|
7
7
|
}
|
|
8
8
|
const app = express();
|
|
9
|
-
|
|
10
|
-
app.use(
|
|
11
|
-
app.use(
|
|
12
|
-
bodyParser.urlencoded({
|
|
13
|
-
extended: true,
|
|
14
|
-
}),
|
|
15
|
-
);
|
|
9
|
+
app.use(express.json({ limit: "128mb" }));
|
|
10
|
+
app.use(express.urlencoded({ extended: true }));
|
|
16
11
|
app.use((err, req, res, next) => {
|
|
17
12
|
if (err instanceof SyntaxError && err.status === 400 && "body" in err) {
|
|
18
13
|
return res.status(400).send(err); // Bad request
|