crudora 0.1.0 → 0.2.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 (56) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +554 -328
  3. package/dist/cli.js +62 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index.cjs +1692 -0
  6. package/dist/index.cjs.map +1 -0
  7. package/dist/index.d.cts +404 -0
  8. package/dist/index.d.ts +404 -10
  9. package/dist/index.js +1685 -16
  10. package/dist/index.js.map +1 -1
  11. package/dist/scripts/copy-assets.js +26 -47
  12. package/dist/scripts/postinstall.js +172 -136
  13. package/dist/templates/.env.example +13 -9
  14. package/dist/templates/drizzle.config.ts +10 -0
  15. package/dist/templates/schema.ts +23 -0
  16. package/package.json +109 -94
  17. package/scripts/copy-assets.js +26 -47
  18. package/scripts/postinstall.js +172 -136
  19. package/templates/.env.example +13 -9
  20. package/templates/drizzle.config.ts +10 -0
  21. package/templates/schema.ts +23 -0
  22. package/dist/core/crudora.d.ts +0 -24
  23. package/dist/core/crudora.d.ts.map +0 -1
  24. package/dist/core/crudora.js +0 -221
  25. package/dist/core/crudora.js.map +0 -1
  26. package/dist/core/crudoraServer.d.ts +0 -30
  27. package/dist/core/crudoraServer.d.ts.map +0 -1
  28. package/dist/core/crudoraServer.js +0 -83
  29. package/dist/core/crudoraServer.js.map +0 -1
  30. package/dist/core/model.d.ts +0 -39
  31. package/dist/core/model.d.ts.map +0 -1
  32. package/dist/core/model.js +0 -101
  33. package/dist/core/model.js.map +0 -1
  34. package/dist/core/repository.d.ts +0 -22
  35. package/dist/core/repository.d.ts.map +0 -1
  36. package/dist/core/repository.js +0 -149
  37. package/dist/core/repository.js.map +0 -1
  38. package/dist/core/schemaGenerator.d.ts +0 -6
  39. package/dist/core/schemaGenerator.d.ts.map +0 -1
  40. package/dist/core/schemaGenerator.js +0 -43
  41. package/dist/core/schemaGenerator.js.map +0 -1
  42. package/dist/decorators/model.d.ts +0 -9
  43. package/dist/decorators/model.d.ts.map +0 -1
  44. package/dist/decorators/model.js +0 -46
  45. package/dist/decorators/model.js.map +0 -1
  46. package/dist/index.d.ts.map +0 -1
  47. package/dist/templates/schema.prisma +0 -22
  48. package/dist/types/model.type.d.ts +0 -13
  49. package/dist/types/model.type.d.ts.map +0 -1
  50. package/dist/types/model.type.js +0 -3
  51. package/dist/types/model.type.js.map +0 -1
  52. package/dist/utils/validation.d.ts +0 -7
  53. package/dist/utils/validation.d.ts.map +0 -1
  54. package/dist/utils/validation.js +0 -35
  55. package/dist/utils/validation.js.map +0 -1
  56. package/templates/schema.prisma +0 -22
