@veloxts/cli 0.4.0 → 0.4.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.
Files changed (140) hide show
  1. package/README.md +23 -144
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/generate.d.ts +17 -0
  5. package/dist/commands/generate.d.ts.map +1 -0
  6. package/dist/commands/generate.js +219 -0
  7. package/dist/commands/generate.js.map +1 -0
  8. package/dist/commands/migrate.d.ts +8 -3
  9. package/dist/commands/migrate.d.ts.map +1 -1
  10. package/dist/commands/migrate.js +17 -123
  11. package/dist/commands/migrate.js.map +1 -1
  12. package/dist/generators/base.d.ts +76 -0
  13. package/dist/generators/base.d.ts.map +1 -0
  14. package/dist/generators/base.js +271 -0
  15. package/dist/generators/base.js.map +1 -0
  16. package/dist/generators/generators/index.d.ts +17 -0
  17. package/dist/generators/generators/index.d.ts.map +1 -0
  18. package/dist/generators/generators/index.js +43 -0
  19. package/dist/generators/generators/index.js.map +1 -0
  20. package/dist/generators/generators/migration.d.ts +43 -0
  21. package/dist/generators/generators/migration.d.ts.map +1 -0
  22. package/dist/generators/generators/migration.js +121 -0
  23. package/dist/generators/generators/migration.js.map +1 -0
  24. package/dist/generators/generators/model.d.ts +38 -0
  25. package/dist/generators/generators/model.d.ts.map +1 -0
  26. package/dist/generators/generators/model.js +108 -0
  27. package/dist/generators/generators/model.js.map +1 -0
  28. package/dist/generators/generators/procedure.d.ts +37 -0
  29. package/dist/generators/generators/procedure.d.ts.map +1 -0
  30. package/dist/generators/generators/procedure.js +99 -0
  31. package/dist/generators/generators/procedure.js.map +1 -0
  32. package/dist/generators/generators/resource.d.ts +29 -0
  33. package/dist/generators/generators/resource.d.ts.map +1 -0
  34. package/dist/generators/generators/resource.js +124 -0
  35. package/dist/generators/generators/resource.js.map +1 -0
  36. package/dist/generators/generators/schema.d.ts +28 -0
  37. package/dist/generators/generators/schema.d.ts.map +1 -0
  38. package/dist/generators/generators/schema.js +83 -0
  39. package/dist/generators/generators/schema.js.map +1 -0
  40. package/dist/generators/generators/test.d.ts +28 -0
  41. package/dist/generators/generators/test.d.ts.map +1 -0
  42. package/dist/generators/generators/test.js +96 -0
  43. package/dist/generators/generators/test.js.map +1 -0
  44. package/dist/generators/index.d.ts +16 -0
  45. package/dist/generators/index.d.ts.map +1 -0
  46. package/dist/generators/index.js +16 -0
  47. package/dist/generators/index.js.map +1 -0
  48. package/dist/generators/registry.d.ts +97 -0
  49. package/dist/generators/registry.d.ts.map +1 -0
  50. package/dist/generators/registry.js +253 -0
  51. package/dist/generators/registry.js.map +1 -0
  52. package/dist/generators/templates/migration.d.ts +23 -0
  53. package/dist/generators/templates/migration.d.ts.map +1 -0
  54. package/dist/generators/templates/migration.js +389 -0
  55. package/dist/generators/templates/migration.js.map +1 -0
  56. package/dist/generators/templates/model.d.ts +37 -0
  57. package/dist/generators/templates/model.d.ts.map +1 -0
  58. package/dist/generators/templates/model.js +374 -0
  59. package/dist/generators/templates/model.js.map +1 -0
  60. package/dist/generators/templates/procedure.d.ts +25 -0
  61. package/dist/generators/templates/procedure.d.ts.map +1 -0
  62. package/dist/generators/templates/procedure.js +274 -0
  63. package/dist/generators/templates/procedure.js.map +1 -0
  64. package/dist/generators/templates/resource.d.ts +34 -0
  65. package/dist/generators/templates/resource.d.ts.map +1 -0
  66. package/dist/generators/templates/resource.js +550 -0
  67. package/dist/generators/templates/resource.js.map +1 -0
  68. package/dist/generators/templates/schema.d.ts +33 -0
  69. package/dist/generators/templates/schema.d.ts.map +1 -0
  70. package/dist/generators/templates/schema.js +248 -0
  71. package/dist/generators/templates/schema.js.map +1 -0
  72. package/dist/generators/templates/test.d.ts +31 -0
  73. package/dist/generators/templates/test.d.ts.map +1 -0
  74. package/dist/generators/templates/test.js +882 -0
  75. package/dist/generators/templates/test.js.map +1 -0
  76. package/dist/generators/types.d.ts +211 -0
  77. package/dist/generators/types.d.ts.map +1 -0
  78. package/dist/generators/types.js +54 -0
  79. package/dist/generators/types.js.map +1 -0
  80. package/dist/generators/utils/filesystem.d.ts +68 -0
  81. package/dist/generators/utils/filesystem.d.ts.map +1 -0
  82. package/dist/generators/utils/filesystem.js +217 -0
  83. package/dist/generators/utils/filesystem.js.map +1 -0
  84. package/dist/generators/utils/naming.d.ts +122 -0
  85. package/dist/generators/utils/naming.d.ts.map +1 -0
  86. package/dist/generators/utils/naming.js +198 -0
  87. package/dist/generators/utils/naming.js.map +1 -0
  88. package/dist/index.d.ts +4 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +4 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/migrations/commands/fresh.d.ts +11 -0
  93. package/dist/migrations/commands/fresh.d.ts.map +1 -0
  94. package/dist/migrations/commands/fresh.js +164 -0
  95. package/dist/migrations/commands/fresh.js.map +1 -0
  96. package/dist/migrations/commands/index.d.ts +11 -0
  97. package/dist/migrations/commands/index.d.ts.map +1 -0
  98. package/dist/migrations/commands/index.js +11 -0
  99. package/dist/migrations/commands/index.js.map +1 -0
  100. package/dist/migrations/commands/reset.d.ts +11 -0
  101. package/dist/migrations/commands/reset.d.ts.map +1 -0
  102. package/dist/migrations/commands/reset.js +258 -0
  103. package/dist/migrations/commands/reset.js.map +1 -0
  104. package/dist/migrations/commands/rollback.d.ts +11 -0
  105. package/dist/migrations/commands/rollback.d.ts.map +1 -0
  106. package/dist/migrations/commands/rollback.js +241 -0
  107. package/dist/migrations/commands/rollback.js.map +1 -0
  108. package/dist/migrations/commands/run.d.ts +11 -0
  109. package/dist/migrations/commands/run.d.ts.map +1 -0
  110. package/dist/migrations/commands/run.js +183 -0
  111. package/dist/migrations/commands/run.js.map +1 -0
  112. package/dist/migrations/commands/status.d.ts +11 -0
  113. package/dist/migrations/commands/status.d.ts.map +1 -0
  114. package/dist/migrations/commands/status.js +154 -0
  115. package/dist/migrations/commands/status.js.map +1 -0
  116. package/dist/migrations/errors.d.ts +74 -0
  117. package/dist/migrations/errors.d.ts.map +1 -0
  118. package/dist/migrations/errors.js +155 -0
  119. package/dist/migrations/errors.js.map +1 -0
  120. package/dist/migrations/index.d.ts +13 -0
  121. package/dist/migrations/index.d.ts.map +1 -0
  122. package/dist/migrations/index.js +17 -0
  123. package/dist/migrations/index.js.map +1 -0
  124. package/dist/migrations/loader.d.ts +44 -0
  125. package/dist/migrations/loader.d.ts.map +1 -0
  126. package/dist/migrations/loader.js +181 -0
  127. package/dist/migrations/loader.js.map +1 -0
  128. package/dist/migrations/prisma-wrapper.d.ts +60 -0
  129. package/dist/migrations/prisma-wrapper.d.ts.map +1 -0
  130. package/dist/migrations/prisma-wrapper.js +184 -0
  131. package/dist/migrations/prisma-wrapper.js.map +1 -0
  132. package/dist/migrations/rollback-runner.d.ts +40 -0
  133. package/dist/migrations/rollback-runner.d.ts.map +1 -0
  134. package/dist/migrations/rollback-runner.js +203 -0
  135. package/dist/migrations/rollback-runner.js.map +1 -0
  136. package/dist/migrations/types.d.ts +214 -0
  137. package/dist/migrations/types.d.ts.map +1 -0
  138. package/dist/migrations/types.js +19 -0
  139. package/dist/migrations/types.js.map +1 -0
  140. package/package.json +29 -8
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Rollback Runner
3
+ *
4
+ * Custom rollback execution using down.sql files.
5
+ */
6
+ import fs from 'node:fs/promises';
7
+ import { databaseError, noRollbackFile, rollbackFailed } from './errors.js';
8
+ // ============================================================================
9
+ // Single Migration Rollback
10
+ // ============================================================================
11
+ /**
12
+ * Rollback a single migration
13
+ */
14
+ export async function rollbackMigration(prisma, migration, options = {}) {
15
+ const startTime = Date.now();
16
+ // Check if rollback is available
17
+ if (!migration.hasRollback || !migration.downPath) {
18
+ throw noRollbackFile(migration.name);
19
+ }
20
+ // In dry run mode, just return success
21
+ if (options.dryRun) {
22
+ return {
23
+ migration: migration.name,
24
+ success: true,
25
+ duration: 0,
26
+ };
27
+ }
28
+ try {
29
+ // Read down.sql content
30
+ const downSql = await fs.readFile(migration.downPath, 'utf-8');
31
+ // Split SQL into statements and execute each one
32
+ // This handles multi-statement down.sql files
33
+ const statements = splitSqlStatements(downSql);
34
+ for (const statement of statements) {
35
+ const trimmed = statement.trim();
36
+ if (trimmed) {
37
+ await prisma.$executeRawUnsafe(trimmed);
38
+ }
39
+ }
40
+ // Remove migration record from _prisma_migrations using parameterized query
41
+ // Use database-specific placeholder syntax ($1 for PostgreSQL, ? for SQLite/MySQL)
42
+ await prisma.$executeRawUnsafe(getDeleteMigrationQuery(options.database), migration.name);
43
+ return {
44
+ migration: migration.name,
45
+ success: true,
46
+ duration: Date.now() - startTime,
47
+ };
48
+ }
49
+ catch (error) {
50
+ const err = error instanceof Error ? error : new Error(String(error));
51
+ throw rollbackFailed(migration.name, err);
52
+ }
53
+ }
54
+ // ============================================================================
55
+ // Batch Rollback
56
+ // ============================================================================
57
+ /**
58
+ * Rollback multiple migrations in order (most recent first)
59
+ */
60
+ export async function rollbackMultiple(prisma, migrations, options = {}) {
61
+ const startTime = Date.now();
62
+ const results = [];
63
+ let successful = 0;
64
+ let failed = 0;
65
+ // Ensure migrations are in reverse chronological order
66
+ const orderedMigrations = [...migrations].sort((a, b) => b.timestamp.localeCompare(a.timestamp));
67
+ for (const migration of orderedMigrations) {
68
+ try {
69
+ const result = await rollbackMigration(prisma, migration, options);
70
+ results.push(result);
71
+ successful++;
72
+ }
73
+ catch (error) {
74
+ // If rollback fails, record error and stop
75
+ const err = error instanceof Error ? error : new Error(String(error));
76
+ results.push({
77
+ migration: migration.name,
78
+ success: false,
79
+ duration: 0,
80
+ error: err.message,
81
+ });
82
+ failed++;
83
+ // Stop on first failure
84
+ break;
85
+ }
86
+ }
87
+ return {
88
+ results,
89
+ total: orderedMigrations.length,
90
+ successful,
91
+ failed,
92
+ duration: Date.now() - startTime,
93
+ };
94
+ }
95
+ /**
96
+ * Rollback all migrations
97
+ */
98
+ export async function rollbackAll(prisma, migrations, options = {}) {
99
+ return rollbackMultiple(prisma, migrations, options);
100
+ }
101
+ // ============================================================================
102
+ // Database Utilities
103
+ // ============================================================================
104
+ /**
105
+ * Get applied migrations from the database
106
+ */
107
+ export async function getAppliedMigrations(prisma) {
108
+ try {
109
+ return await prisma.$queryRaw `
110
+ SELECT "migration_name", "started_at", "finished_at"
111
+ FROM "_prisma_migrations"
112
+ WHERE "finished_at" IS NOT NULL
113
+ ORDER BY "started_at" DESC
114
+ `;
115
+ }
116
+ catch (error) {
117
+ const err = error instanceof Error ? error : new Error(String(error));
118
+ throw databaseError('getAppliedMigrations', err);
119
+ }
120
+ }
121
+ /**
122
+ * Check if _prisma_migrations table exists
123
+ */
124
+ export async function checkMigrationsTableExists(prisma, database = 'postgresql') {
125
+ try {
126
+ let query;
127
+ switch (database) {
128
+ case 'sqlite':
129
+ query = `SELECT name FROM sqlite_master WHERE type='table' AND name='_prisma_migrations'`;
130
+ break;
131
+ case 'mysql':
132
+ query = `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '_prisma_migrations'`;
133
+ break;
134
+ // case 'postgresql':
135
+ default:
136
+ query = `SELECT tablename FROM pg_tables WHERE tablename = '_prisma_migrations'`;
137
+ break;
138
+ }
139
+ const result = await prisma.$queryRawUnsafe(query);
140
+ return Array.isArray(result) && result.length > 0;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ // ============================================================================
147
+ // SQL Helpers
148
+ // ============================================================================
149
+ /**
150
+ * Get the DELETE query for removing a migration record, with correct
151
+ * parameter placeholder syntax for the target database.
152
+ *
153
+ * - PostgreSQL uses `$1`, `$2`, etc.
154
+ * - SQLite and MySQL use `?`
155
+ */
156
+ function getDeleteMigrationQuery(database = 'postgresql') {
157
+ const placeholder = database === 'postgresql' ? '$1' : '?';
158
+ return `DELETE FROM "_prisma_migrations" WHERE "migration_name" = ${placeholder}`;
159
+ }
160
+ /**
161
+ * Split SQL into individual statements
162
+ * Handles basic cases - not a full SQL parser
163
+ */
164
+ function splitSqlStatements(sql) {
165
+ // Simple split on semicolons, but be aware this doesn't handle
166
+ // semicolons inside strings/comments perfectly
167
+ const statements = [];
168
+ let current = '';
169
+ let inString = false;
170
+ let stringChar = '';
171
+ for (let i = 0; i < sql.length; i++) {
172
+ const char = sql[i];
173
+ const prevChar = sql[i - 1];
174
+ // Handle string literals
175
+ if ((char === "'" || char === '"') && prevChar !== '\\') {
176
+ if (!inString) {
177
+ inString = true;
178
+ stringChar = char;
179
+ }
180
+ else if (char === stringChar) {
181
+ inString = false;
182
+ }
183
+ }
184
+ // Handle statement separator
185
+ if (char === ';' && !inString) {
186
+ const trimmed = current.trim();
187
+ if (trimmed) {
188
+ statements.push(trimmed);
189
+ }
190
+ current = '';
191
+ }
192
+ else {
193
+ current += char;
194
+ }
195
+ }
196
+ // Add final statement if any
197
+ const trimmed = current.trim();
198
+ if (trimmed) {
199
+ statements.push(trimmed);
200
+ }
201
+ return statements;
202
+ }
203
+ //# sourceMappingURL=rollback-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-runner.js","sourceRoot":"","sources":["../../src/migrations/rollback-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Migration Types
3
+ *
4
+ * Core type definitions for the VeloxTS migration runner system.
5
+ */
6
+ /**
7
+ * Minimal Prisma client interface for migration operations.
8
+ *
9
+ * This avoids depending on generated Prisma client types which may not exist
10
+ * in CI environments where `prisma generate` hasn't been run.
11
+ */
12
+ export interface PrismaClientLike {
13
+ /**
14
+ * Execute a raw SQL query and return results.
15
+ * Uses a tagged template literal for parameterized queries.
16
+ */
17
+ $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: unknown[]): Promise<T>;
18
+ /**
19
+ * Execute a raw SQL query string and return results.
20
+ * Use with caution - values are not automatically escaped.
21
+ */
22
+ $queryRawUnsafe<T = unknown>(query: string, ...values: unknown[]): Promise<T>;
23
+ /**
24
+ * Execute a raw SQL statement (INSERT, UPDATE, DELETE, etc.).
25
+ * Returns the number of affected rows.
26
+ */
27
+ $executeRawUnsafe(query: string, ...values: unknown[]): Promise<number>;
28
+ /**
29
+ * Disconnect from the database.
30
+ */
31
+ $disconnect(): Promise<void>;
32
+ }
33
+ /**
34
+ * Create a new PrismaClient instance dynamically.
35
+ *
36
+ * This function handles the dynamic import of @prisma/client at runtime,
37
+ * avoiding compile-time dependency on generated Prisma types.
38
+ *
39
+ * @returns A new PrismaClient instance typed as PrismaClientLike
40
+ */
41
+ export declare function createPrismaClient(): Promise<PrismaClientLike>;
42
+ /**
43
+ * A migration file loaded from the filesystem
44
+ */
45
+ export interface MigrationFile {
46
+ /** Full migration name (e.g., "20241208120000_create_users") */
47
+ readonly name: string;
48
+ /** Timestamp prefix (e.g., "20241208120000") */
49
+ readonly timestamp: string;
50
+ /** Description suffix (e.g., "create_users") */
51
+ readonly description: string;
52
+ /** Absolute path to migration.sql */
53
+ readonly upPath: string;
54
+ /** Absolute path to down.sql (null if not exists) */
55
+ readonly downPath: string | null;
56
+ /** Whether rollback is available (down.sql exists) */
57
+ readonly hasRollback: boolean;
58
+ }
59
+ /**
60
+ * Record from Prisma's _prisma_migrations table
61
+ */
62
+ export interface PrismaMigrationRecord {
63
+ /** UUID identifier */
64
+ id: string;
65
+ /** SHA-256 checksum of migration.sql */
66
+ checksum: string;
67
+ /** When migration finished (null if failed) */
68
+ finished_at: Date | null;
69
+ /** Migration name (matches folder name) */
70
+ migration_name: string;
71
+ /** Log output from migration */
72
+ logs: string | null;
73
+ /** When migration was rolled back (null if not rolled back) */
74
+ rolled_back_at: Date | null;
75
+ /** When migration started */
76
+ started_at: Date;
77
+ /** Number of steps applied */
78
+ applied_steps_count: number;
79
+ }
80
+ /**
81
+ * Status of a migration
82
+ */
83
+ export type MigrationStatusType = 'applied' | 'pending' | 'failed';
84
+ /**
85
+ * Combined status of a migration (file + database record)
86
+ */
87
+ export interface MigrationStatus {
88
+ /** Migration name */
89
+ readonly name: string;
90
+ /** Current status */
91
+ readonly status: MigrationStatusType;
92
+ /** When applied (null if pending) */
93
+ readonly appliedAt: Date | null;
94
+ /** Whether rollback is available (down.sql exists) */
95
+ readonly hasRollback: boolean;
96
+ /** Duration in milliseconds (null if pending or unknown) */
97
+ readonly duration: number | null;
98
+ }
99
+ /**
100
+ * Options for migrate:status command
101
+ */
102
+ export interface MigrateStatusOptions {
103
+ /** Show only pending migrations */
104
+ readonly pending?: boolean;
105
+ /** Output as JSON */
106
+ readonly json?: boolean;
107
+ }
108
+ /**
109
+ * Options for migrate:run command
110
+ */
111
+ export interface MigrateRunOptions {
112
+ /** Use development mode (prisma migrate dev) */
113
+ readonly dev?: boolean;
114
+ /** Run only N migrations */
115
+ readonly step?: number;
116
+ /** Show what would be run without executing */
117
+ readonly dryRun?: boolean;
118
+ /** Output as JSON */
119
+ readonly json?: boolean;
120
+ }
121
+ /**
122
+ * Options for migrate:rollback command
123
+ */
124
+ export interface MigrateRollbackOptions {
125
+ /** Number of migrations to rollback (default: 1) */
126
+ readonly step?: number;
127
+ /** Rollback all migrations */
128
+ readonly all?: boolean;
129
+ /** Skip confirmation prompt */
130
+ readonly force?: boolean;
131
+ /** Show what would be rolled back */
132
+ readonly dryRun?: boolean;
133
+ /** Output as JSON */
134
+ readonly json?: boolean;
135
+ }
136
+ /**
137
+ * Options for migrate:fresh command
138
+ */
139
+ export interface MigrateFreshOptions {
140
+ /** Run seeders after migrations */
141
+ readonly seed?: boolean;
142
+ /** Skip confirmation prompt */
143
+ readonly force?: boolean;
144
+ /** Output as JSON */
145
+ readonly json?: boolean;
146
+ }
147
+ /**
148
+ * Options for migrate:reset command
149
+ */
150
+ export interface MigrateResetOptions {
151
+ /** Run seeders after migrations */
152
+ readonly seed?: boolean;
153
+ /** Skip confirmation prompt */
154
+ readonly force?: boolean;
155
+ /** Output as JSON */
156
+ readonly json?: boolean;
157
+ }
158
+ /**
159
+ * Result of running Prisma CLI command
160
+ */
161
+ export interface PrismaResult {
162
+ /** Whether command succeeded */
163
+ readonly success: boolean;
164
+ /** Standard output */
165
+ readonly output: string;
166
+ /** Standard error (if failed) */
167
+ readonly error?: string;
168
+ /** Exit code */
169
+ readonly exitCode: number;
170
+ }
171
+ /**
172
+ * Result of rolling back a single migration
173
+ */
174
+ export interface RollbackResult {
175
+ /** Migration name */
176
+ readonly migration: string;
177
+ /** Whether rollback succeeded */
178
+ readonly success: boolean;
179
+ /** Duration in milliseconds */
180
+ readonly duration: number;
181
+ /** Error message if failed */
182
+ readonly error?: string;
183
+ }
184
+ /**
185
+ * Result of a batch rollback operation
186
+ */
187
+ export interface BatchRollbackResult {
188
+ /** Individual rollback results */
189
+ readonly results: ReadonlyArray<RollbackResult>;
190
+ /** Total migrations rolled back */
191
+ readonly total: number;
192
+ /** Number of successful rollbacks */
193
+ readonly successful: number;
194
+ /** Number of failed rollbacks */
195
+ readonly failed: number;
196
+ /** Total duration in milliseconds */
197
+ readonly duration: number;
198
+ }
199
+ /**
200
+ * Database type for SQL dialect
201
+ */
202
+ export type DatabaseType = 'sqlite' | 'postgresql' | 'mysql';
203
+ /**
204
+ * Configuration for the migration runner
205
+ */
206
+ export interface MigrationConfig {
207
+ /** Working directory (project root) */
208
+ readonly cwd: string;
209
+ /** Database type */
210
+ readonly database: DatabaseType;
211
+ /** Path to migrations directory (relative to cwd) */
212
+ readonly migrationsPath: string;
213
+ }
214
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/migrations/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Migration Types
3
+ *
4
+ * Core type definitions for the VeloxTS migration runner system.
5
+ */
6
+ /**
7
+ * Create a new PrismaClient instance dynamically.
8
+ *
9
+ * This function handles the dynamic import of @prisma/client at runtime,
10
+ * avoiding compile-time dependency on generated Prisma types.
11
+ *
12
+ * @returns A new PrismaClient instance typed as PrismaClientLike
13
+ */
14
+ export async function createPrismaClient() {
15
+ // Dynamic import with type assertion to handle varying module structures
16
+ const prismaModule = (await import('@prisma/client'));
17
+ return new prismaModule.PrismaClient();
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/migrations/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4CH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,yEAAyE;IACzE,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAA4B,CAAC;IACjF,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veloxts/cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Developer tooling and CLI commands for VeloxTS framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -18,20 +18,38 @@
18
18
  "dist",
19
19
  "README.md"
20
20
  ],
21
+ "tsd": {
22
+ "directory": "src/migrations/__type-tests__",
23
+ "compilerOptions": {
24
+ "paths": {
25
+ "@veloxts/cli": [
26
+ "dist"
27
+ ]
28
+ }
29
+ }
30
+ },
21
31
  "dependencies": {
22
- "commander": "14.0.2",
23
32
  "@clack/prompts": "0.11.0",
33
+ "commander": "14.0.2",
24
34
  "picocolors": "1.1.1",
35
+ "pluralize": "8.0.0",
25
36
  "tsx": "4.21.0",
26
- "@veloxts/core": "0.4.0",
27
- "@veloxts/router": "0.4.0",
28
- "@veloxts/validation": "0.4.0",
29
- "@veloxts/orm": "0.4.0",
30
- "@veloxts/auth": "0.4.0"
37
+ "@veloxts/auth": "0.4.2",
38
+ "@veloxts/core": "0.4.2",
39
+ "@veloxts/orm": "0.4.2",
40
+ "@veloxts/router": "0.4.2",
41
+ "@veloxts/validation": "0.4.2"
42
+ },
43
+ "peerDependencies": {
44
+ "@prisma/client": ">=5.0.0"
31
45
  },
32
46
  "devDependencies": {
47
+ "@prisma/client": "6.9.0",
33
48
  "@types/node": "24.10.1",
34
- "typescript": "5.9.3"
49
+ "@types/pluralize": "0.0.33",
50
+ "tsd": "0.32.0",
51
+ "typescript": "5.9.3",
52
+ "vitest": "4.0.15"
35
53
  },
36
54
  "keywords": [
37
55
  "velox",
@@ -56,6 +74,9 @@
56
74
  "build": "tsc",
57
75
  "dev": "tsc --watch",
58
76
  "type-check": "tsc --noEmit",
77
+ "test": "vitest run",
78
+ "test:watch": "vitest",
79
+ "test:types": "tsd",
59
80
  "clean": "rm -rf dist tsconfig.tsbuildinfo"
60
81
  }
61
82
  }