prisma-effect-kysely 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,53 @@ 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.7.0] - 2025-10-12
9
+
10
+ ### Fixed
11
+
12
+ - **CRITICAL: TypeScript TS7022 Compilation Error**: Fixed circular reference errors in generated enum code that prevented TypeScript compilation
13
+ - v1.6.0-v1.6.1 used namespace merging pattern that caused unavoidable TS7022 errors: `'Schema' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer`
14
+ - Reverted to proven v1.5.3 suffix pattern (`RoleSchema`, `RoleType`) which compiles without errors
15
+ - Tests were masking the compilation failures by only checking string patterns, never actually running TypeScript compiler on generated code
16
+
17
+ ### Changed
18
+
19
+ - **BREAKING: Reverted to Suffix Pattern for Enums**
20
+ - Enum exports now use suffix pattern instead of namespace pattern from v1.6.x
21
+ - **Before (v1.6.x - broken)**: `Role.Schema`, `Role.Type`
22
+ - **After (v1.7.0 - working)**: `RoleSchema`, `RoleType`
23
+ - This ensures generated code compiles with TypeScript strict mode without errors
24
+ - **Migration from v1.6.x**:
25
+ - `Role.Schema` → `RoleSchema`
26
+ - `Role.Type` → `RoleType`
27
+ - `Status.Schema` → `StatusSchema`
28
+ - `Status.Type` → `StatusType`
29
+
30
+ ### Added
31
+
32
+ - **JSDoc Documentation**: All generated enum exports now include comprehensive JSDoc comments
33
+ - Self-documenting code with `@see` references between related exports
34
+ - Clear `@example` tags showing how to use Effect Schema validation
35
+ - Generated TypeScript type unions documented inline (e.g., `'ADMIN' | 'USER' | 'GUEST'`)
36
+ - Improves IDE IntelliSense and developer experience
37
+
38
+ ## [1.6.1] - 2025-10-12
39
+
40
+ ### Fixed
41
+
42
+ - **TypeScript Namespace Collision (TS7022)**: Fixed circular reference error in generated enum code where namespace export `Schema` collided with imported `Schema` from Effect library
43
+ - Changed import pattern from `import { Schema } from "effect"` to `import * as Effect from "effect"`
44
+ - Added module-level alias `const Schema = Effect.Schema` for clean, readable code throughout generated files
45
+ - Only use fully-qualified `Effect.Schema` inside enum namespaces where collision occurs
46
+ - This maintains 95% of generated code with clean `Schema.*` patterns while avoiding namespace collision
47
+
48
+ - **Optional Field Pattern**: Updated optional field generation from `Schema.Union(type, Schema.Undefined)` to correct `Schema.UndefinedOr(type)` combinator per Effect Schema API
49
+
50
+ ### Changed
51
+
52
+ - Generated code now uses `import * as Effect from "effect"` pattern (industry standard)
53
+ - All generated files include module-level alias `const Schema = Effect.Schema` for clean API
54
+
8
55
  ## [1.6.0] - 2025-10-12
9
56
 
10
57
  ### Changed
package/README.md CHANGED
@@ -43,38 +43,135 @@ Generates three files in the configured output directory:
43
43
 
44
44
  ### enums.ts
45
45
 
46
- Effect Schema enums from Prisma enums with exact literal types:
46
+ Native TypeScript enums with Effect Schema validators and comprehensive JSDoc:
47
47
 
48
48
  ```typescript
49
- export const UserRole = Schema.Literal('admin', 'user', 'guest');
50
- export type UserRole = Schema.Schema.Type<typeof UserRole>;
49
+ /**
50
+ * UserRole enum from Prisma schema.
51
+ * @see {@link UserRoleSchema} for Effect Schema validation
52
+ * @see {@link UserRoleType} for TypeScript type
53
+ */
54
+ export enum UserRole {
55
+ ADMIN = "ADMIN",
56
+ USER = "USER",
57
+ GUEST = "GUEST"
58
+ }
59
+
60
+ /**
61
+ * Effect Schema validator for UserRole enum.
62
+ * Validates that a value is a valid UserRole enum member.
63
+ *
64
+ * @example
65
+ * const validated = Schema.decodeSync(UserRoleSchema)("ADMIN");
66
+ */
67
+ export const UserRoleSchema = Schema.Enums(UserRole);
68
+
69
+ /**
70
+ * TypeScript type for UserRole enum values.
71
+ * Equivalent to: 'ADMIN' | 'USER' | 'GUEST'
72
+ */
73
+ export type UserRoleType = Schema.Schema.Type<typeof UserRoleSchema>;
74
+
75
+ // Usage:
76
+ // - Access enum values: UserRole.ADMIN, UserRole.USER
77
+ // - Access Effect Schema: UserRoleSchema
78
+ // - Access TypeScript type: UserRoleType
51
79
  ```