@@ -1,136 +1,172 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
-
4
- // Paths
5
- const templatePath = path.join(__dirname, '..', 'templates', 'schema.prisma');
6
- const targetPrismaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');
7
- const targetEnvPath = path.join(process.cwd(), '.env');
8
- const targetServerPath = path.join(process.cwd(), 'src', 'server.ts');
9
- const targetPackagePath = path.join(process.cwd(), 'package.json');
10
-
11
- console.log('🚀 Setting up Crudora project...');
12
-
13
- // 1. Create prisma directory and schema
14
- if (!fs.existsSync(path.dirname(targetPrismaPath))) {
15
- console.log('📋 Creating Prisma schema...');
16
- fs.mkdirSync(path.dirname(targetPrismaPath), { recursive: true });
17
- fs.copyFileSync(templatePath, targetPrismaPath);
18
- console.log('✅ Prisma schema created at prisma/schema.prisma');
19
- } else {
20
- console.log('📋 Prisma directory already exists, skipping schema creation');
21
- }
22
-
23
- // 2. Create .env file
24
- if (!fs.existsSync(targetEnvPath)) {
25
- console.log('🔧 Creating .env file...');
26
- const envContent = `# Database
27
- DATABASE_URL="file:./dev.db"
28
-
29
- # Server
30
- PORT=3000
31
- NODE_ENV=development
32
-
33
- # API
34
- API_BASE_PATH="/api"
35
- `;
36
- fs.writeFileSync(targetEnvPath, envContent);
37
- console.log(' .env file created');
38
- } else {
39
- console.log('🔧 .env file already exists, skipping creation');
40
- }
41
-
42
- // 3. Create basic server setup
43
- if (!fs.existsSync(targetServerPath)) {
44
- console.log('🖥️ Creating server setup...');
45
- const serverContent = `const { CrudoraServer } = require('crudora');
46
- const { PrismaClient } = require('@prisma/client');
47
- require('dotenv').config();
48
-
49
- const prisma = new PrismaClient();
50
-
51
- // Example User model (uncomment and modify as needed)
52
- /*
53
- class User {
54
- static tableName = 'users';
55
- static primaryKey = 'id';
56
- static timestamps = true;
57
- static fillable = ['name', 'email'];
58
- static hidden = ['password'];
59
- }
60
- */
61
-
62
- const server = new CrudoraServer({
63
- port: process.env.PORT || 3000,
64
- prisma: prisma,
65
- cors: true,
66
- basePath: process.env.API_BASE_PATH || '/api'
67
- });
68
-
69
- // Register your models here
70
- // server.registerModel(User);
71
-
72
- // Add custom routes if needed
73
- server.get('/health', (req, res) => {
74
- res.json({ status: 'ok', timestamp: new Date() });
75
- });
76
-
77
- // Generate routes and start server
78
- server
79
- .generateRoutes()
80
- .listen(() => {
81
- console.log('🚀 Crudora server is running!');
82
- console.log(\`📚 API documentation: http://localhost:\${process.env.PORT || 3000}\${process.env.API_BASE_PATH || '/api'}\`);
83
- });
84
- `;
85
- fs.writeFileSync(targetServerPath, serverContent);
86
- console.log('✅ Server setup created at server.ts');
87
- } else {
88
- console.log('🖥️ server.ts already exists, skipping creation');
89
- }
90
-
91
- // 4. Update package.json scripts (if package.json exists)
92
- if (fs.existsSync(targetPackagePath)) {
93
- try {
94
- const packageJson = JSON.parse(fs.readFileSync(targetPackagePath, 'utf8'));
95
-
96
- if (!packageJson.scripts) {
97
- packageJson.scripts = {};
98
- }
99
-
100
- // Add useful scripts if they don't exist
101
- const scriptsToAdd = {
102
- 'build': 'tsc',
103
- 'dev': 'ts-node src/server.ts',
104
- 'start': 'ts-node src/server.ts',
105
- 'start:prod': 'node dist/index.js',
106
- 'db:generate': 'prisma generate',
107
- 'db:push': 'prisma db push',
108
- 'db:migrate': 'prisma migrate dev',
109
- 'db:studio': 'prisma studio'
110
- };
111
-
112
- let scriptsAdded = false;
113
- for (const [scriptName, scriptCommand] of Object.entries(scriptsToAdd)) {
114
- if (!packageJson.scripts[scriptName]) {
115
- packageJson.scripts[scriptName] = scriptCommand;
116
- scriptsAdded = true;
117
- }
118
- }
119
-
120
- if (scriptsAdded) {
121
- fs.writeFileSync(targetPackagePath, JSON.stringify(packageJson, null, 2));
122
- console.log('✅ Package.json scripts updated');
123
- }
124
- } catch (error) {
125
- console.log('⚠️ Could not update package.json scripts:', error.message);
126
- }
127
- }
128
-
129
- console.log('\n🎉 Crudora setup complete!');
130
- console.log('\n📝 Next steps:');
131
- console.log('1. Install dependencies: npm install @prisma/client prisma dotenv');
132
- console.log('2. Generate Prisma client: npm run db:generate');
133
- console.log('3. Push database schema: npm run db:push');
134
- console.log('4. Define your models in server.js');
135
- console.log('5. Start development server: npm run dev');
136
- console.log('\n📖 Documentation: https://github.com/suryamsj/crudora#readme');
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+
8
+ // ─── Skip guards ──────────────────────────────────────────────────────────────
9
+ // Opt-out: set CRUDORA_SKIP_POSTINSTALL=1 in CI pipelines or Docker builds.
10
+ if (process.env.CRUDORA_SKIP_POSTINSTALL) {
11
+ process.exit(0);
12
+ }
13
+
14
+ // Many CI systems set CI=true — don't scaffold files into a CI workspace.
15
+ if (process.env.CI) {
16
+ process.exit(0);
17
+ }
18
+
19
+ // Running inside node_modules means someone else is installing crudora as a dep.
20
+ // Scaffold into their project root (process.cwd()), not the package directory.
21
+ // Guard: if there's no package.json in cwd, we're probably not in a real project.
22
+ const cwdPkgPath = path.join(process.cwd(), 'package.json');
23
+ if (!fs.existsSync(cwdPkgPath)) {
24
+ process.exit(0);
25
+ }
26
+
27
+ // ─── Peer dependency check ────────────────────────────────────────────────────
28
+ try {
29
+ const cwdPkg = JSON.parse(fs.readFileSync(cwdPkgPath, 'utf-8'));
30
+ const hasDrizzle =
31
+ cwdPkg.dependencies?.['drizzle-orm'] ||
32
+ cwdPkg.devDependencies?.['drizzle-orm'];
33
+ if (!hasDrizzle) {
34
+ console.warn(
35
+ '\n⚠️ Crudora: drizzle-orm is not listed in your dependencies.\n' +
36
+ ' Run: npm install drizzle-orm\n' +
37
+ ' Also install the driver for your database:\n' +
38
+ ' PostgreSQL: npm install pg\n' +
39
+ ' MySQL: npm install mysql2\n',
40
+ );
41
+ }
42
+ } catch {
43
+ // Non-fatal — package.json may not be JSON-parseable
44
+ }
45
+
46
+ const templateDir = path.join(__dirname, '..', 'templates');
47
+ const targetEnvPath = path.join(process.cwd(), '.env');
48
+ const targetServerPath = path.join(process.cwd(), 'src', 'server.ts');
49
+ const targetDrizzleConfig = path.join(process.cwd(), 'drizzle.config.ts');
50
+ const targetSchemaDir = path.join(process.cwd(), 'src', 'db');
51
+ const targetSchemaPath = path.join(targetSchemaDir, 'schema.ts');
52
+
53
+ console.log('🚀 Setting up Crudora project...');
54
+
55
+ // 1. Create .env file
56
+ if (!fs.existsSync(targetEnvPath)) {
57
+ console.log('🔧 Creating .env file...');
58
+ const envContent = `# Database — choose one based on your dialect
59
+ # PostgreSQL
60
+ DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
61
+
62
+ # MySQL (uncomment if using MySQL)
63
+ # DATABASE_URL="mysql://user:password@localhost:3306/mydb"
64
+
65
+ # Server
66
+ PORT=3000
67
+ NODE_ENV=development
68
+
69
+ # API
70
+ API_BASE_PATH="/api"
71
+ `;
72
+ fs.writeFileSync(targetEnvPath, envContent);
73
+ console.log(' .env file created');
74
+ } else {
75
+ console.log('🔧 .env file already exists, skipping creation');
76
+ }
77
+
78
+ // 2. Create drizzle.config.ts
79
+ if (!fs.existsSync(targetDrizzleConfig)) {
80
+ console.log('📋 Creating drizzle.config.ts...');
81
+ fs.copyFileSync(path.join(templateDir, 'drizzle.config.ts'), targetDrizzleConfig);
82
+ console.log('✅ drizzle.config.ts created');
83
+ } else {
84
+ console.log('📋 drizzle.config.ts already exists, skipping');
85
+ }
86
+
87
+ // 3. Create src/db/schema.ts
88
+ if (!fs.existsSync(targetSchemaPath)) {
89
+ console.log('📋 Creating src/db/schema.ts...');
90
+ if (!fs.existsSync(targetSchemaDir)) {
91
+ fs.mkdirSync(targetSchemaDir, { recursive: true });
92
+ }
93
+ fs.copyFileSync(path.join(templateDir, 'schema.ts'), targetSchemaPath);
94
+ console.log('✅ src/db/schema.ts created');
95
+ } else {
96
+ console.log('📋 src/db/schema.ts already exists, skipping');
97
+ }
98
+
99
+ // 4. Create basic server setup
100
+ if (!fs.existsSync(targetServerPath)) {
101
+ console.log('🖥️ Creating server setup...');
102
+ const serverContent = `import { CrudoraServer, Model, Field } from 'crudora';
103
+ import { drizzle } from 'drizzle-orm/node-postgres';
104
+ import { Pool } from 'pg';
105
+ import 'dotenv/config';
106
+
107
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
108
+ const db = drizzle(pool);
109
+
110
+ // Example User model (uncomment and modify as needed)
111
+ /*
112
+ class User extends Model {
113
+ static schema = 'auth'; // optional: database schema
114
+ static tableName = 'users';
115
+ static hidden = ['password'];
116
+
117
+ @Field({ type: 'uuid', primary: true })
118
+ id!: string;
119
+
120
+ @Field({ type: 'string', required: true, unique: true })
121
+ email!: string;
122
+
123
+ @Field({ type: 'string', required: true })
124
+ password!: string;
125
+ }
126
+ */
127
+
128
+ const server = new CrudoraServer({
129
+ port: Number(process.env.PORT) || 3000,
130
+ db,
131
+ dialect: 'postgresql',
132
+ cors: true,
133
+ basePath: process.env.API_BASE_PATH || '/api',
134
+ });
135
+
136
+ // Register your models here
137
+ // server.registerModel(User);
138
+
139
+ server.get('/health', (_req, res) => {
140
+ res.json({ success: true, data: { status: 'ok', timestamp: new Date() } });
141
+ });
142
+
143
+ server
144
+ .generateRoutes()
145
+ .listen(() => {
146
+ console.log('🚀 Crudora server is running!');
147
+ });
148
+ `;
149
+ if (!fs.existsSync(path.dirname(targetServerPath))) {
150
+ fs.mkdirSync(path.dirname(targetServerPath), { recursive: true });
151
+ }
152
+ fs.writeFileSync(targetServerPath, serverContent);
153
+ console.log('✅ Server setup created at src/server.ts');
154
+ } else {
155
+ console.log('🖥️ src/server.ts already exists, skipping creation');
156
+ }
157
+
158
+ console.log('\n🎉 Crudora setup complete!');
159
+ console.log('\n📝 Next steps:');
160
+ console.log('1. Install dependencies: npm install drizzle-orm pg');
161
+ console.log('2. Update DATABASE_URL in .env');
162
+ console.log('3. Define your models in src/server.ts');
163
+ console.log('4. Add these scripts to your package.json:');
164
+ console.log(' "dev": "ts-node src/server.ts"');
165
+ console.log(' "build": "tsc"');
166
+ console.log(' "db:generate": "drizzle-kit generate"');
167
+ console.log(' "db:push": "drizzle-kit push"');
168
+ console.log(' "db:migrate": "drizzle-kit migrate"');
169
+ console.log(' "db:studio": "drizzle-kit studio"');
170
+ console.log('5. Push schema to DB: npx drizzle-kit push');
171
+ console.log('6. Start server: npx ts-node src/server.ts');
172
+ console.log('\n📖 Documentation: https://github.com/suryamsj/crudora#readme');
@@ -1,9 +1,13 @@
1
- # Database
2
- DATABASE_URL="file:./dev.db"
3
-
4
- # Server
5
- PORT=3000
6
- NODE_ENV=development
7
-
8
- # API
9
- API_BASE_PATH="/api"
1
+ # Database — choose one based on your dialect
2
+ # PostgreSQL
3
+ DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
4
+
5
+ # MySQL (uncomment if using MySQL)
6
+ # DATABASE_URL="mysql://user:password@localhost:3306/mydb"
7
+
8
+ # Server
9
+ PORT=3000
10
+ NODE_ENV=development
11
+
12
+ # API
13
+ API_BASE_PATH="/api"
@@ -0,0 +1,10 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ export default defineConfig({
4
+ schema: './src/db/schema.ts',
5
+ out: './drizzle',
6
+ dialect: 'postgresql', // or 'mysql'
7
+ dbCredentials: {
8
+ url: process.env.DATABASE_URL!,
9
+ },
10
+ });
@@ -0,0 +1,23 @@
1
+ // Auto-generated by Crudora — do not edit manually
2
+ // Run: npx crudora generate-schema > src/db/schema.ts
3
+ //
4
+ // Example schema with multiple PostgreSQL schemas:
5
+ //
6
+ // import { pgTable, pgSchema, uuid, varchar, timestamp } from 'drizzle-orm/pg-core';
7
+ //
8
+ // const authSchema = pgSchema('auth');
9
+ //
10
+ // export const usersTable = authSchema.table('users', {
11
+ // id: uuid('id').primaryKey(),
12
+ // email: varchar('email', { length: 255 }).notNull().unique(),
13
+ // password: varchar('password', { length: 255 }).notNull(),
14
+ // createdAt: timestamp('createdAt', { mode: 'date' }).defaultNow().notNull(),
15
+ // updatedAt: timestamp('updatedAt', { mode: 'date' }).defaultNow().notNull(),
16
+ // });
17
+ //
18
+ // export const postsTable = pgTable('posts', {
19
+ // id: uuid('id').primaryKey(),
20
+ // title: varchar('title', { length: 255 }).notNull(),
21
+ // createdAt: timestamp('createdAt', { mode: 'date' }).defaultNow().notNull(),
22
+ // updatedAt: timestamp('updatedAt', { mode: 'date' }).defaultNow().notNull(),
23
+ // });
package/package.json CHANGED
@@ -1,94 +1,109 @@
1
- {
2
- "name": "crudora",
3
- "version": "0.1.0",
4
- "type": "module",
5
- "main": "dist/index.cjs",
6
- "module": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "require": "./dist/index.cjs",
12
- "types": "./dist/index.d.ts"
13
- },
14
- "./package.json": "./package.json"
15
- },
16
- "files": [
17
- "dist",
18
- "README.md",
19
- "LICENSE",
20
- "templates",
21
- "scripts"
22
- ],
23
- "scripts": {
24
- "build": "tsc && node scripts/copy-assets.js",
25
- "copy-assets": "node scripts/copy-assets.js",
26
- "build:watch": "tsc --watch",
27
- "clean": "rimraf dist",
28
- "prebuild": "npm run clean",
29
- "prepublishOnly": "npm run build",
30
- "dev": "ts-node src/index.ts",
31
- "test": "jest",
32
- "test:watch": "jest --watch",
33
- "test:coverage": "jest --coverage",
34
- "lint": "eslint src/**/*.ts",
35
- "format": "prettier --write src/**/*.ts",
36
- "postinstall": "node scripts/postinstall.js || echo 'Postinstall script failed, but continuing...'"
37
- },
38
- "keywords": [
39
- "crud",
40
- "api",
41
- "typescript",
42
- "prisma",
43
- "express",
44
- "framework",
45
- "backend",
46
- "rest-api",
47
- "orm",
48
- "validation",
49
- "zod",
50
- "decorators",
51
- "auto-generation"
52
- ],
53
- "repository": {
54
- "type": "git",
55
- "url": "git+https://github.com/suryamsj/crudora.git"
56
- },
57
- "bugs": {
58
- "url": "https://github.com/suryamsj/crudora/issues"
59
- },
60
- "homepage": "https://github.com/suryamsj/crudora#readme",
61
- "author": {
62
- "name": "Muhammad Surya J",
63
- "url": "https://suryamsj.my.id"
64
- },
65
- "license": "MIT",
66
- "description": "TypeScript framework for automated CRUD API generation with Prisma and Express",
67
- "dependencies": {
68
- "@types/express": "^5.0.3",
69
- "commander": "^14.0.0",
70
- "express": "^5.1.0",
71
- "jest-mock-extended": "^4.0.0",
72
- "reflect-metadata": "^0.2.2",
73
- "zod": "^4.0.5"
74
- },
75
- "devDependencies": {
76
- "@types/jest": "^30.0.0",
77
- "@types/node": "^24.0.15",
78
- "@types/supertest": "^6.0.3",
79
- "@typescript-eslint/eslint-plugin": "^8.38.0",
80
- "@typescript-eslint/parser": "^8.38.0",
81
- "eslint": "^9.31.0",
82
- "jest": "^30.0.4",
83
- "prettier": "^3.6.2",
84
- "rimraf": "^6.0.1",
85
- "supertest": "^7.1.3",
86
- "ts-jest": "^29.4.0",
87
- "ts-node": "^10.9.2",
88
- "typescript": "^5.8.3"
89
- },
90
- "peerDependencies": {
91
- "@prisma/client": "^6.12.0",
92
- "prisma": "^6.12.0"
93
- }
94
- }
1
+ {
2
+ "name": "crudora",
3
+ "version": "0.2.1",
4
+ "type": "module",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "crudora": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE",
23
+ "templates",
24
+ "scripts"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsup && node scripts/copy-assets.js",
28
+ "copy-assets": "node scripts/copy-assets.js",
29
+ "build:watch": "tsc --watch",
30
+ "clean": "rimraf dist",
31
+ "prebuild": "npm run clean",
32
+ "prepublishOnly": "npm run build",
33
+ "dev": "ts-node src/index.ts",
34
+ "test": "jest",
35
+ "test:watch": "jest --watch",
36
+ "test:coverage": "jest --coverage",
37
+ "lint": "eslint src/**/*.ts",
38
+ "format": "prettier --write src/**/*.ts",
39
+ "postinstall": "node scripts/postinstall.js || echo 'Postinstall script failed, but continuing...'"
40
+ },
41
+ "keywords": [
42
+ "crud",
43
+ "api",
44
+ "typescript",
45
+ "drizzle",
46
+ "express",
47
+ "framework",
48
+ "backend",
49
+ "rest-api",
50
+ "orm",
51
+ "validation",
52
+ "zod",
53
+ "decorators",
54
+ "auto-generation",
55
+ "multiple-schema"
56
+ ],
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/suryamsj/crudora.git"
60
+ },
61
+ "bugs": {
62
+ "url": "https://github.com/suryamsj/crudora/issues"
63
+ },
64
+ "homepage": "https://github.com/suryamsj/crudora#readme",
65
+ "author": {
66
+ "name": "Muhammad Surya J",
67
+ "url": "https://suryamsj.my.id"
68
+ },
69
+ "license": "MIT",
70
+ "description": "TypeScript framework for automated CRUD API generation with Drizzle ORM and Express",
71
+ "dependencies": {
72
+ "@types/express": "^5.0.3",
73
+ "commander": "^14.0.0",
74
+ "express": "^5.1.0",
75
+ "reflect-metadata": "^0.2.2",
76
+ "zod": "^4.0.5"
77
+ },
78
+ "devDependencies": {
79
+ "@types/jest": "^30.0.0",
80
+ "@types/node": "^24.0.15",
81
+ "@types/supertest": "^6.0.3",
82
+ "@typescript-eslint/eslint-plugin": "^8.38.0",
83
+ "@typescript-eslint/parser": "^8.38.0",
84
+ "drizzle-kit": "^0.31.10",
85
+ "eslint": "^9.31.0",
86
+ "jest": "^30.0.4",
87
+ "prettier": "^3.6.2",
88
+ "rimraf": "^6.0.1",
89
+ "supertest": "^7.1.3",
90
+ "ts-jest": "^29.4.0",
91
+ "ts-node": "^10.9.2",
92
+ "tsup": "^8.5.1",
93
+ "typescript": "^5.8.3"
94
+ },
95
+ "peerDependencies": {
96
+ "drizzle-orm": "^0.40.0"
97
+ },
98
+ "peerDependenciesMeta": {
99
+ "pg": {
100
+ "optional": true
101
+ },
102
+ "postgres": {
103
+ "optional": true
104
+ },
105
+ "mysql2": {
106
+ "optional": true
107
+ }
108
+ }
109
+ }