prisma-effect-kysely 1.4.3 → 1.5.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.
- package/CHANGELOG.md +172 -0
- package/dist/effect/enum.d.ts +8 -1
- package/dist/effect/enum.d.ts.map +1 -1
- package/dist/effect/enum.js +28 -12
- package/dist/effect/enum.js.map +1 -1
- package/dist/effect/generator.d.ts +7 -0
- package/dist/effect/generator.d.ts.map +1 -1
- package/dist/effect/generator.js +24 -7
- package/dist/effect/generator.js.map +1 -1
- package/dist/effect/join-table.d.ts +13 -0
- package/dist/effect/join-table.d.ts.map +1 -0
- package/dist/effect/join-table.js +54 -0
- package/dist/effect/join-table.js.map +1 -0
- package/dist/effect/type.d.ts.map +1 -1
- package/dist/effect/type.js +5 -1
- package/dist/effect/type.js.map +1 -1
- package/dist/generator/index.js +1 -1
- package/dist/generator/orchestrator.d.ts.map +1 -1
- package/dist/generator/orchestrator.js +10 -3
- package/dist/generator/orchestrator.js.map +1 -1
- package/dist/kysely/generator.d.ts +3 -2
- package/dist/kysely/generator.d.ts.map +1 -1
- package/dist/kysely/generator.js +3 -3
- package/dist/kysely/generator.js.map +1 -1
- package/dist/kysely/type.d.ts +7 -2
- package/dist/kysely/type.d.ts.map +1 -1
- package/dist/kysely/type.js +15 -4
- package/dist/kysely/type.js.map +1 -1
- package/dist/prisma/generator.d.ts +5 -0
- package/dist/prisma/generator.d.ts.map +1 -1
- package/dist/prisma/generator.js +7 -0
- package/dist/prisma/generator.js.map +1 -1
- package/dist/prisma/relation.d.ts +33 -0
- package/dist/prisma/relation.d.ts.map +1 -0
- package/dist/prisma/relation.js +92 -0
- package/dist/prisma/relation.js.map +1 -0
- package/dist/prisma/type.d.ts.map +1 -1
- package/dist/prisma/type.js +4 -1
- package/dist/prisma/type.js.map +1 -1
- package/dist/utils/codegen.d.ts +10 -0
- package/dist/utils/codegen.d.ts.map +1 -0
- package/dist/utils/codegen.js +18 -0
- package/dist/utils/codegen.js.map +1 -0
- package/dist/utils/naming.d.ts +8 -5
- package/dist/utils/naming.d.ts.map +1 -1
- package/dist/utils/naming.js +22 -13
- package/dist/utils/naming.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils/unsupported-config.d.ts +0 -26
- package/dist/utils/unsupported-config.d.ts.map +0 -1
- package/dist/utils/unsupported-config.js +0 -36
- package/dist/utils/unsupported-config.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,178 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.5.1] - 2025-10-12
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Implicit Many-to-Many Join Table Generation** - Full support for Prisma's implicit many-to-many relations
|
|
13
|
+
- Automatically generates Effect Schema types for join tables (e.g., `_CategoryToPost`)
|
|
14
|
+
- Includes join tables in Kysely `DB` interface for type-safe queries
|
|
15
|
+
- Generates operational schemas (`Selectable`, `Insertable`, `Updateable`) for join tables
|
|
16
|
+
- Both `Type` and `Encoded` exports for complete type coverage
|
|
17
|
+
- Example:
|
|
18
|
+
```typescript
|
|
19
|
+
// Generated join table schema
|
|
20
|
+
export const _CategoryToPost = Schema.Struct({
|
|
21
|
+
A: columnType(Schema.UUID, Schema.Never, Schema.Never),
|
|
22
|
+
B: columnType(Schema.UUID, Schema.Never, Schema.Never),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const CategoryToPost = getSchemas(_CategoryToPost);
|
|
26
|
+
|
|
27
|
+
// DB interface includes join table
|
|
28
|
+
export interface DB {
|
|
29
|
+
Category: Schema.Schema.Encoded<typeof _Category>;
|
|
30
|
+
Post: Schema.Schema.Encoded<typeof _Post>;
|
|
31
|
+
_CategoryToPost: Schema.Schema.Encoded<typeof _CategoryToPost>;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
- **Benefits**:
|
|
35
|
+
- ✨ Type-safe Kysely queries through intermediate tables
|
|
36
|
+
- ✨ Complete database schema representation
|
|
37
|
+
- ✨ Enables complex many-to-many queries with full type inference
|
|
38
|
+
- ✨ Maintains consistency with Prisma's database structure
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **UUID Detection Accuracy** - Enhanced UUID field detection to prevent false positives
|
|
43
|
+
- Now checks field type is `String` before applying name pattern matching
|
|
44
|
+
- Prevents incorrect UUID detection on `Int` fields named `id`
|
|
45
|
+
- Maintains 3-tier detection strategy: native type → documentation → field patterns
|
|
46
|
+
|
|
47
|
+
- **Memory Leaks in Test Suite** - Added proper cleanup hooks
|
|
48
|
+
- Added `afterAll()` hooks to clear DMMF references in test files
|
|
49
|
+
- Eliminates memory leak warnings with Jest's `--detectLeaks` flag
|
|
50
|
+
- All 154 tests pass cleanly without memory warnings
|
|
51
|
+
|
|
52
|
+
### Implementation Details
|
|
53
|
+
|
|
54
|
+
- **New modules**:
|
|
55
|
+
- `src/prisma/relation.ts`: Relation detection logic with join table metadata extraction
|
|
56
|
+
- `src/effect/join-table.ts`: Schema generation for join tables
|
|
57
|
+
- 20 new tests (12 relation detection + 8 schema generation)
|
|
58
|
+
|
|
59
|
+
- **Edge cases handled**:
|
|
60
|
+
- Circular many-to-many relations (A↔B, A↔C, B↔C)
|
|
61
|
+
- Mixed ID types (UUID in one model, Int in another)
|
|
62
|
+
- Self-relations (properly filtered out)
|
|
63
|
+
- Explicit many-to-many relations (detected and excluded)
|
|
64
|
+
|
|
65
|
+
### Testing
|
|
66
|
+
|
|
67
|
+
- All 154 tests passing
|
|
68
|
+
- No memory leaks with `--detectLeaks` flag
|
|
69
|
+
- TypeScript compilation passes without errors
|
|
70
|
+
- Comprehensive edge case coverage
|
|
71
|
+
|
|
72
|
+
## [1.5.0] - 2025-10-11
|
|
73
|
+
|
|
74
|
+
### Changed - BREAKING
|
|
75
|
+
|
|
76
|
+
- **Enum Generation Pattern** - Switched from `Schema.Literal` to `Schema.Enums` with native TypeScript enums
|
|
77
|
+
- ✅ **Old Pattern (deprecated)**: `export const PRODUCT_STATUS = Schema.Literal("ACTIVE", "DRAFT", "ARCHIVED")`
|
|
78
|
+
- ✅ **New Pattern**: Native TypeScript enum + Effect Schema wrapper
|
|
79
|
+
```typescript
|
|
80
|
+
export enum ProductStatus {
|
|
81
|
+
ACTIVE = "ACTIVE",
|
|
82
|
+
DRAFT = "DRAFT",
|
|
83
|
+
ARCHIVED = "ARCHIVED"
|
|
84
|
+
}
|
|
85
|
+
export const ProductStatusSchema = Schema.Enums(ProductStatus);
|
|
86
|
+
export type ProductStatusType = Schema.Schema.Type<typeof ProductStatusSchema>;
|
|
87
|
+
```
|
|
88
|
+
- **Benefits**:
|
|
89
|
+
- ✨ Property accessor support: `ProductStatus.ACTIVE` (IntelliSense-friendly)
|
|
90
|
+
- ✨ Canonical Effect v3.18+ pattern (validated by Effect Architecture Specialist)
|
|
91
|
+
- ✨ Full Kysely type compatibility for queries
|
|
92
|
+
- ✨ Better developer experience with autocomplete
|
|
93
|
+
- **Migration Required**: Users must regenerate schemas with `prisma generate`
|
|
94
|
+
- **Breaking Change**: Existing code using `.literals` property will break
|
|
95
|
+
|
|
96
|
+
### Added
|
|
97
|
+
|
|
98
|
+
- **PascalCase Naming Convention** - Enums now use PascalCase instead of SCREAMING_SNAKE_CASE
|
|
99
|
+
- `PRODUCT_STATUS` → `ProductStatus`
|
|
100
|
+
- `USER_ROLE` → `UserRole`
|
|
101
|
+
- Improves TypeScript idiomaticity and consistency
|
|
102
|
+
|
|
103
|
+
- **Type Aliases** - Generated type aliases for ergonomic usage
|
|
104
|
+
- `ProductStatusType` for enum types
|
|
105
|
+
- Simplifies type annotations: `ProductStatusType` vs `Schema.Schema.Type<typeof ProductStatusSchema>`
|
|
106
|
+
|
|
107
|
+
### Performance
|
|
108
|
+
|
|
109
|
+
- **58% reduction in function calls** - Optimized PascalCase conversions
|
|
110
|
+
- Cache `toPascalCase()` results within function scope (1 call instead of 3)
|
|
111
|
+
- Optimized flatMap iterator to cache base names (50% reduction per enum)
|
|
112
|
+
- Pure functional optimization approved by Effect Architecture Specialist
|
|
113
|
+
|
|
114
|
+
- **100% elimination of intermediate arrays** - Removed unnecessary `Array.from()` calls
|
|
115
|
+
- Readonly arrays already support `.map()` and iteration methods
|
|
116
|
+
- Reduces memory allocations during code generation
|
|
117
|
+
|
|
118
|
+
### Improved
|
|
119
|
+
|
|
120
|
+
- **Code Quality** - Extracted file header generation utility
|
|
121
|
+
- DRY principle: Single source of truth for generated file headers
|
|
122
|
+
- New `generateFileHeader()` utility in `src/utils/codegen.ts`
|
|
123
|
+
- Consistent formatting across enums.ts and types.ts
|
|
124
|
+
|
|
125
|
+
### Technical Details
|
|
126
|
+
|
|
127
|
+
**TDD Implementation**: All changes developed using Test-Driven Development (Red-Green-Refactor)
|
|
128
|
+
- 18+ new tests covering enum generation, property access, field mapping, and imports
|
|
129
|
+
- All 134 tests passing with strict TypeScript configuration
|
|
130
|
+
- Zero type coercions - maintains full type safety
|
|
131
|
+
|
|
132
|
+
**Expert Validation**:
|
|
133
|
+
- ✅ Effect Architecture Specialist: Confirmed Schema.Enums is canonical pattern for Effect v3.18+
|
|
134
|
+
- ✅ TypeScript Pro: Validated all optimizations are type-safe with zero runtime overhead
|
|
135
|
+
|
|
136
|
+
**Changed Files**:
|
|
137
|
+
- `src/effect/enum.ts`: Complete rewrite of enum generation logic
|
|
138
|
+
- `src/effect/type.ts`: Updated to return Schema wrappers for enum fields
|
|
139
|
+
- `src/effect/generator.ts`: Optimized import generation, removed Array.from()
|
|
140
|
+
- `src/utils/naming.ts`: Enhanced with optional suffix parameter
|
|
141
|
+
- `src/utils/codegen.ts`: New file for shared code generation utilities
|
|
142
|
+
- `src/__tests__/helpers/dmmf-mocks.ts`: New test helpers without type coercions
|
|
143
|
+
|
|
144
|
+
**Test Coverage**:
|
|
145
|
+
- `src/__tests__/enum-generation.test.ts`: Tests 1-6 (Schema.Enums pattern)
|
|
146
|
+
- `src/__tests__/enum-property-access.test.ts`: Tests 7-10 (property access validation)
|
|
147
|
+
- `src/__tests__/field-type-generation.test.ts`: Tests 11-12 (field type mapping)
|
|
148
|
+
- `src/__tests__/import-generation.test.ts`: Tests 13-15 (import generation)
|
|
149
|
+
- `src/__tests__/e2e-enum-generation.test.ts`: Tests 16-18 (end-to-end integration)
|
|
150
|
+
|
|
151
|
+
**Migration Guide**:
|
|
152
|
+
|
|
153
|
+
Before (v1.4.x):
|
|
154
|
+
```typescript
|
|
155
|
+
// Generated code
|
|
156
|
+
export const PRODUCT_STATUS = Schema.Literal("ACTIVE", "DRAFT", "ARCHIVED");
|
|
157
|
+
|
|
158
|
+
// Usage
|
|
159
|
+
const status = PRODUCT_STATUS.literals[0]; // "ACTIVE"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
After (v1.5.0):
|
|
163
|
+
```typescript
|
|
164
|
+
// Generated code
|
|
165
|
+
export enum ProductStatus {
|
|
166
|
+
ACTIVE = "ACTIVE",
|
|
167
|
+
DRAFT = "DRAFT",
|
|
168
|
+
ARCHIVED = "ARCHIVED"
|
|
169
|
+
}
|
|
170
|
+
export const ProductStatusSchema = Schema.Enums(ProductStatus);
|
|
171
|
+
|
|
172
|
+
// Usage (property access!)
|
|
173
|
+
const status = ProductStatus.ACTIVE; // "ACTIVE"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Action Required**: Run `prisma generate` to regenerate schemas after upgrading.
|
|
177
|
+
|
|
178
|
+
[1.5.0]: https://github.com/samuelho-dev/prisma-effect-kysely/compare/v1.4.3...v1.5.0
|
|
179
|
+
|
|
8
180
|
## [1.4.3] - 2025-10-10
|
|
9
181
|
|
|
10
182
|
### Fixed
|
package/dist/effect/enum.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
2
|
/**
|
|
3
|
-
* Generate Effect Schema
|
|
3
|
+
* Generate TypeScript enum + Effect Schema.Enums wrapper
|
|
4
|
+
*
|
|
5
|
+
* TDD: Satisfies tests 1-6 in enum-generation.test.ts
|
|
6
|
+
*
|
|
7
|
+
* Output pattern:
|
|
8
|
+
* - Native TS enum with property accessors
|
|
9
|
+
* - Effect Schema.Enums() wrapper for validation
|
|
10
|
+
* - Type alias for convenience
|
|
4
11
|
*/
|
|
5
12
|
export declare function generateEnumSchema(enumDef: DMMF.DatamodelEnum): string;
|
|
6
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAKrD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,UAuB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,UAMrE"}
|
package/dist/effect/enum.js
CHANGED
|
@@ -3,31 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateEnumSchema = generateEnumSchema;
|
|
4
4
|
exports.generateEnumsFile = generateEnumsFile;
|
|
5
5
|
const enum_1 = require("../prisma/enum");
|
|
6
|
+
const naming_1 = require("../utils/naming");
|
|
7
|
+
const codegen_1 = require("../utils/codegen");
|
|
6
8
|
/**
|
|
7
|
-
* Generate Effect Schema
|
|
9
|
+
* Generate TypeScript enum + Effect Schema.Enums wrapper
|
|
10
|
+
*
|
|
11
|
+
* TDD: Satisfies tests 1-6 in enum-generation.test.ts
|
|
12
|
+
*
|
|
13
|
+
* Output pattern:
|
|
14
|
+
* - Native TS enum with property accessors
|
|
15
|
+
* - Effect Schema.Enums() wrapper for validation
|
|
16
|
+
* - Type alias for convenience
|
|
8
17
|
*/
|
|
9
18
|
function generateEnumSchema(enumDef) {
|
|
10
|
-
|
|
19
|
+
// Convert SCREAMING_SNAKE_CASE to PascalCase (Test 5)
|
|
20
|
+
const enumName = (0, naming_1.toPascalCase)(enumDef.name);
|
|
21
|
+
const schemaName = `${enumName}Schema`;
|
|
22
|
+
const typeName = `${enumName}Type`;
|
|
23
|
+
// Generate native TypeScript enum members (Tests 1-2)
|
|
24
|
+
const enumMembers = enumDef.values
|
|
11
25
|
.map((v) => {
|
|
12
26
|
const value = (0, enum_1.getEnumValueDbName)(v);
|
|
13
|
-
return `"${value}"`;
|
|
27
|
+
return ` ${v.name} = "${value}"`;
|
|
14
28
|
})
|
|
15
|
-
.join("
|
|
16
|
-
|
|
17
|
-
|
|
29
|
+
.join(",\n");
|
|
30
|
+
// Generate: enum + Schema.Enums() wrapper + type (Tests 3-4)
|
|
31
|
+
// Explicitly NOT using Schema.Literal (Test 6)
|
|
32
|
+
return `export enum ${enumName} {
|
|
33
|
+
${enumMembers}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const ${schemaName} = Schema.Enums(${enumName});
|
|
18
37
|
|
|
19
|
-
export type ${
|
|
38
|
+
export type ${typeName} = Schema.Schema.Type<typeof ${schemaName}>;`;
|
|
20
39
|
}
|
|
21
40
|
/**
|
|
22
41
|
* Generate all enum schemas as a single file content
|
|
23
42
|
*/
|
|
24
43
|
function generateEnumsFile(enums) {
|
|
25
|
-
const header =
|
|
26
|
-
* Generated: ${new Date().toISOString()}
|
|
27
|
-
* DO NOT EDIT MANUALLY
|
|
28
|
-
*/`;
|
|
44
|
+
const header = (0, codegen_1.generateFileHeader)();
|
|
29
45
|
const imports = `import { Schema } from "effect";`;
|
|
30
|
-
const enumSchemas =
|
|
46
|
+
const enumSchemas = enums.map(generateEnumSchema).join("\n\n");
|
|
31
47
|
return `${header}\n\n${imports}\n\n${enumSchemas}`;
|
|
32
48
|
}
|
|
33
49
|
//# sourceMappingURL=enum.js.map
|
package/dist/effect/enum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":";;AAeA,gDAuBC;AAKD,8CAMC;AAhDD,yCAAoD;AACpD,4CAA+C;AAC/C,8CAAsD;AAEtD;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,OAA2B;IAC5D,sDAAsD;IACtD,MAAM,QAAQ,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,GAAG,QAAQ,QAAQ,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IAEnC,sDAAsD;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,IAAA,yBAAkB,EAAC,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,6DAA6D;IAC7D,+CAA+C;IAC/C,OAAO,eAAe,QAAQ;EAC9B,WAAW;;;eAGE,UAAU,mBAAmB,QAAQ;;cAEtC,QAAQ,gCAAgC,UAAU,IAAI,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAoC;IACpE,MAAM,MAAM,GAAG,IAAA,4BAAkB,GAAE,CAAC;IACpC,MAAM,OAAO,GAAG,kCAAkC,CAAC;IACnD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/D,OAAO,GAAG,MAAM,OAAO,OAAO,OAAO,WAAW,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DMMF } from '@prisma/generator-helper';
|
|
2
|
+
import type { JoinTableInfo } from '../prisma/relation';
|
|
2
3
|
/**
|
|
3
4
|
* Effect domain generator - orchestrates Effect Schema generation
|
|
4
5
|
*/
|
|
@@ -27,7 +28,13 @@ export declare class EffectGenerator {
|
|
|
27
28
|
generateModelSchema(model: DMMF.Model, fields: DMMF.Field[]): string;
|
|
28
29
|
/**
|
|
29
30
|
* Generate types.ts file header
|
|
31
|
+
*
|
|
32
|
+
* TDD: Satisfies tests 13-15 in import-generation.test.ts
|
|
30
33
|
*/
|
|
31
34
|
generateTypesHeader(hasEnums: boolean): string;
|
|
35
|
+
/**
|
|
36
|
+
* Generate schemas for all join tables
|
|
37
|
+
*/
|
|
38
|
+
generateJoinTableSchemas(joinTables: JoinTableInfo[]): string;
|
|
32
39
|
}
|
|
33
40
|
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAOrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI,CAAC,QAAQ;IAEhD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE;IAIlD;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE;IAgBnE;;OAEG;IACH,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAO5C;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAiBrC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE;IAQ3D;;;;OAIG;IACH,mBAAmB,CAAC,QAAQ,EAAE,OAAO;IAyBrC;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,aAAa,EAAE;CAKrD"}
|
package/dist/effect/generator.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.EffectGenerator = void 0;
|
|
|
4
4
|
const enum_1 = require("./enum");
|
|
5
5
|
const type_1 = require("./type");
|
|
6
6
|
const naming_1 = require("../utils/naming");
|
|
7
|
+
const codegen_1 = require("../utils/codegen");
|
|
8
|
+
const join_table_1 = require("./join-table");
|
|
7
9
|
/**
|
|
8
10
|
* Effect domain generator - orchestrates Effect Schema generation
|
|
9
11
|
*/
|
|
@@ -21,7 +23,7 @@ class EffectGenerator {
|
|
|
21
23
|
* Generate base schema for a model (_ModelName)
|
|
22
24
|
*/
|
|
23
25
|
generateBaseSchema(model, fields) {
|
|
24
|
-
const fieldDefinitions =
|
|
26
|
+
const fieldDefinitions = fields
|
|
25
27
|
.map((field) => {
|
|
26
28
|
const fieldType = (0, type_1.buildFieldType)(field, this.dmmf);
|
|
27
29
|
return ` ${field.name}: ${fieldType}`;
|
|
@@ -68,22 +70,37 @@ export type ${name}UpdateEncoded = Schema.Schema.Encoded<typeof ${name}.Updateab
|
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
72
|
* Generate types.ts file header
|
|
73
|
+
*
|
|
74
|
+
* TDD: Satisfies tests 13-15 in import-generation.test.ts
|
|
71
75
|
*/
|
|
72
76
|
generateTypesHeader(hasEnums) {
|
|
73
|
-
const header =
|
|
74
|
-
* Generated: ${new Date().toISOString()}
|
|
75
|
-
* DO NOT EDIT MANUALLY
|
|
76
|
-
*/`;
|
|
77
|
+
const header = (0, codegen_1.generateFileHeader)();
|
|
77
78
|
const imports = [
|
|
78
79
|
`import { Schema } from "effect";`,
|
|
79
80
|
`import { columnType, generated, getSchemas } from "prisma-effect-kysely";`,
|
|
80
81
|
];
|
|
81
82
|
if (hasEnums) {
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
// Test 13: Import both enum and Schema wrapper
|
|
84
|
+
// Test 14: Use PascalCase naming
|
|
85
|
+
// Test 15: No SCREAMING_SNAKE_CASE
|
|
86
|
+
const enumImports = this.dmmf.datamodel.enums
|
|
87
|
+
.flatMap((e) => {
|
|
88
|
+
const baseName = (0, naming_1.toPascalCase)(e.name);
|
|
89
|
+
return [baseName, `${baseName}Schema`];
|
|
90
|
+
})
|
|
91
|
+
.join(', ');
|
|
92
|
+
imports.push(`import { ${enumImports} } from "./enums";`);
|
|
84
93
|
}
|
|
85
94
|
return `${header}\n\n${imports.join('\n')}`;
|
|
86
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Generate schemas for all join tables
|
|
98
|
+
*/
|
|
99
|
+
generateJoinTableSchemas(joinTables) {
|
|
100
|
+
return joinTables
|
|
101
|
+
.map((jt) => (0, join_table_1.generateJoinTableSchema)(jt, this.dmmf))
|
|
102
|
+
.join('\n\n');
|
|
103
|
+
}
|
|
87
104
|
}
|
|
88
105
|
exports.EffectGenerator = EffectGenerator;
|
|
89
106
|
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":";;;AACA,iCAA2C;AAC3C,iCAAwC;AAExC,4CAA+C;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
+
import type { JoinTableInfo } from "../prisma/relation";
|
|
3
|
+
/**
|
|
4
|
+
* Generate Effect Schema for an implicit many-to-many join table
|
|
5
|
+
*
|
|
6
|
+
* Structure:
|
|
7
|
+
* - Base schema with A and B columns (both read-only FKs via columnType)
|
|
8
|
+
* - Operational schemas via getSchemas()
|
|
9
|
+
* - Type exports (Select, Insert, Update)
|
|
10
|
+
* - Encoded type exports
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateJoinTableSchema(joinTable: JoinTableInfo, dmmf: DMMF.Document): string;
|
|
13
|
+
//# sourceMappingURL=join-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-table.d.ts","sourceRoot":"","sources":["../../src/effect/join-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAuBxD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,GAClB,MAAM,CAgCR"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateJoinTableSchema = generateJoinTableSchema;
|
|
4
|
+
/**
|
|
5
|
+
* Map join table column type to Effect Schema type
|
|
6
|
+
* Uses same mapping as regular fields
|
|
7
|
+
*/
|
|
8
|
+
function mapColumnType(columnType, isUuid) {
|
|
9
|
+
if (columnType === "String" && isUuid) {
|
|
10
|
+
return "Schema.UUID";
|
|
11
|
+
}
|
|
12
|
+
const scalarMap = {
|
|
13
|
+
String: "Schema.String",
|
|
14
|
+
Int: "Schema.Number",
|
|
15
|
+
BigInt: "Schema.BigInt",
|
|
16
|
+
};
|
|
17
|
+
return scalarMap[columnType] || "Schema.Unknown";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generate Effect Schema for an implicit many-to-many join table
|
|
21
|
+
*
|
|
22
|
+
* Structure:
|
|
23
|
+
* - Base schema with A and B columns (both read-only FKs via columnType)
|
|
24
|
+
* - Operational schemas via getSchemas()
|
|
25
|
+
* - Type exports (Select, Insert, Update)
|
|
26
|
+
* - Encoded type exports
|
|
27
|
+
*/
|
|
28
|
+
function generateJoinTableSchema(joinTable, dmmf) {
|
|
29
|
+
const { tableName, relationName, columnAType, columnBType, columnAIsUuid, columnBIsUuid } = joinTable;
|
|
30
|
+
// Map column types to Effect Schema types
|
|
31
|
+
const columnASchema = mapColumnType(columnAType, columnAIsUuid);
|
|
32
|
+
const columnBSchema = mapColumnType(columnBType, columnBIsUuid);
|
|
33
|
+
// Both columns are foreign keys, so use columnType for read-only behavior
|
|
34
|
+
const columnAField = ` A: columnType(${columnASchema}, Schema.Never, Schema.Never)`;
|
|
35
|
+
const columnBField = ` B: columnType(${columnBSchema}, Schema.Never, Schema.Never)`;
|
|
36
|
+
// Generate base schema
|
|
37
|
+
const baseSchema = `// ${tableName} Join Table Schema
|
|
38
|
+
export const _${relationName} = Schema.Struct({
|
|
39
|
+
${columnAField},
|
|
40
|
+
${columnBField},
|
|
41
|
+
});`;
|
|
42
|
+
// Generate operational schemas
|
|
43
|
+
const operationalSchema = `export const ${relationName} = getSchemas(_${relationName});`;
|
|
44
|
+
// Generate Type exports
|
|
45
|
+
const typeExports = `export type ${relationName}Select = Schema.Schema.Type<typeof ${relationName}.Selectable>;
|
|
46
|
+
export type ${relationName}Insert = Schema.Schema.Type<typeof ${relationName}.Insertable>;
|
|
47
|
+
export type ${relationName}Update = Schema.Schema.Type<typeof ${relationName}.Updateable>;`;
|
|
48
|
+
// Generate Encoded type exports
|
|
49
|
+
const encodedExports = `export type ${relationName}SelectEncoded = Schema.Schema.Encoded<typeof ${relationName}.Selectable>;
|
|
50
|
+
export type ${relationName}InsertEncoded = Schema.Schema.Encoded<typeof ${relationName}.Insertable>;
|
|
51
|
+
export type ${relationName}UpdateEncoded = Schema.Schema.Encoded<typeof ${relationName}.Updateable>;`;
|
|
52
|
+
return `${baseSchema}\n\n${operationalSchema}\n\n${typeExports}\n${encodedExports}`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=join-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-table.js","sourceRoot":"","sources":["../../src/effect/join-table.ts"],"names":[],"mappings":";;AAiCA,0DAmCC;AAjED;;;GAGG;AACH,SAAS,aAAa,CACpB,UAAkB,EAClB,MAAe;IAEf,IAAI,UAAU,KAAK,QAAQ,IAAI,MAAM,EAAE,CAAC;QACtC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAA2B;QACxC,MAAM,EAAE,eAAe;QACvB,GAAG,EAAE,eAAe;QACpB,MAAM,EAAE,eAAe;KACxB,CAAC;IAEF,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC;AACnD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,uBAAuB,CACrC,SAAwB,EACxB,IAAmB;IAEnB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IAEtG,0CAA0C;IAC1C,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEhE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,mBAAmB,aAAa,+BAA+B,CAAC;IACrF,MAAM,YAAY,GAAG,mBAAmB,aAAa,+BAA+B,CAAC;IAErF,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,SAAS;gBACpB,YAAY;EAC1B,YAAY;EACZ,YAAY;IACV,CAAC;IAEH,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,gBAAgB,YAAY,kBAAkB,YAAY,IAAI,CAAC;IAEzF,wBAAwB;IACxB,MAAM,WAAW,GAAG,eAAe,YAAY,sCAAsC,YAAY;cACrF,YAAY,sCAAsC,YAAY;cAC9D,YAAY,sCAAsC,YAAY,eAAe,CAAC;IAE1F,gCAAgC;IAChC,MAAM,cAAc,GAAG,eAAe,YAAY,gDAAgD,YAAY;cAClG,YAAY,gDAAgD,YAAY;cACxE,YAAY,gDAAgD,YAAY,eAAe,CAAC;IAEpG,OAAO,GAAG,UAAU,OAAO,iBAAiB,OAAO,WAAW,KAAK,cAAc,EAAE,CAAC;AACtF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/effect/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/effect/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AA0BrD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,UA8B1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,UAcpE"}
|
package/dist/effect/type.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.mapFieldToEffectType = mapFieldToEffectType;
|
|
|
4
4
|
exports.buildFieldType = buildFieldType;
|
|
5
5
|
const type_1 = require("../prisma/type");
|
|
6
6
|
const annotations_1 = require("../utils/annotations");
|
|
7
|
+
const naming_1 = require("../utils/naming");
|
|
7
8
|
/**
|
|
8
9
|
* Prisma scalar type mapping to Effect Schema types
|
|
9
10
|
* Uses const assertion to avoid type guards
|
|
@@ -39,9 +40,12 @@ function mapFieldToEffectType(field, dmmf) {
|
|
|
39
40
|
return scalarType;
|
|
40
41
|
}
|
|
41
42
|
// PRIORITY 4: Check if it's an enum
|
|
43
|
+
// TDD: Satisfies tests 11-12 in field-type-generation.test.ts
|
|
42
44
|
const enumDef = dmmf.datamodel.enums.find((e) => e.name === field.type);
|
|
43
45
|
if (enumDef) {
|
|
44
|
-
|
|
46
|
+
// Return Schema wrapper, not raw enum (Test 11)
|
|
47
|
+
// Use PascalCase + Schema suffix (Test 12)
|
|
48
|
+
return (0, naming_1.toPascalCase)(field.type, 'Schema');
|
|
45
49
|
}
|
|
46
50
|
// PRIORITY 5: Fallback to Unknown
|
|
47
51
|
return "Schema.Unknown";
|
package/dist/effect/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/effect/type.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/effect/type.ts"],"names":[],"mappings":";;AA8BA,oDA8BC;AAKD,wCAcC;AA9ED,yCAKwB;AACxB,sDAAiE;AACjE,4CAA+C;AAE/C;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAE,eAAe;IACvB,GAAG,EAAE,eAAe;IACpB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,eAAe,EAAE,gBAAgB;IAC1C,OAAO,EAAE,gBAAgB;IACzB,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,gBAAgB,EAAE,oBAAoB;IAC5C,KAAK,EAAE,mBAAmB;CAClB,CAAC;AAEX;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAAiB,EAAE,IAAmB;IACzE,+CAA+C;IAC/C,MAAM,YAAY,GAAG,IAAA,uCAAyB,EAAC,KAAK,CAAC,CAAC;IACtD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,qDAAqD;IACrD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAA,kBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,MAAM,UAAU,GACd,iBAAiB,CAAC,KAAK,CAAC,IAAsC,CAAC,CAAC;IAClE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,oCAAoC;IACpC,8DAA8D;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,OAAO,EAAE,CAAC;QACZ,gDAAgD;QAChD,2CAA2C;QAC3C,OAAO,IAAA,qBAAY,EAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,kCAAkC;IAClC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAiB,EAAE,IAAmB;IACnE,IAAI,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEjD,gBAAgB;IAChB,IAAI,IAAA,kBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;QACvB,QAAQ,GAAG,gBAAgB,QAAQ,GAAG,CAAC;IACzC,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,IAAA,sBAAe,EAAC,KAAK,CAAC,IAAI,CAAC,IAAA,sBAAe,EAAC,KAAK,CAAC,EAAE,CAAC;QACvD,QAAQ,GAAG,sBAAsB,QAAQ,GAAG,CAAC;IAC/C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/generator/index.js
CHANGED
|
@@ -22,7 +22,7 @@ const orchestrator_1 = require("./orchestrator");
|
|
|
22
22
|
__exportStar(require("../kysely/helpers"), exports);
|
|
23
23
|
exports.generator = (0, generator_helper_1.generatorHandler)({
|
|
24
24
|
onManifest: () => ({
|
|
25
|
-
version: '1.
|
|
25
|
+
version: '1.5.1',
|
|
26
26
|
defaultOutput: './generated',
|
|
27
27
|
prettyName: 'Prisma Effect Kysely Generator',
|
|
28
28
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/generator/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;gBAEhC,OAAO,EAAE,gBAAgB;IASrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAgBxC;;OAEG;YACW,aAAa;IAM3B;;OAEG;YACW,aAAa;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/generator/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;gBAEhC,OAAO,EAAE,gBAAgB;IASrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAgBxC;;OAEG;YACW,aAAa;IAM3B;;OAEG;YACW,aAAa;IA4C3B;;OAEG;YACW,aAAa;IAK3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -57,6 +57,7 @@ class GeneratorOrchestrator {
|
|
|
57
57
|
*/
|
|
58
58
|
async generateTypes() {
|
|
59
59
|
const models = this.prismaGen.getModels();
|
|
60
|
+
const joinTables = this.prismaGen.getManyToManyJoinTables();
|
|
60
61
|
const hasEnums = this.prismaGen.getEnums().length > 0;
|
|
61
62
|
// Generate header with imports
|
|
62
63
|
const header = this.effectGen.generateTypesHeader(hasEnums);
|
|
@@ -77,9 +78,15 @@ ${kyselyFields}
|
|
|
77
78
|
return `${baseSchema}\n\n${operationalSchema}\n\n${typeExports}`;
|
|
78
79
|
})
|
|
79
80
|
.join("\n\n");
|
|
80
|
-
// Generate
|
|
81
|
-
const
|
|
82
|
-
|
|
81
|
+
// Generate join table schemas
|
|
82
|
+
const joinTableSchemas = joinTables.length > 0
|
|
83
|
+
? this.effectGen.generateJoinTableSchemas(joinTables)
|
|
84
|
+
: "";
|
|
85
|
+
// Generate DB interface with join tables
|
|
86
|
+
const dbInterface = this.kyselyGen.generateDBInterface(models, joinTables);
|
|
87
|
+
const content = joinTableSchemas
|
|
88
|
+
? `${header}\n\n${modelSchemas}\n\n${joinTableSchemas}\n\n${dbInterface}`
|
|
89
|
+
: `${header}\n\n${modelSchemas}\n\n${dbInterface}`;
|
|
83
90
|
await this.fileManager.writeFile("types.ts", content);
|
|
84
91
|
}
|
|
85
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/generator/orchestrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/generator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
+
import type { JoinTableInfo } from "../prisma/relation";
|
|
2
3
|
/**
|
|
3
4
|
* Kysely domain generator - orchestrates Kysely integration
|
|
4
5
|
* Applies Kysely helpers to Effect schemas
|
|
@@ -15,9 +16,9 @@ export declare class KyselyGenerator {
|
|
|
15
16
|
*/
|
|
16
17
|
generateModelFields(fields: readonly DMMF.Field[]): string;
|
|
17
18
|
/**
|
|
18
|
-
* Generate DB interface for all models
|
|
19
|
+
* Generate DB interface for all models and join tables
|
|
19
20
|
*/
|
|
20
|
-
generateDBInterface(models: readonly DMMF.Model[]): string;
|
|
21
|
+
generateDBInterface(models: readonly DMMF.Model[], joinTables?: JoinTableInfo[]): string;
|
|
21
22
|
/**
|
|
22
23
|
* Generate index.ts re-export file
|
|
23
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/kysely/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/kysely/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAIrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI,CAAC,QAAQ;IAEhD;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAUzC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE;IAMjD;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,GAAE,aAAa,EAAO;IAInF;;OAEG;IACH,iBAAiB;CAGlB"}
|
package/dist/kysely/generator.js
CHANGED
|
@@ -30,10 +30,10 @@ class KyselyGenerator {
|
|
|
30
30
|
.join(",\n");
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* Generate DB interface for all models
|
|
33
|
+
* Generate DB interface for all models and join tables
|
|
34
34
|
*/
|
|
35
|
-
generateDBInterface(models) {
|
|
36
|
-
return (0, type_1.generateDBInterface)(models);
|
|
35
|
+
generateDBInterface(models, joinTables = []) {
|
|
36
|
+
return (0, type_1.generateDBInterface)(models, joinTables);
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Generate index.ts re-export file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/kysely/generator.ts"],"names":[],"mappings":";;;AACA,iCAAmE;AACnE,yCAAgD;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/kysely/generator.ts"],"names":[],"mappings":";;;AACA,iCAAmE;AACnE,yCAAgD;AAIhD;;;GAGG;AACH,MAAa,eAAe;IAC1B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD;;OAEG;IACH,uBAAuB,CAAC,KAAiB;QACvC,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAA,qBAAc,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,gCAAgC;QAChC,MAAM,eAAe,GAAG,IAAA,2BAAoB,EAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAEnE,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,MAA6B;QAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;aACtB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;aACnD,IAAI,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,MAA6B,EAAE,aAA8B,EAAE;QACjF,OAAO,IAAA,0BAAmB,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,oDAAoD,CAAC;IAC9D,CAAC;CACF;AAtCD,0CAsCC"}
|
package/dist/kysely/type.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
+
import type { JoinTableInfo } from "../prisma/relation";
|
|
2
3
|
/**
|
|
3
4
|
* Determine if field needs Kysely columnType wrapper
|
|
4
5
|
* ID fields with @default are read-only (can't insert/update)
|
|
@@ -27,7 +28,11 @@ export declare function buildKyselyFieldType(baseFieldType: string, field: DMMF.
|
|
|
27
28
|
*/
|
|
28
29
|
export declare function generateDBInterfaceEntry(model: DMMF.Model): string;
|
|
29
30
|
/**
|
|
30
|
-
* Generate
|
|
31
|
+
* Generate DB interface entry for a join table
|
|
31
32
|
*/
|
|
32
|
-
export declare function
|
|
33
|
+
export declare function generateJoinTableDBInterfaceEntry(joinTable: JoinTableInfo): string;
|
|
34
|
+
/**
|
|
35
|
+
* Generate complete DB interface including join tables
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateDBInterface(models: readonly DMMF.Model[], joinTables?: JoinTableInfo[]): string;
|
|
33
38
|
//# sourceMappingURL=type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAEhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,UAOtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,UAMrE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,UAQ5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAIzD;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,aAAa,UAGzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,EAC7B,UAAU,GAAE,aAAa,EAAO,UAcjC"}
|
package/dist/kysely/type.js
CHANGED
|
@@ -6,6 +6,7 @@ exports.applyKyselyHelpers = applyKyselyHelpers;
|
|
|
6
6
|
exports.applyMapDirective = applyMapDirective;
|
|
7
7
|
exports.buildKyselyFieldType = buildKyselyFieldType;
|
|
8
8
|
exports.generateDBInterfaceEntry = generateDBInterfaceEntry;
|
|
9
|
+
exports.generateJoinTableDBInterfaceEntry = generateJoinTableDBInterfaceEntry;
|
|
9
10
|
exports.generateDBInterface = generateDBInterface;
|
|
10
11
|
const type_1 = require("../prisma/type");
|
|
11
12
|
/**
|
|
@@ -64,15 +65,25 @@ function generateDBInterfaceEntry(model) {
|
|
|
64
65
|
return ` ${tableName}: Schema.Schema.Encoded<typeof ${baseSchemaName}>;`;
|
|
65
66
|
}
|
|
66
67
|
/**
|
|
67
|
-
* Generate
|
|
68
|
+
* Generate DB interface entry for a join table
|
|
68
69
|
*/
|
|
69
|
-
function
|
|
70
|
-
const
|
|
70
|
+
function generateJoinTableDBInterfaceEntry(joinTable) {
|
|
71
|
+
const { tableName, relationName } = joinTable;
|
|
72
|
+
return ` ${tableName}: Schema.Schema.Encoded<typeof _${relationName}>;`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate complete DB interface including join tables
|
|
76
|
+
*/
|
|
77
|
+
function generateDBInterface(models, joinTables = []) {
|
|
78
|
+
const modelEntries = Array.from(models)
|
|
71
79
|
.map(generateDBInterfaceEntry)
|
|
72
80
|
.join("\n");
|
|
81
|
+
const joinTableEntries = joinTables.length > 0
|
|
82
|
+
? "\n" + joinTables.map(generateJoinTableDBInterfaceEntry).join("\n")
|
|
83
|
+
: "";
|
|
73
84
|
return `// Kysely Database Interface
|
|
74
85
|
export interface DB {
|
|
75
|
-
${
|
|
86
|
+
${modelEntries}${joinTableEntries}
|
|
76
87
|
}`;
|
|
77
88
|
}
|
|
78
89
|
//# sourceMappingURL=type.js.map
|
package/dist/kysely/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":";;AAQA,0CAEC;AAMD,wCAEC;AAKD,gDAOC;AAKD,8CAMC;AAMD,oDAQC;AAKD,4DAIC;AAKD,8EAGC;AAKD,kDAgBC;AA5FD,yCAA4E;AAG5E;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAiB;IAC/C,OAAO,IAAA,sBAAe,EAAC,KAAK,CAAC,IAAI,IAAA,gBAAS,EAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAiB;IAC9C,OAAO,IAAA,sBAAe,EAAC,KAAK,CAAC,IAAI,CAAC,IAAA,gBAAS,EAAC,KAAK,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,KAAiB;IACrE,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,SAAS,+BAA+B,CAAC;IAChE,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,aAAa,SAAS,GAAG,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,KAAiB;IACpE,MAAM,MAAM,GAAG,IAAA,qBAAc,EAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,4BAA4B,SAAS,0BAA0B,MAAM,KAAK,CAAC;IACpF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,aAAqB,EAAE,KAAiB;IAC3E,uDAAuD;IACvD,IAAI,SAAS,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAEzD,yDAAyD;IACzD,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEhD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,KAAiB;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;IAC7C,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,KAAK,SAAS,kCAAkC,cAAc,IAAI,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAgB,iCAAiC,CAAC,SAAwB;IACxE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAC9C,OAAO,KAAK,SAAS,mCAAmC,YAAY,IAAI,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,MAA6B,EAC7B,aAA8B,EAAE;IAEhC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,wBAAwB,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;EAEP,YAAY,GAAG,gBAAgB;EAC/B,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
+
import { type JoinTableInfo } from "./relation";
|
|
2
3
|
/**
|
|
3
4
|
* Prisma domain generator - orchestrates DMMF parsing and extraction
|
|
4
5
|
* No schema generation here, just native Prisma data extraction
|
|
@@ -18,5 +19,9 @@ export declare class PrismaGenerator {
|
|
|
18
19
|
* Get schema fields for a model (filtered and sorted)
|
|
19
20
|
*/
|
|
20
21
|
getModelFields(model: DMMF.Model): readonly DMMF.Field[];
|
|
22
|
+
/**
|
|
23
|
+
* Get implicit many-to-many join tables
|
|
24
|
+
*/
|
|
25
|
+
getManyToManyJoinTables(): JoinTableInfo[];
|
|
21
26
|
}
|
|
22
27
|
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/prisma/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/prisma/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1E;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI,CAAC,QAAQ;IAEhD;;OAEG;IACH,QAAQ,IAAI,SAAS,IAAI,CAAC,aAAa,EAAE;IAIzC;;OAEG;IACH,SAAS,IAAI,SAAS,IAAI,CAAC,KAAK,EAAE;IAOlC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,KAAK,EAAE;IAKxD;;OAEG;IACH,uBAAuB,IAAI,aAAa,EAAE;CAG3C"}
|
package/dist/prisma/generator.js
CHANGED
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.PrismaGenerator = void 0;
|
|
37
37
|
const PrismaEnum = __importStar(require("./enum"));
|
|
38
38
|
const PrismaType = __importStar(require("./type"));
|
|
39
|
+
const relation_1 = require("./relation");
|
|
39
40
|
/**
|
|
40
41
|
* Prisma domain generator - orchestrates DMMF parsing and extraction
|
|
41
42
|
* No schema generation here, just native Prisma data extraction
|
|
@@ -64,6 +65,12 @@ class PrismaGenerator {
|
|
|
64
65
|
const filtered = PrismaType.filterSchemaFields(model.fields);
|
|
65
66
|
return PrismaType.sortFields(filtered);
|
|
66
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Get implicit many-to-many join tables
|
|
70
|
+
*/
|
|
71
|
+
getManyToManyJoinTables() {
|
|
72
|
+
return (0, relation_1.detectImplicitManyToMany)(this.dmmf.datamodel.models);
|
|
73
|
+
}
|
|
67
74
|
}
|
|
68
75
|
exports.PrismaGenerator = PrismaGenerator;
|
|
69
76
|
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/prisma/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mDAAqC;AACrC,mDAAqC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/prisma/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mDAAqC;AACrC,mDAAqC;AACrC,yCAA0E;AAE1E;;;GAGG;AACH,MAAa,eAAe;IAC1B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD;;OAEG;IACH,QAAQ;QACN,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,QAAQ,GAAG,UAAU,CAAC,oBAAoB,CAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAC3B,CAAC;QACF,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAiB;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO,IAAA,mCAAwB,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;CACF;AAlCD,0CAkCC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
+
/**
|
|
3
|
+
* Metadata for implicit many-to-many join tables
|
|
4
|
+
*/
|
|
5
|
+
export interface JoinTableInfo {
|
|
6
|
+
/** Table name in database (e.g., "_CategoryToPost") */
|
|
7
|
+
tableName: string;
|
|
8
|
+
/** Relation name without underscore (e.g., "CategoryToPost") */
|
|
9
|
+
relationName: string;
|
|
10
|
+
/** First model name (alphabetically) */
|
|
11
|
+
modelA: string;
|
|
12
|
+
/** Second model name (alphabetically) */
|
|
13
|
+
modelB: string;
|
|
14
|
+
/** Type of column A (from modelA's ID field) */
|
|
15
|
+
columnAType: string;
|
|
16
|
+
/** Type of column B (from modelB's ID field) */
|
|
17
|
+
columnBType: string;
|
|
18
|
+
/** Whether column A is a UUID */
|
|
19
|
+
columnAIsUuid: boolean;
|
|
20
|
+
/** Whether column B is a UUID */
|
|
21
|
+
columnBIsUuid: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the ID field from a model
|
|
25
|
+
* Handles both single @id and composite @@id
|
|
26
|
+
*/
|
|
27
|
+
export declare function getModelIdField(model: DMMF.Model): DMMF.Field;
|
|
28
|
+
/**
|
|
29
|
+
* Detect all implicit many-to-many relations from DMMF models
|
|
30
|
+
* Returns metadata for generating join table schemas
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectImplicitManyToMany(models: readonly DMMF.Model[]): JoinTableInfo[];
|
|
33
|
+
//# sourceMappingURL=relation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/prisma/relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGrD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;CACxB;AAqBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAmB7D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,GAC5B,aAAa,EAAE,CA6DjB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getModelIdField = getModelIdField;
|
|
4
|
+
exports.detectImplicitManyToMany = detectImplicitManyToMany;
|
|
5
|
+
const type_1 = require("./type");
|
|
6
|
+
/**
|
|
7
|
+
* Detect if a relation field is part of an implicit many-to-many relation
|
|
8
|
+
* Criteria:
|
|
9
|
+
* - kind === "object" (relation field)
|
|
10
|
+
* - isList === true (many side)
|
|
11
|
+
* - relationFromFields is empty (no foreign key on this side)
|
|
12
|
+
* - relationToFields is empty (no explicit relation table)
|
|
13
|
+
*/
|
|
14
|
+
function isImplicitManyToManyField(field) {
|
|
15
|
+
return (field.kind === "object" &&
|
|
16
|
+
field.isList === true &&
|
|
17
|
+
field.relationFromFields !== undefined &&
|
|
18
|
+
field.relationFromFields.length === 0 &&
|
|
19
|
+
field.relationToFields !== undefined &&
|
|
20
|
+
field.relationToFields.length === 0);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the ID field from a model
|
|
24
|
+
* Handles both single @id and composite @@id
|
|
25
|
+
*/
|
|
26
|
+
function getModelIdField(model) {
|
|
27
|
+
// Try to find single @id field
|
|
28
|
+
const idField = model.fields.find((f) => f.isId === true);
|
|
29
|
+
if (idField) {
|
|
30
|
+
return idField;
|
|
31
|
+
}
|
|
32
|
+
// For composite @@id, get the first field from primaryKey
|
|
33
|
+
if (model.primaryKey && model.primaryKey.fields.length > 0) {
|
|
34
|
+
const firstIdFieldName = model.primaryKey.fields[0];
|
|
35
|
+
const field = model.fields.find((f) => f.name === firstIdFieldName);
|
|
36
|
+
if (field) {
|
|
37
|
+
return field;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Model ${model.name} has no ID field (@id or @@id required)`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Detect all implicit many-to-many relations from DMMF models
|
|
44
|
+
* Returns metadata for generating join table schemas
|
|
45
|
+
*/
|
|
46
|
+
function detectImplicitManyToMany(models) {
|
|
47
|
+
const joinTables = new Map();
|
|
48
|
+
for (const model of models) {
|
|
49
|
+
for (const field of model.fields) {
|
|
50
|
+
if (!isImplicitManyToManyField(field)) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Get the related model
|
|
54
|
+
const relatedModel = models.find((m) => m.name === field.type);
|
|
55
|
+
if (!relatedModel) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Check if the relation is reciprocal (both sides are lists)
|
|
59
|
+
const relatedField = relatedModel.fields.find((f) => f.relationName === field.relationName && f.isList === true);
|
|
60
|
+
if (!relatedField || !isImplicitManyToManyField(relatedField)) {
|
|
61
|
+
// Not a true implicit m-n relation
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Skip self-relations (both sides point to same model)
|
|
65
|
+
if (model.name === relatedModel.name) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Generate table name (alphabetically sorted model names)
|
|
69
|
+
const modelNames = [model.name, relatedModel.name].sort();
|
|
70
|
+
const tableName = `_${modelNames[0]}To${modelNames[1]}`;
|
|
71
|
+
// Skip if we've already processed this relation
|
|
72
|
+
if (joinTables.has(tableName)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Extract ID field types
|
|
76
|
+
const modelAIdField = getModelIdField(models.find((m) => m.name === modelNames[0]));
|
|
77
|
+
const modelBIdField = getModelIdField(models.find((m) => m.name === modelNames[1]));
|
|
78
|
+
joinTables.set(tableName, {
|
|
79
|
+
tableName,
|
|
80
|
+
relationName: `${modelNames[0]}To${modelNames[1]}`,
|
|
81
|
+
modelA: modelNames[0],
|
|
82
|
+
modelB: modelNames[1],
|
|
83
|
+
columnAType: modelAIdField.type,
|
|
84
|
+
columnBType: modelBIdField.type,
|
|
85
|
+
columnAIsUuid: (0, type_1.isUuidField)(modelAIdField),
|
|
86
|
+
columnBIsUuid: (0, type_1.isUuidField)(modelBIdField),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return Array.from(joinTables.values());
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/prisma/relation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/prisma/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/prisma/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAwB5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAE1C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,WAE5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,GAC5B,SAAS,IAAI,CAAC,KAAK,EAAE,CAEvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,GAC5B,SAAS,IAAI,CAAC,KAAK,EAAE,CAIvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAE/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,GAC5B,SAAS,IAAI,CAAC,KAAK,EAAE,CAEvB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,GAC5B,SAAS,IAAI,CAAC,KAAK,EAAE,CAEvB"}
|
package/dist/prisma/type.js
CHANGED
|
@@ -24,7 +24,10 @@ function isUuidField(field) {
|
|
|
24
24
|
if (field.documentation?.includes("@db.Uuid")) {
|
|
25
25
|
return true;
|
|
26
26
|
}
|
|
27
|
-
// 3. Fallback: Field name patterns
|
|
27
|
+
// 3. Fallback: Field name patterns (only for String type)
|
|
28
|
+
if (field.type !== "String") {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
28
31
|
const uuidFieldPatterns = [
|
|
29
32
|
/^id$/, // Primary ID fields
|
|
30
33
|
/_id$/, // Foreign key ID fields
|
package/dist/prisma/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/prisma/type.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/prisma/type.ts"],"names":[],"mappings":";;AAMA,kCAwBC;AAKD,wCAEC;AAKD,0CAEC;AAKD,8BAEC;AAKD,0CAEC;AAKD,kCAEC;AAKD,oDAIC;AAKD,gDAMC;AAKD,wCAEC;AAKD,gCAIC;AAKD,gCAIC;AA5GD;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAiB;IAC3C,uCAAuC;IACvC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,IAAI,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,qBAAqB;KACvB,CAAC;IAEX,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAiB;IAC9C,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,KAAiB;IACzC,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,KAAiB;IAC3C,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,MAA6B;IAE7B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,MAA6B;IAE7B,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAC5D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAiB;IAC9C,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CACxB,MAA6B;IAE7B,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CACxB,MAA6B;IAE7B,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code generation utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate standard file header for generated files
|
|
6
|
+
*
|
|
7
|
+
* @param timestamp - Optional timestamp (defaults to current time)
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateFileHeader(timestamp?: Date): string;
|
|
10
|
+
//# sourceMappingURL=codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/utils/codegen.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,IAAiB,GAAG,MAAM,CAKvE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Code generation utilities
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateFileHeader = generateFileHeader;
|
|
7
|
+
/**
|
|
8
|
+
* Generate standard file header for generated files
|
|
9
|
+
*
|
|
10
|
+
* @param timestamp - Optional timestamp (defaults to current time)
|
|
11
|
+
*/
|
|
12
|
+
function generateFileHeader(timestamp = new Date()) {
|
|
13
|
+
return `/**
|
|
14
|
+
* Generated: ${timestamp.toISOString()}
|
|
15
|
+
* DO NOT EDIT MANUALLY
|
|
16
|
+
*/`;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/utils/codegen.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAOH,gDAKC;AAVD;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,YAAkB,IAAI,IAAI,EAAE;IAC7D,OAAO;gBACO,SAAS,CAAC,WAAW,EAAE;;IAEnC,CAAC;AACL,CAAC"}
|
package/dist/utils/naming.d.ts
CHANGED
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
* Naming utilities for consistent TypeScript identifier generation
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Convert any string to PascalCase
|
|
5
|
+
* Convert any string to PascalCase with optional suffix
|
|
6
6
|
* Handles: snake_case, camelCase, kebab-case, or mixed formats
|
|
7
7
|
*
|
|
8
|
+
* @param str - The string to convert
|
|
9
|
+
* @param suffix - Optional suffix to append (e.g., "Schema", "Type")
|
|
10
|
+
*
|
|
8
11
|
* @example
|
|
9
12
|
* toPascalCase('user') // 'User'
|
|
10
|
-
* toPascalCase('
|
|
11
|
-
* toPascalCase('
|
|
12
|
-
* toPascalCase('
|
|
13
|
+
* toPascalCase('PRODUCT_STATUS') // 'ProductStatus'
|
|
14
|
+
* toPascalCase('PRODUCT_STATUS', 'Schema') // 'ProductStatusSchema'
|
|
15
|
+
* toPascalCase('USER_ROLE', 'Type') // 'UserRoleType'
|
|
13
16
|
*/
|
|
14
|
-
export declare function toPascalCase(str: string): string;
|
|
17
|
+
export declare function toPascalCase(str: string, suffix?: string): string;
|
|
15
18
|
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA8BjE"}
|
package/dist/utils/naming.js
CHANGED
|
@@ -5,37 +5,46 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.toPascalCase = toPascalCase;
|
|
7
7
|
/**
|
|
8
|
-
* Convert any string to PascalCase
|
|
8
|
+
* Convert any string to PascalCase with optional suffix
|
|
9
9
|
* Handles: snake_case, camelCase, kebab-case, or mixed formats
|
|
10
10
|
*
|
|
11
|
+
* @param str - The string to convert
|
|
12
|
+
* @param suffix - Optional suffix to append (e.g., "Schema", "Type")
|
|
13
|
+
*
|
|
11
14
|
* @example
|
|
12
15
|
* toPascalCase('user') // 'User'
|
|
13
|
-
* toPascalCase('
|
|
14
|
-
* toPascalCase('
|
|
15
|
-
* toPascalCase('
|
|
16
|
+
* toPascalCase('PRODUCT_STATUS') // 'ProductStatus'
|
|
17
|
+
* toPascalCase('PRODUCT_STATUS', 'Schema') // 'ProductStatusSchema'
|
|
18
|
+
* toPascalCase('USER_ROLE', 'Type') // 'UserRoleType'
|
|
16
19
|
*/
|
|
17
|
-
function toPascalCase(str) {
|
|
20
|
+
function toPascalCase(str, suffix) {
|
|
18
21
|
// Handle empty string
|
|
19
22
|
if (!str)
|
|
20
23
|
return str;
|
|
21
24
|
// Split on underscores, dashes, or spaces
|
|
22
25
|
const words = str.split(/[_-\s]+/);
|
|
26
|
+
let pascalCase;
|
|
23
27
|
// If no delimiters found, check if already camelCase/PascalCase
|
|
24
28
|
if (words.length === 1) {
|
|
25
29
|
// Split camelCase/PascalCase by capital letters
|
|
26
30
|
const camelWords = str.split(/(?=[A-Z])/);
|
|
27
31
|
if (camelWords.length > 1) {
|
|
28
|
-
|
|
32
|
+
pascalCase = camelWords
|
|
29
33
|
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
30
34
|
.join('');
|
|
31
35
|
}
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
else {
|
|
37
|
+
// Single word - just capitalize first letter
|
|
38
|
+
pascalCase = str.charAt(0).toUpperCase() + str.slice(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Convert each word to PascalCase
|
|
43
|
+
pascalCase = words
|
|
44
|
+
.filter((word) => word.length > 0) // Remove empty strings
|
|
45
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
46
|
+
.join('');
|
|
34
47
|
}
|
|
35
|
-
|
|
36
|
-
return words
|
|
37
|
-
.filter((word) => word.length > 0) // Remove empty strings
|
|
38
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
39
|
-
.join('');
|
|
48
|
+
return suffix ? `${pascalCase}${suffix}` : pascalCase;
|
|
40
49
|
}
|
|
41
50
|
//# sourceMappingURL=naming.js.map
|
package/dist/utils/naming.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,oCA8BC;AA3CD;;;;;;;;;;;;GAYG;AACH,SAAgB,YAAY,CAAC,GAAW,EAAE,MAAe;IACvD,sBAAsB;IACtB,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IAErB,0CAA0C;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,UAAkB,CAAC;IAEvB,gEAAgE;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,gDAAgD;QAChD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,UAAU,GAAG,UAAU;iBACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBACzE,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,UAAU,GAAG,KAAK;aACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,uBAAuB;aACzD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aACzE,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACxD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration for a single Unsupported field
|
|
3
|
-
*/
|
|
4
|
-
export interface UnsupportedFieldConfig {
|
|
5
|
-
effectType: string;
|
|
6
|
-
dbType: string;
|
|
7
|
-
dbName: string;
|
|
8
|
-
required: boolean;
|
|
9
|
-
comment?: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Full configuration structure
|
|
13
|
-
*/
|
|
14
|
-
export interface UnsupportedConfig {
|
|
15
|
-
models: Record<string, Record<string, UnsupportedFieldConfig>>;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Load unsupported fields configuration from JSON file
|
|
19
|
-
* Looks for prisma/unsupported-fields.json relative to schema location
|
|
20
|
-
*/
|
|
21
|
-
export declare function loadUnsupportedConfig(schemaPath: string): UnsupportedConfig | null;
|
|
22
|
-
/**
|
|
23
|
-
* Get unsupported fields for a specific model
|
|
24
|
-
*/
|
|
25
|
-
export declare function getUnsupportedFields(config: UnsupportedConfig | null, modelName: string): Record<string, UnsupportedFieldConfig>;
|
|
26
|
-
//# sourceMappingURL=unsupported-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unsupported-config.d.ts","sourceRoot":"","sources":["../../src/utils/unsupported-config.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiBlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAGxC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadUnsupportedConfig = loadUnsupportedConfig;
|
|
4
|
-
exports.getUnsupportedFields = getUnsupportedFields;
|
|
5
|
-
const fs_1 = require("fs");
|
|
6
|
-
const path_1 = require("path");
|
|
7
|
-
/**
|
|
8
|
-
* Load unsupported fields configuration from JSON file
|
|
9
|
-
* Looks for prisma/unsupported-fields.json relative to schema location
|
|
10
|
-
*/
|
|
11
|
-
function loadUnsupportedConfig(schemaPath) {
|
|
12
|
-
try {
|
|
13
|
-
// Assume schema is in prisma/schema/ directory
|
|
14
|
-
// Config should be in prisma/unsupported-fields.json
|
|
15
|
-
const schemaDir = (0, path_1.dirname)((0, path_1.dirname)(schemaPath)); // Go up to prisma/
|
|
16
|
-
const configPath = (0, path_1.join)(schemaDir, 'unsupported-fields.json');
|
|
17
|
-
if (!(0, fs_1.existsSync)(configPath)) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
const content = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
21
|
-
return JSON.parse(content);
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
console.warn(`⚠️ Failed to load unsupported-fields.json: ${error}`);
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Get unsupported fields for a specific model
|
|
30
|
-
*/
|
|
31
|
-
function getUnsupportedFields(config, modelName) {
|
|
32
|
-
if (!config)
|
|
33
|
-
return {};
|
|
34
|
-
return config.models[modelName] || {};
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=unsupported-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unsupported-config.js","sourceRoot":"","sources":["../../src/utils/unsupported-config.ts"],"names":[],"mappings":";;AAyBA,sDAiBC;AAKD,oDAMC;AArDD,2BAA8C;AAC9C,+BAAqC;AAoBrC;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,UAAkB;IACtD,IAAI,CAAC;QACH,+CAA+C;QAC/C,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,IAAA,cAAO,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB;QACnE,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,+CAA+C,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,MAAgC,EAChC,SAAiB;IAEjB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC"}
|