52
80
 
53
81
  ### types.ts
54
82
 
55
- Effect Schema structs from Prisma models:
83
+ Effect Schema structs from Prisma models with Kysely integration:
56
84
 
57
85
  ```typescript
58
- export const User = Schema.Struct({
59
- id: Schema.UUID,
86
+ // Base schema with underscore prefix
87
+ export const _User = Schema.Struct({
88
+ id: columnType(Schema.UUID, Schema.Never, Schema.Never), // Read-only ID
60
89
  email: Schema.String,
61
- name: Schema.optional(Schema.String),
62
- role: UserRole,
63
- createdAt: Schema.Date,
90
+ name: Schema.Union(Schema.String, Schema.Undefined), // Optional field
91
+ role: UserRoleSchema,
92
+ createdAt: generated(Schema.Date), // Generated field
64
93
  });
65
- export type User = Schema.Schema.Type<typeof User>;
94
+
95
+ // Operational schemas and types in namespace
96
+ export namespace User {
97
+ const schemas = getSchemas(_User);
98
+ export const Selectable = schemas.Selectable; // For SELECT queries
99
+ export const Insertable = schemas.Insertable; // For INSERT (generated fields optional)
100
+ export const Updateable = schemas.Updateable; // For UPDATE (all fields optional)
101
+
102
+ export type Select = Schema.Schema.Type<typeof User.Selectable>;
103
+ export type Insert = Schema.Schema.Type<typeof User.Insertable>;
104
+ export type Update = Schema.Schema.Type<typeof User.Updateable>;
105
+ export type SelectEncoded = Schema.Schema.Encoded<typeof User.Selectable>;
106
+ export type InsertEncoded = Schema.Schema.Encoded<typeof User.Insertable>;
107
+ export type UpdateEncoded = Schema.Schema.Encoded<typeof User.Updateable>;
108
+ }
109
+
110
+ // Kysely DB interface for type-safe queries
111
+ export interface DB {
112
+ User: Schema.Schema.Encoded<typeof _User>;
113
+ // ... other models
114
+ }
66
115
  ```
67
116
 
68
- **Naming Convention**: All exported schemas and types use PascalCase, regardless of the Prisma model naming convention:
69
- - Model `User` → `User`, `UserSelect`, `UserInsert`
70
- - Model `session_preference` → `SessionPreference`, `SessionPreferenceSelect`, `SessionPreferenceInsert`
117
+ **Name Preservation**: All names from your Prisma schema are preserved exactly:
118
+ - Model `User` → `User` namespace with `User.Select`, `User.Insert`, `User.Update`
119
+ - Model `session_preference` → `session_preference` namespace
120
+ - Enum `ACTIVE_STATUS` → `ACTIVE_STATUS` enum and namespace
71
121
 
72
- This ensures consistent TypeScript identifier naming while preserving the original model names for internal schemas.
122
+ This creates a complete bridge from Prisma Effect Kysely TypeScript with stable, predictable names.
73
123
 
74
124
  ### index.ts
75
125
 
76
126
  Re-exports all generated types for easy importing
77
127
 
128
+ ## Namespace Pattern
129
+
130
+ The generator uses TypeScript namespaces to organize generated code while preserving your Prisma schema names exactly.
131
+
132
+ ### Benefits
133
+
134
+ - **Zero Name Transformations**: Your Prisma names flow unchanged through Effect, Kysely, and TypeScript
135
+ - **No Naming Conflicts**: Namespaces eliminate collisions without requiring name transformations
136
+ - **Grouped Exports**: Related schemas, types, and values are logically grouped
137
+ - **Clean API**: Access everything through a single identifier (e.g., `User.Select`, `User.Insertable`)
138
+
139
+ ### Structure
140
+
141
+ **For Enums:**
142
+ ```typescript
143
+ // Native TypeScript enum preserving Prisma schema naming
144
+ export enum ACTIVE_STATUS { ACTIVE, INACTIVE }
145
+
146
+ // Effect Schema validator with suffix pattern
147
+ export const ACTIVE_STATUSSchema = Schema.Enums(ACTIVE_STATUS);
148
+
149
+ // TypeScript type export
150
+ export type ACTIVE_STATUSType = Schema.Schema.Type<typeof ACTIVE_STATUSSchema>;
151
+ ```
152
+
153
+ **For Models:**
154
+ ```typescript
155
+ export const _User = Schema.Struct({ ... }); // Base schema (underscore prefix)
156
+ export namespace User { // Namespace for operational schemas
157
+ const schemas = getSchemas(_User);
158
+ export const Selectable = schemas.Selectable;
159
+ export const Insertable = schemas.Insertable;
160
+ export const Updateable = schemas.Updateable;
161
+ export type Select = ...;
162
+ export type Insert = ...;
163
+ // ... more types
164
+ }
165
+ ```
166
+
167
+ **For Join Tables:**
168
+ ```typescript
169
+ export const _CategoryToPost = Schema.Struct({ A, B });
170
+ export namespace CategoryToPost {
171
+ // Same pattern as models
172
+ }
173
+ ```
174
+
78
175
  ## Type Mappings
79
176
 
80
177
  | Prisma Type | Effect Schema Type | Notes |
@@ -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;AAKrD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,UAqB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,UAMrE"}
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,UA8C7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,UAMrE"}
@@ -17,6 +17,8 @@ const codegen_1 = require("../utils/codegen");
17
17
  function generateEnumSchema(enumDef) {
18
18
  // Preserve original enum name from Prisma schema
19
19
  const enumName = enumDef.name;
20
+ const schemaName = `${enumName}Schema`;
21
+ const typeName = `${enumName}Type`;
20
22
  // Generate native TypeScript enum members
21
23
  const enumMembers = enumDef.values
22
24
  .map((v) => {
@@ -24,15 +26,36 @@ function generateEnumSchema(enumDef) {
24
26
  return ` ${v.name} = "${value}"`;
25
27
  })
26
28
  .join(",\n");
27
- // Generate: enum + namespace with Schema and Type
28
- return `export enum ${enumName} {
29
+ // Get first enum value for example
30
+ const firstValue = enumDef.values[0]?.name || 'VALUE';
31
+ // Get enum values as type union for JSDoc
32
+ const enumValueUnion = enumDef.values
33
+ .map(v => `'${(0, enum_1.getEnumValueDbName)(v)}'`)
34
+ .join(' | ');
35
+ // Generate: enum + Schema.Enums() wrapper + type with JSDoc
36
+ return `/**
37
+ * ${enumName} enum from Prisma schema.
38
+ * @see {@link ${schemaName}} for Effect Schema validation
39
+ * @see {@link ${typeName}} for TypeScript type
40
+ */
41
+ export enum ${enumName} {
29
42
  ${enumMembers}
30
43
  }
31
44
 
32
- export namespace ${enumName} {
33
- export const Schema = Schema.Enums(${enumName});
34
- export type Type = Schema.Schema.Type<typeof Schema>;
35
- }`;
45
+ /**
46
+ * Effect Schema validator for ${enumName} enum.
47
+ * Validates that a value is a valid ${enumName} enum member.
48
+ *
49
+ * @example
50
+ * const validated = Schema.decodeSync(${schemaName})("${firstValue}");
51
+ */
52
+ export const ${schemaName} = Schema.Enums(${enumName});
53
+
54
+ /**
55
+ * TypeScript type for ${enumName} enum values.
56
+ * Equivalent to: ${enumValueUnion}
57
+ */
58
+ export type ${typeName} = Schema.Schema.Type<typeof ${schemaName}>;`;
36
59
  }
37
60
  /**
38
61
  * Generate all enum schemas as a single file content
@@ -1 +1 @@
1
- {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":";;AAeA,gDAqBC;AAKD,8CAMC;AA9CD,yCAAoD;AAEpD,8CAAsD;AAEtD;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,OAA2B;IAC5D,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9B,0CAA0C;IAC1C,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,kDAAkD;IAClD,OAAO,eAAe,QAAQ;EAC9B,WAAW;;;mBAGM,QAAQ;uCACY,QAAQ;;EAE7C,CAAC;AACH,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
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/effect/enum.ts"],"names":[],"mappings":";;AAeA,gDA8CC;AAKD,8CAMC;AAvED,yCAAoD;AAEpD,8CAAsD;AAEtD;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,OAA2B;IAC5D,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,GAAG,QAAQ,QAAQ,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IAEnC,0CAA0C;IAC1C,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,mCAAmC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,CAAC;IAEtD,0CAA0C;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAA,yBAAkB,EAAC,CAAC,CAAC,GAAG,CAAC;SACtC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,4DAA4D;IAC5D,OAAO;KACJ,QAAQ;iBACI,UAAU;iBACV,QAAQ;;cAEX,QAAQ;EACpB,WAAW;;;;iCAIoB,QAAQ;uCACF,QAAQ;;;yCAGN,UAAU,MAAM,UAAU;;eAEpD,UAAU,mBAAmB,QAAQ;;;yBAG3B,QAAQ;oBACb,cAAc;;cAEpB,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 +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;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;IAY5C;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAarC;;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"}
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;IAY5C;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAarC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE;IAQ3D;;;;OAIG;IACH,mBAAmB,CAAC,QAAQ,EAAE,OAAO;IAoBrC;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,aAAa,EAAE;CAKrD"}
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EffectGenerator = void 0;
4
4
  const enum_1 = require("./enum");
5
5
  const type_1 = require("./type");
6
- const naming_1 = require("../utils/naming");
7
6
  const codegen_1 = require("../utils/codegen");
8
7
  const join_table_1 = require("./join-table");
9
8
  /**
@@ -83,16 +82,11 @@ ${fieldDefinitions}
83
82
  `import { columnType, generated, getSchemas } from "prisma-effect-kysely";`,
84
83
  ];
85
84
  if (hasEnums) {
86
- // Test 13: Import both enum and Schema wrapper
87
- // Test 14: Use PascalCase naming
88
- // Test 15: No SCREAMING_SNAKE_CASE
89
- const enumImports = this.dmmf.datamodel.enums
90
- .flatMap((e) => {
91
- const baseName = (0, naming_1.toPascalCase)(e.name);
92
- return [baseName, `${baseName}Schema`];
93
- })
94
- .join(', ');
95
- imports.push(`import { ${enumImports} } from "./enums";`);
85
+ // Import enums and their schemas with suffix pattern
86
+ const enumNames = this.dmmf.datamodel.enums.map((e) => e.name);
87
+ const enumImports = enumNames.join(', ');
88
+ const schemaImports = enumNames.map(name => `${name}Schema`).join(', ');
89
+ imports.push(`import { ${enumImports}, ${schemaImports} } from "./enums";`);
96
90
  }
97
91
  return `${header}\n\n${imports.join('\n')}`;
98
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/effect/generator.ts"],"names":[],"mappings":";;;AACA,iCAA2C;AAC3C,iCAAwC;AAGxC,8CAAsD;AACtD,6CAAuD;AAGvD;;GAEG;AACH,MAAa,eAAe;IAC1B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD;;OAEG;IACH,aAAa,CAAC,KAAoC;QAChD,OAAO,IAAA,wBAAiB,EAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,KAAiB,EAAE,MAA6B;QACjE,MAAM,gBAAgB,GAAG,MAAM;aAC5B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,SAAS,GAAG,IAAA,qBAAc,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC;aACD,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAExC,OAAO,MAAM,KAAK,CAAC,IAAI;eACZ,cAAc;EAC3B,gBAAgB;IACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,KAAiB;QAC1C,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAE7B,OAAO,oBAAoB,SAAS;+BACT,cAAc;;;;EAI3C,CAAC;IACD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAiB;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,OAAO,oBAAoB,IAAI;mDACgB,IAAI;mDACJ,IAAI;mDACJ,IAAI;6DACM,IAAI;6DACJ,IAAI;6DACJ,IAAI;EAC/D,CAAC;IACD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAiB,EAAE,MAAoB;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEpD,OAAO,GAAG,UAAU,OAAO,iBAAiB,OAAO,WAAW,EAAE,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,QAAiB;QACnC,MAAM,MAAM,GAAG,IAAA,4BAAkB,GAAE,CAAC;QAEpC,MAAM,OAAO,GAAG;YACd,kCAAkC;YAClC,2EAA2E;SAC5E,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,qDAAqD;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAExE,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,KAAK,aAAa,oBAAoB,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,UAA2B;QAClD,OAAO,UAAU;aACd,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,oCAAuB,EAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aACnD,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;CACF;AAxGD,0CAwGC"}
@@ -4,7 +4,6 @@ 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");
8
7
  /**
9
8
  * Prisma scalar type mapping to Effect Schema types
10
9
  * Uses const assertion to avoid type guards
@@ -43,9 +42,9 @@ function mapFieldToEffectType(field, dmmf) {
43
42
  // TDD: Satisfies tests 11-12 in field-type-generation.test.ts
44
43
  const enumDef = dmmf.datamodel.enums.find((e) => e.name === field.type);
45
44
  if (enumDef) {
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
+ // Return Schema with suffix pattern (v1.7.0+)
46
+ // Preserve original enum name with Schema suffix
47
+ return `${enumDef.name}Schema`;
49
48
  }
50
49
  // PRIORITY 5: Fallback to Unknown
51
50
  return "Schema.Unknown";
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/effect/type.ts"],"names":[],"mappings":";;AA8BA,oDA8BC;AAKD,wCAcC;AA9ED,yCAKwB;AACxB,sDAAiE;AAGjE;;;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,8CAA8C;QAC9C,iDAAiD;QACjD,OAAO,GAAG,OAAO,CAAC,IAAI,QAAQ,CAAC;IACjC,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"}
@@ -0,0 +1,26 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,36 @@
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
@@ -0,0 +1 @@
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prisma-effect-kysely",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "Prisma generator that creates Effect Schema types from Prisma schema compatible with Kysely",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Ho",